diff options
author | Bruce Momjian <bruce@momjian.us> | 1998-01-11 03:41:57 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 1998-01-11 03:41:57 +0000 |
commit | 600c958a302a3c48b6ee1d4c472eeed4f0fcd392 (patch) | |
tree | 1a8e920372a747fabf6ad23fbe8fe477ce572547 /src/backend | |
parent | d70df16a76603e806e32e68da85c8fd8fc13cc5a (diff) | |
download | postgresql-600c958a302a3c48b6ee1d4c472eeed4f0fcd392.tar.gz postgresql-600c958a302a3c48b6ee1d4c472eeed4f0fcd392.zip |
Add UNION, GROUP, DISTINCT to INSERT.
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/parser/analyze.c | 22 | ||||
-rw-r--r-- | src/backend/parser/gram.y | 23 |
2 files changed, 37 insertions, 8 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index d806ec2059c..dcb9eecb5db 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.63 1998/01/10 04:29:47 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.64 1998/01/11 03:41:35 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -241,7 +241,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt) /* set up a range table */ makeRangeTable(pstate, stmt->relname, stmt->fromClause); - qry->uniqueFlag = NULL; + qry->uniqueFlag = stmt->unique; /* fix the target list */ icolumns = pstate->p_insert_columns = makeTargetNames(pstate, stmt->cols); @@ -315,13 +315,31 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt) /* fix where clause */ qry->qual = transformWhereClause(pstate, stmt->whereClause); + /* check having clause */ + if (stmt->havingClause) + elog(NOTICE, "HAVING not yet supported; ignore clause", NULL); + /* now the range table will not change */ qry->rtable = pstate->p_rtable; qry->resultRelation = refnameRangeTablePosn(pstate->p_rtable, stmt->relname); + qry->groupClause = transformGroupClause(pstate, + stmt->groupClause, + qry->targetList); + + /* fix order clause */ + qry->sortClause = transformSortClause(pstate, + NIL, + NIL, + qry->targetList, + qry->uniqueFlag); + if (pstate->p_numAgg > 0) finalizeAggregates(pstate, qry); + qry->unionall = stmt->unionall; /* in child, so unionClause may be false */ + qry->unionClause = transformUnionClause(stmt->unionClause, qry->targetList); + return (Query *) qry; } diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index d79fa91bd42..38513e4cd96 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.88 1998/01/10 04:29:50 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 1.89 1998/01/11 03:41:38 momjian Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -2146,16 +2146,27 @@ InsertStmt: INSERT INTO relation_name opt_column_list insert_rest insert_rest: VALUES '(' res_target_list2 ')' { $$ = makeNode(InsertStmt); + $$->unique = NULL; $$->targetList = $3; $$->fromClause = NIL; - $$->whereClause = NULL; + $$->whereClause = NIL; + $$->groupClause = NIL; + $$->havingClause = NIL; + $$->unionClause = NIL; } - | SELECT res_target_list2 from_clause where_clause + | SELECT opt_unique res_target_list2 + from_clause where_clause + group_clause having_clause + union_clause { $$ = makeNode(InsertStmt); - $$->targetList = $2; - $$->fromClause = $3; - $$->whereClause = $4; + $$->unique = $2; + $$->targetList = $3; + $$->fromClause = $4; + $$->whereClause = $5; + $$->groupClause = $6; + $$->havingClause = $7; + $$->unionClause = $8; } ; |