1111 *
1212 *
1313 * IDENTIFICATION
14- * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.323 2002/06/15 03:00:03 thomas Exp $
14+ * $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.324 2002/06/17 05:40:32 momjian Exp $
1515 *
1616 * HISTORY
1717 * AUTHORDATEMAJOR EVENT
@@ -201,7 +201,7 @@ static void doNegateFloat(Value *v);
201201
202202%type <list> stmtblock ,stmtmulti ,
203203OptTableElementList ,OptInherit ,definition ,opt_distinct ,
204- opt_with ,func_args ,func_args_list ,func_as ,createfunc_opt_list
204+ opt_definition ,func_args ,func_args_list ,func_as ,createfunc_opt_list
205205oper_argtypes ,RuleActionList ,RuleActionMulti ,
206206opt_column_list ,columnList ,opt_name_list ,
207207sort_clause ,sortby_list ,index_params ,index_list ,name_list ,
@@ -232,7 +232,7 @@ static void doNegateFloat(Value *v);
232232%type <ival> opt_interval
233233%type <node> overlay_placing ,substr_from ,substr_for
234234
235- %type <boolean> opt_binary ,opt_using ,opt_instead ,opt_cursor
235+ %type <boolean> opt_binary ,opt_using ,opt_instead ,opt_cursor , opt_with
236236%type <boolean> opt_with_copy ,index_opt_unique ,opt_verbose ,opt_full
237237%type <boolean> opt_freeze ,analyze_keyword
238238
@@ -469,7 +469,7 @@ stmt : AlterDatabaseSetStmt
469469| CreateUserStmt
470470| ClusterStmt
471471| DefineStmt
472- | DropStmt
472+ | DropStmt
473473| DropSchemaStmt
474474| TruncateStmt
475475| CommentStmt
@@ -518,20 +518,18 @@ stmt : AlterDatabaseSetStmt
518518 *
519519 *****************************************************************************/
520520
521- CreateUserStmt :CREATE USER UserId OptUserList
522- {
523- CreateUserStmt *n = makeNode(CreateUserStmt);
524- n->user =$3 ;
525- n->options =$4 ;
526- $$ = (Node *)n;
527- }
528- | CREATE USER UserId WITH OptUserList
521+ CreateUserStmt :CREATE USER UserId opt_with OptUserList
529522{
530523CreateUserStmt *n = makeNode(CreateUserStmt);
531524n->user =$3 ;
532525n->options =$5 ;
533526$$ = (Node *)n;
534- }
527+ }
528+ ;
529+
530+
531+ opt_with :WITH {$$ =TRUE ; }
532+ | /* EMPTY*/ {$$ =TRUE ; }
535533;
536534
537535/* ****************************************************************************
@@ -541,14 +539,7 @@ CreateUserStmt: CREATE USER UserId OptUserList
541539 *
542540 *****************************************************************************/
543541
544- AlterUserStmt :ALTER USER UserId OptUserList
545- {
546- AlterUserStmt *n = makeNode(AlterUserStmt);
547- n->user =$3 ;
548- n->options =$4 ;
549- $$ = (Node *)n;
550- }
551- | ALTER USER UserId WITH OptUserList
542+ AlterUserStmt :ALTER USER UserId opt_with OptUserList
552543 {
553544AlterUserStmt *n = makeNode(AlterUserStmt);
554545n->user =$3 ;
@@ -600,19 +591,19 @@ OptUserList: OptUserList OptUserElem{ $$ = lappend($1, $2); }
600591;
601592
602593OptUserElem :PASSWORD Sconst
603- {
594+ {
604595$$ = makeNode(DefElem);
605596$$ ->defname =" password" ;
606597$$ ->arg = (Node *)makeString($2 );
607598}
608599| ENCRYPTED PASSWORD Sconst
609- {
600+ {
610601$$ = makeNode(DefElem);
611602$$ ->defname =" encryptedPassword" ;
612603$$ ->arg = (Node *)makeString($3 );
613604}
614605| UNENCRYPTED PASSWORD Sconst
615- {
606+ {
616607$$ = makeNode(DefElem);
617608$$ ->defname =" unencryptedPassword" ;
618609$$ ->arg = (Node *)makeString($3 );
@@ -624,37 +615,37 @@ OptUserElem: PASSWORD Sconst
624615$$ ->arg = (Node *)makeInteger($2 );
625616}
626617| CREATEDB
627- {
618+ {
628619$$ = makeNode(DefElem);
629620$$ ->defname =" createdb" ;
630621$$ ->arg = (Node *)makeInteger(TRUE );
631622}
632623| NOCREATEDB
633- {
624+ {
634625$$ = makeNode(DefElem);
635626$$ ->defname =" createdb" ;
636627$$ ->arg = (Node *)makeInteger(FALSE );
637628}
638629| CREATEUSER
639- {
630+ {
640631$$ = makeNode(DefElem);
641632$$ ->defname =" createuser" ;
642633$$ ->arg = (Node *)makeInteger(TRUE );
643634}
644635| NOCREATEUSER
645- {
636+ {
646637$$ = makeNode(DefElem);
647638$$ ->defname =" createuser" ;
648639$$ ->arg = (Node *)makeInteger(FALSE );
649640}
650641| IN_P GROUP_P user_list
651- {
642+ {
652643$$ = makeNode(DefElem);
653644$$ ->defname =" groupElts" ;
654645$$ ->arg = (Node *)$3 ;
655646}
656647| VALID UNTIL Sconst
657- {
648+ {
658649$$ = makeNode(DefElem);
659650$$ ->defname =" validUntil" ;
660651$$ ->arg = (Node *)makeString($3 );
@@ -680,14 +671,7 @@ user_list: user_list ',' UserId
680671 *
681672 *****************************************************************************/
682673
683- CreateGroupStmt :CREATE GROUP_P UserId OptGroupList
684- {
685- CreateGroupStmt *n = makeNode(CreateGroupStmt);
686- n->name =$3 ;
687- n->options =$4 ;
688- $$ = (Node *)n;
689- }
690- | CREATE GROUP_P UserId WITH OptGroupList
674+ CreateGroupStmt :CREATE GROUP_P UserId opt_with OptGroupList
691675{
692676CreateGroupStmt *n = makeNode(CreateGroupStmt);
693677n->name =$3 ;
@@ -704,7 +688,7 @@ OptGroupList: OptGroupList OptGroupElem{ $$ = lappend($1, $2); }
704688;
705689
706690OptGroupElem :USER user_list
707- {
691+ {
708692$$ = makeNode(DefElem);
709693$$ ->defname =" userElts" ;
710694$$ ->arg = (Node *)$2 ;
@@ -1504,7 +1488,7 @@ ColConstraintElem:
15041488n->keys =NULL ;
15051489$$ = (Node *)n;
15061490}
1507- | REFERENCES qualified_name opt_column_list key_match key_actions
1491+ | REFERENCES qualified_name opt_column_list key_match key_actions
15081492{
15091493FkConstraint *n = makeNode(FkConstraint);
15101494n->constr_name=NULL ;
@@ -1880,7 +1864,7 @@ DropPLangStmt: DROP opt_procedural LANGUAGE ColId_or_Sconst
18801864opt_procedural :PROCEDURAL {$$ =TRUE ; }
18811865| /* EMPTY*/ {$$ =TRUE ; }
18821866;
1883-
1867+
18841868/* ****************************************************************************
18851869 *
18861870 *QUERIES :
@@ -1913,7 +1897,7 @@ CreateTrigStmt: CREATE TRIGGER name TriggerActionTime TriggerEvents ON
19131897$$ = (Node *)n;
19141898}
19151899| CREATE CONSTRAINT TRIGGER name AFTER TriggerEvents ON
1916- qualified_name OptConstrFromTable
1900+ qualified_name OptConstrFromTable
19171901ConstraintAttributeSpec
19181902FOR EACH ROW EXECUTE PROCEDURE
19191903func_name ' (' TriggerFuncArgs ' )'
@@ -2237,13 +2221,13 @@ TruncateStmt: TRUNCATE opt_table qualified_name
22372221 * the object associated with the comment. The form of the statement is:
22382222 *
22392223 * COMMENT ON [ [ DATABASE | DOMAIN | INDEX | SEQUENCE | TABLE | TYPE | VIEW ]
2240- * <objname> | AGGREGATE <aggname> (<aggtype>) | FUNCTION
2241- * <funcname> (arg1, arg2, ...) | OPERATOR <op>
2224+ * <objname> | AGGREGATE <aggname> (<aggtype>) | FUNCTION
2225+ * <funcname> (arg1, arg2, ...) | OPERATOR <op>
22422226 * (leftoperand_typ rightoperand_typ) | TRIGGER <triggername> ON
22432227 * <relname> | RULE <rulename> ON <relname> ] IS 'text'
22442228 *
22452229 *****************************************************************************/
2246-
2230+
22472231CommentStmt :COMMENT ON comment_type any_name IS comment_text
22482232{
22492233CommentStmt *n = makeNode(CommentStmt);
@@ -2319,12 +2303,12 @@ comment_type:COLUMN { $$ = COLUMN; }
23192303| DOMAIN_P {$$ = TYPE_P; }
23202304| TYPE_P {$$ = TYPE_P; }
23212305| VIEW {$$ = VIEW; }
2322- ;
2306+ ;
23232307
23242308comment_text :Sconst {$$ =$1 ; }
23252309| NULL_P {$$ =NULL ; }
23262310;
2327-
2311+
23282312/* ****************************************************************************
23292313 *
23302314 *QUERY:
@@ -2775,7 +2759,7 @@ RecipeStmt: EXECUTE RECIPE recipe_name
27752759 *****************************************************************************/
27762760
27772761CreateFunctionStmt :CREATE opt_or_replace FUNCTION func_name func_args
2778- RETURNS func_return createfunc_opt_list opt_with
2762+ RETURNS func_return createfunc_opt_list opt_definition
27792763{
27802764CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
27812765n->replace =$2 ;
@@ -2951,7 +2935,7 @@ func_as: Sconst
29512935{$$ = makeList2(makeString($1 ), makeString($3 )); }
29522936;
29532937
2954- opt_with :WITH definition {$$ =$2 ; }
2938+ opt_definition :WITH definition {$$ =$2 ; }
29552939| /* EMPTY*/ {$$ = NIL; }
29562940;
29572941
@@ -3118,7 +3102,7 @@ RuleStmt: CREATE RULE name AS
31183102
31193103RuleActionList :NOTHING {$$ = NIL; }
31203104| RuleActionStmt {$$ = makeList1($1 ); }
3121- | ' (' RuleActionMulti ' )' {$$ =$2 ; }
3105+ | ' (' RuleActionMulti ' )' {$$ =$2 ; }
31223106;
31233107
31243108/* the thrashing around here is to discard "empty" statements...*/
@@ -3324,7 +3308,7 @@ LoadStmt: LOAD file_name
33243308 *
33253309 *****************************************************************************/
33263310
3327- CreatedbStmt :CREATE DATABASE database_name WITH createdb_opt_list
3311+ CreatedbStmt :CREATE DATABASE database_name opt_with createdb_opt_list
33283312{
33293313CreatedbStmt *n = makeNode(CreatedbStmt);
33303314List *l;
@@ -3425,7 +3409,7 @@ createdb_opt_item: LOCATION opt_equal Sconst
34253409{
34263410$$ = lconsi(3 , makeListi1(-1 ));
34273411}
3428- | OWNER opt_equal name
3412+ | OWNER opt_equal name
34293413{
34303414$$ = lconsi(4 , makeList1($3 ));
34313415}
@@ -3437,7 +3421,8 @@ createdb_opt_item: LOCATION opt_equal Sconst
34373421
34383422/*
34393423 *Though the equals sign doesn't match other WITH options, pg_dump uses
3440- * equals for backward compability, and it doesn't seem worth remove it.
3424+ * equals for backward compability, and it doesn't seem worth removing it.
3425+ * 2002-02-25
34413426*/
34423427opt_equal :' =' {$$ =TRUE ; }
34433428| /* EMPTY*/ {$$ =FALSE ; }
@@ -3496,7 +3481,7 @@ CreateDomainStmt: CREATE DOMAIN_P any_name opt_as Typename ColQualList opt_coll
34963481n->domainname =$3 ;
34973482n->typename =$5 ;
34983483n->constraints =$6 ;
3499-
3484+
35003485if ($7 !=NULL )
35013486elog (NOTICE," CREATE DOMAIN / COLLATE %s not yet"
35023487" implemented; clause ignored" , $7 );
@@ -3940,7 +3925,7 @@ simple_select: SELECT opt_distinct target_list
39403925$$ = (Node *)n;
39413926}
39423927| select_clause UNION opt_all select_clause
3943- {
3928+ {
39443929$$ = makeSetOp(SETOP_UNION,$3 ,$1 ,$4 );
39453930}
39463931| select_clause INTERSECT opt_all select_clause
@@ -3951,7 +3936,7 @@ simple_select: SELECT opt_distinct target_list
39513936{
39523937$$ = makeSetOp(SETOP_EXCEPT,$3 ,$1 ,$4 );
39533938}
3954- ;
3939+ ;
39553940
39563941into_clause :INTO OptTempTableName {$$ =$2 ; }
39573942| /* EMPTY*/ {$$ =NULL ; }
@@ -3962,22 +3947,22 @@ into_clause: INTO OptTempTableName{ $$ = $2; }
39623947 * since TEMP is not a reserved word. See also OptTemp.
39633948*/
39643949OptTempTableName :TEMPORARY opt_table qualified_name
3965- {
3950+ {
39663951$$ =$3 ;
39673952$$ ->istemp =true ;
39683953}
39693954| TEMP opt_table qualified_name
3970- {
3955+ {
39713956$$ =$3 ;
39723957$$ ->istemp =true ;
39733958}
39743959| LOCAL TEMPORARY opt_table qualified_name
3975- {
3960+ {
39763961$$ =$4 ;
39773962$$ ->istemp =true ;
39783963}
39793964| LOCAL TEMP opt_table qualified_name
3980- {
3965+ {
39813966$$ =$4 ;
39823967$$ ->istemp =true ;
39833968}
@@ -3994,12 +3979,12 @@ OptTempTableName: TEMPORARY opt_table qualified_name
39943979$$ ->istemp =true ;
39953980}
39963981| TABLE qualified_name
3997- {
3982+ {
39983983$$ =$2 ;
39993984$$ ->istemp =false ;
40003985}
40013986| qualified_name
4002- {
3987+ {
40033988$$ =$1 ;
40043989$$ ->istemp =false ;
40053990}
@@ -6122,7 +6107,7 @@ insert_target_list: insert_target_list ',' insert_target_el
61226107;
61236108
61246109insert_target_el :target_el {$$ =$1 ; }
6125- | DEFAULT {
6110+ | DEFAULT {
61266111InsertDefault *def = makeNode(InsertDefault);
61276112$$ = makeNode(ResTarget);
61286113$$ ->name =NULL ;