From ce89ae3c1d4125daa311916e59645abf47829ca1 Mon Sep 17 00:00:00 2001 From: Akshay Joshi Date: Fri, 3 Apr 2020 16:52:45 +0530 Subject: [PATCH] Added support of Packages, Sequences and Synonyms to the Schema Diff. Fixes #5264 --- docs/en_US/release_notes_4_21.rst | 1 + .../databases/schemas/packages/__init__.py | 19 +- .../packages/ppas/9.2_plus/create.sql | 1 + .../packages/ppas/9.2_plus/update.sql | 7 +- .../databases/schemas/sequences/__init__.py | 52 ++++- .../databases/schemas/synonyms/__init__.py | 49 ++++- .../schemas/synonyms/static/js/synonym.js | 2 + .../templates/synonyms/sql/default/delete.sql | 3 +- .../tools/schema_diff/directory_compare.py | 78 +++++-- .../schema_diff/tests/pg/10_plus/source.sql | 47 ++++ .../schema_diff/tests/pg/10_plus/target.sql | 44 ++++ .../schema_diff/tests/pg/11_plus/source.sql | 47 ++++ .../schema_diff/tests/pg/11_plus/target.sql | 44 ++++ .../schema_diff/tests/pg/12_plus/source.sql | 47 ++++ .../schema_diff/tests/pg/12_plus/target.sql | 44 ++++ .../schema_diff/tests/pg/9.2_plus/source.sql | 47 ++++ .../schema_diff/tests/pg/9.2_plus/target.sql | 44 ++++ .../schema_diff/tests/ppas/10_plus/source.sql | 208 ++++++++++++++++++ .../schema_diff/tests/ppas/10_plus/target.sql | 195 ++++++++++++++++ .../tests/ppas/9.2_plus/source.sql | 208 +++++++++++++++++- .../tests/ppas/9.2_plus/target.sql | 192 ++++++++++++++++ 21 files changed, 1345 insertions(+), 34 deletions(-) diff --git a/docs/en_US/release_notes_4_21.rst b/docs/en_US/release_notes_4_21.rst index e4c9e2a98..4b625e6c9 100644 --- a/docs/en_US/release_notes_4_21.rst +++ b/docs/en_US/release_notes_4_21.rst @@ -10,6 +10,7 @@ New features ************ | `Issue #5184 `_ - Added support for parameterĀ toast_tuple_target andĀ parallel_workers of the table. +| `Issue #5264 `_ - Added support of Packages, Sequences and Synonyms to the Schema Diff. Housekeeping ************ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py index e63240ca5..165a5c7e6 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py @@ -423,6 +423,7 @@ class PackageView(PGChildNodeView, SchemaDiffObjectCompare): did: Database ID scid: Schema ID pkgid: Package ID + only_sql: Return SQL only if True Returns: @@ -583,6 +584,8 @@ class PackageView(PGChildNodeView, SchemaDiffObjectCompare): did: Database ID scid: Schema ID pkgid: Package ID + sqltab: True + diff_schema: Target Schema """ required_args = [ @@ -818,16 +821,27 @@ class PackageView(PGChildNodeView, SchemaDiffObjectCompare): 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: Package ID + :param data: Difference data + :param diff_schema: Target Schema + :param drop_sql: True if need to drop the domains + :return: + """ sql = '' if data: if diff_schema: data['schema'] = diff_schema - status, sql = self.getSQL(gid, sid, did, data, scid, oid) + sql, name = self.getSQL(gid, sid, did, data, scid, oid) else: if drop_sql: sql = self.delete(gid=gid, sid=sid, did=did, scid=scid, pkgid=oid, only_sql=True) - elif diff_schema: sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, pkgid=oid, diff_schema=diff_schema, json_resp=False) @@ -837,4 +851,5 @@ class PackageView(PGChildNodeView, SchemaDiffObjectCompare): return sql +SchemaDiffRegistry(blueprint.node_type, PackageView) PackageView.register_node_view(blueprint) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/9.2_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/9.2_plus/create.sql index 0e3f0221e..ee6137e7c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/9.2_plus/create.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/9.2_plus/create.sql @@ -10,6 +10,7 @@ END {{ conn|qtIdent(data.name) }}; CREATE OR REPLACE PACKAGE BODY {{ conn|qtIdent(data.schema,data.name) }} IS {{data.pkgbodysrc}} + END {{ conn|qtIdent(data.name) }}; {% endif %} {% if data.pkgacl %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/9.2_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/9.2_plus/update.sql index 687d11b85..2a30315a1 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/9.2_plus/update.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/templates/packages/ppas/9.2_plus/update.sql @@ -1,7 +1,9 @@ {% import 'macros/schemas/privilege.macros' as PRIVILEGE %} {% if data %} +{% set recreate_pkg_body = false %} {% if data.pkgheadsrc is defined and data.pkgheadsrc != o_data.pkgheadsrc and o_data.pkgbodysrc != None or (data.pkgbodysrc is defined and data.pkgbodysrc == '') %} +{% set recreate_pkg_body = true %} DROP PACKAGE BODY {{ conn|qtIdent(data.schema,data.name) }}; {% endif %} {% if data.pkgheadsrc %} @@ -12,11 +14,12 @@ IS END {{ conn|qtIdent(data.name) }}; {% endif %} -{% if data.pkgbodysrc %} +{% if data.pkgbodysrc or (o_data.pkgbodysrc and recreate_pkg_body) %} CREATE OR REPLACE PACKAGE BODY {{ conn|qtIdent(data.schema,data.name) }} IS -{{data.pkgbodysrc}} +{% if data.pkgbodysrc %}{{data.pkgbodysrc}}{% else %}{{o_data.pkgbodysrc}}{% endif %} + END {{ conn|qtIdent(data.name) }}; {% endif %} {% if data.pkgacl %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py index b38c1acff..6328de605 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/__init__.py @@ -436,7 +436,7 @@ class SequenceView(PGChildNodeView, SchemaDiffObjectCompare): ) @check_precondition(action='delete') - def delete(self, gid, sid, did, scid, seid=None): + def delete(self, gid, sid, did, scid, seid=None, only_sql=False): """ This function will drop the object @@ -446,6 +446,7 @@ class SequenceView(PGChildNodeView, SchemaDiffObjectCompare): did: Database ID scid: Schema ID seid: Sequence ID + only_sql: Return SQL only if True Returns: @@ -489,6 +490,10 @@ class SequenceView(PGChildNodeView, SchemaDiffObjectCompare): "/".join([self.template_path, 'delete.sql']), data=res['rows'][0], cascade=cascade ) + + if only_sql: + return SQL + status, res = self.conn.execute_scalar(SQL) if not status: return internal_server_error(errormsg=res) @@ -675,7 +680,8 @@ class SequenceView(PGChildNodeView, SchemaDiffObjectCompare): return SQL, data['name'] @check_precondition(action="sql") - def sql(self, gid, sid, did, scid, seid): + def sql(self, gid, sid, did, scid, seid, diff_schema=None, + json_resp=True): """ This function will generate sql for sql panel @@ -685,6 +691,8 @@ class SequenceView(PGChildNodeView, SchemaDiffObjectCompare): did: Database ID scid: Schema ID seid: Sequence ID + diff_schema: Schema diff target schema name + json_resp: json response or plain text response """ SQL = render_template( @@ -714,6 +722,10 @@ class SequenceView(PGChildNodeView, SchemaDiffObjectCompare): row['cycled'] = rset1['rows'][0]['is_cycled'] result = res['rows'][0] + + if diff_schema: + result['schema'] = diff_schema + result = self._formatter(result, scid, seid) SQL, name = self.getSQL(gid, sid, did, result, scid) # Most probably this is due to error @@ -721,6 +733,10 @@ class SequenceView(PGChildNodeView, SchemaDiffObjectCompare): return SQL SQL = SQL.strip('\n').strip(' ') + # Return sql for schema diff + if not json_resp: + return SQL + sql_header = u"""-- SEQUENCE: {0} -- DROP SEQUENCE {0}; @@ -912,5 +928,37 @@ class SequenceView(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: Sequence ID + :param data: Difference data + :param diff_schema: Target Schema + :param drop_sql: True if need to drop the domains + :return: + """ + sql = '' + if data: + if diff_schema: + data['schema'] = diff_schema + sql, name = self.getSQL(gid, sid, did, data, scid, oid) + else: + if drop_sql: + sql = self.delete(gid=gid, sid=sid, did=did, + scid=scid, seid=oid, only_sql=True) + elif diff_schema: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, seid=oid, + diff_schema=diff_schema, json_resp=False) + else: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, seid=oid, + json_resp=False) + return sql + +SchemaDiffRegistry(blueprint.node_type, SequenceView) SequenceView.register_node_view(blueprint) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py index 3f8dbd046..b9f5d57df 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py @@ -483,7 +483,7 @@ class SynonymView(PGChildNodeView, SchemaDiffObjectCompare): return internal_server_error(errormsg=str(e)) @check_precondition - def delete(self, gid, sid, did, scid, syid=None): + def delete(self, gid, sid, did, scid, syid=None, only_sql=False): """ This function will delete existing the synonym object @@ -493,6 +493,7 @@ class SynonymView(PGChildNodeView, SchemaDiffObjectCompare): did: Database ID scid: Schema ID syid: Synonym ID + only_sql: Return SQL only if True """ if syid is None: data = request.form if request.form else json.loads( @@ -525,6 +526,9 @@ class SynonymView(PGChildNodeView, SchemaDiffObjectCompare): 'delete.sql']), data=data, conn=self.conn) + if only_sql: + return SQL + status, res = self.conn.execute_scalar(SQL) if not status: return internal_server_error(errormsg=res) @@ -648,7 +652,8 @@ class SynonymView(PGChildNodeView, SchemaDiffObjectCompare): return SQL.strip('\n') @check_precondition - def sql(self, gid, sid, did, scid, syid): + def sql(self, gid, sid, did, scid, syid, diff_schema=None, + json_resp=True): """ This function will generates reverse engineered sql for synonym object @@ -658,6 +663,8 @@ class SynonymView(PGChildNodeView, SchemaDiffObjectCompare): did: Database ID scid: Schema ID syid: Synonym ID + diff_schema: + json_resp: """ SQL = render_template("/".join([self.template_path, 'properties.sql']), @@ -673,9 +680,14 @@ class SynonymView(PGChildNodeView, SchemaDiffObjectCompare): gettext('The specified synonym could not be found.') ) + if diff_schema: + data['schema'] = diff_schema + SQL = render_template("/".join([self.template_path, 'create.sql']), data=data, conn=self.conn, comment=True) + if not json_resp: + return SQL return ajax_response(response=SQL) @@ -751,5 +763,38 @@ class SynonymView(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: Synonyms ID + :param data: Difference data + :param diff_schema: Target Schema + :param drop_sql: True if need to drop the domains + :return: + """ + sql = '' + if data: + if diff_schema: + data['schema'] = diff_schema + sql = self.get_sql(gid, sid, data, scid, oid) + else: + if drop_sql: + sql = self.delete(gid=gid, sid=sid, did=did, + scid=scid, syid=oid, only_sql=True) + elif diff_schema: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, syid=oid, + diff_schema=diff_schema, json_resp=False) + else: + sql = self.sql(gid=gid, sid=sid, did=did, scid=scid, syid=oid, + json_resp=False) + return sql + + +SchemaDiffRegistry(blueprint.node_type, SynonymView) SynonymView.register_node_view(blueprint) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js index 1731ce3a0..42c361633 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js @@ -155,6 +155,8 @@ define('pgadmin.node.synonym', [ var trgSchema = control.model.get('synobjschema'); var res = []; + control.model.set('synobjname', undefined); + var node = control.field.get('schema_node'), _url = node.generate_url.apply( node, [ diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonyms/sql/default/delete.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonyms/sql/default/delete.sql index f6976976e..dee3d6872 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonyms/sql/default/delete.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/templates/synonyms/sql/default/delete.sql @@ -4,5 +4,4 @@ {% endif %} DROP {% if is_public %} PUBLIC SYNONYM {{ conn|qtIdent(data.name) }}{% else %} -SYNONYM {{ conn|qtIdent(data.schema, data.name) }} -{% endif %}; +SYNONYM {{ conn|qtIdent(data.schema, data.name) }}{% endif %}; diff --git a/web/pgadmin/tools/schema_diff/directory_compare.py b/web/pgadmin/tools/schema_diff/directory_compare.py index 39e726200..fa7b7443d 100644 --- a/web/pgadmin/tools/schema_diff/directory_compare.py +++ b/web/pgadmin/tools/schema_diff/directory_compare.py @@ -50,9 +50,16 @@ def compare_dictionaries(view_object, source_params, target_params, added = dict1_keys - dict2_keys global count for item in added: + source_object_id = None + if 'oid' in source_dict[item]: + source_object_id = source_dict[item]['oid'] + elif 'name' in source_dict[item]: + # For synonyms use name as OID + source_object_id = source_dict[item]['name'] + if node == 'table': temp_src_params = copy.deepcopy(source_params) - temp_src_params['tid'] = source_dict[item]['oid'] + temp_src_params['tid'] = source_object_id temp_src_params['json_resp'] = False source_ddl = \ view_object.get_sql_from_table_diff(**temp_src_params) @@ -62,7 +69,7 @@ def compare_dictionaries(view_object, source_params, target_params, diff_ddl = view_object.get_sql_from_table_diff(**temp_src_params) else: temp_src_params = copy.deepcopy(source_params) - temp_src_params['oid'] = source_dict[item]['oid'] + temp_src_params['oid'] = source_object_id source_ddl = view_object.get_sql_from_diff(**temp_src_params) temp_src_params.update({ 'diff_schema': target_schema @@ -74,7 +81,7 @@ def compare_dictionaries(view_object, source_params, target_params, 'type': node, 'label': node_label, 'title': item, - 'oid': source_dict[item]['oid'], + 'oid': source_object_id, 'status': SchemaDiffModel.COMPARISON_STATUS['source_only'], 'source_ddl': source_ddl, 'target_ddl': '', @@ -86,9 +93,16 @@ def compare_dictionaries(view_object, source_params, target_params, # Keys that are available in target and missing in source. removed = dict2_keys - dict1_keys for item in removed: + target_object_id = None + if 'oid' in target_dict[item]: + target_object_id = target_dict[item]['oid'] + elif 'name' in target_dict[item]: + # For synonyms use name as OID + target_object_id = target_dict[item]['name'] + if node == 'table': temp_tgt_params = copy.deepcopy(target_params) - temp_tgt_params['tid'] = target_dict[item]['oid'] + temp_tgt_params['tid'] = target_object_id temp_tgt_params['json_resp'] = False target_ddl = view_object.get_sql_from_table_diff(**temp_tgt_params) if 'gid' in temp_tgt_params: @@ -98,7 +112,7 @@ def compare_dictionaries(view_object, source_params, target_params, diff_ddl = view_object.get_drop_sql(**temp_tgt_params) else: temp_tgt_params = copy.deepcopy(target_params) - temp_tgt_params['oid'] = target_dict[item]['oid'] + temp_tgt_params['oid'] = target_object_id target_ddl = view_object.get_sql_from_diff(**temp_tgt_params) temp_tgt_params.update( {'drop_sql': True}) @@ -109,7 +123,7 @@ def compare_dictionaries(view_object, source_params, target_params, 'type': node, 'label': node_label, 'title': item, - 'oid': target_dict[item]['oid'], + 'oid': target_object_id, 'status': SchemaDiffModel.COMPARISON_STATUS['target_only'], 'source_ddl': '', 'target_ddl': target_ddl, @@ -121,6 +135,16 @@ def compare_dictionaries(view_object, source_params, target_params, identical = [] different = [] for key in intersect_keys: + source_object_id = None + target_object_id = None + if 'oid' in source_dict[key]: + source_object_id = source_dict[key]['oid'] + target_object_id = target_dict[key]['oid'] + elif 'name' in target_dict[key]: + # For synonyms use name as OID + source_object_id = source_dict[key]['name'] + target_object_id = target_dict[key]['name'] + # Recursively Compare the two dictionary if are_dictionaries_identical(dict1[key], dict2[key], ignore_keys): identical.append({ @@ -128,9 +152,9 @@ def compare_dictionaries(view_object, source_params, target_params, 'type': node, 'label': node_label, 'title': key, - 'oid': source_dict[key]['oid'], - 'source_oid': source_dict[key]['oid'], - 'target_oid': target_dict[key]['oid'], + 'oid': source_object_id, + 'source_oid': source_object_id, + 'target_oid': target_object_id, 'status': SchemaDiffModel.COMPARISON_STATUS['identical'] }) else: @@ -149,8 +173,8 @@ def compare_dictionaries(view_object, source_params, target_params, ) diff_dict.update(parce_acl(dict1[key], dict2[key])) - temp_src_params['tid'] = source_dict[key]['oid'] - temp_tgt_params['tid'] = target_dict[key]['oid'] + temp_src_params['tid'] = source_object_id + temp_tgt_params['tid'] = target_object_id temp_src_params['json_resp'] = \ temp_tgt_params['json_resp'] = False @@ -170,8 +194,8 @@ def compare_dictionaries(view_object, source_params, target_params, ) diff_dict.update(parce_acl(dict1[key], dict2[key])) - temp_src_params['oid'] = source_dict[key]['oid'] - temp_tgt_params['oid'] = target_dict[key]['oid'] + temp_src_params['oid'] = source_object_id + temp_tgt_params['oid'] = target_object_id source_ddl = view_object.get_sql_from_diff(**temp_src_params) target_ddl = view_object.get_sql_from_diff(**temp_tgt_params) temp_tgt_params.update( @@ -183,9 +207,9 @@ def compare_dictionaries(view_object, source_params, target_params, 'type': node, 'label': node_label, 'title': key, - 'oid': source_dict[key]['oid'], - 'source_oid': source_dict[key]['oid'], - 'target_oid': target_dict[key]['oid'], + 'oid': source_object_id, + 'source_oid': source_object_id, + 'target_oid': target_object_id, 'status': SchemaDiffModel.COMPARISON_STATUS['different'], 'source_ddl': source_ddl, 'target_ddl': target_ddl, @@ -403,14 +427,22 @@ def is_key_exists(key_list, target_dict): def parce_acl(source, target): - key = 'acl' + """ + This function is used to parse acl. - if 'datacl' in source: - key = 'datacl' - elif 'relacl' in source: - key = 'relacl' - elif 'typacl' in source: - key = 'typacl' + :param source: + :param target: + :return: + """ + acl_keys = ['datacl', 'relacl', 'typacl', 'pkgacl'] + key = is_key_exists(acl_keys, source) + + # If key is not found in source then check the key is available + # in target. + if key is None: + key = is_key_exists(acl_keys, target) + if key is None: + key = 'acl' tmp_source = source[key] if\ key in source and source[key] is not None else [] 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 ced7cf2b7..72a4ec048 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 @@ -688,3 +688,50 @@ CREATE TYPE source.typ_enum_range_diff AS ENUM ('test_enum', 'test_enum_1'); ALTER TYPE source.typ_enum_range_diff OWNER TO postgres; + +-- Sequences Script +CREATE SEQUENCE source.seq_src + CYCLE + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 3 + CACHE 6; +ALTER SEQUENCE source.seq_src + OWNER TO postgres; +COMMENT ON SEQUENCE source.seq_src + IS 'Test Comment'; +GRANT ALL ON SEQUENCE source.seq_src TO PUBLIC; +GRANT ALL ON SEQUENCE source.seq_src TO postgres; + +CREATE SEQUENCE source.seq_diff_comment_acl + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE source.seq_diff_comment_acl + OWNER TO postgres; +COMMENT ON SEQUENCE source.seq_diff_comment_acl + IS 'Test Comment'; +GRANT ALL ON SEQUENCE source.seq_diff_comment_acl TO PUBLIC; +GRANT ALL ON SEQUENCE source.seq_diff_comment_acl TO postgres; + +CREATE SEQUENCE source.seq_diff_comment_acl_remove + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE source.seq_diff_comment_acl_remove + OWNER TO postgres; + +CREATE SEQUENCE source.seq_diff + CYCLE + INCREMENT 3 + START 3 + MINVALUE 3 + MAXVALUE 100 + CACHE 2; +ALTER SEQUENCE source.seq_diff + OWNER TO postgres; 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 5cc069631..bb2b6d6fc 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 @@ -642,3 +642,47 @@ CREATE TYPE target.typ_enum_range_diff AS RANGE ); ALTER TYPE target.typ_enum_range_diff OWNER TO postgres; + +-- Sequences Script +CREATE SEQUENCE target.seq_tar + CYCLE + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 3 + CACHE 6; +ALTER SEQUENCE target.seq_tar + OWNER TO postgres; + +CREATE SEQUENCE target.seq_diff_comment_acl + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; + +ALTER SEQUENCE target.seq_diff_comment_acl + OWNER TO postgres; + +CREATE SEQUENCE target.seq_diff_comment_acl_remove + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE target.seq_diff_comment_acl_remove + OWNER TO postgres; +COMMENT ON SEQUENCE target.seq_diff_comment_acl_remove + IS 'Test Comment'; +GRANT ALL ON SEQUENCE target.seq_diff_comment_acl_remove TO PUBLIC; +GRANT ALL ON SEQUENCE target.seq_diff_comment_acl_remove TO postgres; + +CREATE SEQUENCE target.seq_diff + INCREMENT 5 + START 3 + MINVALUE 3 + MAXVALUE 80 + CACHE 1; + +ALTER SEQUENCE target.seq_diff + OWNER TO postgres; 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 fdbdff2d2..b6a3301f6 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 @@ -651,3 +651,50 @@ CREATE TYPE source.typ_enum_range_diff AS ENUM ('test_enum', 'test_enum_1'); ALTER TYPE source.typ_enum_range_diff OWNER TO postgres; + +-- Sequences Script +CREATE SEQUENCE source.seq_src + CYCLE + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 3 + CACHE 6; +ALTER SEQUENCE source.seq_src + OWNER TO postgres; +COMMENT ON SEQUENCE source.seq_src + IS 'Test Comment'; +GRANT ALL ON SEQUENCE source.seq_src TO PUBLIC; +GRANT ALL ON SEQUENCE source.seq_src TO postgres; + +CREATE SEQUENCE source.seq_diff_comment_acl + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE source.seq_diff_comment_acl + OWNER TO postgres; +COMMENT ON SEQUENCE source.seq_diff_comment_acl + IS 'Test Comment'; +GRANT ALL ON SEQUENCE source.seq_diff_comment_acl TO PUBLIC; +GRANT ALL ON SEQUENCE source.seq_diff_comment_acl TO postgres; + +CREATE SEQUENCE source.seq_diff_comment_acl_remove + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE source.seq_diff_comment_acl_remove + OWNER TO postgres; + +CREATE SEQUENCE source.seq_diff + CYCLE + INCREMENT 3 + START 3 + MINVALUE 3 + MAXVALUE 100 + CACHE 2; +ALTER SEQUENCE source.seq_diff + OWNER TO postgres; 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 d958fe551..9f577b1fe 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 @@ -641,3 +641,47 @@ CREATE TYPE target.typ_enum_range_diff AS RANGE ); ALTER TYPE target.typ_enum_range_diff OWNER TO postgres; + +-- Sequences Script +CREATE SEQUENCE target.seq_tar + CYCLE + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 3 + CACHE 6; +ALTER SEQUENCE target.seq_tar + OWNER TO postgres; + +CREATE SEQUENCE target.seq_diff_comment_acl + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; + +ALTER SEQUENCE target.seq_diff_comment_acl + OWNER TO postgres; + +CREATE SEQUENCE target.seq_diff_comment_acl_remove + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE target.seq_diff_comment_acl_remove + OWNER TO postgres; +COMMENT ON SEQUENCE target.seq_diff_comment_acl_remove + IS 'Test Comment'; +GRANT ALL ON SEQUENCE target.seq_diff_comment_acl_remove TO PUBLIC; +GRANT ALL ON SEQUENCE target.seq_diff_comment_acl_remove TO postgres; + +CREATE SEQUENCE target.seq_diff + INCREMENT 5 + START 3 + MINVALUE 3 + MAXVALUE 80 + CACHE 1; + +ALTER SEQUENCE target.seq_diff + OWNER TO postgres; 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 d4e5967d9..0e5fbdea8 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 @@ -652,3 +652,50 @@ CREATE TYPE source.typ_enum_range_diff AS ENUM ('test_enum', 'test_enum_1'); ALTER TYPE source.typ_enum_range_diff OWNER TO postgres; + +-- Sequences Script +CREATE SEQUENCE source.seq_src + CYCLE + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 3 + CACHE 6; +ALTER SEQUENCE source.seq_src + OWNER TO postgres; +COMMENT ON SEQUENCE source.seq_src + IS 'Test Comment'; +GRANT ALL ON SEQUENCE source.seq_src TO PUBLIC; +GRANT ALL ON SEQUENCE source.seq_src TO postgres; + +CREATE SEQUENCE source.seq_diff_comment_acl + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE source.seq_diff_comment_acl + OWNER TO postgres; +COMMENT ON SEQUENCE source.seq_diff_comment_acl + IS 'Test Comment'; +GRANT ALL ON SEQUENCE source.seq_diff_comment_acl TO PUBLIC; +GRANT ALL ON SEQUENCE source.seq_diff_comment_acl TO postgres; + +CREATE SEQUENCE source.seq_diff_comment_acl_remove + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE source.seq_diff_comment_acl_remove + OWNER TO postgres; + +CREATE SEQUENCE source.seq_diff + CYCLE + INCREMENT 3 + START 3 + MINVALUE 3 + MAXVALUE 100 + CACHE 2; +ALTER SEQUENCE source.seq_diff + OWNER TO postgres; 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 bc6709130..ebb32b4b1 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 @@ -630,3 +630,47 @@ CREATE TYPE target.typ_enum_range_diff AS RANGE ); ALTER TYPE target.typ_enum_range_diff OWNER TO postgres; + +-- Sequences Script +CREATE SEQUENCE target.seq_tar + CYCLE + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 3 + CACHE 6; +ALTER SEQUENCE target.seq_tar + OWNER TO postgres; + +CREATE SEQUENCE target.seq_diff_comment_acl + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; + +ALTER SEQUENCE target.seq_diff_comment_acl + OWNER TO postgres; + +CREATE SEQUENCE target.seq_diff_comment_acl_remove + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE target.seq_diff_comment_acl_remove + OWNER TO postgres; +COMMENT ON SEQUENCE target.seq_diff_comment_acl_remove + IS 'Test Comment'; +GRANT ALL ON SEQUENCE target.seq_diff_comment_acl_remove TO PUBLIC; +GRANT ALL ON SEQUENCE target.seq_diff_comment_acl_remove TO postgres; + +CREATE SEQUENCE target.seq_diff + INCREMENT 5 + START 3 + MINVALUE 3 + MAXVALUE 80 + CACHE 1; + +ALTER SEQUENCE target.seq_diff + OWNER TO postgres; 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 eeecb507f..515ff5e9f 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 @@ -521,3 +521,50 @@ CREATE TYPE source.typ_enum_range_diff AS ENUM ('test_enum', 'test_enum_1'); ALTER TYPE source.typ_enum_range_diff OWNER TO postgres; + +-- Sequences Script +CREATE SEQUENCE source.seq_src + CYCLE + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 3 + CACHE 6; +ALTER SEQUENCE source.seq_src + OWNER TO postgres; +COMMENT ON SEQUENCE source.seq_src + IS 'Test Comment'; +GRANT ALL ON SEQUENCE source.seq_src TO PUBLIC; +GRANT ALL ON SEQUENCE source.seq_src TO postgres; + +CREATE SEQUENCE source.seq_diff_comment_acl + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE source.seq_diff_comment_acl + OWNER TO postgres; +COMMENT ON SEQUENCE source.seq_diff_comment_acl + IS 'Test Comment'; +GRANT ALL ON SEQUENCE source.seq_diff_comment_acl TO PUBLIC; +GRANT ALL ON SEQUENCE source.seq_diff_comment_acl TO postgres; + +CREATE SEQUENCE source.seq_diff_comment_acl_remove + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE source.seq_diff_comment_acl_remove + OWNER TO postgres; + +CREATE SEQUENCE source.seq_diff + CYCLE + INCREMENT 3 + START 3 + MINVALUE 3 + MAXVALUE 100 + CACHE 2; +ALTER SEQUENCE source.seq_diff + OWNER TO postgres; 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 6c39d44ec..85738bffd 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 @@ -548,3 +548,47 @@ CREATE TYPE target.typ_enum_range_diff AS RANGE ); ALTER TYPE target.typ_enum_range_diff OWNER TO postgres; + +-- Sequences Script +CREATE SEQUENCE target.seq_tar + CYCLE + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 3 + CACHE 6; +ALTER SEQUENCE target.seq_tar + OWNER TO postgres; + +CREATE SEQUENCE target.seq_diff_comment_acl + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; + +ALTER SEQUENCE target.seq_diff_comment_acl + OWNER TO postgres; + +CREATE SEQUENCE target.seq_diff_comment_acl_remove + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE target.seq_diff_comment_acl_remove + OWNER TO postgres; +COMMENT ON SEQUENCE target.seq_diff_comment_acl_remove + IS 'Test Comment'; +GRANT ALL ON SEQUENCE target.seq_diff_comment_acl_remove TO PUBLIC; +GRANT ALL ON SEQUENCE target.seq_diff_comment_acl_remove TO postgres; + +CREATE SEQUENCE target.seq_diff + INCREMENT 5 + START 3 + MINVALUE 3 + MAXVALUE 80 + CACHE 1; + +ALTER SEQUENCE target.seq_diff + OWNER TO postgres; 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 e7cbb3c76..08976be21 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 @@ -588,3 +588,211 @@ CREATE TYPE source.typ_enum_range_diff AS ENUM ('test_enum', 'test_enum_1'); ALTER TYPE source.typ_enum_range_diff OWNER TO enterprisedb; + +-- Package script (source only) +CREATE OR REPLACE PACKAGE source.pkg_src +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying; + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric); +END pkg_src; + +CREATE OR REPLACE PACKAGE BODY source.pkg_src +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying IS + v_dname VARCHAR2(14); + BEGIN + SELECT dname INTO v_dname FROM dept WHERE deptno = p_deptno; + RETURN v_dname; + EXCEPTION + WHEN NO_DATA_FOUND THEN + DBMS_OUTPUT.PUT_LINE('Invalid department number ' || p_deptno); + RETURN ''; + END; + + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric) IS + BEGIN + INSERT INTO emp(empno, ename, job, sal, hiredate, comm, mgr, deptno) + VALUES(p_empno, p_ename, p_job, p_sal, + p_hiredate, p_comm, p_mgr, p_deptno); + END; +END pkg_src; + +COMMENT ON PACKAGE source.pkg_src + IS 'Target'; + +-- Package script difference in header, acl and comment +CREATE OR REPLACE PACKAGE source.pkg_header_diff +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying; + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric); +END pkg_header_diff; + +CREATE OR REPLACE PACKAGE BODY source.pkg_header_diff +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying IS + v_dname VARCHAR2(14); + BEGIN + SELECT dname INTO v_dname FROM dept WHERE deptno = p_deptno; + RETURN v_dname; + EXCEPTION + WHEN NO_DATA_FOUND THEN + DBMS_OUTPUT.PUT_LINE('Invalid department number ' || p_deptno); + RETURN ''; + END; + + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric) IS + BEGIN + INSERT INTO emp(empno, ename, job, sal, hiredate, comm, mgr, deptno) + VALUES(p_empno, p_ename, p_job, p_sal, + p_hiredate, p_comm, p_mgr, p_deptno); + END; +END pkg_header_diff; + +COMMENT ON PACKAGE source.pkg_header_diff + IS 'Header Diff'; + +GRANT EXECUTE ON PACKAGE source.pkg_header_diff TO PUBLIC; +GRANT EXECUTE ON PACKAGE source.pkg_header_diff TO enterprisedb WITH GRANT OPTION; + +-- Package script difference in body, acl and comment +CREATE OR REPLACE PACKAGE source.pkg_body_diff +IS + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric); +END pkg_body_diff; + +CREATE OR REPLACE PACKAGE BODY source.pkg_body_diff +IS + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric) IS + BEGIN + DBMS_OUTPUT.PUT_LINE('Before Insert '); + INSERT INTO emp(empno, ename, job, sal, hiredate, comm, mgr, deptno) + VALUES(p_empno, p_ename, p_job, p_sal, + p_hiredate, p_comm, p_mgr, p_deptno); + DBMS_OUTPUT.PUT_LINE('After Insert '); + END; +END pkg_body_diff; + +-- Synonyms Scripts +-- Prerequisite for synonyms +CREATE OR REPLACE FUNCTION source.fun_for_syn() +RETURNS void + LANGUAGE 'plpgsql' + VOLATILE + COST 100 + +AS $BODY$BEGIN +SELECT 1; +END;$BODY$; +ALTER FUNCTION source.fun_for_syn() + OWNER TO enterprisedb; + +CREATE OR REPLACE PROCEDURE source.proc_for_syn() + SECURITY DEFINER VOLATILE + COST 100 +AS $BODY$BEGIN +SELECT 1; +END;$BODY$; + +CREATE OR REPLACE PACKAGE source.pkg_for_syn +IS +FUNCTION get_dept_name(p_deptno numeric) RETURN character varying; +END pkg_for_syn; +CREATE OR REPLACE PACKAGE BODY source.pkg_for_syn +IS +FUNCTION get_dept_name(p_deptno numeric) RETURN character varying IS +BEGIN + RETURN ''; +END; +END pkg_for_syn; + +CREATE TABLE source.table_for_syn +( + id bigint, + name text COLLATE pg_catalog."default" +) +TABLESPACE pg_default; +ALTER TABLE source.table_for_syn + OWNER to enterprisedb; + +CREATE SEQUENCE source.seq_for_syn + INCREMENT 5 + START 1 + MINVALUE 1 + MAXVALUE 100 + CACHE 1; +ALTER SEQUENCE source.seq_for_syn + OWNER TO enterprisedb; + +CREATE OR REPLACE SYNONYM source.syn_fun_src + FOR source.fun_for_syn; + +CREATE OR REPLACE SYNONYM source.syn_pkg_src + FOR source.pkg_for_syn; + +CREATE OR REPLACE SYNONYM source.syn_proc_src + FOR source.proc_for_syn; + +CREATE OR REPLACE SYNONYM source.syn_seq_src + FOR source.seq_for_syn; + +CREATE OR REPLACE SYNONYM source.syn_table_src + FOR source.table_for_syn; + +CREATE TABLE public.table_for_syn +( + id bigint, + name text COLLATE pg_catalog."default" +) +TABLESPACE pg_default; +ALTER TABLE public.table_for_syn + OWNER to enterprisedb; + +CREATE OR REPLACE SYNONYM source.syn_diff + FOR public.table_for_syn; + +-- Sequences Script +CREATE SEQUENCE source.seq_src + CYCLE + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 3 + CACHE 6; +ALTER SEQUENCE source.seq_src + OWNER TO enterprisedb; +COMMENT ON SEQUENCE source.seq_src + IS 'Test Comment'; +GRANT ALL ON SEQUENCE source.seq_src TO PUBLIC; +GRANT ALL ON SEQUENCE source.seq_src TO enterprisedb; + +CREATE SEQUENCE source.seq_diff_comment_acl + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE source.seq_diff_comment_acl + OWNER TO enterprisedb; +COMMENT ON SEQUENCE source.seq_diff_comment_acl + IS 'Test Comment'; +GRANT ALL ON SEQUENCE source.seq_diff_comment_acl TO PUBLIC; +GRANT ALL ON SEQUENCE source.seq_diff_comment_acl TO enterprisedb; + +CREATE SEQUENCE source.seq_diff_comment_acl_remove + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE source.seq_diff_comment_acl_remove + OWNER TO enterprisedb; + +CREATE SEQUENCE source.seq_diff + CYCLE + INCREMENT 3 + START 3 + MINVALUE 3 + MAXVALUE 100 + CACHE 2; +ALTER SEQUENCE source.seq_diff + OWNER TO enterprisedb; 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 ab74a20e3..08a68a892 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 @@ -578,3 +578,198 @@ CREATE TYPE target.typ_enum_range_diff AS RANGE ALTER TYPE target.typ_enum_range_diff OWNER TO enterprisedb; +-- Package script (target only) +CREATE OR REPLACE PACKAGE target.pkg_tar +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying; + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric); +END pkg_tar; + + +CREATE OR REPLACE PACKAGE BODY target.pkg_tar +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying IS + v_dname VARCHAR2(14); + BEGIN + SELECT dname INTO v_dname FROM dept WHERE deptno = p_deptno; + RETURN v_dname; + EXCEPTION + WHEN NO_DATA_FOUND THEN + DBMS_OUTPUT.PUT_LINE('Invalid department number ' || p_deptno); + RETURN ''; + END; + + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric) IS + BEGIN + INSERT INTO emp(empno, ename, job, sal, hiredate, comm, mgr, deptno) + VALUES(p_empno, p_ename, p_job, p_sal, + p_hiredate, p_comm, p_mgr, p_deptno); + END; +END pkg_tar; + +COMMENT ON PACKAGE target.pkg_tar + IS 'Target'; + +-- Package script difference in header, acl and comment +CREATE OR REPLACE PACKAGE target.pkg_header_diff +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying; +END pkg_header_diff; + +CREATE OR REPLACE PACKAGE BODY target.pkg_header_diff +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying IS + v_dname VARCHAR2(14); + BEGIN + SELECT dname INTO v_dname FROM dept WHERE deptno = p_deptno; + RETURN v_dname; + EXCEPTION + WHEN NO_DATA_FOUND THEN + DBMS_OUTPUT.PUT_LINE('Invalid department number ' || p_deptno); + RETURN ''; + END; +END pkg_header_diff; + +-- Package script difference in body, acl and comment +CREATE OR REPLACE PACKAGE target.pkg_body_diff +IS + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric); +END pkg_body_diff; + +CREATE OR REPLACE PACKAGE BODY target.pkg_body_diff +IS + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric) IS + BEGIN + DBMS_OUTPUT.PUT_LINE('Before Insert '); + INSERT INTO emp(empno, ename, job, sal, hiredate, comm, mgr, deptno) + VALUES(p_empno, p_ename, p_job, p_sal, + p_hiredate, p_comm, p_mgr, p_deptno); + DBMS_OUTPUT.PUT_LINE('After Insert '); + END; +END pkg_body_diff; + +COMMENT ON PACKAGE target.pkg_body_diff + IS 'Header Diff'; + +GRANT EXECUTE ON PACKAGE target.pkg_body_diff TO PUBLIC; +GRANT EXECUTE ON PACKAGE target.pkg_body_diff TO enterprisedb WITH GRANT OPTION; + +-- Synonyms Scripts +-- Prerequisite for synonyms +CREATE OR REPLACE FUNCTION target.fun_for_syn() +RETURNS void + LANGUAGE 'plpgsql' + VOLATILE + COST 100 + +AS $BODY$BEGIN +SELECT 1; +END;$BODY$; +ALTER FUNCTION target.fun_for_syn() + OWNER TO enterprisedb; + +CREATE OR REPLACE PROCEDURE target.proc_for_syn() + SECURITY DEFINER VOLATILE + COST 100 +AS $BODY$BEGIN +SELECT 1; +END;$BODY$; + +CREATE OR REPLACE PACKAGE target.pkg_for_syn +IS +FUNCTION get_dept_name(p_deptno numeric) RETURN character varying; +END pkg_for_syn; +CREATE OR REPLACE PACKAGE BODY target.pkg_for_syn +IS +FUNCTION get_dept_name(p_deptno numeric) RETURN character varying IS +BEGIN + RETURN ''; +END; +END pkg_for_syn; + +CREATE TABLE target.table_for_syn +( + id bigint, + name text COLLATE pg_catalog."default" +) +TABLESPACE pg_default; +ALTER TABLE target.table_for_syn + OWNER to enterprisedb; + +CREATE SEQUENCE target.seq_for_syn + INCREMENT 5 + START 1 + MINVALUE 1 + MAXVALUE 100 + CACHE 1; +ALTER SEQUENCE target.seq_for_syn + OWNER TO enterprisedb; + +CREATE OR REPLACE SYNONYM target.syn_fun_src + FOR target.fun_for_syn; + +CREATE OR REPLACE SYNONYM target.syn_pkg_src + FOR target.pkg_for_syn; + +CREATE OR REPLACE SYNONYM target.syn_proc_src + FOR target.proc_for_syn; + +CREATE OR REPLACE SYNONYM target.syn_seq_src + FOR target.seq_for_syn; + +CREATE OR REPLACE SYNONYM target.syn_table_src + FOR target.table_for_syn; + +CREATE OR REPLACE PROCEDURE public.proc_for_syn() + SECURITY DEFINER VOLATILE + COST 100 +AS $BODY$BEGIN +SELECT 1; +END;$BODY$; + +CREATE OR REPLACE SYNONYM target.syn_diff + FOR public.proc_for_syn; + +-- Sequences Script +CREATE SEQUENCE target.seq_tar + CYCLE + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 3 + CACHE 6; +ALTER SEQUENCE target.seq_tar + OWNER TO enterprisedb; + +CREATE SEQUENCE target.seq_diff_comment_acl + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; + +ALTER SEQUENCE target.seq_diff_comment_acl + OWNER TO enterprisedb; + +CREATE SEQUENCE target.seq_diff_comment_acl_remove + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE target.seq_diff_comment_acl_remove + OWNER TO enterprisedb; +COMMENT ON SEQUENCE target.seq_diff_comment_acl_remove + IS 'Test Comment'; +GRANT ALL ON SEQUENCE target.seq_diff_comment_acl_remove TO PUBLIC; +GRANT ALL ON SEQUENCE target.seq_diff_comment_acl_remove TO enterprisedb; + +CREATE SEQUENCE target.seq_diff + INCREMENT 5 + START 3 + MINVALUE 3 + MAXVALUE 80 + CACHE 1; + +ALTER SEQUENCE target.seq_diff + OWNER TO enterprisedb; 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 4bf782d4a..0060a9e1c 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 @@ -80,7 +80,7 @@ CREATE TABLE source.table_for_identical ( ); -ALTER TABLE source.table_for_identical OWNER TO enterprisedb;; +ALTER TABLE source.table_for_identical OWNER TO enterprisedb; -- -- TOC entry 12260 (class 1259 OID 148977) @@ -522,3 +522,209 @@ CREATE TYPE source.typ_enum_range_diff AS ENUM ('test_enum', 'test_enum_1'); ALTER TYPE source.typ_enum_range_diff OWNER TO enterprisedb; + +-- Package script (source only) +CREATE OR REPLACE PACKAGE source.pkg_src +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying; + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric); +END pkg_src; + +CREATE OR REPLACE PACKAGE BODY source.pkg_src +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying IS + v_dname VARCHAR2(14); + BEGIN + SELECT dname INTO v_dname FROM dept WHERE deptno = p_deptno; + RETURN v_dname; + EXCEPTION + WHEN NO_DATA_FOUND THEN + DBMS_OUTPUT.PUT_LINE('Invalid department number ' || p_deptno); + RETURN ''; + END; + + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric) IS + BEGIN + INSERT INTO emp(empno, ename, job, sal, hiredate, comm, mgr, deptno) + VALUES(p_empno, p_ename, p_job, p_sal, + p_hiredate, p_comm, p_mgr, p_deptno); + END; +END pkg_src; + +COMMENT ON PACKAGE source.pkg_src + IS 'Target'; + +-- Package script difference in header, acl and comment +CREATE OR REPLACE PACKAGE source.pkg_header_diff +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying; + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric); +END pkg_header_diff; + +CREATE OR REPLACE PACKAGE BODY source.pkg_header_diff +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying IS + v_dname VARCHAR2(14); + BEGIN + SELECT dname INTO v_dname FROM dept WHERE deptno = p_deptno; + RETURN v_dname; + EXCEPTION + WHEN NO_DATA_FOUND THEN + DBMS_OUTPUT.PUT_LINE('Invalid department number ' || p_deptno); + RETURN ''; + END; + + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric) IS + BEGIN + INSERT INTO emp(empno, ename, job, sal, hiredate, comm, mgr, deptno) + VALUES(p_empno, p_ename, p_job, p_sal, + p_hiredate, p_comm, p_mgr, p_deptno); + END; +END pkg_header_diff; + +COMMENT ON PACKAGE source.pkg_header_diff + IS 'Header Diff'; + +GRANT EXECUTE ON PACKAGE source.pkg_header_diff TO PUBLIC; +GRANT EXECUTE ON PACKAGE source.pkg_header_diff TO enterprisedb WITH GRANT OPTION; + +-- Package script difference in body, acl and comment +CREATE OR REPLACE PACKAGE source.pkg_body_diff +IS + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric); +END pkg_body_diff; + +CREATE OR REPLACE PACKAGE BODY source.pkg_body_diff +IS + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric) IS + BEGIN + DBMS_OUTPUT.PUT_LINE('Before Insert '); + INSERT INTO emp(empno, ename, job, sal, hiredate, comm, mgr, deptno) + VALUES(p_empno, p_ename, p_job, p_sal, + p_hiredate, p_comm, p_mgr, p_deptno); + DBMS_OUTPUT.PUT_LINE('After Insert '); + END; +END pkg_body_diff; + +-- Synonyms Scripts +-- Prerequisite for synonyms +CREATE OR REPLACE FUNCTION source.fun_for_syn() +RETURNS void + LANGUAGE 'plpgsql' + VOLATILE + COST 100 + +AS $BODY$BEGIN +SELECT 1; +END;$BODY$; +ALTER FUNCTION source.fun_for_syn() + OWNER TO enterprisedb; + +CREATE OR REPLACE PROCEDURE source.proc_for_syn() +AS $BODY$BEGIN +SELECT 1; +END;$BODY$; + +CREATE OR REPLACE PACKAGE source.pkg_for_syn +IS +FUNCTION get_dept_name(p_deptno numeric) RETURN character varying; +END pkg_for_syn; +CREATE OR REPLACE PACKAGE BODY source.pkg_for_syn +IS +FUNCTION get_dept_name(p_deptno numeric) RETURN character varying IS +BEGIN + RETURN ''; +END; +END pkg_for_syn; + +CREATE TABLE source.table_for_syn +( + id bigint, + name text COLLATE pg_catalog."default" +) +TABLESPACE pg_default; +ALTER TABLE source.table_for_syn + OWNER to enterprisedb; + +CREATE SEQUENCE source.seq_for_syn + INCREMENT 5 + START 1 + MINVALUE 1 + MAXVALUE 100 + CACHE 1; +ALTER SEQUENCE source.seq_for_syn + OWNER TO enterprisedb; + +CREATE OR REPLACE SYNONYM source.syn_fun_src + FOR source.fun_for_syn; + +CREATE OR REPLACE SYNONYM source.syn_pkg_src + FOR source.pkg_for_syn; + +CREATE OR REPLACE SYNONYM source.syn_proc_src + FOR source.proc_for_syn; + +CREATE OR REPLACE SYNONYM source.syn_seq_src + FOR source.seq_for_syn; + +CREATE OR REPLACE SYNONYM source.syn_table_src + FOR source.table_for_syn; + +CREATE TABLE public.table_for_syn +( + id bigint, + name text COLLATE pg_catalog."default" +) +TABLESPACE pg_default; +ALTER TABLE public.table_for_syn + OWNER to enterprisedb; + +CREATE OR REPLACE SYNONYM source.syn_diff + FOR public.table_for_syn; + +-- Sequences Script +CREATE SEQUENCE source.seq_src + CYCLE + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 3 + CACHE 6; +ALTER SEQUENCE source.seq_src + OWNER TO enterprisedb; +COMMENT ON SEQUENCE source.seq_src + IS 'Test Comment'; +GRANT ALL ON SEQUENCE source.seq_src TO PUBLIC; +GRANT ALL ON SEQUENCE source.seq_src TO enterprisedb; + +CREATE SEQUENCE source.seq_diff_comment_acl + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE source.seq_diff_comment_acl + OWNER TO enterprisedb; +COMMENT ON SEQUENCE source.seq_diff_comment_acl + IS 'Test Comment'; +GRANT ALL ON SEQUENCE source.seq_diff_comment_acl TO PUBLIC; +GRANT ALL ON SEQUENCE source.seq_diff_comment_acl TO enterprisedb; + +CREATE SEQUENCE source.seq_diff_comment_acl_remove + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE source.seq_diff_comment_acl_remove + OWNER TO enterprisedb; + +CREATE SEQUENCE source.seq_diff + CYCLE + INCREMENT 3 + START 3 + MINVALUE 3 + MAXVALUE 100 + CACHE 2; +ALTER SEQUENCE source.seq_diff + OWNER TO enterprisedb; 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 313a841f7..a4c605d02 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 @@ -550,3 +550,195 @@ CREATE TYPE target.typ_enum_range_diff AS RANGE ); ALTER TYPE target.typ_enum_range_diff OWNER TO enterprisedb; + +-- Package script (target only) +CREATE OR REPLACE PACKAGE target.pkg_tar +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying; + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric); +END pkg_tar; + + +CREATE OR REPLACE PACKAGE BODY target.pkg_tar +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying IS + v_dname VARCHAR2(14); + BEGIN + SELECT dname INTO v_dname FROM dept WHERE deptno = p_deptno; + RETURN v_dname; + EXCEPTION + WHEN NO_DATA_FOUND THEN + DBMS_OUTPUT.PUT_LINE('Invalid department number ' || p_deptno); + RETURN ''; + END; + + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric) IS + BEGIN + INSERT INTO emp(empno, ename, job, sal, hiredate, comm, mgr, deptno) + VALUES(p_empno, p_ename, p_job, p_sal, + p_hiredate, p_comm, p_mgr, p_deptno); + END; +END pkg_tar; + +COMMENT ON PACKAGE target.pkg_tar + IS 'Target'; + +-- Package script difference in header, acl and comment +CREATE OR REPLACE PACKAGE target.pkg_header_diff +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying; +END pkg_header_diff; + +CREATE OR REPLACE PACKAGE BODY target.pkg_header_diff +IS + FUNCTION get_dept_name(p_deptno numeric) RETURN character varying IS + v_dname VARCHAR2(14); + BEGIN + SELECT dname INTO v_dname FROM dept WHERE deptno = p_deptno; + RETURN v_dname; + EXCEPTION + WHEN NO_DATA_FOUND THEN + DBMS_OUTPUT.PUT_LINE('Invalid department number ' || p_deptno); + RETURN ''; + END; +END pkg_header_diff; + +-- Package script difference in body, acl and comment +CREATE OR REPLACE PACKAGE target.pkg_body_diff +IS + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric); +END pkg_body_diff; + +CREATE OR REPLACE PACKAGE BODY target.pkg_body_diff +IS + PROCEDURE hire_emp(p_empno numeric, p_ename character varying, p_job character varying, p_sal numeric, p_hiredate timestamp without time zone, p_comm numeric, p_mgr numeric, p_deptno numeric) IS + BEGIN + DBMS_OUTPUT.PUT_LINE('Before Insert '); + INSERT INTO emp(empno, ename, job, sal, hiredate, comm, mgr, deptno) + VALUES(p_empno, p_ename, p_job, p_sal, + p_hiredate, p_comm, p_mgr, p_deptno); + DBMS_OUTPUT.PUT_LINE('After Insert '); + END; +END pkg_body_diff; + +COMMENT ON PACKAGE target.pkg_body_diff + IS 'Header Diff'; + +GRANT EXECUTE ON PACKAGE target.pkg_body_diff TO PUBLIC; +GRANT EXECUTE ON PACKAGE target.pkg_body_diff TO enterprisedb WITH GRANT OPTION; + +-- Synonyms Scripts +-- Prerequisite for synonyms +CREATE OR REPLACE FUNCTION target.fun_for_syn() +RETURNS void + LANGUAGE 'plpgsql' + VOLATILE + COST 100 + +AS $BODY$BEGIN +SELECT 1; +END;$BODY$; +ALTER FUNCTION target.fun_for_syn() + OWNER TO enterprisedb; + +CREATE OR REPLACE PROCEDURE target.proc_for_syn() +AS $BODY$BEGIN +SELECT 1; +END;$BODY$; + +CREATE OR REPLACE PACKAGE target.pkg_for_syn +IS +FUNCTION get_dept_name(p_deptno numeric) RETURN character varying; +END pkg_for_syn; +CREATE OR REPLACE PACKAGE BODY target.pkg_for_syn +IS +FUNCTION get_dept_name(p_deptno numeric) RETURN character varying IS +BEGIN + RETURN ''; +END; +END pkg_for_syn; + +CREATE TABLE target.table_for_syn +( + id bigint, + name text COLLATE pg_catalog."default" +) +TABLESPACE pg_default; +ALTER TABLE target.table_for_syn + OWNER to enterprisedb; + +CREATE SEQUENCE target.seq_for_syn + INCREMENT 5 + START 1 + MINVALUE 1 + MAXVALUE 100 + CACHE 1; +ALTER SEQUENCE target.seq_for_syn + OWNER TO enterprisedb; + +CREATE OR REPLACE SYNONYM target.syn_fun_src + FOR target.fun_for_syn; + +CREATE OR REPLACE SYNONYM target.syn_pkg_src + FOR target.pkg_for_syn; + +CREATE OR REPLACE SYNONYM target.syn_proc_src + FOR target.proc_for_syn; + +CREATE OR REPLACE SYNONYM target.syn_seq_src + FOR target.seq_for_syn; + +CREATE OR REPLACE SYNONYM target.syn_table_src + FOR target.table_for_syn; + +CREATE OR REPLACE PROCEDURE public.proc_for_syn() +AS $BODY$BEGIN +SELECT 1; +END;$BODY$; + +CREATE OR REPLACE SYNONYM target.syn_diff + FOR public.proc_for_syn; + +-- Sequences Script +CREATE SEQUENCE target.seq_tar + CYCLE + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 3 + CACHE 6; +ALTER SEQUENCE target.seq_tar + OWNER TO enterprisedb; + +CREATE SEQUENCE target.seq_diff_comment_acl + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; + +ALTER SEQUENCE target.seq_diff_comment_acl + OWNER TO enterprisedb; + +CREATE SEQUENCE target.seq_diff_comment_acl_remove + INCREMENT 1 + START 1 + MINVALUE 1 + MAXVALUE 9223372036854775807 + CACHE 1; +ALTER SEQUENCE target.seq_diff_comment_acl_remove + OWNER TO enterprisedb; +COMMENT ON SEQUENCE target.seq_diff_comment_acl_remove + IS 'Test Comment'; +GRANT ALL ON SEQUENCE target.seq_diff_comment_acl_remove TO PUBLIC; +GRANT ALL ON SEQUENCE target.seq_diff_comment_acl_remove TO enterprisedb; + +CREATE SEQUENCE target.seq_diff + INCREMENT 5 + START 3 + MINVALUE 3 + MAXVALUE 80 + CACHE 1; + +ALTER SEQUENCE target.seq_diff + OWNER TO enterprisedb;