1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-22 21:53:06 +03:00

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
This commit is contained in:
Peter Eisentraut
2008-12-19 16:25:19 +00:00
parent 1eec10a2de
commit cae565e503
76 changed files with 8452 additions and 125 deletions

View File

@@ -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
@@ -2715,6 +2739,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 :
@@ -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

View File

@@ -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},