This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new f7e28eec730 Fix stale cursor descriptions between SnowflakeHook runs
(#76163)
f7e28eec730 is described below
commit f7e28eec7309f5700ca69ec226df41a5c58d5213
Author: SameerMesiah97 <[email protected]>
AuthorDate: Sat Oct 31 21:03:42 2026 +0000
Fix stale cursor descriptions between SnowflakeHook runs (#76163)
Reset descriptions alongside query IDs at the start of each run().
Prevent repeated executions from retaining column metadata from earlier
calls.
Add a regression test verifying descriptions reflect only the latest
execution.
Co-authored-by: Sameer Mesiah <[email protected]>
---
.../airflow/providers/snowflake/hooks/snowflake.py | 1 +
.../tests/unit/snowflake/hooks/test_snowflake.py | 26 ++++++++++++++++++++++
2 files changed, 27 insertions(+)
diff --git
a/providers/snowflake/src/airflow/providers/snowflake/hooks/snowflake.py
b/providers/snowflake/src/airflow/providers/snowflake/hooks/snowflake.py
index 3d5434326c0..65249842203 100644
--- a/providers/snowflake/src/airflow/providers/snowflake/hooks/snowflake.py
+++ b/providers/snowflake/src/airflow/providers/snowflake/hooks/snowflake.py
@@ -1075,6 +1075,7 @@ class SnowflakeHook(DbApiHook):
from snowflake.connector import util_text
self.query_ids = []
+ self.descriptions = []
if isinstance(sql, str):
if split_statements:
diff --git a/providers/snowflake/tests/unit/snowflake/hooks/test_snowflake.py
b/providers/snowflake/tests/unit/snowflake/hooks/test_snowflake.py
index 9c1c40d9bd4..7c1fc8e5e17 100644
--- a/providers/snowflake/tests/unit/snowflake/hooks/test_snowflake.py
+++ b/providers/snowflake/tests/unit/snowflake/hooks/test_snowflake.py
@@ -39,6 +39,7 @@ from snowflake.connector.cursor import SnowflakeCursor
from airflow.models import Connection
from airflow.providers.common.compat.sdk import
AirflowOptionalProviderFeatureException, timezone
+from airflow.providers.common.sql.hooks.handlers import fetch_all_handler
from airflow.providers.snowflake.hooks.snowflake import SnowflakeHook,
_is_connector_5_or_later
if TYPE_CHECKING:
@@ -1173,6 +1174,31 @@ class TestPytestSnowflakeHook:
assert hook.query_ids == expected_query_ids
cur.close.assert_called()
+ @mock.patch(
+
"airflow.providers.snowflake.hooks.snowflake.SnowflakeHook._has_autocommit_session_parameter",
+ return_value=False,
+ )
+
@mock.patch("airflow.providers.snowflake.hooks.snowflake.SnowflakeHook.get_conn")
+ def test_run_resets_descriptions_between_calls(self, mock_conn,
mock_has_autocommit):
+ hook = SnowflakeHook()
+ conn = mock_conn.return_value
+ cur = mock.MagicMock(rowcount=0)
+ conn.cursor.return_value = cur
+ cur.fetchall.return_value = [(1,)]
+
+ first_description = [("first_column", None, None, None, None, None,
None)]
+ second_description = [("second_column", None, None, None, None, None,
None)]
+
+ cur.description = first_description
+ hook.run(["SELECT 1 AS first_column"], handler=fetch_all_handler)
+
+ assert hook.descriptions == [first_description]
+
+ cur.description = second_description
+ hook.run(["SELECT 1 AS second_column"], handler=fetch_all_handler)
+
+ assert hook.descriptions == [second_description]
+
@mock.patch("airflow.providers.common.sql.hooks.sql.DbApiHook.get_first")
def test_connection_success(self, mock_get_first):
with mock.patch.dict(