From 27c7ea2ff15e73cde6aa9e59ff8f8ccfc01500e0 Mon Sep 17 00:00:00 2001 From: Pravesh Sharma Date: Mon, 7 Aug 2023 11:20:04 +0530 Subject: [PATCH] Added all like options while creating a table. #6377 --- docs/en_US/images/table_advanced.png | Bin 50578 -> 84532 bytes docs/en_US/table_dialog.rst | 18 +- .../schemas/tables/static/js/table.ui.js | 28 + .../templates/tables/sql/11_plus/create.sql | 6 +- .../templates/tables/sql/12_plus/create.sql | 8 +- .../templates/tables/sql/14_plus/create.sql | 235 ++ .../templates/tables/sql/default/create.sql | 6 +- .../create_partition_table_with_collate.sql | 3 +- .../create_table_with_hash_partition.sql | 3 +- .../schemas/tables/tests/pg/11_plus/test.json | 1462 ++++++++++- .../alter_table_add_exclude_constraint.sql | 4 +- ...lter_table_add_exclude_constraint_msql.sql | 4 +- .../pg/12_plus/alter_table_update_grants.sql | 4 +- .../create_partition_table_with_collate.sql | 3 +- .../create_table_with_hash_partition.sql | 3 +- .../create_table_with_lik_tbl_msql.sql | 3 + .../12_plus/create_table_with_partition.sql | 3 +- .../create_table_with_range_partition.sql | 3 +- .../schemas/tables/tests/pg/12_plus/test.json | 1465 ++++++++++- .../create_table_with_lik_tbl_msql.sql | 20 + .../schemas/tables/tests/pg/14_plus/test.json | 2126 ++++++++++++++++ .../alter_table_add_exclude_constraint.sql | 4 +- ...lter_table_add_exclude_constraint_msql.sql | 4 +- .../pg/default/alter_table_update_grants.sql | 2 + .../create_table_with_lik_tbl_msql.sql | 2 + .../schemas/tables/tests/pg/default/test.json | 32 +- .../tables/tests/ppas/11_plus/test.json | 1822 +++++++++++++- .../alter_table_add_exclude_constraint.sql | 4 +- ...lter_table_add_exclude_constraint_msql.sql | 4 +- .../create_table_with_lik_tbl_msql.sql | 3 + .../tables/tests/ppas/12_plus/test.json | 45 +- .../create_table_with_lik_tbl_msql.sql | 20 + .../tables/tests/ppas/14_plus/test.json | 2142 +++++++++++++++++ .../alter_table_add_exclude_constraint.sql | 4 +- ...lter_table_add_exclude_constraint_msql.sql | 4 +- .../default/alter_table_update_grants.sql | 2 + .../create_table_with_lik_tbl_msql.sql | 2 + .../tables/tests/ppas/default/test.json | 6 +- .../schemas/tables/tests/table_test_data.json | 125 + .../schema_ui_files/table.ui.spec.js | 4 + 40 files changed, 9584 insertions(+), 54 deletions(-) create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/14_plus/create.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/14_plus/create_table_with_lik_tbl_msql.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/14_plus/test.json create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/14_plus/create_table_with_lik_tbl_msql.sql create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/14_plus/test.json diff --git a/docs/en_US/images/table_advanced.png b/docs/en_US/images/table_advanced.png index ec138cd3597e856ee8182cdc1630b50c529bcab9..49aac77c4008d359dd2cbae2609e12f81c47e520 100644 GIT binary patch literal 84532 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΋ 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

