diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index e5b0541..b896279 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -249,7 +249,7 @@ static TypeName *TableFuncTypeName(List *columns); %type TriggerEvents TriggerOneEvent %type TriggerFuncArg -%type TriggerWhen +%type TriggerWhen tricky_index_name %type copy_file_name database_name access_method_clause access_method attr_name @@ -4829,14 +4829,29 @@ defacl_privilege_target: * willing to make TABLESPACE a fully reserved word. *****************************************************************************/ -IndexStmt: CREATE index_opt_unique INDEX index_name +IndexStmt: CREATE index_opt_unique INDEX tricky_index_name ON qualified_name access_method_clause '(' index_params ')' opt_reloptions OptTableSpace where_clause { IndexStmt *n = makeNode(IndexStmt); n->unique = $2; - n->concurrent = false; - n->idxname = $4; + if (IsA($4, String)) + { + n->concurrent = false; + n->idxname = strVal($4); + } + else { + DefElem *d = (DefElem*) $4; + if (!strcmp(d->defname, "concurrently")) + { + n->concurrent = true; + n->idxname = NULL; + } + else { + n->concurrent = false; + n->idxname = d->defname; + } + } n->relation = $6; n->accessMethod = $7; n->indexParams = $9; @@ -4861,6 +4876,22 @@ IndexStmt: CREATE index_opt_unique INDEX index_name n->whereClause = $14; $$ = (Node *)n; } + | CREATE index_opt_unique INDEX + ON qualified_name access_method_clause '(' index_params ')' + opt_reloptions OptTableSpace where_clause + { + IndexStmt *n = makeNode(IndexStmt); + n->unique = $2; + n->concurrent = true; + n->idxname = NULL; + n->relation = $5; + n->accessMethod = $6; + n->indexParams = $8; + n->options = $10; + n->tableSpace = $11; + n->whereClause = $12; + $$ = (Node *)n; + } ; index_opt_unique: @@ -10474,6 +10505,11 @@ attr_name: ColLabel { $$ = $1; }; index_name: ColId { $$ = $1; }; +tricky_index_name: IDENT { $$ = (Node *) makeString(pstrdup($1)); } + | unreserved_keyword { $$ = (Node *) makeDefElem(pstrdup($1), NULL); } + | col_name_keyword { $$ = (Node *) makeDefElem(pstrdup($1), NULL); } + ; + file_name: Sconst { $$ = $1; }; /*