]> granicus.if.org Git - postgresql/commitdiff
Fix brown-paper-bag bug in commit 0a459cec96d3856f476c2db298c6b52f592894e8.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 23 Feb 2018 20:11:40 +0000 (15:11 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 23 Feb 2018 20:11:40 +0000 (15:11 -0500)
RANGE_OFFSET comparisons need to examine the first ORDER BY column,
which isn't necessarily the first column in the incoming tuples.
No idea how this slipped through initial testing.

Per bug #15082 from Zhou Digoal.

Discussion: https://postgr.es/m/151939899974.1461.9411971793110285476@wrigleys.postgresql.org

src/backend/executor/nodeWindowAgg.c

index a56c3e89fd5f661d05d9856b45883f8d1d112151..fe5369a0c7b70ea338fa38adc43f9985f860581a 100644 (file)
@@ -1559,6 +1559,7 @@ update_frameheadpos(WindowAggState *winstate)
                         * reach end of partition, we will leave frameheadpos = end+1 and
                         * framehead_slot empty.
                         */
+                       int                     sortCol = node->ordColIdx[0];
                        bool            sub,
                                                less;
 
@@ -1593,9 +1594,9 @@ update_frameheadpos(WindowAggState *winstate)
                                bool            headisnull,
                                                        currisnull;
 
-                               headval = slot_getattr(winstate->framehead_slot, 1,
+                               headval = slot_getattr(winstate->framehead_slot, sortCol,
                                                                           &headisnull);
-                               currval = slot_getattr(winstate->ss.ss_ScanTupleSlot, 1,
+                               currval = slot_getattr(winstate->ss.ss_ScanTupleSlot, sortCol,
                                                                           &currisnull);
                                if (headisnull || currisnull)
                                {
@@ -1809,6 +1810,7 @@ update_frametailpos(WindowAggState *winstate)
                         * necessary.  Note that if we reach end of partition, we will
                         * leave frametailpos = end+1 and frametail_slot empty.
                         */
+                       int                     sortCol = node->ordColIdx[0];
                        bool            sub,
                                                less;
 
@@ -1843,9 +1845,9 @@ update_frametailpos(WindowAggState *winstate)
                                bool            tailisnull,
                                                        currisnull;
 
-                               tailval = slot_getattr(winstate->frametail_slot, 1,
+                               tailval = slot_getattr(winstate->frametail_slot, sortCol,
                                                                           &tailisnull);
-                               currval = slot_getattr(winstate->ss.ss_ScanTupleSlot, 1,
+                               currval = slot_getattr(winstate->ss.ss_ScanTupleSlot, sortCol,
                                                                           &currisnull);
                                if (tailisnull || currisnull)
                                {