aboutsummaryrefslogtreecommitdiff
path: root/src/backend/nodes/outfuncs.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2000-09-29 18:21:41 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2000-09-29 18:21:41 +0000
commit3a94e789f5c9537d804210be3cb26f7fb08e3b9e (patch)
treef1eac12405e3c0ded881d7dd7e59cec35b30c335 /src/backend/nodes/outfuncs.c
parent6f64c2e54a0b14154a335249f4dca91a39c61c50 (diff)
downloadpostgresql-3a94e789f5c9537d804210be3cb26f7fb08e3b9e.tar.gz
postgresql-3a94e789f5c9537d804210be3cb26f7fb08e3b9e.zip
Subselects in FROM clause, per ISO syntax: FROM (SELECT ...) [AS] alias.
(Don't forget that an alias is required.) Views reimplemented as expanding to subselect-in-FROM. Grouping, aggregates, DISTINCT in views actually work now (he says optimistically). No UNION support in subselects/views yet, but I have some ideas about that. Rule-related permissions checking moved out of rewriter and into executor. INITDB REQUIRED!
Diffstat (limited to 'src/backend/nodes/outfuncs.c')
-rw-r--r--src/backend/nodes/outfuncs.c130
1 files changed, 77 insertions, 53 deletions
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 8b24b82122f..39bc497343b 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.126 2000/09/12 21:06:49 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/nodes/outfuncs.c,v 1.127 2000/09/29 18:21:29 tgl Exp $
*
* NOTES
* Every (plan) node in POSTGRES has an associated "out" routine which
@@ -220,6 +220,9 @@ _outQuery(StringInfo str, Query *node)
if (node->utilityStmt)
{
+ /*
+ * Hack to make up for lack of outfuncs for utility-stmt nodes
+ */
switch (nodeTag(node->utilityStmt))
{
case T_CreateStmt:
@@ -239,7 +242,7 @@ _outQuery(StringInfo str, Query *node)
break;
case T_NotifyStmt:
- appendStringInfo(str, " :utility ");
+ appendStringInfo(str, " :notify ");
_outToken(str, ((NotifyStmt *) (node->utilityStmt))->relname);
break;
@@ -250,32 +253,34 @@ _outQuery(StringInfo str, Query *node)
else
appendStringInfo(str, " :utility <>");
- appendStringInfo(str, " :resultRelation %u :into ",
+ appendStringInfo(str, " :resultRelation %d :into ",
node->resultRelation);
_outToken(str, node->into);
- appendStringInfo(str,
- " :isPortal %s :isBinary %s :isTemp %s :unionall %s :distinctClause ",
+ appendStringInfo(str, " :isPortal %s :isBinary %s :isTemp %s"
+ " :unionall %s :hasAggs %s :hasSubLinks %s :rtable ",
node->isPortal ? "true" : "false",
node->isBinary ? "true" : "false",
node->isTemp ? "true" : "false",
- node->unionall ? "true" : "false");
- _outNode(str, node->distinctClause);
-
- appendStringInfo(str, " :sortClause ");
- _outNode(str, node->sortClause);
-
- appendStringInfo(str, " :rtable ");
+ node->unionall ? "true" : "false",
+ node->hasAggs ? "true" : "false",
+ node->hasSubLinks ? "true" : "false");
_outNode(str, node->rtable);
appendStringInfo(str, " :jointree ");
_outNode(str, node->jointree);
- appendStringInfo(str, " :targetlist ");
+ appendStringInfo(str, " :targetList ");
_outNode(str, node->targetList);
- appendStringInfo(str, " :qual ");
- _outNode(str, node->qual);
+ appendStringInfo(str, " :rowMarks ");
+ _outIntList(str, node->rowMarks);
+
+ appendStringInfo(str, " :distinctClause ");
+ _outNode(str, node->distinctClause);
+
+ appendStringInfo(str, " :sortClause ");
+ _outNode(str, node->sortClause);
appendStringInfo(str, " :groupClause ");
_outNode(str, node->groupClause);
@@ -283,23 +288,17 @@ _outQuery(StringInfo str, Query *node)
appendStringInfo(str, " :havingQual ");
_outNode(str, node->havingQual);
- appendStringInfo(str, " :hasAggs %s :hasSubLinks %s :unionClause ",
- node->hasAggs ? "true" : "false",
- node->hasSubLinks ? "true" : "false");
- _outNode(str, node->unionClause);
-
appendStringInfo(str, " :intersectClause ");
_outNode(str, node->intersectClause);
+ appendStringInfo(str, " :unionClause ");
+ _outNode(str, node->unionClause);
+
appendStringInfo(str, " :limitOffset ");
_outNode(str, node->limitOffset);
appendStringInfo(str, " :limitCount ");
_outNode(str, node->limitCount);
-
- appendStringInfo(str, " :rowMark ");
- _outNode(str, node->rowMark);
-
}
static void
@@ -536,6 +535,19 @@ _outTidScan(StringInfo str, TidScan *node)
}
/*
+ * SubqueryScan is a subclass of Scan
+ */
+static void
+_outSubqueryScan(StringInfo str, SubqueryScan *node)
+{
+ appendStringInfo(str, " SUBQUERYSCAN ");
+ _outPlanInfo(str, (Plan *) node);
+
+ appendStringInfo(str, " :scanrelid %u :subplan ", node->scan.scanrelid);
+ _outNode(str, node->subplan);
+}
+
+/*
* Material is a subclass of Plan
*/
static void
@@ -864,6 +876,18 @@ _outRangeTblRef(StringInfo str, RangeTblRef *node)
}
/*
+ * FromExpr
+ */
+static void
+_outFromExpr(StringInfo str, FromExpr *node)
+{
+ appendStringInfo(str, " FROMEXPR :fromlist ");
+ _outNode(str, node->fromlist);
+ appendStringInfo(str, " :quals ");
+ _outNode(str, node->quals);
+}
+
+/*
* JoinExpr
*/
static void
@@ -916,36 +940,33 @@ _outRelOptInfo(StringInfo str, RelOptInfo *node)
appendStringInfo(str, " RELOPTINFO :relids ");
_outIntList(str, node->relids);
- appendStringInfo(str,
- " :rows %.0f :width %d :indexed %s :pages %ld :tuples %.0f :targetlist ",
+ appendStringInfo(str, " :rows %.0f :width %d :targetlist ",
node->rows,
- node->width,
- node->indexed ? "true" : "false",
- node->pages,
- node->tuples);
+ node->width);
_outNode(str, node->targetlist);
appendStringInfo(str, " :pathlist ");
_outNode(str, node->pathlist);
-
appendStringInfo(str, " :cheapest_startup_path ");
_outNode(str, node->cheapest_startup_path);
appendStringInfo(str, " :cheapest_total_path ");
_outNode(str, node->cheapest_total_path);
- appendStringInfo(str,
- " :pruneable %s :baserestrictinfo ",
- node->pruneable ? "true" : "false");
- _outNode(str, node->baserestrictinfo);
+ appendStringInfo(str, " :pruneable %s :issubquery %s :indexed %s :pages %ld :tuples %.0f :subplan ",
+ node->pruneable ? "true" : "false",
+ node->issubquery ? "true" : "false",
+ node->indexed ? "true" : "false",
+ node->pages,
+ node->tuples);
+ _outNode(str, node->subplan);
- appendStringInfo(str,
- " :baserestrictcost %.2f :outerjoinset ",
+ appendStringInfo(str, " :baserestrictinfo ");
+ _outNode(str, node->baserestrictinfo);
+ appendStringInfo(str, " :baserestrictcost %.2f :outerjoinset ",
node->baserestrictcost);
_outIntList(str, node->outerjoinset);
-
appendStringInfo(str, " :joininfo ");
_outNode(str, node->joininfo);
-
appendStringInfo(str, " :innerjoin ");
_outNode(str, node->innerjoin);
}
@@ -977,21 +998,21 @@ _outRangeTblEntry(StringInfo str, RangeTblEntry *node)
{
appendStringInfo(str, " RTE :relname ");
_outToken(str, node->relname);
- appendStringInfo(str, " :relid %u :alias ",
+ appendStringInfo(str, " :relid %u ",
node->relid);
+ appendStringInfo(str, " :subquery ");
+ _outNode(str, node->subquery);
+ appendStringInfo(str, " :alias ");
_outNode(str, node->alias);
appendStringInfo(str, " :eref ");
_outNode(str, node->eref);
- appendStringInfo(str, " :inh %s :inFromCl %s :skipAcl %s",
+ appendStringInfo(str, " :inh %s :inFromCl %s :checkForRead %s"
+ " :checkForWrite %s :checkAsUser %u",
node->inh ? "true" : "false",
node->inFromCl ? "true" : "false",
- node->skipAcl ? "true" : "false");
-}
-
-static void
-_outRowMark(StringInfo str, RowMark *node)
-{
- appendStringInfo(str, " ROWMARK :rti %u :info %u", node->rti, node->info);
+ node->checkForRead ? "true" : "false",
+ node->checkForWrite ? "true" : "false",
+ node->checkAsUser);
}
/*
@@ -1151,8 +1172,8 @@ _outRestrictInfo(StringInfo str, RestrictInfo *node)
appendStringInfo(str, " RESTRICTINFO :clause ");
_outNode(str, node->clause);
- appendStringInfo(str, " :isjoinqual %s :subclauseindices ",
- node->isjoinqual ? "true" : "false");
+ appendStringInfo(str, " :ispusheddown %s :subclauseindices ",
+ node->ispusheddown ? "true" : "false");
_outNode(str, node->subclauseindices);
appendStringInfo(str, " :mergejoinoperator %u ", node->mergejoinoperator);
@@ -1492,6 +1513,9 @@ _outNode(StringInfo str, void *obj)
case T_TidScan:
_outTidScan(str, obj);
break;
+ case T_SubqueryScan:
+ _outSubqueryScan(str, obj);
+ break;
case T_Material:
_outMaterial(str, obj);
break;
@@ -1555,6 +1579,9 @@ _outNode(StringInfo str, void *obj)
case T_RangeTblRef:
_outRangeTblRef(str, obj);
break;
+ case T_FromExpr:
+ _outFromExpr(str, obj);
+ break;
case T_JoinExpr:
_outJoinExpr(str, obj);
break;
@@ -1573,9 +1600,6 @@ _outNode(StringInfo str, void *obj)
case T_RangeTblEntry:
_outRangeTblEntry(str, obj);
break;
- case T_RowMark:
- _outRowMark(str, obj);
- break;
case T_Path:
_outPath(str, obj);
break;