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/catalog/heap.c | |
| parent | 6600d5e91c754789002ed794c18cb856c190f58f (diff) | |
| download | postgresql-0d692a0dc9f0e532c67c577187fe5d7d323cb95b.tar.gz | |
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/catalog/heap.c')
| -rw-r--r-- | src/backend/catalog/heap.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 7cdff403d8..4c55db7e3c 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -43,6 +43,7 @@ #include "catalog/objectaccess.h" #include "catalog/pg_attrdef.h" #include "catalog/pg_constraint.h" +#include "catalog/pg_foreign_table.h" #include "catalog/pg_inherits.h" #include "catalog/pg_namespace.h" #include "catalog/pg_statistic.h" @@ -269,6 +270,7 @@ heap_create(const char *relname, { case RELKIND_VIEW: case RELKIND_COMPOSITE_TYPE: + case RELKIND_FOREIGN_TABLE: create_storage = false; /* @@ -987,7 +989,8 @@ heap_create_with_catalog(const char *relname, /* Use binary-upgrade overrides if applicable */ if (OidIsValid(binary_upgrade_next_heap_relfilenode) && (relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE || - relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE)) + relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE || + relkind == RELKIND_FOREIGN_TABLE)) { relid = binary_upgrade_next_heap_relfilenode; binary_upgrade_next_heap_relfilenode = InvalidOid; @@ -1012,6 +1015,7 @@ heap_create_with_catalog(const char *relname, { case RELKIND_RELATION: case RELKIND_VIEW: + case RELKIND_FOREIGN_TABLE: relacl = get_user_default_acl(ACL_OBJECT_RELATION, ownerid, relnamespace); break; @@ -1049,10 +1053,12 @@ heap_create_with_catalog(const char *relname, * Decide whether to create an array type over the relation's rowtype. We * do not create any array types for system catalogs (ie, those made * during initdb). We create array types for regular relations, views, - * and composite types ... but not, eg, for toast tables or sequences. + * composite types and foreign tables ... but not, eg, for toast tables or + * sequences. */ if (IsUnderPostmaster && (relkind == RELKIND_RELATION || relkind == RELKIND_VIEW || + relkind == RELKIND_FOREIGN_TABLE || relkind == RELKIND_COMPOSITE_TYPE)) new_array_oid = AssignTypeArrayOid(); @@ -1590,10 +1596,31 @@ heap_drop_with_catalog(Oid relid) RelationGetRelationName(rel)))); /* + * Delete pg_foreign_table tuple first. + */ + if (rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE) + { + Relation rel; + HeapTuple tuple; + + rel = heap_open(ForeignTableRelationId, RowExclusiveLock); + + tuple = SearchSysCache1(FOREIGNTABLEREL, ObjectIdGetDatum(relid)); + if (!HeapTupleIsValid(tuple)) + elog(ERROR, "cache lookup failed for foreign table %u", relid); + + simple_heap_delete(rel, &tuple->t_self); + + ReleaseSysCache(tuple); + heap_close(rel, RowExclusiveLock); + } + + /* * Schedule unlinking of the relation's physical files at commit. */ if (rel->rd_rel->relkind != RELKIND_VIEW && - rel->rd_rel->relkind != RELKIND_COMPOSITE_TYPE) + rel->rd_rel->relkind != RELKIND_COMPOSITE_TYPE && + rel->rd_rel->relkind != RELKIND_FOREIGN_TABLE) { RelationDropStorage(rel); } |
