Skip to content

Commit 0b9e3ff

Browse files
authored
Better error messages on SQL client (#93)
* Raising error on internal method instead of returning false because it is not a security error * Updating model name as gemini 3 has been deprecated
1 parent 4f8dc47 commit 0b9e3ff

3 files changed

Lines changed: 10 additions & 10 deletions

File tree

.env.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ GOOGLE_API_KEY="..." # Used by google-adk
44

55
# Model selection (see https://ai.google.dev/gemini-api/docs/models)
66
# Stable: gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-lite
7-
# Preview: gemini-3-pro-preview, gemini-3-flash-preview
7+
# Preview: gemini-3.1-pro-preview, gemini-3.1-flash-preview
88
DEFAULT_PLANNER_MODEL="gemini-2.5-pro"
99
DEFAULT_WORKER_MODEL="gemini-2.5-flash"
1010
DEFAULT_EVALUATOR_MODEL="gemini-2.5-pro"

aieng-eval-agents/aieng/agent_evals/tools/sql_database.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,9 @@ def _is_safe_readonly_query(self, query: str) -> bool:
166166

167167
return is_safe
168168
except Exception as e:
169-
logger.error("SQL Parsing Error: %s", e)
169+
logger.exception("SQL Parsing Error: %s", e)
170170
# If we can't parse it, we don't run it.
171-
return False
171+
raise e
172172

173173
def get_schema_info(self, table_names: Optional[list[str]] = None) -> str:
174174
"""Return schema for specific tables/views or all if None.
@@ -296,6 +296,7 @@ def execute(self, query: str) -> str:
296296
return "\n".join(output)
297297

298298
except Exception as e:
299+
logger.exception("Error executing query: %s", e)
299300
error_msg = str(e)
300301
return f"Query Error: {error_msg}"
301302

aieng-eval-agents/tests/aieng/agent_evals/tools/test_sql_database.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from __future__ import annotations
44

55
import pytest
6+
import sqlglot
67
from aieng.agent_evals.tools import ReadOnlySqlDatabase, ReadOnlySqlPolicy, sql_database
78
from sqlalchemy import create_engine
89

@@ -154,13 +155,11 @@ def test_is_safe_readonly_query_blocks_forbidden_nodes_even_if_root_is_allowed(s
154155
assert db._is_safe_readonly_query("DELETE FROM customers") is False
155156

156157

157-
def test_is_safe_readonly_query_returns_false_on_parse_errors(
158-
sqlite_db_uri: str, monkeypatch: pytest.MonkeyPatch
159-
) -> None:
160-
"""Return False (fail closed) if parsing raises."""
161-
db = ReadOnlySqlDatabase(connection_uri=sqlite_db_uri)
162-
monkeypatch.setattr("aieng.agent_evals.tools.sql_database.sqlglot.parse", lambda _query: 1 / 0)
163-
assert db._is_safe_readonly_query("SELECT 1") is False
158+
def test_is_safe_readonly_query_returns_exception_on_parse_errors(sqlite_db_uri: str) -> None:
159+
"""Return exception if parsing raises an exception."""
160+
with pytest.raises(sqlglot.errors.ParseError):
161+
db = ReadOnlySqlDatabase(connection_uri=sqlite_db_uri)
162+
assert db._is_safe_readonly_query("SERECT 1") is False
164163

165164

166165
def test_get_schema_info_includes_tables_and_views(default_db: ReadOnlySqlDatabase) -> None:

0 commit comments

Comments
 (0)