From c96c2d6bfd50964b8002f2b458fe045499a14365 Mon Sep 17 00:00:00 2001 From: Bartok9 Date: Sun, 19 Jul 2026 02:24:07 -0400 Subject: [PATCH] fix(connector): coerce non-string SQL in strip_trailing_semicolon --- core/wren/src/wren/connector/base.py | 8 ++++++++ .../unit/test_strip_trailing_semicolon_coerce.py | 14 ++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 core/wren/tests/unit/test_strip_trailing_semicolon_coerce.py diff --git a/core/wren/src/wren/connector/base.py b/core/wren/src/wren/connector/base.py index c483f74ada..91eadfdec8 100644 --- a/core/wren/src/wren/connector/base.py +++ b/core/wren/src/wren/connector/base.py @@ -16,7 +16,15 @@ def strip_trailing_semicolon(sql: str) -> str: or ``EXPLAIN SELECT 1;``). Only the *terminating* run of semicolons and whitespace is removed, so semicolons inside string literals (``SELECT 'a;b'``) are preserved. + + Non-string values are coerced with ``str(...)`` so accidental ``None``/ + numeric SQL arguments degrade instead of raising ``TypeError`` inside + the regex. Empty input becomes ``""``. """ + if sql is None: + return "" + if not isinstance(sql, str): + sql = str(sql) return _TRAILING_SEMICOLONS_RE.sub("", sql) diff --git a/core/wren/tests/unit/test_strip_trailing_semicolon_coerce.py b/core/wren/tests/unit/test_strip_trailing_semicolon_coerce.py new file mode 100644 index 0000000000..8fbc58242e --- /dev/null +++ b/core/wren/tests/unit/test_strip_trailing_semicolon_coerce.py @@ -0,0 +1,14 @@ +from wren.connector.base import strip_trailing_semicolon + + +def test_strips_string(): + assert strip_trailing_semicolon("SELECT 1;") == "SELECT 1" + assert strip_trailing_semicolon("SELECT 1 ; \n") == "SELECT 1" + + +def test_none_becomes_empty(): + assert strip_trailing_semicolon(None) == "" + + +def test_non_string_coerced(): + assert strip_trailing_semicolon(42) == "42"