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:
@ -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 *;
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user