Fix handling of tie/datetime array types when adding columns to a table. Fixes #3079

This commit is contained in:
Harshal Dhumal
2018-03-02 11:51:53 +00:00
committed by Dave Page
parent 78e2ff4f56
commit 7cdb489a47
6 changed files with 193 additions and 7 deletions

View File

@@ -24,7 +24,7 @@ from regression.python_test_utils import test_utils as utils
class ColumnAddTestCase(BaseTestGenerator):
"""This class will add new column under table node."""
scenarios = [
('Add table Node URL', dict(url='/browser/column/obj/'))
('Add column Node URL', dict(url='/browser/column/obj/'))
]
def setUp(self):

View File

@@ -24,7 +24,7 @@ from . import utils as columns_utils
class ColumnDeleteTestCase(BaseTestGenerator):
"""This class will delete column under table node."""
scenarios = [
('Delete table Node URL', dict(url='/browser/column/obj/'))
('Delete column Node URL', dict(url='/browser/column/obj/'))
]
def setUp(self):

View File

@@ -0,0 +1,183 @@
##########################################################################
#
# pgAdmin 4 - PostgreSQL Tools
#
# Copyright (C) 2013 - 2018, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
import json
import uuid
from pgadmin.browser.server_groups.servers.databases.schemas.tables.tests \
import utils as tables_utils
from pgadmin.browser.server_groups.servers.databases.schemas.tests import \
utils as schema_utils
from pgadmin.browser.server_groups.servers.databases.tests import utils as \
database_utils
from pgadmin.utils.route import BaseTestGenerator
from regression import parent_node_dict
from regression.python_test_utils import test_utils as utils
from . import utils as columns_utils
try:
from urllib.parse import urlencode
except ImportError as e:
from urllib import urlencode
class ColumnMsqlTestCase(BaseTestGenerator):
"""This class will test msql route of column with various combinations."""
scenarios = [
('msql column change timestamp array length',
dict(
url='/browser/column/msql/',
data_type='timestamp(3) with time zone[]',
new_len=6,
expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN '
'{column} TYPE timestamp({len}) with time zone [];'
)),
('msql column change timestamp length',
dict(
url='/browser/column/msql/',
data_type='timestamp(4) with time zone',
new_len=7,
expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN '
'{column} TYPE timestamp({len}) with time zone ;'
)),
('msql column change numeric array precision',
dict(
url='/browser/column/msql/',
data_type='numeric(5,2)[]',
old_len=5,
new_precision=4,
expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN '
'{column} TYPE numeric ({len}, {precision})[];'
)),
('msql column change numeric precision',
dict(
url='/browser/column/msql/',
data_type='numeric(6,3)',
old_len=6,
new_precision=5,
expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN '
'{column} TYPE numeric ({len}, {precision});'
)),
('msql column change numeric array length',
dict(
url='/browser/column/msql/',
data_type='numeric(6,3)[]',
new_len=8,
old_precision=3,
expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN '
'{column} TYPE numeric ({len}, {precision})[];'
)),
('msql column change numeric length',
dict(
url='/browser/column/msql/',
data_type='numeric(6,4)',
new_len=8,
old_precision=4,
expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN '
'{column} TYPE numeric ({len}, {precision});'
)),
('msql column change numeric array len and precision',
dict(
url='/browser/column/msql/',
data_type='numeric(10,5)[]',
new_len=15,
new_precision=8,
expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN '
'{column} TYPE numeric ({len}, {precision})[];'
)),
('msql column change numeric len and precision',
dict(
url='/browser/column/msql/',
data_type='numeric(12,6)',
new_len=14,
new_precision=9,
expected_res='ALTER TABLE {schema}.{table}\n ALTER COLUMN '
'{column} TYPE numeric ({len}, {precision});'
))
]
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"]
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 a table.")
self.schema_id = schema_info["schema_id"]
self.schema_name = schema_info["schema_name"]
schema_response = schema_utils.verify_schemas(self.server,
self.db_name,
self.schema_name)
if not schema_response:
raise Exception("Could not find the schema to add a table.")
self.table_name = "table_column_%s" % (str(uuid.uuid4())[1:8])
self.table_id = tables_utils.create_table(self.server, self.db_name,
self.schema_name,
self.table_name)
self.column_name = "test_column_msql_%s" % (str(uuid.uuid4())[1:8])
self.column_id = columns_utils.create_column(self.server,
self.db_name,
self.schema_name,
self.table_name,
self.column_name,
self.data_type)
def runTest(self):
col_response = columns_utils.verify_column(self.server, self.db_name,
self.column_name)
if not col_response:
raise Exception("Could not find the column to update.")
data = {"attnum": self.column_id}
expected_len = None
expected_precision = None
if hasattr(self, 'new_len'):
data["attlen"] = self.new_len
expected_len = self.new_len
if hasattr(self, 'new_precision'):
data["attprecision"] = self.new_precision
expected_precision = self.new_precision
response = self.tester.get(
self.url + str(utils.SERVER_GROUP) + '/' +
str(self.server_id) + '/' +
str(self.db_id) + '/' +
str(self.schema_id) + '/' +
str(self.table_id) + '/' +
str(self.column_id) + '?' +
urlencode(data),
follow_redirects=True)
self.assertEquals(response.status_code, 200)
response_data = json.loads(response.data.decode('utf-8'))
if not expected_len and hasattr(self, 'old_len'):
expected_len = self.old_len
if not expected_precision and hasattr(self, 'old_precision'):
expected_precision = self.old_precision
self.assertEquals(response_data['data'],
self.expected_res.format(
**dict([('schema', self.schema_name),
('table', self.table_name),
('column', self.column_name),
('len', expected_len),
('precision', expected_precision)
]
)
))
def tearDown(self):
# Disconnect the database
database_utils.disconnect_database(self, self.server_id, self.db_id)

