From ce20dbc25a393004c5249d946f9a85a691cacd48 Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Fri, 16 Sep 2016 11:24:54 +0100 Subject: [PATCH] Add classid filter to queries on pg_depend. Fixes #1705 There are a number of cases where queries in both pgadmin4 and pgadmin3 are done against pg_depend but falis to constrain the query on classid. In particular, if for example a constraint and a sequence exists with the same oid (which is perfectly valid, as they are in different tables), a column will suddenly refer sequences that are completely incorrect. When we look up sequences, we have to make sure we only match dependencies against pg_class. --- .../templates/catalog_object_column/sql/9.1_plus/properties.sql | 2 +- .../tables/templates/column/sql/9.1_plus/is_referenced.sql | 1 + .../schemas/tables/templates/column/sql/9.1_plus/nodes.sql | 2 +- .../schemas/tables/templates/column/sql/9.1_plus/properties.sql | 2 +- .../tables/templates/column/sql/9.2_plus/is_referenced.sql | 1 + .../schemas/tables/templates/column/sql/9.2_plus/nodes.sql | 2 +- .../schemas/tables/templates/column/sql/9.2_plus/properties.sql | 2 +- 7 files changed, 7 insertions(+), 5 deletions(-) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/templates/catalog_object_column/sql/9.1_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/templates/catalog_object_column/sql/9.1_plus/properties.sql index 8be7e994c..b2ca255b9 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/templates/catalog_object_column/sql/9.1_plus/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/templates/catalog_object_column/sql/9.1_plus/properties.sql @@ -28,7 +28,7 @@ FROM pg_attribute att LEFT OUTER JOIN pg_type et ON et.oid=ty.typelem LEFT OUTER JOIN pg_attrdef def ON adrelid=att.attrelid AND adnum=att.attnum LEFT OUTER JOIN pg_description des ON (des.objoid=att.attrelid AND des.objsubid=att.attnum AND des.classoid='pg_class'::regclass) - LEFT OUTER JOIN (pg_depend JOIN pg_class cs ON objid=cs.oid AND cs.relkind='S') ON refobjid=att.attrelid AND refobjsubid=att.attnum + LEFT OUTER JOIN (pg_depend JOIN pg_class cs ON objid=cs.oid AND classid='pg_class'::regclass AND cs.relkind='S') ON refobjid=att.attrelid AND refobjsubid=att.attnum LEFT OUTER JOIN pg_namespace ns ON ns.oid=cs.relnamespace LEFT OUTER JOIN pg_index pi ON pi.indrelid=att.attrelid AND indisprimary LEFT OUTER JOIN pg_collation coll ON att.attcollation=coll.oid diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.1_plus/is_referenced.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.1_plus/is_referenced.sql index 7d0bfc367..52a4ffa86 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.1_plus/is_referenced.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.1_plus/is_referenced.sql @@ -2,4 +2,5 @@ SELECT COUNT(1) FROM pg_depend dep JOIN pg_class cl ON dep.classid=cl.oid AND relname='pg_rewrite' WHERE refobjid= {{tid}}::oid + AND classid='pg_class'::regclass AND refobjsubid= {{clid|qtLiteral}}; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.1_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.1_plus/nodes.sql index 5083dfdc4..7536a9cf1 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.1_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.1_plus/nodes.sql @@ -6,7 +6,7 @@ FROM pg_attribute att JOIN pg_namespace na ON na.oid=cl.relnamespace LEFT OUTER JOIN pg_type et ON et.oid=ty.typelem LEFT OUTER JOIN pg_attrdef def ON adrelid=att.attrelid AND adnum=att.attnum - LEFT OUTER JOIN (pg_depend JOIN pg_class cs ON objid=cs.oid AND cs.relkind='S') ON refobjid=att.attrelid AND refobjsubid=att.attnum + LEFT OUTER JOIN (pg_depend JOIN pg_class cs ON classid='pg_class'::regclass AND objid=cs.oid AND cs.relkind='S') ON refobjid=att.attrelid AND refobjsubid=att.attnum LEFT OUTER JOIN pg_namespace ns ON ns.oid=cs.relnamespace LEFT OUTER JOIN pg_index pi ON pi.indrelid=att.attrelid AND indisprimary WHERE diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.1_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.1_plus/properties.sql index 130b4a827..bb96cff89 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.1_plus/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.1_plus/properties.sql @@ -28,7 +28,7 @@ FROM pg_attribute att LEFT OUTER JOIN pg_type et ON et.oid=ty.typelem LEFT OUTER JOIN pg_attrdef def ON adrelid=att.attrelid AND adnum=att.attnum LEFT OUTER JOIN pg_description des ON (des.objoid=att.attrelid AND des.objsubid=att.attnum AND des.classoid='pg_class'::regclass) - LEFT OUTER JOIN (pg_depend JOIN pg_class cs ON objid=cs.oid AND cs.relkind='S') ON refobjid=att.attrelid AND refobjsubid=att.attnum + LEFT OUTER JOIN (pg_depend JOIN pg_class cs ON classid='pg_class'::regclass AND objid=cs.oid AND cs.relkind='S') ON refobjid=att.attrelid AND refobjsubid=att.attnum LEFT OUTER JOIN pg_namespace ns ON ns.oid=cs.relnamespace LEFT OUTER JOIN pg_index pi ON pi.indrelid=att.attrelid AND indisprimary LEFT OUTER JOIN pg_collation coll ON att.attcollation=coll.oid diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/is_referenced.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/is_referenced.sql index 7d0bfc367..52a4ffa86 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/is_referenced.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/is_referenced.sql @@ -2,4 +2,5 @@ SELECT COUNT(1) FROM pg_depend dep JOIN pg_class cl ON dep.classid=cl.oid AND relname='pg_rewrite' WHERE refobjid= {{tid}}::oid + AND classid='pg_class'::regclass AND refobjsubid= {{clid|qtLiteral}}; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/nodes.sql index 7c8a1ac78..759e65764 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/nodes.sql @@ -6,7 +6,7 @@ FROM pg_attribute att JOIN pg_namespace na ON na.oid=cl.relnamespace LEFT OUTER JOIN pg_type et ON et.oid=ty.typelem LEFT OUTER JOIN pg_attrdef def ON adrelid=att.attrelid AND adnum=att.attnum - LEFT OUTER JOIN (pg_depend JOIN pg_class cs ON objid=cs.oid AND cs.relkind='S') ON refobjid=att.attrelid AND refobjsubid=att.attnum + LEFT OUTER JOIN (pg_depend JOIN pg_class cs ON classid='pg_class'::regclass AND objid=cs.oid AND cs.relkind='S') ON refobjid=att.attrelid AND refobjsubid=att.attnum LEFT OUTER JOIN pg_namespace ns ON ns.oid=cs.relnamespace LEFT OUTER JOIN pg_index pi ON pi.indrelid=att.attrelid AND indisprimary WHERE diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/properties.sql index 8c5b18935..b38349689 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/properties.sql @@ -28,7 +28,7 @@ FROM pg_attribute att LEFT OUTER JOIN pg_type et ON et.oid=ty.typelem LEFT OUTER JOIN pg_attrdef def ON adrelid=att.attrelid AND adnum=att.attnum LEFT OUTER JOIN pg_description des ON (des.objoid=att.attrelid AND des.objsubid=att.attnum AND des.classoid='pg_class'::regclass) - LEFT OUTER JOIN (pg_depend JOIN pg_class cs ON objid=cs.oid AND cs.relkind='S') ON refobjid=att.attrelid AND refobjsubid=att.attnum + LEFT OUTER JOIN (pg_depend JOIN pg_class cs ON classid='pg_class'::regclass AND objid=cs.oid AND cs.relkind='S') ON refobjid=att.attrelid AND refobjsubid=att.attnum LEFT OUTER JOIN pg_namespace ns ON ns.oid=cs.relnamespace LEFT OUTER JOIN pg_index pi ON pi.indrelid=att.attrelid AND indisprimary LEFT OUTER JOIN pg_collation coll ON att.attcollation=coll.oid