Fix queries reading pg_shdescription
authorMagnus Hagander <magnus@hagander.net>
Tue, 27 Nov 2012 17:22:32 +0000 (18:22 +0100)
committerMagnus Hagander <magnus@hagander.net>
Tue, 27 Nov 2012 17:22:32 +0000 (18:22 +0100)
These queries need to be classoid qualified, so they work when there
are multiple objects with the same oid but of different classes.
(Which can always happen, but is a lot more likely to happen after
a cluster has been pg_upgrade'd)

classes/database/Postgres.php
classes/database/Postgres83.php
classes/database/Postgres91.php

index 0d8a688794c907237b700039ec1339c9ad17bc43..b9737733d76beeea7cea4608a5c72b1517ed92bc 100755 (executable)
@@ -466,7 +466,7 @@ class Postgres extends ADODB_base {
 
                $sql = "
                        SELECT pdb.datname AS datname, pr.rolname AS datowner, pg_encoding_to_char(encoding) AS datencoding,
-                               (SELECT description FROM pg_catalog.pg_shdescription pd WHERE pdb.oid=pd.objoid) AS datcomment,
+                               (SELECT description FROM pg_catalog.pg_shdescription pd WHERE pdb.oid=pd.objoid AND pd.classoid='pg_database'::regclass) AS datcomment,
                                (SELECT spcname FROM pg_catalog.pg_tablespace pt WHERE pt.oid=pdb.dattablespace) AS tablespace,
                                CASE WHEN pg_catalog.has_database_privilege(current_user, pdb.oid, 'CONNECT') 
                                        THEN pg_catalog.pg_database_size(pdb.oid) 
@@ -489,7 +489,7 @@ class Postgres extends ADODB_base {
         */
        function getDatabaseComment($database) {
                $this->clean($database);
-               $sql = "SELECT description FROM pg_catalog.pg_database JOIN pg_catalog.pg_shdescription ON (oid=objoid) WHERE pg_database.datname = '{$database}' ";
+               $sql = "SELECT description FROM pg_catalog.pg_database JOIN pg_catalog.pg_shdescription ON (oid=objoid AND classoid='pg_database'::regclass) WHERE pg_database.datname = '{$database}' ";
                return $this->selectSet($sql);
        }
 
@@ -6939,7 +6939,7 @@ class Postgres extends ADODB_base {
                global $conf;
 
                $sql = "SELECT spcname, pg_catalog.pg_get_userbyid(spcowner) AS spcowner, pg_catalog.pg_tablespace_location(oid) as spclocation,
-                    (SELECT description FROM pg_catalog.pg_shdescription pd WHERE pg_tablespace.oid=pd.objoid) AS spccomment
+                    (SELECT description FROM pg_catalog.pg_shdescription pd WHERE pg_tablespace.oid=pd.objoid AND pd.classoid='pg_tablespace'::regclass) AS spccomment
                                        FROM pg_catalog.pg_tablespace";
 
                if (!$conf['show_system'] && !$all) {
@@ -6959,7 +6959,7 @@ class Postgres extends ADODB_base {
                $this->clean($spcname);
 
                $sql = "SELECT spcname, pg_catalog.pg_get_userbyid(spcowner) AS spcowner, pg_catalog.pg_tablespace_location(oid) as spclocation,
-                    (SELECT description FROM pg_catalog.pg_shdescription pd WHERE pg_tablespace.oid=pd.objoid) AS spccomment
+                    (SELECT description FROM pg_catalog.pg_shdescription pd WHERE pg_tablespace.oid=pd.objoid AND pd.classoid='pg_tablespace'::regclass) AS spccomment
                                        FROM pg_catalog.pg_tablespace WHERE spcname='{$spcname}'";
 
                return $this->selectSet($sql);
index cc80e65e6ae5f05b09371c446a031e711679fb20..3ac4f78924383670690df4e53355f04597ba49bc 100644 (file)
@@ -90,7 +90,7 @@ class Postgres83 extends Postgres84 {
 
                $sql = "
                        SELECT pdb.datname AS datname, pr.rolname AS datowner, pg_encoding_to_char(encoding) AS datencoding,
-                               (SELECT description FROM pg_catalog.pg_shdescription pd WHERE pdb.oid=pd.objoid) AS datcomment,
+                               (SELECT description FROM pg_catalog.pg_shdescription pd WHERE pdb.oid=pd.objoid AND pd.classoid='pg_database'::regclass) AS datcomment,
                                (SELECT spcname FROM pg_catalog.pg_tablespace pt WHERE pt.oid=pdb.dattablespace) AS tablespace,
                                pg_catalog.pg_database_size(pdb.oid) as dbsize
                        FROM pg_catalog.pg_database pdb LEFT JOIN pg_catalog.pg_roles pr ON (pdb.datdba = pr.oid)
index 07dda49312f2a87ec02b9e0416c080642b3a0708..f238925a0fadf2dc9961e89fa73a43ebafa37172 100755 (executable)
@@ -62,7 +62,7 @@ class Postgres91 extends Postgres {
                global $conf;
 
                $sql = "SELECT spcname, pg_catalog.pg_get_userbyid(spcowner) AS spcowner, spclocation,
-                    (SELECT description FROM pg_catalog.pg_shdescription pd WHERE pg_tablespace.oid=pd.objoid) AS spccomment
+                    (SELECT description FROM pg_catalog.pg_shdescription pd WHERE pg_tablespace.oid=pd.objoid AND pd.classoid='pg_tablespace'::regclass) AS spccomment
                                        FROM pg_catalog.pg_tablespace";
 
                if (!$conf['show_system'] && !$all) {
@@ -82,7 +82,7 @@ class Postgres91 extends Postgres {
                $this->clean($spcname);
 
                $sql = "SELECT spcname, pg_catalog.pg_get_userbyid(spcowner) AS spcowner, spclocation,
-                    (SELECT description FROM pg_catalog.pg_shdescription pd WHERE pg_tablespace.oid=pd.objoid) AS spccomment
+                    (SELECT description FROM pg_catalog.pg_shdescription pd WHERE pg_tablespace.oid=pd.objoid AND pd.classoid='pg_tablespace'::regclass) AS spccomment
                                        FROM pg_catalog.pg_tablespace WHERE spcname='{$spcname}'";
 
                return $this->selectSet($sql);