diff --git a/docs/en_US/images/sequence_definition.png b/docs/en_US/images/sequence_definition.png index 90c5f323a7b..196e595e719 100644 Binary files a/docs/en_US/images/sequence_definition.png and b/docs/en_US/images/sequence_definition.png differ diff --git a/docs/en_US/sequence_dialog.rst b/docs/en_US/sequence_dialog.rst index 4c7d1f749ab..5d987e6b3a1 100644 --- a/docs/en_US/sequence_dialog.rst +++ b/docs/en_US/sequence_dialog.rst @@ -52,10 +52,12 @@ Use the fields in the *Definition* tab to define the sequence: to be preallocated and stored in memory for faster access. The minimum value is 1 (only one value can be generated at a time, i.e., no cache), and this is also the default. -* Move the *Cycled* switch to the *Yes* position to allow the sequence to wrap +* Move the switch next to *Cycled* towards the *right position* to allow the sequence to wrap around when the MAXVALUE or the MINVALUE has been reached by an ascending or descending sequence respectively. If the limit is reached, the next number generated will be the MINVALUE or MAXVALUE, respectively. The default is *No*. +* Move the switch next to *Unlogged?* towards the *right position* to make the sequence Unlogged. + The default is *No*. This option is available only on PostgreSQL 15 and above. * The *OWNED BY* option causes the sequence to be associated with a specific table column, such that if that column (or its whole table) is dropped, the sequence will be automatically dropped as well. The specified table must have diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.ui.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.ui.js index 530977649d6..f86b424da53 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.ui.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.ui.js @@ -89,6 +89,7 @@ export default class SequenceSchema extends BaseUISchema { maximum: undefined, cache: undefined, cycled: undefined, + relpersistence: undefined, relacl: [], securities: [], ...initValues, @@ -154,6 +155,10 @@ export default class SequenceSchema extends BaseUISchema { }, { id: 'cycled', label: gettext('Cycled'), type: 'switch', mode: ['properties', 'create', 'edit'], group: gettext('Definition'), + }, { + id: 'relpersistence', label: gettext('Unlogged?'), type: 'switch', + mode: ['properties', 'create', 'edit'], group: gettext('Definition'), + min_version: 150000, }, { type: 'nested-fieldset', label: gettext('Owned By'), group: gettext('Definition'), schema: this.ownedSchemaObj, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/templates/sequences/sql/15_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/templates/sequences/sql/15_plus/create.sql new file mode 100644 index 00000000000..d62b3cd39c3 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/templates/sequences/sql/15_plus/create.sql @@ -0,0 +1,18 @@ +CREATE {% if data.relpersistence %}UNLOGGED {% endif %}SEQUENCE{% if add_not_exists_clause %} IF NOT EXISTS{% endif %} {{ conn|qtIdent(data.schema, data.name) }}{% if data.increment is defined and data.cycled %} + + CYCLE{% endif %}{% if data.increment is defined %} + + INCREMENT {{data.increment|int}}{% endif %}{% if data.start is defined %} + + START {{data.start|int}}{% elif data.current_value is defined %} + + START {{data.current_value|int}}{% endif %}{% if data.minimum is defined %} + + MINVALUE {{data.minimum|int}}{% endif %}{% if data.maximum is defined %} + + MAXVALUE {{data.maximum|int}}{% endif %}{% if data.cache is defined and data.cache|int(-1) > -1%} + + CACHE {{data.cache|int}}{% endif %}{% if data.owned_table is defined and data.owned_table != None and data.owned_column is defined and data.owned_column != None %} + + OWNED BY {{ conn|qtIdent(data.owned_table) }}.{{ conn|qtIdent(data.owned_column) }}{% endif %}; + diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/templates/sequences/sql/15_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/templates/sequences/sql/15_plus/properties.sql new file mode 100644 index 00000000000..a885e295e35 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/templates/sequences/sql/15_plus/properties.sql @@ -0,0 +1,23 @@ +{% if scid %} +SELECT + cl.oid as oid, + cl.relname as name, + nsp.nspname as schema, + pg_catalog.pg_get_userbyid(cl.relowner) AS seqowner, + description as comment, + pg_catalog.array_to_string(cl.relacl::text[], ', ') as acl, + (SELECT pg_catalog.array_agg(provider || '=' || label) FROM pg_catalog.pg_seclabels sl1 WHERE sl1.objoid=cl.oid) AS securities, + depcl.relname AS owned_table, + att.attname AS owned_column, + (CASE WHEN cl.relpersistence = 'u' THEN true ELSE false END) AS relpersistence +FROM pg_catalog.pg_class cl + LEFT OUTER JOIN pg_catalog.pg_namespace nsp ON cl.relnamespace = nsp.oid + LEFT OUTER JOIN pg_catalog.pg_description des ON (des.objoid=cl.oid + AND des.classoid='pg_class'::regclass) + LEFT OUTER JOIN pg_catalog.pg_depend dep ON (dep.objid=cl.oid and deptype = 'a') + LEFT JOIN pg_catalog.pg_attribute att ON dep.refobjid=att.attrelid AND dep.refobjsubid=att.attnum + LEFT JOIN pg_catalog.pg_class depcl ON depcl.oid = att.attrelid +WHERE cl.relkind = 'S' AND cl.relnamespace = {{scid}}::oid +{% if seid %}AND cl.oid = {{seid}}::oid {% endif %} +ORDER BY cl.relname +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/templates/sequences/sql/15_plus/update.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/templates/sequences/sql/15_plus/update.sql new file mode 100644 index 00000000000..af6d6b554fd --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/templates/sequences/sql/15_plus/update.sql @@ -0,0 +1,113 @@ +{% import 'macros/schemas/security.macros' as SECLABEL %} +{% import 'macros/schemas/privilege.macros' as PRIVILEGE %} +{% if data %} +{% if data.name != o_data.name %} +ALTER SEQUENCE IF EXISTS {{ conn|qtIdent(o_data.schema, o_data.name) }} + RENAME TO {{ conn|qtIdent(data.name) }}; + +{% endif %} +{% if data.seqowner and data.seqowner != o_data.seqowner %} +ALTER SEQUENCE IF EXISTS {{ conn|qtIdent(o_data.schema, data.name) }} + OWNER TO {{ conn|qtIdent(data.seqowner) }}; + +{% endif %} +{% if (data.owned_table == None) and (data.owned_column == None) %} +ALTER SEQUENCE IF EXISTS {{ conn|qtIdent(o_data.schema, data.name) }} + OWNED BY NONE; +{% elif (data.owned_table is defined or data.owned_column is defined) and (data.owned_table != o_data.owned_table or data.owned_column != o_data.owned_column) %} +ALTER SEQUENCE IF EXISTS {{ conn|qtIdent(o_data.schema, data.name) }} + OWNED BY {% if data.owned_table is defined %}{{ conn|qtIdent(data.owned_table) }}{% else %}{{ conn|qtIdent(o_data.owned_table) }}{% endif %}.{% if data.owned_column is defined %}{{ conn|qtIdent(data.owned_column) }}{% else %}{{ conn|qtIdent(o_data.owned_column) }}{% endif %}; +{% endif %} +{% if data.current_value is defined %} +{% set seqname = conn|qtIdent(o_data.schema, data.name) %} +SELECT setval({{ seqname|qtLiteral(conn) }}, {{ data.current_value }}, true); + +{% endif %} +{% if data.relpersistence in [True, False] and data.relpersistence != o_data.relpersistence %} +ALTER SEQUENCE IF EXISTS {{ conn|qtIdent(o_data.schema, data.name) }} + SET {% if data.relpersistence %}UNLOGGED{% else %}LOGGED{% endif %}; + +{% endif %} +{% set defquery = '' %} +{% if data.increment is defined %} +{% set defquery = defquery+'\n INCREMENT '+data.increment|string %} +{% endif %} +{% if data.start is defined %} +{% set defquery = defquery+'\n START '+data.start|string %} +{% endif %} +{% if data.minimum is defined %} +{% set defquery = defquery+'\n MINVALUE '+data.minimum|string %} +{% endif %} +{% if data.maximum is defined %} +{% set defquery = defquery+'\n MAXVALUE '+data.maximum|string %} +{% endif %} +{% if data.cache is defined %} +{% set defquery = defquery+'\n CACHE '+data.cache|string %} +{% endif %} +{% if data.cycled == True %} +{% set defquery = defquery+'\n CYCLE' %} +{% elif data.cycled == False %} +{% set defquery = defquery+'\n NO CYCLE' %} +{% endif %} +{% if defquery and defquery != '' %} +ALTER SEQUENCE IF EXISTS {{ conn|qtIdent(o_data.schema, data.name) }}{{ defquery }}; + +{% endif %} +{% if data.schema and data.schema != o_data.schema %} +ALTER SEQUENCE IF EXISTS {{ conn|qtIdent(o_data.schema, data.name) }} + SET SCHEMA {{ conn|qtIdent(data.schema) }}; + +{% set seqname = conn|qtIdent(data.schema, data.name) %} +{% set schema = data.schema %} +{% else %} +{% set seqname = conn|qtIdent(o_data.schema, data.name) %} +{% set schema = o_data.schema %} +{% endif %} +{% if data.comment is defined and data.comment != o_data.comment %} +COMMENT ON SEQUENCE {{ seqname }} + IS {{ data.comment|qtLiteral(conn) }}; + +{% endif %} +{% if data.securities and data.securities|length > 0 %} + +{% set seclabels = data.securities %} +{% if 'deleted' in seclabels and seclabels.deleted|length > 0 %} +{% for r in seclabels.deleted %} +{{ SECLABEL.UNSET(conn, 'SEQUENCE', data.name, r.provider, schema) }} +{% endfor %} +{% endif %} +{% if 'added' in seclabels and seclabels.added|length > 0 %} +{% for r in seclabels.added %} +{{ SECLABEL.SET(conn, 'SEQUENCE', data.name, r.provider, r.label, schema) }} +{% endfor %} +{% endif %} +{% if 'changed' in seclabels and seclabels.changed|length > 0 %} +{% for r in seclabels.changed %} +{{ SECLABEL.SET(conn, 'SEQUENCE', data.name, r.provider, r.label, schema) }} +{% endfor %} +{% endif %} +{% endif %} +{% if data.relacl %} + +{% if 'deleted' in data.relacl %} +{% for priv in data.relacl.deleted %} +{{ PRIVILEGE.UNSETALL(conn, 'SEQUENCE', priv.grantee, data.name, schema) }} +{% endfor %} +{% endif %} +{% if 'changed' in data.relacl %} +{% for priv in data.relacl.changed %} +{% if priv.grantee != priv.old_grantee %} +{{ PRIVILEGE.UNSETALL(conn, 'SEQUENCE', priv.old_grantee, data.name, schema) }} +{% else %} +{{ PRIVILEGE.UNSETALL(conn, 'SEQUENCE', priv.grantee, data.name, schema) }} +{% endif %} +{{ PRIVILEGE.SET(conn, 'SEQUENCE', priv.grantee, data.name, priv.without_grant, priv.with_grant, schema) }} +{% endfor %} +{% endif %} +{% if 'added' in data.relacl %} +{% for priv in data.relacl.added %} +{{ PRIVILEGE.SET(conn, 'SEQUENCE', priv.grantee, data.name, priv.without_grant, priv.with_grant, schema) }} +{% endfor %} +{% endif %} +{% endif %} +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/alter_seq_set_logged.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/alter_seq_set_logged.sql new file mode 100644 index 00000000000..5f9d93a42d3 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/alter_seq_set_logged.sql @@ -0,0 +1,13 @@ +-- SEQUENCE: public.Seq1_$%{}[]()&*^!@"'`\/# + +-- DROP SEQUENCE IF EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#"; + +CREATE SEQUENCE IF NOT EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#" + INCREMENT 5 + START 5 + MINVALUE 5 + MAXVALUE 999 + CACHE 1; + +ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#" + OWNER TO postgres; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/alter_seq_set_logged_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/alter_seq_set_logged_msql.sql new file mode 100644 index 00000000000..38928d7afac --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/alter_seq_set_logged_msql.sql @@ -0,0 +1,2 @@ +ALTER SEQUENCE IF EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#" + SET LOGGED; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/alter_seq_set_unlogged.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/alter_seq_set_unlogged.sql new file mode 100644 index 00000000000..6a1470849c8 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/alter_seq_set_unlogged.sql @@ -0,0 +1,13 @@ +-- SEQUENCE: public.Seq1_$%{}[]()&*^!@"'`\/# + +-- DROP SEQUENCE IF EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#"; + +CREATE UNLOGGED SEQUENCE IF NOT EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#" + INCREMENT 5 + START 5 + MINVALUE 5 + MAXVALUE 999 + CACHE 1; + +ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#" + OWNER TO postgres; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/alter_seq_set_unlogged_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/alter_seq_set_unlogged_msql.sql new file mode 100644 index 00000000000..bb76374cd22 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/alter_seq_set_unlogged_msql.sql @@ -0,0 +1,2 @@ +ALTER SEQUENCE IF EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#" + SET UNLOGGED; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/create_unlogged_sequence.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/create_unlogged_sequence.sql new file mode 100644 index 00000000000..6a1470849c8 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/create_unlogged_sequence.sql @@ -0,0 +1,13 @@ +-- SEQUENCE: public.Seq1_$%{}[]()&*^!@"'`\/# + +-- DROP SEQUENCE IF EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#"; + +CREATE UNLOGGED SEQUENCE IF NOT EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#" + INCREMENT 5 + START 5 + MINVALUE 5 + MAXVALUE 999 + CACHE 1; + +ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#" + OWNER TO postgres; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/create_unlogged_sequence_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/create_unlogged_sequence_msql.sql new file mode 100644 index 00000000000..f5aff5aab4e --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/create_unlogged_sequence_msql.sql @@ -0,0 +1,9 @@ +CREATE UNLOGGED SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#" + INCREMENT 5 + START 5 + MINVALUE 5 + MAXVALUE 999 + CACHE 1; + +ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#" + OWNER TO postgres; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/test_sequences_pg.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/test_sequences_pg.json new file mode 100644 index 00000000000..ec80587b91d --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/pg/15_plus/test_sequences_pg.json @@ -0,0 +1,352 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create Table for Owned By", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "tableforownedby", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "col2", + "cltype": "text" + }, + { + "name": "col3", + "cltype": "integer" + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Sequence", + "endpoint": "NODE-sequence.obj", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#", + "seqowner": "postgres", + "schema": "public", + "increment": "5", + "start": "5", + "maximum": "999", + "minimum": "5", + "cache": "1", + "cycled": false, + "relacl": [], + "securities": [] + }, + "expected_sql_file": "create_sequence.sql", + "expected_msql_file": "create_sequence_msql.sql" + },{ + "type": "alter", + "name": "Alter Sequence comment", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "comment": "Some comment" + }, + "expected_sql_file": "alter_seq_comment.sql", + "expected_msql_file": "alter_seq_comment_msql.sql" + },{ + "type": "alter", + "name": "Alter Sequence properties", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "current_value": "7", "increment": "12", "minimum": "2", "maximum": "9992", "cache": "2", "cycled": true + }, + "expected_sql_file": "alter_seq_props.sql", + "expected_msql_file": "alter_seq_props_msql.sql" + },{ + "type": "alter", + "name": "Alter Sequence add privileges", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "sql_endpoint": "NODE-sequence.sql_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relacl": { + "added":[{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges":[{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + },{ + "privilege_type": "U", + "privilege": true, + "with_grant": false + },{ + "privilege_type": "w", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_seq_privs_add.sql", + "expected_msql_file": "alter_seq_privs_add_msql.sql" + },{ + "type": "alter", + "name": "Alter Sequence update privileges", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relacl": { + "changed":[{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges":[{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_seq_privs_update.sql", + "expected_msql_file": "alter_seq_privs_update_msql.sql" + }, + { + "type": "alter", + "name": "Alter Sequence remove partial privileges", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relacl": { + "deleted":[{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges":[{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }] + }] + } + } + }, + { + "type": "alter", + "name": "Alter Sequence change grantee in privileges", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relacl": { + "changed":[{ + "grantee": "PUBLIC", + "grantor": "postgres", + "old_grantee": "postgres", + "privileges":[{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_seq_change_grantee_privs.sql", + "expected_msql_file": "alter_seq_change_grantee_privs_msql.sql" + }, + { + "type": "alter", + "name": "Alter Sequence remove privileges", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relacl": { + "deleted":[{ + "grantee": "PUBLIC", + "grantor": "postgres", + "privileges":[{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + },{ + "privilege_type": "U", + "privilege": true, + "with_grant": false + },{ + "privilege_type": "w", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_seq_privs_remove.sql", + "expected_msql_file": "alter_seq_privs_remove_msql.sql" + }, { + "type": "delete", + "name": "Drop sequence", + "endpoint": "NODE-sequence.delete_id", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#" + } + }, { + "type": "create", + "name": "Create Sequence with Negative value", + "endpoint": "NODE-sequence.obj", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#", + "seqowner": "postgres", + "schema": "public", + "increment": "-5", + "start": "-30", + "maximum": "-10", + "minimum": "-40", + "cache": "1", + "cycled": false, + "relacl": [], + "securities": [] + }, + "expected_sql_file": "create_negative_sequence.sql", + "expected_msql_file": "create_negative_sequence_msql.sql" + }, { + "type": "alter", + "name": "Alter Sequence properties with negative value", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "increment": "-7", "minimum": "-35", "maximum": "-15" + }, + "expected_sql_file": "alter_neg_seq_props.sql", + "expected_msql_file": "alter_neg_seq_props_msql.sql" + }, { + "type": "delete", + "name": "Drop negative sequence", + "endpoint": "NODE-sequence.delete_id", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Sequence with Owned By", + "endpoint": "NODE-sequence.obj", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#", + "seqowner": "postgres", + "schema": "public", + "increment": "5", + "start": "5", + "maximum": "999", + "minimum": "5", + "cache": "1", + "cycled": false, + "owned_table": "tableforownedby", + "owned_column": "col1", + "relacl": [], + "securities": [] + }, + "expected_sql_file": "create_sequence_ownedby.sql", + "expected_msql_file": "create_sequence_ownedby_msql.sql" + }, { + "type": "alter", + "name": "Alter Sequence owned by column", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "owned_column": "col2" + }, + "expected_sql_file": "alter_ownedby_column.sql", + "expected_msql_file": "alter_ownedby_column_msql.sql" + }, { + "type": "alter", + "name": "Alter Sequence remove owned by", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "maximum": "900" + }, + "expected_sql_file": "alter_ownedby_remove.sql", + "expected_msql_file": "alter_ownedby_remove_msql.sql" + }, { + "type": "delete", + "name": "Drop owned by sequence", + "endpoint": "NODE-sequence.delete_id", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#" + } + }, { + "type": "create", + "name": "Create unlogged sequence", + "endpoint": "NODE-sequence.obj", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#", + "seqowner": "postgres", + "schema": "public", + "increment": "5", + "start": "5", + "maximum": "999", + "minimum": "5", + "cache": "1", + "cycled": false, + "relpersistence": true, + "relacl": [], + "securities": [] + }, + "expected_sql_file": "create_unlogged_sequence.sql", + "expected_msql_file": "create_unlogged_sequence_msql.sql" + }, { + "type": "alter", + "name": "Alter sequence set logged", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relpersistence": false + }, + "expected_sql_file": "alter_seq_set_logged.sql", + "expected_msql_file": "alter_seq_set_logged_msql.sql" + }, { + "type": "alter", + "name": "Alter sequence set unlogged", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relpersistence": true + }, + "expected_sql_file": "alter_seq_set_unlogged.sql", + "expected_msql_file": "alter_seq_set_unlogged_msql.sql" + }, { + "type": "delete", + "name": "Drop unlogged sequence", + "endpoint": "NODE-sequence.delete_id", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#" + } + } + ] + } + \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/alter_seq_set_logged.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/alter_seq_set_logged.sql new file mode 100644 index 00000000000..f99f7d72393 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/alter_seq_set_logged.sql @@ -0,0 +1,13 @@ +-- SEQUENCE: public.Seq1_$%{}[]()&*^!@"'`\/# + +-- DROP SEQUENCE IF EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#"; + +CREATE SEQUENCE IF NOT EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#" + INCREMENT 5 + START 5 + MINVALUE 5 + MAXVALUE 999 + CACHE 1; + +ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#" + OWNER TO enterprisedb; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/alter_seq_set_logged_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/alter_seq_set_logged_msql.sql new file mode 100644 index 00000000000..38928d7afac --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/alter_seq_set_logged_msql.sql @@ -0,0 +1,2 @@ +ALTER SEQUENCE IF EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#" + SET LOGGED; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/alter_seq_set_unlogged.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/alter_seq_set_unlogged.sql new file mode 100644 index 00000000000..f83f94b12d0 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/alter_seq_set_unlogged.sql @@ -0,0 +1,13 @@ +-- SEQUENCE: public.Seq1_$%{}[]()&*^!@"'`\/# + +-- DROP SEQUENCE IF EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#"; + +CREATE UNLOGGED SEQUENCE IF NOT EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#" + INCREMENT 5 + START 5 + MINVALUE 5 + MAXVALUE 999 + CACHE 1; + +ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#" + OWNER TO enterprisedb; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/alter_seq_set_unlogged_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/alter_seq_set_unlogged_msql.sql new file mode 100644 index 00000000000..bb76374cd22 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/alter_seq_set_unlogged_msql.sql @@ -0,0 +1,2 @@ +ALTER SEQUENCE IF EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#" + SET UNLOGGED; \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/create_unlogged_sequence.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/create_unlogged_sequence.sql new file mode 100644 index 00000000000..f83f94b12d0 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/create_unlogged_sequence.sql @@ -0,0 +1,13 @@ +-- SEQUENCE: public.Seq1_$%{}[]()&*^!@"'`\/# + +-- DROP SEQUENCE IF EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#"; + +CREATE UNLOGGED SEQUENCE IF NOT EXISTS public."Seq1_$%{}[]()&*^!@""'`\/#" + INCREMENT 5 + START 5 + MINVALUE 5 + MAXVALUE 999 + CACHE 1; + +ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#" + OWNER TO enterprisedb; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/create_unlogged_sequence_msql.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/create_unlogged_sequence_msql.sql new file mode 100644 index 00000000000..db46085d784 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/create_unlogged_sequence_msql.sql @@ -0,0 +1,9 @@ +CREATE UNLOGGED SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#" + INCREMENT 5 + START 5 + MINVALUE 5 + MAXVALUE 999 + CACHE 1; + +ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#" + OWNER TO enterprisedb; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/test_sequences_ppas.json b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/test_sequences_ppas.json new file mode 100644 index 00000000000..f0a95e35451 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/ppas/15_plus/test_sequences_ppas.json @@ -0,0 +1,350 @@ +{ + "scenarios": [ + { + "type": "create", + "name": "Create Table for Owned By", + "endpoint": "NODE-table.obj", + "sql_endpoint": "NODE-table.sql_id", + "data": { + "name": "tableforownedby", + "columns": [ + { + "name": "col1", + "cltype": "integer", + "is_primary_key": true + }, + { + "name": "col2", + "cltype": "text" + }, + { + "name": "col3", + "cltype": "integer" + } + ], + "is_partitioned": false, + "schema": "public", + "spcname": "pg_default" + }, + "store_object_id": true + }, + { + "type": "create", + "name": "Create Sequence", + "endpoint": "NODE-sequence.obj", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#", + "seqowner": "enterprisedb", + "schema": "public", + "increment": "5", + "start": "5", + "maximum": "999", + "minimum": "5", + "cache": "1", + "cycled": false, + "relacl": [], + "securities": [] + }, + "expected_sql_file": "create_sequence.sql", + "expected_msql_file": "create_sequence_msql.sql" + },{ + "type": "alter", + "name": "Alter Sequence comment", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "comment": "Some comment" + }, + "expected_sql_file": "alter_seq_comment.sql", + "expected_msql_file": "alter_seq_comment_msql.sql" + },{ + "type": "alter", + "name": "Alter Sequence properties", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "current_value": "7", "increment": "12", "minimum": "2", "maximum": "9992", "cache": "2", "cycled": true + }, + "expected_sql_file": "alter_seq_props.sql", + "expected_msql_file": "alter_seq_props_msql.sql" + },{ + "type": "alter", + "name": "Alter Sequence add privileges", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relacl": { + "added":[{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges":[{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + },{ + "privilege_type": "U", + "privilege": true, + "with_grant": false + },{ + "privilege_type": "w", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_seq_privs_add.sql", + "expected_msql_file": "alter_seq_privs_add_msql.sql" + },{ + "type": "alter", + "name": "Alter Sequence update privileges", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relacl": { + "changed":[{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges":[{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_seq_privs_update.sql", + "expected_msql_file": "alter_seq_privs_update_msql.sql" + }, + { + "type": "alter", + "name": "Alter Sequence remove partial privileges", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relacl": { + "deleted":[{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges":[{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }] + }] + } + } + }, + { + "type": "alter", + "name": "Alter Sequence change grantee in privileges", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relacl": { + "changed":[{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "old_grantee": "enterprisedb", + "privileges":[{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_seq_change_grantee_privs.sql", + "expected_msql_file": "alter_seq_change_grantee_privs_msql.sql" + }, + { + "type": "alter", + "name": "Alter Sequence remove privileges", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relacl": { + "deleted":[{ + "grantee": "PUBLIC", + "grantor": "enterprisedb", + "privileges":[{ + "privilege_type": "r", + "privilege": true, + "with_grant": false + },{ + "privilege_type": "U", + "privilege": true, + "with_grant": false + },{ + "privilege_type": "w", + "privilege": true, + "with_grant": false + }] + }] + } + }, + "expected_sql_file": "alter_seq_privs_remove.sql", + "expected_msql_file": "alter_seq_privs_remove_msql.sql" + }, { + "type": "delete", + "name": "Drop sequence", + "endpoint": "NODE-sequence.delete_id", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#" + } + }, { + "type": "create", + "name": "Create Sequence with Negative value", + "endpoint": "NODE-sequence.obj", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#", + "seqowner": "enterprisedb", + "schema": "public", + "increment": "-5", + "start": "-30", + "maximum": "-10", + "minimum": "-40", + "cache": "1", + "cycled": false, + "relacl": [], + "securities": [] + }, + "expected_sql_file": "create_negative_sequence.sql", + "expected_msql_file": "create_negative_sequence_msql.sql" + }, { + "type": "alter", + "name": "Alter Sequence properties with negative value", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "increment": "-7", "minimum": "-35", "maximum": "-15" + }, + "expected_sql_file": "alter_neg_seq_props.sql", + "expected_msql_file": "alter_neg_seq_props_msql.sql" + }, { + "type": "delete", + "name": "Drop negative sequence", + "endpoint": "NODE-sequence.delete_id", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#" + } + }, + { + "type": "create", + "name": "Create Sequence with Owned By", + "endpoint": "NODE-sequence.obj", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#", + "seqowner": "enterprisedb", + "schema": "public", + "increment": "5", + "start": "5", + "maximum": "999", + "minimum": "5", + "cache": "1", + "cycled": false, + "owned_table": "tableforownedby", + "owned_column": "col1", + "relacl": [], + "securities": [] + }, + "expected_sql_file": "create_sequence_ownedby.sql", + "expected_msql_file": "create_sequence_ownedby_msql.sql" + }, { + "type": "alter", + "name": "Alter Sequence owned by column", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "owned_column": "col2" + }, + "expected_sql_file": "alter_ownedby_column.sql", + "expected_msql_file": "alter_ownedby_column_msql.sql" + }, { + "type": "alter", + "name": "Alter Sequence remove owned by", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "maximum": "900" + }, + "expected_sql_file": "alter_ownedby_remove.sql", + "expected_msql_file": "alter_ownedby_remove_msql.sql" + }, { + "type": "delete", + "name": "Drop owned by sequence", + "endpoint": "NODE-sequence.delete_id", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#" + } + }, { + "type": "create", + "name": "Create unlogged sequence", + "endpoint": "NODE-sequence.obj", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#", + "seqowner": "enterprisedb", + "schema": "public", + "increment": "5", + "start": "5", + "maximum": "999", + "minimum": "5", + "cache": "1", + "cycled": false, + "relpersistence": true, + "relacl": [], + "securities": [] + }, + "expected_sql_file": "create_unlogged_sequence.sql", + "expected_msql_file": "create_unlogged_sequence_msql.sql" + }, { + "type": "alter", + "name": "Alter sequence set logged", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relpersistence": false + }, + "expected_sql_file": "alter_seq_set_logged.sql", + "expected_msql_file": "alter_seq_set_logged_msql.sql" + }, { + "type": "alter", + "name": "Alter sequence set unlogged", + "endpoint": "NODE-sequence.obj_id", + "sql_endpoint": "NODE-sequence.sql_id", + "msql_endpoint": "NODE-sequence.msql_id", + "data": { + "relpersistence": true + }, + "expected_sql_file": "alter_seq_set_unlogged.sql", + "expected_msql_file": "alter_seq_set_unlogged_msql.sql" + }, { + "type": "delete", + "name": "Drop unlogged sequence", + "endpoint": "NODE-sequence.delete_id", + "data": { + "name": "Seq1_$%{}[]()&*^!@\"'`\\/#" + } + } + ] + } + \ No newline at end of file diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py index c3f8154fd65..ed32c471f8f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_add.py @@ -17,6 +17,7 @@ from pgadmin.utils.route import BaseTestGenerator from regression import parent_node_dict from regression.python_test_utils import test_utils as utils +from pgadmin.utils import server_utils class SequenceAddTestCase(BaseTestGenerator): @@ -27,6 +28,7 @@ class SequenceAddTestCase(BaseTestGenerator): 'Create sequence with positive values', dict( url='/browser/sequence/obj/', + inventory_data={}, # Valid optional data data={ "cache": "1", @@ -44,6 +46,7 @@ class SequenceAddTestCase(BaseTestGenerator): 'Create sequence with negative values', dict( url='/browser/sequence/obj/', + inventory_data={}, # Valid optional data data={ "cache": "1", @@ -56,23 +59,54 @@ class SequenceAddTestCase(BaseTestGenerator): "start": "-30" } ) + ), + ( + 'Create unlogged sequence', + dict( + url='/browser/sequence/obj/', + inventory_data={ + "server_min_version": 150000, + "skip_msg": "Unlogged sequences is not supported by \ + PG/PPAS 15.0 and below" + }, + # Valid optional data + data={ + "cache": "1", + "cycled": True, + "increment": "1", + "maximum": "100000", + "minimum": "1", + "name": "test_sequence_add_%s" % (str(uuid.uuid4())[1:8]), + "securities": [], + "start": "100", + "relpersistence": True + } + ) ) ] def setUp(self): super().setUp() - def runTest(self): - """This function will add sequence(s) under schema node.""" - db_name = parent_node_dict["database"][-1]["db_name"] schema_info = parent_node_dict["schema"][-1] self.server_id = schema_info["server_id"] + + if "server_min_version" in self.inventory_data: + server_con = server_utils.connect_server(self, self.server_id) + if not server_con["info"] == "Server connected.": + raise Exception("Could not connect to server to add " + "sequence.") + if server_con["data"]["version"] < \ + self.inventory_data["server_min_version"]: + self.skipTest(self.inventory_data["skip_msg"]) + + db_name = parent_node_dict["database"][-1]["db_name"] self.db_id = schema_info["db_id"] db_con = database_utils.connect_database(self, utils.SERVER_GROUP, self.server_id, self.db_id) if not db_con['data']["connected"]: raise Exception("Could not connect to database to add sequence.") - schema_id = schema_info["schema_id"] + self.schema_id = schema_info["schema_id"] schema_name = schema_info["schema_name"] schema_response = schema_utils.verify_schemas(self.server, db_name, @@ -112,10 +146,12 @@ def runTest(self): self.data.update(common_data) + def runTest(self): + """This function will add sequence(s) under schema node.""" response = self.tester.post( self.url + str(utils.SERVER_GROUP) + '/' + str(self.server_id) + '/' + str(self.db_id) + - '/' + str(schema_id) + '/', + '/' + str(self.schema_id) + '/', data=json.dumps(self.data), content_type='html/json') self.assertEqual(response.status_code, 200) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py index 9360181d77a..7665f49a696 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/tests/test_sequence_put.py @@ -18,6 +18,7 @@ from regression import parent_node_dict from regression.python_test_utils import test_utils as utils from . import utils as sequence_utils +from pgadmin.utils import server_utils class SequencePutTestCase(BaseTestGenerator): @@ -27,6 +28,7 @@ class SequencePutTestCase(BaseTestGenerator): ('Alter positive sequence comment, increment, max and min value', dict( url='/browser/sequence/obj/', + inventory_data={}, data={ "comment": "This is sequence update comment", "increment": "5", @@ -38,6 +40,7 @@ class SequencePutTestCase(BaseTestGenerator): ('Alter negative sequence comment, increment, max and min value', dict( url='/browser/sequence/obj/', + inventory_data={}, data={ "comment": "This is sequence update comment", "increment": "-7", @@ -45,6 +48,19 @@ class SequencePutTestCase(BaseTestGenerator): "minimum": "-35", }, positive_seq=False + )), + ('Alter sequence set unlogged', + dict( + url='/browser/sequence/obj/', + inventory_data={ + "server_min_version": 150000, + "skip_msg": "Unlogged sequences is not \ + supported by PG/PPAS 15.0 and below" + }, + data={ + "relpersistence": True + }, + positive_seq=True )) ] @@ -53,6 +69,16 @@ def setUp(self): self.db_name = parent_node_dict["database"][-1]["db_name"] schema_info = parent_node_dict["schema"][-1] self.server_id = schema_info["server_id"] + + if "server_min_version" in self.inventory_data: + server_con = server_utils.connect_server(self, self.server_id) + if not server_con["info"] == "Server connected.": + raise Exception("Could not connect to server to add " + "sequence.") + if server_con["data"]["version"] < \ + self.inventory_data["server_min_version"]: + self.skipTest(self.inventory_data["skip_msg"]) + self.db_id = schema_info["db_id"] db_con = database_utils.connect_database(self, utils.SERVER_GROUP, self.server_id, self.db_id)