From 4fe69e825e6b2b91403969cce8dbfe5942c6f159 Mon Sep 17 00:00:00 2001 From: Akshay Joshi Date: Thu, 19 Mar 2020 13:54:25 +0530 Subject: [PATCH] Added support of Collation, FTS Configuration, FTS Dictionary, FTS Parser, and FTS Template to the Schema Diff. Fixes #5261 --- docs/en_US/release_notes_4_20.rst | 1 + .../databases/schemas/collations/__init__.py | 52 ++++++++++- .../collations/sql/default/update.sql | 18 ++++ .../schemas/fts_configurations/__init__.py | 64 +++++++++++++- .../schemas/fts_dictionaries/__init__.py | 51 ++++++++++- .../databases/schemas/fts_parsers/__init__.py | 64 +++++++++++++- .../fts_parsers/sql/default/update.sql | 17 ++++ .../schemas/fts_templates/__init__.py | 64 +++++++++++++- .../fts_templates/sql/default/update.sql | 15 ++++ .../servers/databases/schemas/tables/utils.py | 5 +- web/pgadmin/tools/schema_diff/__init__.py | 2 +- .../tools/schema_diff/directory_compare.py | 64 +++++++++----- .../schema_diff/tests/pg/10_plus/source.sql | 88 +++++++++++++++++++ .../schema_diff/tests/pg/10_plus/target.sql | 70 +++++++++++++++ .../schema_diff/tests/pg/11_plus/source.sql | 88 +++++++++++++++++++ .../schema_diff/tests/pg/11_plus/target.sql | 70 +++++++++++++++ .../schema_diff/tests/pg/12_plus/source.sql | 88 +++++++++++++++++++ .../schema_diff/tests/pg/12_plus/target.sql | 70 +++++++++++++++ .../schema_diff/tests/pg/9.2_plus/source.sql | 86 ++++++++++++++++++ .../schema_diff/tests/pg/9.2_plus/target.sql | 70 +++++++++++++++ .../schema_diff/tests/ppas/10_plus/source.sql | 88 +++++++++++++++++++ .../schema_diff/tests/ppas/10_plus/target.sql | 70 +++++++++++++++ .../tests/ppas/9.2_plus/source.sql | 87 ++++++++++++++++++ .../tests/ppas/9.2_plus/target.sql | 70 +++++++++++++++ .../tests/test_schema_diff_comp.py | 2 + 25 files changed, 1329 insertions(+), 35 deletions(-) diff --git a/docs/en_US/release_notes_4_20.rst b/docs/en_US/release_notes_4_20.rst index be1a58c0d..f22d55ebb 100644 --- a/docs/en_US/release_notes_4_20.rst +++ b/docs/en_US/release_notes_4_20.rst @@ -9,6 +9,7 @@ This release contains a number of bug fixes and new features since the release o New features ************ +| `Issue #5261 `_ - Added support of Collation, FTS Configuration, FTS Dictionary, FTS Parser, and FTS Template to the Schema Diff. Housekeeping ************ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py index 8c2de07f7..4c67480b3 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/__init__.py @@ -501,7 +501,7 @@ class CollationView(PGChildNodeView, SchemaDiffObjectCompare): ) @check_precondition - def delete(self, gid, sid, did, scid, coid=None): + def delete(self, gid, sid, did, scid, coid=None, only_sql=False): """ This function will delete existing the collation object @@ -511,6 +511,7 @@ class CollationView(PGChildNodeView, SchemaDiffObjectCompare): did: Database ID scid: Schema ID coid: Collation ID + only_sql: Return only sql if True """ if coid is None: data = request.form if request.form else json.loads( @@ -548,6 +549,11 @@ class CollationView(PGChildNodeView, SchemaDiffObjectCompare): nspname=data['schema'], cascade=cascade, conn=self.conn) + + # Used for schema diff tool + if only_sql: + return SQL + status, res = self.conn.execute_scalar(SQL) if not status: return internal_server_error(errormsg=res) @@ -685,7 +691,8 @@ class CollationView(PGChildNodeView, SchemaDiffObjectCompare): return SQL.strip('\n'), data['name'] @check_precondition - def sql(self, gid, sid, did, scid, coid): + def sql(self, gid, sid, did, scid, coid, diff_schema=None, + json_resp=True): """ This function will generates reverse engineered sql for collation object @@ -696,6 +703,8 @@ class CollationView(PGChildNodeView, SchemaDiffObjectCompare): did: Database ID scid: Schema ID coid: Collation ID + diff_schema: Target Schema for schema diff + json_resp: True then return json response """ SQL = render_template("/".join([self.template_path, 'properties.sql']), @@ -710,6 +719,9 @@ class CollationView(PGChildNodeView, SchemaDiffObjectCompare): data = res['rows'][0] + if diff_schema: + data['schema'] = diff_schema + SQL = render_template("/".join([self.template_path, 'create.sql']), data=data, conn=self.conn) @@ -722,6 +734,9 @@ class CollationView(PGChildNodeView, SchemaDiffObjectCompare): nspname=data['schema']) SQL = sql_header + '\n\n' + SQL.strip('\n') + if not json_resp: + return SQL + return ajax_response(response=SQL) @check_precondition @@ -793,5 +808,38 @@ class CollationView(PGChildNodeView, SchemaDiffObjectCompare): return res + def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None, + diff_schema=None, drop_sql=False): + """ + This function is used to get the DDL/DML statements. + :param gid: Group ID + :param sid: Serve ID + :param did: Database ID + :param scid: Schema ID + :param oid: Collation ID + :param data: Difference data + :param diff_schema: Target Schema + :param drop_sql: True if need to drop the collation + :return: + """ + sql = '' + if data: + if diff_schema: + data['schema'] = diff_schema + sql, name = self.get_sql(gid=gid, sid=sid, data=data, scid=scid, + coid=oid) + else: + if drop_sql: + sql = self.delete(gid=gid, sid=sid, did=did, + scid=scid, coid=oid, only_sql=True) + elif diff_schema: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, coid=oid, + diff_schema=diff_schema, json_resp=False) + else: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, coid=oid, + json_resp=False) + return sql + +SchemaDiffRegistry(blueprint.node_type, CollationView) CollationView.register_node_view(blueprint) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/templates/collations/sql/default/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/templates/collations/sql/default/update.sql index 9ee1ccb27..25859f89b 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/templates/collations/sql/default/update.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/templates/collations/sql/default/update.sql @@ -1,5 +1,23 @@ {% if data %} {# Change object's owner #} +{% if (data.lc_collate and data.lc_type) or data.locale or data.copy_collation %} +-- WARNING: +-- We have found the difference in either of LC_COLLATE or LC_CTYPE or LOCALE, +-- so we need to drop the existing collation first and re-create it. +DROP COLLATION {{ conn|qtIdent(o_data.schema, o_data.name) }}; + +CREATE COLLATION {{ conn|qtIdent(o_data.schema, o_data.name) }} +{% if data.lc_collate and data.lc_type %} + (LC_COLLATE = {{ data.lc_collate|qtLiteral }}, LC_CTYPE = {{ data.lc_type|qtLiteral }}); +{% endif %} +{% if data.locale %} + (LOCALE = {{ data.locale|qtLiteral }}); +{% endif %} +{% if data.copy_collation %} + FROM {{ data.copy_collation }}; +{% endif %} + +{% endif %} {% if data.owner and data.owner != o_data.owner %} ALTER COLLATION {{ conn|qtIdent(o_data.schema, o_data.name) }} OWNER TO {{ conn|qtIdent(data.owner) }}; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py index cae149f29..7065c6630 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_configurations/__init__.py @@ -532,7 +532,7 @@ class FtsConfigurationView(PGChildNodeView, SchemaDiffObjectCompare): ) @check_precondition - def delete(self, gid, sid, did, scid, cfgid=None): + def delete(self, gid, sid, did, scid, cfgid=None, only_sql=False): """ This function will drop the FTS Configuration object :param gid: group id @@ -540,6 +540,7 @@ class FtsConfigurationView(PGChildNodeView, SchemaDiffObjectCompare): :param did: database id :param scid: schema id :param cfgid: FTS Configuration id + :param only_sql: Return only sql if True """ if cfgid is None: data = request.form if request.form else json.loads( @@ -587,6 +588,10 @@ class FtsConfigurationView(PGChildNodeView, SchemaDiffObjectCompare): cascade=cascade ) + # Used for schema diff tool + if only_sql: + return sql + status, res = self.conn.execute_scalar(sql) if not status: return internal_server_error(errormsg=res) @@ -869,7 +874,8 @@ class FtsConfigurationView(PGChildNodeView, SchemaDiffObjectCompare): ) @check_precondition - def sql(self, gid, sid, did, scid, cfgid): + def sql(self, gid, sid, did, scid, cfgid, diff_schema=None, + json_resp=True): """ This function will reverse generate sql for sql panel :param gid: group id @@ -877,6 +883,8 @@ class FtsConfigurationView(PGChildNodeView, SchemaDiffObjectCompare): :param did: database id :param scid: schema id :param cfgid: FTS Configuration id + :param diff_schema: Target Schema for schema diff + :param json_resp: True then return json response """ try: sql = render_template( @@ -901,6 +909,25 @@ class FtsConfigurationView(PGChildNodeView, SchemaDiffObjectCompare): "FTS Configuration node.") ) + # Used for schema diff tool + if diff_schema: + data = {'schema': scid} + # Fetch schema name from schema oid + sql = render_template("/".join([self.template_path, + 'schema.sql']), + data=data, + conn=self.conn, + ) + + status, schema = self.conn.execute_scalar(sql) + if not status: + return internal_server_error(errormsg=schema) + + res = res.replace(schema, diff_schema) + + if not json_resp: + return res + return ajax_response(response=res) except Exception as e: @@ -970,5 +997,38 @@ class FtsConfigurationView(PGChildNodeView, SchemaDiffObjectCompare): return res + def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None, + diff_schema=None, drop_sql=False): + """ + This function is used to get the DDL/DML statements. + :param gid: Group ID + :param sid: Serve ID + :param did: Database ID + :param scid: Schema ID + :param oid: Collation ID + :param data: Difference data + :param diff_schema: Target Schema + :param drop_sql: True if need to drop the fts configuration + :return: + """ + sql = '' + if data: + if diff_schema: + data['schema'] = diff_schema + sql, name = self.get_sql(gid=gid, sid=sid, did=did, scid=scid, + data=data, cfgid=oid) + else: + if drop_sql: + sql = self.delete(gid=gid, sid=sid, did=did, + scid=scid, cfgid=oid, only_sql=True) + elif diff_schema: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, cfgid=oid, + diff_schema=diff_schema, json_resp=False) + else: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, cfgid=oid, + json_resp=False) + return sql + +SchemaDiffRegistry(blueprint.node_type, FtsConfigurationView) FtsConfigurationView.register_node_view(blueprint) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py index 84d6edead..6b8232f07 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/__init__.py @@ -527,7 +527,7 @@ class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare): ) @check_precondition - def delete(self, gid, sid, did, scid, dcid=None): + def delete(self, gid, sid, did, scid, dcid=None, only_sql=False): """ This function will drop the FTS Dictionary object :param gid: group id @@ -535,6 +535,7 @@ class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare): :param did: database id :param scid: schema id :param dcid: FTS Dictionary id + :param only_sql: Return only sql if True """ if dcid is None: data = request.form if request.form else json.loads( @@ -581,6 +582,10 @@ class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare): cascade=cascade ) + # Used for schema diff tool + if only_sql: + return sql + status, res = self.conn.execute_scalar(sql) if not status: return internal_server_error(errormsg=res) @@ -766,7 +771,8 @@ class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare): ) @check_precondition - def sql(self, gid, sid, did, scid, dcid): + def sql(self, gid, sid, did, scid, dcid, diff_schema=None, + json_resp=True): """ This function will reverse generate sql for sql panel :param gid: group id @@ -774,6 +780,8 @@ class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare): :param did: database id :param scid: schema id :param dcid: FTS Dictionary id + :param diff_schema: Target Schema for schema diff + :param json_resp: True then return json response """ sql = render_template( @@ -819,6 +827,9 @@ class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare): # Replace schema oid with schema name res['rows'][0]['schema'] = schema + if diff_schema: + res['rows'][0]['schema'] = diff_schema + sql = render_template("/".join([self.template_path, 'create.sql']), data=res['rows'][0], conn=self.conn, is_displaying=True) @@ -832,6 +843,9 @@ class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare): sql = sql_header + sql + if not json_resp: + return sql + return ajax_response(response=sql.strip('\n')) @check_precondition @@ -897,5 +911,38 @@ class FtsDictionaryView(PGChildNodeView, SchemaDiffObjectCompare): return res + def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None, + diff_schema=None, drop_sql=False): + """ + This function is used to get the DDL/DML statements. + :param gid: Group ID + :param sid: Serve ID + :param did: Database ID + :param scid: Schema ID + :param oid: Collation ID + :param data: Difference data + :param diff_schema: Target Schema + :param drop_sql: True if need to drop the fts configuration + :return: + """ + sql = '' + if data: + if diff_schema: + data['schema'] = diff_schema + sql, name = self.get_sql(gid=gid, sid=sid, did=did, scid=scid, + data=data, dcid=oid) + else: + if drop_sql: + sql = self.delete(gid=gid, sid=sid, did=did, + scid=scid, dcid=oid, only_sql=True) + elif diff_schema: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, dcid=oid, + diff_schema=diff_schema, json_resp=False) + else: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, dcid=oid, + json_resp=False) + return sql + +SchemaDiffRegistry(blueprint.node_type, FtsDictionaryView) FtsDictionaryView.register_node_view(blueprint) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py index fd7cfd0b7..d4a1151f6 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/__init__.py @@ -476,7 +476,7 @@ class FtsParserView(PGChildNodeView, SchemaDiffObjectCompare): ) @check_precondition - def delete(self, gid, sid, did, scid, pid=None): + def delete(self, gid, sid, did, scid, pid=None, only_sql=False): """ This function will drop the fts_parser object :param gid: group id @@ -484,6 +484,7 @@ class FtsParserView(PGChildNodeView, SchemaDiffObjectCompare): :param did: database id :param scid: schema id :param pid: fts tempate id + :param only_sql: Return only sql if True """ if pid is None: data = request.form if request.form else json.loads( @@ -530,6 +531,10 @@ class FtsParserView(PGChildNodeView, SchemaDiffObjectCompare): cascade=cascade ) + # Used for schema diff tool + if only_sql: + return sql + status, res = self.conn.execute_scalar(sql) if not status: return internal_server_error(errormsg=res) @@ -813,7 +818,8 @@ class FtsParserView(PGChildNodeView, SchemaDiffObjectCompare): ) @check_precondition - def sql(self, gid, sid, did, scid, pid): + def sql(self, gid, sid, did, scid, pid, diff_schema=None, + json_resp=True): """ This function will reverse generate sql for sql panel :param gid: group id @@ -821,6 +827,8 @@ class FtsParserView(PGChildNodeView, SchemaDiffObjectCompare): :param did: database id :param scid: schema id :param pid: fts tempate id + :param diff_schema: Target Schema for schema diff + :param json_resp: True then return json response """ try: sql = render_template( @@ -846,6 +854,25 @@ class FtsParserView(PGChildNodeView, SchemaDiffObjectCompare): ) ) + # Used for schema diff tool + if diff_schema: + data = {'schema': scid} + # Fetch schema name from schema oid + sql = render_template("/".join([self.template_path, + 'schema.sql']), + data=data, + conn=self.conn, + ) + + status, schema = self.conn.execute_scalar(sql) + if not status: + return internal_server_error(errormsg=schema) + + res = res.replace(schema, diff_schema) + + if not json_resp: + return res + return ajax_response(response=res) except Exception as e: @@ -915,5 +942,38 @@ class FtsParserView(PGChildNodeView, SchemaDiffObjectCompare): return res + def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None, + diff_schema=None, drop_sql=False): + """ + This function is used to get the DDL/DML statements. + :param gid: Group ID + :param sid: Serve ID + :param did: Database ID + :param scid: Schema ID + :param oid: Collation ID + :param data: Difference data + :param diff_schema: Target Schema + :param drop_sql: True if need to drop the fts configuration + :return: + """ + sql = '' + if data: + if diff_schema: + data['schema'] = diff_schema + sql, name = self.get_sql(gid=gid, sid=sid, did=did, scid=scid, + data=data, pid=oid) + else: + if drop_sql: + sql = self.delete(gid=gid, sid=sid, did=did, + scid=scid, pid=oid, only_sql=True) + elif diff_schema: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, pid=oid, + diff_schema=diff_schema, json_resp=False) + else: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, pid=oid, + json_resp=False) + return sql + +SchemaDiffRegistry(blueprint.node_type, FtsParserView) FtsParserView.register_node_view(blueprint) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/templates/fts_parsers/sql/default/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/templates/fts_parsers/sql/default/update.sql index bce558da0..48e335b1d 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/templates/fts_parsers/sql/default/update.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_parsers/templates/fts_parsers/sql/default/update.sql @@ -15,6 +15,23 @@ ALTER TEXT SEARCH PARSER {{conn|qtIdent(o_data.schema)}}.{{conn|qtIdent(o_data.n ALTER TEXT SEARCH PARSER {{conn|qtIdent(o_data.schema)}}.{{conn|qtIdent(name)}} SET SCHEMA {{data.schema}}; {% endif %} +{# Schema Diff SQL for FTS PARSER #} +{% if data.prsstart or data.prstoken or data.prsend or data.prslextype or data.prsheadline %} +-- WARNING: +-- We have found the difference in either of START or GETTOKEN or END or +-- LEXTYPES or HEADLINE, so we need to drop the existing parser first +-- and re-create it. +DROP TEXT SEARCH PARSER {{conn|qtIdent(o_data.schema)}}.{{conn|qtIdent(name)}}; + +CREATE TEXT SEARCH PARSER {{ conn|qtIdent(o_data.schema, name) }} ( + START = {% if data.prsstart is defined %}{{data.prsstart}}{% else %}{{o_data.prsstart}}{% endif %}, + GETTOKEN = {% if data.prstoken is defined %}{{data.prstoken}}{% else %}{{o_data.prstoken}}{% endif %}, + END = {% if data.prsend is defined %}{{data.prsend}}{% else %}{{o_data.prsend}}{% endif %}, + LEXTYPES = {% if data.prslextype is defined %}{{data.prslextype}}{% else %}{{o_data.prslextype}}{% endif %}{% if (data.prsheadline and data.prsheadline != '-') or (o_data.prsheadline and o_data.prsheadline != '-') %}, + HEADLINE = {% if data.prsheadline is defined %}{{data.prsheadline}}{% else %}{{o_data.prsheadline}}{% endif %}{% endif %} + +); +{% endif %} {% if "description" in data and data.description != o_data.description %} COMMENT ON TEXT SEARCH PARSER {{conn|qtIdent(o_data.schema)}}.{{conn|qtIdent(name)}} IS {{ data.description|qtLiteral }}; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py index dd5ec7980..7032682f1 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/__init__.py @@ -443,7 +443,7 @@ class FtsTemplateView(PGChildNodeView, SchemaDiffObjectCompare): ) @check_precondition - def delete(self, gid, sid, did, scid, tid=None): + def delete(self, gid, sid, did, scid, tid=None, only_sql=False): """ This function will drop the fts_template object :param gid: group id @@ -451,6 +451,7 @@ class FtsTemplateView(PGChildNodeView, SchemaDiffObjectCompare): :param did: database id :param scid: schema id :param tid: fts tempate id + :param only_sql: Return only sql if True """ if tid is None: data = request.form if request.form else json.loads( @@ -493,6 +494,10 @@ class FtsTemplateView(PGChildNodeView, SchemaDiffObjectCompare): cascade=cascade ) + # Used for schema diff tool + if only_sql: + return sql + status, res = self.conn.execute_scalar(sql) if not status: return internal_server_error(errormsg=res) @@ -691,7 +696,8 @@ class FtsTemplateView(PGChildNodeView, SchemaDiffObjectCompare): ) @check_precondition - def sql(self, gid, sid, did, scid, tid): + def sql(self, gid, sid, did, scid, tid, diff_schema=None, + json_resp=True): """ This function will reverse generate sql for sql panel :param gid: group id @@ -699,6 +705,8 @@ class FtsTemplateView(PGChildNodeView, SchemaDiffObjectCompare): :param did: database id :param scid: schema id :param tid: fts tempate id + :param diff_schema: Target Schema for schema diff + :param json_resp: True then return json response """ sql = render_template( "/".join([self.template_path, 'sql.sql']), @@ -721,6 +729,25 @@ class FtsTemplateView(PGChildNodeView, SchemaDiffObjectCompare): "FTS Template node.") ) + # Used for schema diff tool + if diff_schema: + data = {'schema': scid} + # Fetch schema name from schema oid + sql = render_template("/".join([self.template_path, + 'schema.sql']), + data=data, + conn=self.conn, + ) + + status, schema = self.conn.execute_scalar(sql) + if not status: + return internal_server_error(errormsg=schema) + + res = res.replace(schema, diff_schema) + + if not json_resp: + return res + return ajax_response(response=res) @check_precondition @@ -786,5 +813,38 @@ class FtsTemplateView(PGChildNodeView, SchemaDiffObjectCompare): return res + def get_sql_from_diff(self, gid, sid, did, scid, oid, data=None, + diff_schema=None, drop_sql=False): + """ + This function is used to get the DDL/DML statements. + :param gid: Group ID + :param sid: Serve ID + :param did: Database ID + :param scid: Schema ID + :param oid: Collation ID + :param data: Difference data + :param diff_schema: Target Schema + :param drop_sql: True if need to drop the fts configuration + :return: + """ + sql = '' + if data: + if diff_schema: + data['schema'] = diff_schema + sql, name = self.get_sql(gid=gid, sid=sid, did=did, scid=scid, + data=data, tid=oid) + else: + if drop_sql: + sql = self.delete(gid=gid, sid=sid, did=did, + scid=scid, tid=oid, only_sql=True) + elif diff_schema: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, tid=oid, + diff_schema=diff_schema, json_resp=False) + else: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, tid=oid, + json_resp=False) + return sql + +SchemaDiffRegistry(blueprint.node_type, FtsTemplateView) FtsTemplateView.register_node_view(blueprint) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/templates/fts_templates/sql/default/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/templates/fts_templates/sql/default/update.sql index d6754f0f2..d76f12115 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/templates/fts_templates/sql/default/update.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_templates/templates/fts_templates/sql/default/update.sql @@ -15,6 +15,21 @@ ALTER TEXT SEARCH TEMPLATE {{conn|qtIdent(o_data.schema)}}.{{conn|qtIdent(o_data ALTER TEXT SEARCH TEMPLATE {{conn|qtIdent(o_data.schema)}}.{{conn|qtIdent(name)}} SET SCHEMA {{conn|qtIdent(data.schema)}}; {% endif %} +{# Schema Diff SQL for FTS PARSER #} +{% if data.tmplinit or data.tmpllexize %} +-- WARNING: +-- We have found the difference in either of INIT or LEXIZE, +-- so we need to drop the existing template first and re-create it. +DROP TEXT SEARCH TEMPLATE {{conn|qtIdent(o_data.schema)}}.{{conn|qtIdent(name)}}; + +CREATE TEXT SEARCH TEMPLATE {{ conn|qtIdent(o_data.schema, name) }} ( +{% if data.tmplinit and data.tmplinit != '-'%} + INIT = {{data.tmplinit}}, +{% endif %} + LEXIZE = {% if data.tmpllexize is defined %}{{data.tmpllexize}}{% else %}{{o_data.tmpllexize}}{% endif %} + +); +{% endif %} {% if 'description' in data and data.description != o_data.description %} COMMENT ON TEXT SEARCH TEMPLATE {{conn|qtIdent(o_data.schema)}}.{{conn|qtIdent(name)}} IS {{ data.description|qtLiteral }}; 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 413a95255..65755fad2 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 @@ -1366,7 +1366,10 @@ class BaseTableView(PGChildNodeView, BasePartitionTable): # Check if partition is again declare as partitioned table. if 'is_sub_partitioned' in row and row['is_sub_partitioned']: - part_data['partition_scheme'] = self.get_partition_scheme(row) + part_data['partition_scheme'] = row['sub_partition_scheme'] \ + if 'sub_partition_scheme' in row else \ + self.get_partition_scheme(row) + part_data['is_partitioned'] = True if 'is_attach' in row and row['is_attach']: diff --git a/web/pgadmin/tools/schema_diff/__init__.py b/web/pgadmin/tools/schema_diff/__init__.py index 04ff644ce..14f041e92 100644 --- a/web/pgadmin/tools/schema_diff/__init__.py +++ b/web/pgadmin/tools/schema_diff/__init__.py @@ -435,7 +435,7 @@ def compare(trans_id, source_sid, source_did, source_scid, status, msg = check_version_compatibility(source_sid, target_sid) if not status: - return make_json_response(success=0, errormsg=msg, status=404) + return make_json_response(success=0, errormsg=msg, status=428) comparison_result = [] diff --git a/web/pgadmin/tools/schema_diff/directory_compare.py b/web/pgadmin/tools/schema_diff/directory_compare.py index eb0d7d220..112609b9b 100644 --- a/web/pgadmin/tools/schema_diff/directory_compare.py +++ b/web/pgadmin/tools/schema_diff/directory_compare.py @@ -318,37 +318,40 @@ def directory_diff(source_dict, target_dict, ignore_keys=[], difference={}): )) if len(tmp_list) > 0: + tmp_target = copy.deepcopy(target_dict[key]) for index in range(len(source_dict[key])): source = copy.deepcopy(source_dict[key][index]) if type(source) is list: # TODO pass elif type(source) is dict: - tmp_key_array = ['name', 'colname', 'argid'] - for tmp_key in tmp_key_array: - if tmp_key in source: - if type(target_dict[key]) is list and \ - len(target_dict[key]) > 0: - tmp = None - tmp_target = \ - copy.deepcopy(target_dict[key]) - for item in tmp_target: - if tmp_key in item and \ - item[tmp_key] == \ - source[tmp_key]: - tmp = copy.deepcopy(item) - if tmp and source != tmp: - updated.append(copy.deepcopy(source)) - tmp_target.remove(tmp) - elif tmp and source == tmp: - tmp_target.remove(tmp) - elif tmp is None: - added.append(source) - else: + tmp_key_array = ['name', 'colname', 'argid', 'token', + 'option'] + # Check the above keys are exist in the dictionary + tmp_key = is_key_exists(tmp_key_array, source) + if tmp_key is not None: + if type(target_dict[key]) is list and \ + len(target_dict[key]) > 0: + tmp = None + for item in tmp_target: + if tmp_key in item and \ + item[tmp_key] == \ + source[tmp_key]: + tmp = copy.deepcopy(item) + if tmp and source != tmp: + updated.append(copy.deepcopy(source)) + tmp_target.remove(tmp) + elif tmp and source == tmp: + tmp_target.remove(tmp) + elif tmp is None: added.append(source) + else: + added.append(source) - difference[key] = {} + difference[key] = {} + if len(added) > 0: difference[key]['added'] = added + if len(updated) > 0: difference[key]['changed'] = updated elif target_dict[key] is None or \ (type(target_dict[key]) is list and @@ -358,7 +361,7 @@ def directory_diff(source_dict, target_dict, ignore_keys=[], difference={}): elif type(target_dict[key]) is list and\ len(target_dict[key]) > index: difference[key] = source - else: + elif len(source_dict[key]) > 0: difference[key] = source_dict[key] if type(source) is dict and tmp_target and key in tmp_target and \ @@ -383,6 +386,21 @@ def directory_diff(source_dict, target_dict, ignore_keys=[], difference={}): return difference +def is_key_exists(key_list, target_dict): + """ + This function is used to iterate the key list and check that key is + present in the given dictionary + :param key_list: + :param target_dict: + :return: + """ + for key in key_list: + if key in target_dict: + return key + + return None + + def parce_acl(source, target): key = 'acl' diff --git a/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql index 99757ceb2..de56c5876 100644 --- a/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql +++ b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/source.sql @@ -438,3 +438,91 @@ ALTER TABLE source."test view f" OWNER TO postgres; -- COMMENT ON VIEW source."test view f" IS 'cmn'; + +-- Collation scripts +CREATE COLLATION source.coll_src + FROM pg_catalog."POSIX"; + +ALTER COLLATION source.coll_src + OWNER TO postgres; + +COMMENT ON COLLATION source.coll_src + IS 'Test Comment'; + +CREATE COLLATION source.coll_diff + (LC_COLLATE = 'POSIX', LC_CTYPE = 'POSIX'); + +ALTER COLLATION source.coll_diff + OWNER TO postgres; + +COMMENT ON COLLATION source.coll_diff + IS 'Test Comment'; + +-- FTS Configuration scripts +CREATE TEXT SEARCH CONFIGURATION source.fts_con_src ( + COPY=german +); + +ALTER TEXT SEARCH CONFIGURATION source.fts_con_src OWNER TO postgres; + +COMMENT ON TEXT SEARCH CONFIGURATION source.fts_con_src + IS 'Test Comment'; + + +CREATE TEXT SEARCH CONFIGURATION source.fts_con_diff ( + PARSER = default +); +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR asciiword WITH german_stem; +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR email WITH simple; +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR hword WITH dutch_stem; + +-- FTS Dictionary scripts +CREATE TEXT SEARCH DICTIONARY source.fts_dict_src ( + TEMPLATE = simple, + stopwords = 'english' +); + +COMMENT ON TEXT SEARCH DICTIONARY source.fts_dict_src + IS 'Test Comment'; + +CREATE TEXT SEARCH DICTIONARY source.fts_dict_diff ( + TEMPLATE = simple, + stopwords = 'english' +); + +COMMENT ON TEXT SEARCH DICTIONARY source.fts_dict_diff + IS 'Test Comment'; + +-- FTS Parser scripts +CREATE TEXT SEARCH PARSER source.fts_par_src ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +COMMENT ON TEXT SEARCH PARSER source.fts_par_src + IS 'Test Comment'; + +CREATE TEXT SEARCH PARSER source.fts_par_diff ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +COMMENT ON TEXT SEARCH PARSER source.fts_par_diff + IS 'Test Comment'; + +-- FTS Template scripts +CREATE TEXT SEARCH TEMPLATE source.fts_templ_src ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE source.fts_templ_src IS 'Test Comment'; + +CREATE TEXT SEARCH TEMPLATE source.fts_templ_diff ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE source.fts_templ_diff IS 'Test Comment'; diff --git a/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql index c3042ab60..fb5a7918f 100644 --- a/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql +++ b/web/pgadmin/tools/schema_diff/tests/pg/10_plus/target.sql @@ -427,3 +427,73 @@ ALTER TABLE target."test view f" OWNER TO postgres; -- COMMENT ON VIEW target."test view f" IS 'cmn'; + +-- Collation scripts +CREATE COLLATION target.coll_tar + FROM pg_catalog."POSIX"; + +ALTER COLLATION target.coll_tar + OWNER TO postgres; + +CREATE COLLATION target.coll_diff + (LC_COLLATE = 'C', LC_CTYPE = 'C'); + +ALTER COLLATION target.coll_diff + OWNER TO postgres; + +-- FTS Configuration scripts +CREATE TEXT SEARCH CONFIGURATION target.fts_con_tar ( + COPY=german +); + +ALTER TEXT SEARCH CONFIGURATION target.fts_con_tar OWNER TO postgres; + +CREATE TEXT SEARCH CONFIGURATION target.fts_con_diff ( + PARSER = default +); +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR asciiword WITH dutch_stem; +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR email WITH simple; +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR hword WITH german_stem; + +-- FTS Dictionary scripts +CREATE TEXT SEARCH DICTIONARY target.fts_dict_tar ( + TEMPLATE = simple, + stopwords = 'english' +); + +CREATE TEXT SEARCH DICTIONARY target.fts_dict_diff ( + TEMPLATE = simple, + stopwords = 'german' +); + +COMMENT ON TEXT SEARCH DICTIONARY target.fts_dict_diff + IS 'Comment'; + +-- FTS Parser scripts +CREATE TEXT SEARCH PARSER target.fts_par_tar ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +CREATE TEXT SEARCH PARSER target.fts_par_diff ( + START = int4_accum, + GETTOKEN = inet_gist_penalty, + END = btint2sortsupport, + LEXTYPES = dispell_init); + +COMMENT ON TEXT SEARCH PARSER target.fts_par_diff + IS 'Comment'; + +-- FTS Template scripts +CREATE TEXT SEARCH TEMPLATE target.fts_templ_tar ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +CREATE TEXT SEARCH TEMPLATE target.fts_templ_diff ( + INIT = dsimple_init, + LEXIZE = dsimple_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE target.fts_templ_diff IS 'Comment'; diff --git a/web/pgadmin/tools/schema_diff/tests/pg/11_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/11_plus/source.sql index 2429eb799..c0002d624 100644 --- a/web/pgadmin/tools/schema_diff/tests/pg/11_plus/source.sql +++ b/web/pgadmin/tools/schema_diff/tests/pg/11_plus/source.sql @@ -437,3 +437,91 @@ ALTER TABLE source."test view f" OWNER TO postgres; -- COMMENT ON VIEW source."test view f" IS 'cmn'; + +-- Collation scripts +CREATE COLLATION source.coll_src + FROM pg_catalog."POSIX"; + +ALTER COLLATION source.coll_src + OWNER TO postgres; + +COMMENT ON COLLATION source.coll_src + IS 'Test Comment'; + +CREATE COLLATION source.coll_diff + (LC_COLLATE = 'POSIX', LC_CTYPE = 'POSIX'); + +ALTER COLLATION source.coll_diff + OWNER TO postgres; + +COMMENT ON COLLATION source.coll_diff + IS 'Test Comment'; + +-- FTS Configuration scripts +CREATE TEXT SEARCH CONFIGURATION source.fts_con_src ( + COPY=german +); + +ALTER TEXT SEARCH CONFIGURATION source.fts_con_src OWNER TO postgres; + +COMMENT ON TEXT SEARCH CONFIGURATION source.fts_con_src + IS 'Test Comment'; + + +CREATE TEXT SEARCH CONFIGURATION source.fts_con_diff ( + PARSER = default +); +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR asciiword WITH german_stem; +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR email WITH simple; +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR hword WITH dutch_stem; + +-- FTS Dictionary scripts +CREATE TEXT SEARCH DICTIONARY source.fts_dict_src ( + TEMPLATE = simple, + stopwords = 'english' +); + +COMMENT ON TEXT SEARCH DICTIONARY source.fts_dict_src + IS 'Test Comment'; + +CREATE TEXT SEARCH DICTIONARY source.fts_dict_diff ( + TEMPLATE = simple, + stopwords = 'english' +); + +COMMENT ON TEXT SEARCH DICTIONARY source.fts_dict_diff + IS 'Test Comment'; + +-- FTS Parser scripts +CREATE TEXT SEARCH PARSER source.fts_par_src ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +COMMENT ON TEXT SEARCH PARSER source.fts_par_src + IS 'Test Comment'; + +CREATE TEXT SEARCH PARSER source.fts_par_diff ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +COMMENT ON TEXT SEARCH PARSER source.fts_par_diff + IS 'Test Comment'; + +-- FTS Template scripts +CREATE TEXT SEARCH TEMPLATE source.fts_templ_src ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE source.fts_templ_src IS 'Test Comment'; + +CREATE TEXT SEARCH TEMPLATE source.fts_templ_diff ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE source.fts_templ_diff IS 'Test Comment'; diff --git a/web/pgadmin/tools/schema_diff/tests/pg/11_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/11_plus/target.sql index 89a029232..170ae8d9f 100644 --- a/web/pgadmin/tools/schema_diff/tests/pg/11_plus/target.sql +++ b/web/pgadmin/tools/schema_diff/tests/pg/11_plus/target.sql @@ -426,3 +426,73 @@ ALTER TABLE target."test view f" OWNER TO postgres; -- COMMENT ON VIEW target."test view f" IS 'cmn'; + +-- Collation scripts +CREATE COLLATION target.coll_tar + FROM pg_catalog."POSIX"; + +ALTER COLLATION target.coll_tar + OWNER TO postgres; + +CREATE COLLATION target.coll_diff + (LC_COLLATE = 'C', LC_CTYPE = 'C'); + +ALTER COLLATION target.coll_diff + OWNER TO postgres; + +-- FTS Configuration scripts +CREATE TEXT SEARCH CONFIGURATION target.fts_con_tar ( + COPY=german +); + +ALTER TEXT SEARCH CONFIGURATION target.fts_con_tar OWNER TO postgres; + +CREATE TEXT SEARCH CONFIGURATION target.fts_con_diff ( + PARSER = default +); +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR asciiword WITH dutch_stem; +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR email WITH simple; +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR hword WITH german_stem; + +-- FTS Dictionary scripts +CREATE TEXT SEARCH DICTIONARY target.fts_dict_tar ( + TEMPLATE = simple, + stopwords = 'english' +); + +CREATE TEXT SEARCH DICTIONARY target.fts_dict_diff ( + TEMPLATE = simple, + stopwords = 'german' +); + +COMMENT ON TEXT SEARCH DICTIONARY target.fts_dict_diff + IS 'Comment'; + +-- FTS Parser scripts +CREATE TEXT SEARCH PARSER target.fts_par_tar ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +CREATE TEXT SEARCH PARSER target.fts_par_diff ( + START = int4_accum, + GETTOKEN = inet_gist_penalty, + END = btint2sortsupport, + LEXTYPES = dispell_init); + +COMMENT ON TEXT SEARCH PARSER target.fts_par_diff + IS 'Comment'; + +-- FTS Template scripts +CREATE TEXT SEARCH TEMPLATE target.fts_templ_tar ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +CREATE TEXT SEARCH TEMPLATE target.fts_templ_diff ( + INIT = dsimple_init, + LEXIZE = dsimple_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE target.fts_templ_diff IS 'Comment'; diff --git a/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql index 8ef87e3bc..43d51e4eb 100644 --- a/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql +++ b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/source.sql @@ -438,3 +438,91 @@ CREATE PROCEDURE source.proc1(arg1 bigint) ALTER PROCEDURE source.proc1(arg1 bigint) OWNER TO postgres; + +-- Collation scripts +CREATE COLLATION source.coll_src + FROM pg_catalog."POSIX"; + +ALTER COLLATION source.coll_src + OWNER TO postgres; + +COMMENT ON COLLATION source.coll_src + IS 'Test Comment'; + +CREATE COLLATION source.coll_diff + (LC_COLLATE = 'POSIX', LC_CTYPE = 'POSIX'); + +ALTER COLLATION source.coll_diff + OWNER TO postgres; + +COMMENT ON COLLATION source.coll_diff + IS 'Test Comment'; + +-- FTS Configuration scripts +CREATE TEXT SEARCH CONFIGURATION source.fts_con_src ( + COPY=german +); + +ALTER TEXT SEARCH CONFIGURATION source.fts_con_src OWNER TO postgres; + +COMMENT ON TEXT SEARCH CONFIGURATION source.fts_con_src + IS 'Test Comment'; + + +CREATE TEXT SEARCH CONFIGURATION source.fts_con_diff ( + PARSER = default +); +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR asciiword WITH german_stem; +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR email WITH simple; +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR hword WITH dutch_stem; + +-- FTS Dictionary scripts +CREATE TEXT SEARCH DICTIONARY source.fts_dict_src ( + TEMPLATE = simple, + stopwords = 'english' +); + +COMMENT ON TEXT SEARCH DICTIONARY source.fts_dict_src + IS 'Test Comment'; + +CREATE TEXT SEARCH DICTIONARY source.fts_dict_diff ( + TEMPLATE = simple, + stopwords = 'english' +); + +COMMENT ON TEXT SEARCH DICTIONARY source.fts_dict_diff + IS 'Test Comment'; + +-- FTS Parser scripts +CREATE TEXT SEARCH PARSER source.fts_par_src ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +COMMENT ON TEXT SEARCH PARSER source.fts_par_src + IS 'Test Comment'; + +CREATE TEXT SEARCH PARSER source.fts_par_diff ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +COMMENT ON TEXT SEARCH PARSER source.fts_par_diff + IS 'Test Comment'; + +-- FTS Template scripts +CREATE TEXT SEARCH TEMPLATE source.fts_templ_src ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE source.fts_templ_src IS 'Test Comment'; + +CREATE TEXT SEARCH TEMPLATE source.fts_templ_diff ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE source.fts_templ_diff IS 'Test Comment'; diff --git a/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql index d57841744..b9e863aa1 100644 --- a/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql +++ b/web/pgadmin/tools/schema_diff/tests/pg/12_plus/target.sql @@ -415,3 +415,73 @@ CREATE PROCEDURE target.dodaj_klijenta(v_naziv character varying, v_oib characte ALTER PROCEDURE target.dodaj_klijenta(v_naziv character varying, v_oib character varying, v_pdv_id character varying, v_adresa character varying, v_mjesto integer, v_drzava character varying, v_tip_p_sub character varying, v_vlasnik character varying, v_pdv boolean, v_fisk boolean, v_iban character varying, v_k_osoba character varying, v_email character varying, v_br_tel character varying, v_radna_god numeric, v_schema character varying) OWNER TO postgres; + +-- Collation scripts +CREATE COLLATION target.coll_tar + FROM pg_catalog."POSIX"; + +ALTER COLLATION target.coll_tar + OWNER TO postgres; + +CREATE COLLATION target.coll_diff + (LC_COLLATE = 'C', LC_CTYPE = 'C'); + +ALTER COLLATION target.coll_diff + OWNER TO postgres; + +-- FTS Configuration scripts +CREATE TEXT SEARCH CONFIGURATION target.fts_con_tar ( + COPY=german +); + +ALTER TEXT SEARCH CONFIGURATION target.fts_con_tar OWNER TO postgres; + +CREATE TEXT SEARCH CONFIGURATION target.fts_con_diff ( + PARSER = default +); +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR asciiword WITH dutch_stem; +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR email WITH simple; +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR hword WITH german_stem; + +-- FTS Dictionary scripts +CREATE TEXT SEARCH DICTIONARY target.fts_dict_tar ( + TEMPLATE = simple, + stopwords = 'english' +); + +CREATE TEXT SEARCH DICTIONARY target.fts_dict_diff ( + TEMPLATE = simple, + stopwords = 'german' +); + +COMMENT ON TEXT SEARCH DICTIONARY target.fts_dict_diff + IS 'Comment'; + +-- FTS Parser scripts +CREATE TEXT SEARCH PARSER target.fts_par_tar ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +CREATE TEXT SEARCH PARSER target.fts_par_diff ( + START = int4_accum, + GETTOKEN = inet_gist_penalty, + END = btint2sortsupport, + LEXTYPES = dispell_init); + +COMMENT ON TEXT SEARCH PARSER target.fts_par_diff + IS 'Comment'; + +-- FTS Template scripts +CREATE TEXT SEARCH TEMPLATE target.fts_templ_tar ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +CREATE TEXT SEARCH TEMPLATE target.fts_templ_diff ( + INIT = dsimple_init, + LEXIZE = dsimple_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE target.fts_templ_diff IS 'Comment'; diff --git a/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql index af9054eeb..4511fb0bb 100644 --- a/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql +++ b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/source.sql @@ -309,3 +309,89 @@ COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments'; CREATE RULE rule2 AS ON INSERT TO source.table_for_rule DO NOTHING; +-- Collation scripts +CREATE COLLATION source.coll_src + FROM pg_catalog."POSIX"; + +ALTER COLLATION source.coll_src + OWNER TO postgres; + +COMMENT ON COLLATION source.coll_src + IS 'Test Comment'; + +CREATE COLLATION source.coll_diff + (LC_COLLATE = 'POSIX', LC_CTYPE = 'POSIX'); + +ALTER COLLATION source.coll_diff + OWNER TO postgres; + +COMMENT ON COLLATION source.coll_diff + IS 'Test Comment'; + +-- FTS Configuration scripts +CREATE TEXT SEARCH CONFIGURATION source.fts_con_src ( + COPY=german +); + +ALTER TEXT SEARCH CONFIGURATION source.fts_con_src OWNER TO postgres; + +COMMENT ON TEXT SEARCH CONFIGURATION source.fts_con_src + IS 'Test Comment'; + +CREATE TEXT SEARCH CONFIGURATION source.fts_con_diff ( + PARSER = default +); +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR asciiword WITH german_stem; +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR email WITH simple; +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR hword WITH dutch_stem; + +-- FTS Dictionary scripts +CREATE TEXT SEARCH DICTIONARY source.fts_dict_src ( + TEMPLATE = simple, + stopwords = 'english' +); + +COMMENT ON TEXT SEARCH DICTIONARY source.fts_dict_src + IS 'Test Comment'; + +CREATE TEXT SEARCH DICTIONARY source.fts_dict_diff ( + TEMPLATE = simple, + stopwords = 'english' +); + +COMMENT ON TEXT SEARCH DICTIONARY source.fts_dict_diff + IS 'Test Comment'; + +-- FTS Parser scripts +CREATE TEXT SEARCH PARSER source.fts_par_src ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +COMMENT ON TEXT SEARCH PARSER source.fts_par_src + IS 'Test Comment'; + +CREATE TEXT SEARCH PARSER source.fts_par_diff ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +COMMENT ON TEXT SEARCH PARSER source.fts_par_diff + IS 'Test Comment'; + +-- FTS Template scripts +CREATE TEXT SEARCH TEMPLATE source.fts_templ_src ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE source.fts_templ_src IS 'Test Comment'; + +CREATE TEXT SEARCH TEMPLATE source.fts_templ_diff ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE source.fts_templ_diff IS 'Test Comment'; diff --git a/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql index ddc4fda28..0a479dddd 100644 --- a/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql +++ b/web/pgadmin/tools/schema_diff/tests/pg/9.2_plus/target.sql @@ -335,3 +335,73 @@ CREATE RULE rule3 AS -- REFRESH MATERIALIZED VIEW target."MView"; + +-- Collation scripts +CREATE COLLATION target.coll_tar + FROM pg_catalog."POSIX"; + +ALTER COLLATION target.coll_tar + OWNER TO postgres; + +CREATE COLLATION target.coll_diff + (LC_COLLATE = 'C', LC_CTYPE = 'C'); + +ALTER COLLATION target.coll_diff + OWNER TO postgres; + +-- FTS Configuration scripts +CREATE TEXT SEARCH CONFIGURATION target.fts_con_tar ( + COPY=german +); + +ALTER TEXT SEARCH CONFIGURATION target.fts_con_tar OWNER TO postgres; + +CREATE TEXT SEARCH CONFIGURATION target.fts_con_diff ( + PARSER = default +); +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR asciiword WITH dutch_stem; +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR email WITH simple; +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR hword WITH german_stem; + +-- FTS Dictionary scripts +CREATE TEXT SEARCH DICTIONARY target.fts_dict_tar ( + TEMPLATE = simple, + stopwords = 'english' +); + +CREATE TEXT SEARCH DICTIONARY target.fts_dict_diff ( + TEMPLATE = simple, + stopwords = 'german' +); + +COMMENT ON TEXT SEARCH DICTIONARY target.fts_dict_diff + IS 'Comment'; + +-- FTS Parser scripts +CREATE TEXT SEARCH PARSER target.fts_par_tar ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +CREATE TEXT SEARCH PARSER target.fts_par_diff ( + START = int4_accum, + GETTOKEN = inet_gist_penalty, + END = btint2sortsupport, + LEXTYPES = dispell_init); + +COMMENT ON TEXT SEARCH PARSER target.fts_par_diff + IS 'Comment'; + +-- FTS Template scripts +CREATE TEXT SEARCH TEMPLATE target.fts_templ_tar ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +CREATE TEXT SEARCH TEMPLATE target.fts_templ_diff ( + INIT = dsimple_init, + LEXIZE = dsimple_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE target.fts_templ_diff IS 'Comment'; diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql index b60dbcd55..2a148d4a2 100644 --- a/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql +++ b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/source.sql @@ -374,3 +374,91 @@ COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments'; CREATE RULE rule2 AS ON INSERT TO source.table_for_rule DO NOTHING; + +-- Collation scripts +CREATE COLLATION source.coll_src + FROM pg_catalog."POSIX"; + +ALTER COLLATION source.coll_src + OWNER TO enterprisedb; + +COMMENT ON COLLATION source.coll_src + IS 'Test Comment'; + +CREATE COLLATION source.coll_diff + (LC_COLLATE = 'POSIX', LC_CTYPE = 'POSIX'); + +ALTER COLLATION source.coll_diff + OWNER TO enterprisedb; + +COMMENT ON COLLATION source.coll_diff + IS 'Test Comment'; + +-- FTS Configuration scripts +CREATE TEXT SEARCH CONFIGURATION source.fts_con_src ( + COPY=german +); + +ALTER TEXT SEARCH CONFIGURATION source.fts_con_src OWNER TO enterprisedb; + +COMMENT ON TEXT SEARCH CONFIGURATION source.fts_con_src + IS 'Test Comment'; + + +CREATE TEXT SEARCH CONFIGURATION source.fts_con_diff ( + PARSER = default +); +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR asciiword WITH german_stem; +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR email WITH simple; +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR hword WITH dutch_stem; + +-- FTS Dictionary scripts +CREATE TEXT SEARCH DICTIONARY source.fts_dict_src ( + TEMPLATE = simple, + stopwords = 'english' +); + +COMMENT ON TEXT SEARCH DICTIONARY source.fts_dict_src + IS 'Test Comment'; + +CREATE TEXT SEARCH DICTIONARY source.fts_dict_diff ( + TEMPLATE = simple, + stopwords = 'english' +); + +COMMENT ON TEXT SEARCH DICTIONARY source.fts_dict_diff + IS 'Test Comment'; + +-- FTS Parser scripts +CREATE TEXT SEARCH PARSER source.fts_par_src ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +COMMENT ON TEXT SEARCH PARSER source.fts_par_src + IS 'Test Comment'; + +CREATE TEXT SEARCH PARSER source.fts_par_diff ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +COMMENT ON TEXT SEARCH PARSER source.fts_par_diff + IS 'Test Comment'; + +-- FTS Template scripts +CREATE TEXT SEARCH TEMPLATE source.fts_templ_src ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE source.fts_templ_src IS 'Test Comment'; + +CREATE TEXT SEARCH TEMPLATE source.fts_templ_diff ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE source.fts_templ_diff IS 'Test Comment'; diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql index 57ef05d6a..27c5b36ad 100644 --- a/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql +++ b/web/pgadmin/tools/schema_diff/tests/ppas/10_plus/target.sql @@ -362,3 +362,73 @@ CREATE RULE rule3 AS -- REFRESH MATERIALIZED VIEW target."MView"; + +-- Collation scripts +CREATE COLLATION target.coll_tar + FROM pg_catalog."POSIX"; + +ALTER COLLATION target.coll_tar + OWNER TO enterprisedb; + +CREATE COLLATION target.coll_diff + (LC_COLLATE = 'C', LC_CTYPE = 'C'); + +ALTER COLLATION target.coll_diff + OWNER TO enterprisedb; + +-- FTS Configuration scripts +CREATE TEXT SEARCH CONFIGURATION target.fts_con_tar ( + COPY=german +); + +ALTER TEXT SEARCH CONFIGURATION target.fts_con_tar OWNER TO enterprisedb; + +CREATE TEXT SEARCH CONFIGURATION target.fts_con_diff ( + PARSER = default +); +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR asciiword WITH dutch_stem; +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR email WITH simple; +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR hword WITH german_stem; + +-- FTS Dictionary scripts +CREATE TEXT SEARCH DICTIONARY target.fts_dict_tar ( + TEMPLATE = simple, + stopwords = 'english' +); + +CREATE TEXT SEARCH DICTIONARY target.fts_dict_diff ( + TEMPLATE = simple, + stopwords = 'german' +); + +COMMENT ON TEXT SEARCH DICTIONARY target.fts_dict_diff + IS 'Comment'; + +-- FTS Parser scripts +CREATE TEXT SEARCH PARSER target.fts_par_tar ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +CREATE TEXT SEARCH PARSER target.fts_par_diff ( + START = int4_accum, + GETTOKEN = inet_gist_penalty, + END = btint2sortsupport, + LEXTYPES = dispell_init); + +COMMENT ON TEXT SEARCH PARSER target.fts_par_diff + IS 'Comment'; + +-- FTS Template scripts +CREATE TEXT SEARCH TEMPLATE target.fts_templ_tar ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +CREATE TEXT SEARCH TEMPLATE target.fts_templ_diff ( + INIT = dsimple_init, + LEXIZE = dsimple_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE target.fts_templ_diff IS 'Comment'; diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql index 67ec216d6..7b9ad2954 100644 --- a/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql +++ b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/source.sql @@ -309,3 +309,90 @@ COMMENT ON RULE rule1 ON source.table_for_rule IS 'comments'; CREATE RULE rule2 AS ON INSERT TO source.table_for_rule DO NOTHING; +-- Collation scripts +CREATE COLLATION source.coll_src + FROM pg_catalog."default"; + +ALTER COLLATION source.coll_src + OWNER TO enterprisedb; + +COMMENT ON COLLATION source.coll_src + IS 'Test Comment'; + +CREATE COLLATION source.coll_diff + FROM pg_catalog."default"; + +ALTER COLLATION source.coll_diff + OWNER TO enterprisedb; + +COMMENT ON COLLATION source.coll_diff + IS 'Test Comment'; + +-- FTS Configuration scripts +CREATE TEXT SEARCH CONFIGURATION source.fts_con_src ( + COPY=german +); + +ALTER TEXT SEARCH CONFIGURATION source.fts_con_src OWNER TO enterprisedb; + +COMMENT ON TEXT SEARCH CONFIGURATION source.fts_con_src + IS 'Test Comment'; + + +CREATE TEXT SEARCH CONFIGURATION source.fts_con_diff ( + PARSER = default +); +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR asciiword WITH german_stem; +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR email WITH simple; +ALTER TEXT SEARCH CONFIGURATION source.fts_con_diff ADD MAPPING FOR hword WITH dutch_stem; + +-- FTS Dictionary scripts +CREATE TEXT SEARCH DICTIONARY source.fts_dict_src ( + TEMPLATE = simple, + stopwords = 'english' +); + +COMMENT ON TEXT SEARCH DICTIONARY source.fts_dict_src + IS 'Test Comment'; + +CREATE TEXT SEARCH DICTIONARY source.fts_dict_diff ( + TEMPLATE = simple, + stopwords = 'english' +); + +COMMENT ON TEXT SEARCH DICTIONARY source.fts_dict_diff + IS 'Test Comment'; + +-- FTS Parser scripts +CREATE TEXT SEARCH PARSER source.fts_par_src ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +COMMENT ON TEXT SEARCH PARSER source.fts_par_src + IS 'Test Comment'; + +CREATE TEXT SEARCH PARSER source.fts_par_diff ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +COMMENT ON TEXT SEARCH PARSER source.fts_par_diff + IS 'Test Comment'; + +-- FTS Template scripts +CREATE TEXT SEARCH TEMPLATE source.fts_templ_src ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE source.fts_templ_src IS 'Test Comment'; + +CREATE TEXT SEARCH TEMPLATE source.fts_templ_diff ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE source.fts_templ_diff IS 'Test Comment'; diff --git a/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql index f64765224..df53f01d5 100644 --- a/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql +++ b/web/pgadmin/tools/schema_diff/tests/ppas/9.2_plus/target.sql @@ -335,3 +335,73 @@ CREATE RULE rule3 AS -- REFRESH MATERIALIZED VIEW target."MView"; + +-- Collation scripts +CREATE COLLATION target.coll_tar + FROM pg_catalog."default"; + +ALTER COLLATION target.coll_tar + OWNER TO enterprisedb; + +CREATE COLLATION target.coll_diff + (LC_COLLATE = 'C', LC_CTYPE = 'C'); + +ALTER COLLATION target.coll_diff + OWNER TO enterprisedb; + +-- FTS Configuration scripts +CREATE TEXT SEARCH CONFIGURATION target.fts_con_tar ( + COPY=german +); + +ALTER TEXT SEARCH CONFIGURATION target.fts_con_tar OWNER TO enterprisedb; + +CREATE TEXT SEARCH CONFIGURATION target.fts_con_diff ( + PARSER = default +); +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR asciiword WITH dutch_stem; +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR email WITH simple; +ALTER TEXT SEARCH CONFIGURATION target.fts_con_diff ADD MAPPING FOR hword WITH german_stem; + +-- FTS Dictionary scripts +CREATE TEXT SEARCH DICTIONARY target.fts_dict_tar ( + TEMPLATE = simple, + stopwords = 'english' +); + +CREATE TEXT SEARCH DICTIONARY target.fts_dict_diff ( + TEMPLATE = simple, + stopwords = 'german' +); + +COMMENT ON TEXT SEARCH DICTIONARY target.fts_dict_diff + IS 'Comment'; + +-- FTS Parser scripts +CREATE TEXT SEARCH PARSER target.fts_par_tar ( + START = prsd_start, + GETTOKEN = prsd_nexttoken, + END = prsd_end, + LEXTYPES = prsd_lextype); + +CREATE TEXT SEARCH PARSER target.fts_par_diff ( + START = int4_accum, + GETTOKEN = inet_gist_penalty, + END = btint2sortsupport, + LEXTYPES = dispell_init); + +COMMENT ON TEXT SEARCH PARSER target.fts_par_diff + IS 'Comment'; + +-- FTS Template scripts +CREATE TEXT SEARCH TEMPLATE target.fts_templ_tar ( + INIT = dispell_init, + LEXIZE = dispell_lexize +); + +CREATE TEXT SEARCH TEMPLATE target.fts_templ_diff ( + INIT = dsimple_init, + LEXIZE = dsimple_lexize +); + +COMMENT ON TEXT SEARCH TEMPLATE target.fts_templ_diff IS 'Comment'; diff --git a/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py b/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py index 57dec4599..f15e2b516 100644 --- a/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py +++ b/web/pgadmin/tools/schema_diff/tests/test_schema_diff_comp.py @@ -165,6 +165,8 @@ class SchemaDiffTestCase(BaseTestGenerator): self.assertEquals(response.status_code, 200) response_data = json.loads(response.data.decode('utf-8')) file_obj.write(response_data['diff_ddl']) + elif 'diff_ddl' in diff: + file_obj.write(diff['diff_ddl']) file_obj.close() try: