Skip to content

Commit 22c94b0

Browse files
committed
fix: Handle empty query in execute_snowflake_statement
Signed-off-by: Jia Le <5955220+jials@users.noreply.github.com>
1 parent beaa9a6 commit 22c94b0

File tree

3 files changed

+54
-3
lines changed

3 files changed

+54
-3
lines changed

.secrets.baseline

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,7 +1426,7 @@
14261426
"filename": "sdk/python/tests/unit/infra/utils/snowflake/test_snowflake_utils.py",
14271427
"hashed_secret": "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",
14281428
"is_verified": false,
1429-
"line_number": 10
1429+
"line_number": 14
14301430
}
14311431
],
14321432
"sdk/python/tests/unit/local_feast_tests/test_init.py": [
@@ -1539,5 +1539,5 @@
15391539
}
15401540
]
15411541
},
1542-
"generated_at": "2026-04-07T15:56:56Z"
1542+
"generated_at": "2026-04-09T03:30:18Z"
15431543
}

sdk/python/feast/infra/utils/snowflake/snowflake_utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ def assert_snowflake_feature_names(feature_view: FeatureView) -> None:
123123

124124

125125
def execute_snowflake_statement(conn: SnowflakeConnection, query) -> SnowflakeCursor:
126+
if not query.strip():
127+
return conn.cursor()
126128
cursor = conn.cursor().execute(query)
127129
if cursor is None:
128130
raise SnowflakeQueryUnknownError(query)

sdk/python/tests/unit/infra/utils/snowflake/test_snowflake_utils.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import tempfile
22
from typing import Optional
3+
from unittest.mock import MagicMock
34

45
import pytest
56
from cryptography.hazmat.primitives import serialization
67
from cryptography.hazmat.primitives.asymmetric import rsa
78

8-
from feast.infra.utils.snowflake.snowflake_utils import parse_private_key_path
9+
from feast.infra.utils.snowflake.snowflake_utils import (
10+
execute_snowflake_statement,
11+
parse_private_key_path,
12+
)
913

1014
PRIVATE_KEY_PASSPHRASE = "test"
1115

@@ -69,3 +73,48 @@ def test_parse_private_key_path_key_path_encrypted(encrypted_private_key):
6973
f.name,
7074
None,
7175
)
76+
77+
78+
class TestExecuteSnowflakeStatement:
79+
def test_empty_query_returns_cursor_without_executing(self):
80+
mock_conn = MagicMock()
81+
mock_cursor = MagicMock()
82+
mock_conn.cursor.return_value = mock_cursor
83+
84+
result = execute_snowflake_statement(mock_conn, "")
85+
86+
assert result is mock_cursor
87+
mock_conn.cursor.assert_called_once()
88+
mock_cursor.execute.assert_not_called()
89+
90+
def test_whitespace_only_query_returns_cursor_without_executing(self):
91+
mock_conn = MagicMock()
92+
mock_cursor = MagicMock()
93+
mock_conn.cursor.return_value = mock_cursor
94+
95+
result = execute_snowflake_statement(mock_conn, " \t\n ")
96+
97+
assert result is mock_cursor
98+
mock_conn.cursor.assert_called_once()
99+
mock_cursor.execute.assert_not_called()
100+
101+
def test_valid_query_executes_and_returns_cursor(self):
102+
mock_conn = MagicMock()
103+
mock_cursor = MagicMock()
104+
mock_executed_cursor = MagicMock()
105+
mock_conn.cursor.return_value = mock_cursor
106+
mock_cursor.execute.return_value = mock_executed_cursor
107+
108+
result = execute_snowflake_statement(mock_conn, "SELECT 1")
109+
110+
assert result is mock_executed_cursor
111+
mock_cursor.execute.assert_called_once_with("SELECT 1")
112+
113+
def test_valid_query_raises_on_none_cursor(self):
114+
mock_conn = MagicMock()
115+
mock_cursor = MagicMock()
116+
mock_conn.cursor.return_value = mock_cursor
117+
mock_cursor.execute.return_value = None
118+
119+
with pytest.raises(Exception, match="Snowflake query failed"):
120+
execute_snowflake_statement(mock_conn, "SELECT 1")

0 commit comments

Comments
 (0)