Lines Matching refs:winstate

63 	WindowAggState *winstate;	/* parent WindowAggState */  member
160 static void initialize_windowaggregate(WindowAggState *winstate,
163 static void advance_windowaggregate(WindowAggState *winstate,
166 static bool advance_windowaggregate_base(WindowAggState *winstate,
169 static void finalize_windowaggregate(WindowAggState *winstate,
174 static void eval_windowaggregates(WindowAggState *winstate);
175 static void eval_windowfunction(WindowAggState *winstate,
179 static void begin_partition(WindowAggState *winstate);
180 static void spool_tuples(WindowAggState *winstate, int64 pos);
181 static void release_partition(WindowAggState *winstate);
183 static int row_is_in_frame(WindowAggState *winstate, int64 pos,
185 static void update_frameheadpos(WindowAggState *winstate);
186 static void update_frametailpos(WindowAggState *winstate);
187 static void update_grouptailpos(WindowAggState *winstate);
189 static WindowStatePerAggData *initialize_peragg(WindowAggState *winstate,
194 static bool are_peers(WindowAggState *winstate, TupleTableSlot *slot1,
205 initialize_windowaggregate(WindowAggState *winstate, in initialize_windowaggregate() argument
216 if (peraggstate->aggcontext != winstate->aggcontext) in initialize_windowaggregate()
240 advance_windowaggregate(WindowAggState *winstate, in advance_windowaggregate() argument
251 ExprContext *econtext = winstate->tmpcontext; in advance_windowaggregate()
340 (void *) winstate, NULL); in advance_windowaggregate()
343 winstate->curaggcontext = peraggstate->aggcontext; in advance_windowaggregate()
345 winstate->curaggcontext = NULL; in advance_windowaggregate()
416 advance_windowaggregate_base(WindowAggState *winstate, in advance_windowaggregate_base() argument
427 ExprContext *econtext = winstate->tmpcontext; in advance_windowaggregate_base()
496 initialize_windowaggregate(winstate, in advance_windowaggregate_base()
497 &winstate->perfunc[peraggstate->wfuncno], in advance_windowaggregate_base()
510 (void *) winstate, NULL); in advance_windowaggregate_base()
513 winstate->curaggcontext = peraggstate->aggcontext; in advance_windowaggregate_base()
515 winstate->curaggcontext = NULL; in advance_windowaggregate_base()
578 finalize_windowaggregate(WindowAggState *winstate, in finalize_windowaggregate() argument
585 oldContext = MemoryContextSwitchTo(winstate->ss.ps.ps_ExprContext->ecxt_per_tuple_memory); in finalize_windowaggregate()
600 (void *) winstate, NULL); in finalize_windowaggregate()
624 winstate->curaggcontext = peraggstate->aggcontext; in finalize_windowaggregate()
626 winstate->curaggcontext = NULL; in finalize_windowaggregate()
661 eval_windowaggregates(WindowAggState *winstate) in eval_windowaggregates() argument
675 numaggs = winstate->numaggs; in eval_windowaggregates()
680 econtext = winstate->ss.ps.ps_ExprContext; in eval_windowaggregates()
681 agg_winobj = winstate->agg_winobj; in eval_windowaggregates()
682 agg_row_slot = winstate->agg_row_slot; in eval_windowaggregates()
683 temp_slot = winstate->temp_slot_1; in eval_windowaggregates()
734 update_frameheadpos(winstate); in eval_windowaggregates()
735 if (winstate->frameheadpos < winstate->aggregatedbase) in eval_windowaggregates()
749 if (winstate->aggregatedbase == winstate->frameheadpos && in eval_windowaggregates()
750 (winstate->frameOptions & (FRAMEOPTION_END_UNBOUNDED_FOLLOWING | in eval_windowaggregates()
752 !(winstate->frameOptions & FRAMEOPTION_EXCLUSION) && in eval_windowaggregates()
753 winstate->aggregatedbase <= winstate->currentpos && in eval_windowaggregates()
754 winstate->aggregatedupto > winstate->currentpos) in eval_windowaggregates()
758 peraggstate = &winstate->peragg[i]; in eval_windowaggregates()
784 peraggstate = &winstate->peragg[i]; in eval_windowaggregates()
785 if (winstate->currentpos == 0 || in eval_windowaggregates()
786 (winstate->aggregatedbase != winstate->frameheadpos && in eval_windowaggregates()
788 (winstate->frameOptions & FRAMEOPTION_EXCLUSION) || in eval_windowaggregates()
789 winstate->aggregatedupto <= winstate->frameheadpos) in eval_windowaggregates()
806 winstate->aggregatedbase < winstate->frameheadpos) in eval_windowaggregates()
812 if (!window_gettupleslot(agg_winobj, winstate->aggregatedbase, in eval_windowaggregates()
817 winstate->tmpcontext->ecxt_outertuple = temp_slot; in eval_windowaggregates()
827 peraggstate = &winstate->peragg[i]; in eval_windowaggregates()
832 ok = advance_windowaggregate_base(winstate, in eval_windowaggregates()
833 &winstate->perfunc[wfuncno], in eval_windowaggregates()
844 ResetExprContext(winstate->tmpcontext); in eval_windowaggregates()
847 winstate->aggregatedbase++; in eval_windowaggregates()
856 winstate->aggregatedbase = winstate->frameheadpos; in eval_windowaggregates()
863 WinSetMarkPosition(agg_winobj, winstate->frameheadpos); in eval_windowaggregates()
876 MemoryContextResetAndDeleteChildren(winstate->aggcontext); in eval_windowaggregates()
879 peraggstate = &winstate->peragg[i]; in eval_windowaggregates()
882 Assert(peraggstate->aggcontext != winstate->aggcontext || in eval_windowaggregates()
889 initialize_windowaggregate(winstate, in eval_windowaggregates()
890 &winstate->perfunc[wfuncno], in eval_windowaggregates()
912 aggregatedupto_nonrestarted = winstate->aggregatedupto; in eval_windowaggregates()
914 winstate->aggregatedupto != winstate->frameheadpos) in eval_windowaggregates()
916 winstate->aggregatedupto = winstate->frameheadpos; in eval_windowaggregates()
934 if (!window_gettupleslot(agg_winobj, winstate->aggregatedupto, in eval_windowaggregates()
943 ret = row_is_in_frame(winstate, winstate->aggregatedupto, agg_row_slot); in eval_windowaggregates()
950 winstate->tmpcontext->ecxt_outertuple = agg_row_slot; in eval_windowaggregates()
955 peraggstate = &winstate->peragg[i]; in eval_windowaggregates()
959 winstate->aggregatedupto < aggregatedupto_nonrestarted) in eval_windowaggregates()
963 advance_windowaggregate(winstate, in eval_windowaggregates()
964 &winstate->perfunc[wfuncno], in eval_windowaggregates()
970 ResetExprContext(winstate->tmpcontext); in eval_windowaggregates()
973 winstate->aggregatedupto++; in eval_windowaggregates()
978 Assert(aggregatedupto_nonrestarted <= winstate->aggregatedupto); in eval_windowaggregates()
988 peraggstate = &winstate->peragg[i]; in eval_windowaggregates()
992 finalize_windowaggregate(winstate, in eval_windowaggregates()
993 &winstate->perfunc[wfuncno], in eval_windowaggregates()
1031 eval_windowfunction(WindowAggState *winstate, WindowStatePerFunc perfuncstate, in eval_windowfunction() argument
1037 oldContext = MemoryContextSwitchTo(winstate->ss.ps.ps_ExprContext->ecxt_per_tuple_memory); in eval_windowfunction()
1053 winstate->curaggcontext = NULL; in eval_windowfunction()
1078 begin_partition(WindowAggState *winstate) in begin_partition() argument
1080 WindowAgg *node = (WindowAgg *) winstate->ss.ps.plan; in begin_partition()
1081 PlanState *outerPlan = outerPlanState(winstate); in begin_partition()
1082 int frameOptions = winstate->frameOptions; in begin_partition()
1083 int numfuncs = winstate->numfuncs; in begin_partition()
1086 winstate->partition_spooled = false; in begin_partition()
1087 winstate->framehead_valid = false; in begin_partition()
1088 winstate->frametail_valid = false; in begin_partition()
1089 winstate->grouptail_valid = false; in begin_partition()
1090 winstate->spooled_rows = 0; in begin_partition()
1091 winstate->currentpos = 0; in begin_partition()
1092 winstate->frameheadpos = 0; in begin_partition()
1093 winstate->frametailpos = 0; in begin_partition()
1094 winstate->currentgroup = 0; in begin_partition()
1095 winstate->frameheadgroup = 0; in begin_partition()
1096 winstate->frametailgroup = 0; in begin_partition()
1097 winstate->groupheadpos = 0; in begin_partition()
1098 winstate->grouptailpos = -1; /* see update_grouptailpos */ in begin_partition()
1099 ExecClearTuple(winstate->agg_row_slot); in begin_partition()
1100 if (winstate->framehead_slot) in begin_partition()
1101 ExecClearTuple(winstate->framehead_slot); in begin_partition()
1102 if (winstate->frametail_slot) in begin_partition()
1103 ExecClearTuple(winstate->frametail_slot); in begin_partition()
1109 if (TupIsNull(winstate->first_part_slot)) in begin_partition()
1114 ExecCopySlot(winstate->first_part_slot, outerslot); in begin_partition()
1118 winstate->partition_spooled = true; in begin_partition()
1119 winstate->more_partitions = false; in begin_partition()
1125 winstate->buffer = tuplestore_begin_heap(false, false, work_mem); in begin_partition()
1132 winstate->current_ptr = 0; /* read pointer 0 is pre-allocated */ in begin_partition()
1135 tuplestore_set_eflags(winstate->buffer, 0); in begin_partition()
1138 if (winstate->numaggs > 0) in begin_partition()
1140 WindowObject agg_winobj = winstate->agg_winobj; in begin_partition()
1151 agg_winobj->markptr = tuplestore_alloc_read_pointer(winstate->buffer, 0); in begin_partition()
1156 agg_winobj->readptr = tuplestore_alloc_read_pointer(winstate->buffer, in begin_partition()
1162 winstate->aggregatedbase = 0; in begin_partition()
1163 winstate->aggregatedupto = 0; in begin_partition()
1169 WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]); in begin_partition()
1175 winobj->markptr = tuplestore_alloc_read_pointer(winstate->buffer, in begin_partition()
1177 winobj->readptr = tuplestore_alloc_read_pointer(winstate->buffer, in begin_partition()
1192 winstate->framehead_ptr = winstate->frametail_ptr = -1; /* if not used */ in begin_partition()
1199 winstate->framehead_ptr = in begin_partition()
1200 tuplestore_alloc_read_pointer(winstate->buffer, 0); in begin_partition()
1204 winstate->frametail_ptr = in begin_partition()
1205 tuplestore_alloc_read_pointer(winstate->buffer, 0); in begin_partition()
1215 winstate->grouptail_ptr = -1; in begin_partition()
1221 winstate->grouptail_ptr = in begin_partition()
1222 tuplestore_alloc_read_pointer(winstate->buffer, 0); in begin_partition()
1229 tuplestore_puttupleslot(winstate->buffer, winstate->first_part_slot); in begin_partition()
1230 winstate->spooled_rows++; in begin_partition()
1238 spool_tuples(WindowAggState *winstate, int64 pos) in spool_tuples() argument
1240 WindowAgg *node = (WindowAgg *) winstate->ss.ps.plan; in spool_tuples()
1245 if (!winstate->buffer) in spool_tuples()
1247 if (winstate->partition_spooled) in spool_tuples()
1258 if (!tuplestore_in_memory(winstate->buffer)) in spool_tuples()
1261 outerPlan = outerPlanState(winstate); in spool_tuples()
1264 oldcontext = MemoryContextSwitchTo(winstate->ss.ps.ps_ExprContext->ecxt_per_query_memory); in spool_tuples()
1266 while (winstate->spooled_rows <= pos || pos == -1) in spool_tuples()
1272 winstate->partition_spooled = true; in spool_tuples()
1273 winstate->more_partitions = false; in spool_tuples()
1279 ExprContext *econtext = winstate->tmpcontext; in spool_tuples()
1281 econtext->ecxt_innertuple = winstate->first_part_slot; in spool_tuples()
1285 if (!ExecQualAndReset(winstate->partEqfunction, econtext)) in spool_tuples()
1290 ExecCopySlot(winstate->first_part_slot, outerslot); in spool_tuples()
1291 winstate->partition_spooled = true; in spool_tuples()
1292 winstate->more_partitions = true; in spool_tuples()
1298 tuplestore_puttupleslot(winstate->buffer, outerslot); in spool_tuples()
1299 winstate->spooled_rows++; in spool_tuples()
1311 release_partition(WindowAggState *winstate) in release_partition() argument
1315 for (i = 0; i < winstate->numfuncs; i++) in release_partition()
1317 WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]); in release_partition()
1330 MemoryContextResetAndDeleteChildren(winstate->partcontext); in release_partition()
1331 MemoryContextResetAndDeleteChildren(winstate->aggcontext); in release_partition()
1332 for (i = 0; i < winstate->numaggs; i++) in release_partition()
1334 if (winstate->peragg[i].aggcontext != winstate->aggcontext) in release_partition()
1335 MemoryContextResetAndDeleteChildren(winstate->peragg[i].aggcontext); in release_partition()
1338 if (winstate->buffer) in release_partition()
1339 tuplestore_end(winstate->buffer); in release_partition()
1340 winstate->buffer = NULL; in release_partition()
1341 winstate->partition_spooled = false; in release_partition()
1361 row_is_in_frame(WindowAggState *winstate, int64 pos, TupleTableSlot *slot) in row_is_in_frame() argument
1363 int frameOptions = winstate->frameOptions; in row_is_in_frame()
1371 update_frameheadpos(winstate); in row_is_in_frame()
1372 if (pos < winstate->frameheadpos) in row_is_in_frame()
1385 if (pos > winstate->currentpos) in row_is_in_frame()
1391 if (pos > winstate->currentpos && in row_is_in_frame()
1392 !are_peers(winstate, slot, winstate->ss.ss_ScanTupleSlot)) in row_is_in_frame()
1402 int64 offset = DatumGetInt64(winstate->endOffsetValue); in row_is_in_frame()
1408 if (pos > winstate->currentpos + offset) in row_is_in_frame()
1414 update_frametailpos(winstate); in row_is_in_frame()
1415 if (pos >= winstate->frametailpos) in row_is_in_frame()
1425 if (pos == winstate->currentpos) in row_is_in_frame()
1430 pos != winstate->currentpos)) in row_is_in_frame()
1432 WindowAgg *node = (WindowAgg *) winstate->ss.ps.plan; in row_is_in_frame()
1438 if (pos >= winstate->groupheadpos) in row_is_in_frame()
1440 update_grouptailpos(winstate); in row_is_in_frame()
1441 if (pos < winstate->grouptailpos) in row_is_in_frame()
1461 update_frameheadpos(WindowAggState *winstate) in update_frameheadpos() argument
1463 WindowAgg *node = (WindowAgg *) winstate->ss.ps.plan; in update_frameheadpos()
1464 int frameOptions = winstate->frameOptions; in update_frameheadpos()
1467 if (winstate->framehead_valid) in update_frameheadpos()
1471 oldcontext = MemoryContextSwitchTo(winstate->ss.ps.ps_ExprContext->ecxt_per_query_memory); in update_frameheadpos()
1476 winstate->frameheadpos = 0; in update_frameheadpos()
1477 winstate->framehead_valid = true; in update_frameheadpos()
1484 winstate->frameheadpos = winstate->currentpos; in update_frameheadpos()
1485 winstate->framehead_valid = true; in update_frameheadpos()
1492 winstate->frameheadpos = 0; in update_frameheadpos()
1493 winstate->framehead_valid = true; in update_frameheadpos()
1505 tuplestore_select_read_pointer(winstate->buffer, in update_frameheadpos()
1506 winstate->framehead_ptr); in update_frameheadpos()
1507 if (winstate->frameheadpos == 0 && in update_frameheadpos()
1508 TupIsNull(winstate->framehead_slot)) in update_frameheadpos()
1511 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_frameheadpos()
1512 winstate->framehead_slot)) in update_frameheadpos()
1516 while (!TupIsNull(winstate->framehead_slot)) in update_frameheadpos()
1518 if (are_peers(winstate, winstate->framehead_slot, in update_frameheadpos()
1519 winstate->ss.ss_ScanTupleSlot)) in update_frameheadpos()
1522 winstate->frameheadpos++; in update_frameheadpos()
1523 spool_tuples(winstate, winstate->frameheadpos); in update_frameheadpos()
1524 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_frameheadpos()
1525 winstate->framehead_slot)) in update_frameheadpos()
1528 winstate->framehead_valid = true; in update_frameheadpos()
1538 int64 offset = DatumGetInt64(winstate->startOffsetValue); in update_frameheadpos()
1543 winstate->frameheadpos = winstate->currentpos + offset; in update_frameheadpos()
1545 if (winstate->frameheadpos < 0) in update_frameheadpos()
1546 winstate->frameheadpos = 0; in update_frameheadpos()
1547 else if (winstate->frameheadpos > winstate->currentpos + 1) in update_frameheadpos()
1550 spool_tuples(winstate, winstate->frameheadpos - 1); in update_frameheadpos()
1551 if (winstate->frameheadpos > winstate->spooled_rows) in update_frameheadpos()
1552 winstate->frameheadpos = winstate->spooled_rows; in update_frameheadpos()
1554 winstate->framehead_valid = true; in update_frameheadpos()
1580 if (!winstate->inRangeAsc) in update_frameheadpos()
1586 tuplestore_select_read_pointer(winstate->buffer, in update_frameheadpos()
1587 winstate->framehead_ptr); in update_frameheadpos()
1588 if (winstate->frameheadpos == 0 && in update_frameheadpos()
1589 TupIsNull(winstate->framehead_slot)) in update_frameheadpos()
1592 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_frameheadpos()
1593 winstate->framehead_slot)) in update_frameheadpos()
1597 while (!TupIsNull(winstate->framehead_slot)) in update_frameheadpos()
1604 headval = slot_getattr(winstate->framehead_slot, sortCol, in update_frameheadpos()
1606 currval = slot_getattr(winstate->ss.ss_ScanTupleSlot, sortCol, in update_frameheadpos()
1611 if (winstate->inRangeNullsFirst) in update_frameheadpos()
1626 if (DatumGetBool(FunctionCall5Coll(&winstate->startInRangeFunc, in update_frameheadpos()
1627 winstate->inRangeColl, in update_frameheadpos()
1630 winstate->startOffsetValue, in update_frameheadpos()
1636 winstate->frameheadpos++; in update_frameheadpos()
1637 spool_tuples(winstate, winstate->frameheadpos); in update_frameheadpos()
1638 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_frameheadpos()
1639 winstate->framehead_slot)) in update_frameheadpos()
1642 winstate->framehead_valid = true; in update_frameheadpos()
1654 int64 offset = DatumGetInt64(winstate->startOffsetValue); in update_frameheadpos()
1658 minheadgroup = winstate->currentgroup - offset; in update_frameheadpos()
1660 minheadgroup = winstate->currentgroup + offset; in update_frameheadpos()
1662 tuplestore_select_read_pointer(winstate->buffer, in update_frameheadpos()
1663 winstate->framehead_ptr); in update_frameheadpos()
1664 if (winstate->frameheadpos == 0 && in update_frameheadpos()
1665 TupIsNull(winstate->framehead_slot)) in update_frameheadpos()
1668 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_frameheadpos()
1669 winstate->framehead_slot)) in update_frameheadpos()
1673 while (!TupIsNull(winstate->framehead_slot)) in update_frameheadpos()
1675 if (winstate->frameheadgroup >= minheadgroup) in update_frameheadpos()
1677 ExecCopySlot(winstate->temp_slot_2, winstate->framehead_slot); in update_frameheadpos()
1679 winstate->frameheadpos++; in update_frameheadpos()
1680 spool_tuples(winstate, winstate->frameheadpos); in update_frameheadpos()
1681 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_frameheadpos()
1682 winstate->framehead_slot)) in update_frameheadpos()
1684 if (!are_peers(winstate, winstate->temp_slot_2, in update_frameheadpos()
1685 winstate->framehead_slot)) in update_frameheadpos()
1686 winstate->frameheadgroup++; in update_frameheadpos()
1688 ExecClearTuple(winstate->temp_slot_2); in update_frameheadpos()
1689 winstate->framehead_valid = true; in update_frameheadpos()
1711 update_frametailpos(WindowAggState *winstate) in update_frametailpos() argument
1713 WindowAgg *node = (WindowAgg *) winstate->ss.ps.plan; in update_frametailpos()
1714 int frameOptions = winstate->frameOptions; in update_frametailpos()
1717 if (winstate->frametail_valid) in update_frametailpos()
1721 oldcontext = MemoryContextSwitchTo(winstate->ss.ps.ps_ExprContext->ecxt_per_query_memory); in update_frametailpos()
1726 spool_tuples(winstate, -1); in update_frametailpos()
1727 winstate->frametailpos = winstate->spooled_rows; in update_frametailpos()
1728 winstate->frametail_valid = true; in update_frametailpos()
1735 winstate->frametailpos = winstate->currentpos + 1; in update_frametailpos()
1736 winstate->frametail_valid = true; in update_frametailpos()
1743 spool_tuples(winstate, -1); in update_frametailpos()
1744 winstate->frametailpos = winstate->spooled_rows; in update_frametailpos()
1745 winstate->frametail_valid = true; in update_frametailpos()
1758 tuplestore_select_read_pointer(winstate->buffer, in update_frametailpos()
1759 winstate->frametail_ptr); in update_frametailpos()
1760 if (winstate->frametailpos == 0 && in update_frametailpos()
1761 TupIsNull(winstate->frametail_slot)) in update_frametailpos()
1764 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_frametailpos()
1765 winstate->frametail_slot)) in update_frametailpos()
1769 while (!TupIsNull(winstate->frametail_slot)) in update_frametailpos()
1771 if (winstate->frametailpos > winstate->currentpos && in update_frametailpos()
1772 !are_peers(winstate, winstate->frametail_slot, in update_frametailpos()
1773 winstate->ss.ss_ScanTupleSlot)) in update_frametailpos()
1776 winstate->frametailpos++; in update_frametailpos()
1777 spool_tuples(winstate, winstate->frametailpos); in update_frametailpos()
1778 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_frametailpos()
1779 winstate->frametail_slot)) in update_frametailpos()
1782 winstate->frametail_valid = true; in update_frametailpos()
1792 int64 offset = DatumGetInt64(winstate->endOffsetValue); in update_frametailpos()
1797 winstate->frametailpos = winstate->currentpos + offset + 1; in update_frametailpos()
1799 if (winstate->frametailpos < 0) in update_frametailpos()
1800 winstate->frametailpos = 0; in update_frametailpos()
1801 else if (winstate->frametailpos > winstate->currentpos + 1) in update_frametailpos()
1804 spool_tuples(winstate, winstate->frametailpos - 1); in update_frametailpos()
1805 if (winstate->frametailpos > winstate->spooled_rows) in update_frametailpos()
1806 winstate->frametailpos = winstate->spooled_rows; in update_frametailpos()
1808 winstate->frametail_valid = true; in update_frametailpos()
1834 if (!winstate->inRangeAsc) in update_frametailpos()
1840 tuplestore_select_read_pointer(winstate->buffer, in update_frametailpos()
1841 winstate->frametail_ptr); in update_frametailpos()
1842 if (winstate->frametailpos == 0 && in update_frametailpos()
1843 TupIsNull(winstate->frametail_slot)) in update_frametailpos()
1846 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_frametailpos()
1847 winstate->frametail_slot)) in update_frametailpos()
1851 while (!TupIsNull(winstate->frametail_slot)) in update_frametailpos()
1858 tailval = slot_getattr(winstate->frametail_slot, sortCol, in update_frametailpos()
1860 currval = slot_getattr(winstate->ss.ss_ScanTupleSlot, sortCol, in update_frametailpos()
1865 if (winstate->inRangeNullsFirst) in update_frametailpos()
1880 if (!DatumGetBool(FunctionCall5Coll(&winstate->endInRangeFunc, in update_frametailpos()
1881 winstate->inRangeColl, in update_frametailpos()
1884 winstate->endOffsetValue, in update_frametailpos()
1890 winstate->frametailpos++; in update_frametailpos()
1891 spool_tuples(winstate, winstate->frametailpos); in update_frametailpos()
1892 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_frametailpos()
1893 winstate->frametail_slot)) in update_frametailpos()
1896 winstate->frametail_valid = true; in update_frametailpos()
1908 int64 offset = DatumGetInt64(winstate->endOffsetValue); in update_frametailpos()
1912 maxtailgroup = winstate->currentgroup - offset; in update_frametailpos()
1914 maxtailgroup = winstate->currentgroup + offset; in update_frametailpos()
1916 tuplestore_select_read_pointer(winstate->buffer, in update_frametailpos()
1917 winstate->frametail_ptr); in update_frametailpos()
1918 if (winstate->frametailpos == 0 && in update_frametailpos()
1919 TupIsNull(winstate->frametail_slot)) in update_frametailpos()
1922 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_frametailpos()
1923 winstate->frametail_slot)) in update_frametailpos()
1927 while (!TupIsNull(winstate->frametail_slot)) in update_frametailpos()
1929 if (winstate->frametailgroup > maxtailgroup) in update_frametailpos()
1931 ExecCopySlot(winstate->temp_slot_2, winstate->frametail_slot); in update_frametailpos()
1933 winstate->frametailpos++; in update_frametailpos()
1934 spool_tuples(winstate, winstate->frametailpos); in update_frametailpos()
1935 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_frametailpos()
1936 winstate->frametail_slot)) in update_frametailpos()
1938 if (!are_peers(winstate, winstate->temp_slot_2, in update_frametailpos()
1939 winstate->frametail_slot)) in update_frametailpos()
1940 winstate->frametailgroup++; in update_frametailpos()
1942 ExecClearTuple(winstate->temp_slot_2); in update_frametailpos()
1943 winstate->frametail_valid = true; in update_frametailpos()
1961 update_grouptailpos(WindowAggState *winstate) in update_grouptailpos() argument
1963 WindowAgg *node = (WindowAgg *) winstate->ss.ps.plan; in update_grouptailpos()
1966 if (winstate->grouptail_valid) in update_grouptailpos()
1970 oldcontext = MemoryContextSwitchTo(winstate->ss.ps.ps_ExprContext->ecxt_per_query_memory); in update_grouptailpos()
1975 spool_tuples(winstate, -1); in update_grouptailpos()
1976 winstate->grouptailpos = winstate->spooled_rows; in update_grouptailpos()
1977 winstate->grouptail_valid = true; in update_grouptailpos()
1989 Assert(winstate->grouptailpos <= winstate->currentpos); in update_grouptailpos()
1990 tuplestore_select_read_pointer(winstate->buffer, in update_grouptailpos()
1991 winstate->grouptail_ptr); in update_grouptailpos()
1995 winstate->grouptailpos++; in update_grouptailpos()
1996 spool_tuples(winstate, winstate->grouptailpos); in update_grouptailpos()
1997 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in update_grouptailpos()
1998 winstate->temp_slot_2)) in update_grouptailpos()
2000 if (winstate->grouptailpos > winstate->currentpos && in update_grouptailpos()
2001 !are_peers(winstate, winstate->temp_slot_2, in update_grouptailpos()
2002 winstate->ss.ss_ScanTupleSlot)) in update_grouptailpos()
2005 ExecClearTuple(winstate->temp_slot_2); in update_grouptailpos()
2006 winstate->grouptail_valid = true; in update_grouptailpos()
2024 WindowAggState *winstate = castNode(WindowAggState, pstate); in ExecWindowAgg() local
2031 if (winstate->all_done) in ExecWindowAgg()
2039 if (winstate->all_first) in ExecWindowAgg()
2041 int frameOptions = winstate->frameOptions; in ExecWindowAgg()
2042 ExprContext *econtext = winstate->ss.ps.ps_ExprContext; in ExecWindowAgg()
2050 Assert(winstate->startOffset != NULL); in ExecWindowAgg()
2051 value = ExecEvalExprSwitchContext(winstate->startOffset, in ExecWindowAgg()
2059 get_typlenbyval(exprType((Node *) winstate->startOffset->expr), in ExecWindowAgg()
2061 winstate->startOffsetValue = datumCopy(value, byval, len); in ExecWindowAgg()
2075 Assert(winstate->endOffset != NULL); in ExecWindowAgg()
2076 value = ExecEvalExprSwitchContext(winstate->endOffset, in ExecWindowAgg()
2084 get_typlenbyval(exprType((Node *) winstate->endOffset->expr), in ExecWindowAgg()
2086 winstate->endOffsetValue = datumCopy(value, byval, len); in ExecWindowAgg()
2098 winstate->all_first = false; in ExecWindowAgg()
2101 if (winstate->buffer == NULL) in ExecWindowAgg()
2104 begin_partition(winstate); in ExecWindowAgg()
2110 winstate->currentpos++; in ExecWindowAgg()
2112 winstate->framehead_valid = false; in ExecWindowAgg()
2113 winstate->frametail_valid = false; in ExecWindowAgg()
2121 spool_tuples(winstate, winstate->currentpos); in ExecWindowAgg()
2124 if (winstate->partition_spooled && in ExecWindowAgg()
2125 winstate->currentpos >= winstate->spooled_rows) in ExecWindowAgg()
2127 release_partition(winstate); in ExecWindowAgg()
2129 if (winstate->more_partitions) in ExecWindowAgg()
2131 begin_partition(winstate); in ExecWindowAgg()
2132 Assert(winstate->spooled_rows > 0); in ExecWindowAgg()
2136 winstate->all_done = true; in ExecWindowAgg()
2142 econtext = winstate->ss.ps.ps_ExprContext; in ExecWindowAgg()
2161 tuplestore_select_read_pointer(winstate->buffer, winstate->current_ptr); in ExecWindowAgg()
2162 if ((winstate->frameOptions & (FRAMEOPTION_GROUPS | in ExecWindowAgg()
2165 winstate->currentpos > 0) in ExecWindowAgg()
2167 ExecCopySlot(winstate->temp_slot_2, winstate->ss.ss_ScanTupleSlot); in ExecWindowAgg()
2168 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in ExecWindowAgg()
2169 winstate->ss.ss_ScanTupleSlot)) in ExecWindowAgg()
2171 if (!are_peers(winstate, winstate->temp_slot_2, in ExecWindowAgg()
2172 winstate->ss.ss_ScanTupleSlot)) in ExecWindowAgg()
2174 winstate->currentgroup++; in ExecWindowAgg()
2175 winstate->groupheadpos = winstate->currentpos; in ExecWindowAgg()
2176 winstate->grouptail_valid = false; in ExecWindowAgg()
2178 ExecClearTuple(winstate->temp_slot_2); in ExecWindowAgg()
2182 if (!tuplestore_gettupleslot(winstate->buffer, true, true, in ExecWindowAgg()
2183 winstate->ss.ss_ScanTupleSlot)) in ExecWindowAgg()
2190 numfuncs = winstate->numfuncs; in ExecWindowAgg()
2193 WindowStatePerFunc perfuncstate = &(winstate->perfunc[i]); in ExecWindowAgg()
2197 eval_windowfunction(winstate, perfuncstate, in ExecWindowAgg()
2205 if (winstate->numaggs > 0) in ExecWindowAgg()
2206 eval_windowaggregates(winstate); in ExecWindowAgg()
2218 if (winstate->framehead_ptr >= 0) in ExecWindowAgg()
2219 update_frameheadpos(winstate); in ExecWindowAgg()
2220 if (winstate->frametail_ptr >= 0) in ExecWindowAgg()
2221 update_frametailpos(winstate); in ExecWindowAgg()
2222 if (winstate->grouptail_ptr >= 0) in ExecWindowAgg()
2223 update_grouptailpos(winstate); in ExecWindowAgg()
2228 tuplestore_trim(winstate->buffer); in ExecWindowAgg()
2235 econtext->ecxt_outertuple = winstate->ss.ss_ScanTupleSlot; in ExecWindowAgg()
2237 return ExecProject(winstate->ss.ps.ps_ProjInfo); in ExecWindowAgg()
2250 WindowAggState *winstate; in ExecInitWindowAgg() local
2270 winstate = makeNode(WindowAggState); in ExecInitWindowAgg()
2271 winstate->ss.ps.plan = (Plan *) node; in ExecInitWindowAgg()
2272 winstate->ss.ps.state = estate; in ExecInitWindowAgg()
2273 winstate->ss.ps.ExecProcNode = ExecWindowAgg; in ExecInitWindowAgg()
2280 ExecAssignExprContext(estate, &winstate->ss.ps); in ExecInitWindowAgg()
2281 tmpcontext = winstate->ss.ps.ps_ExprContext; in ExecInitWindowAgg()
2282 winstate->tmpcontext = tmpcontext; in ExecInitWindowAgg()
2283 ExecAssignExprContext(estate, &winstate->ss.ps); in ExecInitWindowAgg()
2286 winstate->partcontext = in ExecInitWindowAgg()
2297 winstate->aggcontext = in ExecInitWindowAgg()
2307 winstate->ss.ps.qual = NULL; in ExecInitWindowAgg()
2313 outerPlanState(winstate) = ExecInitNode(outerPlan, estate, eflags); in ExecInitWindowAgg()
2319 ExecCreateScanSlotFromOuterPlan(estate, &winstate->ss, &TTSOpsMinimalTuple); in ExecInitWindowAgg()
2320 scanDesc = winstate->ss.ss_ScanTupleSlot->tts_tupleDescriptor; in ExecInitWindowAgg()
2323 winstate->ss.ps.outeropsset = true; in ExecInitWindowAgg()
2324 winstate->ss.ps.outerops = &TTSOpsMinimalTuple; in ExecInitWindowAgg()
2325 winstate->ss.ps.outeropsfixed = true; in ExecInitWindowAgg()
2330 winstate->first_part_slot = ExecInitExtraTupleSlot(estate, scanDesc, in ExecInitWindowAgg()
2332 winstate->agg_row_slot = ExecInitExtraTupleSlot(estate, scanDesc, in ExecInitWindowAgg()
2334 winstate->temp_slot_1 = ExecInitExtraTupleSlot(estate, scanDesc, in ExecInitWindowAgg()
2336 winstate->temp_slot_2 = ExecInitExtraTupleSlot(estate, scanDesc, in ExecInitWindowAgg()
2344 winstate->framehead_slot = winstate->frametail_slot = NULL; in ExecInitWindowAgg()
2351 winstate->framehead_slot = ExecInitExtraTupleSlot(estate, scanDesc, in ExecInitWindowAgg()
2356 winstate->frametail_slot = ExecInitExtraTupleSlot(estate, scanDesc, in ExecInitWindowAgg()
2363 ExecInitResultTupleSlotTL(&winstate->ss.ps, &TTSOpsVirtual); in ExecInitWindowAgg()
2364 ExecAssignProjectionInfo(&winstate->ss.ps, NULL); in ExecInitWindowAgg()
2368 winstate->partEqfunction = in ExecInitWindowAgg()
2374 &winstate->ss.ps); in ExecInitWindowAgg()
2377 winstate->ordEqfunction = in ExecInitWindowAgg()
2383 &winstate->ss.ps); in ExecInitWindowAgg()
2388 numfuncs = winstate->numfuncs; in ExecInitWindowAgg()
2389 numaggs = winstate->numaggs; in ExecInitWindowAgg()
2390 econtext = winstate->ss.ps.ps_ExprContext; in ExecInitWindowAgg()
2399 winstate->perfunc = perfunc; in ExecInitWindowAgg()
2400 winstate->peragg = peragg; in ExecInitWindowAgg()
2404 foreach(l, winstate->funcs) in ExecInitWindowAgg()
2469 peraggstate = &winstate->peragg[aggno]; in ExecInitWindowAgg()
2470 initialize_peragg(winstate, wfunc, peraggstate); in ExecInitWindowAgg()
2477 winobj->winstate = winstate; in ExecInitWindowAgg()
2485 winstate->numfuncs = wfuncno + 1; in ExecInitWindowAgg()
2486 winstate->numaggs = aggno + 1; in ExecInitWindowAgg()
2489 if (winstate->numaggs > 0) in ExecInitWindowAgg()
2493 agg_winobj->winstate = winstate; in ExecInitWindowAgg()
2499 winstate->agg_winobj = agg_winobj; in ExecInitWindowAgg()
2503 winstate->frameOptions = frameOptions; in ExecInitWindowAgg()
2506 winstate->startOffset = ExecInitExpr((Expr *) node->startOffset, in ExecInitWindowAgg()
2507 (PlanState *) winstate); in ExecInitWindowAgg()
2508 winstate->endOffset = ExecInitExpr((Expr *) node->endOffset, in ExecInitWindowAgg()
2509 (PlanState *) winstate); in ExecInitWindowAgg()
2513 fmgr_info(node->startInRangeFunc, &winstate->startInRangeFunc); in ExecInitWindowAgg()
2515 fmgr_info(node->endInRangeFunc, &winstate->endInRangeFunc); in ExecInitWindowAgg()
2516 winstate->inRangeColl = node->inRangeColl; in ExecInitWindowAgg()
2517 winstate->inRangeAsc = node->inRangeAsc; in ExecInitWindowAgg()
2518 winstate->inRangeNullsFirst = node->inRangeNullsFirst; in ExecInitWindowAgg()
2520 winstate->all_first = true; in ExecInitWindowAgg()
2521 winstate->partition_spooled = false; in ExecInitWindowAgg()
2522 winstate->more_partitions = false; in ExecInitWindowAgg()
2524 return winstate; in ExecInitWindowAgg()
2616 initialize_peragg(WindowAggState *winstate, WindowFunc *wfunc, in initialize_peragg() argument
2670 else if (winstate->frameOptions & FRAMEOPTION_START_UNBOUNDED_PRECEDING) in initialize_peragg()
2873 peraggstate->aggcontext = winstate->aggcontext; in initialize_peragg()
2903 are_peers(WindowAggState *winstate, TupleTableSlot *slot1, in are_peers() argument
2906 WindowAgg *node = (WindowAgg *) winstate->ss.ps.plan; in are_peers()
2907 ExprContext *econtext = winstate->tmpcontext; in are_peers()
2915 return ExecQualAndReset(winstate->ordEqfunction, econtext); in are_peers()
2928 WindowAggState *winstate = winobj->winstate; in window_gettupleslot() local
2939 spool_tuples(winstate, pos); in window_gettupleslot()
2941 if (pos >= winstate->spooled_rows) in window_gettupleslot()
2947 oldcontext = MemoryContextSwitchTo(winstate->ss.ps.ps_ExprContext->ecxt_per_query_memory); in window_gettupleslot()
2949 tuplestore_select_read_pointer(winstate->buffer, winobj->readptr); in window_gettupleslot()
2956 if (!tuplestore_skiptuples(winstate->buffer, in window_gettupleslot()
2964 if (!tuplestore_skiptuples(winstate->buffer, in window_gettupleslot()
2979 tuplestore_advance(winstate->buffer, true); in window_gettupleslot()
2989 if (!tuplestore_gettupleslot(winstate->buffer, false, true, slot)) in window_gettupleslot()
2995 if (!tuplestore_gettupleslot(winstate->buffer, true, true, slot)) in window_gettupleslot()
3031 MemoryContextAllocZero(winobj->winstate->partcontext, sz); in WinGetPartitionLocalMemory()
3044 return winobj->winstate->currentpos; in WinGetCurrentPosition()
3059 spool_tuples(winobj->winstate, -1); in WinGetPartitionRowCount()
3060 return winobj->winstate->spooled_rows; in WinGetPartitionRowCount()
3076 WindowAggState *winstate; in WinSetMarkPosition() local
3079 winstate = winobj->winstate; in WinSetMarkPosition()
3083 tuplestore_select_read_pointer(winstate->buffer, winobj->markptr); in WinSetMarkPosition()
3086 tuplestore_skiptuples(winstate->buffer, in WinSetMarkPosition()
3091 tuplestore_select_read_pointer(winstate->buffer, winobj->readptr); in WinSetMarkPosition()
3094 tuplestore_skiptuples(winstate->buffer, in WinSetMarkPosition()
3111 WindowAggState *winstate; in WinRowsArePeers() local
3118 winstate = winobj->winstate; in WinRowsArePeers()
3119 node = (WindowAgg *) winstate->ss.ps.plan; in WinRowsArePeers()
3129 slot1 = winstate->temp_slot_1; in WinRowsArePeers()
3130 slot2 = winstate->temp_slot_2; in WinRowsArePeers()
3139 res = are_peers(winstate, slot1, slot2); in WinRowsArePeers()
3170 WindowAggState *winstate; in WinGetFuncArgInPartition() local
3177 winstate = winobj->winstate; in WinGetFuncArgInPartition()
3178 econtext = winstate->ss.ps.ps_ExprContext; in WinGetFuncArgInPartition()
3179 slot = winstate->temp_slot_1; in WinGetFuncArgInPartition()
3184 abs_pos = winstate->currentpos + relpos; in WinGetFuncArgInPartition()
3190 spool_tuples(winstate, -1); in WinGetFuncArgInPartition()
3191 abs_pos = winstate->spooled_rows - 1 + relpos; in WinGetFuncArgInPartition()
3258 WindowAggState *winstate; in WinGetFuncArgInFrame() local
3265 winstate = winobj->winstate; in WinGetFuncArgInFrame()
3266 econtext = winstate->ss.ps.ps_ExprContext; in WinGetFuncArgInFrame()
3267 slot = winstate->temp_slot_1; in WinGetFuncArgInFrame()
3279 update_frameheadpos(winstate); in WinGetFuncArgInFrame()
3280 abs_pos = winstate->frameheadpos + relpos; in WinGetFuncArgInFrame()
3295 switch (winstate->frameOptions & FRAMEOPTION_EXCLUSION) in WinGetFuncArgInFrame()
3301 if (abs_pos >= winstate->currentpos && in WinGetFuncArgInFrame()
3302 winstate->currentpos >= winstate->frameheadpos) in WinGetFuncArgInFrame()
3306 update_grouptailpos(winstate); in WinGetFuncArgInFrame()
3307 if (abs_pos >= winstate->groupheadpos && in WinGetFuncArgInFrame()
3308 winstate->grouptailpos > winstate->frameheadpos) in WinGetFuncArgInFrame()
3310 int64 overlapstart = Max(winstate->groupheadpos, in WinGetFuncArgInFrame()
3311 winstate->frameheadpos); in WinGetFuncArgInFrame()
3313 abs_pos += winstate->grouptailpos - overlapstart; in WinGetFuncArgInFrame()
3317 update_grouptailpos(winstate); in WinGetFuncArgInFrame()
3318 if (abs_pos >= winstate->groupheadpos && in WinGetFuncArgInFrame()
3319 winstate->grouptailpos > winstate->frameheadpos) in WinGetFuncArgInFrame()
3321 int64 overlapstart = Max(winstate->groupheadpos, in WinGetFuncArgInFrame()
3322 winstate->frameheadpos); in WinGetFuncArgInFrame()
3325 abs_pos = winstate->currentpos; in WinGetFuncArgInFrame()
3327 abs_pos += winstate->grouptailpos - overlapstart - 1; in WinGetFuncArgInFrame()
3332 winstate->frameOptions); in WinGetFuncArgInFrame()
3340 update_frametailpos(winstate); in WinGetFuncArgInFrame()
3341 abs_pos = winstate->frametailpos - 1 + relpos; in WinGetFuncArgInFrame()
3352 switch (winstate->frameOptions & FRAMEOPTION_EXCLUSION) in WinGetFuncArgInFrame()
3359 if (abs_pos <= winstate->currentpos && in WinGetFuncArgInFrame()
3360 winstate->currentpos < winstate->frametailpos) in WinGetFuncArgInFrame()
3362 update_frameheadpos(winstate); in WinGetFuncArgInFrame()
3363 if (abs_pos < winstate->frameheadpos) in WinGetFuncArgInFrame()
3365 mark_pos = winstate->frameheadpos; in WinGetFuncArgInFrame()
3368 update_grouptailpos(winstate); in WinGetFuncArgInFrame()
3369 if (abs_pos < winstate->grouptailpos && in WinGetFuncArgInFrame()
3370 winstate->groupheadpos < winstate->frametailpos) in WinGetFuncArgInFrame()
3372 int64 overlapend = Min(winstate->grouptailpos, in WinGetFuncArgInFrame()
3373 winstate->frametailpos); in WinGetFuncArgInFrame()
3375 abs_pos -= overlapend - winstate->groupheadpos; in WinGetFuncArgInFrame()
3377 update_frameheadpos(winstate); in WinGetFuncArgInFrame()
3378 if (abs_pos < winstate->frameheadpos) in WinGetFuncArgInFrame()
3380 mark_pos = winstate->frameheadpos; in WinGetFuncArgInFrame()
3383 update_grouptailpos(winstate); in WinGetFuncArgInFrame()
3384 if (abs_pos < winstate->grouptailpos && in WinGetFuncArgInFrame()
3385 winstate->groupheadpos < winstate->frametailpos) in WinGetFuncArgInFrame()
3387 int64 overlapend = Min(winstate->grouptailpos, in WinGetFuncArgInFrame()
3388 winstate->frametailpos); in WinGetFuncArgInFrame()
3391 abs_pos = winstate->currentpos; in WinGetFuncArgInFrame()
3393 abs_pos -= overlapend - 1 - winstate->groupheadpos; in WinGetFuncArgInFrame()
3395 update_frameheadpos(winstate); in WinGetFuncArgInFrame()
3396 if (abs_pos < winstate->frameheadpos) in WinGetFuncArgInFrame()
3398 mark_pos = winstate->frameheadpos; in WinGetFuncArgInFrame()
3402 winstate->frameOptions); in WinGetFuncArgInFrame()
3417 if (row_is_in_frame(winstate, abs_pos, slot) <= 0) in WinGetFuncArgInFrame()
3451 WindowAggState *winstate; in WinGetFuncArgCurrent() local
3455 winstate = winobj->winstate; in WinGetFuncArgCurrent()
3457 econtext = winstate->ss.ps.ps_ExprContext; in WinGetFuncArgCurrent()
3459 econtext->ecxt_outertuple = winstate->ss.ss_ScanTupleSlot; in WinGetFuncArgCurrent()