Ensure sequence with negative value should be created. Fixes #4726

This commit is contained in:
Akshay Joshi 2019-09-12 14:18:30 +05:30
parent 31653aef70
commit 7944e75695
16 changed files with 223 additions and 20 deletions

View File

@ -52,4 +52,5 @@ Bug fixes
| `Issue #4674 <https://redmine.postgresql.org/issues/4674>`_ - Fix query tool launch error if user name contain html characters. | `Issue #4674 <https://redmine.postgresql.org/issues/4674>`_ - Fix query tool launch error if user name contain html characters.
| `Issue #4681 <https://redmine.postgresql.org/issues/4681>`_ - Increase cache control max age for static files to improve performance over longer run. | `Issue #4681 <https://redmine.postgresql.org/issues/4681>`_ - Increase cache control max age for static files to improve performance over longer run.
| `Issue #4702 <https://redmine.postgresql.org/issues/4702>`_ - Fix modified SQL for Index when reset the value of Fill factor and Clustered?. | `Issue #4702 <https://redmine.postgresql.org/issues/4702>`_ - Fix modified SQL for Index when reset the value of Fill factor and Clustered?.
| `Issue #4703 <https://redmine.postgresql.org/issues/4703>`_ - Fix reversed engineered SQL for btree Index when provided sort order and NULLs. | `Issue #4703 <https://redmine.postgresql.org/issues/4703>`_ - Fix reversed engineered SQL for btree Index when provided sort order and NULLs.
| `Issue #4726 <https://redmine.postgresql.org/issues/4726>`_ - Ensure sequence with negative value should be created.

View File

@ -137,7 +137,6 @@ define('pgadmin.node.sequence', [
},{ },{
id: 'increment', label: gettext('Increment'), type: 'int', id: 'increment', label: gettext('Increment'), type: 'int',
mode: ['properties', 'create', 'edit'], group: gettext('Definition'), mode: ['properties', 'create', 'edit'], group: gettext('Definition'),
min: 1,
},{ },{
id: 'start', label: gettext('Start'), type: 'int', id: 'start', label: gettext('Start'), type: 'int',
mode: ['properties', 'create'], group: gettext('Definition'), mode: ['properties', 'create'], group: gettext('Definition'),

View File

@ -1,14 +1,14 @@
CREATE SEQUENCE {{ conn|qtIdent(data.schema, data.name) }}{% if data.increment is defined and data.cycled %} CREATE SEQUENCE {{ conn|qtIdent(data.schema, data.name) }}{% if data.increment is defined and data.cycled %}
CYCLE{% endif %}{% if data.increment is defined and data.increment|int(-1) > -1 %} CYCLE{% endif %}{% if data.increment is defined %}
INCREMENT {{data.increment|int}}{% endif %}{% if data.start is defined and data.start|int(-1) > -1%} INCREMENT {{data.increment|int}}{% endif %}{% if data.start is defined %}
START {{data.start|int}}{% elif data.current_value is defined and data.current_value|int(-1) > -1%} START {{data.start|int}}{% elif data.current_value is defined %}
START {{data.current_value|int}}{% endif %}{% if data.minimum is defined and data.minimum|int(-1) > -1%} START {{data.current_value|int}}{% endif %}{% if data.minimum is defined %}
MINVALUE {{data.minimum|int}}{% endif %}{% if data.maximum is defined and data.maximum|int(-1) > -1%} 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%} MAXVALUE {{data.maximum|int}}{% endif %}{% if data.cache is defined and data.cache|int(-1) > -1%}

View File

@ -0,0 +1,13 @@
-- SEQUENCE: public."Seq1_$%{}[]()&*^!@""'`\/#"
-- DROP SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#";
CREATE SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
INCREMENT -7
START -30
MINVALUE -35
MAXVALUE -15
CACHE 1;
ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
OWNER TO postgres;

View File

@ -0,0 +1,4 @@
ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
INCREMENT -7
MINVALUE -35
MAXVALUE -15;

View File

@ -0,0 +1,13 @@
-- SEQUENCE: public."Seq1_$%{}[]()&*^!@""'`\/#"
-- DROP SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#";
CREATE SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
INCREMENT -5
START -30
MINVALUE -40
MAXVALUE -10
CACHE 1;
ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
OWNER TO postgres;

View File

@ -0,0 +1,9 @@
CREATE SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
INCREMENT -5
START -30
MINVALUE -40
MAXVALUE -10
CACHE 1;
ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
OWNER TO postgres;

View File

@ -122,13 +122,52 @@
}, },
"expected_sql_file": "alter_seq_privs_remove.sql", "expected_sql_file": "alter_seq_privs_remove.sql",
"expected_msql_file": "alter_seq_privs_remove_msql.sql" "expected_msql_file": "alter_seq_privs_remove_msql.sql"
},{ }, {
"type": "delete", "type": "delete",
"name": "Drop sequence", "name": "Drop sequence",
"endpoint": "NODE-sequence.delete_id", "endpoint": "NODE-sequence.delete_id",
"data": { "data": {
"name": "Seq1_$%{}[]()&*^!@\"'`\\/#" "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_$%{}[]()&*^!@\"'`\\/#"
}
} }
] ]
} }

