]> granicus.if.org Git - postgresql/commitdiff
Fix minor oversights in nodeAgg.c.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 21 Dec 2016 00:22:02 +0000 (19:22 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 21 Dec 2016 00:22:02 +0000 (19:22 -0500)
aggstate->evalproj is always set up by ExecInitAgg, so there's no
need to test.  Doing so led Coverity to think that we might be
intending "slot" to be possibly NULL here, and it quite properly
complained that the rest of combine_aggregates() wasn't prepared
for that.

Also fix a couple of obvious thinkos in Asserts checking that
"inputoff" isn't past the end of the slot.

Errors introduced in commit 8ed3f11bb, so no need for back-patch.

src/backend/executor/nodeAgg.c

index 781938e2bb4cf31f075d2ed7f907026e60fa0fd4..ad5edbad29e8082defc8788fed780f5576d6d6f7 100644 (file)
@@ -932,7 +932,8 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
 
                        /* Load values into fcinfo */
                        /* Start from 1, since the 0th arg will be the transition value */
-                       Assert(slot->tts_nvalid >= numTransInputs);
+                       Assert(slot->tts_nvalid >= (numTransInputs + inputoff));
+
                        for (i = 0; i < numTransInputs; i++)
                        {
                                fcinfo->arg[i + 1] = slot->tts_values[i + inputoff];
@@ -963,14 +964,13 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
 {
        int                     transno;
        int                     numTrans = aggstate->numtrans;
-       TupleTableSlot *slot = NULL;
+       TupleTableSlot *slot;
 
        /* combine not supported with grouping sets */
        Assert(aggstate->phase->numsets == 0);
 
        /* compute input for all aggregates */
-       if (aggstate->evalproj)
-               slot = ExecProject(aggstate->evalproj, NULL);
+       slot = ExecProject(aggstate->evalproj, NULL);
 
        for (transno = 0; transno < numTrans; transno++)
        {
@@ -979,8 +979,7 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
                FunctionCallInfo fcinfo = &pertrans->transfn_fcinfo;
                int                     inputoff = pertrans->inputoff;
 
-               Assert(slot->tts_nvalid >= 1);
-               Assert(slot->tts_nvalid + inputoff >= 1);
+               Assert(slot->tts_nvalid > inputoff);
 
                /*
                 * deserialfn_oid will be set if we must deserialize the input state