[tarantool-patches] Re: [PATCH 1/8] sql: remove SQLITE_ENABLE_UPDATE_DELETE_LIMIT define
n.pettik
korablev at tarantool.org
Wed Jan 16 17:25:58 MSK 2019
> On 29 Dec 2018, at 19:42, Vladislav Shpilevoy <v.shpilevoy at tarantool.org> wrote:
>
> Hi! Thanks for the patch!
>
> SQLITE_ENABLE_UPDATE_DELETE_LIMIT still exists
> in sql-tap/e_delete.test.lua.
>
> I found out that in this file all tests from line 111
> to line 495 are about DELETE LIMIT, so we can remove
> them as well, can't we?
Yep, they are anyway disabled so lets remove them as well.
Diff:
diff --git a/test/sql-tap/e_delete.test.lua b/test/sql-tap/e_delete.test.lua
index 84a4e0a22..a58dc87c7 100755
--- a/test/sql-tap/e_delete.test.lua
+++ b/test/sql-tap/e_delete.test.lua
@@ -100,399 +100,5 @@ test:do_delete_tests("e_delete-1.2", {
{9, "DELETE FROM t5 WHERE (SELECT max(x) FROM t6) ;SELECT x FROM t5", {}},
{10, "DELETE FROM t6 WHERE y>'seven' ; SELECT y FROM t6", {"one", "four", "five"}},
})
--- #-------------------------------------------------------------------------
--- # Tests for restrictions on DELETE statements that appear within trigger
--- # programs.
--- #
--- forcedelete test.db2
--- forcedelete test.db3
-
--- MUST_WORK_TEST should be rewritten without spaces or deleted
-if (0 > 0) then
- test:drop_all_tables()
- test:do_execsql_test("e_delete-2.0",
--- ATTACH 'test.db2' AS aux;
--- ATTACH 'test.db3' AS aux2;
- [[
- CREATE TABLE temp.t7(a INT primary key, b INT); INSERT INTO temp.t7 VALUES(1, 2);
- CREATE TABLE main.t7(a INT primary key, b INT); INSERT INTO main.t7 VALUES(3, 4);
- CREATE TABLE aux.t7(a INT primary key, b INT); INSERT INTO aux.t7 VALUES(5, 6);
- CREATE TABLE aux2.t7(a INT primary key, b INT); INSERT INTO aux2.t7 VALUES(7, 8);
- CREATE TABLE main.t8(a INT primary key, b INT); INSERT INTO main.t8 VALUES(1, 2);
- CREATE TABLE aux.t8(a INT primary key, b INT); INSERT INTO aux.t8 VALUES(3, 4);
- CREATE TABLE aux2.t8(a INT primary key, b INT); INSERT INTO aux2.t8 VALUES(5, 6);
- CREATE TABLE aux.t9(a INT primary key, b INT); INSERT INTO aux.t9 VALUES(1, 2);
- CREATE TABLE aux2.t9(a INT primary key, b INT); INSERT INTO aux2.t9 VALUES(3, 4);
- CREATE TABLE aux2.t10(a INT primary key, b INT); INSERT INTO aux2.t10 VALUES(1, 2);]]
- , {})
-
- -- EVIDENCE-OF: R-09681-58560 The table-name specified as part of a
- -- DELETE statement within a trigger body must be unqualified.
- --
- -- EVIDENCE-OF: R-12275-20298 In other words, the schema-name. prefix on
- -- the table name is not allowed within triggers.
- --
-
- test:do_catchsql_test("e_delete-2.1.1",[[
- CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
- DELETE FROM main.t2;
- END;]],
- {1, "qualified table names are not allowed on INSERT, UPDATE, and DELETE statements within triggers"})
- test:do_catchsql_test("e_delete-2.1.2",[[
- CREATE TRIGGER tr1 BEFORE UPDATE ON t2 BEGIN
- DELETE FROM temp.t7 WHERE a=new.a;
- END;]],
- {1, "qualified table names are not allowed on INSERT, UPDATE, and DELETE statements within triggers"})
- test:do_catchsql_test("e_delete-2.1.3",[[
- CREATE TRIGGER tr1 AFTER UPDATE ON t8 BEGIN
- DELETE FROM aux2.t8 WHERE b!=a;
- END;]],
- {1, "qualified table names are not allowed on INSERT, UPDATE, and DELETE statements within triggers"})
- -- EVIDENCE-OF: R-28818-63526 If the table to which the trigger is
- -- attached is not in the temp database, then DELETE statements within
- -- the trigger body must operate on tables within the same database as
- -- it.
- --
- -- This is tested in two parts. First, check that if a table of the
- -- specified name does not exist, an error is raised. Secondly, test
- -- that if tables with the specified name exist in multiple databases,
- -- the local database table is used.
- --
- test:do_delete_tests("e_delete-2.2.1", "-error", " no such table: %s ", {
- {1, [[
- CREATE TRIGGER tr1 AFTER INSERT ON t7 BEGIN
- DELETE FROM t9;
- END;
- INSERT INTO main.t7 VALUES(1, 2);]], {"main.t9"}},
-
- {2, [[
- CREATE TRIGGER aux.tr2 BEFORE UPDATE ON t9 BEGIN
- DELETE FROM t10;
- END;
- UPDATE t9 SET a=1;]], {"aux.t10"}},
- })
- test:do_execsql_test(
- "e_delete-2.2.X",
- [[
- DROP TRIGGER main.tr1;
- DROP TRIGGER aux.tr2;
- ]], {
- -- <e_delete-2.2.X>
-
- -- </e_delete-2.2.X>
- })
-
- test:do_delete_tests("e_delete-2.2.2", {
- {1, [[
- CREATE TRIGGER aux.tr1 AFTER INSERT ON t8 BEGIN
- DELETE FROM t9;
- END;
- INSERT INTO aux.t8 VALUES(1, 2);
-
- SELECT count(*) FROM aux.t9
- UNION ALL
- SELECT count(*) FROM aux2.t9;]], {0, 1}},
- {2, [[
- CREATE TRIGGER main.tr1 AFTER INSERT ON t8 BEGIN
- DELETE FROM t7;
- END;
- INSERT INTO main.t8 VALUES(1, 2);
-
- SELECT count(*) FROM temp.t7
- UNION ALL
- SELECT count(*) FROM main.t7
- UNION ALL
- SELECT count(*) FROM aux.t7
- UNION ALL
- SELECT count(*) FROM aux2.t7;]], {1, 0, 1, 1}}
- })
- -- EVIDENCE-OF: R-31567-38587 If the table to which the trigger is
- -- attached is in the TEMP database, then the unqualified name of the
- -- table being deleted is resolved in the same way as it is for a
- -- top-level statement (by searching first the TEMP database, then the
- -- main database, then any other databases in the order they were
- -- attached).
- --
- test:do_execsql_test(
- "e_delete-2.3.0",
- [[
- DROP TRIGGER aux.tr1;
- DROP TRIGGER main.tr1;
- DELETE FROM main.t8 WHERE oid>1;
- DELETE FROM aux.t8 WHERE oid>1;
- INSERT INTO aux.t9 VALUES(1, 2);
- INSERT INTO main.t7 VALUES(3, 4);
- ]], {
- -- <e_delete-2.3.0>
-
- -- </e_delete-2.3.0>
- })
-
- test:do_execsql_test(
- "e_delete-2.3.1",
- [[
- SELECT count(*) FROM temp.t7 UNION ALL SELECT count(*) FROM main.t7 UNION ALL
- SELECT count(*) FROM aux.t7 UNION ALL SELECT count(*) FROM aux2.t7;
-
- SELECT count(*) FROM main.t8 UNION ALL SELECT count(*) FROM aux.t8
- UNION ALL SELECT count(*) FROM aux2.t8;
-
- SELECT count(*) FROM aux.t9 UNION ALL SELECT count(*) FROM aux2.t9;
-
- SELECT count(*) FROM aux2.t10;
- ]], {
- -- <e_delete-2.3.1>
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
- -- </e_delete-2.3.1>
- })
-
- test:do_execsql_test(
- "e_delete-2.3.2",
- [[
- CREATE TRIGGER temp.tr1 AFTER INSERT ON t7 BEGIN
- DELETE FROM t7;
- DELETE FROM t8;
- DELETE FROM t9;
- DELETE FROM t10;
- END;
- INSERT INTO temp.t7 VALUES('hello', 'world');
- ]], {
- -- <e_delete-2.3.2>
-
- -- </e_delete-2.3.2>
- })
-
- test:do_execsql_test(
- "e_delete-2.3.3",
- [[
- SELECT count(*) FROM temp.t7 UNION ALL SELECT count(*) FROM main.t7 UNION ALL
- SELECT count(*) FROM aux.t7 UNION ALL SELECT count(*) FROM aux2.t7;
-
- SELECT count(*) FROM main.t8 UNION ALL SELECT count(*) FROM aux.t8
- UNION ALL SELECT count(*) FROM aux2.t8;
-
- SELECT count(*) FROM aux.t9 UNION ALL SELECT count(*) FROM aux2.t9;
-
- SELECT count(*) FROM aux2.t10;
- ]], {
- -- <e_delete-2.3.3>
- 0, 1, 1, 1, 0, 1, 1, 0, 1, 0
- -- </e_delete-2.3.3>
- })
-
- -- EVIDENCE-OF: R-28691-49464 The INDEXED BY and NOT INDEXED clauses are
- -- not allowed on DELETE statements within triggers.
- --
- test:do_execsql_test(
- "e_delete-2.4.0",
- [[
- CREATE INDEX i8 ON t8(a, b);
- ]], {
- -- <e_delete-2.4.0>
-
- -- </e_delete-2.4.0>
- })
-
- test:do_delete_tests("e_delete-2.4", "-error", [[
- the %s %s clause is not allowed on UPDATE or DELETE statements within triggers
- ]], {
- {1, [[
- CREATE TRIGGER tr3 AFTER INSERT ON t8 BEGIN
- DELETE FROM t8 INDEXED BY i8 WHERE a=5;
- END]], {"INDEXED BY"}},
- {2, [[
- CREATE TRIGGER tr3 AFTER INSERT ON t8 BEGIN
- DELETE FROM t8 NOT INDEXED WHERE a=5;
- END;]], {"NOT INDEXED"}},
- })
- -- EVIDENCE-OF: R-64942-06615 The LIMIT and ORDER BY clauses (described
- -- below) are unsupported for DELETE statements within triggers.
- --
- test:do_delete_tests("e_delete-2.5", "-error", [[ near "%s": syntax error ]], {
- {1, [[
- CREATE TRIGGER tr3 AFTER INSERT ON t8 BEGIN
- DELETE FROM t8 LIMIT 10;
- END;]], {"LIMIT"}},
- {2, [[
- CREATE TRIGGER tr3 AFTER INSERT ON t8 BEGIN
- DELETE FROM t8 ORDER BY a LIMIT 5;
- END;]], {"ORDER"}}
- })
- -- EVIDENCE-OF: R-40026-10531 If SQLite is compiled with the
- -- SQLITE_ENABLE_UPDATE_DELETE_LIMIT compile-time option, then the syntax
- -- of the DELETE statement is extended by the addition of optional ORDER
- -- BY and LIMIT clauses:
- --
- -- -- syntax diagram delete-stmt-limited
- --
- test:do_delete_tests("e_delete-3.1", {
- {1, "DELETE FROM t1 LIMIT 5", {}},
- {2, "DELETE FROM t1 LIMIT 5-1 OFFSET 2+2", {}},
- {3, "DELETE FROM t1 LIMIT 2+2, 16/4", {}},
- {4, "DELETE FROM t1 ORDER BY x LIMIT 5", {}},
- {5, "DELETE FROM t1 ORDER BY x LIMIT 5-1 OFFSET 2+2", {}},
- {6, "DELETE FROM t1 ORDER BY x LIMIT 2+2, 16/4", {}},
- {7, "DELETE FROM t1 WHERE x>2 LIMIT 5", {}},
- {8, "DELETE FROM t1 WHERE x>2 LIMIT 5-1 OFFSET 2+2", {}},
- {9, "DELETE FROM t1 WHERE x>2 LIMIT 2+2, 16/4", {}},
- {10, "DELETE FROM t1 WHERE x>2 ORDER BY x LIMIT 5", {}},
- {11, "DELETE FROM t1 WHERE x>2 ORDER BY x LIMIT 5-1 OFFSET 2+2", {}},
- {12, "DELETE FROM t1 WHERE x>2 ORDER BY x LIMIT 2+2, 16/4", {}},
- })
-end
-
-
-
--- MUST_WORK_TEST delete limit syntax
-if (0 > 0) then
- test.drop_all_tables()
- local function rebuild_t1()
- test:catchsql " DROP TABLE t1 "
- test:execsql [[
- CREATE TABLE t1(a INT PRIMARY KEY, b INT );
- INSERT INTO t1 VALUES(1, 'one');
- INSERT INTO t1 VALUES(2, 'two');
- INSERT INTO t1 VALUES(3, 'three');
- INSERT INTO t1 VALUES(4, 'four');
- INSERT INTO t1 VALUES(5, 'five');
- ]]
- end
- -- EVIDENCE-OF: R-44062-08550 If a DELETE statement has a LIMIT clause,
- -- the maximum number of rows that will be deleted is found by evaluating
- -- the accompanying expression and casting it to an integer value.
- --
- rebuild_t1()
- --test:do_delete_tests("e_delete-3.2", "-repair", "rebuild_t1", "-query", "SELECT a FROM t1", {
- test:do_delete_tests("e_delete-3.2", {
- {1, "DELETE FROM t1 LIMIT 3", {4, 5}},
- {2, "DELETE FROM t1 LIMIT 1+1", {3, 4, 5}},
- {3, "DELETE FROM t1 LIMIT '4'", {5}},
- {4, "DELETE FROM t1 LIMIT '1.0'", {2, 3, 4, 5}},
- })
- -- EVIDENCE-OF: R-02661-56399 If the result of the evaluating the LIMIT
- -- clause cannot be losslessly converted to an integer value, it is an
- -- error.
- --
- test:do_delete_tests("e_delete-3.3", "-error", " datatype mismatch ", {
- {1, "DELETE FROM t1 LIMIT 'abc'", {}},
- {2, "DELETE FROM t1 LIMIT NULL", {}},
- {3, "DELETE FROM t1 LIMIT X'ABCD'", {}},
- {4, "DELETE FROM t1 LIMIT 1.2", {}},
-})
- -- EVIDENCE-OF: R-00598-03741 A negative LIMIT value is interpreted as
- -- "no limit".
- --
- test:do_delete_tests("e_delete-3.4", "-repair", "rebuild_t1", "-query", [[
- SELECT a FROM t1
-]], {
- {1, "DELETE FROM t1 LIMIT -1", {}},
- {2, "DELETE FROM t1 LIMIT 2-4", {}},
- {3, "DELETE FROM t1 LIMIT -4.0", {}},
- {4, "DELETE FROM t1 LIMIT 5*-1", {}},
-})
- -- EVIDENCE-OF: R-26377-49195 If the DELETE statement also has an OFFSET
- -- clause, then it is similarly evaluated and cast to an integer value.
- -- Again, it is an error if the value cannot be losslessly converted to
- -- an integer.
- --
- test:do_delete_tests("e_delete-3.5", "-error", " datatype mismatch ", {
- {1, "DELETE FROM t1 LIMIT 1 OFFSET 'abc'", {}},
- {2, "DELETE FROM t1 LIMIT 1 OFFSET NULL", {}},
- {3, "DELETE FROM t1 LIMIT 1 OFFSET X'ABCD'", {}},
- {4, "DELETE FROM t1 LIMIT 1 OFFSET 1.2", {}},
- {5, "DELETE FROM t1 LIMIT 'abc', 1", {}},
- {6, "DELETE FROM t1 LIMIT NULL, 1", {}},
- {7, "DELETE FROM t1 LIMIT X'ABCD', 1", {}},
- {8, "DELETE FROM t1 LIMIT 1.2, 1", {}},
-})
- -- EVIDENCE-OF: R-64004-53814 If there is no OFFSET clause, or the
- -- calculated integer value is negative, the effective OFFSET value is
- -- zero.
- --
- test:do_delete_tests("e_delete-3.6", "-repair", "rebuild_t1", "-query", [[
- SELECT a FROM t1
-]], {
-{"1a", "DELETE FROM t1 LIMIT 3 OFFSET 0", {4, 5}},
-{"1b", "DELETE FROM t1 LIMIT 3", {4, 5}},
-{"1c", "DELETE FROM t1 LIMIT 3 OFFSET -1", {4, 5}},
-{"2a", "DELETE FROM t1 LIMIT 1+1 OFFSET 0", {3, 4, 5}},
-{"2b", "DELETE FROM t1 LIMIT 1+1", {3, 4, 5}},
-{"2c", "DELETE FROM t1 LIMIT 1+1 OFFSET 2-5", {3, 4, 5}},
-{"3a", "DELETE FROM t1 LIMIT '4' OFFSET 0", {5}},
-{"3b", "DELETE FROM t1 LIMIT '4'", {5}},
-{"3c", "DELETE FROM t1 LIMIT '4' OFFSET -1.0", {5}},
-{"4a", "DELETE FROM t1 LIMIT '1.0' OFFSET 0", {2, 3, 4, 5}},
-{"4b", "DELETE FROM t1 LIMIT '1.0'", {2, 3, 4, 5}},
-{"4c", "DELETE FROM t1 LIMIT '1.0' OFFSET -11", {2, 3, 4, 5}},
-})
- -- EVIDENCE-OF: R-48141-52334 If the DELETE statement has an ORDER BY
- -- clause, then all rows that would be deleted in the absence of the
- -- LIMIT clause are sorted according to the ORDER BY. The first M rows,
- -- where M is the value found by evaluating the OFFSET clause expression,
- -- are skipped, and the following N, where N is the value of the LIMIT
- -- expression, are deleted.
- --
- --test:do_delete_tests("e_delete-3.7", "-repair", "rebuild_t1", "-query", "SELECT a FROM t1", {
- test:do_delete_tests("e_delete-3.7",{
- {1, "DELETE FROM t1 ORDER BY b LIMIT 2", {1, 2, 3}},
- {2, "DELETE FROM t1 ORDER BY length(b), a LIMIT 3", {3, 5}},
- {3, "DELETE FROM t1 ORDER BY a DESC LIMIT 1 OFFSET 0", {1, 2, 3, 4}},
- {4, "DELETE FROM t1 ORDER BY a DESC LIMIT 1 OFFSET 1", {1, 2, 3, 5}},
- {5, "DELETE FROM t1 ORDER BY a DESC LIMIT 1 OFFSET 2", {1, 2, 4, 5}},
-})
- -- EVIDENCE-OF: R-64535-08414 If there are less than N rows remaining
- -- after taking the OFFSET clause into account, or if the LIMIT clause
- -- evaluated to a negative value, then all remaining rows are deleted.
- --
- test:do_delete_tests("e_delete-3.8", "-repair", "rebuild_t1", "-query", [[
- SELECT a FROM t1
-]], {
- {1, "DELETE FROM t1 ORDER BY a ASC LIMIT 10", {}},
- {2, "DELETE FROM t1 ORDER BY a ASC LIMIT -1", {}},
- {3, "DELETE FROM t1 ORDER BY a ASC LIMIT 4 OFFSET 2", {1, 2}},
-})
- -- EVIDENCE-OF: R-37284-06965 If the DELETE statement has no ORDER BY
- -- clause, then all rows that would be deleted in the absence of the
- -- LIMIT clause are assembled in an arbitrary order before applying the
- -- LIMIT and OFFSET clauses to determine the subset that are actually
- -- deleted.
- --
- -- In practice, the "arbitrary order" is rowid order.
- --
- test:do_delete_tests("e_delete-3.9", "-repair", "rebuild_t1", "-query", [[
- SELECT a FROM t1
-]], {
- {1, "DELETE FROM t1 LIMIT 2", {3, 4, 5}},
- {2, "DELETE FROM t1 LIMIT 3", {4, 5}},
- {3, "DELETE FROM t1 LIMIT 1 OFFSET 0", {2, 3, 4, 5}},
- {4, "DELETE FROM t1 LIMIT 1 OFFSET 1", {1, 3, 4, 5}},
- {5, "DELETE FROM t1 LIMIT 1 OFFSET 2", {1, 2, 4, 5}},
-})
- -- EVIDENCE-OF: R-07548-13422 The ORDER BY clause on a DELETE statement
- -- is used only to determine which rows fall within the LIMIT. The order
- -- in which rows are deleted is arbitrary and is not influenced by the
- -- ORDER BY clause.
- --
- -- In practice, rows are always deleted in rowid order.
- --
- test:do_delete_tests("e_delete-3.10", "-repair", [[
- rebuild_t1
- catchsql { DROP TABLE t1log }
- execsql {
- CREATE TABLE t1log(x INT );
- CREATE TRIGGER tr1 AFTER DELETE ON t1 BEGIN
- INSERT INTO t1log VALUES(old.a);
- END;
- }
-]], "-query", [[
- SELECT x FROM t1log
-]], {
- {1, "DELETE FROM t1 ORDER BY a DESC LIMIT 2", {4, 5}},
- {2, "DELETE FROM t1 ORDER BY a DESC LIMIT -1", {1, 2, 3, 4, 5}},
- {3, "DELETE FROM t1 ORDER BY a ASC LIMIT 2", {1, 2}},
- {4, "DELETE FROM t1 ORDER BY a ASC LIMIT -1", {1, 2, 3, 4, 5}},
-})
-end
-
More information about the Tarantool-patches
mailing list