mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-18 17:14:20 +01:00
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:
@@ -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,
|
||||
|
||||
@@ -234,3 +234,161 @@ do_execsql_test_on_specific_db {:memory:} natural-join-using-hidden-column {
|
||||
INSERT INTO l(comment, key, value) values ('comment1', '2', '3');
|
||||
SELECT * FROM l NATURAL JOIN r JOIN r USING(comment, key, value);
|
||||
} {}
|
||||
|
||||
do_execsql_test tvf-hidden-column-constraints-as-args {
|
||||
SELECT * FROM generate_series WHERE start = 1 AND stop = 10;
|
||||
} {1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10}
|
||||
|
||||
do_execsql_test tvf-hidden-column-constraints-as-args-rhs {
|
||||
SELECT * FROM generate_series WHERE 1 = start AND 10 = stop;
|
||||
} {1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10}
|
||||
|
||||
do_execsql_test tvf-hidden-column-constraints-as-args-reversed {
|
||||
SELECT * FROM generate_series WHERE stop = 10 AND start = 1;
|
||||
} {1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10}
|
||||
|
||||
do_execsql_test tvf-predicate-not-used-as-arg-1 {
|
||||
SELECT * FROM generate_series(1, 10) WHERE value < 5;
|
||||
} {1
|
||||
2
|
||||
3
|
||||
4}
|
||||
|
||||
do_execsql_test tvf-predicate-not-used-as-arg-2 {
|
||||
SELECT * FROM generate_series WHERE start = 1 AND stop = 10 AND value < 5;
|
||||
} {1
|
||||
2
|
||||
3
|
||||
4}
|
||||
|
||||
do_execsql_test tvf-multiple-constraints-on-same-column-1 {
|
||||
SELECT * FROM generate_series WHERE start = 1 AND stop = 10 AND start = 5;
|
||||
} {}
|
||||
|
||||
do_execsql_test tvf-multiple-constraints-on-same-column-2 {
|
||||
SELECT * FROM generate_series WHERE start = 1 AND stop = 10 AND start > 5;
|
||||
} {}
|
||||
|
||||
do_execsql_test tvf-multiple-constraints-on-same-column-3 {
|
||||
SELECT * FROM generate_series WHERE start = 1 AND stop = 10 AND step = 2;
|
||||
} {1
|
||||
3
|
||||
5
|
||||
7
|
||||
9}
|
||||
|
||||
do_execsql_test_error_content tvf-too-many-args {
|
||||
SELECT * FROM generate_series(1, 10, 2, 3);
|
||||
} {too many arguments}
|
||||
|
||||
do_execsql_test tvf-join-basic {
|
||||
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;
|
||||
} {1|1}
|
||||
|
||||
do_execsql_test_on_specific_db {:memory:} insert-into-select-from-tvf {
|
||||
CREATE TABLE target (id integer primary key);
|
||||
INSERT INTO target SELECT * FROM generate_series(1, 5);
|
||||
SELECT * FROM target;
|
||||
} {1
|
||||
2
|
||||
3
|
||||
4
|
||||
5}
|
||||
|
||||
do_execsql_test_on_specific_db {:memory:} tvf-arg-from-left-table-column {
|
||||
CREATE TABLE target (id integer primary key);
|
||||
INSERT INTO target SELECT * FROM generate_series(1, 5);
|
||||
|
||||
SELECT t.id, series.value
|
||||
FROM target t, generate_series(t.id, 3) series
|
||||
WHERE t.id <= 3;
|
||||
} {1|1
|
||||
1|2
|
||||
1|3
|
||||
2|2
|
||||
2|3
|
||||
3|3}
|
||||
|
||||
do_execsql_test_on_specific_db {:memory:} tvf-arg-from-right-table-column {
|
||||
CREATE TABLE target (id integer primary key);
|
||||
INSERT INTO target SELECT * FROM generate_series(1, 5);
|
||||
|
||||
SELECT t.id, series.value
|
||||
FROM generate_series(t.id, 3) series, target t
|
||||
WHERE t.id <= 3;
|
||||
} {1|1
|
||||
1|2
|
||||
1|3
|
||||
2|2
|
||||
2|3
|
||||
3|3}
|
||||
|
||||
do_execsql_test tvf-arg-from-left-subquery-column {
|
||||
SELECT one.value, series.value
|
||||
FROM (SELECT 1 AS value) one, generate_series(one.value, 3) series;
|
||||
} {1|1
|
||||
1|2
|
||||
1|3}
|
||||
|
||||
do_execsql_test tvf-arg-from-right-subquery-column {
|
||||
SELECT one.value, series.value
|
||||
FROM generate_series(one.value, 3) series, (SELECT 1 AS value) one;
|
||||
} {1|1
|
||||
1|2
|
||||
1|3}
|
||||
|
||||
do_execsql_test tvf-args-from-natural-join-columns {
|
||||
SELECT *
|
||||
FROM generate_series(a.start, a.stop) series
|
||||
NATURAL JOIN (SELECT 1 AS start, 3 AS stop, 2 AS value) a;
|
||||
} {2|1|3}
|
||||
|
||||
do_execsql_test tvf-args-from-join-using-columns {
|
||||
SELECT *
|
||||
FROM generate_series(a.start, a.stop)
|
||||
JOIN (SELECT 1 AS start, 3 AS stop) a USING (start, stop);
|
||||
} {1
|
||||
2
|
||||
3}
|
||||
|
||||
do_execsql_test tvf-args-from-another-tvf {
|
||||
SELECT a.value, b.value
|
||||
FROM generate_series(b.value, b.value+1) a
|
||||
JOIN generate_series(1, 2) b;
|
||||
} {1|1
|
||||
2|1
|
||||
2|2
|
||||
3|2}
|
||||
|
||||
do_execsql_test_error tvf-circular-column-references {
|
||||
SELECT * FROM generate_series(a.start, a.stop) b, generate_series(b.start, b.stop) a;
|
||||
} {No valid query plan found|no query solution}
|
||||
|
||||
Reference in New Issue
Block a user