diff --git a/adminer/drivers/pgsql.inc.php b/adminer/drivers/pgsql.inc.php index 21656465..f04f1e0f 100644 --- a/adminer/drivers/pgsql.inc.php +++ b/adminer/drivers/pgsql.inc.php @@ -207,6 +207,8 @@ if (isset($_GET["pgsql"])) { public $functions = array("char_length", "lower", "round", "to_hex", "to_timestamp", "upper"); public $grouping = array("avg", "count", "count distinct", "max", "min", "sum"); + public string $nsOid = "(SELECT oid FROM pg_namespace WHERE nspname = current_schema())"; + static function connect(?string $server, string $username, string $password) { $connection = parent::connect($server, $username, $password); if (is_string($connection)) { @@ -325,23 +327,15 @@ if (isset($_GET["pgsql"])) { } function inheritsFrom(string $table): array { - return get_vals("SELECT p.relname -FROM pg_class c -JOIN pg_namespace n ON n.nspname = current_schema() AND n.oid = c.relnamespace -JOIN pg_inherits ON inhrelid = c.oid -JOIN pg_class p ON inhparent = p.oid -WHERE c.relname = " . q($table) . " AND c.relkind = 'r' -ORDER BY 1"); + return get_vals("SELECT relname FROM pg_class JOIN pg_inherits ON inhparent = oid WHERE inhrelid = " . $this->tableOid($table) . " ORDER BY 1"); } function inheritedTables(string $table): array { - return get_vals("SELECT c.relname -FROM pg_class p -JOIN pg_namespace n ON n.nspname = current_schema() AND n.oid = p.relnamespace -JOIN pg_inherits ON inhparent = p.oid -JOIN pg_class c ON inhrelid = c.oid -WHERE p.relname = " . q($table) . " AND p.relkind = 'p' -ORDER BY 1"); + return get_vals("SELECT relname FROM pg_inherits JOIN pg_class ON inhrelid = oid WHERE inhparent = " . $this->tableOid($table) . " ORDER BY 1"); + } + + function tableOid(string $table): string { + return "(SELECT oid FROM pg_class WHERE relnamespace = $this->nsOid AND relname = " . q($table) . " AND relkind IN ('r', 'm', 'v', 'f', 'p'))"; } function supportsIndex(array $table_status): bool { @@ -433,12 +427,12 @@ ORDER BY 1"; obj_description(c.oid, 'pg_class') AS \"Comment\", " . (min_version(12) ? "''" : "CASE WHEN c.relhasoids THEN 'oid' ELSE '' END") . " AS \"Oid\", c.reltuples as \"Rows\", - n.nspname + current_schema() AS nspname FROM pg_class c -JOIN pg_namespace n ON n.nspname = current_schema() AND n.oid = c.relnamespace LEFT JOIN pg_inherits ON inhrelid = c.oid WHERE relkind IN ('r', 'm', 'v', 'f', 'p') -" . ($name != "" ? "AND relname = " . q($name) : "AND inhparent IS NULL ORDER BY relname")) as $row //! Auto_increment +AND c.relnamespace = " . driver()->nsOid . " +AND " . ($name != "" ? "relname = " . q($name) : "inhparent IS NULL ORDER BY relname")) as $row //! Auto_increment ) { $return[$row["Name"]] = $row; } @@ -465,15 +459,12 @@ WHERE relkind IN ('r', 'm', 'v', 'f', 'p') format_type(a.atttypid, a.atttypmod) AS full_type, pg_get_expr(d.adbin, d.adrelid) AS default, a.attnotnull::int, - col_description(c.oid, a.attnum) AS comment" . (min_version(10) ? ", + col_description(a.attrelid, a.attnum) AS comment" . (min_version(10) ? ", a.attidentity" . (min_version(12) ? ", a.attgenerated" : "") : "") . " -FROM pg_class c -JOIN pg_namespace n ON c.relnamespace = n.oid -JOIN pg_attribute a ON c.oid = a.attrelid -LEFT JOIN pg_attrdef d ON c.oid = d.adrelid AND a.attnum = d.adnum -WHERE c.relname = " . q($table) . " -AND n.nspname = current_schema() +FROM pg_attribute a +LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum +WHERE a.attrelid = " . driver()->tableOid($table) . " AND NOT a.attisdropped AND a.attnum > 0 ORDER BY a.attnum") as $row @@ -509,12 +500,13 @@ ORDER BY a.attnum") as $row function indexes($table, $connection2 = null) { $connection2 = connection($connection2); $return = array(); - $table_oid = get_val("SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema()) AND relname = " . q($table), 0, $connection2); + $table_oid = driver()->tableOid($table); $columns = get_key_vals("SELECT attnum, attname FROM pg_attribute WHERE attrelid = $table_oid AND attnum > 0", $connection2); foreach ( get_rows("SELECT relname, indisunique::int, indisprimary::int, indkey, indoption, (indpred IS NOT NULL)::int as indispartial -FROM pg_index i, pg_class ci -WHERE i.indrelid = $table_oid AND ci.oid = i.indexrelid +FROM pg_index i +JOIN pg_class c ON i.indexrelid = c.oid +WHERE i.indrelid = $table_oid ORDER BY indisprimary DESC, indisunique DESC", $connection2) as $row ) { $relname = $row["relname"]; @@ -539,7 +531,7 @@ ORDER BY indisprimary DESC, indisunique DESC", $connection2) as $row foreach ( get_rows("SELECT conname, condeferrable::int AS deferrable, pg_get_constraintdef(oid) AS definition FROM pg_constraint -WHERE conrelid = (SELECT pc.oid FROM pg_class AS pc INNER JOIN pg_namespace AS pn ON (pn.oid = pc.relnamespace) WHERE pc.relname = " . q($table) . " AND pn.nspname = current_schema()) +WHERE conrelid = " . driver()->tableOid($table) . " AND contype = 'f'::char ORDER BY conkey, conname") as $row ) { @@ -559,7 +551,7 @@ ORDER BY conkey, conname") as $row } function view($name) { - return array("select" => trim(get_val("SELECT pg_get_viewdef(" . get_val("SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema()) AND relname = " . q($name)) . ")"))); + return array("select" => trim(get_val("SELECT pg_get_viewdef(" . driver()->tableOid($name) . ")"))); } function collations() { @@ -819,7 +811,7 @@ ORDER BY SPECIFIC_NAME'); return get_key_vals( "SELECT oid, typname FROM pg_type -WHERE typnamespace = (SELECT oid FROM pg_namespace WHERE nspname = current_schema()) +WHERE typnamespace = " . driver()->nsOid . " AND typtype IN ('b','d','e') AND typelem = 0" );