]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Add UNION, GROUP, DISTINCT to INSERT.
authorBruce Momjian <bruce@momjian.us>
Sun, 11 Jan 1998 03:41:57 +0000 (03:41 +0000)
committerBruce Momjian <bruce@momjian.us>
Sun, 11 Jan 1998 03:41:57 +0000 (03:41 +0000)
src/backend/parser/analyze.c
src/backend/parser/gram.y
src/include/nodes/parsenodes.h
src/man/insert.l

index d806ec2059c0709a6015c97f1dce4e95a2c5de2b..dcb9eecb5db5cb01420c9b204f24a357e8b0410b 100644 (file)
@@ -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;
 }
 
index d79fa91bd424664fd5b7bbb38f2c64e76bfc8c62..38513e4cd96bdca5517456b0ff7c17718570febe 100644 (file)
@@ -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;
                                }
                ;
 
index 9bc99568573656b173613e30c3c3e6857bea6a5e..65718fc6e16d47f308994ff1a3b0b7266fcc86a7 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: parsenodes.h,v 1.42 1998/01/10 04:30:11 momjian Exp $
+ * $Id: parsenodes.h,v 1.43 1998/01/11 03:41:49 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -574,10 +574,15 @@ typedef struct InsertStmt
 {
        NodeTag         type;
        char       *relname;            /* relation to insert into */
+       char       *unique;                     /* NULL, '*', or unique attribute name */
        List       *cols;                       /* names of the columns */
        List       *targetList;         /* the target list (of ResTarget) */
        List       *fromClause;         /* the from clause */
        Node       *whereClause;        /* qualifications */
+       List       *groupClause;        /* group by clause */
+       Node       *havingClause;       /* having conditional-expression */
+       List       *unionClause;        /* union subselect parameters */
+       bool            unionall;               /* union without unique sort */
 } InsertStmt;
 
 /* ----------------------
index 51624cf97863750f2c318d5a58c506f65cc63d42..0b1fa87f45ca0bb37f651403db5a0bdf82858568 100644 (file)
@@ -1,6 +1,6 @@
 .\" This is -*-nroff-*-
 .\" XXX standard disclaimer belongs here....
-.\" $Header: /cvsroot/pgsql/src/man/Attic/insert.l,v 1.5 1997/09/27 03:14:19 momjian Exp $
+.\" $Header: /cvsroot/pgsql/src/man/Attic/insert.l,v 1.6 1998/01/11 03:41:57 momjian Exp $
 .TH INSERT SQL 11/05/95 PostgreSQL PostgreSQL
 .SH NAME
 insert \(em insert tuples to a relation
@@ -11,6 +11,8 @@ insert \(em insert tuples to a relation
        {\fBvalues\fR (expression1 [,expression-i] ) |
     \fBselect\fR expression1 [,expression-i]
        [\fBfrom\fR from-list] [\fBwhere\fR qual] 
+    [\fBgroup by\fR attr_name1 {, attr_name-i....}]
+       [\fBunion {all} select\fR ...]
 .fi
 .SH DESCRIPTION
 .BR Insert