From fde2064de9f078c2fd7c2c1d916f0a4062324902 Mon Sep 17 00:00:00 2001 From: Constantine Karnaukhov Date: Thu, 25 Nov 2021 20:39:39 +0400 Subject: [PATCH] fix(driver): apply filter everywhere by public schema in PostgresTable --- src/Driver/Postgres/Schema/PostgresTable.php | 40 ++++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/Driver/Postgres/Schema/PostgresTable.php b/src/Driver/Postgres/Schema/PostgresTable.php index 26a6a847..1c147978 100644 --- a/src/Driver/Postgres/Schema/PostgresTable.php +++ b/src/Driver/Postgres/Schema/PostgresTable.php @@ -72,18 +72,20 @@ protected function fetchColumns(): array { //Required for constraints fetch $tableOID = $this->driver->query( - 'SELECT oid FROM pg_class WHERE relname = ?', + "SELECT pg_class.oid FROM pg_class + JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace + WHERE pg_class.relname = ? AND pg_namespace.nspname = 'public'", [ $this->getName(), ] )->fetchColumn(); $query = $this->driver->query( - 'SELECT * - FROM information_schema.columns - JOIN pg_type - ON (pg_type.typname = columns.udt_name) - WHERE table_name = ?', + "SELECT * + FROM information_schema.columns + JOIN pg_type + ON (pg_type.typname = columns.udt_name) + WHERE table_name = ? AND table_schema = 'public'", [$this->getName()] ); @@ -117,16 +119,14 @@ protected function fetchColumns(): array */ protected function fetchIndexes(bool $all = false): array { - $query = "SELECT * FROM pg_indexes WHERE schemaname = 'public' AND tablename = ?"; + $query = "SELECT i.indexname, i.indexdef, c.contype FROM pg_indexes i\n" . + "LEFT JOIN pg_constraint c ON c.conname = i.indexname " . + "AND c.connamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public')\n" . + "WHERE i.schemaname = 'public' AND tablename = ?"; $result = []; foreach ($this->driver->query($query, [$this->getName()]) as $schema) { - $conType = $this->driver->query( - 'SELECT contype FROM pg_constraint WHERE conname = ?', - [$schema['indexname']] - )->fetchColumn(); - - if ($conType === 'p') { + if ($schema['contype'] === 'p') { //Skipping primary keys continue; } @@ -153,7 +153,7 @@ protected function fetchReferences(): array . " ON ccu.constraint_name = tc.constraint_name\n" . "JOIN information_schema.referential_constraints AS rc\n" . " ON rc.constraint_name = tc.constraint_name\n" - . "WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name = ?"; + . "WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name = ? AND tc.table_schema = 'public'"; $fks = []; foreach ($this->driver->query($query, [$this->getName()]) as $schema) { @@ -185,15 +185,13 @@ protected function fetchReferences(): array */ protected function fetchPrimaryKeys(): array { - $query = "SELECT * FROM pg_indexes WHERE schemaname = 'public' AND tablename = ?"; + $query = "SELECT i.indexname, i.indexdef, c.contype FROM pg_indexes i\n" . + "LEFT JOIN pg_constraint c ON c.conname = i.indexname " . + "AND c.connamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public')\n" . + "WHERE i.schemaname = 'public' AND tablename = ?"; foreach ($this->driver->query($query, [$this->getName()]) as $schema) { - $conType = $this->driver->query( - 'SELECT contype FROM pg_constraint WHERE conname = ?', - [$schema['indexname']] - )->fetchColumn(); - - if ($conType !== 'p') { + if ($schema['contype'] !== 'p') { //Skipping primary keys continue; }