View File

@ -0,0 +1,13 @@
-- SEQUENCE: public."Seq1_$%{}[]()&*^!@""'`\/#"
-- DROP SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#";
CREATE SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
INCREMENT -7
START -30
MINVALUE -35
MAXVALUE -15
CACHE 1;
ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
OWNER TO enterprisedb;

View File

@ -0,0 +1,4 @@
ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
INCREMENT -7
MINVALUE -35
MAXVALUE -15;

View File

@ -0,0 +1,13 @@
-- SEQUENCE: public."Seq1_$%{}[]()&*^!@""'`\/#"
-- DROP SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#";
CREATE SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
INCREMENT -5
START -30
MINVALUE -40
MAXVALUE -10
CACHE 1;
ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
OWNER TO enterprisedb;

View File

@ -0,0 +1,9 @@
CREATE SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
INCREMENT -5
START -30
MINVALUE -40
MAXVALUE -10
CACHE 1;
ALTER SEQUENCE public."Seq1_$%{}[]()&*^!@""'`\/#"
OWNER TO enterprisedb;

View File

@ -122,13 +122,52 @@
}, },
"expected_sql_file": "alter_seq_privs_remove.sql", "expected_sql_file": "alter_seq_privs_remove.sql",
"expected_msql_file": "alter_seq_privs_remove_msql.sql" "expected_msql_file": "alter_seq_privs_remove_msql.sql"
},{ }, {
"type": "delete", "type": "delete",
"name": "Drop sequence", "name": "Drop sequence",
"endpoint": "NODE-sequence.delete_id", "endpoint": "NODE-sequence.delete_id",
"data": { "data": {
"name": "Seq1_$%{}[]()&*^!@\"'`\\/#" "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_$%{}[]()&*^!@\"'`\\/#"
}
} }
] ]
} }

View File

@ -25,7 +25,7 @@ class SequenceAddTestCase(BaseTestGenerator):
scenarios = [ scenarios = [
# Fetching default URL for sequence node. # Fetching default URL for sequence node.
( (
'Fetch sequence Node URL (valid optional data)', 'Create sequence with positive values',
dict( dict(
url='/browser/sequence/obj/', url='/browser/sequence/obj/',
# Valid optional data # Valid optional data
@ -40,6 +40,23 @@ class SequenceAddTestCase(BaseTestGenerator):
"start": "100" "start": "100"
} }
) )
),
(
'Create sequence with negative values',
dict(
url='/browser/sequence/obj/',
# Valid optional data
data={
"cache": "1",
"cycled": True,
"increment": "-5",
"maximum": "-10",
"minimum": "-40",
"name": "test_sequence_add_%s" % (str(uuid.uuid4())[1:8]),
"securities": [],
"start": "-30"
}
)
) )
] ]

View File

