aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/parser/analyze.c22
-rw-r--r--src/backend/parser/gram.y23
-rw-r--r--src/include/nodes/parsenodes.h7
-rw-r--r--src/man/insert.l4
4 files changed, 46 insertions, 10 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;
}
;
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 9bc99568573..65718fc6e16 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -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;
/* ----------------------
diff --git a/src/man/insert.l b/src/man/insert.l
index 51624cf9786..0b1fa87f45c 100644
--- a/src/man/insert.l
+++ b/src/man/insert.l
@@ -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