diff options
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/gram.y | 192 | ||||
-rw-r--r-- | src/backend/parser/keywords.c | 3 |
2 files changed, 154 insertions, 41 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index cf32e912539..217b1a04659 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.575 2007/01/22 01:35:21 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.576 2007/01/23 05:07:17 tgl Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -152,11 +152,12 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args) AlterUserStmt AlterUserSetStmt AlterRoleStmt AlterRoleSetStmt AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt - CreateDomainStmt CreateGroupStmt CreateOpClassStmt CreatePLangStmt + CreateDomainStmt CreateGroupStmt CreateOpClassStmt + CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt CreateAssertStmt CreateTrigStmt CreateUserStmt CreateRoleStmt CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt - DropGroupStmt DropOpClassStmt DropPLangStmt DropStmt + DropGroupStmt DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt DropRoleStmt DropUserStmt DropdbStmt DropTableSpaceStmt ExplainStmt FetchStmt GrantStmt GrantRoleStmt IndexStmt InsertStmt ListenStmt LoadStmt @@ -174,7 +175,7 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args) %type <node> select_no_parens select_with_parens select_clause simple_select values_clause -%type <node> alter_column_default opclass_item alter_using +%type <node> alter_column_default opclass_item opclass_drop alter_using %type <ival> add_drop opt_asc_desc opt_nulls_order %type <node> alter_table_cmd alter_rel_cmd @@ -229,7 +230,7 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args) OptTableElementList TableElementList OptInherit definition OptWith opt_distinct opt_definition func_args func_args_list func_as createfunc_opt_list alterfunc_opt_list - aggr_args aggr_args_list old_aggr_definition old_aggr_list + aggr_args old_aggr_definition old_aggr_list oper_argtypes RuleActionList RuleActionMulti opt_column_list columnList opt_name_list sort_clause opt_sort_clause sortby_list index_params @@ -240,10 +241,10 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args) set_clause_list set_clause multiple_set_clause ctext_expr_list ctext_row def_list indirection opt_indirection group_clause TriggerFuncArgs select_limit - opt_select_limit opclass_item_list - transaction_mode_list_or_empty + opt_select_limit opclass_item_list opclass_drop_list + opt_opfamily transaction_mode_list_or_empty TableFuncElementList opt_type_modifiers - prep_type_clause prep_type_list + prep_type_clause execute_param_clause using_clause returning_clause %type <range> into_clause OptTempTableName @@ -381,7 +382,7 @@ static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args) EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ESCAPE EXCEPT EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTERNAL EXTRACT - FALSE_P FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD + FALSE_P FAMILY FETCH FIRST_P FLOAT_P FOR FORCE FOREIGN FORWARD FREEZE FROM FULL FUNCTION GLOBAL GRANT GRANTED GREATEST GROUP_P @@ -548,6 +549,8 @@ stmt : | CreateFunctionStmt | CreateGroupStmt | CreateOpClassStmt + | CreateOpFamilyStmt + | AlterOpFamilyStmt | CreatePLangStmt | CreateSchemaStmt | CreateSeqStmt @@ -565,6 +568,7 @@ stmt : | DropCastStmt | DropGroupStmt | DropOpClassStmt + | DropOpFamilyStmt | DropOwnedStmt | DropPLangStmt | DropRuleStmt @@ -929,7 +933,7 @@ AlterGroupStmt: } ; -add_drop: ADD_P { $$ = +1; } +add_drop: ADD_P { $$ = +1; } | DROP { $$ = -1; } ; @@ -2879,15 +2883,10 @@ def_arg: func_type { $$ = (Node *)$1; } | Sconst { $$ = (Node *)makeString($1); } ; -aggr_args: '(' aggr_args_list ')' { $$ = $2; } +aggr_args: '(' type_list ')' { $$ = $2; } | '(' '*' ')' { $$ = NIL; } ; -aggr_args_list: - Typename { $$ = list_make1($1); } - | aggr_args_list ',' Typename { $$ = lappend($1, $3); } - ; - old_aggr_definition: '(' old_aggr_list ')' { $$ = $2; } ; @@ -2906,20 +2905,24 @@ old_aggr_elem: IDENT '=' def_arg * * QUERIES : * CREATE OPERATOR CLASS ... + * CREATE OPERATOR FAMILY ... + * ALTER OPERATOR FAMILY ... * DROP OPERATOR CLASS ... + * DROP OPERATOR FAMILY ... * *****************************************************************************/ CreateOpClassStmt: CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename - USING access_method AS opclass_item_list + USING access_method opt_opfamily AS opclass_item_list { CreateOpClassStmt *n = makeNode(CreateOpClassStmt); n->opclassname = $4; n->isDefault = $5; n->datatype = $8; n->amname = $10; - n->items = $12; + n->opfamilyname = $11; + n->items = $13; $$ = (Node *) n; } ; @@ -2959,6 +2962,16 @@ opclass_item: n->number = $2; $$ = (Node *) n; } + | FUNCTION Iconst '(' type_list ')' func_name func_args + { + CreateOpClassItem *n = makeNode(CreateOpClassItem); + n->itemtype = OPCLASS_ITEM_FUNCTION; + n->name = $6; + n->args = extractArgTypes($7); + n->number = $2; + n->class_args = $4; + $$ = (Node *) n; + } | STORAGE Typename { CreateOpClassItem *n = makeNode(CreateOpClassItem); @@ -2968,12 +2981,72 @@ opclass_item: } ; -opt_default: DEFAULT { $$ = TRUE; } - | /*EMPTY*/ { $$ = FALSE; } +opt_default: DEFAULT { $$ = TRUE; } + | /*EMPTY*/ { $$ = FALSE; } + ; + +opt_opfamily: FAMILY any_name { $$ = $2; } + | /*EMPTY*/ { $$ = NIL; } + ; + +opt_recheck: RECHECK { $$ = TRUE; } + | /*EMPTY*/ { $$ = FALSE; } + ; + + +CreateOpFamilyStmt: + CREATE OPERATOR FAMILY any_name USING access_method + { + CreateOpFamilyStmt *n = makeNode(CreateOpFamilyStmt); + n->opfamilyname = $4; + n->amname = $6; + $$ = (Node *) n; + } + ; + +AlterOpFamilyStmt: + ALTER OPERATOR FAMILY any_name USING access_method ADD_P opclass_item_list + { + AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt); + n->opfamilyname = $4; + n->amname = $6; + n->isDrop = false; + n->items = $8; + $$ = (Node *) n; + } + | ALTER OPERATOR FAMILY any_name USING access_method DROP opclass_drop_list + { + AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt); + n->opfamilyname = $4; + n->amname = $6; + n->isDrop = true; + n->items = $8; + $$ = (Node *) n; + } + ; + +opclass_drop_list: + opclass_drop { $$ = list_make1($1); } + | opclass_drop_list ',' opclass_drop { $$ = lappend($1, $3); } ; -opt_recheck: RECHECK { $$ = TRUE; } - | /*EMPTY*/ { $$ = FALSE; } +opclass_drop: + OPERATOR Iconst '(' type_list ')' + { + CreateOpClassItem *n = makeNode(CreateOpClassItem); + n->itemtype = OPCLASS_ITEM_OPERATOR; + n->number = $2; + n->args = $4; + $$ = (Node *) n; + } + | FUNCTION Iconst '(' type_list ')' + { + CreateOpClassItem *n = makeNode(CreateOpClassItem); + n->itemtype = OPCLASS_ITEM_FUNCTION; + n->number = $2; + n->args = $4; + $$ = (Node *) n; + } ; @@ -2998,6 +3071,28 @@ DropOpClassStmt: } ; +DropOpFamilyStmt: + DROP OPERATOR FAMILY any_name USING access_method opt_drop_behavior + { + RemoveOpFamilyStmt *n = makeNode(RemoveOpFamilyStmt); + n->opfamilyname = $4; + n->amname = $6; + n->behavior = $7; + n->missing_ok = false; + $$ = (Node *) n; + } + | DROP OPERATOR FAMILY IF_P EXISTS any_name USING access_method opt_drop_behavior + { + RemoveOpFamilyStmt *n = makeNode(RemoveOpFamilyStmt); + n->opfamilyname = $6; + n->amname = $8; + n->behavior = $9; + n->missing_ok = true; + $$ = (Node *) n; + } + ; + + /***************************************************************************** * * QUERY: @@ -3201,6 +3296,15 @@ CommentStmt: n->comment = $9; $$ = (Node *) n; } + | COMMENT ON OPERATOR FAMILY any_name USING access_method IS comment_text + { + CommentStmt *n = makeNode(CommentStmt); + n->objtype = OBJECT_OPFAMILY; + n->objname = $5; + n->objargs = list_make1(makeString($7)); + n->comment = $9; + $$ = (Node *) n; + } | COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text { CommentStmt *n = makeNode(CommentStmt); @@ -4115,9 +4219,9 @@ oper_argtypes: } | Typename ',' Typename { $$ = list_make2($1, $3); } - | NONE ',' Typename /* left unary */ + | NONE ',' Typename /* left unary */ { $$ = list_make2(NULL, $3); } - | Typename ',' NONE /* right unary */ + | Typename ',' NONE /* right unary */ { $$ = list_make2($1, NULL); } ; @@ -4174,8 +4278,8 @@ DropCastStmt: DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_beha } ; -opt_if_exists: IF_P EXISTS { $$ = true; } - | /*EMPTY*/ { $$ = false; } +opt_if_exists: IF_P EXISTS { $$ = TRUE; } + | /*EMPTY*/ { $$ = FALSE; } ; @@ -4294,6 +4398,15 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->newname = $9; $$ = (Node *)n; } + | ALTER OPERATOR FAMILY any_name USING access_method RENAME TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_OPFAMILY; + n->object = $4; + n->subname = $6; + n->newname = $9; + $$ = (Node *)n; + } | ALTER SCHEMA name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); @@ -4493,6 +4606,15 @@ AlterOwnerStmt: ALTER AGGREGATE func_name aggr_args OWNER TO RoleId n->newowner = $9; $$ = (Node *)n; } + | ALTER OPERATOR FAMILY any_name USING access_method OWNER TO RoleId + { + AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_OPFAMILY; + n->object = $4; + n->addname = $6; + n->newowner = $9; + $$ = (Node *)n; + } | ALTER SCHEMA name OWNER TO RoleId { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); @@ -5302,15 +5424,10 @@ PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt } ; -prep_type_clause: '(' prep_type_list ')' { $$ = $2; } +prep_type_clause: '(' type_list ')' { $$ = $2; } | /* EMPTY */ { $$ = NIL; } ; -prep_type_list: Typename { $$ = list_make1($1); } - | prep_type_list ',' Typename - { $$ = lappend($1, $3); } - ; - PreparableStmt: SelectStmt | InsertStmt @@ -7968,14 +8085,8 @@ extract_list: | /*EMPTY*/ { $$ = NIL; } ; -type_list: type_list ',' Typename - { - $$ = lappend($1, $3); - } - | Typename - { - $$ = list_make1($1); - } +type_list: Typename { $$ = list_make1($1); } + | type_list ',' Typename { $$ = lappend($1, $3); } ; array_expr_list: array_expr @@ -8604,6 +8715,7 @@ unreserved_keyword: | EXECUTE | EXPLAIN | EXTERNAL + | FAMILY | FETCH | FIRST_P | FORCE diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c index 5e858d10b0a..b8607c7c002 100644 --- a/src/backend/parser/keywords.c +++ b/src/backend/parser/keywords.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.182 2007/01/22 01:35:21 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.183 2007/01/23 05:07:18 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -145,6 +145,7 @@ static const ScanKeyword ScanKeywords[] = { {"external", EXTERNAL}, {"extract", EXTRACT}, {"false", FALSE_P}, + {"family", FAMILY}, {"fetch", FETCH}, {"first", FIRST_P}, {"float", FLOAT_P}, |