1
0
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:
Bruce Momjian
1998-01-15 19:00:16 +00:00
parent f22d8e6668
commit 763ff8aef8
20 changed files with 173 additions and 272 deletions

View File

@@ -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)
{

View File

@@ -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
*

View File

@@ -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

View File

@@ -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);
}