@@ -425,9 +425,10 @@ static void processCASbits(int cas_bits, int location, const char *constrType,
425425
426426%type <ival> Iconst SignedIconst
427427%type <str> Sconst comment_text notify_payload
428- %type <str> RoleId opt_granted_by opt_boolean_or_string ColId_or_Sconst
428+ %type <str> RoleId opt_granted_by opt_boolean_or_string
429429%type <list> var_list
430430%type <str> ColId ColLabel var_name type_function_name param_name
431+ %type <str> NonReservedWord NonReservedWord_or_Sconst
431432%type <node> var_value zone_value
432433
433434%type <keyword> unreserved_keyword type_func_name_keyword
@@ -1324,15 +1325,15 @@ set_rest_more:/* Generic SET syntaxes: */
13241325n->kind = VAR_SET_DEFAULT;
13251326$$ = n;
13261327}
1327- | ROLE ColId_or_Sconst
1328+ | ROLE NonReservedWord_or_Sconst
13281329{
13291330VariableSetStmt *n = makeNode(VariableSetStmt);
13301331n->kind = VAR_SET_VALUE;
13311332n->name =" role" ;
13321333n->args = list_make1(makeStringConst($2 ,@2 ));
13331334$$ = n;
13341335}
1335- | SESSION AUTHORIZATION ColId_or_Sconst
1336+ | SESSION AUTHORIZATION NonReservedWord_or_Sconst
13361337{
13371338VariableSetStmt *n = makeNode(VariableSetStmt);
13381339n->kind = VAR_SET_VALUE;
@@ -1395,11 +1396,11 @@ opt_boolean_or_string:
13951396| FALSE_P {$$ =" false" ; }
13961397| ON {$$ =" on" ; }
13971398/*
1398- * OFF is also accepted as a boolean value, but is handled
1399- *by theColId rule below. The action for booleans and strings
1399+ * OFF is also accepted as a boolean value, but is handled by
1400+ * theNonReservedWord rule. The action for booleans and strings
14001401 * is the same, so we don't need to distinguish them here.
14011402*/
1402- | ColId_or_Sconst {$$ =$1 ; }
1403+ | NonReservedWord_or_Sconst {$$ =$1 ; }
14031404;
14041405
14051406/* Timezone values can be:
@@ -1468,8 +1469,8 @@ opt_encoding:
14681469| /* EMPTY*/ {$$ =NULL ; }
14691470;
14701471
1471- ColId_or_Sconst :
1472- ColId {$$ =$1 ; }
1472+ NonReservedWord_or_Sconst :
1473+ NonReservedWord {$$ =$1 ; }
14731474| Sconst {$$ =$1 ; }
14741475;
14751476
@@ -3234,7 +3235,7 @@ NumericOnly_list:NumericOnly{ $$ = list_make1($1); }
32343235 *****************************************************************************/
32353236
32363237CreatePLangStmt :
3237- CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
3238+ CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE NonReservedWord_or_Sconst
32383239{
32393240CreatePLangStmt *n = makeNode(CreatePLangStmt);
32403241n->replace =$2 ;
@@ -3246,7 +3247,7 @@ CreatePLangStmt:
32463247n->pltrusted =false ;
32473248$$ = (Node *)n;
32483249}
3249- | CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE ColId_or_Sconst
3250+ | CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE NonReservedWord_or_Sconst
32503251HANDLER handler_name opt_inline_handler opt_validator
32513252{
32523253CreatePLangStmt *n = makeNode(CreatePLangStmt);
@@ -3290,7 +3291,7 @@ opt_validator:
32903291;
32913292
32923293DropPLangStmt :
3293- DROP opt_procedural LANGUAGE ColId_or_Sconst opt_drop_behavior
3294+ DROP opt_procedural LANGUAGE NonReservedWord_or_Sconst opt_drop_behavior
32943295{
32953296DropStmt *n = makeNode(DropStmt);
32963297n->removeType = OBJECT_LANGUAGE;
@@ -3301,7 +3302,7 @@ DropPLangStmt:
33013302n->concurrent =false ;
33023303$$ = (Node *)n;
33033304}
3304- | DROP opt_procedural LANGUAGE IF_P EXISTS ColId_or_Sconst opt_drop_behavior
3305+ | DROP opt_procedural LANGUAGE IF_P EXISTS NonReservedWord_or_Sconst opt_drop_behavior
33053306{
33063307DropStmt *n = makeNode(DropStmt);
33073308n->removeType = OBJECT_LANGUAGE;
@@ -3403,11 +3404,11 @@ create_extension_opt_item:
34033404{
34043405$$ = makeDefElem(" schema" , (Node *)makeString($2 ));
34053406}
3406- | VERSION_P ColId_or_Sconst
3407+ | VERSION_P NonReservedWord_or_Sconst
34073408{
34083409$$ = makeDefElem(" new_version" , (Node *)makeString($2 ));
34093410}
3410- | FROM ColId_or_Sconst
3411+ | FROM NonReservedWord_or_Sconst
34113412{
34123413$$ = makeDefElem(" old_version" , (Node *)makeString($2 ));
34133414}
@@ -3436,7 +3437,7 @@ alter_extension_opt_list:
34363437;
34373438
34383439alter_extension_opt_item :
3439- TO ColId_or_Sconst
3440+ TO NonReservedWord_or_Sconst
34403441{
34413442$$ = makeDefElem(" new_version" , (Node *)makeString($2 ));
34423443}
@@ -5189,8 +5190,8 @@ SecLabelStmt:
51895190}
51905191;
51915192
5192- opt_provider :FOR ColId_or_Sconst {$$ =$2 ; }
5193- | /* empty*/ {$$ =NULL ; }
5193+ opt_provider :FOR NonReservedWord_or_Sconst {$$ =$2 ; }
5194+ | /* empty*/ {$$ =NULL ; }
51945195;
51955196
51965197security_label_type :
@@ -6214,7 +6215,7 @@ createfunc_opt_item:
62146215{
62156216$$ = makeDefElem(" as" , (Node *)$2 );
62166217}
6217- | LANGUAGE ColId_or_Sconst
6218+ | LANGUAGE NonReservedWord_or_Sconst
62186219{
62196220$$ = makeDefElem(" language" , (Node *)makeString($2 ));
62206221}
@@ -6429,7 +6430,7 @@ dostmt_opt_item:
64296430{
64306431$$ = makeDefElem(" as" , (Node *)makeString($1 ));
64316432}
6432- | LANGUAGE ColId_or_Sconst
6433+ | LANGUAGE NonReservedWord_or_Sconst
64336434{
64346435$$ = makeDefElem(" language" , (Node *)makeString($2 ));
64356436}
@@ -8314,9 +8315,7 @@ explain_option_elem:
83148315;
83158316
83168317explain_option_name :
8317- ColId {$$ =$1 ; }
8318- | analyze_keyword {$$ =" analyze" ; }
8319- | VERBOSE {$$ =" verbose" ; }
8318+ NonReservedWord {$$ =$1 ; }
83208319;
83218320
83228321explain_option_arg :
@@ -12197,7 +12196,7 @@ AexprConst: Iconst
1219712196
1219812197Iconst:ICONST{ $$ = $1 ; };
1219912198Sconst:SCONST{ $$ = $1 ; };
12200- RoleId:ColId { $$ = $1 ; };
12199+ RoleId:NonReservedWord { $$ = $1 ; };
1220112200
1220212201SignedIconst: Iconst{ $$ = $1 ; }
1220312202|' +' Iconst{ $$ = + $2 ; }
@@ -12229,6 +12228,14 @@ type_function_name:IDENT{ $$ = $1; }
1222912228| type_func_name_keyword{ $$ =pstrdup ($1 ); }
1223012229;
1223112230
12231+ /* Any not-fully-reserved word --- these names can be, eg, role names.
12232+ */
12233+ NonReservedWord:IDENT{ $$ = $1 ; }
12234+ | unreserved_keyword{ $$ =pstrdup ($1 ); }
12235+ | col_name_keyword{ $$ =pstrdup ($1 ); }
12236+ | type_func_name_keyword{ $$ =pstrdup ($1 ); }
12237+ ;
12238+
1223212239/* Column label --- allowed labels in "AS" clauses.
1223312240 * This presently includes *all* Postgres keywords.
1223412241*/