Index: doc/src/sgml/ref/insert.sgml
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/doc/src/sgml/ref/insert.sgml,v
retrieving revision 1.14
diff -c -r1.14 insert.sgml
*** doc/src/sgml/ref/insert.sgml 2001/05/27 09:59:28 1.14
--- doc/src/sgml/ref/insert.sgml 2001/08/22 14:55:30
***************
*** 22,28 ****
INSERT INTO table [ ( column [, ...] ) ]
! { DEFAULT VALUES | VALUES ( expression [, ...] ) | SELECT query }
--- 22,30 ----
INSERT INTO table [ ( column [, ...] ) ]
! { DEFAULT VALUES |
! VALUES ( expression [, ...] ), [ ( expression [, ...] ), ... ] |
! SELECT query }
***************
*** 126,135 ****
! INSERT allows one to insert new rows into a
! table. One can insert
! a single row at a time or several rows as a result of a query.
! The columns in the target list may be listed in any order.
--- 128,137 ----
! INSERT allows one to insert new rows into a table. One can
! insert either a single row or several rows. The rows to be inserted may be
! the result of a query. The columns in the target list may be listed in any
! order.
***************
*** 182,187 ****
--- 184,197 ----
INSERT INTO distributors (name) VALUES ('British Lion');
+
+
+
+
+ Same as above except insert multiple rows into the table:
+
+
+ INSERT INTO distributors (name) VALUES ('Paramount'), ('MGM'), ('Alliance');
Index: src/backend/executor/nodeResult.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/executor/nodeResult.c,v
retrieving revision 1.19
diff -c -r1.19 nodeResult.c
*** src/backend/executor/nodeResult.c 2001/03/22 06:16:13 1.19
--- src/backend/executor/nodeResult.c 2001/08/22 14:55:30
***************
*** 148,157 ****
{
/*
! * if we don't have an outer plan, then we are just generating
! * the results from a constant target list. Do it only once.
*/
! resstate->rs_done = true;
}
/*
--- 148,168 ----
{
/*
! * if we don't have an outer plan, then we are just
! * generating the results from a constant list of target
! * lists. Do it only while the list has elements in it.
! * An item in the list is placed in the pi_targetlist of
! * resstate->cstate.cs_ProjInfo for processing.
*/
! if (node->valueslist == NIL)
! resstate->rs_done = true;
! else
! {
! if (length(node->valueslist) == 1)
! resstate->rs_done = true;
! resstate->cstate.cs_ProjInfo->pi_targetlist = lfirst(node->valueslist);
! node->valueslist = lnext(node->valueslist);
! }
}
/*
Index: src/backend/nodes/copyfuncs.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v
retrieving revision 1.154
diff -c -r1.154 copyfuncs.c
*** src/backend/nodes/copyfuncs.c 2001/08/21 16:36:02 1.154
--- src/backend/nodes/copyfuncs.c 2001/08/22 14:55:30
***************
*** 140,145 ****
--- 140,146 ----
* copy remainder of node
*/
Node_Copy(from, newnode, resconstantqual);
+ Node_Copy(from, newnode, valueslist);
/*
* We must add subplans in resconstantqual to the new plan's subPlan
***************
*** 1795,1801 ****
if (from->relname)
newnode->relname = pstrdup(from->relname);
Node_Copy(from, newnode, cols);
! Node_Copy(from, newnode, targetList);
Node_Copy(from, newnode, selectStmt);
return newnode;
--- 1796,1802 ----
if (from->relname)
newnode->relname = pstrdup(from->relname);
Node_Copy(from, newnode, cols);
! Node_Copy(from, newnode, values);
Node_Copy(from, newnode, selectStmt);
return newnode;
***************
*** 2490,2496 ****
return newnode;
}
-
/* ****************************************************************
* pg_list.h copy functions
--- 2491,2496 ----
Index: src/backend/nodes/equalfuncs.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v
retrieving revision 1.102
diff -c -r1.102 equalfuncs.c
*** src/backend/nodes/equalfuncs.c 2001/08/21 16:36:02 1.102
--- src/backend/nodes/equalfuncs.c 2001/08/22 14:55:30
***************
*** 636,642 ****
return false;
if (!equal(a->cols, b->cols))
return false;
! if (!equal(a->targetList, b->targetList))
return false;
if (!equal(a->selectStmt, b->selectStmt))
return false;
--- 636,642 ----
return false;
if (!equal(a->cols, b->cols))
return false;
! if (!equal(a->values, b->values))
return false;
if (!equal(a->selectStmt, b->selectStmt))
return false;
Index: src/backend/nodes/outfuncs.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/nodes/outfuncs.c,v
retrieving revision 1.145
diff -c -r1.145 outfuncs.c
*** src/backend/nodes/outfuncs.c 2001/08/21 16:36:02 1.145
--- src/backend/nodes/outfuncs.c 2001/08/22 14:55:30
***************
*** 274,279 ****
--- 274,282 ----
appendStringInfo(str, " :targetList ");
_outNode(str, node->targetList);
+ appendStringInfo(str, " :valuesList ");
+ _outNode(str, node->valuesList);
+
appendStringInfo(str, " :groupClause ");
_outNode(str, node->groupClause);
***************
*** 379,387 ****
appendStringInfo(str, " RESULT ");
_outPlanInfo(str, (Plan *) node);
appendStringInfo(str, " :resconstantqual ");
_outNode(str, node->resconstantqual);
-
}
/*
--- 382,392 ----
appendStringInfo(str, " RESULT ");
_outPlanInfo(str, (Plan *) node);
+ appendStringInfo(str, " :valueslist ");
+ _outNode(str, node->valueslist);
+
appendStringInfo(str, " :resconstantqual ");
_outNode(str, node->resconstantqual);
}
/*
Index: src/backend/nodes/readfuncs.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/nodes/readfuncs.c,v
retrieving revision 1.112
diff -c -r1.112 readfuncs.c
*** src/backend/nodes/readfuncs.c 2001/07/03 16:52:48 1.112
--- src/backend/nodes/readfuncs.c 2001/08/22 14:55:30
***************
*** 181,186 ****
--- 181,189 ----
token = pg_strtok(&length); /* skip :targetlist */
local_node->targetList = nodeRead(true);
+ token = pg_strtok(&length); /* skip :valueslist */
+ local_node->valuesList = nodeRead(true);
+
token = pg_strtok(&length); /* skip :groupClause */
local_node->groupClause = nodeRead(true);
***************
*** 366,371 ****
--- 369,377 ----
local_node = makeNode(Result);
_getPlan((Plan *) local_node);
+
+ token = pg_strtok(&length); /* eat :valueslist */
+ local_node->valueslist = nodeRead(true); /* now read it */
token = pg_strtok(&length); /* eat :resconstantqual */
local_node->resconstantqual = nodeRead(true); /* now read it */
Index: src/backend/optimizer/plan/createplan.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/optimizer/plan/createplan.c,v
retrieving revision 1.108
diff -c -r1.108 createplan.c
*** src/backend/optimizer/plan/createplan.c 2001/08/21 16:36:03 1.108
--- src/backend/optimizer/plan/createplan.c 2001/08/22 14:55:31
***************
*** 1818,1823 ****
--- 1818,1824 ----
Result *
make_result(List *tlist,
+ List *vlist,
Node *resconstantqual,
Plan *subplan)
{
***************
*** 1835,1840 ****
--- 1836,1842 ----
plan->righttree = NULL;
node->resconstantqual = resconstantqual;
node->resstate = NULL;
+ node->valueslist = vlist;
return node;
}
Index: src/backend/optimizer/plan/planmain.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/optimizer/plan/planmain.c,v
retrieving revision 1.66
diff -c -r1.66 planmain.c
*** src/backend/optimizer/plan/planmain.c 2001/06/05 05:26:04 1.66
--- src/backend/optimizer/plan/planmain.c 2001/08/22 14:55:31
***************
*** 89,95 ****
root->query_pathkeys = NIL; /* signal unordered result */
/* Make childless Result node to evaluate given tlist. */
! return (Plan *) make_result(tlist, root->jointree->quals,
(Plan *) NULL);
}
--- 89,95 ----
root->query_pathkeys = NIL; /* signal unordered result */
/* Make childless Result node to evaluate given tlist. */
! return (Plan *) make_result(tlist, root->valuesList, root->jointree->quals,
(Plan *) NULL);
}
***************
*** 143,148 ****
--- 143,149 ----
* originally requested tlist.
*/
subplan = (Plan *) make_result(tlist,
+ NIL,
(Node *) constant_quals,
subplan);
}
Index: src/backend/optimizer/plan/planner.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/optimizer/plan/planner.c,v
retrieving revision 1.108
diff -c -r1.108 planner.c
*** src/backend/optimizer/plan/planner.c 2001/06/05 05:26:04 1.108
--- src/backend/optimizer/plan/planner.c 2001/08/22 14:55:31
***************
*** 820,825 ****
--- 820,843 ----
{
List *sub_tlist;
+ /* Process valuesList if it is not NIL */
+ if (parse->valuesList != NIL)
+ {
+ List *newlist = NIL, *elem, *tl;
+ foreach(elem, parse->valuesList)
+ {
+ tl = preprocess_targetlist(lfirst(elem),
+ parse->commandType,
+ parse->resultRelation,
+ parse->rtable);
+ if (newlist == NIL)
+ newlist = makeList1(tl);
+ else
+ lappend(newlist, tl);
+ }
+ parse->valuesList = newlist;
+ }
+
/* Preprocess targetlist in case we are inside an INSERT/UPDATE. */
tlist = preprocess_targetlist(tlist,
parse->commandType,
Index: src/backend/optimizer/prep/prepunion.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v
retrieving revision 1.66
diff -c -r1.66 prepunion.c
*** src/backend/optimizer/prep/prepunion.c 2001/08/14 17:12:57 1.66
--- src/backend/optimizer/prep/prepunion.c 2001/08/22 14:55:31
***************
*** 183,188 ****
--- 183,189 ----
make_result(generate_setop_tlist(colTypes, flag, false,
plan->targetlist,
refnames_tlist),
+ NIL,
NULL,
plan);
}
Index: src/backend/parser/analyze.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/parser/analyze.c,v
retrieving revision 1.196
diff -c -r1.196 analyze.c
*** src/backend/parser/analyze.c 2001/08/21 16:36:03 1.196
--- src/backend/parser/analyze.c 2001/08/22 14:55:31
***************
*** 66,71 ****
--- 66,73 ----
static void release_pstate_resources(ParseState *pstate);
static FromExpr *makeFromExpr(List *fromlist, Node *quals);
+ static List *prepareInsertTargetList(ParseState *pstate, InsertStmt *stmt, List *list);
+
/* kluge to return extra info from transformCreateStmt() */
static List *extras_before;
static List *extras_after;
***************
*** 307,318 ****
Query *qry = makeNode(Query);
List *sub_rtable;
List *sub_namespace;
- List *icolumns;
- List *attrnos;
- List *attnos;
- int numuseratts;
List *tl;
! TupleDesc rd_att;
qry->commandType = CMD_INSERT;
pstate->p_is_insert = true;
--- 309,316 ----
Query *qry = makeNode(Query);
List *sub_rtable;
List *sub_namespace;
List *tl;
! List *list;
qry->commandType = CMD_INSERT;
pstate->p_is_insert = true;
***************
*** 431,442 ****
}
else
{
!
/*
! * For INSERT ... VALUES, transform the given list of values to
! * form a targetlist for the INSERT.
*/
! qry->targetList = transformTargetList(pstate, stmt->targetList);
}
/*
--- 429,450 ----
}
else
{
!
/*
! * No select, so we have a VALUES clause. Transform all lists
! * in values to create qry->valuesList. targetList assignment
! * is done below.
*/
! List *list;
!
! foreach(list, stmt->values)
! {
! List *tl = (List *) lfirst(list);
! if (qry->valuesList == NIL)
! qry->valuesList = makeList1(transformTargetList(pstate, tl));
! else
! lappend(qry->valuesList, transformTargetList(pstate, tl));
! }
}
/*
***************
*** 448,453 ****
--- 456,493 ----
if (pstate->p_last_resno <= pstate->p_target_relation->rd_rel->relnatts)
pstate->p_last_resno = pstate->p_target_relation->rd_rel->relnatts + 1;
+ /* Prepare qry->targetList and possibly qry->valuesList */
+ if (qry->valuesList == NIL)
+ qry->targetList = prepareInsertTargetList(pstate, stmt, qry->targetList);
+ else
+ {
+ foreach(list, qry->valuesList)
+ {
+ List *tl = (List *) lfirst(list);
+ tl = prepareInsertTargetList(pstate, stmt, tl);
+ }
+ qry->targetList = lfirst(qry->valuesList);
+ }
+
+ /* done building the range table and jointree */
+ qry->rtable = pstate->p_rtable;
+ qry->jointree = makeFromExpr(pstate->p_joinlist, NULL);
+
+ qry->hasSubLinks = pstate->p_hasSubLinks;
+ qry->hasAggs = pstate->p_hasAggs;
+ if (pstate->p_hasAggs)
+ parseCheckAggregates(pstate, qry, NULL);
+
+ return qry;
+ }
+
+ static List *
+ prepareInsertTargetList(ParseState *pstate, InsertStmt *stmt, List *list)
+ {
+ List *attrnos, *attnos, *tl, *icolumns;
+ int numuseratts;
+ TupleDesc rd_att;
+
/* Validate stmt->cols list, or build default list if no list given */
icolumns = checkInsertTargets(pstate, stmt->cols, &attrnos);
***************
*** 456,462 ****
*/
numuseratts = 0;
attnos = attrnos;
! foreach(tl, qry->targetList)
{
TargetEntry *tle = (TargetEntry *) lfirst(tl);
Ident *id;
--- 496,502 ----
*/
numuseratts = 0;
attnos = attrnos;
! foreach(tl, list)
{
TargetEntry *tle = (TargetEntry *) lfirst(tl);
Ident *id;
***************
*** 511,523 ****
* expr and correct data for the target column.
*/
te = makeTargetEntry(
! makeResdom(attrno,
! thisatt->atttypid,
! thisatt->atttypmod,
! pstrdup(NameStr(thisatt->attname)),
! false),
! stringToNode(defval[ndef].adbin));
! qry->targetList = lappend(qry->targetList, te);
/*
* Make sure the value is coerced to the target column type
--- 551,563 ----
* expr and correct data for the target column.
*/
te = makeTargetEntry(
! makeResdom(attrno,
! thisatt->atttypid,
! thisatt->atttypmod,
! pstrdup(NameStr(thisatt->attname)),
! false),
! stringToNode(defval[ndef].adbin));
! list = lappend(list, te);
/*
* Make sure the value is coerced to the target column type
***************
*** 527,543 ****
NIL);
}
}
-
- /* done building the range table and jointree */
- qry->rtable = pstate->p_rtable;
- qry->jointree = makeFromExpr(pstate->p_joinlist, NULL);
! qry->hasSubLinks = pstate->p_hasSubLinks;
! qry->hasAggs = pstate->p_hasAggs;
! if (pstate->p_hasAggs)
! parseCheckAggregates(pstate, qry, NULL);
!
! return qry;
}
/*
--- 567,574 ----
NIL);
}
}
! return list;
}
/*
Index: src/backend/parser/gram.y
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.247
diff -c -r2.247 gram.y
*** src/backend/parser/gram.y 2001/08/21 16:36:03 2.247
--- src/backend/parser/gram.y 2001/08/22 14:55:33
***************
*** 195,201 ****
from_clause, from_list, opt_array_bounds,
expr_list, attrs, target_list, update_target_list,
def_list, opt_indirection, group_clause, TriggerFuncArgs,
! select_limit, opt_select_limit
%type func_arg, func_return, func_type, aggr_argtype
--- 195,201 ----
from_clause, from_list, opt_array_bounds,
expr_list, attrs, target_list, update_target_list,
def_list, opt_indirection, group_clause, TriggerFuncArgs,
! select_limit, opt_select_limit, values_list
%type func_arg, func_return, func_type, aggr_argtype
***************
*** 3212,3253 ****
}
;
! insert_rest: VALUES '(' target_list ')'
{
$$ = makeNode(InsertStmt);
$$->cols = NIL;
! $$->targetList = $3;
$$->selectStmt = NULL;
}
| DEFAULT VALUES
{
$$ = makeNode(InsertStmt);
$$->cols = NIL;
! $$->targetList = NIL;
$$->selectStmt = NULL;
}
| SelectStmt
{
$$ = makeNode(InsertStmt);
$$->cols = NIL;
! $$->targetList = NIL;
$$->selectStmt = $1;
}
! | '(' columnList ')' VALUES '(' target_list ')'
{
$$ = makeNode(InsertStmt);
$$->cols = $2;
! $$->targetList = $6;
$$->selectStmt = NULL;
}
| '(' columnList ')' SelectStmt
{
$$ = makeNode(InsertStmt);
$$->cols = $2;
! $$->targetList = NIL;
$$->selectStmt = $4;
}
;
opt_column_list: '(' columnList ')' { $$ = $2; }
| /*EMPTY*/ { $$ = NIL; }
--- 3212,3259 ----
}
;
! insert_rest: VALUES values_list
{
$$ = makeNode(InsertStmt);
$$->cols = NIL;
! $$->values = $2;
$$->selectStmt = NULL;
}
| DEFAULT VALUES
{
$$ = makeNode(InsertStmt);
$$->cols = NIL;
! $$->values = NIL;
$$->selectStmt = NULL;
}
| SelectStmt
{
$$ = makeNode(InsertStmt);
$$->cols = NIL;
! $$->values = NIL;
$$->selectStmt = $1;
}
! | '(' columnList ')' VALUES values_list
{
$$ = makeNode(InsertStmt);
$$->cols = $2;
! $$->values = $5;
$$->selectStmt = NULL;
}
| '(' columnList ')' SelectStmt
{
$$ = makeNode(InsertStmt);
$$->cols = $2;
! $$->values = NIL;
$$->selectStmt = $4;
}
;
+
+ values_list: values_list ',' '(' target_list ')'
+ { $$ = lappend($1, $4); }
+ | '(' target_list ')'
+ { $$ = makeList1($2); }
+ ;
opt_column_list: '(' columnList ')' { $$ = $2; }
| /*EMPTY*/ { $$ = NIL; }
Index: src/include/nodes/parsenodes.h
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/nodes/parsenodes.h,v
retrieving revision 1.142
diff -c -r1.142 parsenodes.h
*** src/include/nodes/parsenodes.h 2001/08/21 16:36:06 1.142
--- src/include/nodes/parsenodes.h 2001/08/22 14:55:33
***************
*** 57,62 ****
--- 57,65 ----
List *targetList; /* target list (of TargetEntry) */
+ List *valuesList; /* list of lists of TargetEntries
+ * (VALUES clauses) */
+
List *groupClause; /* a list of GroupClause's */
Node *havingQual; /* qualifications applied to groups */
***************
*** 805,815 ****
List *cols; /* optional: names of the target columns */
/*
! * An INSERT statement has *either* VALUES or SELECT, never both. If
! * VALUES, a targetList is supplied (empty for DEFAULT VALUES). If
! * SELECT, a complete SelectStmt (or set-operation tree) is supplied.
*/
! List *targetList; /* the target list (of ResTarget) */
Node *selectStmt; /* the source SELECT */
} InsertStmt;
--- 808,819 ----
List *cols; /* optional: names of the target columns */
/*
! * An INSERT statement has *either* VALUES or SELECT, never
! * both. If VALUES, a list of lists of ResTarget's is supplied
! * (empty for DEFAULT VALUES). If SELECT, a complete SelectStmt
! * (or set-operation tree) is supplied.
*/
! List *values; /* the values to insert */
Node *selectStmt; /* the source SELECT */
} InsertStmt;
Index: src/include/nodes/plannodes.h
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/nodes/plannodes.h,v
retrieving revision 1.49
diff -c -r1.49 plannodes.h
*** src/include/nodes/plannodes.h 2001/03/22 04:00:52 1.49
--- src/include/nodes/plannodes.h 2001/08/22 14:55:33
***************
*** 143,148 ****
--- 143,149 ----
typedef struct Result
{
Plan plan;
+ List *valueslist;
Node *resconstantqual;
ResultState *resstate;
} Result;
Index: src/include/optimizer/planmain.h
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/include/optimizer/planmain.h,v
retrieving revision 1.51
diff -c -r1.51 planmain.h
*** src/include/optimizer/planmain.h 2001/06/05 05:26:05 1.51
--- src/include/optimizer/planmain.h 2001/08/22 14:55:33
***************
*** 42,48 ****
Node *limitOffset, Node *limitCount);
extern SetOp *make_setop(SetOpCmd cmd, List *tlist, Plan *lefttree,
List *distinctList, AttrNumber flagColIdx);
! extern Result *make_result(List *tlist, Node *resconstantqual, Plan *subplan);
/*
* prototypes for plan/initsplan.c
--- 42,48 ----
Node *limitOffset, Node *limitCount);
extern SetOp *make_setop(SetOpCmd cmd, List *tlist, Plan *lefttree,
List *distinctList, AttrNumber flagColIdx);
! extern Result *make_result(List *tlist, List *vlist, Node *resconstantqual, Plan *subplan);
/*
* prototypes for plan/initsplan.c
Index: src/interfaces/ecpg/preproc/preproc.y
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/ecpg/preproc/preproc.y,v
retrieving revision 1.152
diff -c -r1.152 preproc.y
*** src/interfaces/ecpg/preproc/preproc.y 2001/08/19 09:21:44 1.152
--- src/interfaces/ecpg/preproc/preproc.y 2001/08/22 14:55:34
***************
*** 340,345 ****
--- 340,346 ----
%type opt_force key_update CreateSchemaStmt PosIntStringConst
%type IntConst PosIntConst grantee_list func_type
%type select_limit opt_for_update_clause CheckPointStmt
+ %type values_list
%type ECPGWhenever ECPGConnect connection_target ECPGOpen
%type indicator ECPGExecute ECPGPrepare ecpg_using
***************
*** 2371,2379 ****
}
;
! insert_rest: VALUES '(' target_list ')'
{
! $$ = cat_str(3, make_str("values("), $3, make_str(")"));
}
| DEFAULT VALUES
{
--- 2372,2380 ----
}
;
! insert_rest: VALUES values_list
{
! $$ = cat_str(2, make_str("values "), $2);
}
| DEFAULT VALUES
{
***************
*** 2383,2397 ****
{
$$ = $1;
}
! | '(' columnList ')' VALUES '(' target_list ')'
{
! $$ = cat_str(5, make_str("("), $2, make_str(") values ("), $6, make_str(")"));
}
| '(' columnList ')' SelectStmt
{
$$ = cat_str(4, make_str("("), $2, make_str(")"), $4);
}
;
opt_column_list: '(' columnList ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
| /*EMPTY*/ { $$ = EMPTY; }
--- 2384,2404 ----
{
$$ = $1;
}
! | '(' columnList ')' VALUES values_list
{
! $$ = cat_str(4, make_str("("), $2, make_str(") values "), $5);
}
| '(' columnList ')' SelectStmt
{
$$ = cat_str(4, make_str("("), $2, make_str(")"), $4);
}
;
+
+ values_list: values_list ',' '(' target_list ')'
+ { $$ = cat_str(4, $1, make_str(", ("), $4, make_str(")")); }
+ | '(' target_list ')'
+ { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
+ ;
opt_column_list: '(' columnList ')' { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
| /*EMPTY*/ { $$ = EMPTY; }
Index: src/test/regress/parallel_schedule
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/test/regress/parallel_schedule,v
retrieving revision 1.5
diff -c -r1.5 parallel_schedule
*** src/test/regress/parallel_schedule 2001/06/12 16:34:27 1.5
--- src/test/regress/parallel_schedule 2001/08/22 14:55:34
***************
*** 37,43 ****
# ----------
# The third group of parallel test
# ----------
! test: constraints triggers create_misc create_aggregate create_operator create_index inherit
# Depends on the above
test: create_view
--- 37,43 ----
# ----------
# The third group of parallel test
# ----------
! test: constraints triggers create_misc create_aggregate create_operator create_index inherit insert
# Depends on the above
test: create_view
Index: src/test/regress/serial_schedule
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/test/regress/serial_schedule,v
retrieving revision 1.6
diff -c -r1.6 serial_schedule
*** src/test/regress/serial_schedule 2001/06/12 16:34:27 1.6
--- src/test/regress/serial_schedule 2001/08/22 14:55:34
***************
*** 47,52 ****
--- 47,53 ----
test: create_operator
test: create_index
test: inherit
+ test: insert
test: create_view
test: sanity_check
test: errors