mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
Ensure we can properly update rows with upper-case primary key columns. Fixes #3105
This commit is contained in:
committed by
Dave Page
parent
4dc9fb146a
commit
96165044ae
@@ -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 -')
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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 %};
|
||||||
|
|||||||
Reference in New Issue
Block a user