Fixed an issue when the user creates a temporary table with 'on commit drop as' clause. Fixes #4946
parent
4692b21bcf
commit
f282b26883
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue