aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2011-09-21 10:47:47 -0400
committerRobert Haas <rhaas@postgresql.org>2011-09-21 10:48:29 -0400
commitc67bba992533acb1df0fd2f5c5164da2ac9543ae (patch)
tree6b5f707e50dc8cacd766abdc85a56af98ee11b39
parentc47e62949840f670402cb470ce267e9ea2431992 (diff)
downloadpostgresql-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.c25
-rw-r--r--src/test/regress/expected/create_table.out19
-rw-r--r--src/test/regress/sql/create_table.sql14
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;