View File

@@ -25,7 +25,7 @@ from . import utils as columns_utils
class ColumnPutTestCase(BaseTestGenerator):
"""This class will update the column under table node."""
scenarios = [
('Put table Node URL', dict(url='/browser/column/obj/'))
('Put column Node URL', dict(url='/browser/column/obj/'))
]
def setUp(self):

View File

@@ -15,7 +15,8 @@ import traceback
from regression.python_test_utils import test_utils as utils
def create_column(server, db_name, schema_name, table_name, col_name):
def create_column(server, db_name, schema_name, table_name, col_name,
col_data_type='char'):
"""
This function creates a column under provided table.
:param server: server details
@@ -28,6 +29,8 @@ def create_column(server, db_name, schema_name, table_name, col_name):
:type table_name: str
:param col_name: column name
:type col_name: str
:param col_data_type: column data type
:type col_data_type: str
:return table_id: table id
:rtype: int
"""
@@ -41,8 +44,8 @@ def create_column(server, db_name, schema_name, table_name, col_name):
old_isolation_level = connection.isolation_level
connection.set_isolation_level(0)
pg_cursor = connection.cursor()
query = "ALTER TABLE %s.%s ADD COLUMN %s char" % \
(schema_name, table_name, col_name)
query = "ALTER TABLE %s.%s ADD COLUMN %s %s" % \
(schema_name, table_name, col_name, col_data_type)
pg_cursor.execute(query)
connection.set_isolation_level(old_isolation_level)
connection.commit()

View File

@@ -58,6 +58,6 @@ time({{ data.attlen }}) with time zone {% endif %}{% if o_data.hasSqrBracket %}[
{% if data.attlen and data.attlen != 'None' %}
({{ data.attlen }}{% elif o_data.attlen and o_data.attlen != 'None' %}({{ o_data.attlen }}{% endif %}{% if data.attprecision and data.attprecision != 'None' %}
, {{ data.attprecision }}){% elif o_data.attprecision and o_data.attprecision != 'None' %}, {{ o_data.attprecision }}){% else %}){% endif %}
{% endif %}
{% endif %}{% if o_data.hasSqrBracket %}[]{% endif %}
{% endif %}
{% endmacro %}