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;