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(

Reply via email to