8000 Perform one only projection to compute agg arguments. · postgres/postgres@8ed3f11 · GitHub
[go: up one dir, main page]

Skip to content
{"payload":{"commit":{"oid":"8ed3f11bb045ad7a3607690be668dbd5b3cc31d7","url":"/postgres/postgres/commit/8ed3f11bb045ad7a3607690be668dbd5b3cc31d7","authoredDate":"2016-11-30T16:08:11.000-08:00","committedDate":"2016-11-30T16:20:24.000-08:00","shortMessage":null,"shortMessageMarkdown":"\u003cdiv\u003ePerform one only projection to compute agg arguments.\u003c/div\u003e","shortMessageMarkdownLink":null,"bodyMessageHtml":"Previously we did a ExecProject() for each individual aggregate\nargument. That turned out to be a performance bottleneck in queries with\nmultiple aggregates.\n\nDoing all the argument computations in one ExecProject() is quite a bit\ncheaper because ExecProject's fastpath can do the work at once in a\nrelatively tight loop, and because it can get all the required columns\nwith a single slot_getsomeattr and save some other redundant setup\ncosts.\n\nAuthor: Andres Freund\nReviewed-By: Heikki Linnakangas\nDiscussion: \u003ca href=\"https://postgr.es/m/20161103110721.h5i5t5saxfk5eeik@alap3.anarazel.de\" rel=\"nofollow\"\u003ehttps://postgr.es/m/20161103110721.h5i5t5saxfk5eeik@alap3.anarazel.de\u003c/a\u003e","authors":[{"login":"anarazel","displayName":"Andres Freund","avatarUrl":"https://avatars.githubusercontent.com/u/1598211?v=4","path":"/anarazel","isGitHub":false}],"committerAttribution":false,"committer":{"login":"anarazel","displayName":"Andres Freund","avatarUrl":"https://avatars.githubusercontent.com/u/1598211?v=4","path":"/anarazel","isGitHub":false},"parents":["6d46f4783efe457f74816a75173eb23ed8930020"],"globalRelayId":"MDY6Q29tbWl0OTI3NDQyOjhlZDNmMTFiYjA0NWFkN2EzNjA3NjkwYmU2NjhkYmQ1YjNjYzMxZDc=","sha1":"6d46f4783efe457f74816a75173eb23ed8930020","sha2":"8ed3f11bb045ad7a3607690be668dbd5b3cc31d7"},"currentUser":null,"repo":{"id":927442,"defaultBranch":"master","name":"postgres","ownerLogin":"postgres","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2010-09-21T11:35:45.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/177543?v=4","public":true,"private":false,"isOrgOwned":true},"diffEntryData":[{"diffLines":[{"stylingDirective":null,"type":"HUNK","blobLineNumber":159,"text":"@@ -160,6 +160,7 @@","html":"@@ -160,6 +160,7 @@","displayNoNewLineWarning":false,"position":0,"left":159,"right":159},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":160,"text":" #include \"executor/executor.h\"","html":" \u003cspan class=pl-k\u003e#include\u003c/span\u003e \u003cspan class=pl-s\u003e\u0026quot;executor/executor.h\u0026quot;\u003c/span\u003e","displayNoNewLineWarning":false,"position":1,"left":160,"right":160},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":161,"text":" #include \"executor/nodeAgg.h\"","html":" \u003cspan class=pl-k\u003e#include\u003c/span\u003e \u003cspan class=pl-s\u003e\u0026quot;executor/nodeAgg.h\u0026quot;\u003c/span\u003e","displayNoNewLineWarning":false,"position":2,"left":161,"right":161},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":162,"text":" #include \"miscadmin.h\"","html":" \u003cspan class=pl-k\u003e#include\u003c/span\u003e \u003cspan class=pl-s\u003e\u0026quot;miscadmin.h\u0026quot;\u003c/span\u003e","displayNoNewLineWarning":false,"position":3,"left":162,"right":162},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":163,"text":"+#include \"nodes/makefuncs.h\"","html":"+\u003cspan class=pl-k\u003e#include\u003c/span\u003e \u003cspan class=pl-s\u003e\u0026quot;nodes/makefuncs.h\u0026quot;\u003c/span\u003e","displayNoNewLineWarning":false,"position":4,"left":162,"right":163},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":164,"text":" #include \"nodes/nodeFuncs.h\"","html":" \u003cspan class=pl-k\u003e#include\u003c/span\u003e \u003cspan class=pl-s\u003e\u0026quot;nodes/nodeFuncs.h\u0026quot;\u003c/span\u003e","displayNoNewLineWarning":false,"position":5,"left":163,"right":164},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":165,"text":" #include \"optimizer/clauses.h\"","html":" \u003cspan class=pl-k\u003e#include\u003c/span\u003e \u003cspan class=pl-s\u003e\u0026quot;optimizer/clauses.h\u0026quot;\u003c/span\u003e","displayNoNewLineWarning":false,"position":6,"left":164,"right":165},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":166,"text":" #include \"optimizer/tlist.h\"","html":" \u003cspan class=pl-k\u003e#include\u003c/span\u003e \u003cspan class=pl-s\u003e\u0026quot;optimizer/tlist.h\u0026quot;\u003c/span\u003e","displayNoNewLineWarning":false,"position":7,"left":165,"right":166},{"stylingDirective":null,"type":"HUNK","blobLineNumber":213,"text":"@@ -213,6 +214,9 @@ typedef struct AggStatePerTransData","html":"@@ -213,6 +214,9 @@ typedef struct AggStatePerTransData","displayNoNewLineWarning":false,"position":8,"left":212,"right":213},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":214,"text":" \t */","html":" \u003cspan class=pl-c\u003e\t */\u003c/span\u003e","displayNoNewLineWarning":false,"position":9,"left":213,"right":214},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":215,"text":" \tint\t\t\tnumInputs;","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-c1\u003enumInputs\u003c/span\u003e;","displayNoNewLineWarning":false,"position":10,"left":214,"right":215},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":216,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":11,"left":215,"right":216},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":217,"text":"+\t/* offset of input columns in AggState-\u003eevalslot */","html":"+\t\u003cspan class=pl-c\u003e/* offset of input columns in AggState-\u0026gt;evalslot */\u003c/span\u003e","displayNoNewLineWarning":false,"position":12,"left":215,"right":217},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":218,"text":"+\tint\t\t\tinputoff;","html":"+\t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-c1\u003einputoff\u003c/span\u003e;","displayNoNewLineWarning":false,"position":13,"left":215,"right":218},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":219,"text":"+","html":"+","displayNoNewLineWarning":false,"position":14,"left":215,"right":219},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":220,"text":" \t/*","html":" \t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":15,"left":216,"right":220},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":221,"text":" \t * Number of aggregated input columns to pass to the transfn. This","html":" \u003cspan class=pl-c\u003e\t * Number of aggregated input columns to pass to the transfn. This\u003c/span\u003e","displayNoNewLineWarning":false,"position":16,"left":217,"right":221},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":222,"text":" \t * includes the ORDER BY columns for ordered-set aggs, but not for plain","html":" \u003cspan class=pl-c\u003e\t * includes the ORDER BY columns for ordered-set aggs, but not for plain\u003c/span\u003e","displayNoNewLineWarning":false,"position":17,"left":218,"right":222},{"stylingDirective":null,"type":"HUNK","blobLineNumber":237,"text":"@@ -234,7 +238,6 @@ typedef struct AggStatePerTransData","html":"@@ -234,7 +238,6 @@ typedef struct AggStatePerTransData","displayNoNewLineWarning":false,"position":18,"left":233,"right":237},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":238,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":19,"left":234,"right":238},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":239,"text":" \t/* ExprStates of the FILTER and argument expressions. */","html":" \t\u003cspan class=pl-c\u003e/* ExprStates of the FILTER and argument expressions. */\u003c/span\u003e","displayNoNewLineWarning":false,"position":20,"left":235,"right":239},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":240,"text":" \tExprState *aggfilter;\t\t/* state of FILTER expression, if any */","html":" \t\u003cspan class=pl-smi\u003eExprState\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-c1\u003eaggfilter\u003c/span\u003e;\t\t\u003cspan class=pl-c\u003e/* state of FILTER expression, if any */\u003c/span\u003e","displayNoNewLineWarning":false,"position":21,"left":236,"right":240},{"stylingDirective":null,"type":"DELETION","blobLineNumber":237,"text":"-\tList\t *args;\t\t\t/* states of aggregated-argument expressions */","html":"-\t\u003cspan class=pl-smi\u003eList\u003c/span\u003e\t \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-c1\u003eargs\u003c/span\u003e;\t\t\t\u003cspan class=pl-c\u003e/* states of aggregated-argument expressions */\u003c/span\u003e","displayNoNewLineWarning":false,"position":22,"left":237,"right":240},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":241,"text":" \tList\t *aggdirectargs;\t/* states of direct-argument expressions */","html":" \t\u003cspan class=pl-smi\u003eList\u003c/span\u003e\t \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-c1\u003eaggdirectargs\u003c/span\u003e;\t\u003cspan class=pl-c\u003e/* states of direct-argument expressions */\u003c/span\u003e","displayNoNewLineWarning":false,"position":23,"left":238,"right":241},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":242,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":24,"left":239,"right":242},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":243,"text":" \t/*","html":" \t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":25,"left":240,"right":243},{"stylingDirective":null,"type":"HUNK","blobLineNumber":293,"text":"@@ -291,19 +294,19 @@ typedef struct AggStatePerTransData","html":"@@ -291,19 +294,19 @@ typedef struct AggStatePerTransData","displayNoNewLineWarning":false,"position":26,"left":290,"right":293},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":294,"text":" \t\t\t\ttranstypeByVal;","html":" \t\t\t\t\u003cspan class=pl-c1\u003etranstypeByVal\u003c/span\u003e;","displayNoNewLineWarning":false,"position":27,"left":291,"right":294},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":295,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":28,"left":292,"right":295},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":296,"text":" \t/*","html":" \t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":29,"left":293,"right":296},{"stylingDirective":null,"type":"DELETION","blobLineNumber":294,"text":"-\t * Stuff for evaluation of inputs. We used to just use ExecEvalExpr, but","html":"-\u003cspan class=\"pl-c\"\u003e\t * Stuff for evaluation of inputs\u003cspan class=\"x x-first x-last\"\u003e. We used to just use ExecEvalExpr, but\u003c/span\u003e\u003c/span\u003e","displayNoNewLineWarning":false,"position":30,"left":294,"right":296},{"stylingDirective":null,"type":"DELETION","blobLineNumber":295,"text":"-\t * with the addition of ORDER BY we now need at least a slot for passing","html":"-\u003cspan class=\"pl-c\"\u003e\t * \u003cspan class=\"x x-first x-last\"\u003ewith the addition of ORDER BY we now need at least a slot for passing\u003c/span\u003e\u003c/span\u003e","displayNoNewLineWarning":false,"position":31,"left":295,"right":296},{"stylingDirective":null,"type":"DELETION","blobLineNumber":296,"text":"-\t * data to the sort object, which requires a tupledesc, so we might as","html":"-\u003cspan class=\"pl-c\"\u003e\t * \u003cspan class=\"x x-first x-last\"\u003edata to the sort object, which requires a tupledesc, so\u003c/span\u003e we \u003cspan class=\"x x-first x-last\"\u003emight as\u003c/span\u003e\u003c/span\u003e","displayNoNewLineWarning":false,"position":32,"left":296,"right":296},{"stylingDirective":null,"type":"DELETION","blobLineNumber":297,"text":"-\t * well go whole hog and use ExecProject too.","html":"-\u003cspan class=\"pl-c\"\u003e\t * \u003cspan class=\"x x-first x-last\"\u003ewell go whole hog and use ExecProject too\u003c/span\u003e.\u003c/span\u003e","displayNoNewLineWarning":false,"position":33,"left":297,"right":296},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":297,"text":"+\t * Stuff for evaluation of aggregate inputs in cases where the aggregate","html":"+\u003cspan class=\"pl-c\"\u003e\t * Stuff for evaluation of \u003cspan class=\"x x-first x-last\"\u003eaggregate \u003c/span\u003einputs\u003cspan class=\"x x-first x-last\"\u003e in cases where the aggregate\u003c/span\u003e\u003c/span\u003e","displayNoNewLineWarning":false,"position":34,"left":297,"right":297},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":298,"text":"+\t * requires sorted input. The arguments themselves will be evaluated via","html":"+\u003cspan class=\"pl-c\"\u003e\t * \u003cspan class=\"x x-first x-last\"\u003erequires sorted input. The arguments themselves will be evaluated via\u003c/span\u003e\u003c/span\u003e","displayNoNewLineWarning":false,"position":35,"left":297,"right":298},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":299,"text":"+\t * AggState-\u003eevalslot/evalproj for all aggregates at once, but we only","html":"+\u003cspan class=\"pl-c\"\u003e\t * \u003cspan class=\"x x-first x-last\"\u003eAggState-\u0026gt;evalslot/evalproj for all aggregates at once, but\u003c/span\u003e we \u003cspan class=\"x x-first x-last\"\u003eonly\u003c/span\u003e\u003c/span\u003e","displayNoNewLineWarning":false,"position":36,"left":297,"right":299},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":300,"text":"+\t * want to sort the relevant columns for individual aggregates.","html":"+\u003cspan class=\"pl-c\"\u003e\t * \u003cspan class=\"x x-first x-last\"\u003ewant to sort the relevant columns for individual aggregates\u003c/span\u003e.\u003c/span\u003e","displayNoNewLineWarning":false,"position":37,"left":297,"right":300},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":301,"text":" \t */","html":" \u003cspan class=pl-c\u003e\t */\u003c/span\u003e","displayNoNewLineWarning":false,"position":38,"left":298,"right":301},{"stylingDirective":null,"type":"DELETION","blobLineNumber":299,"text":"-\tTupleDesc\tevaldesc;\t\t/* descriptor of input tuples */","html":"-\t\u003cspan class=pl-smi\u003eTupleDesc\u003c/span\u003e\t\u003cspan class=pl-c1\u003eevaldesc\u003c/span\u003e;\t\t\u003cspan class=pl-c\u003e/* descriptor of input tuples */\u003c/span\u003e","displayNoNewLineWarning":false,"position":39,"left":299,"right":301},{"stylingDirective":null,"type":"DELETION","blobLineNumber":300,"text":"-\tProjectionInfo *evalproj;\t/* projection machinery */","html":"-\t\u003cspan class=pl-smi\u003eProjectionInfo\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-c1\u003eevalproj\u003c/span\u003e;\t\u003cspan class=pl-c\u003e/* projection machinery */\u003c/span\u003e","displayNoNewLineWarning":false,"position":40,"left":300,"right":301},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":302,"text":"+\tTupleDesc\tsortdesc;\t\t/* descriptor of input tuples */","html":"+\t\u003cspan class=pl-smi\u003eTupleDesc\u003c/span\u003e\t\u003cspan class=pl-c1\u003esortdesc\u003c/span\u003e;\t\t\u003cspan class=pl-c\u003e/* descriptor of input tuples */\u003c/span\u003e","displayNoNewLineWarning":false,"position":41,"left":300,"right":302},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":303,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":42,"left":301,"right":303},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":304,"text":" \t/*","html":" \t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":43,"left":302,"right":304},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":305,"text":" \t * Slots for holding the evaluated input arguments. These are set up","html":" \u003cspan class=pl-c\u003e\t * Slots for holding the evaluated input arguments. These are set up\u003c/span\u003e","displayNoNewLineWarning":false,"position":44,"left":303,"right":305},{"stylingDirective":null,"type":"DELETION","blobLineNumber":304,"text":"-\t * during ExecInitAgg() and then used for each input row.","html":"-\u003cspan class=pl-c\u003e\t * during ExecInitAgg() and then used for each input row.\u003c/span\u003e","displayNoNewLineWarning":false,"position":45,"left":304,"right":305},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":306,"text":"+\t * during ExecInitAgg() and then used for each input row requiring","html":"+\u003cspan class=pl-c\u003e\t * during ExecInitAgg() and then used for each input row requiring\u003c/span\u003e","displayNoNewLineWarning":false,"position":46,"left":304,"right":306},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":307,"text":"+\t * procesessing besides what's done in AggState-\u003eevalproj.","html":"+\u003cspan class=pl-c\u003e\t * procesessing besides what\u0026#39;s done in AggState-\u0026gt;evalproj.\u003c/span\u003e","displayNoNewLineWarning":false,"position":47,"left":304,"right":307},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":308,"text":" \t */","html":" \u003cspan class=pl-c\u003e\t */\u003c/span\u003e","displayNoNewLineWarning":false,"position":48,"left":305,"right":308},{"stylingDirective":null,"type":"DELETION","blobLineNumber":306,"text":"-\tTupleTableSlot *evalslot;\t/* current input tuple */","html":"-\t\u003cspan class=\"pl-smi\"\u003eTupleTableSlot\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e\u003cspan class=\"pl-c1 x x-first x-last\"\u003eevalslot\u003c/span\u003e;\t\u003cspan class=\"pl-c\"\u003e/* current input tuple */\u003c/span\u003e","displayNoNewLineWarning":false,"position":49,"left":306,"right":308},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":309,"text":"+\tTupleTableSlot *sortslot;\t/* current input tuple */","html":"+\t\u003cspan class=\"pl-smi\"\u003eTupleTableSlot\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e\u003cspan class=\"pl-c1 x x-first x-last\"\u003esortslot\u003c/span\u003e;\t\u003cspan class=\"pl-c\"\u003e/* current input tuple */\u003c/span\u003e","displayNoNewLineWarning":false,"position":50,"left":306,"right":309},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":310,"text":" \tTupleTableSlot *uniqslot;\t/* used for multi-column DISTINCT */","html":" \t\u003cspan class=pl-smi\u003eTupleTableSlot\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-c1\u003euniqslot\u003c/span\u003e;\t\u003cspan class=pl-c\u003e/* used for multi-column DISTINCT */\u003c/span\u003e","displayNoNewLineWarning":false,"position":51,"left":307,"right":310},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":311,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":52,"left":308,"right":311},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":312,"text":" \t/*","html":" \t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":53,"left":309,"right":312},{"stylingDirective":null,"type":"HUNK","blobLineNumber":623,"text":"@@ -621,14 +624,14 @@ initialize_aggregate(AggState *aggstate, AggStatePerTrans pertrans,","html":"@@ -621,14 +624,14 @@ initialize_aggregate(AggState *aggstate, AggStatePerTrans pertrans,","displayNoNewLineWarning":false,"position":54,"left":620,"right":623},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":624,"text":" \t\t */","html":" \u003cspan class=pl-c\u003e\t\t */\u003c/span\u003e","displayNoNewLineWarning":false,"position":55,"left":621,"right":624},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":625,"text":" \t\tif (pertrans-\u003enumInputs == 1)","html":" \t\t\u003cspan class=pl-k\u003eif\u003c/span\u003e (\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumInputs\u003c/span\u003e \u003cspan class=pl-c1\u003e==\u003c/span\u003e \u003cspan class=pl-c1\u003e1\u003c/span\u003e)","displayNoNewLineWarning":false,"position":56,"left":622,"right":625},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":626,"text":" \t\t\tpertrans-\u003esortstates[aggstate-\u003ecurrent_set] =","html":" \t\t\t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortstates\u003c/span\u003e[\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003ecurrent_set\u003c/span\u003e] \u003cspan class=pl-c1\u003e=\u003c/span\u003e","displayNoNewLineWarning":false,"position":57,"left":623,"right":626},{"stylingDirective":null,"type":"DELETION","blobLineNumber":624,"text":"-\t\t\t\ttuplesort_begin_datum(pertrans-\u003eevaldesc-\u003eattrs[0]-\u003eatttypid,","html":"-\t\t\t\t\u003cspan class=\"pl-en\"\u003etuplesort_begin_datum\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x x-first x-last\"\u003eevaldesc\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eattrs\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e]\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eatttypid\u003c/span\u003e,","displayNoNewLineWarning":false,"position":58,"left":624,"right":626},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":627,"text":"+\t\t\t\ttuplesort_begin_datum(pertrans-\u003esortdesc-\u003eattrs[0]-\u003eatttypid,","html":"+\t\t\t\t\u003cspan class=\"pl-en\"\u003etuplesort_begin_datum\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x x-first x-last\"\u003esortdesc\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eattrs\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e]\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eatttypid\u003c/span\u003e,","displayNoNewLineWarning":false,"position":59,"left":624,"right":627},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":628,"text":" \t\t\t\t\t\t\t\t\t pertrans-\u003esortOperators[0],","html":" \t\t\t\t\t\t\t\t\t \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortOperators\u003c/span\u003e[\u003cspan class=pl-c1\u003e0\u003c/span\u003e],","displayNoNewLineWarning":false,"position":60,"left":625,"right":628},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":629,"text":" \t\t\t\t\t\t\t\t\t pertrans-\u003esortCollations[0],","html":" \t\t\t\t\t\t\t\t\t \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortCollations\u003c/span\u003e[\u003cspan class=pl-c1\u003e0\u003c/span\u003e],","displayNoNewLineWarning":false,"position":61,"left":626,"right":629},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":630,"text":" \t\t\t\t\t\t\t\t\t pertrans-\u003esortNullsFirst[0],","html":" \t\t\t\t\t\t\t\t\t \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortNullsFirst\u003c/span\u003e[\u003cspan class=pl-c1\u003e0\u003c/span\u003e],","displayNoNewLineWarning":false,"position":62,"left":627,"right":630},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":631,"text":" \t\t\t\t\t\t\t\t\t work_mem, false);","html":" \t\t\t\t\t\t\t\t\t \u003cspan class=pl-s1\u003ework_mem\u003c/span\u003e, false);","displayNoNewLineWarning":false,"position":63,"left":628,"right":631},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":632,"text":" \t\telse","html":" \t\t\u003cspan class=pl-k\u003eelse\u003c/span\u003e","displayNoNewLineWarning":false,"position":64,"left":629,"right":632},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":633,"text":" \t\t\tpertrans-\u003esortstates[aggstate-\u003ecurrent_set] =","html":" \t\t\t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortstates\u003c/span\u003e[\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003ecurrent_set\u003c/span\u003e] \u003cspan class=pl-c1\u003e=\u003c/span\u003e","displayNoNewLineWarning":false,"position":65,"left":630,"right":633},{"stylingDirective":null,"type":"DELETION","blobLineNumber":631,"text":"-\t\t\t\ttuplesort_begin_heap(pertrans-\u003eevaldesc,","html":"-\t\t\t\t\u003cspan class=\"pl-en\"\u003etuplesort_begin_heap\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x x-first x-last\"\u003eevaldesc\u003c/span\u003e,","displayNoNewLineWarning":false,"position":66,"left":631,"right":633},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":634,"text":"+\t\t\t\ttuplesort_begin_heap(pertrans-\u003esortdesc,","html":"+\t\t\t\t\u003cspan class=\"pl-en\"\u003etuplesort_begin_heap\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x x-first x-last\"\u003esortdesc\u003c/span\u003e,","displayNoNewLineWarning":false,"position":67,"left":631,"right":634},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":635,"text":" \t\t\t\t\t\t\t\t\t pertrans-\u003enumSortCols,","html":" \t\t\t\t\t\t\t\t\t \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumSortCols\u003c/span\u003e,","displayNoNewLineWarning":false,"position":68,"left":632,"right":635},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":636,"text":" \t\t\t\t\t\t\t\t\t pertrans-\u003esortColIdx,","html":" \t\t\t\t\t\t\t\t\t \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortColIdx\u003c/span\u003e,","displayNoNewLineWarning":false,"position":69,"left":633,"right":636},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":637,"text":" \t\t\t\t\t\t\t\t\t pertrans-\u003esortOperators,","html":" \t\t\t\t\t\t\t\t\t \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortOperators\u003c/span\u003e,","displayNoNewLineWarning":false,"position":70,"left":634,"right":637},{"stylingDirective":null,"type":"HUNK","blobLineNumber":849,"text":"@@ -847,14 +850,19 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","html":"@@ -847,14 +850,19 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","displayNoNewLineWarning":false,"position":71,"left":846,"right":849},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":850,"text":" \tint\t\t\tsetno = 0;","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003esetno\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e;","displayNoNewLineWarning":false,"position":72,"left":847,"right":850},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":851,"text":" \tint\t\t\tnumGroupingSets = Max(aggstate-\u003ephase-\u003enumsets, 1);","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003enumGroupingSets\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eMax\u003c/span\u003e(\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003ephase\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumsets\u003c/span\u003e, \u003cspan class=pl-c1\u003e1\u003c/span\u003e);","displayNoNewLineWarning":false,"position":73,"left":848,"right":851},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":852,"text":" \tint\t\t\tnumTrans = aggstate-\u003enumtrans;","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003enumTrans\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumtrans\u003c/span\u003e;","displayNoNewLineWarning":false,"position":74,"left":849,"right":852},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":853,"text":"+\tTupleTableSlot *slot = aggstate-\u003eevalslot;","html":"+\t\u003cspan class=pl-smi\u003eTupleTableSlot\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003eslot\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalslot\u003c/span\u003e;","displayNoNewLineWarning":false,"position":75,"left":849,"right":853},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":854,"text":"+","html":"+","displayNoNewLineWarning":false,"position":76,"left":849,"right":854},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":855,"text":"+\t/* compute input for all aggregates */","html":"+\t\u003cspan class=pl-c\u003e/* compute input for all aggregates */\u003c/span\u003e","displayNoNewLineWarning":false,"position":77,"left":849,"right":855},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":856,"text":"+\tif (aggstate-\u003eevalproj)","html":"+\t\u003cspan class=pl-k\u003eif\u003c/span\u003e (\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalproj\u003c/span\u003e)","displayNoNewLineWarning":false,"position":78,"left":849,"right":856},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":857,"text":"+\t\taggstate-\u003eevalslot = ExecProject(aggstate-\u003eevalproj, NULL);","html":"+\t\t\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalslot\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecProject\u003c/span\u003e(\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalproj\u003c/span\u003e, \u003cspan class=pl-c1\u003eNULL\u003c/span\u003e);","displayNoNewLineWarning":false,"position":79,"left":849,"right":857},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":858,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":80,"left":850,"right":858},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":859,"text":" \tfor (transno = 0; transno \u003c numTrans; transno++)","html":" \t\u003cspan class=pl-k\u003efor\u003c/span\u003e (\u003cspan class=pl-s1\u003etransno\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e; \u003cspan class=pl-s1\u003etransno\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026lt;\u003c/span\u003e \u003cspan class=pl-s1\u003enumTrans\u003c/span\u003e; \u003cspan class=pl-s1\u003etransno\u003c/span\u003e\u003cspan class=pl-c1\u003e++\u003c/span\u003e)","displayNoNewLineWarning":false,"position":81,"left":851,"right":859},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":860,"text":" \t{","html":" \t{","displayNoNewLineWarning":false,"position":82,"left":852,"right":860},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":861,"text":" \t\tAggStatePerTrans pertrans = \u0026aggstate-\u003epertrans[transno];","html":" \t\t\u003cspan class=pl-smi\u003eAggStatePerTrans\u003c/span\u003e \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026amp;\u003c/span\u003e\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003epertrans\u003c/span\u003e[\u003cspan class=pl-s1\u003etransno\u003c/span\u003e];","displayNoNewLineWarning":false,"position":83,"left":853,"right":861},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":86 8000 2,"text":" \t\tExprState *filter = pertrans-\u003eaggfilter;","html":" \t\t\u003cspan class=pl-smi\u003eExprState\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003efilter\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eaggfilter\u003c/span\u003e;","displayNoNewLineWarning":false,"position":84,"left":854,"right":862},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":863,"text":" \t\tint\t\t\tnumTransInputs = pertrans-\u003enumTransInputs;","html":" \t\t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003enumTransInputs\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumTransInputs\u003c/span\u003e;","displayNoNewLineWarning":false,"position":85,"left":855,"right":863},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":864,"text":" \t\tint\t\t\ti;","html":" \t\t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003ei\u003c/span\u003e;","displayNoNewLineWarning":false,"position":86,"left":856,"right":864},{"stylingDirective":null,"type":"DELETION","blobLineNumber":857,"text":"-\t\tTupleTableSlot *slot;","html":"-\t\t\u003cspan class=\"pl-smi x x-first\"\u003eTupleTableSlot\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e*\u003c/span\u003e\u003cspan class=\"pl-s1 x x-last\"\u003eslot\u003c/span\u003e;","displayNoNewLineWarning":false,"position":87,"left":857,"right":864},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":865,"text":"+\t\tint\t\t\tinputoff = pertrans-\u003einputoff;","html":"+\t\t\u003cspan class=\"pl-smi x x-first\"\u003eint\u003c/span\u003e\u003cspan class=\"x\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"pl-s1 x\"\u003einputoff\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e=\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"pl-s1 x\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x x-last\"\u003einputoff\u003c/span\u003e;","displayNoNewLineWarning":false,"position":88,"left":857,"right":865},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":866,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":89,"left":858,"right":866},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":867,"text":" \t\t/* Skip anything FILTERed out */","html":" \t\t\u003cspan class=pl-c\u003e/* Skip anything FILTERed out */\u003c/span\u003e","displayNoNewLineWarning":false,"position":90,"left":859,"right":867},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":868,"text":" \t\tif (filter)","html":" \t\t\u003cspan class=pl-k\u003eif\u003c/span\u003e (\u003cspan class=pl-s1\u003efilter\u003c/span\u003e)","displayNoNewLineWarning":false,"position":91,"left":860,"right":868},{"stylingDirective":null,"type":"HUNK","blobLineNumber":875,"text":"@@ -868,13 +876,10 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","html":"@@ -868,13 +876,10 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","displayNoNewLineWarning":false,"position":92,"left":867,"right":875},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":876,"text":" \t\t\t\tcontinue;","html":" \t\t\t\t\u003cspan class=pl-k\u003econtinue\u003c/span\u003e;","displayNoNewLineWarning":false,"position":93,"left":868,"right":876},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":877,"text":" \t\t}","html":" \t\t}","displayNoNewLineWarning":false,"position":94,"left":869,"right":877},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":878,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":95,"left":870,"right":878},{"stylingDirective":null,"type":"DELETION","blobLineNumber":871,"text":"-\t\t/* Evaluate the current input expressions for this aggregate */","html":"-\t\t\u003cspan class=pl-c\u003e/* Evaluate the current input expressions for this aggregate */\u003c/span\u003e","displayNoNewLineWarning":false,"position":96,"left":871,"right":878},{"stylingDirective":null,"type":"DELETION","blobLineNumber":872,"text":"-\t\tslot = ExecProject(pertrans-\u003eevalproj, NULL);","html":"-\t\t\u003cspan class=pl-s1\u003eslot\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecProject\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalproj\u003c/span\u003e, \u003cspan class=pl-c1\u003eNULL\u003c/span\u003e);","displayNoNewLineWarning":false,"position":97,"left":872,"right":878},{"stylingDirective":null,"type":"DELETION","blobLineNumber":873,"text":"-","html":"-","displayNoNewLineWarning":false,"position":98,"left":873,"right":878},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":879,"text":" \t\tif (pertrans-\u003enumSortCols \u003e 0)","html":" \t\t\u003cspan class=pl-k\u003eif\u003c/span\u003e (\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumSortCols\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026gt;\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e)","displayNoNewLineWarning":false,"position":99,"left":874,"right":879},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":880,"text":" \t\t{","html":" \t\t{","displayNoNewLineWarning":false,"position":100,"left":875,"right":880},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":881,"text":" \t\t\t/* DISTINCT and/or ORDER BY case */","html":" \t\t\t\u003cspan class=pl-c\u003e/* DISTINCT and/or ORDER BY case */\u003c/span\u003e","displayNoNewLineWarning":false,"position":101,"left":876,"right":881},{"stylingDirective":null,"type":"DELETION","blobLineNumber":877,"text":"-\t\t\tAssert(slot-\u003etts_nvalid == pertrans-\u003enumInputs);","html":"-\t\t\t\u003cspan class=\"pl-en\"\u003eAssert\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_nvalid\u003c/span\u003e \u003cspan class=\"pl-c1 x x-first\"\u003e==\u003c/span\u003e\u003cspan class=\"x x-last\"\u003e \u003c/span\u003e\u003cspan class=\"pl-s1\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003enumInputs\u003c/span\u003e);","displayNoNewLineWarning":false,"position":102,"left":877,"right":881},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":882,"text":"+\t\t\tAssert(slot-\u003etts_nvalid \u003e= (pertrans-\u003enumInputs + inputoff));","html":"+\t\t\t\u003cspan class=\"pl-en\"\u003eAssert\u003c/span\u003e(\u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_nvalid\u003c/span\u003e \u003cspan class=\"x x-first x-last\"\u003e\u0026gt;= (\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003enumInputs\u003c/span\u003e\u003cspan class=\"x x-first\"\u003e \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e+\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"pl-s1 x\"\u003einputoff\u003c/span\u003e\u003cspan class=\"x x-last\"\u003e)\u003c/span\u003e);","displayNoNewLineWarning":false,"position":103,"left":877,"right":882},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":883,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":104,"left":878,"right":883},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":884,"text":" \t\t\t/*","html":" \t\t\t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":105,"left":879,"right":884},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":885,"text":" \t\t\t * If the transfn is strict, we want to check for nullity before","html":" \u003cspan class=pl-c\u003e\t\t\t * If the transfn is strict, we want to check for nullity before\u003c/span\u003e","displayNoNewLineWarning":false,"position":106,"left":880,"right":885},{"stylingDirective":null,"type":"HUNK","blobLineNumber":891,"text":"@@ -887,7 +892,7 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","html":"@@ -887,7 +892,7 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","displayNoNewLineWarning":false,"position":107,"left":886,"right":891},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":892,"text":" \t\t\t{","html":" \t\t\t{","displayNoNewLineWarning":false,"position":108,"left":887,"right":892},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":893,"text":" \t\t\t\tfor (i = 0; i \u003c numTransInputs; i++)","html":" \t\t\t\t\u003cspan class=pl-k\u003efor\u003c/span\u003e (\u003cspan class=pl-s1\u003ei\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e; \u003cspan class=pl-s1\u003ei\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026lt;\u003c/span\u003e \u003cspan class=pl-s1\u003enumTransInputs\u003c/span\u003e; \u003cspan class=pl-s1\u003ei\u003c/span\u003e\u003cspan class=pl-c1\u003e++\u003c/span\u003e)","displayNoNewLineWarning":false,"position":109,"left":888,"right":893},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":894,"text":" \t\t\t\t{","html":" \t\t\t\t{","displayNoNewLineWarning":false,"position":110,"left":889,"right":894},{"stylingDirective":null,"type":"DELETION","blobLineNumber":890,"text":"-\t\t\t\t\tif (slot-\u003etts_isnull[i])","html":"-\t\t\t\t\t\u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e (\u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-s1\"\u003ei\u003c/span\u003e])","displayNoNewLineWarning":false,"position":111,"left":890,"right":894},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":895,"text":"+\t\t\t\t\tif (slot-\u003etts_isnull[i + inputoff])","html":"+\t\t\t\t\t\u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e (\u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-s1\"\u003ei\u003c/span\u003e\u003cspan class=\"x x-first\"\u003e \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e+\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"pl-s1 x x-last\"\u003einputoff\u003c/span\u003e])","displayNoNewLineWarning":false,"position":112,"left":890,"right":895},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":896,"text":" \t\t\t\t\t\tbreak;","html":" \t\t\t\t\t\t\u003cspan class=pl-k\u003ebreak\u003c/span\u003e;","displayNoNewLineWarning":false,"position":113,"left":891,"right":896},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":897,"text":" \t\t\t\t}","html":" \t\t\t\t}","displayNoNewLineWarning":false,"position":114,"left":892,"right":897},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":898,"text":" \t\t\t\tif (i \u003c numTransInputs)","html":" \t\t\t\t\u003cspan class=pl-k\u003eif\u003c/span\u003e (\u003cspan class=pl-s1\u003ei\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026lt;\u003c/span\u003e \u003cspan class=pl-s1\u003enumTransInputs\u003c/span\u003e)","displayNoNewLineWarning":false,"position":115,"left":893,"right":898},{"stylingDirective":null,"type":"HUNK","blobLineNumber":903,"text":"@@ -899,10 +904,25 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","html":"@@ -899,10 +904,25 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","displayNoNewLineWarning":false,"position":116,"left":898,"right":903},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":904,"text":" \t\t\t\t/* OK, put the tuple into the tuplesort object */","html":" \t\t\t\t\u003cspan class=pl-c\u003e/* OK, put the tuple into the tuplesort object */\u003c/span\u003e","displayNoNewLineWarning":false,"position":117,"left":899,"right":904},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":905,"text":" \t\t\t\tif (pertrans-\u003enumInputs == 1)","html":" \t\t\t\t\u003cspan class=pl-k\u003eif\u003c/span\u003e (\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumInputs\u003c/span\u003e \u003cspan class=pl-c1\u003e==\u003c/span\u003e \u003cspan class=pl-c1\u003e1\u003c/span\u003e)","displayNoNewLineWarning":false,"position":118,"left":900,"right":905},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":906,"text":" \t\t\t\t\ttuplesort_putdatum(pertrans-\u003esortstates[setno],","html":" \t\t\t\t\t\u003cspan class=pl-en\u003etuplesort_putdatum\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortstates\u003c/span\u003e[\u003cspan class=pl-s1\u003esetno\u003c/span\u003e],","displayNoNewLineWarning":false,"position":119,"left":901,"right":906},{"stylingDirective":null,"type":"DELETION","blobLineNumber":902,"text":"-\t\t\t\t\t\t\t\t\t slot-\u003etts_values[0],","html":"-\t\t\t\t\t\t\t\t\t \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_values\u003c/span\u003e[\u003cspan class=\"pl-c1 x x-first x-last\"\u003e0\u003c/span\u003e],","displayNoNewLineWarning":false,"position":120,"left":902,"right":906},{"stylingDirective":null,"type":"DELETION","blobLineNumber":903,"text":"-\t\t\t\t\t\t\t\t\t slot-\u003etts_isnull[0]);","html":"-\t\t\t\t\t\t\t\t\t \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-c1 x x-first x-last\"\u003e0\u003c/span\u003e]);","displayNoNewLineWarning":false,"position":121,"left":903,"right":906},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":907,"text":"+\t\t\t\t\t\t\t\t\t slot-\u003etts_values[inputoff],","html":"+\t\t\t\t\t\t\t\t\t \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_values\u003c/span\u003e[\u003cspan class=\"pl-s1 x x-first x-last\"\u003einputoff\u003c/span\u003e],","displayNoNewLineWarning":false,"position":122,"left":903,"right":907},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":908,"text":"+\t\t\t\t\t\t\t\t\t slot-\u003etts_isnull[inputoff]);","html":"+\t\t\t\t\t\t\t\t\t \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-s1 x x-first x-last\"\u003einputoff\u003c/span\u003e]);","displayNoNewLineWarning":false,"position":123,"left":903,"right":908},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":909,"text":" \t\t\t\telse","html":" \t\t\t\t\u003cspan class=pl-k\u003eelse\u003c/span\u003e","displayNoNewLineWarning":false,"position":124,"left":904,"right":909},{"stylingDirective":null,"type":"DELETION","blobLineNumber":905,"text":"-\t\t\t\t\ttuplesort_puttupleslot(pertrans-\u003esortstates[setno], slot);","html":"-\t\t\t\t\t\u003cspan class=pl-en\u003etuplesort_puttupleslot\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortstates\u003c/span\u003e[\u003cspan class=pl-s1\u003esetno\u003c/span\u003e], \u003cspan class=pl-s1\u003eslot\u003c/span\u003e);","displayNoNewLineWarning":false,"position":125,"left":905,"right":909},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":910,"text":"+\t\t\t\t{","html":"+\t\t\t\t{","displayNoNewLineWarning":false,"position":126,"left":905,"right":910},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":911,"text":"+\t\t\t\t\t/*","html":"+\t\t\t\t\t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":127,"left":905,"right":911},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":912,"text":"+\t\t\t\t\t * Copy slot contents, starting from inputoff, into sort","html":"+\u003cspan class=pl-c\u003e\t\t\t\t\t * Copy slot contents, starting from inputoff, into sort\u003c/span\u003e","displayNoNewLineWarning":false,"position":128,"left":905,"right":912},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":913,"text":"+\t\t\t\t\t * slot.","html":"+\u003cspan class=pl-c\u003e\t\t\t\t\t * slot.\u003c/span\u003e","displayNoNewLineWarning":false,"position":129,"left":905,"right":913},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":914,"text":"+\t\t\t\t\t */","html":"+\u003cspan class=pl-c\u003e\t\t\t\t\t */\u003c/span\u003e","displayNoNewLineWarning":false,"position":130,"left":905,"right":914},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":915,"text":"+\t\t\t\t\tExecClearTuple(pertrans-\u003esortslot);","html":"+\t\t\t\t\t\u003cspan class=pl-en\u003eExecClearTuple\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortslot\u003c/span\u003e);","displayNoNewLineWarning":false,"position":131,"left":905,"right":915},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":916,"text":"+\t\t\t\t\tmemcpy(pertrans-\u003esortslot-\u003etts_values,","html":"+\t\t\t\t\t\u003cspan class=pl-en\u003ememcpy\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortslot\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etts_values\u003c/span\u003e,","displayNoNewLineWarning":false,"position":132,"left":905,"right":916},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":917,"text":"+\t\t\t\t\t\t \u0026slot-\u003etts_values[inputoff],","html":"+\t\t\t\t\t\t \u003cspan class=pl-c1\u003e\u0026amp;\u003c/span\u003e\u003cspan class=pl-s1\u003eslot\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etts_values\u003c/span\u003e[\u003cspan class=pl-s1\u003einputoff\u003c/span\u003e],","displayNoNewLineWarning":false,"position":133,"left":905,"right":917},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":918,"text":"+\t\t\t\t\t\t pertrans-\u003enumInputs * sizeof(Datum));","html":"+\t\t\t\t\t\t \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumInputs\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e \u003cspan class=pl-k\u003esizeof\u003c/span\u003e(\u003cspan class=pl-s1\u003eDatum\u003c/span\u003e));","displayNoNewLineWarning":false,"position":134,"left":905,"right":918},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":919,"text":"+\t\t\t\t\tmemcpy(pertrans-\u003esortslot-\u003etts_isnull,","html":"+\t\t\t\t\t\u003cspan class=pl-en\u003ememcpy\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortslot\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etts_isnull\u003c/span\u003e,","displayNoNewLineWarning":false,"position":135,"left":905,"right":919},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":920,"text":"+\t\t\t\t\t\t \u0026slot-\u003etts_isnull[inputoff],","html":"+\t\t\t\t\t\t \u003cspan class=pl-c1\u003e\u0026amp;\u003c/span\u003e\u003cspan class=pl-s1\u003eslot\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etts_isnull\u003c/span\u003e[\u003cspan class=pl-s1\u003einputoff\u003c/span\u003e],","displayNoNewLineWarning":false,"position":136,"left":905,"right":920},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":921,"text":"+\t\t\t\t\t\t pertrans-\u003enumInputs * sizeof(bool));","html":"+\t\t\t\t\t\t \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumInputs\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e \u003cspan class=pl-k\u003esizeof\u003c/span\u003e(\u003cspan class=pl-smi\u003ebool\u003c/span\u003e));","displayNoNewLineWarning":false,"position":137,"left":905,"right":921},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":922,"text":"+\t\t\t\t\tpertrans-\u003esortslot-\u003etts_nvalid = pertrans-\u003enumInputs;","html":"+\t\t\t\t\t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortslot\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etts_nvalid\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumInputs\u003c/span\u003e;","displayNoNewLineWarning":false,"position":138,"left":905,"right":922},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":923,"text":"+\t\t\t\t\tExecStoreVirtualTuple(pertrans-\u003esortslot);","html":"+\t\t\t\t\t\u003cspan class=pl-en\u003eExecStoreVirtualTuple\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortslot\u003c/span\u003e);","displayNoNewLineWarning":false,"position":139,"left":905,"right":923},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":924,"text":"+\t\t\t\t\ttuplesort_puttupleslot(pertrans-\u003esortstates[setno], pertrans-\u003esortslot);","html":"+\t\t\t\t\t\u003cspan class=pl-en\u003etuplesort_puttupleslot\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortstates\u003c/span\u003e[\u003cspan class=pl-s1\u003esetno\u003c/span\u003e], \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortslot\u003c/span\u003e);","displayNoNewLineWarning":false,"position":140,"left":905,"right":924},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":925,"text":"+\t\t\t\t}","html":"+\t\t\t\t}","displayNoNewLineWarning":false,"position":141,"left":905,"right":925},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":926,"text":" \t\t\t}","html":" \t\t\t}","displayNoNewLineWarning":false,"position":142,"left":906,"right":926},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":927,"text":" \t\t}","html":" \t\t}","displayNoNewLineWarning":false,"position":143,"left":907,"right":927},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":928,"text":" \t\telse","html":" \t\t\u003cspan class=pl-k\u003eelse\u003c/span\u003e","displayNoNewLineWarning":false,"position":144,"left":908,"right":928},{"stylingDirective":null,"type":"HUNK","blobLineNumber":934,"text":"@@ -915,8 +935,8 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","html":"@@ -915,8 +935,8 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","displayNoNewLineWarning":false,"position":145,"left":914,"right":934},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":935,"text":" \t\t\tAssert(slot-\u003etts_nvalid \u003e= numTransInputs);","html":" \t\t\t\u003cspan class=pl-en\u003eAssert\u003c/span\u003e(\u003cspan class=pl-s1\u003eslot\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etts_nvalid\u003c/span\u003e \u0026gt;= \u003cspan class=pl-s1\u003enumTransInputs\u003c/span\u003e);","displayNoNewLineWarning":false,"position":146,"left":915,"right":935},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":936,"text":" \t\t\tfor (i = 0; i \u003c numTransInputs; i++)","html":" \t\t\t\u003cspan class=pl-k\u003efor\u003c/span\u003e (\u003cspan class=pl-s1\u003ei\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e; \u003cspan class=pl-s1\u003ei\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026lt;\u003c/span\u003e \u003cspan class=pl-s1\u003enumTransInputs\u003c/span\u003e; \u003cspan class=pl-s1\u003ei\u003c/span\u003e\u003cspan class=pl-c1\u003e++\u003c/span\u003e)","displayNoNewLineWarning":false,"position":147,"left":916,"right":936},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":937,"text":" \t\t\t{","html":" \t\t\t{","displayNoNewLineWarning":false,"position":148,"left":917,"right":937},{"stylingDirective":null,"type":"DELETION","blobLineNumber":918,"text":"-\t\t\t\tfcinfo-\u003earg[i + 1] = slot-\u003etts_values[i];","html":"-\t\t\t\t\u003cspan class=\"pl-s1\"\u003efcinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003earg\u003c/span\u003e[\u003cspan class=\"pl-s1\"\u003ei\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_values\u003c/span\u003e[\u003cspan class=\"pl-s1\"\u003ei\u003c/span\u003e];","displayNoNewLineWarning":false,"position":149,"left":918,"right":937},{"stylingDirective":null,"type":"DELETION","blobLineNumber":919,"text":"-\t\t\t\tfcinfo-\u003eargnull[i + 1] = slot-\u003etts_isnull[i];","html":"-\t\t\t\t\u003cspan class=\"pl-s1\"\u003efcinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eargnull\u003c/span\u003e[\u003cspan class=\"pl-s1\"\u003ei\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-s1\"\u003ei\u003c/span\u003e];","displayNoNewLineWarning":false,"position":150,"left":919,"right":937},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":938,"text":"+\t\t\t\tfcinfo-\u003earg[i + 1] = slot-\u003etts_values[i + inputoff];","html":"+\t\t\t\t\u003cspan class=\"pl-s1\"\u003efcinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003earg\u003c/span\u003e[\u003cspan class=\"pl-s1\"\u003ei\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_values\u003c/span\u003e[\u003cspan class=\"pl-s1\"\u003ei\u003c/span\u003e\u003cspan class=\"x x-first\"\u003e \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e+\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"pl-s1 x x-last\"\u003einputoff\u003c/span\u003e];","displayNoNewLineWarning":false,"position":151,"left":919,"right":938},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":939,"text":"+\t\t\t\tfcinfo-\u003eargnull[i + 1] = slot-\u003etts_isnull[i + inputoff];","html":"+\t\t\t\t\u003cspan class=\"pl-s1\"\u003efcinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eargnull\u003c/span\u003e[\u003cspan class=\"pl-s1\"\u003ei\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-s1\"\u003ei\u003c/span\u003e\u003cspan class=\"x x-first\"\u003e \u003c/span\u003e\u003cspan class=\"pl-c1 x\"\u003e+\u003c/span\u003e\u003cspan class=\"x\"\u003e \u003c/span\u003e\u003cspan class=\"pl-s1 x x-last\"\u003einputoff\u003c/span\u003e];","displayNoNewLineWarning":false,"position":152,"left":919,"right":939},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":940,"text":" \t\t\t}","html":" \t\t\t}","displayNoNewLineWarning":false,"position":153,"left":920,"right":940},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":941,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":154,"left":921,"right":941},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":942,"text":" \t\t\tfor (setno = 0; setno \u003c numGroupingSets; setno++)","html":" \t\t\t\u003cspan class=pl-k\u003efor\u003c/span\u003e (\u003cspan class=pl-s1\u003esetno\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e; \u003cspan class=pl-s1\u003esetno\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026lt;\u003c/span\u003e \u003cspan class=pl-s1\u003enumGroupingSets\u003c/span\u003e; \u003cspan class=pl-s1\u003esetno\u003c/span\u003e\u003cspan class=pl-c1\u003e++\u003c/span\u003e)","displayNoNewLineWarning":false,"position":155,"left":922,"right":942},{"stylingDirective":null,"type":"HUNK","blobLineNumber":962,"text":"@@ -943,20 +963,24 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","html":"@@ -943,20 +963,24 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","displayNoNewLineWarning":false,"position":156,"left":942,"right":962},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":963,"text":" {","html":" {","displayNoNewLineWarning":false,"position":157,"left":943,"right":963},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":964,"text":" \tint\t\t\ttransno;","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003etransno\u003c/span\u003e;","displayNoNewLineWarning":false,"position":158,"left":944,"right":964},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":965,"text":" \tint\t\t\tnumTrans = aggstate-\u003enumtrans;","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003enumTrans\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumtrans\u003c/span\u003e;","displayNoNewLineWarning":false,"position":159,"left":945,"right":965},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":966,"text":"+\tTupleTableSlot *slot = NULL;","html":"+\t\u003cspan class=pl-smi\u003eTupleTableSlot\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003eslot\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003eNULL\u003c/span\u003e;","displayNoNewLineWarning":false,"position":160,"left":945,"right":966},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":967,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":161,"left":946,"right":967},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":968,"text":" \t/* combine not supported with grouping sets */","html":" \t\u003cspan class=pl-c\u003e/* combine not supported with grouping sets */\u003c/span\u003e","displayNoNewLineWarning":false,"position":162,"left":947,"right":968},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":969,"text":" \tAssert(aggstate-\u003ephase-\u003enumsets == 0);","html":" \t\u003cspan class=pl-en\u003eAssert\u003c/span\u003e(\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003ephase\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumsets\u003c/span\u003e \u003cs 8000 pan class=pl-c1\u003e==\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e);","displayNoNewLineWarning":false,"position":163,"left":948,"right":969},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":970,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":164,"left":949,"right":970},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":971,"text":"+\t/* compute input for all aggregates */","html":"+\t\u003cspan class=pl-c\u003e/* compute input for all aggregates */\u003c/span\u003e","displayNoNewLineWarning":false,"position":165,"left":949,"right":971},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":972,"text":"+\tif (aggstate-\u003eevalproj)","html":"+\t\u003cspan class=pl-k\u003eif\u003c/span\u003e (\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalproj\u003c/span\u003e)","displayNoNewLineWarning":false,"position":166,"left":949,"right":972},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":973,"text":"+\t\tslot = ExecProject(aggstate-\u003eevalproj, NULL);","html":"+\t\t\u003cspan class=pl-s1\u003eslot\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecProject\u003c/span\u003e(\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalproj\u003c/span\u003e, \u003cspan class=pl-c1\u003eNULL\u003c/span\u003e);","displayNoNewLineWarning":false,"position":167,"left":949,"right":973},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":974,"text":"+","html":"+","displayNoNewLineWarning":false,"position":168,"left":949,"right":974},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":975,"text":" \tfor (transno = 0; transno \u003c numTrans; transno++)","html":" \t\u003cspan class=pl-k\u003efor\u003c/span\u003e (\u003cspan class=pl-s1\u003etransno\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e; \u003cspan class=pl-s1\u003etransno\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026lt;\u003c/span\u003e \u003cspan class=pl-s1\u003enumTrans\u003c/span\u003e; \u003cspan class=pl-s1\u003etransno\u003c/span\u003e\u003cspan class=pl-c1\u003e++\u003c/span\u003e)","displayNoNewLineWarning":false,"position":169,"left":950,"right":975},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":976,"text":" \t{","html":" \t{","displayNoNewLineWarning":false,"position":170,"left":951,"right":976},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":977,"text":" \t\tAggStatePerTrans pertrans = \u0026aggstate-\u003epertrans[transno];","html":" \t\t\u003cspan class=pl-smi\u003eAggStatePerTrans\u003c/span\u003e \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026amp;\u003c/span\u003e\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003epertrans\u003c/span\u003e[\u003cspan class=pl-s1\u003etransno\u003c/span\u003e];","displayNoNewLineWarning":false,"position":171,"left":952,"right":977},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":978,"text":" \t\tAggStatePerGroup pergroupstate = \u0026pergroup[transno];","html":" \t\t\u003cspan class=pl-smi\u003eAggStatePerGroup\u003c/span\u003e \u003cspan class=pl-s1\u003epergroupstate\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026amp;\u003c/span\u003e\u003cspan class=pl-s1\u003epergroup\u003c/span\u003e[\u003cspan class=pl-s1\u003etransno\u003c/span\u003e];","displayNoNewLineWarning":false,"position":172,"left":953,"right":978},{"stylingDirective":null,"type":"DELETION","blobLineNumber":954,"text":"-\t\tTupleTableSlot *slot;","html":"-\t\t\u003cspan class=pl-smi\u003eTupleTableSlot\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003eslot\u003c/span\u003e;","displayNoNewLineWarning":false,"position":173,"left":954,"right":978},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":979,"text":" \t\tFunctionCallInfo fcinfo = \u0026pertrans-\u003etransfn_fcinfo;","html":" \t\t\u003cspan class=pl-smi\u003eFunctionCallInfo\u003c/span\u003e \u003cspan class=pl-s1\u003efcinfo\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026amp;\u003c/span\u003e\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etransfn_fcinfo\u003c/span\u003e;","displayNoNewLineWarning":false,"position":174,"left":955,"right":979},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":980,"text":"+\t\tint\t\t\tinputoff = pertrans-\u003einputoff;","html":"+\t\t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003einputoff\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003einputoff\u003c/span\u003e;","displayNoNewLineWarning":false,"position":175,"left":955,"right":980},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":981,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":176,"left":956,"right":981},{"stylingDirective":null,"type":"DELETION","blobLineNumber":957,"text":"-\t\t/* Evaluate the current input expressions for this aggregate */","html":"-\t\t\u003cspan class=pl-c\u003e/* Evaluate the current input expressions for this aggregate */\u003c/span\u003e","displayNoNewLineWarning":false,"position":177,"left":957,"right":981},{"stylingDirective":null,"type":"DELETION","blobLineNumber":958,"text":"-\t\tslot = ExecProject(pertrans-\u003eevalproj, NULL);","html":"-\t\t\u003cspan class=pl-s1\u003eslot\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecProject\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalproj\u003c/span\u003e, \u003cspan class=pl-c1\u003eNULL\u003c/span\u003e);","displayNoNewLineWarning":false,"position":178,"left":958,"right":981},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":982,"text":" \t\tAssert(slot-\u003etts_nvalid \u003e= 1);","html":" \t\t\u003cspan class=pl-en\u003eAssert\u003c/span\u003e(\u003cspan class=pl-s1\u003eslot\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etts_nvalid\u003c/span\u003e \u0026gt;= \u003cspan class=pl-c1\u003e1\u003c/span\u003e);","displayNoNewLineWarning":false,"position":179,"left":959,"right":982},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":983,"text":"+\t\tAssert(slot-\u003etts_nvalid + inputoff \u003e= 1);","html":"+\t\t\u003cspan class=pl-en\u003eAssert\u003c/span\u003e(\u003cspan class=pl-s1\u003eslot\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etts_nvalid\u003c/span\u003e \u003cspan class=pl-c1\u003e+\u003c/span\u003e \u003cspan class=pl-s1\u003einputoff\u003c/span\u003e \u0026gt;= \u003cspan class=pl-c1\u003e1\u003c/span\u003e);","displayNoNewLineWarning":false,"position":180,"left":959,"right":983},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":984,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":181,"left":960,"right":984},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":985,"text":" \t\t/*","html":" \t\t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":182,"left":961,"right":985},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":986,"text":" \t\t * deserialfn_oid will be set if we must deserialize the input state","html":" \u003cspan class=pl-c\u003e\t\t * deserialfn_oid will be set if we must deserialize the input state\u003c/span\u003e","displayNoNewLineWarning":false,"position":183,"left":962,"right":986},{"stylingDirective":null,"type":"HUNK","blobLineNumber":988,"text":"@@ -965,18 +989,18 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","html":"@@ -965,18 +989,18 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","displayNoNewLineWarning":false,"position":184,"left":964,"right":988},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":989,"text":" \t\tif (OidIsValid(pertrans-\u003edeserialfn_oid))","html":" \t\t\u003cspan class=pl-k\u003eif\u003c/span\u003e (\u003cspan class=pl-en\u003eOidIsValid\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003edeserialfn_oid\u003c/span\u003e))","displayNoNewLineWarning":false,"position":185,"left":965,"right":989},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":990,"text":" \t\t{","html":" \t\t{","displayNoNewLineWarning":false,"position":186,"left":966,"right":990},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":991,"text":" \t\t\t/* Don't call a strict deserialization function with NULL input */","html":" \t\t\t\u003cspan class=pl-c\u003e/* Don\u0026#39;t call a strict deserialization function with NULL input */\u003c/span\u003e","displayNoNewLineWarning":false,"position":187,"left":967,"right":991},{"stylingDirective":null,"type":"DELETION","blobLineNumber":968,"text":"-\t\t\tif (pertrans-\u003edeserialfn.fn_strict \u0026\u0026 slot-\u003etts_isnull[0])","html":"-\t\t\t\u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e (\u003cspan class=\"pl-s1\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003edeserialfn\u003c/span\u003e.\u003cspan class=\"pl-c1\"\u003efn_strict\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-c1 x x-first x-last\"\u003e0\u003c/span\u003e])","displayNoNewLineWarning":false,"position":188,"left":968,"right":991},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":992,"text":"+\t\t\tif (pertrans-\u003edeserialfn.fn_strict \u0026\u0026 slot-\u003etts_isnull[inputoff])","html":"+\t\t\t\u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e (\u003cspan class=\"pl-s1\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003edeserialfn\u003c/span\u003e.\u003cspan class=\"pl-c1\"\u003efn_strict\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-s1 x x-first x-last\"\u003einputoff\u003c/span\u003e])","displayNoNewLineWarning":false,"position":189,"left":968,"right":992},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":993,"text":" \t\t\t{","html":" \t\t\t{","displayNoNewLineWarning":false,"position":190,"left":969,"right":993},{"stylingDirective":null,"type":"DELETION","blobLineNumber":970,"text":"-\t\t\t\tfcinfo-\u003earg[1] = slot-\u003etts_values[0];","html":"-\t\t\t\t\u003cspan class=\"pl-s1\"\u003efcinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003earg\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_values\u003c/span\u003e[\u003cspan class=\"pl-c1 x x-first x-last\"\u003e0\u003c/span\u003e];","displayNoNewLineWarning":false,"position":191,"left":970,"right":993},{"stylingDirective":null,"type":"DELETION","blobLineNumber":971,"text":"-\t\t\t\tfcinfo-\u003eargnull[1] = slot-\u003etts_isnull[0];","html":"-\t\t\t\t\u003cspan class=\"pl-s1\"\u003efcinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eargnull\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-c1 x x-first x-last\"\u003e0\u003c/span\u003e];","displayNoNewLineWarning":false,"position":192,"left":971,"right":993},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":994,"text":"+\t\t\t\tfcinfo-\u003earg[1] = slot-\u003etts_values[inputoff];","html":"+\t\t\t\t\u003cspan class=\"pl-s1\"\u003efcinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003earg\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_values\u003c/span\u003e[\u003cspan class=\"pl-s1 x x-first x-last\"\u003einputoff\u003c/span\u003e];","displayNoNewLineWarning":false,"position":193,"left":971,"right":994},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":995,"text":"+\t\t\t\tfcinfo-\u003eargnull[1] = slot-\u003etts_isnull[inputoff];","html":"+\t\t\t\t\u003cspan class=\"pl-s1\"\u003efcinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eargnull\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-s1 x x-first x-last\"\u003einputoff\u003c/span\u003e];","displayNoNewLineWarning":false,"position":194,"left":971,"right":995},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":996,"text":" \t\t\t}","html":" \t\t\t}","displayNoNewLineWarning":false,"position":195,"left":972,"right":996},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":997,"text":" \t\t\telse","html":" \t\t\t\u003cspan class=pl-k\u003eelse\u003c/span\u003e","displayNoNewLineWarning":false,"position":196,"left":973,"right":997},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":998,"text":" \t\t\t{","html":" \t\t\t{","displayNoNewLineWarning":false,"position":197,"left":974,"right":998},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":999,"text":" \t\t\t\tFunctionCallInfo dsinfo = \u0026pertrans-\u003edeserialfn_fcinfo;","html":" \t\t\t\t\u003cspan class=pl-smi\u003eFunctionCallInfo\u003c/span\u003e \u003cspan class=pl-s1\u003edsinfo\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026amp;\u003c/span\u003e\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003edeserialfn_fcinfo\u003c/span\u003e;","displayNoNewLineWarning":false,"position":198,"left":975,"right":999},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1000,"text":" \t\t\t\tMemoryContext oldContext;","html":" \t\t\t\t\u003cspan class=pl-smi\u003eMemoryContext\u003c/span\u003e \u003cspan class=pl-s1\u003eoldContext\u003c/span\u003e;","displayNoNewLineWarning":false,"position":199,"left":976,"right":1000},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1001,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":200,"left":977,"right":1001},{"stylingDirective":null,"type":"DELETION","blobLineNumber":978,"text":"-\t\t\t\tdsinfo-\u003earg[0] = slot-\u003etts_values[0];","html":"-\t\t\t\t\u003cspan class=\"pl-s1\"\u003edsinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003earg\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_values\u003c/span\u003e[\u003cspan class=\"pl-c1 x x-first x-last\"\u003e0\u003c/span\u003e];","displayNoNewLineWarning":false,"position":201,"left":978,"right":1001},{"stylingDirective":null,"type":"DELETION","blobLineNumber":979,"text":"-\t\t\t\tdsinfo-\u003eargnull[0] = slot-\u003etts_isnull[0];","html":"-\t\t\t\t\u003cspan class=\"pl-s1\"\u003edsinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eargnull\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-c1 x x-first x-last\"\u003e0\u003c/span\u003e];","displayNoNewLineWarning":false,"position":202,"left":979,"right":1001},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":1002,"text":"+\t\t\t\tdsinfo-\u003earg[0] = slot-\u003etts_values[inputoff];","html":"+\t\t\t\t\u003cspan class=\"pl-s1\"\u003edsinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003earg\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_values\u003c/span\u003e[\u003cspan class=\"pl-s1 x x-first x-last\"\u003einputoff\u003c/span\u003e];","displayNoNewLineWarning":false,"position":203,"left":979,"right":1002},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":1003,"text":"+\t\t\t\tdsinfo-\u003eargnull[0] = slot-\u003etts_isnull[inputoff];","html":"+\t\t\t\t\u003cspan class=\"pl-s1\"\u003edsinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eargnull\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-s1 x x-first x-last\"\u003einputoff\u003c/span\u003e];","displayNoNewLineWarning":false,"position":204,"left":979,"right":1003},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1004,"text":" \t\t\t\t/* Dummy second argument for type-safety reasons */","html":" \t\t\t\t\u003cspan class=pl-c\u003e/* Dummy second argument for type-safety reasons */\u003c/span\u003e","displayNoNewLineWarning":false,"position":205,"left":980,"right":1004},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1005,"text":" \t\t\t\tdsinfo-\u003earg[1] = PointerGetDatum(NULL);","html":" \t\t\t\t\u003cspan class=pl-s1\u003edsinfo\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003earg\u003c/span\u003e[\u003cspan class=pl-c1\u003e1\u003c/span\u003e] \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003ePointerGetDatum\u003c/span\u003e(\u003cspan class=pl-c1\u003eNULL\u003c/span\u003e);","displayNoNewLineWarning":false,"position":206,"left":981,"right":1005},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1006,"text":" \t\t\t\tdsinfo-\u003eargnull[1] = false;","html":" \t\t\t\t\u003cspan class=pl-s1\u003edsinfo\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eargnull\u003c/span\u003e[\u003cspan class=pl-c1\u003e1\u003c/span\u003e] \u003cspan class=pl-c1\u003e=\u003c/span\u003e false;","displayNoNewLineWarning":false,"position":207,"left":982,"right":1006},{"stylingDirective":null,"type":"HUNK","blobLineNumber":1018,"text":"@@ -995,8 +1019,8 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","html":"@@ -995,8 +1019,8 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)","displayNoNewLineWarning":false,"position":208,"left":994,"right":1018},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1019,"text":" \t\t}","html":" \t\t}","displayNoNewLineWarning":false,"position":209,"left":995,"right":1019},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1020,"text":" \t\telse","html":" \t\t\u003cspan class=pl-k\u003eelse\u003c/span\u003e","displayNoNewLineWarning":false,"position":210,"left":996,"right":1020},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1021,"text":" \t\t{","html":" \t\t{","displayNoNewLineWarning":false,"position":211,"left":997,"right":1021},{"stylingDirective":null,"type":"DELETION","blobLineNumber":998,"text":"-\t\t\tfcinfo-\u003earg[1] = slot-\u003etts_values[0];","html":"-\t\t\t\u003cspan class=\"pl-s1\"\u003efcinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003earg\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_values\u003c/span\u003e[\u003cspan class=\"pl-c1 x x-first x-last\"\u003e0\u003c/span\u003e];","displayNoNewLineWarning":false,"position":212,"left":998,"right":1021},{"stylingDirective":null,"type":"DELETION","blobLineNumber":999,"text":"-\t\t\tfcinfo-\u003eargnull[1] = slot-\u003etts_isnull[0];","html":"-\t\t\t\u003cspan class=\"pl-s1\"\u003efcinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eargnull\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-c1 x x-first x-last\"\u003e0\u003c/span\u003e];","displayNoNewLineWarning":false,"position":213,"left":999,"right":1021},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":1022,"text":"+\t\t\tfcinfo-\u003earg[1] = slot-\u003etts_values[inputoff];","html":"+\t\t\t\u003cspan class=\"pl-s1\"\u003efcinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003earg\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_values\u003c/span\u003e[\u003cspan class=\"pl-s1 x x-first x-last\"\u003einputoff\u003c/span\u003e];","displayNoNewLineWarning":false,"position":214,"left":999,"right":1022},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":1023,"text":"+\t\t\tfcinfo-\u003eargnull[1] = slot-\u003etts_isnull[inputoff];","html":"+\t\t\t\u003cspan class=\"pl-s1\"\u003efcinfo\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003eargnull\u003c/span\u003e[\u003cspan class=\"pl-c1\"\u003e1\u003c/span\u003e] \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003eslot\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003etts_isnull\u003c/span\u003e[\u003cspan class=\"pl-s1 x x-first x-last\"\u003einputoff\u003c/span\u003e];","displayNoNewLineWarning":false,"position":215,"left":999,"right":1023},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1024,"text":" \t\t}","html":" \t\t}","displayNoNewLineWarning":false,"position":216,"left":1000,"right":1024},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1025,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":217,"left":1001,"right":1025},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1026,"text":" \t\tadvance_combine_function(aggstate, pertrans, pergroupstate);","html":" \t\t\u003cspan class=pl-en\u003eadvance_combine_function\u003c/span\u003e(\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e, \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e, \u003cspan class=pl-s1\u003epergroupstate\u003c/span\u003e);","displayNoNewLineWarning":false,"position":218,"left":1002,"right":1026},{"stylingDirective":null,"type":"HUNK","blobLineNumber":1256,"text":"@@ -1233,7 +1257,7 @@ process_ordered_aggregate_multi(AggState *aggstate,","html":"@@ -1233,7 +1257,7 @@ process_ordered_aggregate_multi(AggState *aggstate,","displayNoNewLineWarning":false,"position":219,"left":1232,"right":1256},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1257,"text":" {","html":" {","displayNoNewLineWarning":false,"position":220,"left":1233,"right":1257},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1258,"text":" \tMemoryContext workcontext = aggstate-\u003etmpcontext-\u003eecxt_per_tuple_memory;","html":" \t\u003cspan class=pl-smi\u003eMemoryContext\u003c/span\u003e \u003cspan class=pl-s1\u003eworkcontext\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etmpcontext\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eecxt_per_tuple_memory\u003c/span\u003e;","displayNoNewLineWarning":false,"position":221,"left":1234,"right":1258},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1259,"text":" \tFunctionCallInfo fcinfo = \u0026pertrans-\u003etransfn_fcinfo;","html":" \t\u003cspan class=pl-smi\u003eFunctionCallInfo\u003c/span\u003e \u003cspan class=pl-s1\u003efcinfo\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026amp;\u003c/span\u003e\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etransfn_fcinfo\u003c/span\u003e;","displayNoNewLineWarning":false,"position":222,"left":1235,"right":1259},{"stylingDirective":null,"type":"DELETION","blobLineNumber":1236,"text":"-\tTupleTableSlot *slot1 = pertrans-\u003eevalslot;","html":"-\t\u003cspan class=\"pl-smi\"\u003eTupleTableSlot\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eslot1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x x-first x-last\"\u003eevalslot\u003c/span\u003e;","displayNoNewLineWarning":false,"position":223,"left":1236,"right":1259},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":1260,"text":"+\tTupleTableSlot *slot1 = pertrans-\u003esortslot;","html":"+\t\u003cspan class=\"pl-smi\"\u003eTupleTableSlot\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e*\u003c/span\u003e\u003cspan class=\"pl-s1\"\u003eslot1\u003c/span\u003e \u003cspan class=\"pl-c1\"\u003e=\u003c/span\u003e \u003cspan class=\"pl-s1\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x x-first x-last\"\u003esortslot\u003c/span\u003e;","displayNoNewLineWarning":false,"position":224,"left":1236,"right":1260},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1261,"text":" \tTupleTableSlot *slot2 = pertrans-\u003euniqslot;","html":" \t\u003cspan class=pl-smi\u003eTupleTableSlot\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003eslot2\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003euniqslot\u003c/span\u003e;","displayNoNewLineWarning":false,"position":225,"left":1237,"right":1261},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1262,"text":" \tint\t\t\tnumTransInputs = pertrans-\u003enumTransInputs;","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003enumTransInputs\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumTransInputs\u003c/span\u003e;","displayNoNewLineWarning":false,"position":226,"left":1238,"right":1262},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1263,"text":" \tint\t\t\tnumDistinctCols = pertrans-\u003enumDistinctCols;","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003enumDistinctCols\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumDistinctCols\u003c/span\u003e;","displayNoNewLineWarning":false,"position":227,"left":1239,"right":1263},{"stylingDirective":null,"type":"HUNK","blobLineNumber":2366,"text":"@@ -2343,10 +2367,12 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)","html":"@@ -2343,10 +2367,12 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)","displayNoNewLineWarning":false,"position":228,"left":2342,"right":2366},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2367,"text":" \t\t\t\ttransno,","html":" \t\t\t\t\u003cspan class=pl-s1\u003etransno\u003c/span\u003e,","displayNoNewLineWarning":false,"position":229,"left":2343,"right":2367},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2368,"text":" \t\t\t\taggno;","html":" \t\t\t\t\u003cspan class=pl-s1\u003eaggno\u003c/span\u003e;","displayNoNewLineWarning":false,"position":230,"left":2344,"right":2368},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2369,"text":" \tint\t\t\tphase;","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003ephase\u003c/span\u003e;","displayNoNewLineWarning":false,"position":231,"left":2345,"right":2369},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2370,"text":"+\tList\t *combined_inputeval;","html":"+\t\u003cspan class=pl-smi\u003eList\u003c/span\u003e\t \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003ecombined_inputeval\u003c/span\u003e;","displayNoNewLineWarning":false,"position":232,"left":2345,"right":2370},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2371,"text":" \tListCell *l;","html":" \t\u003cspan class=pl-smi\u003eListCell\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003el\u003c/span\u003e;","displayNoNewLineWarning":false,"position":233,"left":2346,"right":2371},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2372,"text":" \tBitmapset *all_grouped_cols = NULL;","html":" \t\u003cspan class=pl-smi\u003eBitmapset\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003eall_grouped_cols\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003eNULL\u003c/span\u003e;","displayNoNewLineWarning":false,"position":234,"left":2347,"right":2372},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2373,"text":" \tint\t\t\tnumGroupingSets = 1;","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003enumGroupingSets\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e1\u003c/span\u003e;","displayNoNewLineWarning":false,"position":235,"left":2348,"right":2373},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2374,"text":" \tint\t\t\tnumPhases;","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003enumPhases\u003c/span\u003e;","displayNoNewLineWarning":false,"position":236,"left":2349,"right":2374},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2375,"text":"+\tint\t\t\tcolumn_offset;","html":"+\t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003e 8000 column_offset\u003c/span\u003e;","displayNoNewLineWarning":false,"position":237,"left":2349,"right":2375},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2376,"text":" \tint\t\t\ti = 0;","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003ei\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e;","displayNoNewLineWarning":false,"position":238,"left":2350,"right":2376},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2377,"text":" \tint\t\t\tj = 0;","html":" \t\u003cspan class=pl-smi\u003eint\u003c/span\u003e\t\t\t\u003cspan class=pl-s1\u003ej\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e;","displayNoNewLineWarning":false,"position":239,"left":2351,"right":2377},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2378,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":240,"left":2352,"right":2378},{"stylingDirective":null,"type":"HUNK","blobLineNumber":2953,"text":"@@ -2928,6 +2954,53 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)","html":"@@ -2928,6 +2954,53 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)","displayNoNewLineWarning":false,"position":241,"left":2927,"right":2953},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2954,"text":" \taggstate-\u003enumaggs = aggno + 1;","html":" \t\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumaggs\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003eaggno\u003c/span\u003e \u003cspan class=pl-c1\u003e+\u003c/span\u003e \u003cspan class=pl-c1\u003e1\u003c/span\u003e;","displayNoNewLineWarning":false,"position":242,"left":2928,"right":2954},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2955,"text":" \taggstate-\u003enumtrans = transno + 1;","html":" \t\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumtrans\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003etransno\u003c/span\u003e \u003cspan class=pl-c1\u003e+\u003c/span\u003e \u003cspan class=pl-c1\u003e1\u003c/span\u003e;","displayNoNewLineWarning":false,"position":243,"left":2929,"right":2955},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":2956,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":244,"left":2930,"right":2956},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2957,"text":"+\t/*","html":"+\t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":245,"left":2930,"right":2957},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2958,"text":"+\t * Build a single projection computing the aggregate arguments for all","html":"+\u003cspan class=pl-c\u003e\t * Build a single projection computing the aggregate arguments for all\u003c/span\u003e","displayNoNewLineWarning":false,"position":246,"left":2930,"right":2958},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2959,"text":"+\t * aggregates at once, that's considerably faster than doing it separately","html":"+\u003cspan class=pl-c\u003e\t * aggregates at once, that\u0026#39;s considerably faster than doing it separately\u003c/span\u003e","displayNoNewLineWarning":false,"position":247,"left":2930,"right":2959},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2960,"text":"+\t * for each.","html":"+\u003cspan class=pl-c\u003e\t * for each.\u003c/span\u003e","displayNoNewLineWarning":false,"position":248,"left":2930,"right":2960},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2961,"text":"+\t *","html":"+\u003cspan class=pl-c\u003e\t *\u003c/span\u003e","displayNoNewLineWarning":false,"position":249,"left":2930,"right":2961},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2962,"text":"+\t * First create a targetlist combining the targetlist of all the","html":"+\u003cspan class=pl-c\u003e\t * First create a targetlist combining the targetlist of all the\u003c/span\u003e","displayNoNewLineWarning":false,"position":250,"left":2930,"right":2962},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2963,"text":"+\t * transitions.","html":"+\u003cspan class=pl-c\u003e\t * transitions.\u003c/span\u003e","displayNoNewLineWarning":false,"position":251,"left":2930,"right":2963},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2964,"text":"+\t */","html":"+\u003cspan class=pl-c\u003e\t */\u003c/span\u003e","displayNoNewLineWarning":false,"position":252,"left":2930,"right":2964},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2965,"text":"+\tcombined_inputeval = NIL;","html":"+\t\u003cspan class=pl-s1\u003ecombined_inputeval\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003eNIL\u003c/span\u003e;","displayNoNewLineWarning":false,"position":253,"left":2930,"right":2965},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2966,"text":"+\tcolumn_offset = 0;","html":"+\t\u003cspan class=pl-s1\u003ecolumn_offset\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e;","displayNoNewLineWarning":false,"position":254,"left":2930,"right":2966},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2967,"text":"+\tfor (transno = 0; transno \u003c aggstate-\u003enumtrans; transno++)","html":"+\t\u003cspan class=pl-k\u003efor\u003c/span\u003e (\u003cspan class=pl-s1\u003etransno\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e; \u003cspan class=pl-s1\u003etransno\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026lt;\u003c/span\u003e \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumtrans\u003c/span\u003e; \u003cspan class=pl-s1\u003etransno\u003c/span\u003e\u003cspan class=pl-c1\u003e++\u003c/span\u003e)","displayNoNewLineWarning":false,"position":255,"left":2930,"right":2967},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2968,"text":"+\t{","html":"+\t{","displayNoNewLineWarning":false,"position":256,"left":2930,"right":2968},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2969,"text":"+\t\tAggStatePerTrans pertrans = \u0026pertransstates[transno];","html":"+\t\t\u003cspan class=pl-smi\u003eAggStatePerTrans\u003c/span\u003e \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026amp;\u003c/span\u003e\u003cspan class=pl-s1\u003epertransstates\u003c/span\u003e[\u003cspan class=pl-s1\u003etransno\u003c/span\u003e];","displayNoNewLineWarning":false,"position":257,"left":2930,"right":2969},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2970,"text":"+\t\tListCell *arg;","html":"+\t\t\u003cspan class=pl-smi\u003eListCell\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003earg\u003c/span\u003e;","displayNoNewLineWarning":false,"position":258,"left":2930,"right":2970},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2971,"text":"+","html":"+","displayNoNewLineWarning":false,"position":259,"left":2930,"right":2971},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2972,"text":"+\t\tpertrans-\u003einputoff = column_offset;","html":"+\t\t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003einputoff\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003ecolumn_offset\u003c/span\u003e;","displayNoNewLineWarning":false,"position":260,"left":2930,"right":2972},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2973,"text":"+","html":"+","displayNoNewLineWarning":false,"position":261,"left":2930,"right":2973},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2974,"text":"+\t\t/*","html":"+\t\t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":262,"left":2930,"right":2974},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2975,"text":"+\t\t * Adjust resno in a copied target entries, to point into the combined","html":"+\u003cspan class=pl-c\u003e\t\t * Adjust resno in a copied target entries, to point into the combined\u003c/span\u003e","displayNoNewLineWarning":false,"position":263,"left":2930,"right":2975},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2976,"text":"+\t\t * slot.","html":"+\u003cspan class=pl-c\u003e\t\t * slot.\u003c/span\u003e","displayNoNewLineWarning":false,"position":264,"left":2930,"right":2976},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2977,"text":"+\t\t */","html":"+\u003cspan class=pl-c\u003e\t\t */\u003c/span\u003e","displayNoNewLineWarning":false,"position":265,"left":2930,"right":2977},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2978,"text":"+\t\tforeach(arg, pertrans-\u003eaggref-\u003eargs)","html":"+\t\t\u003cspan class=pl-en\u003eforeach\u003c/span\u003e(\u003cspan class=pl-s1\u003earg\u003c/span\u003e, \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eaggref\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eargs\u003c/span\u003e)","displayNoNewLineWarning":false,"position":266,"left":2930,"right":2978},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2979,"text":"+\t\t{","html":"+\t\t{","displayNoNewLineWarning":false,"position":267,"left":2930,"right":2979},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2980,"text":"+\t\t\tTargetEntry *source_tle = (TargetEntry *) lfirst(arg);","html":"+\t\t\t\u003cspan class=pl-smi\u003eTargetEntry\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003esource_tle\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e (\u003cspan class=pl-smi\u003eTargetEntry\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e) \u003cspan class=pl-en\u003elfirst\u003c/span\u003e(\u003cspan class=pl-s1\u003earg\u003c/span\u003e);","displayNoNewLineWarning":false,"position":268,"left":2930,"right":2980},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2981,"text":"+\t\t\tTargetEntry *tle;","html":"+\t\t\t\u003cspan class=pl-smi\u003eTargetEntry\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-s1\u003etle\u003c/span\u003e;","displayNoNewLineWarning":false,"position":269,"left":2930,"right":2981},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2982,"text":"+","html":"+","displayNoNewLineWarning":false,"position":270,"left":2930,"right":2982},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2983,"text":"+\t\t\tAssert(IsA(source_tle, TargetEntry));","html":"+\t\t\t\u003cspan class=pl-en\u003eAssert\u003c/span\u003e(\u003cspan class=pl-en\u003eIsA\u003c/span\u003e(\u003cspan class=pl-s1\u003esource_tle\u003c/span\u003e, \u003cspan class=pl-s1\u003eTargetEntry\u003c/span\u003e));","displayNoNewLineWarning":false,"position":271,"left":2930,"right":2983},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2984,"text":"+\t\t\ttle = flatCopyTargetEntry(source_tle);","html":"+\t\t\t\u003cspan class=pl-s1\u003etle\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eflatCopyTargetEntry\u003c/span\u003e(\u003cspan class=pl-s1\u003esource_tle\u003c/span\u003e);","displayNoNewLineWarning":false,"position":272,"left":2930,"right":2984},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2985,"text":"+\t\t\ttle-\u003eresno += column_offset;","html":"+\t\t\t\u003cspan class=pl-s1\u003etle\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eresno\u003c/span\u003e \u003cspan class=pl-c1\u003e+=\u003c/span\u003e \u003cspan class=pl-s1\u003ecolumn_offset\u003c/span\u003e;","displayNoNewLineWarning":false,"position":273,"left":2930,"right":2985},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2986,"text":"+","html":"+","displayNoNewLineWarning":false,"position":274,"left":2930,"right":2986},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2987,"text":"+\t\t\tcombined_inputeval = lappend(combined_inputeval, tle);","html":"+\t\t\t\u003cspan class=pl-s1\u003ecombined_inputeval\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003elappend\u003c/span\u003e(\u003cspan class=pl-s1\u003ecombined_inputeval\u003c/span\u003e, \u003cspan class=pl-s1\u003etle\u003c/span\u003e);","displayNoNewLineWarning":false,"position":275,"left":2930,"right":2987},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2988,"text":"+\t\t}","html":"+\t\t}","displayNoNewLineWarning":false,"position":276,"left":2930,"right":2988},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2989,"text":"+","html":"+","displayNoNewLineWarning":false,"position":277,"left":2930,"right":2989},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2990,"text":"+\t\tcolumn_offset += list_length(pertrans-\u003eaggref-\u003eargs);","html":"+\t\t\u003cspan class=pl-s1\u003ecolumn_offset\u003c/span\u003e \u003cspan class=pl-c1\u003e+=\u003c/span\u003e \u003cspan class=pl-en\u003elist_length\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eaggref\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eargs\u003c/span\u003e);","displayNoNewLineWarning":false,"position":278,"left":2930,"right":2990},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2991,"text":"+\t}","html":"+\t}","displayNoNewLineWarning":false,"position":279,"left":2930,"right":2991},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2992,"text":"+","html":"+","displayNoNewLineWarning":false,"position":280,"left":2930,"right":2992},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2993,"text":"+\t/* and then create a projection for that targetlist */","html":"+\t\u003cspan class=pl-c\u003e/* and then create a projection for that targetlist */\u003c/span\u003e","displayNoNewLineWarning":false,"position":281,"left":2930,"right":2993},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2994,"text":"+\taggstate-\u003eevaldesc = ExecTypeFromTL(combined_inputeval, false);","html":"+\t\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevaldesc\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecTypeFromTL\u003c/span\u003e(\u003cspan class=pl-s1\u003ecombined_inputeval\u003c/span\u003e, false);","displayNoNewLineWarning":false,"position":282,"left":2930,"right":2994},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2995,"text":"+\taggstate-\u003eevalslot = ExecInitExtraTupleSlot(estate);","html":"+\t\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalslot\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecInitExtraTupleSlot\u003c/span\u003e(\u003cspan class=pl-s1\u003eestate\u003c/span\u003e);","displayNoNewLineWarning":false,"position":283,"left":2930,"right":2995},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2996,"text":"+\tcombined_inputeval = (List *) ExecInitExpr((Expr *) combined_inputeval,","html":"+\t\u003cspan class=pl-s1\u003ecombined_inputeval\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e (\u003cspan class=pl-smi\u003eList\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e) \u003cspan class=pl-en\u003eExecInitExpr\u003c/span\u003e((\u003cspan class=pl-smi\u003eExpr\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e) \u003cspan class=pl-s1\u003ecombined_inputeval\u003c/span\u003e,","displayNoNewLineWarning":false,"position":284,"left":2930,"right":2996},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2997,"text":"+\t\t\t\t\t\t\t\t\t\t\t (PlanState *) aggstate);","html":"+\t\t\t\t\t\t\t\t\t\t\t (\u003cspan class=pl-smi\u003ePlanState\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e) \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e);","displayNoNewLineWarning":false,"position":285,"left":2930,"right":2997},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2998,"text":"+\taggstate-\u003eevalproj = ExecBuildProjectionInfo(combined_inputeval,","html":"+\t\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalproj\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecBuildProjectionInfo\u003c/span\u003e(\u003cspan class=pl-s1\u003ecombined_inputeval\u003c/span\u003e,","displayNoNewLineWarning":false,"position":286,"left":2930,"right":2998},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":2999,"text":"+\t\t\t\t\t\t\t\t\t\t\t\t aggstate-\u003etmpcontext,","html":"+\t\t\t\t\t\t\t\t\t\t\t\t \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etmpcontext\u003c/span\u003e,","displayNoNewLineWarning":false,"position":287,"left":2930,"right":2999},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3000,"text":"+\t\t\t\t\t\t\t\t\t\t\t\t aggstate-\u003eevalslot,","html":"+\t\t\t\t\t\t\t\t\t\t\t\t \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalslot\u003c/span\u003e,","displayNoNewLineWarning":false,"position":288,"left":2930,"right":3000},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3001,"text":"+\t\t\t\t\t\t\t\t\t\t\t\t NULL);","html":"+\t\t\t\t\t\t\t\t\t\t\t\t \u003cspan class=pl-c1\u003eNULL\u003c/span\u003e);","displayNoNewLineWarning":false,"position":289,"left":2930,"right":3001},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3002,"text":"+\tExecSetSlotDescriptor(aggstate-\u003eevalslot, aggstate-\u003eevaldesc);","html":"+\t\u003cspan class=pl-en\u003eExecSetSlotDescriptor\u003c/span\u003e(\u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalslot\u003c/span\u003e, \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevaldesc\u003c/span\u003e);","displayNoNewLineWarning":false,"position":290,"left":2930,"right":3002},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3003,"text":"+","html":"+","displayNoNewLineWarning":false,"position":291,"left":2930,"right":3003},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3004,"text":" \treturn aggstate;","html":" \t\u003cspan class=pl-k\u003ereturn\u003c/span\u003e \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e;","displayNoNewLineWarning":false,"position":292,"left":2931,"right":3004},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3005,"text":" }","html":" }","displayNoNewLineWarning":false,"position":293,"left":2932,"right":3005},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3006,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":294,"left":2933,"right":3006},{"stylingDirective":null,"type":"HUNK","blobLineNumber":3170,"text":"@@ -3098,24 +3171,12 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,","html":"@@ -3098,24 +3171,12 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,","displayNoNewLineWarning":false,"position":295,"left":3097,"right":3170},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3171,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":296,"left":3098,"right":3171},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3172,"text":" \t}","html":" \t}","displayNoNewLineWarning":false,"position":297,"left":3099,"right":3172},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3173,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":298,"left":3100,"right":3173},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3101,"text":"-\t/*","html":"-\t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":299,"left":3101,"right":3173},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3102,"text":"-\t * Get a tupledesc corresponding to the aggregated inputs (including sort","html":"-\u003cspan class=pl-c\u003e\t * Get a tupledesc corresponding to the aggregated inputs (including sort\u003c/span\u003e","displayNoNewLineWarning":false,"position":300,"left":3102,"right":3173},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3103,"text":"-\t * expressions) of the agg.","html":"-\u003cspan class=pl-c\u003e\t * expressions) of the agg.\u003c/span\u003e","displayNoNewLineWarning":false,"position":301,"left":3103,"right":3173},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3104,"text":"-\t */","html":"-\u003cspan class=pl-c\u003e\t */\u003c/span\u003e","displayNoNewLineWarning":false,"position":302,"left":3104,"right":3173},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3105,"text":"-\tpertrans-\u003eevaldesc = ExecTypeFromTL(aggref-\u003eargs, false);","html":"-\t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevaldesc\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecTypeFromTL\u003c/span\u003e(\u003cspan class=pl-s1\u003eaggref\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eargs\u003c/span\u003e, false);","displayNoNewLineWarning":false,"position":303,"left":3105,"right":3173},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3106,"text":"-","html":"-","displayNoNewLineWarning":false,"position":304,"left":3106,"right":3173},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3107,"text":"-\t/* Create slot we're going to do argument evaluation in */","html":"-\t\u003cspan class=pl-c\u003e/* Create slot we\u0026#39;re going to do argument evaluation in */\u003c/span\u003e","displayNoNewLineWarning":false,"position":305,"left":3107,"right":3173},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3108,"text":"-\tpertrans-\u003eevalslot = ExecInitExtraTupleSlot(estate);","html":"-\t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalslot\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecInitExtraTupleSlot\u003c/span\u003e(\u003cspan class=pl-s1\u003eestate\u003c/span\u003e);","displayNoNewLineWarning":false,"position":306,"left":3108,"right":3173},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3109,"text":"-\tExecSetSlotDescriptor(pertrans-\u003eevalslot, pertrans-\u003eevaldesc);","html":"-\t\u003cspan class=pl-en\u003eExecSetSlotDescriptor\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalslot\u003c/span\u003e, \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevaldesc\u003c/span\u003e);","displayNoNewLineWarning":false,"position":307,"left":3109,"right":3173},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3110,"text":"-","html":"-","displayNoNewLineWarning":false,"position":308,"left":3110,"right":3173},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3174,"text":" \t/* Initialize the input and FILTER expressions */","html":" \t\u003cspan class=pl-c\u003e/* Initialize the input and FILTER expressions */\u003c/span\u003e","displayNoNewLineWarning":false,"position":309,"left":3111,"right":3174},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3175,"text":" \tnaggs = aggstate-\u003enumaggs;","html":" \t\u003cspan class=pl-s1\u003enaggs\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003enumaggs\u003c/span\u003e;","displayNoNewLineWarning":false,"position":310,"left":3112,"right":3175},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3176,"text":" \tpertrans-\u003eaggfilter = ExecInitExpr(aggref-\u003eaggfilter,","html":" \t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eaggfilter\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecInitExpr\u003c/span\u003e(\u003cspan class=pl-s1\u003eaggref\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eaggfilter\u003c/span\u003e,","displayNoNewLineWarning":false,"position":311,"left":3113,"right":3176},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3177,"text":" \t\t\t\t\t\t\t\t\t (PlanState *) aggstate);","html":" \t\t\t\t\t\t\t\t\t (\u003cspan class=pl-smi\u003ePlanState\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e) \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e);","displayNoNewLineWarning":false,"position":312,"left":3114,"right":3177},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3178,"text":" \tpertrans-\u003eaggdirectargs = (List *) ExecInitExpr((Expr *) aggref-\u003eaggdirectargs,","html":" \t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eaggdirectargs\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e (\u003cspan class=pl-smi\u003eList\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e) \u003cspan class=pl-en\u003eExecInitExpr\u003c/span\u003e((\u003cspan class=pl-smi\u003eExpr\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e) \u003cspan class=pl-s1\u003eaggref\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eaggdirectargs\u003c/span\u003e,","displayNoNewLineWarning":false,"position":313,"left":3115,"right":3178},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3179,"text":" \t\t\t\t\t\t\t\t\t\t\t\t\t(PlanState *) aggstate);","html":" \t\t\t\t\t\t\t\t\t\t\t\t\t(\u003cspan class=pl-smi\u003ePlanState\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e) \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e);","displayNoNewLineWarning":false,"position":314,"left":3116,"right":3179},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3117,"text":"-\tpertrans-\u003eargs = (List *) ExecInitExpr((Expr *) aggref-\u003eargs,","html":"-\t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eargs\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e (\u003cspan class=pl-smi\u003eList\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e) \u003cspan class=pl-en\u003eExecInitExpr\u003c/span\u003e((\u003cspan class=pl-smi\u003eExpr\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e) \u003cspan class=pl-s1\u003eaggref\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eargs\u003c/span\u003e,","displayNoNewLineWarning":false,"position":315,"left":3117,"right":3179},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3118,"text":"-\t\t\t\t\t\t\t\t\t\t (PlanState *) aggstate);","html":"-\t\t\t\t\t\t\t\t\t\t (\u003cspan class=pl-smi\u003ePlanState\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e) \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e);","displayNoNewLineWarning":false,"position":316,"left":3118,"right":3179},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3180,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":317,"left":3119,"right":3180},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3181,"text":" \t/*","html":" \t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":318,"left":3120,"right":3181},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3182,"text":" \t * Complain if the aggregate's arguments contain any aggregates; nested","html":" \u003cspan class=pl-c\u003e\t * Complain if the aggregate\u0026#39;s arguments contain any aggregates; nested\u003c/span\u003e","displayNoNewLineWarning":false,"position":319,"left":3121,"right":3182},{"stylingDirective":null,"type":"HUNK","blobLineNumber":3187,"text":"@@ -3127,12 +3188,6 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,","html":"@@ -3127,12 +3188,6 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,","displayNoNewLineWarning":false,"position":320,"left":3126,"right":3187},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3188,"text":" \t\t\t\t(errcode(ERRCODE_GROUPING_ERROR),","html":" \t\t\t\t(\u003cspan class=pl-en\u003eerrcode\u003c/span\u003e(\u003cspan class=pl-c1\u003eERRCODE_GROUPING_ERROR\u003c/span\u003e),","displayNoNewLineWarning":false,"position":321,"left":3127,"right":3188},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3189,"text":" \t\t\t\t errmsg(\"aggregate function calls cannot be nested\")));","html":" \t\t\t\t \u003cspan class=pl-en\u003eerrmsg\u003c/span\u003e(\u003cspan class=pl-s\u003e\u0026quot;aggregate function calls cannot be nested\u0026quot;\u003c/span\u003e)));","displayNoNewLineWarning":false,"position":322,"left":3128,"right":3189},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3190,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":323,"left":3129,"right":3190},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3130,"text":"-\t/* Set up projection info for evaluation */","html":"-\t\u003cspan class=pl-c\u003e/* Set up projection info for evaluation */\u003c/span\u003e","displayNoNewLineWarning":false,"position":324,"left":3130,"right":3190},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3131,"text":"-\tpertrans-\u003eevalproj = ExecBuildProjectionInfo(pertrans-\u003eargs,","html":"-\t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalproj\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecBuildProjectionInfo\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eargs\u003c/span\u003e,","displayNoNewLineWarning":false,"position":325,"left":3131,"right":3190},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3132,"text":"-\t\t\t\t\t\t\t\t\t\t\t\t aggstate-\u003etmpcontext,","html":"-\t\t\t\t\t\t\t\t\t\t\t\t \u003cspan class=pl-s1\u003eaggstate\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003etmpcontext\u003c/span\u003e,","displayNoNewLineWarning":false,"position":326,"left":3132,"right":3190},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3133,"text":"-\t\t\t\t\t\t\t\t\t\t\t\t pertrans-\u003eevalslot,","html":"-\t\t\t\t\t\t\t\t\t\t\t\t \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eevalslot\u003c/span\u003e,","displayNoNewLineWarning":false,"position":327,"left":3133,"right":3190},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3134,"text":"-\t\t\t\t\t\t\t\t\t\t\t\t NULL);","html":"-\t\t\t\t\t\t\t\t\t\t\t\t \u003cspan class=pl-c1\u003eNULL\u003c/span\u003e);","displayNoNewLineWarning":false,"position":328,"left":3134,"right":3190},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3135,"text":"-","html":"-","displayNoNewLineWarning":false,"position":329,"left":3135,"right":3190},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3191,"text":" \t/*","html":" \t\u003cs 8000 pan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":330,"left":3136,"right":3191},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3192,"text":" \t * If we're doing either DISTINCT or ORDER BY for a plain agg, then we","html":" \u003cspan class=pl-c\u003e\t * If we\u0026#39;re doing either DISTINCT or ORDER BY for a plain agg, then we\u003c/span\u003e","displayNoNewLineWarning":false,"position":331,"left":3137,"right":3192},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3193,"text":" \t * have a list of SortGroupClause nodes; fish out the data in them and","html":" \u003cspan class=pl-c\u003e\t * have a list of SortGroupClause nodes; fish out the data in them and\u003c/span\u003e","displayNoNewLineWarning":false,"position":332,"left":3138,"right":3193},{"stylingDirective":null,"type":"HUNK","blobLineNumber":3219,"text":"@@ -3165,6 +3220,14 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,","html":"@@ -3165,6 +3220,14 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,","displayNoNewLineWarning":false,"position":333,"left":3164,"right":3219},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3220,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":334,"left":3165,"right":3220},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3221,"text":" \tif (numSortCols \u003e 0)","html":" \t\u003cspan class=pl-k\u003eif\u003c/span\u003e (\u003cspan class=pl-s1\u003enumSortCols\u003c/span\u003e \u003cspan class=pl-c1\u003e\u0026gt;\u003c/span\u003e \u003cspan class=pl-c1\u003e0\u003c/span\u003e)","displayNoNewLineWarning":false,"position":335,"left":3166,"right":3221},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3222,"text":" \t{","html":" \t{","displayNoNewLineWarning":false,"position":336,"left":3167,"right":3222},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3223,"text":"+\t\t/*","html":"+\t\t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":337,"left":3167,"right":3223},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3224,"text":"+\t\t * Get a tupledesc and slot corresponding to the aggregated inputs","html":"+\u003cspan class=pl-c\u003e\t\t * Get a tupledesc and slot corresponding to the aggregated inputs\u003c/span\u003e","displayNoNewLineWarning":false,"position":338,"left":3167,"right":3224},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3225,"text":"+\t\t * (including sort expressions) of the agg.","html":"+\u003cspan class=pl-c\u003e\t\t * (including sort expressions) of the agg.\u003c/span\u003e","displayNoNewLineWarning":false,"position":339,"left":3167,"right":3225},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3226,"text":"+\t\t */","html":"+\u003cspan class=pl-c\u003e\t\t */\u003c/span\u003e","displayNoNewLineWarning":false,"position":340,"left":3167,"right":3226},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3227,"text":"+\t\tpertrans-\u003esortdesc = ExecTypeFromTL(aggref-\u003eargs, false);","html":"+\t\t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortdesc\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecTypeFromTL\u003c/span\u003e(\u003cspan class=pl-s1\u003eaggref\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003eargs\u003c/span\u003e, false);","displayNoNewLineWarning":false,"position":341,"left":3167,"right":3227},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3228,"text":"+\t\tpertrans-\u003esortslot = ExecInitExtraTupleSlot(estate);","html":"+\t\t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortslot\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecInitExtraTupleSlot\u003c/span\u003e(\u003cspan class=pl-s1\u003eestate\u003c/span\u003e);","displayNoNewLineWarning":false,"position":342,"left":3167,"right":3228},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3229,"text":"+\t\tExecSetSlotDescriptor(pertrans-\u003esortslot, pertrans-\u003esortdesc);","html":"+\t\t\u003cspan class=pl-en\u003eExecSetSlotDescriptor\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortslot\u003c/span\u003e, \u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003esortdesc\u003c/span\u003e);","displayNoNewLineWarning":false,"position":343,"left":3167,"right":3229},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3230,"text":"+","html":"+","displayNoNewLineWarning":false,"position":344,"left":3167,"right":3230},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3231,"text":" \t\t/*","html":" \t\t\u003cspan class=pl-c\u003e/*\u003c/span\u003e","displayNoNewLineWarning":false,"position":345,"left":3168,"right":3231},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3232,"text":" \t\t * We don't implement DISTINCT or ORDER BY aggs in the HASHED case","html":" \u003cspan class=pl-c\u003e\t\t * We don\u0026#39;t implement DISTINCT or ORDER BY aggs in the HASHED case\u003c/span\u003e","displayNoNewLineWarning":false,"position":346,"left":3169,"right":3232},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3233,"text":" \t\t * (yet)","html":" \u003cspan class=pl-c\u003e\t\t * (yet)\u003c/span\u003e","displayNoNewLineWarning":false,"position":347,"left":3170,"right":3233},{"stylingDirective":null,"type":"HUNK","blobLineNumber":3245,"text":"@@ -3183,7 +3246,7 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,","html":"@@ -3183,7 +3246,7 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,","displayNoNewLineWarning":false,"position":348,"left":3182,"right":3245},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3246,"text":" \t\t\t/* we will need an extra slot to store prior values */","html":" \t\t\t\u003cspan class=pl-c\u003e/* we will need an extra slot to store prior values */\u003c/span\u003e","displayNoNewLineWarning":false,"position":349,"left":3183,"right":3246},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3247,"text":" \t\t\tpertrans-\u003euniqslot = ExecInitExtraTupleSlot(estate);","html":" \t\t\t\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003euniqslot\u003c/span\u003e \u003cspan class=pl-c1\u003e=\u003c/span\u003e \u003cspan class=pl-en\u003eExecInitExtraTupleSlot\u003c/span\u003e(\u003cspan class=pl-s1\u003eestate\u003c/span\u003e);","displayNoNewLineWarning":false,"position":350,"left":3184,"right":3247},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3248,"text":" \t\t\tExecSetSlotDescriptor(pertrans-\u003euniqslot,","html":" \t\t\t\u003cspan class=pl-en\u003eExecSetSlotDescriptor\u003c/span\u003e(\u003cspan class=pl-s1\u003epertrans\u003c/span\u003e\u003cspan class=pl-c1\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=pl-c1\u003euniqslot\u003c/span\u003e,","displayNoNewLineWarning":false,"position":351,"left":3185,"right":3248},{"stylingDirective":null,"type":"DELETION","blobLineNumber":3186,"text":"-\t\t\t\t\t\t\t\t pertrans-\u003eevaldesc);","html":"-\t\t\t\t\t\t\t\t \u003cspan class=\"pl-s1\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x x-first x-last\"\u003eevaldesc\u003c/span\u003e);","displayNoNewLineWarning":false,"position":352,"left":3186,"right":3248},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":3249,"text":"+\t\t\t\t\t\t\t\t pertrans-\u003esortdesc);","html":"+\t\t\t\t\t\t\t\t \u003cspan class=\"pl-s1\"\u003epertrans\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"pl-c1 x x-first x-last\"\u003esortdesc\u003c/span\u003e);","displayNoNewLineWarning":false,"position":353,"left":3186,"right":3249},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3250,"text":" \t\t}","html":" \t\t}","displayNoNewLineWarning":false,"position":354,"left":3187,"right":3250},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3251,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":355,"left":3188,"right":3251},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":3252,"text":" \t\t/* Extract the sort information for use later */","html":" \t\t\u003cspan class=pl-c\u003e/* Extract the sort information for use later */\u003c/span\u003e","displayNoNewLineWarning":false,"position":356,"left":3189,"right":3252}],"diffNumber":0,"diffSize":"0 Bytes","isBinary":false,"isTooBig":false,"collapsed":false,"isSubmodule":false,"lineCount":3753,"linesChanged":167,"newTreeEntry":{"lineCount":3753,"path":"src/backend/executor/nodeAgg.c","mode":100644,"isGenerated":false},"oldTreeEntry":{"lineCount":0,"path":"src/backend/executor/nodeAgg.c","mode":100644},"linesAdded":115,"linesDeleted":52,"path":"src/backend/executor/nodeAgg.c","pathDigest":"999900664d444cea2668121b34d5ebb59ebb85c1e232b7aaa7f8598f670a6229","status":"MODIFIED","truncatedReason":null,"oldOid":"6d46f4783efe457f74816a75173eb23ed8930020","newOid":"8ed3f11bb045ad7a3607690be668dbd5b3cc31d7","copilotChatReference":null,"deletedSha":"6d46f4783efe457f74816a75173eb23ed8930020","canToggleRichDiff":false,"defaultToRichDiff":false,"proseDifffHtml":null,"renderInfo":null,"dependencyDiffPath":null,"submodule":null},{"diffLines":[{"stylingDirective":null,"type":"HUNK","blobLineNumber":1862,"text":"@@ -1863,6 +1863,10 @@ typedef struct AggState","html":"@@ -1863,6 +1863,10 @@ typedef struct AggState","displayNoNewLineWarning":false,"position":0,"left":1862,"right":1862},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1863,"text":" \tList\t *hash_needed;\t/* list of columns needed in hash table */","html":" \t\u003cspan class=pl-smi\u003eList\u003c/span\u003e\t \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-c1\u003ehash_needed\u003c/span\u003e;\t\u003cspan class=pl-c\u003e/* list of columns needed in hash table */\u003c/span\u003e","displayNoNewLineWarning":false,"position":1,"left":1863,"right":1863},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1864,"text":" \tbool\t\ttable_filled;\t/* hash table filled yet? */","html":" \t\u003cspan class=pl-smi\u003ebool\u003c/span\u003e\t\t\u003cspan class=pl-c1\u003etable_filled\u003c/span\u003e;\t\u003cspan class=pl-c\u003e/* hash table filled yet? */\u003c/span\u003e","displayNoNewLineWarning":false,"position":2,"left":1864,"right":1864},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1865,"text":" \tTupleHashIterator hashiter; /* for iterating through hash table */","html":" \t\u003cspan class=pl-smi\u003eTupleHashIterator\u003c/span\u003e \u003cspan class=pl-c1\u003ehashiter\u003c/span\u003e; \u003cspan class=pl-c\u003e/* for iterating through hash table */\u003c/span\u003e","displayNoNewLineWarning":false,"position":3,"left":1865,"right":1865},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":1866,"text":"+\t/* support for evaluation of agg inputs */","html":"+\t\u003cspan class=pl-c\u003e/* support for evaluation of agg inputs */\u003c/span\u003e","displayNoNewLineWarning":false,"position":4,"left":1865,"right":1866},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":1867,"text":"+\tTupleTableSlot *evalslot;\t/* slot for agg inputs */","html":"+\t\u003cspan class=pl-smi\u003eTupleTableSlot\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-c1\u003eevalslot\u003c/span\u003e;\t\u003cspan class=pl-c\u003e/* slot for agg inputs */\u003c/span\u003e","displayNoNewLineWarning":false,"position":5,"left":1865,"right":1867},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":1868,"text":"+\tProjectionInfo *evalproj;\t/* projection machinery */","html":"+\t\u003cspan class=pl-smi\u003eProjectionInfo\u003c/span\u003e \u003cspan class=pl-c1\u003e*\u003c/span\u003e\u003cspan class=pl-c1\u003eevalproj\u003c/span\u003e;\t\u003cspan class=pl-c\u003e/* projection machinery */\u003c/span\u003e","displayNoNewLineWarning":false,"position":6,"left":1865,"right":1868},{"stylingDirective":null,"type":"ADDITION","blobLineNumber":1869,"text":"+\tTupleDesc\tevaldesc;\t\t/* descriptor of input tuples */","html":"+\t\u003cspan class=pl-smi\u003eTupleDesc\u003c/span\u003e\t\u003cspan class=pl-c1\u003eevaldesc\u003c/span\u003e;\t\t\u003cspan class=pl-c\u003e/* descriptor of input tuples */\u003c/span\u003e","displayNoNewLineWarning":false,"position":7,"left":1865,"right":1869},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1870,"text":" } AggState;","html":" } \u003cspan class=pl-smi\u003eAggState\u003c/span\u003e;","displayNoNewLineWarning":false,"position":8,"left":1866,"right":1870},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1871,"text":" ","html":"\u003cbr\u003e","displayNoNewLineWarning":false,"position":9,"left":1867,"right":1871},{"stylingDirective":null,"type":"CONTEXT","blobLineNumber":1872,"text":" /* ----------------","html":" \u003cspan class=pl-c\u003e/* ----------------\u003c/span\u003e","displayNoNewLineWarning":false,"position":10,"left":1868,"right":1872}],"diffNumber":1,"diffSize":"0 Bytes","isBinary":false,"isTooBig":false,"collapsed":false,"isSubmodule":false,"lineCount":2068,"linesChanged":4,"newTreeEntry":{"lineCount":2068,"path":"src/include/nodes/execnodes.h","mode":100644,"isGenerated":false},"oldTreeEntry":{"lineCount":0,"path":"src/include/nodes/execnodes.h","mode":100644},"linesAdded":4,"linesDeleted":0,"path":"src/include/nodes/execnodes.h","pathDigest":"d0afec0850a62bac69a9c4c0ea49af6847a0c2348cd2931cac07cb2a923324d3","status":"MODIFIED","truncatedReason":null,"oldOid":"6d46f4783efe457f74816a75173eb23ed8930020","newOid":"8ed3f11bb045ad7a3607690be668dbd5b3cc31d7","copilotChatReference":null,"deletedSha":"6d46f4783efe457f74816a75173eb23ed8930020","canToggleRichDiff":false,"defaultToRichDiff":false,"proseDifffHtml":null,"renderInfo":null,"dependencyDiffPath":null,"submodule":null}],"splitViewPreference":"unified","ignoreWhitespace":false,"repoOwnerGlobalRelayId":"MDEyOk9yZ2FuaXphdGlvbjE3NzU0Mw==","commentsPreference":"visible","diffLineSpacingPreference":"relaxed","useMonospaceFont":false,"pasteUrlLinkAsPlainText":false,"userNotices":[],"path":"/postgres/postgres/commit/8ed3f11bb045ad7a3607690be668dbd5b3cc31d7","fileTreeExpanded":true,"headerInfo":{"additions":119,"deletions":52,"filesChanged":2,"filesChangedString":"2"},"moreDiffsToLoad":false,"asyncDiffLoadInfo":{"startIndex":2,"truncated":false,"byteCount":13431,"lineShownCount":368},"commentInfo":{"canComment":false,"locked":false,"canLock":false,"repoArchived":false},"csrf_tokens":{"/users/diffview?diff=split":{"post":"JP7iaXjRNfiV6O-DT6s8TABNepAhVs_ukjvi950AbX5o8FG41wI3Gn9HbG03m6-pEQ5cJ-LBZ9zlG1R90vhbpw"},"/users/diffview?diff=unified":{"post":"0QfuUFGFuMFX9tQIegVt7Jm7fLxNZq0esPjaN6j4UXCdCV2B_la6I71ZV-YCNf4JiPhaC47xBSzH2Gy95wBnqQ"},"/notifications/thread":{"post":"d-uCezwgxndGkwCi_57mJHh3Lr7XU4ZpkgDdbsCuNWFClSx_OovkrT0A5q_daV0v8wP3_r-ctnpSGmarX4qsaQ"}}},"title":"Perform one only projection to compute agg arguments. · postgres/postgres@8ed3f11","appPayload":{"helpUrl":"https://docs.github.com","findInDiffWorkerPath":"/assets-cdn/worker/find-in-diff-worker-2bfe39677d14.js","enabled_features":{"diff_ux_refresh_beta":false,"diff_inline_comments":true,"diff_ux_refresh_ssr_five":false,"diff_ux_refresh_ssr_ten":false,"react_diff_line_type_character_correction":true}}}

Commit 8ed3f11

Browse files
committed
Perform one only projection to compute agg arguments.
Previously we did a ExecProject() for each individual aggregate argument. That turned out to be a performance bottleneck in queries with multiple aggregates. Doing all the argument computations in one ExecProject() is quite a bit cheaper because ExecProject's fastpath can do the work at once in a relatively tight loop, and because it can get all the required columns with a single slot_getsomeattr and save some other redundant setup costs. Author: Andres Freund Reviewed-By: Heikki Linnakangas Discussion: https://postgr.es/m/20161103110721.h5i5t5saxfk5eeik@alap3.anarazel.de
1 parent 6d46f47 commit 8ed3f11

File tree

2 files changed

+119
-52
lines changed

2 files changed

+119
-52
lines changed

src/backend/executor/nodeAgg.c

Lines changed: 115 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@
160160
#include "executor/executor.h"
161161
#include "executor/nodeAgg.h"
162162
#include "miscadmin.h"
163+
#include "nodes/makefuncs.h"
163164
#include "nodes/nodeFuncs.h"
164165
#include "optimizer/clauses.h"
165166
#include "optimizer/tlist.h"
@@ -213,6 +214,9 @@ typedef struct AggStatePerTransData
213214
*/
214215
int numInputs;
215216

217+
/* offset of input columns in AggState->evalslot */
218+
int inputoff;
219+
216220
/*
217221
* Number of aggregated input columns to pass to the transfn. This
218222
* includes the ORDER BY columns for ordered-set aggs, but not for plain
@@ -234,7 +238,6 @@ typedef struct AggStatePerTransData
234238

235239
/* ExprStates of the FILTER and argument expressions. */
236240
ExprState *aggfilter; /* state of FILTER expression, if any */
237-
List *args; /* states of aggregated-argument expressions */
238241
List *aggdirectargs; /* states of direct-argument expressions */
239242

240243
/*
@@ -291,19 +294,19 @@ typedef struct AggStatePerTransData
291294
transtypeByVal;
292295

293296
/*
294-
* Stuff for evaluation of inputs. We used to just use ExecEvalExpr, but
295-
* with the addition of ORDER BY we now need at least a slot for passing
296-
* data to the sort object, which requires a tupledesc, so we might as
297-
* well go whole hog and use ExecProject too.
297+
* Stuff for evaluation of aggregate inputs in cases where the aggregate
298+
* requires sorted input. The arguments themselves will be evaluated via
299+
* AggState->evalslot/evalproj for all aggregates at once, but we only
300+
* want to sort the relevant columns for individual aggregates.
298301
*/
299-
TupleDesc evaldesc; /* descriptor of input tuples */
300-
ProjectionInfo *evalproj; /* projection machinery */
302+
TupleDesc sortdesc; /* descriptor of input tuples */
301303

302304
/*
303305
* Slots for holding the evaluated input arguments. These are set up
304-
* during ExecInitAgg() and then used for each input row.
306+
* during ExecInitAgg() and then used for each input row requiring
307+
* procesessing besides what's done in AggState->evalproj.
305308
*/
306-
TupleTableSlot *evalslot; /* current input tuple */
309+
TupleTableSlot *sortslot; /* current input tuple */
307310
TupleTableSlot *uniqslot; /* used for multi-column DISTINCT */
308311

309312
/*
@@ -621,14 +624,14 @@ initialize_aggregate(AggState *aggstate, AggStatePerTrans pertrans,
621624
*/
622625
if (pertrans->numInputs == 1)
623626
pertrans->sortstates[aggstate->current_set] =
624-
tuplesort_begin_datum(pertrans->evaldesc->attrs[0]->atttypid,
627+
tuplesort_begin_datum(pertrans->sortdesc->attrs[0]->atttypid,
625628
pertrans->sortOperators[0],
626629
pertrans->sortCollations[0],
627630
pertrans->sortNullsFirst[0],
628631
work_mem, false);
629632
else
630633
pertrans->sortstates[aggstate->current_set] =
631-
tuplesort_begin_heap(pertrans->evaldesc,
634+
tuplesort_begin_heap(pertrans->sortdesc,
632635
pertrans->numSortCols,
633636
pertrans->sortColIdx,
634637
pertrans->sortOperators,
@@ -847,14 +850,19 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
847850
int setno = 0;
848851
int numGroupingSets = Max(aggstate->phase->numsets, 1);
849852
int numTrans = aggstate->numtrans;
853+
TupleTableSlot *slot = aggstate->evalslot;
854+
855+
/* compute input for all aggregates */
856+
if (aggstate->evalproj)
857+
aggstate->evalslot = ExecProject(aggstate->evalproj, NULL);
850858

851859
for (transno = 0; transno < numTrans; transno++)
852860
{
853861
AggStatePerTrans pertrans = &aggstate->pertrans[transno];
854862
ExprState *filter = pertrans->aggfilter;
855863
int numTransInputs = pertrans->numTransInputs;
856864
int i;
857-
TupleTableSlot *slot;
865+
int inputoff = pertrans->inputoff;
858866

859867
/* Skip anything FILTERed out */
860868
if (filter)
@@ -868,13 +876,10 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
868876
continue;
869877
}
870878

871-
/* Evaluate the current input expressions for this aggregate */
872-
slot = ExecProject(pertrans->evalproj, NULL);
873-
874879
if (pertrans->numSortCols > 0)
875880
{
876881
/* DISTINCT and/or ORDER BY case */
877-
Assert(slot->tts_nvalid == pertrans->numInputs);
882+
Assert(slot->tts_nvalid >= (pertrans->numInputs + inputoff));
878883

879884
/*
880885
* If the transfn is strict, we want to check for nullity before
@@ -887,7 +892,7 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
887892
{
888893
for (i = 0; i < numTransInputs; i++)
889894
{
890-
if (slot->tts_isnull[i])
895+
if (slot->tts_isnull[i + inputoff])
891896
break;
892897
}
893898
if (i < numTransInputs)
@@ -899,10 +904,25 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
899904
/* OK, put the tuple into the tuplesort object */
900905
if (pertrans->numInputs == 1)
901906
tuplesort_putdatum(pertrans->sortstates[setno],
902-
slot->tts_values[0],
903-
slot->tts_isnull[0]);
907+
slot->tts_values[inputoff],
908+
slot->tts_isnull[inputoff]);
904909
else
905-
tuplesort_puttupleslot(pertrans->sortstates[setno], slot);
910+
{
911+
/*
912+
* Copy slot contents, starting from inputoff, into sort
913+
* slot.
914+
*/
915+
ExecClearTuple(pertrans->sortslot);
916+
memcpy(pertrans->sortslot->tts_values,
917+
&slot->tts_values[inputoff],
918+
pertrans->numInputs * sizeof(Datum));
919+
memcpy(pertrans->sortslot->tts_isnull,
920+
&slot->tts_isnull[inputoff],
921+
pertrans->numInputs * sizeof(bool));
922+
pertrans->sortslot->tts_nvalid = pertrans->numInputs;
923+
ExecStoreVirtualTuple(pertrans->sortslot);
924+
tuplesort_puttupleslot(pertrans->sortstates[setno], pertrans->sortslot);
925+
}
906926
}
907927
}
908928
else
@@ -915,8 +935,8 @@ advance_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
915935
Assert(slot->tts_nvalid >= numTransInputs);
916936
for (i = 0; i < numTransInputs; i++)
917937
{
918-
fcinfo->arg[i + 1] = slot->tts_values[i];
919-
fcinfo->argnull[i + 1] = slot->tts_isnull[i];
938+
fcinfo->arg[i + 1] = slot->tts_values[i + inputoff];
939+
fcinfo->argnull[i + 1] = slot->tts_isnull[i + inputoff];
920940
}
921941

922942
for (setno = 0; setno < numGroupingSets; setno++)
@@ -943,20 +963,24 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
943963
{
944964
int transno;
945965
int numTrans = aggstate->numtrans;
966+
TupleTableSlot *slot = NULL;
946967

947968
/* combine not supported with grouping sets */
948969
Assert(aggstate->phase->numsets == 0);
949970

971+
/* compute input for all aggregates */
972+
if (aggstate->evalproj)
973+
slot = ExecProject(aggstate->evalproj, NULL);
974+
950975
for (transno = 0; transno < numTrans; transno++)
951976
{
952977
AggStatePerTrans pertrans = &aggstate->pertrans[transno];
953978
AggStatePerGroup pergroupstate = &pergroup[transno];
954-
TupleTableSlot *slot;
955979
FunctionCallInfo fcinfo = &pertrans->transfn_fcinfo;
980+
int inputoff = pertrans->inputoff;
956981

957-
/* Evaluate the current input expressions for this aggregate */
958-
slot = ExecProject(pertrans->evalproj, NULL);
959982
Assert(slot->tts_nvalid >= 1);
983+
Assert(slot->tts_nvalid + inputoff >= 1);
960984

961985
/*
962986
* deserialfn_oid will be set if we must deserialize the input state
@@ -965,18 +989,18 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
965989
if (OidIsValid(pertrans->deserialfn_oid))
966990
{
967991
/* Don't call a strict deserialization function with NULL input */
968-
if (pertrans->deserialfn.fn_strict && slot->tts_isnull[0])
992+
if (pertrans->deserialfn.fn_strict && slot->tts_isnull[inputoff])
969993
{
970-
fcinfo->arg[1] = slot->tts_values[0];
971-
fcinfo->argnull[1] = slot->tts_isnull[0];
994+
fcinfo->arg[1] = slot->tts_values[inputoff];
995+
fcinfo->argnull[1] = slot->tts_isnull[inputoff];
972996
}
973997
else
974998
{
975999
FunctionCallInfo dsinfo = &pertrans->deserialfn_fcinfo;
9761000
MemoryContext oldContext;
9771001

978-
dsinfo->arg[0] = slot->tts_values[0];
979-
dsinfo->argnull[0] = slot->tts_isnull[0];
1002+
dsinfo->arg[0] = slot->tts_values[inputoff];
1003+
dsinfo->argnull[0] = slot->tts_isnull[inputoff];
9801004
/* Dummy second argument for type-safety reasons */
9811005
dsinfo->arg[1] = PointerGetDatum(NULL);
9821006
dsinfo->argnull[1] = false;
@@ -995,8 +1019,8 @@ combine_aggregates(AggState *aggstate, AggStatePerGroup pergroup)
9951019
}
9961020
else
9971021
{
998-
fcinfo->arg[1] = slot->tts_values[0];
999-
fcinfo->argnull[1] = slot->tts_isnull[0];
1022+
fcinfo->arg[1] = slot->tts_values[inputoff];
1023+
fcinfo->argnull[1] = slot->tts_isnull[inputoff];
10001024
}
10011025

10021026
advance_combine_function(aggstate, pertrans, pergroupstate);
@@ -1233,7 +1257,7 @@ process_ordered_aggregate_multi(AggState *aggstate,
12331257
{
12341258
MemoryContext workcontext = aggstate->tmpcontext->ecxt_per_tuple_memory;
12351259
FunctionCallInfo fcinfo = &pertrans->transfn_fcinfo;
1236-
TupleTableSlot *slot1 = pertrans->evalslot;
1260+
TupleTableSlot *slot1 = pertrans->sortslot;
12371261
TupleTableSlot *slot2 = pertrans->uniqslot;
12381262
int numTransInputs = pertrans->numTransInputs;
12391263
int numDistinctCols = pertrans->numDistinctCols;
@@ -2343,10 +2367,12 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
23432367
transno,
23442368
aggno;
23452369
int phase;
2370+
List *combined_inputeval;
23462371
ListCell *l;
23472372
Bitmapset *all_grouped_cols = NULL;
23482373
int numGroupingSets = 1;
23492374
int numPhases;
2375+
int column_offset;
23502376
int i = 0;
23512377
int j = 0;
23522378

@@ -2928,6 +2954,53 @@ ExecInitAgg(Agg *node, EState *estate, int eflags)
29282954
aggstate->numaggs = aggno + 1;
29292955
aggstate->numtrans = transno + 1;
29302956

2957+
/*
2958+
* Build a single projection computing the aggregate arguments for all
2959+
* aggregates at once, that's considerably faster than doing it separately
2960+
* for each.
2961+
*
2962+
* First create a targetlist combining the targetlist of all the
2963+
* transitions.
2964+
*/
2965+
combined_inputeval = NIL;
2966+
column_offset = 0;
2967+
for (transno = 0; transno < aggstate->numtrans; transno++)
2968+
{
2969+
AggStatePerTrans pertrans = &pertransstates[transno];
2970+
ListCell *arg;
2971+
2972+
pertrans->inputoff = column_offset;
2973+
2974+
/*
2975+
* Adjust resno in a copied target entries, to point into the combined
2976+
* slot.
2977+
*/
2978+
foreach(arg, pertrans->aggref->args)
2979+
{
2980+
TargetEntry *source_tle = (TargetEntry *) lfirst(arg);
2981+
TargetEntry *tle;
2982+
2983+
Assert(IsA(source_tle, TargetEntry));
2984+
tle = flatCopyTargetEntry(source_tle);
2985+
tle->resno += column_offset;
2986+
2987+
combined_inputeval = lappend(combined_inputeval, tle);
2988+
}
2989+
2990+
column_offset += list_length(pertrans->aggref->args);
2991+
}
2992+
2993+
/* and then create a projection for that targetlist */
2994+
aggstate->evaldesc = ExecTypeFromTL(combined_inputeval, false);
2995+
aggstate->evalslot = ExecInitExtraTupleSlot(estate);
2996+
combined_inputeval = (List *) ExecInitExpr((Expr *) combined_inputeval,
2997+
(PlanState *) aggstate);
2998+
aggstate->evalproj = ExecBuildProjectionInfo(combined_inputeval,
2999+
aggstate->tmpcontext,
3000+
aggstate->evalslot,
3001+
NULL);
3002+
ExecSetSlotDescriptor(aggstate->evalslot, aggstate->evaldesc);
3003+
29313004
return aggstate;
29323005
}
29333006

@@ -3098,24 +3171,12 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,
30983171

30993172
}
31003173

3101-
/*
3102-
* Get a tupledesc corresponding to the aggregated inputs (including sort
3103-
* expressions) of the agg.
3104-
*/
3105-
pertrans->evaldesc = ExecTypeFromTL(aggref->args, false);
3106-
3107-
/* Create slot we're going to do argument evaluation in */
3108-
pertrans->evalslot = ExecInitExtraTupleSlot(estate);
3109-
ExecSetSlotDescriptor(pertrans->evalslot, pertrans->evaldesc);
3110-
31113174
/* Initialize the input and FILTER expressions */
31123175
naggs = aggstate->numaggs;
31133176
pertrans->aggfilter = ExecInitExpr(aggref->aggfilter,
31143177
(PlanState *) aggstate);
31153178
pertrans->aggdirectargs = (List *) ExecInitExpr((Expr *) aggref->aggdirectargs,
31163179
(PlanState *) aggstate);
3117-
pertrans->args = (List *) ExecInitExpr((Expr *) aggref->args,
3118-
(PlanState *) aggstate);
31193180

31203181
/*
31213182
* Complain if the aggregate's arguments contain any aggregates; nested
@@ -3127,12 +3188,6 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,
31273188
(errcode(ERRCODE_GROUPING_ERROR),
31283189
errmsg("aggregate function calls cannot be nested")));
31293190

3130-
/* Set up projection info for evaluation */
3131-
pertrans->evalproj = ExecBuildProjectionInfo(pertrans->args,
3132-
aggstate->tmpcontext,
3133-
pertrans->evalslot,
3134-
NULL);
3135-
31363191
/*
31373192
* If we're doing either DISTINCT or ORDER BY for a plain agg, then we
31383193
* have a list of SortGroupClause nodes; fish out the data in them and
@@ -3165,6 +3220,14 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,
31653220

31663221
if (numSortCols > 0)
31673222
{
3223+
/*
3224+
* Get a tupledesc and slot corresponding to the aggregated inputs
3225+
* (including sort expressions) of the agg.
3226+
*/
3227+
pertrans->sortdesc = ExecTypeFromTL(aggref->args, false);
3228+
pertrans->sortslot = ExecInitExtraTupleSlot(estate);
3229+
ExecSetSlotDescriptor(pertrans->sortslot, pertrans->sortdesc);
3230+
31683231
/*
31693232
* We don't implement DISTINCT or ORDER BY aggs in the HASHED case
31703233
* (yet)
@@ -3183,7 +3246,7 @@ build_pertrans_for_aggref(AggStatePerTrans pertrans,
31833246
/* we will need an extra slot to store prior values */
31843247
pertrans->uniqslot = ExecInitExtraTupleSlot(estate);
31853248
ExecSetSlotDescriptor(pertrans->uniqslot,
3186-
pertrans->evaldesc);
3249+
pertrans->sortdesc);
31873250
}
31883251

31893252
/* Extract the sort information for use later */

src/include/nodes/execnodes.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1863,6 +1863,10 @@ typedef struct AggState
18631863
List *hash_needed; /* list of columns needed in hash table */
18641864
bool table_filled; /* hash table filled yet? */
18651865
TupleHashIterator hashiter; /* for iterating through hash table */
1866+
/* support for evaluation of agg inputs */
1867+
TupleTableSlot *evalslot; /* slot for agg inputs */
1868+
ProjectionInfo *evalproj; /* projection machinery */
1869+
TupleDesc evaldesc; /* descriptor of input tuples */
18661870
} AggState;
18671871

18681872
/* ----------------

0 commit comments

Comments
 (0)
0