Commit 600c958a authored by Bruce Momjian's avatar Bruce Momjian

Add UNION, GROUP, DISTINCT to INSERT.

parent d70df16a
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -241,7 +241,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
/* set up a range table */ /* set up a range table */
makeRangeTable(pstate, stmt->relname, stmt->fromClause); makeRangeTable(pstate, stmt->relname, stmt->fromClause);
qry->uniqueFlag = NULL; qry->uniqueFlag = stmt->unique;
/* fix the target list */ /* fix the target list */
icolumns = pstate->p_insert_columns = makeTargetNames(pstate, stmt->cols); icolumns = pstate->p_insert_columns = makeTargetNames(pstate, stmt->cols);
...@@ -315,13 +315,31 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt) ...@@ -315,13 +315,31 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
/* fix where clause */ /* fix where clause */
qry->qual = transformWhereClause(pstate, stmt->whereClause); 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 */ /* now the range table will not change */
qry->rtable = pstate->p_rtable; qry->rtable = pstate->p_rtable;
qry->resultRelation = refnameRangeTablePosn(pstate->p_rtable, stmt->relname); 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) if (pstate->p_numAgg > 0)
finalizeAggregates(pstate, qry); finalizeAggregates(pstate, qry);
qry->unionall = stmt->unionall; /* in child, so unionClause may be false */
qry->unionClause = transformUnionClause(stmt->unionClause, qry->targetList);
return (Query *) qry; return (Query *) qry;
} }
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* *
* *
* IDENTIFICATION * 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 * HISTORY
* AUTHOR DATE MAJOR EVENT * AUTHOR DATE MAJOR EVENT
...@@ -2146,16 +2146,27 @@ InsertStmt: INSERT INTO relation_name opt_column_list insert_rest ...@@ -2146,16 +2146,27 @@ InsertStmt: INSERT INTO relation_name opt_column_list insert_rest
insert_rest: VALUES '(' res_target_list2 ')' insert_rest: VALUES '(' res_target_list2 ')'
{ {
$$ = makeNode(InsertStmt); $$ = makeNode(InsertStmt);
$$->unique = NULL;
$$->targetList = $3; $$->targetList = $3;
$$->fromClause = NIL; $$->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); $$ = makeNode(InsertStmt);
$$->targetList = $2; $$->unique = $2;
$$->fromClause = $3; $$->targetList = $3;
$$->whereClause = $4; $$->fromClause = $4;
$$->whereClause = $5;
$$->groupClause = $6;
$$->havingClause = $7;
$$->unionClause = $8;
} }
; ;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Copyright (c) 1994, Regents of the University of California * 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 ...@@ -574,10 +574,15 @@ typedef struct InsertStmt
{ {
NodeTag type; NodeTag type;
char *relname; /* relation to insert into */ char *relname; /* relation to insert into */
char *unique; /* NULL, '*', or unique attribute name */
List *cols; /* names of the columns */ List *cols; /* names of the columns */
List *targetList; /* the target list (of ResTarget) */ List *targetList; /* the target list (of ResTarget) */
List *fromClause; /* the from clause */ List *fromClause; /* the from clause */
Node *whereClause; /* qualifications */ 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; } InsertStmt;
/* ---------------------- /* ----------------------
......
.\" This is -*-nroff-*- .\" This is -*-nroff-*-
.\" XXX standard disclaimer belongs here.... .\" 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 .TH INSERT SQL 11/05/95 PostgreSQL PostgreSQL
.SH NAME .SH NAME
insert \(em insert tuples to a relation insert \(em insert tuples to a relation
...@@ -11,6 +11,8 @@ insert \(em insert tuples to a relation ...@@ -11,6 +11,8 @@ insert \(em insert tuples to a relation
{\fBvalues\fR (expression1 [,expression-i] ) | {\fBvalues\fR (expression1 [,expression-i] ) |
\fBselect\fR expression1 [,expression-i] \fBselect\fR expression1 [,expression-i]
[\fBfrom\fR from-list] [\fBwhere\fR qual] [\fBfrom\fR from-list] [\fBwhere\fR qual]
[\fBgroup by\fR attr_name1 {, attr_name-i....}]
[\fBunion {all} select\fR ...]
.fi .fi
.SH DESCRIPTION .SH DESCRIPTION
.BR Insert .BR Insert
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment