diff options
author | Robert Haas <rhaas@postgresql.org> | 2011-01-01 23:48:11 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2011-01-01 23:48:11 -0500 |
commit | 0d692a0dc9f0e532c67c577187fe5d7d323cb95b (patch) | |
tree | 5177be3794b8ffa768a3cd852221425bd2a74347 /src/backend/parser | |
parent | 6600d5e91c754789002ed794c18cb856c190f58f (diff) | |
download | postgresql-0d692a0dc9f0e532c67c577187fe5d7d323cb95b.tar.gz postgresql-0d692a0dc9f0e532c67c577187fe5d7d323cb95b.zip |
Basic foreign table support.
Foreign tables are a core component of SQL/MED. This commit does
not provide a working SQL/MED infrastructure, because foreign tables
cannot yet be queried. Support for foreign table scans will need to
be added in a future patch. However, this patch creates the necessary
system catalog structure, syntax support, and support for ancillary
operations such as COMMENT and SECURITY LABEL.
Shigeru Hanada, heavily revised by Robert Haas
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/gram.y | 137 | ||||
-rw-r--r-- | src/backend/parser/parse_utilcmd.c | 7 |
2 files changed, 139 insertions, 5 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 8c89d5c5f74..43e8fdbd724 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -185,6 +185,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_ AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterEnumStmt AlterFdwStmt AlterForeignServerStmt AlterGroupStmt AlterObjectSchemaStmt AlterOwnerStmt AlterSeqStmt AlterTableStmt + AlterForeignTableStmt AlterCompositeTypeStmt AlterUserStmt AlterUserMappingStmt AlterUserSetStmt AlterRoleStmt AlterRoleSetStmt AlterDefaultPrivilegesStmt DefACLAction @@ -193,7 +194,8 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_ CreateDomainStmt CreateGroupStmt CreateOpClassStmt CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt CreateSchemaStmt CreateSeqStmt CreateStmt CreateTableSpaceStmt - CreateFdwStmt CreateForeignServerStmt CreateAssertStmt CreateTrigStmt + CreateFdwStmt CreateForeignServerStmt CreateForeignTableStmt + CreateAssertStmt CreateTrigStmt CreateUserStmt CreateUserMappingStmt CreateRoleStmt CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt DoStmt DropGroupStmt DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt @@ -279,6 +281,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_ %type <list> stmtblock stmtmulti OptTableElementList TableElementList OptInherit definition OptTypedTableElementList TypedTableElementList + OptForeignTableElementList ForeignTableElementList reloptions opt_reloptions OptWith opt_distinct opt_definition func_args func_args_list func_args_with_defaults func_args_with_defaults_list @@ -351,6 +354,7 @@ static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_ %type <vsetstmt> set_rest SetResetClause %type <node> TableElement TypedTableElement ConstraintElem TableFuncElement + ForeignTableElement %type <node> columnDef columnOptions %type <defelt> def_elem reloption_elem old_aggr_elem %type <node> def_arg columnElem where_clause where_or_current_clause @@ -658,6 +662,7 @@ stmt : | AlterEnumStmt | AlterFdwStmt | AlterForeignServerStmt + | AlterForeignTableStmt | AlterFunctionStmt | AlterGroupStmt | AlterObjectSchemaStmt @@ -686,6 +691,7 @@ stmt : | CreateDomainStmt | CreateFdwStmt | CreateForeignServerStmt + | CreateForeignTableStmt | CreateFunctionStmt | CreateGroupStmt | CreateOpClassStmt @@ -1935,6 +1941,13 @@ alter_table_cmd: n->def = (Node *)$2; $$ = (Node *)n; } + | alter_generic_options + { + AlterTableCmd *n = makeNode(AlterTableCmd); + n->subtype = AT_GenericOptions; + n->def = (Node *)$1; + $$ = (Node *) n; + } ; alter_column_default: @@ -3383,6 +3396,84 @@ AlterForeignServerStmt: ALTER SERVER name foreign_server_version alter_generic_o /***************************************************************************** * * QUERY: + * CREATE FOREIGN TABLE relname (...) SERVER name (...) + * + *****************************************************************************/ + +CreateForeignTableStmt: + CREATE FOREIGN TABLE qualified_name + OptForeignTableElementList + SERVER name create_generic_options + { + CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt); + $4->relpersistence = RELPERSISTENCE_PERMANENT; + n->base.relation = $4; + n->base.tableElts = $5; + n->base.inhRelations = NIL; + n->base.if_not_exists = false; + /* FDW-specific data */ + n->servername = $7; + n->options = $8; + $$ = (Node *) n; + } + | CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name + OptForeignTableElementList + SERVER name create_generic_options + { + CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt); + $7->relpersistence = RELPERSISTENCE_PERMANENT; + n->base.relation = $7; + n->base.tableElts = $8; + n->base.inhRelations = NIL; + n->base.if_not_exists = true; + /* FDW-specific data */ + n->servername = $10; + n->options = $11; + $$ = (Node *) n; + } + ; + +OptForeignTableElementList: + '(' ForeignTableElementList ')' { $$ = $2; } + | '(' ')' { $$ = NIL; } + ; + +ForeignTableElementList: + ForeignTableElement + { + $$ = list_make1($1); + } + | ForeignTableElementList ',' ForeignTableElement + { + $$ = lappend($1, $3); + } + ; + +ForeignTableElement: + columnDef { $$ = $1; } + ; + +/***************************************************************************** + * + * QUERY: + * ALTER FOREIGN TABLE relname [...] + * + *****************************************************************************/ + +AlterForeignTableStmt: + ALTER FOREIGN TABLE relation_expr alter_table_cmds + { + AlterTableStmt *n = makeNode(AlterTableStmt); + n->relation = $4; + n->cmds = $5; + n->relkind = OBJECT_FOREIGN_TABLE; + $$ = (Node *)n; + } + ; + +/***************************************************************************** + * + * QUERY: * CREATE USER MAPPING FOR auth_ident SERVER name [OPTIONS] * *****************************************************************************/ @@ -4189,6 +4280,7 @@ drop_type: TABLE { $$ = OBJECT_TABLE; } | VIEW { $$ = OBJECT_VIEW; } | INDEX { $$ = OBJECT_INDEX; } | TYPE_P { $$ = OBJECT_TYPE; } + | FOREIGN TABLE { $$ = OBJECT_FOREIGN_TABLE; } | DOMAIN_P { $$ = OBJECT_DOMAIN; } | CONVERSION_P { $$ = OBJECT_CONVERSION; } | SCHEMA { $$ = OBJECT_SCHEMA; } @@ -4247,8 +4339,8 @@ opt_restart_seqs: * CONVERSION | LANGUAGE | OPERATOR CLASS | LARGE OBJECT | * CAST | COLUMN | SCHEMA | TABLESPACE | ROLE | * TEXT SEARCH PARSER | TEXT SEARCH DICTIONARY | - * TEXT SEARCH TEMPLATE | - * TEXT SEARCH CONFIGURATION ] <objname> | + * TEXT SEARCH TEMPLATE | TEXT SEARCH CONFIGURATION | + * FOREIGN TABLE ] <objname> | * AGGREGATE <aggname> (arg1, ...) | * FUNCTION <funcname> (arg1, arg2, ...) | * OPERATOR <op> (leftoperand_typ, rightoperand_typ) | @@ -4425,6 +4517,7 @@ comment_type: | CONVERSION_P { $$ = OBJECT_CONVERSION; } | TABLESPACE { $$ = OBJECT_TABLESPACE; } | ROLE { $$ = OBJECT_ROLE; } + | FOREIGN TABLE { $$ = OBJECT_FOREIGN_TABLE; } ; comment_text: @@ -4506,6 +4599,7 @@ opt_provider: FOR ColId_or_Sconst { $$ = $2; } security_label_type: COLUMN { $$ = OBJECT_COLUMN; } + | FOREIGN TABLE { $$ = OBJECT_FOREIGN_TABLE; } | SCHEMA { $$ = OBJECT_SCHEMA; } | SEQUENCE { $$ = OBJECT_SEQUENCE; } | TABLE { $$ = OBJECT_TABLE; } @@ -4841,6 +4935,14 @@ privilege_target: n->objs = $3; $$ = n; } + | FOREIGN TABLE qualified_name_list + { + PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); + n->targtype = ACL_TARGET_OBJECT; + n->objtype = ACL_OBJECT_FOREIGN_TABLE; + n->objs = $3; + $$ = n; + } | FUNCTION function_with_argtypes_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); @@ -5927,15 +6029,35 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->newname = $6; $$ = (Node *)n; } + | ALTER FOREIGN TABLE relation_expr RENAME TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_FOREIGN_TABLE; + n->relation = $4; + n->subname = NULL; + n->newname = $7; + $$ = (Node *)n; + } | ALTER TABLE relation_expr RENAME opt_column name TO name { RenameStmt *n = makeNode(RenameStmt); n->renameType = OBJECT_COLUMN; + n->relationType = OBJECT_TABLE; n->relation = $3; n->subname = $6; n->newname = $8; $$ = (Node *)n; } + | ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_COLUMN; + n->relationType = OBJECT_FOREIGN_TABLE; + n->relation = $4; + n->subname = $7; + n->newname = $9; + $$ = (Node *)n; + } | ALTER TRIGGER name ON qualified_name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); @@ -6031,6 +6153,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name { RenameStmt *n = makeNode(RenameStmt); n->renameType = OBJECT_ATTRIBUTE; + n->relationType = OBJECT_TYPE; n->relation = makeRangeVarFromAnyName($3, @3, yyscanner); n->subname = $6; n->newname = $8; @@ -6171,6 +6294,14 @@ AlterObjectSchemaStmt: n->newschema = $6; $$ = (Node *)n; } + | ALTER FOREIGN TABLE relation_expr SET SCHEMA name + { + AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); + n->objectType = OBJECT_FOREIGN_TABLE; + n->relation = $4; + n->newschema = $7; + $$ = (Node *)n; + } | ALTER TYPE_P any_name SET SCHEMA name { AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt); diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index d75c706816b..23c60eec318 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -65,7 +65,7 @@ /* State shared by transformCreateStmt and its subroutines */ typedef struct { - const char *stmtType; /* "CREATE TABLE" or "ALTER TABLE" */ + const char *stmtType; /* "CREATE [FOREIGN] TABLE" or "ALTER TABLE" */ RangeVar *relation; /* relation to create */ Relation rel; /* opened/locked rel, if ALTER */ List *inhRelations; /* relations to inherit from */ @@ -173,7 +173,10 @@ transformCreateStmt(CreateStmt *stmt, const char *queryString) pstate = make_parsestate(NULL); pstate->p_sourcetext = queryString; - cxt.stmtType = "CREATE TABLE"; + if (IsA(stmt, CreateForeignTableStmt)) + cxt.stmtType = "CREATE FOREIGN TABLE"; + else + cxt.stmtType = "CREATE TABLE"; cxt.relation = stmt->relation; cxt.rel = NULL; cxt.inhRelations = stmt->inhRelations; |