mirror of
https://github.com/postgres/postgres.git
synced 2025-11-12 05:01:15 +03:00
Remove Query->qry_aggs and qry_numaggs and replace with Query->hasAggs.
Pass List* of Aggregs into executor, and create needed array there. No longer need to double-processs Aggregs with second copy in Query. Fix crash when doing: select sum(x+1) from test where 1 > 0;
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.29 1998/01/11 20:01:53 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v 1.30 1998/01/15 18:59:20 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -493,15 +493,10 @@ static Agg *
|
||||
_copyAgg(Agg *from)
|
||||
{
|
||||
Agg *newnode = makeNode(Agg);
|
||||
int i;
|
||||
|
||||
CopyPlanFields((Plan *) from, (Plan *) newnode);
|
||||
|
||||
newnode->numAgg = from->numAgg;
|
||||
newnode->aggs = palloc(sizeof(Aggreg *));
|
||||
for (i = 0; i < from->numAgg; i++)
|
||||
newnode->aggs[i] = copyObject(from->aggs[i]);
|
||||
|
||||
Node_Copy(from, newnode, aggs);
|
||||
Node_Copy(from, newnode, aggstate);
|
||||
|
||||
return newnode;
|
||||
@@ -1495,7 +1490,6 @@ static Query *
|
||||
_copyQuery(Query *from)
|
||||
{
|
||||
Query *newnode = makeNode(Query);
|
||||
int i;
|
||||
|
||||
newnode->commandType = from->commandType;
|
||||
if (from->utilityStmt && nodeTag(from->utilityStmt) == T_NotifyStmt)
|
||||
@@ -1522,14 +1516,7 @@ _copyQuery(Query *from)
|
||||
Node_Copy(from, newnode, groupClause);
|
||||
Node_Copy(from, newnode, havingQual);
|
||||
|
||||
newnode->qry_numAgg = from->qry_numAgg;
|
||||
if (from->qry_numAgg > 0)
|
||||
{
|
||||
newnode->qry_aggs =
|
||||
(Aggreg **) palloc(sizeof(Aggreg *) * from->qry_numAgg);
|
||||
for (i=0; i < from->qry_numAgg; i++)
|
||||
newnode->qry_aggs[i] = _copyAggreg(from->qry_aggs[i]);
|
||||
}
|
||||
newnode->hasAggs = from->hasAggs;
|
||||
|
||||
if (from->unionClause)
|
||||
{
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/list.c,v 1.10 1998/01/07 21:03:29 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/list.c,v 1.11 1998/01/15 18:59:23 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* XXX a few of the following functions are duplicated to handle
|
||||
@@ -89,6 +89,48 @@ lappendi(List *list, int datum)
|
||||
return nconc(list, lconsi(datum, NIL));
|
||||
}
|
||||
|
||||
List *
|
||||
nconc(List *l1, List *l2)
|
||||
{
|
||||
List *temp;
|
||||
|
||||
if (l1 == NIL)
|
||||
return l2;
|
||||
if (l2 == NIL)
|
||||
return l1;
|
||||
if (l1 == l2)
|
||||
elog(ERROR, "tryout to nconc a list to itself");
|
||||
|
||||
for (temp = l1; lnext(temp) != NULL; temp = lnext(temp))
|
||||
;
|
||||
|
||||
lnext(temp) = l2;
|
||||
return (l1); /* list1 is now list1[]list2 */
|
||||
}
|
||||
|
||||
|
||||
List *
|
||||
nreverse(List *list)
|
||||
{
|
||||
List *rlist = NIL;
|
||||
List *p = NIL;
|
||||
|
||||
if (list == NULL)
|
||||
return (NIL);
|
||||
|
||||
if (length(list) == 1)
|
||||
return (list);
|
||||
|
||||
for (p = list; p != NULL; p = lnext(p))
|
||||
{
|
||||
rlist = lcons(lfirst(p), rlist);
|
||||
}
|
||||
|
||||
lfirst(list) = lfirst(rlist);
|
||||
lnext(list) = lnext(rlist);
|
||||
return (list);
|
||||
}
|
||||
|
||||
Value *
|
||||
makeInteger(long i)
|
||||
{
|
||||
@@ -227,48 +269,6 @@ intAppend(List *l1, List *l2)
|
||||
return newlist;
|
||||
}
|
||||
|
||||
List *
|
||||
nconc(List *l1, List *l2)
|
||||
{
|
||||
List *temp;
|
||||
|
||||
if (l1 == NIL)
|
||||
return l2;
|
||||
if (l2 == NIL)
|
||||
return l1;
|
||||
if (l1 == l2)
|
||||
elog(ERROR, "tryout to nconc a list to itself");
|
||||
|
||||
for (temp = l1; lnext(temp) != NULL; temp = lnext(temp))
|
||||
;
|
||||
|
||||
lnext(temp) = l2;
|
||||
return (l1); /* list1 is now list1[]list2 */
|
||||
}
|
||||
|
||||
|
||||
List *
|
||||
nreverse(List *list)
|
||||
{
|
||||
List *rlist = NIL;
|
||||
List *p = NIL;
|
||||
|
||||
if (list == NULL)
|
||||
return (NIL);
|
||||
|
||||
if (length(list) == 1)
|
||||
return (list);
|
||||
|
||||
for (p = list; p != NULL; p = lnext(p))
|
||||
{
|
||||
rlist = lcons(lfirst(p), rlist);
|
||||
}
|
||||
|
||||
lfirst(list) = lfirst(rlist);
|
||||
lnext(list) = lnext(rlist);
|
||||
return (list);
|
||||
}
|
||||
|
||||
/*
|
||||
* same
|
||||
*
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.20 1998/01/07 15:32:25 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.21 1998/01/15 18:59:26 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Every (plan) node in POSTGRES has an associated "out" routine which
|
||||
@@ -163,7 +163,6 @@ static void
|
||||
_outQuery(StringInfo str, Query *node)
|
||||
{
|
||||
char buf[500];
|
||||
int i;
|
||||
|
||||
appendStringInfo(str, "QUERY");
|
||||
|
||||
@@ -229,12 +228,8 @@ _outQuery(StringInfo str, Query *node)
|
||||
_outNode(str, node->groupClause);
|
||||
appendStringInfo(str, " :havingQual ");
|
||||
_outNode(str, node->havingQual);
|
||||
appendStringInfo(str, " :qry_numAgg ");
|
||||
sprintf(buf, " %d ", node->qry_numAgg);
|
||||
appendStringInfo(str, buf);
|
||||
appendStringInfo(str, " :qry_aggs ");
|
||||
for (i=0; i < node->qry_numAgg; i++)
|
||||
_outNode(str, node->qry_aggs[i]);
|
||||
appendStringInfo(str, " :hasAggs ");
|
||||
appendStringInfo(str, (node->hasAggs ? "true" : "false"));
|
||||
appendStringInfo(str, " :unionClause ");
|
||||
_outNode(str, node->unionClause);
|
||||
}
|
||||
@@ -505,14 +500,12 @@ _outSort(StringInfo str, Sort *node)
|
||||
static void
|
||||
_outAgg(StringInfo str, Agg *node)
|
||||
{
|
||||
char buf[500];
|
||||
|
||||
appendStringInfo(str, "AGG");
|
||||
_outPlanInfo(str, (Plan *) node);
|
||||
|
||||
/* the actual Agg fields */
|
||||
sprintf(buf, " :numagg %d ", node->numAgg);
|
||||
appendStringInfo(str, buf);
|
||||
appendStringInfo(str, " :aggs ");
|
||||
_outNode(str, node->aggs);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.17 1998/01/07 21:03:37 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/nodes/readfuncs.c,v 1.18 1998/01/15 18:59:31 momjian Exp $
|
||||
*
|
||||
* NOTES
|
||||
* Most of the read functions for plan nodes are tested. (In fact, they
|
||||
@@ -76,7 +76,6 @@ _readQuery()
|
||||
Query *local_node;
|
||||
char *token;
|
||||
int length;
|
||||
int i;
|
||||
|
||||
local_node = makeNode(Query);
|
||||
|
||||
@@ -153,19 +152,9 @@ _readQuery()
|
||||
token = lsptok(NULL, &length); /* skip :havingQual */
|
||||
local_node->havingQual = nodeRead(true);
|
||||
|
||||
token = lsptok(NULL, &length); /* skip the :qry_numAgg */
|
||||
token = lsptok(NULL, &length); /* get qry_numAgg */
|
||||
local_node->qry_numAgg = atoi(token);
|
||||
|
||||
token = lsptok(NULL, &length); /* skip the :qry_Aggs */
|
||||
if (local_node->qry_numAgg == 0)
|
||||
local_node->qry_aggs = NULL;
|
||||
else
|
||||
{
|
||||
local_node->qry_aggs = palloc(sizeof(Aggreg *) * local_node->qry_numAgg);
|
||||
for (i=0; i < local_node->qry_numAgg; i++)
|
||||
local_node->qry_aggs[i] = nodeRead(true);
|
||||
}
|
||||
token = lsptok(NULL, &length); /* skip the :hasAggs */
|
||||
token = lsptok(NULL, &length); /* get hasAggs */
|
||||
local_node->hasAggs = (token[0] == 't') ? true : false;
|
||||
|
||||
token = lsptok(NULL, &length); /* skip :unionClause */
|
||||
local_node->unionClause = nodeRead(true);
|
||||
@@ -618,9 +607,8 @@ _readAgg()
|
||||
local_node = makeNode(Agg);
|
||||
_getPlan((Plan *) local_node);
|
||||
|
||||
token = lsptok(NULL, &length); /* eat :numagg */
|
||||
token = lsptok(NULL, &length); /* get numagg */
|
||||
local_node->numAgg = atoi(token);
|
||||
token = lsptok(NULL, &length); /* eat :agg */
|
||||
local_node->aggs = nodeRead(true); /* now read it */
|
||||
|
||||
return (local_node);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user