diff --git a/google/cloud/spanner_dbapi/parse_utils.py b/google/cloud/spanner_dbapi/parse_utils.py index 082074251c..9ac6f3d41a 100644 --- a/google/cloud/spanner_dbapi/parse_utils.py +++ b/google/cloud/spanner_dbapi/parse_utils.py @@ -224,11 +224,11 @@ def parse_insert(insert_sql, params): } Case b) - SQL: 'INSERT INTO T (s, c) SELECT st, zc FROM cus ORDER BY fn, ln', + SQL: 'INSERT INTO T (s, c) SELECT st, zc FROM cus WHERE col IN (%s, %s)', it produces: { 'sql_params_list': [ - ('INSERT INTO T (s, c) SELECT st, zc FROM cus ORDER BY fn, ln', None), + ('INSERT INTO T (s, c) SELECT st, zc FROM cus ORDER BY fn, ln', ('a', 'b')), ] } @@ -276,7 +276,7 @@ def parse_insert(insert_sql, params): if not after_values_sql: # Case b) insert_sql = sanitize_literals_for_upload(insert_sql) - return {"sql_params_list": [(insert_sql, None)]} + return {"sql_params_list": [(insert_sql, params)]} if not params: # Case a) perhaps? diff --git a/tests/unit/spanner_dbapi/test_parse_utils.py b/tests/unit/spanner_dbapi/test_parse_utils.py index 3713ac11a8..c37c6044c6 100644 --- a/tests/unit/spanner_dbapi/test_parse_utils.py +++ b/tests/unit/spanner_dbapi/test_parse_utils.py @@ -425,3 +425,19 @@ def test_escape_name(self): with self.subTest(name=name): got = escape_name(name) self.assertEqual(got, want) + + def test_insert_from_select(self): + """Check that INSERT from SELECT clause can be executed with arguments.""" + from google.cloud.spanner_dbapi.parse_utils import parse_insert + + SQL = """ +INSERT INTO tab_name (id, data) +SELECT tab_name.id + %s AS anon_1, tab_name.data +FROM tab_name +WHERE tab_name.data IN (%s, %s) +""" + ARGS = [5, "data2", "data3"] + + self.assertEqual( + parse_insert(SQL, ARGS), {"sql_params_list": [(SQL, ARGS)]}, + )