Ensure we can properly update rows with upper-case primary key columns. Fixes #3105

This commit is contained in:
Murtuza Zabuawala
2018-02-19 11:37:31 +00:00
committed by Dave Page
parent 4dc9fb146a
commit 96165044ae
4 changed files with 40 additions and 31 deletions

View File

@@ -54,9 +54,9 @@ class CheckForViewDataTest(BaseFeatureTest):
# query for creating 'defaults_text' table # query for creating 'defaults_text' table
defaults_query = """ defaults_query = """
CREATE TABLE public.defaults CREATE TABLE public.defaults_{0}
( (
id serial NOT NULL, {1} serial NOT NULL,
number_defaults numeric(100) DEFAULT 1, number_defaults numeric(100) DEFAULT 1,
number_null numeric(100), number_null numeric(100),
text_defaults text COLLATE pg_catalog."default" text_defaults text COLLATE pg_catalog."default"
@@ -77,7 +77,7 @@ CREATE TABLE public.defaults
int_arr_empty integer[], int_arr_empty integer[],
boolean_arr boolean[], boolean_arr boolean[],
boolean_arr_null boolean[], boolean_arr_null boolean[],
CONSTRAINT defaults_pkey PRIMARY KEY (id) CONSTRAINT defaults_pkey_{0} PRIMARY KEY ({1})
) )
""" """
@@ -100,10 +100,12 @@ CREATE TABLE public.defaults
test_utils.create_database(self.server, "acceptance_test_db") test_utils.create_database(self.server, "acceptance_test_db")
# Create pre-requisite table # Create pre-requisite table
test_utils.create_table_with_query( for k, v in { 1: 'id', 2:'"ID"' }.items():
self.server, test_utils.create_table_with_query(
"acceptance_test_db", self.server,
CheckForViewDataTest.defaults_query) "acceptance_test_db",
CheckForViewDataTest.defaults_query.format(k, v))
# Initialize an instance of WebDriverWait with timeout of 3 seconds # Initialize an instance of WebDriverWait with timeout of 3 seconds
self.wait = WebDriverWait(self.driver, 3) self.wait = WebDriverWait(self.driver, 3)
@@ -111,18 +113,20 @@ CREATE TABLE public.defaults
self.page.wait_for_spinner_to_disappear() self.page.wait_for_spinner_to_disappear()
self.page.add_server(self.server) self.page.add_server(self.server)
self._tables_node_expandable() self._tables_node_expandable()
self.page.select_tree_item('defaults') # iterate on both tables
# Open Object -> View/Edit data for cnt in (1,2):
self._view_data_grid() self.page.select_tree_item('defaults_{0}'.format(str(cnt)))
# Open Object -> View/Edit data
self._view_data_grid()
self.page.wait_for_query_tool_loading_indicator_to_disappear() self.page.wait_for_query_tool_loading_indicator_to_disappear()
# Run test to insert a new row in table with default values # Run test to insert a new row in table with default values
self._add_row() self._add_row()
self._verify_row_data(True) self._verify_row_data(True)
# Run test to copy/paste a row # Run test to copy/paste a row
self._copy_paste_row() self._copy_paste_row()
self.page.close_data_grid() self.page.close_data_grid()
def after(self): def after(self):
self.page.remove_server(self.server) self.page.remove_server(self.server)
@@ -235,7 +239,7 @@ CREATE TABLE public.defaults
self.page.driver.find_element_by_link_text("View/Edit Data") self.page.driver.find_element_by_link_text("View/Edit Data")
).perform() ).perform()
self.page.find_by_partial_link_text("All Rows").click() self.page.find_by_partial_link_text("All Rows").click()
time.sleep(1)
# wait until datagrid frame is loaded. # wait until datagrid frame is loaded.
self.page.click_tab('Edit Data -') self.page.click_tab('Edit Data -')

View File

@@ -529,12 +529,17 @@ def start_query_tool(trans_id):
trans_id: unique transaction id trans_id: unique transaction id
""" """
sql = extract_sql_from_network_parameters(request.data, request.args, request.form) sql = extract_sql_from_network_parameters(
request.data, request.args, request.form
)
return StartRunningQuery(blueprint, current_app).execute(sql, trans_id, session) return StartRunningQuery(blueprint, current_app).execute(
sql, trans_id, session
)
def extract_sql_from_network_parameters(request_data, request_arguments, request_form_data): def extract_sql_from_network_parameters(request_data, request_arguments,
request_form_data):
if request_data: if request_data:
sql_parameters = json.loads(request_data, encoding='utf-8') sql_parameters = json.loads(request_data, encoding='utf-8')
if type(sql_parameters) is str: if type(sql_parameters) is str:
@@ -741,15 +746,17 @@ def poll(trans_id):
typname == 'character varying' typname == 'character varying'
): ):
typname = typname + '(' + \ typname = typname + '(' + \
str(col_info['internal_size']) + \ str(
')' col_info['internal_size']
) + ')'
elif ( elif (
typname == 'character[]' or typname == 'character[]' or
typname == 'character varying[]' typname == 'character varying[]'
): ):
typname = typname[:-2] + '(' + \ typname = typname[:-2] + '(' + \
str(col_info['internal_size']) + \ str(
')[]' col_info['internal_size']
) + ')[]'
col_info['type_name'] = typname col_info['type_name'] = typname

View File

@@ -533,8 +533,7 @@ class TableCommand(GridCommand):
for each_col in columns_info: for each_col in columns_info:
if ( if (
columns_info[each_col]['not_null'] and columns_info[each_col]['not_null'] and
not columns_info[each_col][ not columns_info[each_col]['has_default_val']
'has_default_val']
): ):
column_data[each_col] = None column_data[each_col] = None
column_type[each_col] =\ column_type[each_col] =\
@@ -595,8 +594,7 @@ class TableCommand(GridCommand):
"/".join([self.sql_path, 'select.sql']), "/".join([self.sql_path, 'select.sql']),
object_name=self.object_name, object_name=self.object_name,
nsp_name=self.nsp_name, nsp_name=self.nsp_name,
pk_names=pk_names.split(",") if pk_names primary_keys=primary_keys,
else None,
has_oids=has_oids has_oids=has_oids
) )

View File

@@ -3,7 +3,7 @@ SELECT {% if has_oids %}oid, {% endif %}* FROM {{ conn|qtIdent(nsp_name, object_
WHERE WHERE
{% if has_oids %} {% if has_oids %}
oid = %(oid)s oid = %(oid)s
{% elif pk_names %} {% elif primary_keys|length > 0 %}
{% for pk in pk_names %} {% for pk in primary_keys %}
{% if not loop.first %} AND {% endif %}{{ conn|qtIdent(pk) }} = %({{ pk }})s{% endfor %} {% if not loop.first %} AND {% endif %}{{ conn|qtIdent(pk) }} = %({{ pk }})s{% endfor %}
{% endif %}; {% endif %};