aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y192
-rw-r--r--src/backend/parser/keywords.c3
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},