diff options
author | Robert Haas <rhaas@postgresql.org> | 2011-09-21 10:47:47 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2011-09-21 10:48:29 -0400 |
commit | c67bba992533acb1df0fd2f5c5164da2ac9543ae (patch) | |
tree | 6b5f707e50dc8cacd766abdc85a56af98ee11b39 | |
parent | c47e62949840f670402cb470ce267e9ea2431992 (diff) | |
download | postgresql-c67bba992533acb1df0fd2f5c5164da2ac9543ae.tar.gz postgresql-c67bba992533acb1df0fd2f5c5164da2ac9543ae.zip |
Fix another bit of unlogged-table-induced breakage.
Per bug #6205, reported by Abel Abraham Camarillo Ojeda. This isn't a
particularly elegant fix, but I'm trying to minimize the chances of
causing yet another round of breakage.
Adjust regression tests to exercise this case.
-rw-r--r-- | src/backend/catalog/namespace.c | 25 | ||||
-rw-r--r-- | src/test/regress/expected/create_table.out | 19 | ||||
-rw-r--r-- | src/test/regress/sql/create_table.sql | 14 |
3 files changed, 36 insertions, 22 deletions
diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index 1756bbd5f4b..079a19379b6 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -221,7 +221,6 @@ Datum pg_is_other_temp_schema(PG_FUNCTION_ARGS); Oid RangeVarGetRelid(const RangeVar *relation, bool failOK) { - Oid namespaceId; Oid relId; /* @@ -247,17 +246,27 @@ RangeVarGetRelid(const RangeVar *relation, bool failOK) */ if (relation->relpersistence == RELPERSISTENCE_TEMP) { - if (relation->schemaname) - ereport(ERROR, - (errcode(ERRCODE_INVALID_TABLE_DEFINITION), - errmsg("temporary tables cannot specify a schema name"))); - if (OidIsValid(myTempNamespace)) + if (!OidIsValid(myTempNamespace)) + relId = InvalidOid; /* this probably can't happen? */ + else + { + if (relation->schemaname) + { + Oid namespaceId; + namespaceId = LookupExplicitNamespace(relation->schemaname); + if (namespaceId != myTempNamespace) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("temporary tables cannot specify a schema name"))); + } + relId = get_relname_relid(relation->relname, myTempNamespace); - else /* this probably can't happen? */ - relId = InvalidOid; + } } else if (relation->schemaname) { + Oid namespaceId; + /* use exact schema given */ namespaceId = LookupExplicitNamespace(relation->schemaname); relId = get_relname_relid(relation->relname, namespaceId); diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out index b1dedd469d7..d20790f9098 100644 --- a/src/test/regress/expected/create_table.out +++ b/src/test/regress/expected/create_table.out @@ -204,14 +204,19 @@ CREATE TABLE IF NOT EXISTS test_tsvector( t text ); NOTICE: relation "test_tsvector" already exists, skipping -CREATE UNLOGGED TABLE unlogged1 (a int); -- OK +CREATE UNLOGGED TABLE unlogged1 (a int primary key); -- OK +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "unlogged1_pkey" for table "unlogged1" INSERT INTO unlogged1 VALUES (42); -CREATE UNLOGGED TABLE public.unlogged2 (a int); -- also OK -CREATE UNLOGGED TABLE pg_temp.unlogged3 (a int); -- not OK +CREATE UNLOGGED TABLE public.unlogged2 (a int primary key); -- also OK +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "unlogged2_pkey" for table "unlogged2" +CREATE UNLOGGED TABLE pg_temp.unlogged3 (a int primary key); -- not OK ERROR: only temporary relations may be created in temporary schemas -CREATE TABLE pg_temp.implicity_temp (a int); -- OK -CREATE TEMP TABLE explicitly_temp (a int); -- also OK -CREATE TEMP TABLE pg_temp.doubly_temp (a int); -- also OK -CREATE TEMP TABLE public.temp_to_perm (a int); -- not OK +CREATE TABLE pg_temp.implicitly_temp (a int primary key); -- OK +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "implicitly_temp_pkey" for table "implicitly_temp" +CREATE TEMP TABLE explicitly_temp (a int primary key); -- also OK +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "explicitly_temp_pkey" for table "explicitly_temp" +CREATE TEMP TABLE pg_temp.doubly_temp (a int primary key); -- also OK +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "doubly_temp_pkey" for table "doubly_temp" +CREATE TEMP TABLE public.temp_to_perm (a int primary key); -- not OK ERROR: cannot create temporary relation in non-temporary schema DROP TABLE unlogged1, public.unlogged2; diff --git a/src/test/regress/sql/create_table.sql b/src/test/regress/sql/create_table.sql index c1b2acf94de..a050e8b6d1a 100644 --- a/src/test/regress/sql/create_table.sql +++ b/src/test/regress/sql/create_table.sql @@ -241,12 +241,12 @@ CREATE TABLE IF NOT EXISTS test_tsvector( t text ); -CREATE UNLOGGED TABLE unlogged1 (a int); -- OK +CREATE UNLOGGED TABLE unlogged1 (a int primary key); -- OK INSERT INTO unlogged1 VALUES (42); -CREATE UNLOGGED TABLE public.unlogged2 (a int); -- also OK -CREATE UNLOGGED TABLE pg_temp.unlogged3 (a int); -- not OK -CREATE TABLE pg_temp.implicity_temp (a int); -- OK -CREATE TEMP TABLE explicitly_temp (a int); -- also OK -CREATE TEMP TABLE pg_temp.doubly_temp (a int); -- also OK -CREATE TEMP TABLE public.temp_to_perm (a int); -- not OK +CREATE UNLOGGED TABLE public.unlogged2 (a int primary key); -- also OK +CREATE UNLOGGED TABLE pg_temp.unlogged3 (a int primary key); -- not OK +CREATE TABLE pg_temp.implicitly_temp (a int primary key); -- OK +CREATE TEMP TABLE explicitly_temp (a int primary key); -- also OK +CREATE TEMP TABLE pg_temp.doubly_temp (a int primary key); -- also OK +CREATE TEMP TABLE public.temp_to_perm (a int primary key); -- not OK DROP TABLE unlogged1, public.unlogged2; |