]> granicus.if.org Git - postgresql/commitdiff
Fix another bit of unlogged-table-induced breakage.
authorRobert Haas <rhaas@postgresql.org>
Wed, 21 Sep 2011 14:32:30 +0000 (10:32 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 21 Sep 2011 14:48:31 +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 040bef6addbecd934c173eac9f81bb65502494dd..fcc90fed5fd16eaca06a31f05f9f827d388bc268 100644 (file)
@@ -225,7 +225,6 @@ RangeVarGetRelid(const RangeVar *relation, LOCKMODE lockmode, bool missing_ok,
                                 bool nowait)
 {
        uint64          inval_count;
-       Oid                     namespaceId;
        Oid                     relId;
        Oid                     oldRelId = InvalidOid;
        bool            retry = false;
@@ -278,17 +277,27 @@ RangeVarGetRelid(const RangeVar *relation, LOCKMODE lockmode, bool missing_ok,
                 */
                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;