mirror of
https://github.com/postgres/postgres.git
synced 2025-07-17 06:41:09 +03:00
Add CREATE/ALTER/DROP OPERATOR FAMILY commands, also COMMENT ON OPERATOR
FAMILY; and add FAMILY option to CREATE OPERATOR CLASS to allow adding a class to a pre-existing family. Per previous discussion. Man, what a tedious lot of cutting and pasting ...
This commit is contained in:
@ -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_recheck: RECHECK { $$ = 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); }
|
||||
;
|
||||
|
||||
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
|
||||
|
@ -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},
|
||||
|
Reference in New Issue
Block a user