Extract TVF-related tests to TCL

These tests verify interactions between the database engine and TVFs.
They happen to use generate_series, but they are not intended to test
the behavior of any specific extension. Tests that verify generate_series
specific behavior remain in extensions.py.
This commit is contained in:
Piotr Rzysko
2025-08-12 06:28:22 +02:00
parent 20ea079679
commit d1a91a63e6
2 changed files with 158 additions and 98 deletions

View File

@@ -328,35 +328,6 @@ def _test_series(limbo: TestTursoShell):
"SELECT * FROM generate_series(1, 10);",
lambda res: res == "1\n2\n3\n4\n5\n6\n7\n8\n9\n10",
)
limbo.run_test_fn(
"SELECT * FROM generate_series WHERE start = 1 AND stop = 10;",
lambda res: res == "1\n2\n3\n4\n5\n6\n7\n8\n9\n10",
)
limbo.run_test_fn(
"SELECT * FROM generate_series WHERE 1 = start AND 10 = stop;",
lambda res: res == "1\n2\n3\n4\n5\n6\n7\n8\n9\n10",
"Constraint with column on RHS used as TVF arg",
)
limbo.run_test_fn(
"SELECT * FROM generate_series WHERE stop = 10 AND start = 1;",
lambda res: res == "1\n2\n3\n4\n5\n6\n7\n8\n9\n10",
)
limbo.run_test_fn(
"SELECT * FROM generate_series(1, 10) WHERE value < 5;",
lambda res: res == "1\n2\n3\n4",
)
limbo.run_test_fn(
"SELECT * FROM generate_series WHERE start = 1 AND stop = 10 AND value < 5;",
lambda res: res == "1\n2\n3\n4",
)
limbo.run_test_fn(
"SELECT * FROM generate_series WHERE start = 1 AND stop = 10 AND start = 5;",
lambda res: res == "",
)
limbo.run_test_fn(
"SELECT * FROM generate_series WHERE start = 1 AND stop = 10 AND start > 5;",
lambda res: res == "",
)
limbo.run_test_fn(
"SELECT * FROM generate_series;",
lambda res: "Invalid Argument" in res or 'first argument to "generate_series()" missing or unusable' in res,
@@ -365,79 +336,10 @@ def _test_series(limbo: TestTursoShell):
"SELECT * FROM generate_series(1, 10, 2);",
lambda res: res == "1\n3\n5\n7\n9",
)
limbo.run_test_fn(
"SELECT * FROM generate_series WHERE start = 1 AND stop = 10 AND step = 2;",
lambda res: res == "1\n3\n5\n7\n9",
)
limbo.run_test_fn(
"SELECT * FROM generate_series(1, 10, 2, 3);",
lambda res: "too many arguments" in res.lower(),
)
limbo.run_test_fn(
"SELECT * FROM generate_series(10, 1, -2);",
lambda res: res == "10\n8\n6\n4\n2",
)
limbo.run_test_fn(
"SELECT "
" a.value a_val, "
" b.value b_val "
"FROM "
" generate_series(1, 3) a "
"JOIN "
" generate_series(1, 1) b ON a.value = b.value;",
lambda res: res == "1|1",
)
limbo.execute_dot("CREATE TABLE target (id integer primary key);")
limbo.execute_dot("INSERT INTO target SELECT * FROM generate_series(1, 5);")
limbo.run_test_fn(
"SELECT * FROM target;",
lambda res: res == "1\n2\n3\n4\n5",
)
limbo.run_test_fn(
"SELECT t.id, series.value FROM target t, generate_series(t.id, 3) series;",
lambda res: res == "1|1\n1|2\n1|3\n2|2\n2|3\n3|3",
"Column reference from table on the left used as generate_series argument",
)
limbo.run_test_fn(
"SELECT t.id, series.value FROM generate_series(t.id, 3) series, target t;",
lambda res: res == "1|1\n1|2\n1|3\n2|2\n2|3\n3|3",
"Column reference from table on the right used as generate_series argument",
)
limbo.run_test_fn(
"SELECT one.value, series.value FROM (SELECT 1 AS value) one, generate_series(one.value, 3) series;",
lambda res: res == "1|1\n1|2\n1|3",
"Column reference from scalar subquery (left side)",
)
limbo.run_test_fn(
"SELECT one.value, series.value FROM generate_series(one.value, 3) series, (SELECT 1 AS value) one;",
lambda res: res == "1|1\n1|2\n1|3",
"Column reference from scalar subquery (right side)",
)
limbo.run_test_fn(
"SELECT "
" * "
"FROM "
" generate_series(a.start, a.stop) series "
"NATURAL JOIN "
" (SELECT 1 AS start, 3 AS stop, 2 AS value) a;",
lambda res: res == "2|1|3",
"Natural join where TVF arguments come from column references",
)
limbo.run_test_fn(
"SELECT * FROM generate_series(a.start, a.stop) JOIN (SELECT 1 AS start, 3 AS stop) a USING (start, stop);",
lambda res: res == "1\n2\n3",
"Join USING where TVF arguments come from column references",
)
limbo.run_test_fn(
"SELECT a.value, b.value FROM generate_series(b.value, b.value+1) a JOIN generate_series(1, 2) b;",
lambda res: res == "1|1\n2|1\n2|2\n3|2",
"TVF arguments come from another TVF",
)
limbo.run_test_fn(
"SELECT * FROM generate_series(a.start, a.stop) b, generate_series(b.start, b.stop) a;",
lambda res: "No valid query plan found" in res or "no query solution" in res,
"circular column references between two generate_series",
)
limbo.run_test_fn(
"SELECT * FROM generate_series(b.start, b.stop) b;",
lambda res: "Invalid Argument" in res or 'first argument to "generate_series()" missing or unusable' in res,