S 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 literal 50578 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 XK|yRbnTVqZ;7dtPUG|T(QSko(LM0IC diff --git a/docs/en_US/table_dialog.rst b/docs/en_US/table_dialog.rst index 025d0d85b..9ebcbfc72 100644 --- a/docs/en_US/table_dialog.rst +++ b/docs/en_US/table_dialog.rst @@ -418,13 +418,21 @@ not-null constraints; after saving the new or modified table, any changes to the original table will not be applied to the new table. * Use the drop-down listbox next to *Relation* to select a reference table. -* Move the *With default values?* switch to the *Yes* position to copy default +* Move the switch next to *With default values?* towards the *right position* to copy default values. -* Move the *With constraints?* switch to the *Yes* position to copy table and +* Move the switch next to *With constraints?* towards the *right position* to copy table and column constraints. -* Move the *With indexes?* switch to the *Yes* position to copy indexes. -* Move the *With storage?* switch to the *Yes* position to copy storage settings. -* Move the *With comments?* switch to the *Yes* position to copy comments. +* Move the switch next to *With indexes?* towards the *right position* to copy indexes. +* Move the switch next to *With storage?* towards the *right position* to copy storage settings. +* Move the switch next to *With comments?* towards the *right position* to copy comments. +* Move the switch next to *With compression?* towards the *right position* to copy + compression method. This option is available only on PostgreSQL 14 and above. +* Move the switch next to *With generated?* towards the *right position* to copy + generation expressions of copied column. This option is available only on PostgreSQL 12 and above. +* Move the switch next to *With identity?* towards the *right position* to copy + any identity specifications of copied column. +* Move the switch next to *With statistics?* towards the *right position* to copy + extended statistics. With PostgreSQL 10 forward, the *Partition* tab will be visible. diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js index c276f652f..2495842d3 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.ui.js @@ -231,6 +231,10 @@ export class LikeSchema extends BaseUISchema { like_indexes: false, like_storage: false, like_comments: false, + like_compression: false, + like_generated: false, + like_identity: false, + like_statistics: false }; } } @@ -256,22 +260,46 @@ export class LikeSchema extends BaseUISchema { id: 'like_default_value', label: gettext('With default values?'), type: 'switch', mode: ['create'], deps: ['like_relation'], disabled: this.isRelationDisable, depChange: (...args)=>obj.resetVals(...args), + inlineNext: true, },{ id: 'like_constraints', label: gettext('With constraints?'), type: 'switch', mode: ['create'], deps: ['like_relation'], disabled: this.isRelationDisable, depChange: (...args)=>obj.resetVals(...args), + inlineNext: true, },{ id: 'like_indexes', label: gettext('With indexes?'), type: 'switch', mode: ['create'], deps: ['like_relation'], disabled: this.isRelationDisable, depChange: (...args)=>obj.resetVals(...args), + inlineNext: true, },{ id: 'like_storage', label: gettext('With storage?'), type: 'switch', mode: ['create'], deps: ['like_relation'], disabled: this.isRelationDisable, depChange: (...args)=>obj.resetVals(...args), + inlineNext: true, },{ id: 'like_comments', label: gettext('With comments?'), type: 'switch', mode: ['create'], deps: ['like_relation'], disabled: this.isRelationDisable, depChange: (...args)=>obj.resetVals(...args), + inlineNext: true, + },{ + id: 'like_compression', label: gettext('With compression?'), + type: 'switch', mode: ['create'], deps: ['like_relation'], + disabled: this.isRelationDisable, depChange: (...args)=>obj.resetVals(...args), + min_version: 140000, inlineNext: true, + },{ + id: 'like_generated', label: gettext('With generated?'), + type: 'switch', mode: ['create'], deps: ['like_relation'], + disabled: this.isRelationDisable, depChange: (...args)=>obj.resetVals(...args), + min_version: 120000, inlineNext: true, + },{ + id: 'like_identity', label: gettext('With identity?'), + type: 'switch', mode: ['create'], deps: ['like_relation'], + disabled: this.isRelationDisable, depChange: (...args)=>obj.resetVals(...args), + inlineNext: true, + },{ + id: 'like_statistics', label: gettext('With statistics?'), + type: 'switch', mode: ['create'], deps: ['like_relation'], + disabled: this.isRelationDisable, depChange: (...args)=>obj.resetVals(...args), } ]; } diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/11_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/11_plus/create.sql index 64c22707c..ea21997d6 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/11_plus/create.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/11_plus/create.sql @@ -34,7 +34,11 @@ CREATE {% if data.relpersistence %}UNLOGGED {% endif %}TABLE{% if add_not_exists INCLUDING STORAGE{% endif %}{% if data.like_comments %} - INCLUDING COMMENTS{% endif %}{% if data.columns|length > 0 %}, + INCLUDING COMMENTS{% endif %}{% if data.like_identity %} + + INCLUDING IDENTITY{% endif %}{% if data.like_statistics %} + + INCLUDING STATISTICS{% endif %}{% if data.columns|length > 0 %}, {% endif %} {% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/12_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/12_plus/create.sql index 09fa59160..6879ee3c0 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/12_plus/create.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/12_plus/create.sql @@ -38,7 +38,13 @@ CREATE {% if data.relpersistence %}UNLOGGED {% endif %}TABLE{% if add_not_exists INCLUDING STORAGE{% endif %}{% if data.like_comments %} - INCLUDING COMMENTS{% endif %}{% if data.columns|length > 0 %}, + INCLUDING COMMENTS{% endif %}{% if data.like_generated %} + + INCLUDING GENERATED{% endif %}{% if data.like_identity %} + + INCLUDING IDENTITY{% endif %}{% if data.like_statistics %} + + INCLUDING STATISTICS{% endif %}{% if data.columns|length > 0 %}, {% endif %} {% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/14_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/14_plus/create.sql new file mode 100644 index 000000000..1924ccb95 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/14_plus/create.sql @@ -0,0 +1,235 @@ +{% import 'macros/schemas/security.macros' as SECLABEL %} +{% import 'macros/schemas/privilege.macros' as PRIVILEGE %} +{% import 'macros/variable.macros' as VARIABLE %} +{% import 'columns/macros/security.macros' as COLUMN_SECLABEL %} +{% import 'columns/macros/privilege.macros' as COLUMN_PRIVILEGE %} +{% import 'tables/sql/macros/constraints.macro' as CONSTRAINTS %} +{% import 'types/macros/get_full_type_sql_format.macros' as GET_TYPE %} +{#===========================================#} +{#====== MAIN TABLE TEMPLATE STARTS HERE ======#} +{#===========================================#} +{# + If user has not provided any details but only name then + add empty bracket with table name +#} +{% set empty_bracket = ""%} +{% if data.coll_inherits|length == 0 and data.columns|length == 0 and not data.typname and not data.like_relation and data.primary_key|length == 0 and data.unique_constraint|length == 0 and data.foreign_key|length == 0 and data.check_constraint|length == 0 and data.exclude_constraint|length == 0 %} +{% set empty_bracket = "\n(\n)"%} +{% endif %} +{% set with_clause = false%} +{% if data.fillfactor or data.parallel_workers or data.toast_tuple_target or (data.autovacuum_custom and data.add_vacuum_settings_in_sql) or data.autovacuum_enabled in ('t', 'f') or (data.toast_autovacuum and data.add_vacuum_settings_in_sql) or data.toast_autovacuum_enabled in ('t', 'f') %} +{% set with_clause = true%} +{% endif %} +CREATE {% if data.relpersistence %}UNLOGGED {% endif %}TABLE{% if add_not_exists_clause %} IF NOT EXISTS{% endif %} {{conn|qtIdent(data.schema, data.name)}}{{empty_bracket}} +{% if data.typname %} + OF {{ data.typname }} +{% endif %} +{% if data.like_relation or data.coll_inherits or data.columns|length > 0 or data.primary_key|length > 0 or data.unique_constraint|length > 0 or data.foreign_key|length > 0 or data.check_constraint|length > 0 or data.exclude_constraint|length > 0 %} +( +{% endif %} +{% if data.like_relation %} + LIKE {{ data.like_relation }}{% if data.like_default_value %} + + INCLUDING DEFAULTS{% endif %}{% if data.like_constraints %} + + INCLUDING CONSTRAINTS{% endif %}{% if data.like_indexes %} + + INCLUDING INDEXES{% endif %}{% if data.like_storage %} + + INCLUDING STORAGE{% endif %}{% if data.like_comments %} + + INCLUDING COMMENTS{% endif %}{% if data.like_compression %} + + INCLUDING COMPRESSION{% endif %}{% if data.like_generated %} + + INCLUDING GENERATED{% endif %}{% if data.like_identity %} + + INCLUDING IDENTITY{% endif %}{% if data.like_statistics %} + + INCLUDING STATISTICS{% endif %}{% if data.columns|length > 0 %}, +{% endif %} + +{% endif %} +{### Add columns ###} +{% if data.columns and data.columns|length > 0 %} +{% for c in data.columns %} +{% if c.name and c.cltype %} + {% if c.inheritedfromtable %}-- Inherited from table {{c.inheritedfromtable}}: {% elif c.inheritedfromtype %}-- Inherited from type {{c.inheritedfromtype}}: {% endif %}{{conn|qtIdent(c.name)}} {% if is_sql %}{{c.displaytypname}}{% else %}{{ GET_TYPE.CREATE_TYPE_SQL(conn, c.cltype, c.attlen, c.attprecision, c.hasSqrBracket) }}{% endif %}{% if c.collspcname %} COLLATE {{c.collspcname}}{% endif %}{% if c.attnotnull %} NOT NULL{% endif %}{% if c.defval is defined and c.defval is not none and c.defval != '' and c.colconstype != 'g' %} DEFAULT {{c.defval}}{% endif %} +{% if c.colconstype == 'i' and c.attidentity and c.attidentity != '' %} +{% if c.attidentity == 'a' %} GENERATED ALWAYS AS IDENTITY{% elif c.attidentity == 'd' %} GENERATED BY DEFAULT AS IDENTITY{% endif %} +{% if c.seqincrement or c.seqcycle or c.seqincrement or c.seqstart or c.seqmin or c.seqmax or c.seqcache %} ( {% endif %} +{% if c.seqcycle is defined and c.seqcycle %} +CYCLE {% endif %}{% if c.seqincrement is defined and c.seqincrement|int(-1) > -1 %} +INCREMENT {{c.seqincrement|int}} {% endif %}{% if c.seqstart is defined and c.seqstart|int(-1) > -1%} +START {{c.seqstart|int}} {% endif %}{% if c.seqmin is defined and c.seqmin|int(-1) > -1%} +MINVALUE {{c.seqmin|int}} {% endif %}{% if c.seqmax is defined and c.seqmax|int(-1) > -1%} +MAXVALUE {{c.seqmax|int}} {% endif %}{% if c.seqcache is defined and c.seqcache|int(-1) > -1%} +CACHE {{c.seqcache|int}} {% endif %} +{% if c.seqincrement or c.seqcycle or c.seqincrement or c.seqstart or c.seqmin or c.seqmax or c.seqcache %}){% endif %} +{% endif %} +{% if c.colconstype == 'g' and c.genexpr and c.genexpr != '' %} GENERATED ALWAYS AS ({{c.genexpr}}) STORED{% endif %} +{% if not loop.last %}, +{% endif %} +{% endif %} +{% endfor %} +{% endif %} +{# Macro to render for constraints #} +{% if data.primary_key|length > 0 %}{% if data.columns|length > 0 %},{% endif %} +{{CONSTRAINTS.PRIMARY_KEY(conn, data.primary_key[0])}}{% endif %}{% if data.unique_constraint|length > 0 %}{% if data.columns|length > 0 or data.primary_key|length > 0 %},{% endif %} +{{CONSTRAINTS.UNIQUE(conn, data.unique_constraint)}}{% endif %}{% if data.foreign_key|length > 0 %}{% if data.columns|length > 0 or data.primary_key|length > 0 or data.unique_constraint|length > 0 %},{% endif %} +{{CONSTRAINTS.FOREIGN_KEY(conn, data.foreign_key)}}{% endif %}{% if data.check_constraint|length > 0 %}{% if data.columns|length > 0 or data.primary_key|length > 0 or data.unique_constraint|length > 0 or data.foreign_key|length > 0 %},{% endif %} +{{CONSTRAINTS.CHECK(conn, data.check_constraint)}}{% endif %}{% if data.exclude_constraint|length > 0 %}{% if data.columns|length > 0 or data.primary_key|length > 0 or data.unique_constraint|length > 0 or data.foreign_key|length > 0 or data.check_constraint|length > 0 %},{% endif %} +{{CONSTRAINTS.EXCLUDE(conn, data.exclude_constraint)}}{% endif %} +{% if data.like_relation or data.coll_inherits or data.columns|length > 0 or data.primary_key|length > 0 or data.unique_constraint|length > 0 or data.foreign_key|length > 0 or data.check_constraint|length > 0 or data.exclude_constraint|length > 0 %} + +){% endif %}{% if data.relkind is defined and data.relkind == 'p' %} PARTITION BY {{ data.partition_scheme }}{% endif %} +{% if not data.coll_inherits and not data.spcname and not with_clause %};{% endif %} + +{### If we are inheriting it from another table(s) ###} +{% if data.coll_inherits %} + INHERITS ({% for val in data.coll_inherits %}{% if loop.index != 1 %}, {% endif %}{{val}}{% endfor %}){% if not data.spcname and not with_clause %};{% endif %} +{% endif %} + +{% if with_clause %} +{% set ns = namespace(add_comma=false) %} +WITH ( +{% if data.fillfactor %}{% set ns.add_comma = true%} + FILLFACTOR = {{ data.fillfactor }}{% endif %}{% if data.parallel_workers %} +{% if ns.add_comma %}, +{% endif %} + parallel_workers = {{ data.parallel_workers }}{% set ns.add_comma = true%}{% endif %}{% if data.toast_tuple_target %} +{% if ns.add_comma %}, +{% endif %} + toast_tuple_target = {{ data.toast_tuple_target }}{% set ns.add_comma = true%}{% endif %}{% if data.autovacuum_enabled in ('t', 'f') %} +{% if ns.add_comma %}, +{% endif %} + autovacuum_enabled = {% if data.autovacuum_enabled == 't' %}TRUE{% else %}FALSE{% endif %}{% set ns.add_comma = true%}{% endif %}{% if data.toast_autovacuum_enabled in ('t', 'f') %} +{% if ns.add_comma %}, +{% endif %} + toast.autovacuum_enabled = {% if data.toast_autovacuum_enabled == 't' %}TRUE{% else %}FALSE{% endif %}{% set ns.add_comma = true%}{% endif %}{% if data.autovacuum_custom %} +{% for opt in data.vacuum_table %}{% if opt.name and opt.value is defined %} +{% if ns.add_comma %}, +{% endif %} + {{opt.name}} = {{opt.value}}{% set ns.add_comma = true%}{% endif %} +{% endfor %}{% endif %}{% if data.toast_autovacuum %} +{% for opt in data.vacuum_toast %}{% if opt.name and opt.value is defined %} +{% if ns.add_comma %}, +{% endif %} + toast.{{opt.name}} = {{opt.value}}{% set ns.add_comma = true%}{% endif %} +{% endfor %}{% endif %} + +{% if data.spcname %}){% else %});{% endif %} + +{% endif %} +{### SQL for Tablespace ###} +{% if data.spcname %} +TABLESPACE {{ conn|qtIdent(data.spcname) }}; +{% endif %} +{### Alter SQL for Owner ###} +{% if data.relowner %} + +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.name)}} + OWNER to {{conn|qtIdent(data.relowner)}}; +{% endif %} + +{#####################################################} +{## Enable Row Level Security Policy on table ##} +{#####################################################} +{% if data.rlspolicy %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.name)}} + ENABLE ROW LEVEL SECURITY; +{% endif %} + +{#####################################################} +{## Force Enable Row Level Security Policy on table ##} +{#####################################################} +{% if data.forcerlspolicy %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.name)}} + FORCE ROW LEVEL SECURITY; +{% endif %} + +{### Security Labels on Table ###} +{% if data.seclabels and data.seclabels|length > 0 %} + +{% for r in data.seclabels %} +{{ SECLABEL.SET(conn, 'TABLE', data.name, r.provider, r.label, data.schema) }} +{% endfor %} +{% endif %} +{### ACL on Table ###} +{% if data.revoke_all %} +{% for priv in data.revoke_all %} +{{ PRIVILEGE.UNSETALL(conn, "TABLE", priv, data.name, data.schema)}} +{% endfor %} +{% endif %} +{% if data.relacl %} + +{% for priv in data.relacl %} +{{ PRIVILEGE.SET(conn, 'TABLE', priv.grantee, data.name, priv.without_grant, priv.with_grant, data.schema) }} +{% endfor %} +{% endif %} +{### SQL for COMMENT ###} +{% if data.description %} +COMMENT ON TABLE {{conn|qtIdent(data.schema, data.name)}} + IS {{data.description|qtLiteral(conn)}}; +{% endif %} +{#===========================================#} +{#====== MAIN TABLE TEMPLATE ENDS HERE ======#} +{#===========================================#} +{#===========================================#} +{# COLUMN SPECIFIC TEMPLATES STARTS HERE #} +{#===========================================#} +{% if data.columns and data.columns|length > 0 %} +{% for c in data.columns %} +{% if c.description %} + +COMMENT ON COLUMN {{conn|qtIdent(data.schema, data.name, c.name)}} + IS {{c.description|qtLiteral(conn)}}; +{% endif %} +{### Add variables to column ###} +{% if c.attoptions and c.attoptions|length > 0 %} + +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.name)}} + {{ VARIABLE.SET(conn, 'COLUMN', c.name, c.attoptions) }} + +{% endif %} +{### Alter column statistics value ###} +{% if c.attstattarget is defined and c.attstattarget > -1 %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.name)}} + ALTER COLUMN {{conn|qtTypeIdent(c.name)}} SET STATISTICS {{c.attstattarget}}; + +{% endif %} +{### Alter column storage value ###} +{% if c.attstorage is defined and c.attstorage != c.defaultstorage %} +ALTER TABLE IF EXISTS {{conn|qtIdent(data.schema, data.name)}} + ALTER COLUMN {{conn|qtTypeIdent(c.name)}} SET STORAGE {%if c.attstorage == 'p' %} +PLAIN{% elif c.attstorage == 'm'%}MAIN{% elif c.attstorage == 'e'%} +EXTERNAL{% elif c.attstorage == 'x'%}EXTENDED{% endif %}; + +{% endif %} +{### ACL ###} +{% if c.attacl and c.attacl|length > 0 %} + +{% for priv in c.attacl %} +{{ COLUMN_PRIVILEGE.APPLY(conn, data.schema, data.name, c.name, priv.grantee, priv.without_grant, priv.with_grant) }} +{% endfor %} +{% endif %} +{### Security Lables ###} +{% if c.seclabels and c.seclabels|length > 0 %} + +{% for r in c.seclabels %} +{{ COLUMN_SECLABEL.APPLY(conn, 'COLUMN',data.schema, data.name, c.name, r.provider, r.label) }} +{% endfor %} +{% endif %} +{% endfor %} +{% endif %} +{#===========================================#} +{# COLUMN SPECIFIC TEMPLATES ENDS HERE #} +{#===========================================#} +{#======================================#} +{# CONSTRAINTS SPECIFIC TEMPLATES #} +{#======================================#} +{{CONSTRAINTS.CONSTRAINT_COMMENTS(conn, data.schema, data.name, data.primary_key)}} +{{CONSTRAINTS.CONSTRAINT_COMMENTS(conn, data.schema, data.name, data.unique_constraint)}} +{{CONSTRAINTS.CONSTRAINT_COMMENTS(conn, data.schema, data.name, data.foreign_key)}} +{{CONSTRAINTS.CONSTRAINT_COMMENTS(conn, data.schema, data.name, data.check_constraint)}} +{{CONSTRAINTS.CONSTRAINT_COMMENTS(conn, data.schema, data.name, data.exclude_constraint)}} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/default/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/default/create.sql index 09957feb5..3e5763781 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/default/create.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/tables/sql/default/create.sql @@ -34,7 +34,11 @@ CREATE {% if data.relpersistence %}UNLOGGED {% endif %}TABLE{% if add_not_exists INCLUDING STORAGE{% endif %}{% if data.like_comments %} - INCLUDING COMMENTS{% endif %}{% if data.columns|length > 0 %}, + INCLUDING COMMENTS{% endif %}{% if data.like_identity %} + + INCLUDING IDENTITY{% endif %}{% if data.like_statistics %} + + INCLUDING STATISTICS{% endif %}{% if data.columns|length > 0 %}, {% endif %} {% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/11_plus/create_partition_table_with_collate.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/11_plus/create_partition_table_with_collate.sql index 08b348515..413d6bc2e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/11_plus/create_partition_table_with_collate.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/11_plus/create_partition_table_with_collate.sql @@ -22,7 +22,8 @@ COMMENT ON TABLE public."partition_table_with_collate_$%{}[]()&*^!@""'`\/#" -- Partitions SQL CREATE TABLE public.cust_arr_small PARTITION OF public."partition_table_with_collate_$%{}[]()&*^!@""'`\/#" - FOR VALUES FROM ('20') TO ('25'); + FOR VALUES FROM ('20') TO ('25') +TABLESPACE pg_default; ALTER TABLE IF EXISTS public.cust_arr_small OWNER to postgres; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/11_plus/create_table_with_hash_partition.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/11_plus/create_table_with_hash_partition.sql index 59405123b..0db6496d2 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/11_plus/create_table_with_hash_partition.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/11_plus/create_table_with_hash_partition.sql @@ -22,7 +22,8 @@ COMMENT ON TABLE public."table_with_hash_patition_$%{}[]()&*^!@\""'`\\/#" -- Partitions SQL CREATE TABLE public.cust_part11 PARTITION OF public."table_with_hash_patition_$%{}[]()&*^!@\""'`\\/#" - FOR VALUES WITH (modulus 2, remainder 1); + FOR VALUES WITH (modulus 2, remainder 1) +TABLESPACE pg_default; ALTER TABLE IF EXISTS public.cust_part11 OWNER to postgres; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/11_plus/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/11_plus/test.json index d8fb1e51d..8d9b58cf8 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/11_plus/test.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/11_plus/test.json @@ -171,7 +171,9 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false }, "store_object_id": true, "expected_sql_file": "create_table_without_primary_key.sql", @@ -397,7 +399,9 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false }, "store_object_id": true, "expected_sql_file": "create_table_with_pk.sql", @@ -650,11 +654,1463 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false }, "store_object_id": true, "expected_sql_file": "create_table_with_pk_chk.sql", "expected_msql_file": "create_table_with_pk_chk_msql.sql" + },{ + "type": "alter", + "name": "Alter Table add unique constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "unique_constraint": { + "added": [ + { + "name": "unique", + "fillfactor": "13", + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ] + } + }, + "expected_sql_file": "alter_table_add_unique_const.sql", + "expected_msql_file": "alter_table_add_unique_const_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table delete constraints", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "check_constraint": { + "deleted": [ + { + "name": "chk_const", + "consrc": "col2 <> NULL::bpchar", + "connoinherit": false, + "convalidated": false, + "relname": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "nspname": "public", + "comment": "chk const comment", + "conislocal": true + } + ] + }, + "unique_constraint": { + "deleted": [ + { + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"\"'`\\\\/#" + } + ], + "name": "unique", + "comment": null, + "spcname": "pg_default", + "fillfactor": "13", + "condeferrable": false, + "condeferred": false, + "include": [], + "col_count": 1, + "conislocal": true + } + ] + } + }, + "expected_sql_file": "alter_table_delete_constraints.sql", + "expected_msql_file": "alter_table_delete_constraints_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with pk & chk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table for FK reference", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "fk_reference_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "bigint" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Table with fk constraint", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col3", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [ + { + "name": "fk_test", + "comment": "fk comment", + "condeferrable": true, + "confmatchtype": true, + "columns": [ + { + "local_column": "col1", + "references": "", + "referenced": "id" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_fk.sql", + "expected_msql_file": "create_table_with_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add one more fk", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "foreign_key": { + "added": [ + { + "name": "fk2", + "columns": [ + { + "local_column": "col2", + "references": "", + "referenced": "name" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_another_fk.sql", + "expected_msql_file": "alter_table_add_another_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add exclude constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "exclude_constraint": { + "added": [ + { + "name": "ex_constr", + "amname": "btree", + "columns": [ + { + "column": "col1", + "is_exp": false, + "order": false, + "nulls_order": false, + "operator": "=", + "is_sort_nulls_applicable": false + } + ], + "include": [] + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_exclude_constraint.sql", + "expected_msql_file": "alter_table_add_exclude_constraint_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with custom auto-vacuum", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "custom auto vacuum", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "t", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "character varying[]", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 10, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "date", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor", + "value": 0.2 + }, + { + "name": "autovacuum_analyze_threshold", + "value": 55 + }, + { + "name": "autovacuum_freeze_max_age", + "value": 20000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 25 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 10 + }, + { + "name": "autovacuum_vacuum_scale_factor", + "value": 0.3 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 60 + }, + { + "name": "autovacuum_freeze_min_age", + "value": 500000 + }, + { + "name": "autovacuum_freeze_table_age", + "value": 1300000 + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "autovacuum_custom": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_custom_autovacuum.sql", + "expected_msql_file": "create_table_with_custom_autovacuum_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add toast table", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "autovacuum_enabled": "x", + "toast_autovacuum": true, + "toast_autovacuum_enabled": "f", + "vacuum_table": { + "changed": [ + { + "name": "autovacuum_analyze_threshold", + "value": 60 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 100 + } + ] + }, + "vacuum_toast": { + "changed": [ + { + "name": "autovacuum_freeze_max_age", + "value": 2000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 50 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 13 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 70 + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_with_toast_table.sql", + "expected_msql_file": "alter_table_with_toast_table_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with advanced options", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "relhasoids": true, + "description": "test comment", + "relpersistence": true, + "fillfactor": "50", + "parallel_workers": "", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "double precision", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "numrange", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": true, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "rlspolicy": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_advanced_options.sql", + "expected_msql_file": "create_table_with_advanced_options_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table update grants", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "rlspolicy": false, + "forcerlspolicy": false, + "relacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_update_grants.sql", + "expected_msql_file": "alter_table_update_grants_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table for like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "like_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "text" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Table using like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test ", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": true, + "like_constraints": true, + "like_indexes": true, + "like_storage": true, + "like_comments": true, + "like_identity": true, + "like_statistics": true, + "like_relation": "public.like_tbl" + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_lik_tbl.sql", + "expected_msql_file": "create_table_with_lik_tbl_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with list partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_active", + "values_in": "'ACTIVE'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "list", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_partition.sql", + "expected_msql_file": "create_table_with_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with range partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_range_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small PARTITION", + "values_from": "20", + "values_to": "25", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "arr" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_range_partition.sql", + "expected_msql_file": "create_table_with_range_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with hash partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_hash_patition_$%{}[]()&*^!@\\\"'`\\\\/#", + "relowner": "postgres", + "relacl": [], + "description": "hash partition", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_part11", + "values_modulus": "2", + "values_remainder": "1", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "hash", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "name", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "id" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_hash_partition.sql", + "expected_msql_file": "create_table_with_hash_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with range partition with collate and opclass", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "partition_table_with_collate_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small", + "values_from": "'20'", + "values_to": "'25'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status", + "collationame": "\"C\"", + "op_class": "text_pattern_ops" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_partition_table_with_collate.sql", + "expected_msql_file": "create_partition_table_with_collate_msql.sql" } ] } diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/alter_table_add_exclude_constraint.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/alter_table_add_exclude_constraint.sql index 9d60a82b2..f25f7444f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/alter_table_add_exclude_constraint.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/alter_table_add_exclude_constraint.sql @@ -17,8 +17,8 @@ CREATE TABLE IF NOT EXISTS public."table_with_fk_constraints$%{}[]()&*^!@""'`\/# ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE, - CONSTRAINT ex_constr EXCLUDE USING gist ( - col1 WITH <>) + CONSTRAINT ex_constr EXCLUDE USING btree ( + col1 WITH =) ) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/alter_table_add_exclude_constraint_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/alter_table_add_exclude_constraint_msql.sql index a70e2599f..87ec46022 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/alter_table_add_exclude_constraint_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/alter_table_add_exclude_constraint_msql.sql @@ -1,3 +1,3 @@ ALTER TABLE IF EXISTS public."table_with_fk_constraints$%{}[]()&*^!@""'`\/#" - ADD CONSTRAINT ex_constr EXCLUDE USING gist ( - col1 WITH <>); + ADD CONSTRAINT ex_constr EXCLUDE USING btree ( + col1 WITH =); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/alter_table_update_grants.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/alter_table_update_grants.sql index b421c5b80..d3eb152c9 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/alter_table_update_grants.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/alter_table_update_grants.sql @@ -18,9 +18,9 @@ ALTER TABLE IF EXISTS public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" REVOKE ALL ON TABLE public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" FROM PUBLIC; -GRANT ALL ON TABLE public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" TO postgres; - GRANT SELECT ON TABLE public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" TO PUBLIC; +GRANT ALL ON TABLE public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" TO postgres; + COMMENT ON TABLE public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" IS 'test comment'; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_partition_table_with_collate.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_partition_table_with_collate.sql index dfadf3bb3..4c61edc1f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_partition_table_with_collate.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_partition_table_with_collate.sql @@ -18,7 +18,8 @@ COMMENT ON TABLE public."partition_table_with_collate_$%{}[]()&*^!@""'`\/#" -- Partitions SQL CREATE TABLE public.cust_arr_small PARTITION OF public."partition_table_with_collate_$%{}[]()&*^!@""'`\/#" - FOR VALUES FROM ('20') TO ('25'); + FOR VALUES FROM ('20') TO ('25') +TABLESPACE pg_default; ALTER TABLE IF EXISTS public.cust_arr_small OWNER to postgres; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_hash_partition.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_hash_partition.sql index 8e83b8604..eb72d2770 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_hash_partition.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_hash_partition.sql @@ -18,7 +18,8 @@ COMMENT ON TABLE public."table_with_hash_patition_$%{}[]()&*^!@\""'`\\/#" -- Partitions SQL CREATE TABLE public.cust_part11 PARTITION OF public."table_with_hash_patition_$%{}[]()&*^!@\""'`\\/#" - FOR VALUES WITH (modulus 2, remainder 1); + FOR VALUES WITH (modulus 2, remainder 1) +TABLESPACE pg_default; ALTER TABLE IF EXISTS public.cust_part11 OWNER to postgres; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_lik_tbl_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_lik_tbl_msql.sql index 2218a1684..19ac43efd 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_lik_tbl_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_lik_tbl_msql.sql @@ -6,6 +6,9 @@ CREATE TABLE public."table_like_tbl$%{}[]()&*^!@""'`\/#" INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS + INCLUDING GENERATED + INCLUDING IDENTITY + INCLUDING STATISTICS ); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_partition.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_partition.sql index 06710591e..9e88970ec 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_partition.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_partition.sql @@ -18,7 +18,8 @@ COMMENT ON TABLE public."table_with_patition_$%{}[]()&*^!@""'`\/#" -- Partitions SQL CREATE TABLE public.cust_active PARTITION OF public."table_with_patition_$%{}[]()&*^!@""'`\/#" - FOR VALUES IN ('ACTIVE'); + FOR VALUES IN ('ACTIVE') +TABLESPACE pg_default; ALTER TABLE IF EXISTS public.cust_active OWNER to postgres; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_range_partition.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_range_partition.sql index 3aa2d990c..b8adf5aad 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_range_partition.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/create_table_with_range_partition.sql @@ -15,7 +15,8 @@ ALTER TABLE IF EXISTS public."table_with_range_patition_$%{}[]()&*^!@""'`\/#" -- Partitions SQL CREATE TABLE public."cust_arr_small PARTITION" PARTITION OF public."table_with_range_patition_$%{}[]()&*^!@""'`\/#" - FOR VALUES FROM ('20') TO ('25'); + FOR VALUES FROM ('20') TO ('25') +TABLESPACE pg_default; ALTER TABLE IF EXISTS public."cust_arr_small PARTITION" OWNER to postgres; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/test.json index d8fb1e51d..cb606e371 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/test.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/12_plus/test.json @@ -171,7 +171,10 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false }, "store_object_id": true, "expected_sql_file": "create_table_without_primary_key.sql", @@ -397,7 +400,10 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false }, "store_object_id": true, "expected_sql_file": "create_table_with_pk.sql", @@ -650,11 +656,1464 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false }, "store_object_id": true, "expected_sql_file": "create_table_with_pk_chk.sql", "expected_msql_file": "create_table_with_pk_chk_msql.sql" + }, { + "type": "alter", + "name": "Alter Table add unique constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "unique_constraint": { + "added": [ + { + "name": "unique", + "fillfactor": "13", + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ] + } + }, + "expected_sql_file": "alter_table_add_unique_const.sql", + "expected_msql_file": "alter_table_add_unique_const_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table delete constraints", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "check_constraint": { + "deleted": [ + { + "name": "chk_const", + "consrc": "col2 <> NULL::bpchar", + "connoinherit": false, + "convalidated": false, + "relname": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "nspname": "public", + "comment": "chk const comment", + "conislocal": true + } + ] + }, + "unique_constraint": { + "deleted": [ + { + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"\"'`\\\\/#" + } + ], + "name": "unique", + "comment": null, + "spcname": "pg_default", + "fillfactor": "13", + "condeferrable": false, + "condeferred": false, + "include": [], + "col_count": 1, + "conislocal": true + } + ] + } + }, + "expected_sql_file": "alter_table_delete_constraints.sql", + "expected_msql_file": "alter_table_delete_constraints_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with pk & chk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table for FK reference", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "fk_reference_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "bigint" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Table with fk constraint", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col3", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [ + { + "name": "fk_test", + "comment": "fk comment", + "condeferrable": true, + "confmatchtype": true, + "columns": [ + { + "local_column": "col1", + "references": "", + "referenced": "id" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_fk.sql", + "expected_msql_file": "create_table_with_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add one more fk", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "foreign_key": { + "added": [ + { + "name": "fk2", + "columns": [ + { + "local_column": "col2", + "references": "", + "referenced": "name" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_another_fk.sql", + "expected_msql_file": "alter_table_add_another_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add exclude constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "exclude_constraint": { + "added": [ + { + "name": "ex_constr", + "amname": "btree", + "columns": [ + { + "column": "col1", + "is_exp": false, + "order": false, + "nulls_order": false, + "operator": "=", + "is_sort_nulls_applicable": false + } + ], + "include": [] + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_exclude_constraint.sql", + "expected_msql_file": "alter_table_add_exclude_constraint_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with custom auto-vacuum", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "custom auto vacuum", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "t", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "character varying[]", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 10, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "date", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor", + "value": 0.2 + }, + { + "name": "autovacuum_analyze_threshold", + "value": 55 + }, + { + "name": "autovacuum_freeze_max_age", + "value": 20000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 25 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 10 + }, + { + "name": "autovacuum_vacuum_scale_factor", + "value": 0.3 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 60 + }, + { + "name": "autovacuum_freeze_min_age", + "value": 500000 + }, + { + "name": "autovacuum_freeze_table_age", + "value": 1300000 + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "autovacuum_custom": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_custom_autovacuum.sql", + "expected_msql_file": "create_table_with_custom_autovacuum_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add toast table", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "autovacuum_enabled": "x", + "toast_autovacuum": true, + "toast_autovacuum_enabled": "f", + "vacuum_table": { + "changed": [ + { + "name": "autovacuum_analyze_threshold", + "value": 60 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 100 + } + ] + }, + "vacuum_toast": { + "changed": [ + { + "name": "autovacuum_freeze_max_age", + "value": 2000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 50 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 13 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 70 + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_with_toast_table.sql", + "expected_msql_file": "alter_table_with_toast_table_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with advanced options", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "relhasoids": true, + "description": "test comment", + "relpersistence": true, + "fillfactor": "50", + "parallel_workers": "", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "double precision", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "numrange", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": true, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "rlspolicy": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_advanced_options.sql", + "expected_msql_file": "create_table_with_advanced_options_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table update grants", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "rlspolicy": false, + "forcerlspolicy": false, + "relacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_update_grants.sql", + "expected_msql_file": "alter_table_update_grants_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#" + } + },{ + "type": "create", + "name": "Create Table for like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "like_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "text" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + },{ + "type": "create", + "name": "Create Table using like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test ", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": true, + "like_constraints": true, + "like_indexes": true, + "like_storage": true, + "like_comments": true, + "like_identity": true, + "like_statistics": true, + "like_generated": true, + "like_relation": "public.like_tbl" + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_lik_tbl.sql", + "expected_msql_file": "create_table_with_lik_tbl_msql.sql" + },{ + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#" + } + },{ + "type": "create", + "name": "Create Table with list partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_active", + "values_in": "'ACTIVE'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "list", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_partition.sql", + "expected_msql_file": "create_table_with_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with range partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_range_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small PARTITION", + "values_from": "20", + "values_to": "25", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "arr" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_range_partition.sql", + "expected_msql_file": "create_table_with_range_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with hash partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_hash_patition_$%{}[]()&*^!@\\\"'`\\\\/#", + "relowner": "postgres", + "relacl": [], + "description": "hash partition", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_part11", + "values_modulus": "2", + "values_remainder": "1", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "hash", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "name", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "id" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_hash_partition.sql", + "expected_msql_file": "create_table_with_hash_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with range partition with collate and opclass", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "partition_table_with_collate_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small", + "values_from": "'20'", + "values_to": "'25'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status", + "collationame": "\"C\"", + "op_class": "text_pattern_ops" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_partition_table_with_collate.sql", + "expected_msql_file": "create_partition_table_with_collate_msql.sql" } ] } diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/14_plus/create_table_with_lik_tbl_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/14_plus/create_table_with_lik_tbl_msql.sql new file mode 100644 index 000000000..5c14ad797 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/14_plus/create_table_with_lik_tbl_msql.sql @@ -0,0 +1,20 @@ +CREATE TABLE public."table_like_tbl$%{}[]()&*^!@""'`\/#" +( + LIKE public.like_tbl + INCLUDING DEFAULTS + INCLUDING CONSTRAINTS + INCLUDING INDEXES + INCLUDING STORAGE + INCLUDING COMMENTS + INCLUDING COMPRESSION + INCLUDING GENERATED + INCLUDING IDENTITY + INCLUDING STATISTICS + +); + +ALTER TABLE IF EXISTS public."table_like_tbl$%{}[]()&*^!@""'`\/#" + OWNER to postgres; + +COMMENT ON TABLE public."table_like_tbl$%{}[]()&*^!@""'`\/#" + IS 'test '; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/14_plus/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/14_plus/test.json new file mode 100644 index 000000000..f413b3c9a --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/14_plus/test.json @@ -0,0 +1,2126 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create Table without primary key", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col3", + "cltype": "boolean", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col4", + "cltype": "character varying", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 30, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col5", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": 20, + "attprecision": 10, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col6", + "cltype": "timestamp with time zone", + "attacl": [], + "min_val_attlen": 0, + "max_val_attlen": 6, + "is_primary_key": false, + "attnotnull": false, + "attlen": 5, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_without_primary_key.sql", + "expected_msql_file": "create_table_without_primary_key_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table to change column data types", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "cltype": "bigint" + }, + { + "attnum": 2, + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "cltype": "character varying" + }, + { + "attnum": 6, + "attlen": null, + "cltype": "time without time zone" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_change_col_data_type.sql", + "expected_msql_file": "alter_table_change_col_data_type_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add pk", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "attnotnull": true, + "is_primary_key": true + } + ] + }, + "primary_key": { + "added": [ + { + "columns": [ + { + "column": "col1" + } + ], + "include": [] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_pk_not_null_constraint.sql", + "expected_msql_file": "alter_table_add_pk_not_null_constraint_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add null constraint, rename column", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "name": "col1_rename", + "is_primary_key": false + }, + { + "attnum": 4, + "attnotnull": true + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_null_constraint_rename_col.sql", + "expected_msql_file": "alter_table_add_null_constraint_rename_col_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table add pk", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with primary key", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [ + { + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "integer", + "attacl": [], + "is_primary_key": true, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "json", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_pk.sql", + "expected_msql_file": "create_table_with_pk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add columns", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "columns": { + "added": [ + { + "name": "col3_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": 10, + "attprecision": 5, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col4_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_cols.sql", + "expected_msql_file": "alter_table_add_cols_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table delete columns", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "columns": { + "deleted": [ + { + "attoptions": [], + "attacl": [], + "seclabels": [], + "name": "col2_$%{}[]()&*^!@\\\"'`\\\\/#", + "atttypid": 114, + "attnum": 2, + "cltype": "json", + "collspcname": "", + "description": null, + "edit_types": [ + "json", + "jsonb" + ], + "is_primary_key": false, + "attstattarget": -1, + "attnotnull": true, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attndims": 0, + "atttypmod": -1, + "attstorage": "x", + "defval": null, + "typname": "json", + "displaytypname": "json", + "elemoid": 114, + "typnspname": "pg_catalog", + "defaultstorage": "x", + "indkey": "1", + "isdup": false, + "is_fk": false, + "is_sys_column": false, + "relname": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "is_view_only": false, + "is_pk": false, + "old_attidentity": "a" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_delete_cols.sql", + "expected_msql_file": "alter_table_delete_cols_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table delete columns", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with pk & check constraint", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "create table comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [ + { + "name": "custom_pk", + "comment": "custom pk created", + "fillfactor": "11", + "condeferrable": true, + "condeferred": true, + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "time with time zone", + "attacl": [], + "min_val_attlen": 0, + "max_val_attlen": 6, + "is_primary_key": false, + "attnotnull": false, + "attlen": 5, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "character", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 12, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [ + { + "name": "chk_const", + "consrc": "col2 != null", + "convalidated": false, + "comment": "chk const comment" + } + ], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_pk_chk.sql", + "expected_msql_file": "create_table_with_pk_chk_msql.sql" + }, { + "type": "alter", + "name": "Alter Table add unique constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "unique_constraint": { + "added": [ + { + "name": "unique", + "fillfactor": "13", + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ] + } + }, + "expected_sql_file": "alter_table_add_unique_const.sql", + "expected_msql_file": "alter_table_add_unique_const_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table delete constraints", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "check_constraint": { + "deleted": [ + { + "name": "chk_const", + "consrc": "col2 <> NULL::bpchar", + "connoinherit": false, + "convalidated": false, + "relname": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "nspname": "public", + "comment": "chk const comment", + "conislocal": true + } + ] + }, + "unique_constraint": { + "deleted": [ + { + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"\"'`\\\\/#" + } + ], + "name": "unique", + "comment": null, + "spcname": "pg_default", + "fillfactor": "13", + "condeferrable": false, + "condeferred": false, + "include": [], + "col_count": 1, + "conislocal": true + } + ] + } + }, + "expected_sql_file": "alter_table_delete_constraints.sql", + "expected_msql_file": "alter_table_delete_constraints_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with pk & chk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table for FK reference", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "fk_reference_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "bigint" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Table with fk constraint", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col3", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [ + { + "name": "fk_test", + "comment": "fk comment", + "condeferrable": true, + "confmatchtype": true, + "columns": [ + { + "local_column": "col1", + "references": "", + "referenced": "id" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_fk.sql", + "expected_msql_file": "create_table_with_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add one more fk", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "foreign_key": { + "added": [ + { + "name": "fk2", + "columns": [ + { + "local_column": "col2", + "references": "", + "referenced": "name" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_another_fk.sql", + "expected_msql_file": "alter_table_add_another_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add exclude constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "exclude_constraint": { + "added": [ + { + "name": "ex_constr", + "amname": "btree", + "columns": [ + { + "column": "col1", + "is_exp": false, + "order": false, + "nulls_order": false, + "operator": "=", + "is_sort_nulls_applicable": false + } + ], + "include": [] + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_exclude_constraint.sql", + "expected_msql_file": "alter_table_add_exclude_constraint_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with custom auto-vacuum", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "custom auto vacuum", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "t", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "character varying[]", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 10, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "date", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor", + "value": 0.2 + }, + { + "name": "autovacuum_analyze_threshold", + "value": 55 + }, + { + "name": "autovacuum_freeze_max_age", + "value": 20000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 25 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 10 + }, + { + "name": "autovacuum_vacuum_scale_factor", + "value": 0.3 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 60 + }, + { + "name": "autovacuum_freeze_min_age", + "value": 500000 + }, + { + "name": "autovacuum_freeze_table_age", + "value": 1300000 + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "autovacuum_custom": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_custom_autovacuum.sql", + "expected_msql_file": "create_table_with_custom_autovacuum_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add toast table", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "autovacuum_enabled": "x", + "toast_autovacuum": true, + "toast_autovacuum_enabled": "f", + "vacuum_table": { + "changed": [ + { + "name": "autovacuum_analyze_threshold", + "value": 60 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 100 + } + ] + }, + "vacuum_toast": { + "changed": [ + { + "name": "autovacuum_freeze_max_age", + "value": 2000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 50 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 13 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 70 + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_with_toast_table.sql", + "expected_msql_file": "alter_table_with_toast_table_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with advanced options", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "relhasoids": true, + "description": "test comment", + "relpersistence": true, + "fillfactor": "50", + "parallel_workers": "", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "double precision", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "numrange", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": true, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "rlspolicy": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_advanced_options.sql", + "expected_msql_file": "create_table_with_advanced_options_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table update grants", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "rlspolicy": false, + "forcerlspolicy": false, + "relacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_update_grants.sql", + "expected_msql_file": "alter_table_update_grants_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#" + } + },{ + "type": "create", + "name": "Create Table for like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "like_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "text" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + },{ + "type": "create", + "name": "Create Table using like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "test ", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": true, + "like_constraints": true, + "like_indexes": true, + "like_storage": true, + "like_comments": true, + "like_identity": true, + "like_statistics": true, + "like_generated": true, + "like_compression": true, + "like_relation": "public.like_tbl" + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_lik_tbl.sql", + "expected_msql_file": "create_table_with_lik_tbl_msql.sql" + },{ + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#" + } + },{ + "type": "create", + "name": "Create Table with list partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_active", + "values_in": "'ACTIVE'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "list", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_partition.sql", + "expected_msql_file": "create_table_with_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with range partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_range_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small PARTITION", + "values_from": "20", + "values_to": "25", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "arr" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_range_partition.sql", + "expected_msql_file": "create_table_with_range_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with hash partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_hash_patition_$%{}[]()&*^!@\\\"'`\\\\/#", + "relowner": "postgres", + "relacl": [], + "description": "hash partition", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_part11", + "values_modulus": "2", + "values_remainder": "1", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "hash", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "name", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "id" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_hash_partition.sql", + "expected_msql_file": "create_table_with_hash_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with range partition with collate and opclass", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "partition_table_with_collate_$%{}[]()&*^!@\"'`\\/#", + "relowner": "postgres", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small", + "values_from": "'20'", + "values_to": "'25'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status", + "collationame": "\"C\"", + "op_class": "text_pattern_ops" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_partition_table_with_collate.sql", + "expected_msql_file": "create_partition_table_with_collate_msql.sql" + } + ] +} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/alter_table_add_exclude_constraint.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/alter_table_add_exclude_constraint.sql index 0c37babc9..b60897b3f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/alter_table_add_exclude_constraint.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/alter_table_add_exclude_constraint.sql @@ -17,8 +17,8 @@ CREATE TABLE IF NOT EXISTS public."table_with_fk_constraints$%{}[]()&*^!@""'`\/# ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE, - CONSTRAINT ex_constr EXCLUDE USING gist ( - col1 WITH <>) + CONSTRAINT ex_constr EXCLUDE USING btree ( + col1 WITH =) ) WITH ( diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/alter_table_add_exclude_constraint_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/alter_table_add_exclude_constraint_msql.sql index a70e2599f..87ec46022 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/alter_table_add_exclude_constraint_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/alter_table_add_exclude_constraint_msql.sql @@ -1,3 +1,3 @@ ALTER TABLE IF EXISTS public."table_with_fk_constraints$%{}[]()&*^!@""'`\/#" - ADD CONSTRAINT ex_constr EXCLUDE USING gist ( - col1 WITH <>); + ADD CONSTRAINT ex_constr EXCLUDE USING btree ( + col1 WITH =); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/alter_table_update_grants.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/alter_table_update_grants.sql index a415a72a0..9adc732bb 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/alter_table_update_grants.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/alter_table_update_grants.sql @@ -16,6 +16,8 @@ TABLESPACE pg_default; ALTER TABLE IF EXISTS public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" OWNER to postgres; +REVOKE ALL ON TABLE public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" FROM PUBLIC; + GRANT SELECT ON TABLE public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" TO PUBLIC; GRANT ALL ON TABLE public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" TO postgres; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/create_table_with_lik_tbl_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/create_table_with_lik_tbl_msql.sql index 7bac199e7..cf44cf35b 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/create_table_with_lik_tbl_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/create_table_with_lik_tbl_msql.sql @@ -6,6 +6,8 @@ CREATE TABLE public."table_like_tbl$%{}[]()&*^!@""'`\/#" INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS + INCLUDING IDENTITY + INCLUDING STATISTICS ) WITH ( diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/test.json index e9020c2f8..a520b6575 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/test.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/pg/default/test.json @@ -171,7 +171,9 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false }, "store_object_id": true, "expected_sql_file": "create_table_without_primary_key.sql", @@ -397,7 +399,9 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false }, "store_object_id": true, "expected_sql_file": "create_table_with_pk.sql", @@ -650,7 +654,9 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false }, "store_object_id": true, "expected_sql_file": "create_table_with_pk_chk.sql", @@ -923,7 +929,9 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false }, "store_object_id": true, "preprocess_data": true, @@ -974,14 +982,14 @@ "added": [ { "name": "ex_constr", - "amname": "gist", + "amname": "btree", "columns": [ { "column": "col1", "is_exp": false, "order": false, "nulls_order": false, - "operator": "<>", + "operator": "=", "is_sort_nulls_applicable": false } ], @@ -1126,6 +1134,8 @@ "like_indexes": false, "like_storage": false, "like_comments": false, + "like_identity": false, + "like_statistics": false, "autovacuum_custom": true }, "store_object_id": true, @@ -1304,6 +1314,8 @@ "like_indexes": false, "like_storage": false, "like_comments": false, + "like_identity": false, + "like_statistics": false, "rlspolicy": true }, "store_object_id": true, @@ -1478,6 +1490,8 @@ "like_indexes": true, "like_storage": true, "like_comments": true, + "like_identity": true, + "like_statistics": true, "like_relation": "public.like_tbl" }, "store_object_id": true, @@ -1636,6 +1650,8 @@ "like_indexes": false, "like_storage": false, "like_comments": false, + "like_identity": false, + "like_statistics": false, "autovacuum_custom": false }, "store_object_id": true, @@ -1785,6 +1801,8 @@ "like_indexes": false, "like_storage": false, "like_comments": false, + "like_identity": false, + "like_statistics": false, "autovacuum_custom": false }, "store_object_id": true, @@ -1937,6 +1955,8 @@ "like_indexes": false, "like_storage": false, "like_comments": false, + "like_identity": false, + "like_statistics": false, "autovacuum_custom": false }, "store_object_id": true, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/11_plus/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/11_plus/test.json index d598b3e32..328234a51 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/11_plus/test.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/11_plus/test.json @@ -1,5 +1,520 @@ { - "scenarios": [ { + "scenarios": [ + { + "type": "create", + "name": "Create Table without primary key", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col3", + "cltype": "boolean", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col4", + "cltype": "character varying", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 30, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col5", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": 20, + "attprecision": 10, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col6", + "cltype": "timestamp with time zone", + "attacl": [], + "min_val_attlen": 0, + "max_val_attlen": 6, + "is_primary_key": false, + "attnotnull": false, + "attlen": 5, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_without_primary_key.sql", + "expected_msql_file": "create_table_without_primary_key_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table to change column data types", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "cltype": "bigint" + }, + { + "attnum": 2, + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "cltype": "character varying" + }, + { + "attnum": 6, + "attlen": null, + "cltype": "time without time zone" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_change_col_data_type.sql", + "expected_msql_file": "alter_table_change_col_data_type_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add pk", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "attnotnull": true, + "is_primary_key": true + } + ] + }, + "primary_key": { + "added": [ + { + "columns": [ + { + "column": "col1" + } + ], + "include": [] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_pk_not_null_constraint.sql", + "expected_msql_file": "alter_table_add_pk_not_null_constraint_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add null constraint, rename column", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "name": "col1_rename", + "is_primary_key": false + }, + { + "attnum": 4, + "attnotnull": true + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_null_constraint_rename_col.sql", + "expected_msql_file": "alter_table_add_null_constraint_rename_col_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table add pk", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with primary key", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [ + { + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "integer", + "attacl": [], + "is_primary_key": true, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "json", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_pk.sql", + "expected_msql_file": "create_table_with_pk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add columns", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "columns": { + "added": [ + { + "name": "col3_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": 10, + "attprecision": 5, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col4_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_cols.sql", + "expected_msql_file": "alter_table_add_cols_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table delete columns", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "columns": { + "deleted": [ + { + "attoptions": [], + "attacl": [], + "seclabels": [], + "name": "col2_$%{}[]()&*^!@\\\"'`\\\\/#", + "atttypid": 114, + "attnum": 2, + "cltype": "json", + "collspcname": "", + "description": null, + "edit_types": [ + "json", + "jsonb" + ], + "is_primary_key": false, + "attstattarget": -1, + "attnotnull": true, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attndims": 0, + "atttypmod": -1, + "attstorage": "x", + "defval": null, + "typname": "json", + "displaytypname": "json", + "elemoid": 114, + "typnspname": "pg_catalog", + "defaultstorage": "x", + "indkey": "1", + "isdup": false, + "is_fk": false, + "is_sys_column": false, + "relname": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "is_view_only": false, + "is_pk": false, + "old_attidentity": "a" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_delete_cols.sql", + "expected_msql_file": "alter_table_delete_cols_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table delete columns", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#" + } + }, + { "type": "create", "name": "Create Table with pk & check constraint", "endpoint": "NODE-table.obj", @@ -135,11 +650,1314 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false }, "store_object_id": true, "expected_sql_file": "create_table_with_pk_chk.sql", "expected_msql_file": "create_table_with_pk_chk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add unique constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "unique_constraint": { + "added": [ + { + "name": "unique", + "fillfactor": "13", + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ] + } + }, + "expected_sql_file": "alter_table_add_unique_const.sql", + "expected_msql_file": "alter_table_add_unique_const_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table delete constraints", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "check_constraint": { + "deleted": [ + { + "name": "chk_const", + "consrc": "col2 <> NULL::bpchar", + "connoinherit": false, + "convalidated": false, + "relname": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "nspname": "public", + "comment": "chk const comment", + "conislocal": true + } + ] + }, + "unique_constraint": { + "deleted": [ + { + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"\"'`\\\\/#" + } + ], + "name": "unique", + "comment": null, + "spcname": "pg_default", + "fillfactor": "13", + "condeferrable": false, + "condeferred": false, + "include": [], + "col_count": 1, + "conislocal": true + } + ] + } + }, + "expected_sql_file": "alter_table_delete_constraints.sql", + "expected_msql_file": "alter_table_delete_constraints_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with pk & chk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table for FK reference", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "fk_reference_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "bigint" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Table with fk constraint", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col3", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [ + { + "name": "fk_test", + "comment": "fk comment", + "condeferrable": true, + "confmatchtype": true, + "columns": [ + { + "local_column": "col1", + "references": "", + "referenced": "id" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_fk.sql", + "expected_msql_file": "create_table_with_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add one more fk", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "foreign_key": { + "added": [ + { + "name": "fk2", + "columns": [ + { + "local_column": "col2", + "references": "", + "referenced": "name" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_another_fk.sql", + "expected_msql_file": "alter_table_add_another_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add exclude constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "exclude_constraint": { + "added": [ + { + "name": "ex_constr", + "amname": "btree", + "columns": [ + { + "column": "col1", + "is_exp": false, + "order": false, + "nulls_order": false, + "operator": "=", + "is_sort_nulls_applicable": false + } + ], + "include": [] + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_exclude_constraint.sql", + "expected_msql_file": "alter_table_add_exclude_constraint_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with custom auto-vacuum", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "custom auto vacuum", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "t", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "character varying[]", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 10, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "date", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor", + "value": 0.2 + }, + { + "name": "autovacuum_analyze_threshold", + "value": 55 + }, + { + "name": "autovacuum_freeze_max_age", + "value": 20000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 25 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 10 + }, + { + "name": "autovacuum_vacuum_scale_factor", + "value": 0.3 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 60 + }, + { + "name": "autovacuum_freeze_min_age", + "value": 500000 + }, + { + "name": "autovacuum_freeze_table_age", + "value": 1300000 + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "autovacuum_custom": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_custom_autovacuum.sql", + "expected_msql_file": "create_table_with_custom_autovacuum_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add toast table", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "autovacuum_enabled": "x", + "toast_autovacuum": true, + "toast_autovacuum_enabled": "f", + "vacuum_table": { + "changed": [ + { + "name": "autovacuum_analyze_threshold", + "value": 60 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 100 + } + ] + }, + "vacuum_toast": { + "changed": [ + { + "name": "autovacuum_freeze_max_age", + "value": 2000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 50 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 13 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 70 + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_with_toast_table.sql", + "expected_msql_file": "alter_table_with_toast_table_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with advanced options", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "relhasoids": true, + "description": "test comment", + "relpersistence": true, + "fillfactor": "50", + "parallel_workers": "", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "double precision", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "numrange", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": true, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "rlspolicy": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_advanced_options.sql", + "expected_msql_file": "create_table_with_advanced_options_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table update grants", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "rlspolicy": false, + "forcerlspolicy": false, + "relacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_update_grants.sql", + "expected_msql_file": "alter_table_update_grants_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table for like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "like_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "text" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Table using like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test ", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": true, + "like_constraints": true, + "like_indexes": true, + "like_storage": true, + "like_comments": true, + "like_identity": true, + "like_statistics": true, + "like_relation": "public.like_tbl" + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_lik_tbl.sql", + "expected_msql_file": "create_table_with_lik_tbl_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with list partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_active", + "values_in": "'ACTIVE'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "list", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_partition.sql", + "expected_msql_file": "create_table_with_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with range partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_range_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small PARTITION", + "values_from": "20", + "values_to": "25", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "arr" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_range_partition.sql", + "expected_msql_file": "create_table_with_range_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with range partition with collate and opclass", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "partition_table_with_collate_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small", + "values_from": "'20'", + "values_to": "'25'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status", + "collationame": "\"C\"", + "op_class": "text_pattern_ops" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_partition_table_with_collate.sql", + "expected_msql_file": "create_partition_table_with_collate_msql.sql" } ] } diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/alter_table_add_exclude_constraint.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/alter_table_add_exclude_constraint.sql index b828c6c04..bde2430f6 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/alter_table_add_exclude_constraint.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/alter_table_add_exclude_constraint.sql @@ -17,8 +17,8 @@ CREATE TABLE IF NOT EXISTS public."table_with_fk_constraints$%{}[]()&*^!@""'`\/# ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE, - CONSTRAINT ex_constr EXCLUDE USING gist ( - col1 WITH <>) + CONSTRAINT ex_constr EXCLUDE USING btree ( + col1 WITH =) ) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/alter_table_add_exclude_constraint_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/alter_table_add_exclude_constraint_msql.sql index a70e2599f..87ec46022 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/alter_table_add_exclude_constraint_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/alter_table_add_exclude_constraint_msql.sql @@ -1,3 +1,3 @@ ALTER TABLE IF EXISTS public."table_with_fk_constraints$%{}[]()&*^!@""'`\/#" - ADD CONSTRAINT ex_constr EXCLUDE USING gist ( - col1 WITH <>); + ADD CONSTRAINT ex_constr EXCLUDE USING btree ( + col1 WITH =); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/create_table_with_lik_tbl_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/create_table_with_lik_tbl_msql.sql index d85d0d3cf..e3bd6833a 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/create_table_with_lik_tbl_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/create_table_with_lik_tbl_msql.sql @@ -6,6 +6,9 @@ CREATE TABLE public."table_like_tbl$%{}[]()&*^!@""'`\/#" INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS + INCLUDING GENERATED + INCLUDING IDENTITY + INCLUDING STATISTICS ); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/test.json index 6419423fa..7b5a2f6e4 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/test.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/12_plus/test.json @@ -171,7 +171,10 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false }, "store_object_id": true, "expected_sql_file": "create_table_without_primary_key.sql", @@ -397,7 +400,10 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false }, "store_object_id": true, "expected_sql_file": "create_table_with_pk.sql", @@ -650,7 +656,10 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false }, "store_object_id": true, "expected_sql_file": "create_table_with_pk_chk.sql", @@ -923,7 +932,10 @@ "like_constraints": false, "like_indexes": false, "like_storage": false, - "like_comments": false + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false }, "store_object_id": true, "preprocess_data": true, @@ -974,14 +986,14 @@ "added": [ { "name": "ex_constr", - "amname": "gist", + "amname": "btree", "columns": [ { "column": "col1", "is_exp": false, "order": false, "nulls_order": false, - "operator": "<>", + "operator": "=", "is_sort_nulls_applicable": false } ], @@ -1126,6 +1138,9 @@ "like_indexes": false, "like_storage": false, "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, "autovacuum_custom": true }, "store_object_id": true, @@ -1304,6 +1319,9 @@ "like_indexes": false, "like_storage": false, "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, "rlspolicy": true }, "store_object_id": true, @@ -1478,6 +1496,9 @@ "like_indexes": true, "like_storage": true, "like_comments": true, + "like_generated": true, + "like_identity": true, + "like_statistics": true, "like_relation": "public.like_tbl" }, "store_object_id": true, @@ -1636,6 +1657,9 @@ "like_indexes": false, "like_storage": false, "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, "autovacuum_custom": false }, "store_object_id": true, @@ -1785,6 +1809,9 @@ "like_indexes": false, "like_storage": false, "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, "autovacuum_custom": false }, "store_object_id": true, @@ -1935,6 +1962,9 @@ "like_indexes": false, "like_storage": false, "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, "autovacuum_custom": false }, "store_object_id": true, @@ -2087,6 +2117,9 @@ "like_indexes": false, "like_storage": false, "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, "autovacuum_custom": false }, "store_object_id": true, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/14_plus/create_table_with_lik_tbl_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/14_plus/create_table_with_lik_tbl_msql.sql new file mode 100644 index 000000000..f4981881f --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/14_plus/create_table_with_lik_tbl_msql.sql @@ -0,0 +1,20 @@ +CREATE TABLE public."table_like_tbl$%{}[]()&*^!@""'`\/#" +( + LIKE public.like_tbl + INCLUDING DEFAULTS + INCLUDING CONSTRAINTS + INCLUDING INDEXES + INCLUDING STORAGE + INCLUDING COMMENTS + INCLUDING COMPRESSION + INCLUDING GENERATED + INCLUDING IDENTITY + INCLUDING STATISTICS + +); + +ALTER TABLE IF EXISTS public."table_like_tbl$%{}[]()&*^!@""'`\/#" + OWNER to enterprisedb; + +COMMENT ON TABLE public."table_like_tbl$%{}[]()&*^!@""'`\/#" + IS 'test '; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/14_plus/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/14_plus/test.json new file mode 100644 index 000000000..fb8d63e52 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/14_plus/test.json @@ -0,0 +1,2142 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create Table without primary key", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col3", + "cltype": "boolean", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col4", + "cltype": "character varying", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 30, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col5", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": 20, + "attprecision": 10, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col6", + "cltype": "timestamp with time zone", + "attacl": [], + "min_val_attlen": 0, + "max_val_attlen": 6, + "is_primary_key": false, + "attnotnull": false, + "attlen": 5, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_without_primary_key.sql", + "expected_msql_file": "create_table_without_primary_key_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table to change column data types", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "cltype": "bigint" + }, + { + "attnum": 2, + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "cltype": "character varying" + }, + { + "attnum": 6, + "attlen": null, + "cltype": "time without time zone" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_change_col_data_type.sql", + "expected_msql_file": "alter_table_change_col_data_type_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add pk", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "attnotnull": true, + "is_primary_key": true + } + ] + }, + "primary_key": { + "added": [ + { + "columns": [ + { + "column": "col1" + } + ], + "include": [] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_pk_not_null_constraint.sql", + "expected_msql_file": "alter_table_add_pk_not_null_constraint_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add null constraint, rename column", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#", + "columns": { + "changed": [ + { + "attnum": 1, + "name": "col1_rename", + "is_primary_key": false + }, + { + "attnum": 4, + "attnotnull": true + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_null_constraint_rename_col.sql", + "expected_msql_file": "alter_table_add_null_constraint_rename_col_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table add pk", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with primary key", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [ + { + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "integer", + "attacl": [], + "is_primary_key": true, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "json", + "attacl": [], + "is_primary_key": false, + "attnotnull": true, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_pk.sql", + "expected_msql_file": "create_table_with_pk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add columns", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "columns": { + "added": [ + { + "name": "col3_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": 10, + "attprecision": 5, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col4_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_add_cols.sql", + "expected_msql_file": "alter_table_add_cols_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table delete columns", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "columns": { + "deleted": [ + { + "attoptions": [], + "attacl": [], + "seclabels": [], + "name": "col2_$%{}[]()&*^!@\\\"'`\\\\/#", + "atttypid": 114, + "attnum": 2, + "cltype": "json", + "collspcname": "", + "description": null, + "edit_types": [ + "json", + "jsonb" + ], + "is_primary_key": false, + "attstattarget": -1, + "attnotnull": true, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attndims": 0, + "atttypmod": -1, + "attstorage": "x", + "defval": null, + "typname": "json", + "displaytypname": "json", + "elemoid": 114, + "typnspname": "pg_catalog", + "defaultstorage": "x", + "indkey": "1", + "isdup": false, + "is_fk": false, + "is_sys_column": false, + "relname": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#", + "is_view_only": false, + "is_pk": false, + "old_attidentity": "a" + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_delete_cols.sql", + "expected_msql_file": "alter_table_delete_cols_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table delete columns", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "simple_table_with_pk$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with pk & check constraint", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "create table comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [ + { + "name": "custom_pk", + "comment": "custom pk created", + "fillfactor": "11", + "condeferrable": true, + "condeferred": true, + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1_$%{}[]()&*^!@\\\"'`\\\\/#", + "cltype": "time with time zone", + "attacl": [], + "min_val_attlen": 0, + "max_val_attlen": 6, + "is_primary_key": false, + "attnotnull": false, + "attlen": 5, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "character", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 12, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [ + { + "name": "chk_const", + "consrc": "col2 != null", + "convalidated": false, + "comment": "chk const comment" + } + ], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_pk_chk.sql", + "expected_msql_file": "create_table_with_pk_chk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add unique constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "unique_constraint": { + "added": [ + { + "name": "unique", + "fillfactor": "13", + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"'`\\\\/#" + } + ], + "include": [] + } + ] + } + }, + "expected_sql_file": "alter_table_add_unique_const.sql", + "expected_msql_file": "alter_table_add_unique_const_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table delete constraints", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "check_constraint": { + "deleted": [ + { + "name": "chk_const", + "consrc": "col2 <> NULL::bpchar", + "connoinherit": false, + "convalidated": false, + "relname": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#", + "nspname": "public", + "comment": "chk const comment", + "conislocal": true + } + ] + }, + "unique_constraint": { + "deleted": [ + { + "columns": [ + { + "column": "col1_$%{}[]()&*^!@\\\"\"'`\\\\/#" + } + ], + "name": "unique", + "comment": null, + "spcname": "pg_default", + "fillfactor": "13", + "condeferrable": false, + "condeferred": false, + "include": [], + "col_count": 1, + "conislocal": true + } + ] + } + }, + "expected_sql_file": "alter_table_delete_constraints.sql", + "expected_msql_file": "alter_table_delete_constraints_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with pk & chk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_pk_chk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table for FK reference", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "fk_reference_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "bigint" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Table with fk constraint", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test comment", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col3", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [ + { + "name": "fk_test", + "comment": "fk comment", + "condeferrable": true, + "confmatchtype": true, + "columns": [ + { + "local_column": "col1", + "references": "", + "referenced": "id" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_fk.sql", + "expected_msql_file": "create_table_with_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add one more fk", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "foreign_key": { + "added": [ + { + "name": "fk2", + "columns": [ + { + "local_column": "col2", + "references": "", + "referenced": "name" + } + ], + "confupdtype": "a", + "confdeltype": "a", + "autoindex": false, + "coveringindex": null + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_another_fk.sql", + "expected_msql_file": "alter_table_add_another_fk_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add exclude constraint", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#", + "exclude_constraint": { + "added": [ + { + "name": "ex_constr", + "amname": "btree", + "columns": [ + { + "column": "col1", + "is_exp": false, + "order": false, + "nulls_order": false, + "operator": "=", + "is_sort_nulls_applicable": false + } + ], + "include": [] + } + ] + } + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "alter_table_add_exclude_constraint.sql", + "expected_msql_file": "alter_table_add_exclude_constraint_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_fk_constraints$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with custom auto-vacuum", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "custom auto vacuum", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "t", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "character varying[]", + "attacl": [], + "min_val_attlen": 1, + "max_val_attlen": 2147483647, + "is_primary_key": false, + "attnotnull": false, + "attlen": 10, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "date", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor", + "value": 0.2 + }, + { + "name": "autovacuum_analyze_threshold", + "value": 55 + }, + { + "name": "autovacuum_freeze_max_age", + "value": 20000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 25 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 10 + }, + { + "name": "autovacuum_vacuum_scale_factor", + "value": 0.3 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 60 + }, + { + "name": "autovacuum_freeze_min_age", + "value": 500000 + }, + { + "name": "autovacuum_freeze_table_age", + "value": 1300000 + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_custom_autovacuum.sql", + "expected_msql_file": "create_table_with_custom_autovacuum_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table add toast table", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#", + "autovacuum_enabled": "x", + "toast_autovacuum": true, + "toast_autovacuum_enabled": "f", + "vacuum_table": { + "changed": [ + { + "name": "autovacuum_analyze_threshold", + "value": 60 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 100 + } + ] + }, + "vacuum_toast": { + "changed": [ + { + "name": "autovacuum_freeze_max_age", + "value": 2000000 + }, + { + "name": "autovacuum_vacuum_cost_delay", + "value": 50 + }, + { + "name": "autovacuum_vacuum_cost_limit", + "value": 13 + }, + { + "name": "autovacuum_vacuum_threshold", + "value": 70 + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_with_toast_table.sql", + "expected_msql_file": "alter_table_with_toast_table_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with fk constraints", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_custom_autovaccum_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with advanced options", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "relhasoids": true, + "description": "test comment", + "relpersistence": true, + "fillfactor": "50", + "parallel_workers": "", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [ + { + "name": "col1", + "cltype": "double precision", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "col2", + "cltype": "numrange", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": true, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "rlspolicy": true + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_advanced_options.sql", + "expected_msql_file": "create_table_with_advanced_options_msql.sql" + }, + { + "type": "alter", + "name": "Alter Table update grants", + "endpoint": "NODE-table.obj_id", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#", + "rlspolicy": false, + "forcerlspolicy": false, + "relacl": { + "added": [ + { + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges": [ + { + "privilege_type": "r", + "privilege": true, + "with_grant": false + } + ] + } + ] + } + }, + "store_object_id": true, + "expected_sql_file": "alter_table_update_grants.sql", + "expected_msql_file": "alter_table_update_grants_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_with_advanced_options_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table for like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "like_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "text" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Table using like table", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "test ", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [], + "partition_type": "range", + "is_partitioned": false, + "schema": "public", + "columns": [], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": true, + "like_constraints": true, + "like_indexes": true, + "like_storage": true, + "like_comments": true, + "like_generated": true, + "like_identity": true, + "like_statistics": true, + "like_compression": true, + "like_relation": "public.like_tbl" + }, + "store_object_id": true, + "preprocess_data": true, + "expected_sql_file": "create_table_with_lik_tbl.sql", + "expected_msql_file": "create_table_with_lik_tbl_msql.sql" + }, + { + "type": "delete", + "name": "Delete Table with advanced options", + "endpoint": "NODE-table.obj_id", + "data": { + "name": "table_like_tbl$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Table with list partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_active", + "values_in": "'ACTIVE'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "list", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_partition.sql", + "expected_msql_file": "create_table_with_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with range partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_range_patition_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small PARTITION", + "values_from": "20", + "values_to": "25", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "arr" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_range_partition.sql", + "expected_msql_file": "create_table_with_range_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with hash partition", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "table_with_hash_patition_$%{}[]()&*^!@\\\"'`\\\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "hash partition", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_part11", + "values_modulus": "2", + "values_remainder": "1", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "hash", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "bigint", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "name", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "id" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_table_with_hash_partition.sql", + "expected_msql_file": "create_table_with_hash_partition_msql.sql" + }, + { + "type": "create", + "name": "Create Table with range partition with collate and opclass", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "msql_endpoint": "NODE-table.msql", + "data": { + "name": "partition_table_with_collate_$%{}[]()&*^!@\"'`\\/#", + "relowner": "enterprisedb", + "relacl": [], + "description": "partition table", + "coll_inherits": "[]", + "hastoasttable": true, + "toast_autovacuum_enabled": "x", + "autovacuum_enabled": "x", + "primary_key": [], + "partitions": [ + { + "is_attach": false, + "partition_name": "cust_arr_small", + "values_from": "'20'", + "values_to": "'25'", + "is_sub_partitioned": false, + "sub_partition_type": "range", + "sub_partition_keys": [] + } + ], + "partition_type": "range", + "is_partitioned": true, + "schema": "public", + "columns": [ + { + "name": "id", + "cltype": "integer", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "status", + "cltype": "text", + "attacl": [], + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + }, + { + "name": "arr", + "cltype": "numeric", + "attacl": [], + "min_val_attlen": 1, + "min_val_attprecision": 0, + "max_val_attlen": 1000, + "max_val_attprecision": 1000, + "is_primary_key": false, + "attnotnull": false, + "attlen": null, + "attprecision": null, + "attidentity": "a", + "colconstype": "n", + "attoptions": [], + "seclabels": [] + } + ], + "foreign_key": [], + "check_constraint": [], + "unique_constraint": [], + "exclude_constraint": [], + "partition_keys": [ + { + "key_type": "column", + "pt_column": "status", + "collationame": "\"C\"", + "op_class": "text_pattern_ops" + } + ], + "vacuum_table": [ + { + "name": "autovacuum_analyze_scale_factor" + }, + { + "name": "autovacuum_analyze_threshold" + }, + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "vacuum_toast": [ + { + "name": "autovacuum_freeze_max_age" + }, + { + "name": "autovacuum_vacuum_cost_delay" + }, + { + "name": "autovacuum_vacuum_cost_limit" + }, + { + "name": "autovacuum_vacuum_scale_factor" + }, + { + "name": "autovacuum_vacuum_threshold" + }, + { + "name": "autovacuum_freeze_min_age" + }, + { + "name": "autovacuum_freeze_table_age" + } + ], + "seclabels": [], + "forcerlspolicy": false, + "like_default_value": false, + "like_constraints": false, + "like_indexes": false, + "like_storage": false, + "like_comments": false, + "like_identity": false, + "like_statistics": false, + "like_generated": false, + "like_compression": false, + "autovacuum_custom": false + }, + "store_object_id": true, + "expected_sql_file": "create_partition_table_with_collate.sql", + "expected_msql_file": "create_partition_table_with_collate_msql.sql" + } + ] + } + \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/alter_table_add_exclude_constraint.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/alter_table_add_exclude_constraint.sql index 419ec278c..3a37ee358 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/alter_table_add_exclude_constraint.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/alter_table_add_exclude_constraint.sql @@ -17,8 +17,8 @@ CREATE TABLE IF NOT EXISTS public."table_with_fk_constraints$%{}[]()&*^!@""'`\/# ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE, - CONSTRAINT ex_constr EXCLUDE USING gist ( - col1 WITH <>) + CONSTRAINT ex_constr EXCLUDE USING btree ( + col1 WITH =) ) WITH ( diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/alter_table_add_exclude_constraint_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/alter_table_add_exclude_constraint_msql.sql index a70e2599f..87ec46022 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/alter_table_add_exclude_constraint_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/alter_table_add_exclude_constraint_msql.sql @@ -1,3 +1,3 @@ ALTER TABLE IF EXISTS public."table_with_fk_constraints$%{}[]()&*^!@""'`\/#" - ADD CONSTRAINT ex_constr EXCLUDE USING gist ( - col1 WITH <>); + ADD CONSTRAINT ex_constr EXCLUDE USING btree ( + col1 WITH =); diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/alter_table_update_grants.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/alter_table_update_grants.sql index 9e1f3c07c..072cc2df4 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/alter_table_update_grants.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/alter_table_update_grants.sql @@ -16,6 +16,8 @@ TABLESPACE pg_default; ALTER TABLE IF EXISTS public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" OWNER to enterprisedb; +REVOKE ALL ON TABLE public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" FROM PUBLIC; + GRANT SELECT ON TABLE public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" TO PUBLIC; GRANT ALL ON TABLE public."table_with_advanced_options_$%{}[]()&*^!@""'`\/#" TO enterprisedb; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/create_table_with_lik_tbl_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/create_table_with_lik_tbl_msql.sql index 38f2d914e..9b1fb27ee 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/create_table_with_lik_tbl_msql.sql +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/create_table_with_lik_tbl_msql.sql @@ -6,6 +6,8 @@ CREATE TABLE public."table_like_tbl$%{}[]()&*^!@""'`\/#" INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS + INCLUDING IDENTITY + INCLUDING STATISTICS ) WITH ( diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/test.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/test.json index c079c472a..bc4507846 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/test.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/ppas/default/test.json @@ -974,14 +974,14 @@ "added": [ { "name": "ex_constr", - "amname": "gist", + "amname": "btree", "columns": [ { "column": "col1", "is_exp": false, "order": false, "nulls_order": false, - "operator": "<>", + "operator": "=", "is_sort_nulls_applicable": false } ], @@ -1478,6 +1478,8 @@ "like_indexes": true, "like_storage": true, "like_comments": true, + "like_identity": true, + "like_statistics": true, "like_relation": "public.like_tbl" }, "store_object_id": true, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/table_test_data.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/table_test_data.json index 109689d58..0c9301ba8 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/table_test_data.json +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/table_test_data.json @@ -608,6 +608,131 @@ "error_msg": "Mocked Internal Server Error", "test_result_data": {} } + }, + { + "name": "Create: Add Table for like table", + "is_positive_test": true, + "inventory_data": {}, + "test_data": { + "name": "like_tbl", + "columns": [ + { + "name": "id", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "name", + "cltype": "text" + } + ], + "primary_key": [ + { + "columns": [ + { + "column": "id" + } + ], + "include": [] + } + ], + "unique_constraint": [ + { + "name": "", + "columns": [ + { + "column": "name" + } + ], + "include": [] + } + ] + }, + "mocking_required": false, + "mock_data": {}, + "expected_data": { + "status_code": 200, + "error_msg": null, + "test_result_data": {} + } + }, + { + "name": "Create: Add Table with like option", + "is_positive_test": true, + "inventory_data": {}, + "test_data": { + "columns": [], + "like_default_value": true, + "like_constraints": true, + "like_indexes": true, + "like_storage": true, + "like_comments": true, + "like_identity": true, + "like_statistics": true, + "like_relation": "public.like_tbl" + }, + "mocking_required": false, + "mock_data": {}, + "expected_data": { + "status_code": 200, + "error_msg": null, + "test_result_data": {} + } + }, + { + "name": "Create: Add Table with like option 12 plus", + "is_positive_test": true, + "inventory_data": { + "server_min_version": 120000, + "skip_msg": "Like generated is not supported by PPAS/PG 11.0 and below" + }, + "test_data": { + "columns": [], + "like_default_value": true, + "like_constraints": true, + "like_indexes": true, + "like_storage": true, + "like_comments": true, + "like_identity": true, + "like_statistics": true, + "like_generated": true, + "like_relation": "public.like_tbl" + }, + "mocking_required": false, + "mock_data": {}, + "expected_data": { + "status_code": 200, + "error_msg": null, + "test_result_data": {} + } + }, + { + "name": "Create: Add Table with like option 14 plus", + "is_positive_test": true, + "inventory_data": { + "server_min_version": 140000, + "skip_msg": "Like compression is not supported by PPAS/PG 14.0 and below" + }, + "test_data": { + "columns": [], + "like_default_value": true, + "like_constraints": true, + "like_indexes": true, + "like_storage": true, + "like_comments": true, + "like_identity": true, + "like_statistics": true, + "like_generated": true, + "like_compression": true, + "like_relation": "public.like_tbl" + }, + "mocking_required": false, + "mock_data": {}, + "expected_data": { + "status_code": 200, + "error_msg": null, + "test_result_data": {} + } } ], "table_delete": [ diff --git a/web/regression/javascript/schema_ui_files/table.ui.spec.js b/web/regression/javascript/schema_ui_files/table.ui.spec.js index 8b41341f9..0a5b00246 100644 --- a/web/regression/javascript/schema_ui_files/table.ui.spec.js +++ b/web/regression/javascript/schema_ui_files/table.ui.spec.js @@ -95,6 +95,10 @@ describe('TableSchema', ()=>{ like_indexes: false, like_storage: false, like_comments: false, + like_compression: false, + like_generated: false, + like_identity: false, + like_statistics: false }); });