Fixed an issue when the user creates a temporary table with 'on commit drop as' clause. Fixes #4946

pull/29/head
Amol Vyavahare 2020-04-20 18:22:34 +05:30 committed by Akshay Joshi
parent 4692b21bcf
commit f282b26883
3 changed files with 66 additions and 27 deletions

View File

@ -44,6 +44,7 @@ Bug fixes
| `Issue #4858 <https://redmine.postgresql.org/issues/4858>`_ - Fixed python exception error when user tries to download the CSV and there is a connection issue.
| `Issue #4864 <https://redmine.postgresql.org/issues/4864>`_ - Make the configuration window in runtime to auto-resize.
| `Issue #4873 <https://redmine.postgresql.org/issues/4873>`_ - Fixed an issue when changing the comments of the procedure with arguments gives error in case of overloading.
| `Issue #4946 <https://redmine.postgresql.org/issues/4946>`_ - Fixed an issue when the user creates a temporary table with 'on commit drop as' clause.
| `Issue #4957 <https://redmine.postgresql.org/issues/4957>`_ - Ensure that Constraint Trigger, Deferrable, Deferred option should be disabled when the user selects EDB-SPL function for the trigger.
| `Issue #4969 <https://redmine.postgresql.org/issues/4969>`_ - Fixed an issue where changing the values of columns with JSONB or JSON types to NULL.
| `Issue #5007 <https://redmine.postgresql.org/issues/5007>`_ - Ensure index dropdown should have existing indexes while creating unique constraints.

View File

