diff --git a/google/cloud/spanner_dbapi/cursor.py b/google/cloud/spanner_dbapi/cursor.py index 3569bab605..689ba8cf66 100644 --- a/google/cloud/spanner_dbapi/cursor.py +++ b/google/cloud/spanner_dbapi/cursor.py @@ -14,6 +14,8 @@ """Database cursor for Google Cloud Spanner DB-API.""" +import sqlparse + from google.api_core.exceptions import Aborted from google.api_core.exceptions import AlreadyExists from google.api_core.exceptions import FailedPrecondition @@ -174,9 +176,10 @@ def execute(self, sql, args=None): try: classification = parse_utils.classify_stmt(sql) if classification == parse_utils.STMT_DDL: - for ddl in sql.split(";"): - ddl = ddl.strip() + for ddl in sqlparse.split(sql): if ddl: + if ddl[-1] == ";": + ddl = ddl[:-1] self.connection._ddl_statements.append(ddl) if self.connection.autocommit: self.connection.run_prior_DDL_statements() diff --git a/google/cloud/spanner_dbapi/parse_utils.py b/google/cloud/spanner_dbapi/parse_utils.py index aa0e12d75d..d967330cea 100644 --- a/google/cloud/spanner_dbapi/parse_utils.py +++ b/google/cloud/spanner_dbapi/parse_utils.py @@ -199,7 +199,7 @@ def classify_stmt(query): def parse_insert(insert_sql, params): """ - Parse an INSERT statement an generate a list of tuples of the form: + Parse an INSERT statement and generate a list of tuples of the form: [ (SQL, params_per_row1), (SQL, params_per_row2), diff --git a/tests/unit/spanner_dbapi/test_cursor.py b/tests/unit/spanner_dbapi/test_cursor.py index 57a3375e49..789ca06695 100644 --- a/tests/unit/spanner_dbapi/test_cursor.py +++ b/tests/unit/spanner_dbapi/test_cursor.py @@ -941,6 +941,13 @@ def test_ddls_with_semicolon(self): EXP_DDLS = [ "CREATE TABLE table_name (row_id INT64) PRIMARY KEY ()", "DROP INDEX index_name", + ( + "CREATE TABLE papers (" + "\n id INT64," + "\n authors ARRAY," + '\n author_list STRING(MAX) AS (ARRAY_TO_STRING(authors, ";")) stored' + ") PRIMARY KEY (id)" + ), "DROP TABLE table_name", ] @@ -956,7 +963,12 @@ def test_ddls_with_semicolon(self): cursor.execute( "CREATE TABLE table_name (row_id INT64) PRIMARY KEY ();" "DROP INDEX index_name;\n" - "DROP TABLE table_name;" + "CREATE TABLE papers (" + "\n id INT64," + "\n authors ARRAY," + '\n author_list STRING(MAX) AS (ARRAY_TO_STRING(authors, ";")) stored' + ") PRIMARY KEY (id);" + "DROP TABLE table_name;", ) self.assertEqual(connection._ddl_statements, EXP_DDLS)