| Line | Hits | Source | Commit |
| 2468 |
- |
create_windowagg_plan(PlannerInfo *root, WindowAggPath *best_path) |
- |
| 2469 |
- |
{ |
- |
| 2470 |
- |
WindowAgg *plan; |
- |
| 2471 |
- |
WindowClause *wc = best_path->winclause; |
- |
| 2472 |
- |
int numPart = list_length(wc->partitionClause); |
- |
| 2473 |
- |
int numOrder = list_length(wc->orderClause); |
- |
| 2474 |
- |
Plan *subplan; |
- |
| 2475 |
- |
List *tlist; |
- |
| 2476 |
- |
int partNumCols; |
- |
| 2477 |
- |
AttrNumber *partColIdx; |
- |
| 2478 |
- |
Oid *partOperators; |
- |
| 2479 |
- |
Oid *partCollations; |
- |
| 2480 |
- |
int ordNumCols; |
- |
| 2481 |
- |
AttrNumber *ordColIdx; |
- |
| 2482 |
- |
Oid *ordOperators; |
- |
| 2483 |
- |
Oid *ordCollations; |
- |
| 2484 |
- |
ListCell *lc; |
- |
| 2485 |
- |
|
- |
| 2486 |
- |
/* |
- |
| 2487 |
- |
* Choice of tlist here is motivated by the fact that WindowAgg will be |
- |
| 2488 |
- |
* storing the input rows of window frames in a tuplestore; it therefore |
- |
| 2489 |
- |
* behooves us to request a small tlist to avoid wasting space. We do of |
- |
| 2490 |
- |
* course need grouping columns to be available. |
- |
| 2491 |
- |
*/ |
- |
| 2492 |
- |
subplan = create_plan_recurse(root, best_path->subpath, |
- |
| 2493 |
- |
CP_LABEL_TLIST | CP_SMALL_TLIST); |
- |
| 2494 |
- |
|
- |
| 2495 |
- |
tlist = build_path_tlist(root, &best_path->path); |
- |
| 2496 |
- |
|
- |
| 2497 |
- |
/* |
- |
| 2498 |
- |
* Convert SortGroupClause lists into arrays of attr indexes and equality |
- |
| 2499 |
- |
* operators, as wanted by executor. |
- |
| 2500 |
- |
*/ |
- |
| 2501 |
- |
partColIdx = palloc_array(AttrNumber, numPart); |
- |
| 2502 |
- |
partOperators = palloc_array(Oid, numPart); |
- |
| 2503 |
- |
partCollations = palloc_array(Oid, numPart); |
- |
| 2504 |
- |
|
- |
| 2505 |
- |
partNumCols = 0; |
- |
| 2506 |
- |
foreach(lc, wc->partitionClause) |
- |
| 2507 |
- |
{ |
- |
| 2508 |
- |
SortGroupClause *sgc = (SortGroupClause *) lfirst(lc); |
- |
| 2509 |
- |
TargetEntry *tle = get_sortgroupclause_tle(sgc, subplan->targetlist); |
- |
| 2510 |
- |
|
- |
| 2511 |
- |
Assert(OidIsValid(sgc->eqop)); |
- |
| 2512 |
- |
partColIdx[partNumCols] = tle->resno; |
- |
| 2513 |
- |
partOperators[partNumCols] = sgc->eqop; |
- |
| 2514 |
- |
partCollations[partNumCols] = exprCollation((Node *) tle->expr); |
- |
| 2515 |
- |
partNumCols++; |
- |
| 2516 |
- |
} |
- |
| 2517 |
- |
|
- |
| 2518 |
- |
ordColIdx = palloc_array(AttrNumber, numOrder); |
- |
| 2519 |
- |
ordOperators = palloc_array(Oid, numOrder); |
- |
| 2520 |
- |
ordCollations = palloc_array(Oid, numOrder); |
- |
| 2521 |
- |
|
- |
| 2522 |
- |
ordNumCols = 0; |
- |
| 2523 |
- |
foreach(lc, wc->orderClause) |
- |
| 2524 |
- |
{ |
- |
| 2525 |
- |
SortGroupClause *sgc = (SortGroupClause *) lfirst(lc); |
- |
| 2526 |
- |
TargetEntry *tle = get_sortgroupclause_tle(sgc, subplan->targetlist); |
- |
| 2527 |
- |
|
- |
| 2528 |
- |
Assert(OidIsValid(sgc->eqop)); |
- |
| 2529 |
- |
ordColIdx[ordNumCols] = tle->resno; |
- |
| 2530 |
- |
ordOperators[ordNumCols] = sgc->eqop; |
- |
| 2531 |
- |
ordCollations[ordNumCols] = exprCollation((Node *) tle->expr); |
- |
| 2532 |
- |
ordNumCols++; |
- |
| 2533 |
- |
} |
- |
| 2534 |
- |
|
- |
| 2535 |
- |
/* Build RPR pattern and filter defineClause */ |
ba2f29fRow pattern recognition patch (planner). |
| 2536 |
- |
{ |
ba2f29fRow pattern recognition patch (planner). |
| 2537 |
462 |
List *defineVariableList = NIL; |
ba2f29fRow pattern recognition patch (planner). |
| 2538 |
462 |
List *filteredDefineClause = NIL; |
ba2f29fRow pattern recognition patch (planner). |
| 2539 |
462 |
RPRPattern *compiledPattern = NULL; |
ba2f29fRow pattern recognition patch (planner). |
| 2540 |
- |
|
ba2f29fRow pattern recognition patch (planner). |
| 2541 |
462 |
if (wc->rpPattern) |
ba2f29fRow pattern recognition patch (planner). |
| 2542 |
- |
{ |
ba2f29fRow pattern recognition patch (planner). |
| 2543 |
462 |
List *patternVars; |
ba2f29fRow pattern recognition patch (planner). |
| 2544 |
- |
|
ba2f29fRow pattern recognition patch (planner). |
| 2545 |
- |
/* |
ba2f29fRow pattern recognition patch (planner). |
| 2546 |
- |
* Filter defineClause to include only variables used in PATTERN. |
ba2f29fRow pattern recognition patch (planner). |
| 2547 |
- |
* This eliminates unnecessary DEFINE evaluations at runtime. |
ba2f29fRow pattern recognition patch (planner). |
| 2548 |
- |
*/ |
ba2f29fRow pattern recognition patch (planner). |
| 2549 |
462 |
patternVars = collectPatternVariables(wc->rpPattern); |
ba2f29fRow pattern recognition patch (planner). |
| 2550 |
924 |
filteredDefineClause = filterDefineClause(wc->defineClause, |
ba2f29fRow pattern recognition patch (planner). |
| 2551 |
462 |
patternVars, |
ba2f29fRow pattern recognition patch (planner). |
| 2552 |
- |
&defineVariableList); |
ba2f29fRow pattern recognition patch (planner). |
| 2553 |
- |
|
ba2f29fRow pattern recognition patch (planner). |
| 2554 |
924 |
compiledPattern = buildRPRPattern(wc->rpPattern, |
ba2f29fRow pattern recognition patch (planner). |
| 2555 |
462 |
defineVariableList, |
ba2f29fRow pattern recognition patch (planner). |
| 2556 |
462 |
wc->rpSkipTo, |
ba2f29fRow pattern recognition patch (planner). |
| 2557 |
462 |
wc->frameOptions); |
ba2f29fRow pattern recognition patch (planner). |
| 2558 |
462 |
} |
ba2f29fRow pattern recognition patch (planner). |
| 2559 |
- |
|
ba2f29fRow pattern recognition patch (planner). |
| 2560 |
- |
/* And finally we can make the WindowAgg node */ |
ba2f29fRow pattern recognition patch (planner). |
| 2561 |
924 |
plan = make_windowagg(tlist, |
ba2f29fRow pattern recognition patch (planner). |
| 2562 |
462 |
wc, |
ba2f29fRow pattern recognition patch (planner). |
| 2563 |
462 |
partNumCols, |
ba2f29fRow pattern recognition patch (planner). |
| 2564 |
462 |
partColIdx, |
ba2f29fRow pattern recognition patch (planner). |
| 2565 |
462 |
partOperators, |
ba2f29fRow pattern recognition patch (planner). |
| 2566 |
462 |
partCollations, |
ba2f29fRow pattern recognition patch (planner). |
| 2567 |
462 |
ordNumCols, |
ba2f29fRow pattern recognition patch (planner). |
| 2568 |
462 |
ordColIdx, |
ba2f29fRow pattern recognition patch (planner). |
| 2569 |
462 |
ordOperators, |
ba2f29fRow pattern recognition patch (planner). |
| 2570 |
462 |
ordCollations, |
ba2f29fRow pattern recognition patch (planner). |
| 2571 |
462 |
best_path->runCondition, |
ba2f29fRow pattern recognition patch (planner). |
| 2572 |
462 |
wc->rpSkipTo, |
ba2f29fRow pattern recognition patch (planner). |
| 2573 |
462 |
compiledPattern, |
ba2f29fRow pattern recognition patch (planner). |
| 2574 |
462 |
filteredDefineClause, |
ba2f29fRow pattern recognition patch (planner). |
| 2575 |
462 |
best_path->qual, |
ba2f29fRow pattern recognition patch (planner). |
| 2576 |
462 |
best_path->topwindow, |
ba2f29fRow pattern recognition patch (planner). |
| 2577 |
462 |
subplan); |
ba2f29fRow pattern recognition patch (planner). |
| 2578 |
462 |
} |
ba2f29fRow pattern recognition patch (planner). |
| 2579 |
- |
|
- |
| 2580 |
- |
copy_generic_path_info(&plan->plan, (Path *) best_path); |
- |
| 2581 |
- |
|
- |
| 2582 |
- |
return plan; |
- |
| 2583 |
- |
} |
- |