From b853bda2a27622c835817b911af8c538eaf659ea Mon Sep 17 00:00:00 2001 From: Rahul Shirsat Date: Mon, 26 Apr 2021 14:32:34 +0530 Subject: [PATCH] =?UTF-8?q?Fixed=20an=20issue=20where=20the=20wrong=20SQL?= =?UTF-8?q?=20is=20showing=C2=A0for=20the=20child=20partition=20tables.=20?= =?UTF-8?q?Fixes=20#6329?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en_US/release_notes_5_3.rst | 1 + .../check_constraint/sql/9.2_plus/nodes.sql | 2 +- .../sql/9.2_plus/properties.sql | 2 +- .../check_constraint/sql/default/nodes.sql | 2 +- .../sql/default/properties.sql | 2 +- .../foreign_key/sql/9.1_plus/properties.sql | 3 +- .../foreign_key/sql/default/properties.sql | 3 +- .../sql/11_plus/properties.sql | 1 + .../sql/default/properties.sql | 1 + .../servers/databases/schemas/tables/utils.py | 79 ++++++++++++++++--- 10 files changed, 77 insertions(+), 19 deletions(-) diff --git a/docs/en_US/release_notes_5_3.rst b/docs/en_US/release_notes_5_3.rst index 04c58f403..011cdd60d 100644 --- a/docs/en_US/release_notes_5_3.rst +++ b/docs/en_US/release_notes_5_3.rst @@ -17,5 +17,6 @@ Housekeeping Bug fixes ********* +| `Issue #6329 `_ - Fixed an issue where the wrong SQL is showing for the child partition tables. | `Issue #6341 `_ - Fixed an issue where CSV download quotes the numeric columns. | `Issue #6385 `_ - Ensure that Backup and Restore should work on shared servers. diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/9.2_plus/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/9.2_plus/nodes.sql index e3ac2505b..c859975e9 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/9.2_plus/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/9.2_plus/nodes.sql @@ -1,5 +1,5 @@ SELECT c.oid, conname as name, - NOT convalidated as convalidated + NOT convalidated as convalidated, conislocal FROM pg_catalog.pg_constraint c WHERE contype = 'c' AND conrelid = {{ tid }}::oid diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/9.2_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/9.2_plus/properties.sql index 08a1aa5fc..5673b1312 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/9.2_plus/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/9.2_plus/properties.sql @@ -1,6 +1,6 @@ SELECT c.oid, conname as name, relname, nspname, description as comment, pg_catalog.pg_get_expr(conbin, conrelid, true) as consrc, - connoinherit, NOT convalidated as convalidated + connoinherit, NOT convalidated as convalidated, conislocal FROM pg_catalog.pg_constraint c JOIN pg_catalog.pg_class cl ON cl.oid=conrelid JOIN pg_catalog.pg_namespace nl ON nl.oid=relnamespace diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/default/nodes.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/default/nodes.sql index 020eecca0..424706199 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/default/nodes.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/default/nodes.sql @@ -1,4 +1,4 @@ -SELECT c.oid, conname as name +SELECT c.oid, conname as name, conislocal FROM pg_catalog.pg_constraint c WHERE contype = 'c' AND conrelid = {{ tid }}::oid diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/default/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/default/properties.sql index ef0d65e22..19bd6fba7 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/default/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/check_constraint/sql/default/properties.sql @@ -1,5 +1,5 @@ SELECT c.oid, conname as name, relname, nspname, description as comment , - pg_catalog.pg_get_expr(conbin, conrelid, true) as consrc + pg_catalog.pg_get_expr(conbin, conrelid, true) as consrc, conislocal FROM pg_catalog.pg_constraint c JOIN pg_catalog.pg_class cl ON cl.oid=conrelid JOIN pg_catalog.pg_namespace nl ON nl.oid=relnamespace diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/9.1_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/9.1_plus/properties.sql index ce2c5a1fe..610100093 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/9.1_plus/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/9.1_plus/properties.sql @@ -16,7 +16,8 @@ SELECT ct.oid, nr.nspname as refnsp, cr.relname as reftab, description as comment, - convalidated + convalidated, + conislocal FROM pg_catalog.pg_constraint ct JOIN pg_catalog.pg_class cl ON cl.oid=conrelid JOIN pg_catalog.pg_namespace nl ON nl.oid=cl.relnamespace diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/default/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/default/properties.sql index 0a2b4f484..a827b783f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/default/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/foreign_key/sql/default/properties.sql @@ -17,7 +17,8 @@ SELECT cl.relname as fktab, nr.nspname as refnsp, cr.relname as reftab, - description as comment + description as comment, + conislocal FROM pg_catalog.pg_constraint ct JOIN pg_catalog.pg_class cl ON cl.oid=conrelid JOIN pg_catalog.pg_namespace nl ON nl.oid=cl.relnamespace diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/11_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/11_plus/properties.sql index b1d5c69c5..220a3d84f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/11_plus/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/11_plus/properties.sql @@ -14,6 +14,7 @@ SELECT cls.oid, END AS comment, condeferrable, condeferred, + conislocal, substring(pg_catalog.array_to_string(cls.reloptions, ',') from 'fillfactor=([0-9]*)') AS fillfactor FROM pg_catalog.pg_index idx JOIN pg_catalog.pg_class cls ON cls.oid=indexrelid diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/properties.sql index 0307e46c6..83ade7ff0 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/properties.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/index_constraint/sql/default/properties.sql @@ -14,6 +14,7 @@ SELECT cls.oid, END AS comment, condeferrable, condeferred, + conislocal, substring(pg_catalog.array_to_string(cls.reloptions, ',') from 'fillfactor=([0-9]*)') AS fillfactor FROM pg_catalog.pg_index idx JOIN pg_catalog.pg_class cls ON cls.oid=indexrelid diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py index c93f4a861..93a6616b4 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/utils.py @@ -294,20 +294,25 @@ class BaseTableView(PGChildNodeView, BasePartitionTable, VacuumSettings): idxcons_utils.get_index_constraints(self.conn, did, tid, ctype) if status: for cons in constraints: - data.setdefault( - index_constraints[ctype], []).append(cons) + if not self.\ + _is_partition_and_constraint_inherited(cons, data): + data.setdefault( + index_constraints[ctype], []).append(cons) # Add Foreign Keys status, foreign_keys = fkey_utils.get_foreign_keys(self.conn, tid) if status: for fk in foreign_keys: - data.setdefault('foreign_key', []).append(fk) + if not self._is_partition_and_constraint_inherited(fk, data): + data.setdefault('foreign_key', []).append(fk) # Add Check Constraints status, check_constraints = \ check_utils.get_check_constraints(self.conn, tid) if status: - data['check_constraint'] = check_constraints + for cc in check_constraints: + if not self._is_partition_and_constraint_inherited(cc, data): + data.setdefault('check_constraint', []).append(cc) # Add Exclusion Constraint status, exclusion_constraints = \ @@ -316,6 +321,23 @@ class BaseTableView(PGChildNodeView, BasePartitionTable, VacuumSettings): for ex in exclusion_constraints: data.setdefault('exclude_constraint', []).append(ex) + @staticmethod + def _is_partition_and_constraint_inherited(constraint, data): + + """ + This function will check whether a constraint is local or + inherited only for partition table + :param constraint: given constraint + :param data: partition table data + :return: True or False based on condition + """ + # check whether the table is partition or not, then check conislocal + if 'relispartition' in data and data['relispartition'] is True: + if 'conislocal' in constraint \ + and constraint['conislocal'] is False: + return True + return False + def get_table_dependents(self, tid): """ This function get the dependents and return ajax response @@ -820,7 +842,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable, VacuumSettings): main_sql.append(rules_sql) def _get_resql_for_partitions(self, data, rset, json_resp, - diff_partition_sql, main_sql): + diff_partition_sql, main_sql, did): """ ########################################## # Reverse engineered sql for PARTITIONS @@ -828,6 +850,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable, VacuumSettings): """ sql_header = '' + partition_sql_arr = [] if len(rset['rows']): if json_resp: sql_header = "\n-- Partitions SQL" @@ -900,18 +923,48 @@ class BaseTableView(PGChildNodeView, BasePartitionTable, VacuumSettings): part_data['vacuum_toast'] = \ copy.deepcopy(self.parse_vacuum_data( self.conn, row, 'toast')) + + scid = row['schema_id'] + schema = part_data['schema'] + table = part_data['name'] + + # Get all the supported constraints for partition table + self._add_constrints_to_output(part_data, did, row['oid']) + partition_sql += render_template("/".join( [self.partition_template_path, self._CREATE_SQL]), data=part_data, conn=self.conn) + '\n' - # Add into main sql - partition_sql = re.sub(self.pattern, self.double_newline, - partition_sql).strip('\n') - partition_main_sql = partition_sql.strip('\n') + partition_sql = re.sub(self.pattern, self.double_newline, + partition_sql).strip('\n') + + partition_main_sql = partition_sql.strip('\n') + + # Add into partition sql to partition array + partition_sql_arr.append(partition_main_sql) + + # Get Reverse engineered sql for ROW SECURITY POLICY + self._get_resql_for_row_security_policy(scid, row['oid'], + json_resp, + partition_sql_arr, + schema, table) + + # Get Reverse engineered sql for Triggers + self._get_resql_for_triggers(row['oid'], json_resp, + partition_sql_arr, schema, table) + + # Get Reverse engineered sql for Compound Triggers + self._get_resql_for_compound_triggers(row['oid'], + partition_sql_arr, + schema, table) + + # Get Reverse engineered sql for Rules + self._get_resql_for_rules(row['oid'], partition_sql_arr, table, + json_resp) + if not diff_partition_sql: - main_sql.append( - sql_header + self.double_newline + partition_main_sql - ) + main_sql.append(sql_header + '\n') + main_sql += partition_sql_arr def get_reverse_engineered_sql(self, **kwargs): """ @@ -964,7 +1017,7 @@ class BaseTableView(PGChildNodeView, BasePartitionTable, VacuumSettings): return internal_server_error(errormsg=rset) self._get_resql_for_partitions(data, rset, json_resp, - diff_partition_sql, main_sql) + diff_partition_sql, main_sql, did) sql = '\n'.join(main_sql)