@ -71,7 +71,8 @@ def is_query_resultset_updatable(conn, sql_path):
table_oid=table_oid,
sql_path=sql_path)
is_resultset_updatable = has_oids or primary_keys is not None
is_resultset_updatable = has_oids or (primary_keys is not None and
len(primary_keys) != 0)
if is_resultset_updatable:
column_types = get_columns_types(columns_info=columns_info,
@ -114,6 +115,8 @@ def _check_editable_columns(table_columns, results_columns):
results_column['is_editable'] = False
elif table_column_number in table_columns_numbers: # Duplicate
results_column['is_editable'] = False
elif table_column_number not in table_columns:
results_column['is_editable'] = False
elif results_column['display_name'] \
!= table_columns[table_column_number]:
results_column['is_editable'] = False

View File

@ -17,6 +17,7 @@ from regression import parent_node_dict
from regression.python_test_utils import test_utils as utils
from pgadmin.tools.sqleditor.tests.execute_query_test_utils \
import execute_query
from datetime import date
class TestQueryUpdatableResultset(BaseTestGenerator):
@ -24,7 +25,7 @@ class TestQueryUpdatableResultset(BaseTestGenerator):
result-set is updatable. """
scenarios = [
('When selecting all columns of the table', dict(
sql='SELECT * FROM %s;',
sql='SELECT * FROM {0};',
expected_primary_keys={
'pk_col1': 'int4',
'pk_col2': 'int4'
@ -34,7 +35,7 @@ class TestQueryUpdatableResultset(BaseTestGenerator):
expected_cols_is_editable=[True, True, True, True]
)),
('When selecting all primary keys of the table', dict(
sql='SELECT pk_col1, pk_col2 FROM %s;',
sql='SELECT pk_col1, pk_col2 FROM {0};',
expected_primary_keys={
'pk_col1': 'int4',
'pk_col2': 'int4'
@ -44,28 +45,28 @@ class TestQueryUpdatableResultset(BaseTestGenerator):
expected_cols_is_editable=[True, True]
)),
('When selecting some of the primary keys of the table', dict(
sql='SELECT pk_col2 FROM %s;',
sql='SELECT pk_col2 FROM {0};',
expected_primary_keys=None,
expected_has_oids=False,
table_has_oids=False,
expected_cols_is_editable=[False]
)),
('When selecting none of the primary keys of the table', dict(
sql='SELECT normal_col1 FROM %s;',
sql='SELECT normal_col1 FROM {0};',
expected_primary_keys=None,
expected_has_oids=False,
table_has_oids=False,
expected_cols_is_editable=[False]
)),
('When renaming a primary key', dict(
sql='SELECT pk_col1 as some_col, pk_col2 FROM "%s";',
sql='SELECT pk_col1 as some_col, pk_col2 FROM "{0}";',
expected_primary_keys=None,
expected_has_oids=False,
table_has_oids=False,
expected_cols_is_editable=[False, False]
)),
('When renaming a normal column', dict(
sql='SELECT pk_col1, pk_col2, normal_col1 as some_col FROM "%s";',
sql='SELECT pk_col1, pk_col2, normal_col1 as some_col FROM "{0}";',
expected_primary_keys={
'pk_col1': 'int4',
'pk_col2': 'int4'
@ -75,7 +76,7 @@ class TestQueryUpdatableResultset(BaseTestGenerator):
expected_cols_is_editable=[True, True, False]
)),
('When renaming a normal column to a primary key name', dict(
sql='SELECT normal_col1 as pk_col1, pk_col1, pk_col2 FROM %s;',
sql='SELECT normal_col1 as pk_col1, pk_col1, pk_col2 FROM {0};',
expected_primary_keys={
'pk_col1': 'int4',
'pk_col2': 'int4'
@ -85,7 +86,7 @@ class TestQueryUpdatableResultset(BaseTestGenerator):
expected_cols_is_editable=[False, True, True]
)),
('When selecting a normal column twice', dict(
sql='SELECT pk_col1, pk_col2, normal_col1, normal_col1 FROM %s;',
sql='SELECT pk_col1, pk_col2, normal_col1, normal_col1 FROM {0};',
expected_primary_keys={
'pk_col1': 'int4',
'pk_col2': 'int4'
@ -95,17 +96,16 @@ class TestQueryUpdatableResultset(BaseTestGenerator):
expected_cols_is_editable=[True, True, True, False]
)),
('When selecting a non-table column', dict(
sql='SELECT pk_col1, pk_col2, normal_col1 || normal_col2 FROM %s;',
expected_primary_keys={
'pk_col1': 'int4',
'pk_col2': 'int4'
},
expected_has_oids=False,
table_has_oids=False,
expected_cols_is_editable=[True, True, False]
)),
sql='SELECT pk_col1, pk_col2, normal_col1 || normal_col2 FROM {0};',
expected_primary_keys={'pk_col1': 'int4',
'pk_col2': 'int4'
},
expected_has_oids=False,
table_has_oids=False,
expected_cols_is_editable=[True, True, False]
)),
('When selecting primary keys and oids (table with oids)', dict(
sql='SELECT *, oid FROM %s;',
sql='SELECT *, oid FROM {0};',
expected_primary_keys={
'pk_col1': 'int4',
'pk_col2': 'int4'
@ -115,7 +115,7 @@ class TestQueryUpdatableResultset(BaseTestGenerator):
expected_cols_is_editable=[True, True, True, True, False]
)),
('When selecting oids without primary keys (table with oids)', dict(
sql='SELECT oid, normal_col1, normal_col2 FROM %s;',
sql='SELECT oid, normal_col1, normal_col2 FROM {0};',
expected_primary_keys=None,
expected_has_oids=True,
table_has_oids=True,
@ -123,7 +123,7 @@ class TestQueryUpdatableResultset(BaseTestGenerator):
)),
('When selecting none of the primary keys or oids (table with oids)',
dict(
sql='SELECT normal_col1, normal_col2 FROM %s;',
sql='SELECT normal_col1, normal_col2 FROM {0};',
expected_primary_keys=None,
expected_has_oids=False,
table_has_oids=True,
@ -132,6 +132,8 @@ class TestQueryUpdatableResultset(BaseTestGenerator):
]
def setUp(self):
self.test_table_name = "test_for_updatable_resultset" + \
str(random.randint(1000, 9999))
self._initialize_database_connection()
self._initialize_query_tool()
self._initialize_urls()
@ -148,7 +150,7 @@ class TestQueryUpdatableResultset(BaseTestGenerator):
database_utils.disconnect_database(self, self.server_id, self.db_id)
def _execute_select_sql(self):
sql = self.sql % self.test_table_name
sql = self.sql.format(self.test_table_name)
is_success, response_data = \
execute_query(tester=self.tester,
query=sql,
@ -211,19 +213,17 @@ class TestQueryUpdatableResultset(BaseTestGenerator):
self.poll_url = '/sqleditor/poll/{0}'.format(self.trans_id)
def _create_test_table(self, table_has_oids=False):
self.test_table_name = "test_for_updatable_resultset" + \
str(random.randint(1000, 9999))
create_sql = """
DROP TABLE IF EXISTS "%s";
DROP TABLE IF EXISTS {0};
CREATE TABLE "%s"(
CREATE TABLE {0}(
pk_col1 SERIAL,
pk_col2 SERIAL,
normal_col1 VARCHAR,
normal_col2 VARCHAR,
PRIMARY KEY(pk_col1, pk_col2)
)
""" % (self.test_table_name, self.test_table_name)
""".format(self.test_table_name)
if table_has_oids:
create_sql += ' WITH OIDS;'
@ -231,3 +231,38 @@ class TestQueryUpdatableResultset(BaseTestGenerator):
create_sql += ';'
utils.create_table_with_query(self.server, self.db_name, create_sql)
class TestTemporaryTable(TestQueryUpdatableResultset):
""" This class will test the query result-set for temporary tables """
scenarios = [
('When selecting all columns of the Temporary table, on commit drop',
dict(sql='''
DROP TABLE IF EXISTS {0};
CREATE TEMPORARY TABLE {0} ON COMMIT DROP AS
SELECT
CURRENT_DATE AS today;
SELECT * FROM {0};''',
expected_primary_keys=None,
expected_results_column_data=[[date.today().strftime(
"%Y-%m-%d")]],
expected_has_oids=False,
expected_results_column_is_editable=False,
table_has_oids=False,
expected_cols_is_editable=[False]
))
]
def runTest(self):
response_data = self._execute_select_sql()
self._check_primary_keys(response_data)
self._check_oids(response_data)
# Verifying Temporary table result data on Commit Drop
self._check_results_column_data(response_data)
self._check_editable_columns(response_data)
def _check_results_column_data(self, response_data):
results_column_data = response_data['data']['result']
for result_data, expected_is_editable in \
zip(results_column_data, self.expected_results_column_data):
self.assertEquals(result_data, expected_is_editable)