diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-09-29 18:21:41 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-09-29 18:21:41 +0000 |
commit | 3a94e789f5c9537d804210be3cb26f7fb08e3b9e (patch) | |
tree | f1eac12405e3c0ded881d7dd7e59cec35b30c335 /src/backend/parser/parse_expr.c | |
parent | 6f64c2e54a0b14154a335249f4dca91a39c61c50 (diff) | |
download | postgresql-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/parser/parse_expr.c')
-rw-r--r-- | src/backend/parser/parse_expr.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index a033ff4be22..591fdab8782 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.83 2000/09/12 21:07:02 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_expr.c,v 1.84 2000/09/29 18:21:36 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -175,7 +175,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence) result = ParseFuncOrColumn(pstate, "nullvalue", - lcons(lexpr, NIL), + makeList1(lexpr), false, false, precedence); } @@ -188,7 +188,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence) result = ParseFuncOrColumn(pstate, "nonnullvalue", - lcons(lexpr, NIL), + makeList1(lexpr), false, false, precedence); } @@ -213,7 +213,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence) expr->typeOid = BOOLOID; expr->opType = AND_EXPR; - expr->args = makeList(lexpr, rexpr, -1); + expr->args = makeList2(lexpr, rexpr); result = (Node *) expr; } break; @@ -235,7 +235,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence) typeidTypeName(exprType(rexpr)), typeidTypeName(BOOLOID)); expr->typeOid = BOOLOID; expr->opType = OR_EXPR; - expr->args = makeList(lexpr, rexpr, -1); + expr->args = makeList2(lexpr, rexpr); result = (Node *) expr; } break; @@ -251,7 +251,7 @@ transformExpr(ParseState *pstate, Node *expr, int precedence) typeidTypeName(exprType(rexpr)), typeidTypeName(BOOLOID)); expr->typeOid = BOOLOID; expr->opType = NOT_EXPR; - expr->args = makeList(rexpr, -1); + expr->args = makeList1(rexpr); result = (Node *) expr; } break; @@ -294,7 +294,8 @@ transformExpr(ParseState *pstate, Node *expr, int precedence) break; } pstate->p_hasSubLinks = true; - qtrees = parse_analyze(lcons(sublink->subselect, NIL), pstate); + qtrees = parse_analyze(makeList1(sublink->subselect), + pstate); if (length(qtrees) != 1) elog(ERROR, "Bad query in subselect"); qtree = (Query *) lfirst(qtrees); |