diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2008-12-19 16:25:19 +0000 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2008-12-19 16:25:19 +0000 |
commit | cae565e503c42a0942ca1771665243b4453c5770 (patch) | |
tree | 625121907a64d7716686a0be5f9e302fdfc42916 /src/backend/parser | |
parent | 1eec10a2de3925ef791904835e2437d1efe97139 (diff) | |
download | postgresql-cae565e503c42a0942ca1771665243b4453c5770.tar.gz postgresql-cae565e503c42a0942ca1771665243b4453c5770.zip |
SQL/MED catalog manipulation facilities
This doesn't do any remote or external things yet, but it gives modules
like plproxy and dblink a standardized and future-proof system for
managing their connection information.
Martin Pihlak and Peter Eisentraut
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/gram.y | 383 | ||||
-rw-r--r-- | src/backend/parser/keywords.c | 6 |
2 files changed, 379 insertions, 10 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 337af633272..cc81e656461 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.645 2008/12/18 18:20:34 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.646 2008/12/19 16:25:17 petere Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -156,6 +156,7 @@ static TypeName *TableFuncTypeName(List *columns); FunctionParameterMode fun_param_mode; FuncWithArgs *funwithargs; DefElem *defelt; + OptionDefElem *optdef; SortBy *sortby; JoinExpr *jexpr; IndexElem *ielem; @@ -172,19 +173,22 @@ static TypeName *TableFuncTypeName(List *columns); } %type <node> stmt schema_stmt - AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterGroupStmt + AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterFdwStmt + AlterForeignServerStmt AlterGroupStmt AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterTableStmt - AlterUserStmt AlterUserSetStmt AlterRoleStmt AlterRoleSetStmt + AlterUserStmt AlterUserMappingStmt AlterUserSetStmt AlterRoleStmt AlterRoleSetStmt AnalyzeStmt ClosePortalStmt ClusterStmt CommentStmt ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt CreateDomainStmt CreateGroupStmt CreateOpClassStmt CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt - CreateAssertStmt CreateTrigStmt CreateUserStmt CreateRoleStmt + CreateFdwStmt CreateForeignServerStmt CreateAssertStmt CreateTrigStmt + CreateUserStmt CreateUserMappingStmt CreateRoleStmt CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt DropGroupStmt DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt DropAssertStmt DropTrigStmt DropRuleStmt DropCastStmt DropRoleStmt - DropUserStmt DropdbStmt DropTableSpaceStmt ExplainStmt FetchStmt + DropUserStmt DropdbStmt DropTableSpaceStmt DropFdwStmt + DropForeignServerStmt DropUserMappingStmt ExplainStmt FetchStmt GrantStmt GrantRoleStmt IndexStmt InsertStmt ListenStmt LoadStmt LockStmt NotifyStmt ExplainableStmt PreparableStmt CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt @@ -222,6 +226,10 @@ static TypeName *TableFuncTypeName(List *columns); %type <list> OptRoleList %type <defelt> OptRoleElem +%type <str> opt_type +%type <str> foreign_server_version opt_foreign_server_version +%type <str> auth_ident + %type <str> OptSchemaName %type <list> OptSchemaEltList @@ -274,6 +282,7 @@ static TypeName *TableFuncTypeName(List *columns); prep_type_clause execute_param_clause using_clause returning_clause enum_val_list table_func_column_list + create_generic_options alter_generic_options %type <range> OptTempTableName %type <into> into_clause create_as_target @@ -342,6 +351,12 @@ static TypeName *TableFuncTypeName(List *columns); %type <range> relation_expr_opt_alias %type <target> target_el single_set_clause set_target insert_column_item +%type <str> generic_option_name +%type <node> generic_option_arg +%type <defelt> generic_option_elem +%type <optdef> alter_generic_option_elem +%type <list> generic_option_list alter_generic_option_list + %type <typnam> Typename SimpleTypename ConstTypename GenericType Numeric opt_float Character ConstCharacter @@ -436,7 +451,7 @@ static TypeName *TableFuncTypeName(List *columns); KEY LANCOMPILER LANGUAGE LARGE_P LAST_P LEADING LEAST LEFT LEVEL - LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION + LIBRARY LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOGIN_P MAPPING MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE @@ -445,7 +460,7 @@ static TypeName *TableFuncTypeName(List *columns); NOCREATEROLE NOCREATEUSER NOINHERIT NOLOGIN_P NONE NOSUPERUSER NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF NULLS_P NUMERIC - OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR + OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OPTIONS OR ORDER OUT_P OUTER_P OVERLAPS OVERLAY OWNED OWNER PARSER PARTIAL PASSWORD PLACING PLANS POSITION @@ -459,7 +474,7 @@ static TypeName *TableFuncTypeName(List *columns); REVOKE RIGHT ROLE ROLLBACK ROW ROWS RULE SAVEPOINT SCHEMA SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE - SERIALIZABLE SESSION SESSION_USER SET SETOF SHARE + SERIALIZABLE SERVER SESSION SESSION_USER SET SETOF SHARE SHOW SIMILAR SIMPLE SMALLINT SOME STABLE STANDALONE_P START STATEMENT STATISTICS STDIN STDOUT STORAGE STRICT_P STRIP_P SUBSTRING SUPERUSER_P SYMMETRIC SYSID SYSTEM_P @@ -474,7 +489,7 @@ static TypeName *TableFuncTypeName(List *columns); VACUUM VALID VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING VERBOSE VERSION_P VIEW VOLATILE - WHEN WHERE WHITESPACE_P WITH WITHOUT WORK WRITE + WHEN WHERE WHITESPACE_P WITH WITHOUT WORK WRAPPER WRITE XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLFOREST XMLPARSE XMLPI XMLROOT XMLSERIALIZE @@ -562,6 +577,8 @@ stmt : AlterDatabaseStmt | AlterDatabaseSetStmt | AlterDomainStmt + | AlterFdwStmt + | AlterForeignServerStmt | AlterFunctionStmt | AlterGroupStmt | AlterObjectSchemaStmt @@ -572,6 +589,7 @@ stmt : | AlterRoleStmt | AlterTSConfigurationStmt | AlterTSDictionaryStmt + | AlterUserMappingStmt | AlterUserSetStmt | AlterUserStmt | AnalyzeStmt @@ -586,6 +604,8 @@ stmt : | CreateCastStmt | CreateConversionStmt | CreateDomainStmt + | CreateFdwStmt + | CreateForeignServerStmt | CreateFunctionStmt | CreateGroupStmt | CreateOpClassStmt @@ -599,6 +619,7 @@ stmt : | CreateTrigStmt | CreateRoleStmt | CreateUserStmt + | CreateUserMappingStmt | CreatedbStmt | DeallocateStmt | DeclareCursorStmt @@ -607,6 +628,8 @@ stmt : | DiscardStmt | DropAssertStmt | DropCastStmt + | DropFdwStmt + | DropForeignServerStmt | DropGroupStmt | DropOpClassStmt | DropOpFamilyStmt @@ -618,6 +641,7 @@ stmt : | DropTrigStmt | DropRoleStmt | DropUserStmt + | DropUserMappingStmt | DropdbStmt | ExecuteStmt | ExplainStmt @@ -2717,6 +2741,313 @@ DropTableSpaceStmt: DROP TABLESPACE name /***************************************************************************** * + * QUERY: + * CREATE FOREIGN DATA WRAPPER name LIBRARY 'library_name' LANGUAGE C + * + *****************************************************************************/ + +CreateFdwStmt: CREATE FOREIGN DATA_P WRAPPER name LIBRARY Sconst LANGUAGE ColId create_generic_options + { + CreateFdwStmt *n = makeNode(CreateFdwStmt); + n->fdwname = $5; + n->library = $7; + n->options = $10; + $$ = (Node *) n; + + if (pg_strcasecmp($9, "C") != 0) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("language for foreign-data wrapper must be C"), + scanner_errposition(@9))); + } + ; + +/***************************************************************************** + * + * QUERY : + * DROP FOREIGN DATA WRAPPER name + * + ****************************************************************************/ + +DropFdwStmt: DROP FOREIGN DATA_P WRAPPER name opt_drop_behavior + { + DropFdwStmt *n = makeNode(DropFdwStmt); + n->fdwname = $5; + n->missing_ok = false; + n->behavior = $6; + $$ = (Node *) n; + } + | DROP FOREIGN DATA_P WRAPPER IF_P EXISTS name opt_drop_behavior + { + DropFdwStmt *n = makeNode(DropFdwStmt); + n->fdwname = $7; + n->missing_ok = true; + n->behavior = $8; + $$ = (Node *) n; + } + ; + +/***************************************************************************** + * + * QUERY : + * ALTER FOREIGN DATA WRAPPER name + * + ****************************************************************************/ + +AlterFdwStmt: ALTER FOREIGN DATA_P WRAPPER name LIBRARY Sconst alter_generic_options + { + AlterFdwStmt *n = makeNode(AlterFdwStmt); + n->fdwname = $5; + n->library = $7; + n->options = $8; + $$ = (Node *) n; + } + | ALTER FOREIGN DATA_P WRAPPER name LIBRARY Sconst + { + AlterFdwStmt *n = makeNode(AlterFdwStmt); + n->fdwname = $5; + n->library = $7; + $$ = (Node *) n; + } + | ALTER FOREIGN DATA_P WRAPPER name alter_generic_options + { + AlterFdwStmt *n = makeNode(AlterFdwStmt); + n->fdwname = $5; + n->options = $6; + $$ = (Node *) n; + } + ; + +/* Options definition for CREATE FDW, SERVER and USER MAPPING */ +create_generic_options: + OPTIONS '(' generic_option_list ')' { $$ = $3; } + | /*EMPTY*/ { $$ = NIL; } + ; + +generic_option_list: generic_option_elem + { + $$ = list_make1(makeOptionDefElem(ALTER_OPT_ADD, $1)); + } + | generic_option_list ',' generic_option_elem + { + $$ = lappend($1, makeOptionDefElem(ALTER_OPT_ADD, $3)); + } + ; + +/* Options definition for ALTER FDW, SERVER and USER MAPPING */ +alter_generic_options: + OPTIONS '(' alter_generic_option_list ')' { $$ = $3; } + ; + +alter_generic_option_list: + alter_generic_option_elem + { + $$ = list_make1($1); + } + | generic_option_elem + { + $$ = list_make1(makeOptionDefElem(ALTER_OPT_ADD, $1)); + } + | alter_generic_option_list ',' alter_generic_option_elem + { + $$ = lappend($1, $3); + } + | alter_generic_option_list ',' generic_option_elem + { + $$ = lappend($1, makeOptionDefElem(ALTER_OPT_ADD, $3)); + } + ; + +alter_generic_option_elem: + ADD_P generic_option_elem + { + $$ = makeOptionDefElem(ALTER_OPT_ADD, $2); + } + | SET generic_option_elem + { + $$ = makeOptionDefElem(ALTER_OPT_SET, $2); + } + | DROP generic_option_name + { + $$ = makeOptionDefElem(ALTER_OPT_DROP, + makeDefElem($2, NULL)); + } + ; + +generic_option_elem: + generic_option_name generic_option_arg { $$ = makeDefElem($1, $2); } + ; + +generic_option_name: + attr_name { $$ = $1; } + ; + +generic_option_arg: + Sconst { $$ = (Node *)makeString($1); } + ; + +/***************************************************************************** + * + * QUERY: + * CREATE SERVER name [TYPE] [VERSION] [OPTIONS] + * + *****************************************************************************/ + +CreateForeignServerStmt: CREATE SERVER name opt_type opt_foreign_server_version + FOREIGN DATA_P WRAPPER name create_generic_options + { + CreateForeignServerStmt *n = makeNode(CreateForeignServerStmt); + n->servername = $3; + n->servertype = $4; + n->version = $5; + n->fdwname = $9; + n->options = $10; + $$ = (Node *) n; + } + ; + +opt_type: + TYPE_P Sconst { $$ = $2; } + | /*EMPTY*/ { $$ = NULL; } + ; + + +foreign_server_version: + VERSION_P Sconst { $$ = $2; } + | VERSION_P NULL_P { $$ = NULL; } + ; + +opt_foreign_server_version: + foreign_server_version { $$ = $1; } + | /*EMPTY*/ { $$ = NULL; } + ; + +/***************************************************************************** + * + * QUERY : + * DROP SERVER name + * + ****************************************************************************/ + +DropForeignServerStmt: DROP SERVER name opt_drop_behavior + { + DropForeignServerStmt *n = makeNode(DropForeignServerStmt); + n->servername = $3; + n->missing_ok = false; + n->behavior = $4; + $$ = (Node *) n; + } + | DROP SERVER IF_P EXISTS name opt_drop_behavior + { + DropForeignServerStmt *n = makeNode(DropForeignServerStmt); + n->servername = $5; + n->missing_ok = true; + n->behavior = $6; + $$ = (Node *) n; + } + ; + +/***************************************************************************** + * + * QUERY : + * ALTER SERVER name [VERSION] [OPTIONS] + * + ****************************************************************************/ + +AlterForeignServerStmt: ALTER SERVER name foreign_server_version alter_generic_options + { + AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt); + n->servername = $3; + n->version = $4; + n->options = $5; + n->has_version = true; + $$ = (Node *) n; + } + | ALTER SERVER name foreign_server_version + { + AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt); + n->servername = $3; + n->version = $4; + n->has_version = true; + $$ = (Node *) n; + } + | ALTER SERVER name alter_generic_options + { + AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt); + n->servername = $3; + n->options = $4; + $$ = (Node *) n; + } + ; + +/***************************************************************************** + * + * QUERY: + * CREATE USER MAPPING FOR auth_ident SERVER name [OPTIONS] + * + *****************************************************************************/ + +CreateUserMappingStmt: CREATE USER MAPPING FOR auth_ident SERVER name create_generic_options + { + CreateUserMappingStmt *n = makeNode(CreateUserMappingStmt); + n->username = $5; + n->servername = $7; + n->options = $8; + $$ = (Node *) n; + } + ; + +/* User mapping authorization identifier */ +auth_ident: + CURRENT_USER { $$ = "current_user"; } + | USER { $$ = "current_user"; } + | RoleId { $$ = (strcmp($1, "public") == 0) ? NULL : $1 } + ; + +/***************************************************************************** + * + * QUERY : + * DROP USER MAPPING FOR auth_ident SERVER name + * + ****************************************************************************/ + +DropUserMappingStmt: DROP USER MAPPING FOR auth_ident SERVER name + { + DropUserMappingStmt *n = makeNode(DropUserMappingStmt); + n->username = $5; + n->servername = $7; + n->missing_ok = false; + $$ = (Node *) n; + } + | DROP USER MAPPING IF_P EXISTS FOR auth_ident SERVER name + { + DropUserMappingStmt *n = makeNode(DropUserMappingStmt); + n->username = $7; + n->servername = $9; + n->missing_ok = true; + $$ = (Node *) n; + } + ; + +/***************************************************************************** + * + * QUERY : + * ALTER USER MAPPING FOR auth_ident SERVER name OPTIONS + * + ****************************************************************************/ + +AlterUserMappingStmt: ALTER USER MAPPING FOR auth_ident SERVER name alter_generic_options + { + AlterUserMappingStmt *n = makeNode(AlterUserMappingStmt); + n->username = $5; + n->servername = $7; + n->options = $8; + $$ = (Node *) n; + } + ; + +/***************************************************************************** + * * QUERIES : * CREATE TRIGGER ... * DROP TRIGGER ... @@ -3912,6 +4243,20 @@ privilege_target: n->objs = $2; $$ = n; } + | FOREIGN DATA_P WRAPPER name_list + { + PrivTarget *n = makeNode(PrivTarget); + n->objtype = ACL_OBJECT_FDW; + n->objs = $4; + $$ = n; + } + | FOREIGN SERVER name_list + { + PrivTarget *n = makeNode(PrivTarget); + n->objtype = ACL_OBJECT_FOREIGN_SERVER; + n->objs = $3; + $$ = n; + } | FUNCTION function_with_argtypes_list { PrivTarget *n = makeNode(PrivTarget); @@ -5123,6 +5468,22 @@ AlterOwnerStmt: ALTER AGGREGATE func_name aggr_args OWNER TO RoleId n->newowner = $8; $$ = (Node *)n; } + | ALTER FOREIGN DATA_P WRAPPER name OWNER TO RoleId + { + AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_FDW; + n->object = list_make1(makeString($5)); + n->newowner = $8; + $$ = (Node *)n; + } + | ALTER SERVER name OWNER TO RoleId + { + AlterOwnerStmt *n = makeNode(AlterOwnerStmt); + n->objectType = OBJECT_FOREIGN_SERVER; + n->object = list_make1(makeString($3)); + n->newowner = $6; + $$ = (Node *)n; + } ; @@ -9556,6 +9917,7 @@ unreserved_keyword: | INVOKER | ISOLATION | KEY + | LIBRARY | LANCOMPILER | LANGUAGE | LARGE_P @@ -9594,6 +9956,7 @@ unreserved_keyword: | OIDS | OPERATOR | OPTION + | OPTIONS | OWNED | OWNER | PARSER @@ -9629,6 +9992,7 @@ unreserved_keyword: | ROWS | RULE | SAVEPOINT + | SERVER | SCHEMA | SCROLL | SEARCH @@ -9681,6 +10045,7 @@ unreserved_keyword: | WHITESPACE_P | WITHOUT | WORK + | WRAPPER | WRITE | XML_P | YEAR_P diff --git a/src/backend/parser/keywords.c b/src/backend/parser/keywords.c index 9eb6d082269..bf7b1f6ad2e 100644 --- a/src/backend/parser/keywords.c +++ b/src/backend/parser/keywords.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.205 2008/10/27 09:37:47 petere Exp $ + * $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.206 2008/12/19 16:25:17 petere Exp $ * *------------------------------------------------------------------------- */ @@ -229,6 +229,7 @@ const ScanKeyword ScanKeywords[] = { {"least", LEAST, COL_NAME_KEYWORD}, {"left", LEFT, TYPE_FUNC_NAME_KEYWORD}, {"level", LEVEL, UNRESERVED_KEYWORD}, + {"library", LIBRARY, UNRESERVED_KEYWORD}, {"like", LIKE, TYPE_FUNC_NAME_KEYWORD}, {"limit", LIMIT, RESERVED_KEYWORD}, {"listen", LISTEN, UNRESERVED_KEYWORD}, @@ -281,6 +282,7 @@ const ScanKeyword ScanKeywords[] = { {"only", ONLY, RESERVED_KEYWORD}, {"operator", OPERATOR, UNRESERVED_KEYWORD}, {"option", OPTION, UNRESERVED_KEYWORD}, + {"options", OPTIONS, UNRESERVED_KEYWORD}, {"or", OR, RESERVED_KEYWORD}, {"order", ORDER, RESERVED_KEYWORD}, {"out", OUT_P, COL_NAME_KEYWORD}, @@ -339,6 +341,7 @@ const ScanKeyword ScanKeywords[] = { {"select", SELECT, RESERVED_KEYWORD}, {"sequence", SEQUENCE, UNRESERVED_KEYWORD}, {"serializable", SERIALIZABLE, UNRESERVED_KEYWORD}, + {"server", SERVER, UNRESERVED_KEYWORD}, {"session", SESSION, UNRESERVED_KEYWORD}, {"session_user", SESSION_USER, RESERVED_KEYWORD}, {"set", SET, UNRESERVED_KEYWORD}, @@ -411,6 +414,7 @@ const ScanKeyword ScanKeywords[] = { {"with", WITH, RESERVED_KEYWORD}, {"without", WITHOUT, UNRESERVED_KEYWORD}, {"work", WORK, UNRESERVED_KEYWORD}, + {"wrapper", WRAPPER, UNRESERVED_KEYWORD}, {"write", WRITE, UNRESERVED_KEYWORD}, {"xml", XML_P, UNRESERVED_KEYWORD}, {"xmlattributes", XMLATTRIBUTES, COL_NAME_KEYWORD}, |