@ -25,7 +25,28 @@ class SequencePutTestCase(BaseTestGenerator):
skip_on_database = ['gpdb'] skip_on_database = ['gpdb']
scenarios = [ scenarios = [
# Fetching default URL for sequence node. # Fetching default URL for sequence node.
('Fetch sequence Node URL', dict(url='/browser/sequence/obj/')) ('Alter positive sequence comment, increment, max and min value',
dict(
url='/browser/sequence/obj/',
data={
"comment": "This is sequence update comment",
"increment": "5",
"maximum": "1000",
"minimum": "10",
},
positive_seq=True
)),
('Alter negative sequence comment, increment, max and min value',
dict(
url='/browser/sequence/obj/',
data={
"comment": "This is sequence update comment",
"increment": "-7",
"maximum": "-15",
"minimum": "-35",
},
positive_seq=False
))
] ]
def setUp(self): def setUp(self):
@ -47,7 +68,9 @@ class SequencePutTestCase(BaseTestGenerator):
raise Exception("Could not find the schema to add sequence.") raise Exception("Could not find the schema to add sequence.")
self.sequence_name = "test_sequence_delete_%s" % str(uuid.uuid4())[1:8] self.sequence_name = "test_sequence_delete_%s" % str(uuid.uuid4())[1:8]
self.sequence_id = sequence_utils.create_sequences( self.sequence_id = sequence_utils.create_sequences(
self.server, self.db_name, self.schema_name, self.sequence_name) self.server, self.db_name, self.schema_name, self.sequence_name,
self.positive_seq
)
def runTest(self): def runTest(self):
"""This function will update added sequence under schema node.""" """This function will update added sequence under schema node."""
@ -56,17 +79,17 @@ class SequencePutTestCase(BaseTestGenerator):
self.sequence_name) self.sequence_name)
if not sequence_response: if not sequence_response:
raise Exception("Could not find the sequence to delete.") raise Exception("Could not find the sequence to delete.")
data = {
"comment": "This is sequence update comment", # Add sequence id.
"id": self.sequence_id self.data["id"] = self.sequence_id
}
response = self.tester.put( response = self.tester.put(
self.url + str(utils.SERVER_GROUP) + '/' + self.url + str(utils.SERVER_GROUP) + '/' +
str(self.server_id) + '/' + str(self.server_id) + '/' +
str(self.db_id) + '/' + str(self.db_id) + '/' +
str(self.schema_id) + '/' + str(self.schema_id) + '/' +
str(self.sequence_id), str(self.sequence_id),
data=json.dumps(data), data=json.dumps(self.data),
follow_redirects=True) follow_redirects=True)
self.assertEquals(response.status_code, 200) self.assertEquals(response.status_code, 200)

View File

@ -15,7 +15,8 @@ import traceback
from regression.python_test_utils import test_utils as utils from regression.python_test_utils import test_utils as utils
def create_sequences(server, db_name, schema_name, sequence_name): def create_sequences(server, db_name, schema_name, sequence_name,
positive_seq=True):
""" """
This function used to create sequence in schema provided. This function used to create sequence in schema provided.
:param server: server details :param server: server details
@ -26,6 +27,8 @@ def create_sequences(server, db_name, schema_name, sequence_name):
:type schema_name: str :type schema_name: str
:param sequence_name: sequence name :param sequence_name: sequence name
:type sequence_name: str :type sequence_name: str
:param positive_seq: True is sequence will be created using positive values
:type positive_seq: boolean
:return sequence_id: sequence id :return sequence_id: sequence id
:rtype: int :rtype: int
""" """
@ -37,8 +40,12 @@ def create_sequences(server, db_name, schema_name, sequence_name):
server['port'], server['port'],
server['sslmode']) server['sslmode'])
pg_cursor = connection.cursor() pg_cursor = connection.cursor()
query = "CREATE SEQUENCE %s.%s START 101" % (schema_name,
sequence_name) query = "CREATE SEQUENCE %s.%s INCREMENT 5 START 30 " \
"MINVALUE 10 MAXVALUE 100" % (schema_name, sequence_name)
if not positive_seq:
query = "CREATE SEQUENCE %s.%s INCREMENT -5 START -30 " \
"MINVALUE -40 MAXVALUE -10" % (schema_name, sequence_name)
pg_cursor.execute(query) pg_cursor.execute(query)
connection.commit() connection.commit()
# Get 'oid' from newly created sequence # Get 'oid' from newly created sequence