fix: prevent anonymous code in Postgres (#34412)

(cherry picked from commit 6fc734da51)
This commit is contained in:
Beto Dealmeida
2025-07-31 08:33:34 -04:00
committed by Michael S. Molina
parent 8c9489d72f
commit d8b01c668f
2 changed files with 47 additions and 0 deletions

View File

@@ -1072,6 +1072,43 @@ def test_is_mutating(engine: str) -> None:
).is_mutating()
@pytest.mark.parametrize(
"sql, expected",
[
(
"""
DO $$
BEGIN
INSERT INTO public.users (name, real_name)
VALUES ('SQLLab bypass DML', 'SQLLab bypass DML');
END;
$$;
""",
True,
),
(
"""
DO $$
BEGIN
IF (SELECT COUNT(*) FROM orders WHERE status = 'pending') > 100 THEN
RAISE NOTICE 'High pending order volume detected';
END IF;
END;
$$;
""",
True,
),
],
)
def test_is_mutating_anonymous_block(sql: str, expected: bool) -> None:
"""
Test for `is_mutating` with a Postgres anonymous block.
Since we can't parse the PL/pgSQL inside the block we always assume it is mutating.
"""
assert SQLStatement(sql, "postgresql").is_mutating() == expected
def test_optimize() -> None:
"""
Test that the `optimize` method works as expected.