1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-29 08:01:23 +03:00

Fix multiple problems with RETURNING on a DML statement against a view,

all inspired by [forum:/forumpost/dc3b92cfa0|forum post dc3b92cfa0].
(1) Do not allow a RETURNING clause to trick the code generator into thinking
that the view being updated has an INSTEAD OF trigger.
(2) Generate all result columns for a view in a DML statement.
(3) The automatic covering index for a view should cover all result columns
of the view.

FossilOrigin-Name: c8bedef0d61731c29ae34de1594222d15b578f9e2cddbbd5b74fb3059644fe0f
This commit is contained in:
drh
2023-03-28 11:18:04 +00:00
parent fc6c3936aa
commit 3cbf38c783
10 changed files with 84 additions and 23 deletions

View File

@ -414,6 +414,7 @@ do_execsql_test 17.0 {
do_execsql_test 18.0 {
CREATE TABLE v0(c1 INT);
CREATE VIEW view_2(c1) AS SELECT CASE WHEN c1 COLLATE TRUE THEN TRUE ELSE TRUE END FROM v0;
CREATE TRIGGER x1 INSTEAD OF INSERT ON view_2 BEGIN SELECT true; END;
}
do_catchsql_test 18.1 {
INSERT INTO view_2 DEFAULT VALUES RETURNING *;

View File

@ -2225,5 +2225,56 @@ do_execsql_test 72.1 {
WHERE ('1' IS NOT ('abcde' NOTNULL));
} {1}
# 2023-03-28 https://sqlite.org/forum/forumpost/dc3b92cfa0 (Song Liu)
#
reset_db
do_execsql_test 73.0 {
CREATE TABLE t1(a INT);
INSERT INTO t1(a) VALUES(1),(2),(4);
CREATE VIEW t2(b,c) AS SELECT * FROM t1 JOIN t1 A ORDER BY sum(0) OVER(PARTITION BY 0);
CREATE TRIGGER x1 INSTEAD OF UPDATE ON t2 BEGIN SELECT true; END;
}
do_execsql_test 73.1 {
SELECT * FROM t2;
} {1 1 1 2 1 4 2 1 2 2 2 4 4 1 4 2 4 4}
do_execsql_test 73.2 {
UPDATE t2 SET c=99 WHERE b=4 RETURNING *;
} {4 99 4 99 4 99}
do_execsql_test 73.3 {
SELECT *, nth_value(15,2) OVER() FROM t2, t1 WHERE b=4;
} {
4 1 1 15
4 2 1 15
4 4 1 15
4 1 2 15
4 2 2 15
4 4 2 15
4 1 4 15
4 2 4 15
4 4 4 15
}
do_execsql_test 73.4 {
UPDATE t2 SET c=nth_value(15,2) OVER() FROM (SELECT * FROM t1) WHERE b=4 RETURNING *;
} {
4 15
4 15
4 15
4 15
4 15
4 15
4 15
4 15
4 15
}
do_execsql_test 73.5 {
DROP TRIGGER x1;
}
do_catchsql_test 73.6 {
UPDATE t2 SET c=99 WHERE b=4 RETURNING *;
} {1 {cannot modify t2 because it is a view}}
do_catchsql_test 73.7 {
UPDATE t2 SET c=nth_value(15,2) OVER() FROM (SELECT * FROM t1) WHERE b=4 RETURNING *;
} {1 {cannot modify t2 because it is a view}}
finish_test