Hi hackers,

While reading code and doing some testing, I found that if we create a
temporary table with same name as we created a normal(global) table, then
\d is showing only temporary table info.  I think, ideally we should
display info of both the tables. Below is the example:

postgres=# create table t (a int);
CREATE TABLE
postgres=# create temporary table t (a int);
CREATE TABLE
postgres=# \d
          List of relations
  Schema   | Name | Type  |  Owner
-----------+------+-------+----------
 pg_temp_2 | t    | table | mahendra
(1 row)


*Expected behavior:*
postgres=# \d
          List of relations
  Schema   | Name | Type  |  Owner
-----------+------+-------+----------
 pg_temp_2 | t    | table | mahendra
 public    | t    | table | mahendra
(2 rows)


For me, It looks like a bug.

I debugged and found that due to below code, we are showing only temp table
information.

        /*
         * If it is in the path, it might still not be visible; it could be
         * hidden by another relation of the same name earlier in the path.
So
         * we must do a slow check for conflicting relations.
         */
        char       *relname = NameStr(relform->relname);
        ListCell   *l;

        visible = false;
        foreach(l, activeSearchPath)
        {
            Oid            namespaceId = lfirst_oid(l);

            if (namespaceId == relnamespace)
            {
                /* Found it first in path */
                visible = true;
                break;
            }
            if (OidIsValid(get_relname_relid(relname, namespaceId)))
            {
                /* Found something else first in path */
                break;
            }
        }

postgres=# select oid, relname , relnamespace , reltype from pg_class where
relname = 't';
  oid  | relname | relnamespace | reltype
-------+---------+--------------+---------
 16384 | t       |         2200 |   16386
 16389 | t       |        16387 |   16391
(2 rows)

For able example, we have 3 namespaceId in the activeSearchPath list
(16387->temporary_table, 11, 2200->noraml-table). As I can see that 16387
is the 1st oid in list, that is corresponds to temp table, we are
displaying info of temp table but when we are checking visibility of normal
table, then we exiting from list after comparing with 1st oid because 16387
is the 1st in list and that oid is valid.

If this is a bug, then please let me know. I will be happy to fix this.

Thanks and Regards
Mahendra Singh Thalor
EnterpriseDB: http://www.enterprisedb.com

Reply via email to