diff --git a/testing/cli_tests/extensions.py b/testing/cli_tests/extensions.py index 0f7009a8f..8b0e3c3a5 100755 --- a/testing/cli_tests/extensions.py +++ b/testing/cli_tests/extensions.py @@ -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, diff --git a/testing/vtab.test b/testing/vtab.test index 7c372f70a..3990a3e72 100755 --- a/testing/vtab.test +++ b/testing/vtab.test @@ -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}