From e5c165c375df10dcb0f7e2fcf1e6ff0ced50b498 Mon Sep 17 00:00:00 2001 From: Dmytro Kazanzhy Date: Thu, 19 May 2022 01:37:45 +0300 Subject: [PATCH] Fix UnboundLocalError when sql is empty list in SnowflakeHook --- airflow/providers/snowflake/hooks/snowflake.py | 14 +++++++++----- tests/providers/snowflake/hooks/test_snowflake.py | 8 ++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/airflow/providers/snowflake/hooks/snowflake.py b/airflow/providers/snowflake/hooks/snowflake.py index 75ddaa59de089..29a4b63156c6d 100644 --- a/airflow/providers/snowflake/hooks/snowflake.py +++ b/airflow/providers/snowflake/hooks/snowflake.py @@ -308,14 +308,18 @@ def run( """ self.query_ids = [] + if isinstance(sql, str): + split_statements_tuple = split_statements(StringIO(sql)) + sql = [sql_string for sql_string, _ in split_statements_tuple if sql_string] + + if sql: + self.log.debug("Executing %d statements against Snowflake DB", len(sql)) + else: + raise ValueError("List of SQL statements is empty") + with closing(self.get_conn()) as conn: self.set_autocommit(conn, autocommit) - if isinstance(sql, str): - split_statements_tuple = split_statements(StringIO(sql)) - sql = [sql_string for sql_string, _ in split_statements_tuple if sql_string] - - self.log.debug("Executing %d statements against Snowflake DB", len(sql)) # SnowflakeCursor does not extend ContextManager, so we have to ignore mypy error here with closing(conn.cursor(DictCursor)) as cur: # type: ignore[type-var] diff --git a/tests/providers/snowflake/hooks/test_snowflake.py b/tests/providers/snowflake/hooks/test_snowflake.py index 74c6fb03e1cd0..97935e66f5ba7 100644 --- a/tests/providers/snowflake/hooks/test_snowflake.py +++ b/tests/providers/snowflake/hooks/test_snowflake.py @@ -515,3 +515,11 @@ def test_connection_failure(self, mock_run): assert status is False assert msg == 'Connection Errors' mock_run.assert_called_once_with(sql='select 1') + + def test_empty_sql_parameter(self): + hook = SnowflakeHook() + + for empty_statement in ([], '', '\n'): + with pytest.raises(ValueError) as err: + hook.run(sql=empty_statement) + assert err.value.args[0] == "List of SQL statements is empty"