]> granicus.if.org Git - postgresql/commitdiff
Fix another bit of unlogged-table-induced breakage.
authorRobert Haas <rhaas@postgresql.org>
Wed, 21 Sep 2011 14:47:47 +0000 (10:47 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 21 Sep 2011 14:48:29 +0000 (10:48 -0400)
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.

src/backend/catalog/namespace.c
src/test/regress/expected/create_table.out
src/test/regress/sql/create_table.sql

index 1756bbd5f4b42971fc36e52da70df066f18162f7..079a19379b643368125044bc63f7dfa4a7e9d628 100644 (file)
@@ -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);
index b1dedd469d77163cc51f93bbe7f0c422199879d6..d20790f9098492176dc2d3a298f4f5ec665e9323 100644 (file)
@@ -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;
index c1b2acf94de9e47d11a1db72985b1dc201e62717..a050e8b6d1a67b71f9105f38858e6c6379e02578 100644 (file)
@@ -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;