mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
Correct handling of outer joins in the FROM clause of an UPDATE statement
that occurs inside of a trigger. Follow-on to [98b3816bbaf539ea]. FossilOrigin-Name: 664a49fa813144b6fa5a7ae3f65af5412f150dd5def261c4d581d706b39f7846
This commit is contained in:
14
manifest
14
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Clarification\sof\sthe\smeaning\sof\sthe\sN\sparameter\sin\ssqlite3_db_name().\nDocumentation\sonly.\s\sNo\schanges\sto\scode.
|
C Correct\shandling\sof\souter\sjoins\sin\sthe\sFROM\sclause\sof\san\sUPDATE\sstatement\nthat\soccurs\sinside\sof\sa\strigger.\s\sFollow-on\sto\s[98b3816bbaf539ea].
|
||||||
D 2022-05-26T14:46:09.766
|
D 2022-05-26T17:33:42.057
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@@ -633,7 +633,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
|||||||
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
||||||
F src/tokenize.c a38f52058b517929e264094abd0b5fd1e8e145a1aa43bc6f6a72ae5218f96c98
|
F src/tokenize.c a38f52058b517929e264094abd0b5fd1e8e145a1aa43bc6f6a72ae5218f96c98
|
||||||
F src/treeview.c 73facf395c8841653b9a54e789d8c80e15bc3d0d1cb9d16104c2d889c15e33cd
|
F src/treeview.c 73facf395c8841653b9a54e789d8c80e15bc3d0d1cb9d16104c2d889c15e33cd
|
||||||
F src/trigger.c 4fe4c1ac811755aff49d669d2e52e414eb5dfa6e172e849ab7b6825e70a571c0
|
F src/trigger.c adecf22bf1e869653a0637c2bb0c12b0b289e71fbb2c5cac70d596e11dbdf957
|
||||||
F src/update.c 2cfaded82ca80ff56afb8c3ae5e88284e0824bfd86119827cc22481959f96f92
|
F src/update.c 2cfaded82ca80ff56afb8c3ae5e88284e0824bfd86119827cc22481959f96f92
|
||||||
F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937
|
F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937
|
||||||
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
|
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
|
||||||
@@ -1706,7 +1706,7 @@ F test/upfrom1.tcl 8859d9d437f03b44174c4524a7a734a391fd4526fcff65be08285dafc9dc9
|
|||||||
F test/upfrom1.test 8cb06689e99cd707d884faa16da0e8eb26ff658bb01c47ddf72fadade666e6e1
|
F test/upfrom1.test 8cb06689e99cd707d884faa16da0e8eb26ff658bb01c47ddf72fadade666e6e1
|
||||||
F test/upfrom2.test 66f3ebf721b3cebd922faee5c386bf244f816d416b57c000753ff51af62328a1
|
F test/upfrom2.test 66f3ebf721b3cebd922faee5c386bf244f816d416b57c000753ff51af62328a1
|
||||||
F test/upfrom3.test 6130f24ebf97f5ea865e5d2a14a2d543fe5428a62e87cc60f62d875e45c1f5f0
|
F test/upfrom3.test 6130f24ebf97f5ea865e5d2a14a2d543fe5428a62e87cc60f62d875e45c1f5f0
|
||||||
F test/upfrom4.test 71d25e18c7d04e2930dcbd78e6aafb6931c80cb08f77039309b6095a12f1e62e
|
F test/upfrom4.test 1cd82e9423e02b1f63d069e8665c6c3932ec424fd0043d033cc0ba99abf33236
|
||||||
F test/upfromfault.test 3a10075a0043f0c4fad6614b2c371f88a8ba5a4acab68b907438413865d6a8d6
|
F test/upfromfault.test 3a10075a0043f0c4fad6614b2c371f88a8ba5a4acab68b907438413865d6a8d6
|
||||||
F test/upsert1.test b0ae2f58680c5205b4bc1cdeed3c3d444057c506f6c44494fa3eac60731d68a2
|
F test/upsert1.test b0ae2f58680c5205b4bc1cdeed3c3d444057c506f6c44494fa3eac60731d68a2
|
||||||
F test/upsert2.test 720e94d09f7362a282bc69b3c6b83d51daeaaf0440eb4920a08b86518b8c7496
|
F test/upsert2.test 720e94d09f7362a282bc69b3c6b83d51daeaaf0440eb4920a08b86518b8c7496
|
||||||
@@ -1969,8 +1969,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P 37e3764839b968456f576fad67d3d99007773f5c0689165ecbdc610fcabef1ca
|
P f22f41d2c8a676b9a339e7f00c29c163bbb7079b1a4a76ee1a6a96aaf7de5f9e
|
||||||
R ad1c2600d93c5d6d7235db32fa9a048b
|
R 96c2f1a4243ab0b57b68e0f3b4978a15
|
||||||
U drh
|
U drh
|
||||||
Z ca32a2eb387f9f8be5f39604dc123106
|
Z 723fac70f8b090aa70201f7f985c54bc
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@@ -1 +1 @@
|
|||||||
f22f41d2c8a676b9a339e7f00c29c163bbb7079b1a4a76ee1a6a96aaf7de5f9e
|
664a49fa813144b6fa5a7ae3f65af5412f150dd5def261c4d581d706b39f7846
|
@@ -514,7 +514,7 @@ TriggerStep *sqlite3TriggerInsertStep(
|
|||||||
TriggerStep *sqlite3TriggerUpdateStep(
|
TriggerStep *sqlite3TriggerUpdateStep(
|
||||||
Parse *pParse, /* Parser */
|
Parse *pParse, /* Parser */
|
||||||
Token *pTableName, /* Name of the table to be updated */
|
Token *pTableName, /* Name of the table to be updated */
|
||||||
SrcList *pFrom,
|
SrcList *pFrom, /* FROM clause for an UPDATE-FROM, or NULL */
|
||||||
ExprList *pEList, /* The SET clause: list of column and new values */
|
ExprList *pEList, /* The SET clause: list of column and new values */
|
||||||
Expr *pWhere, /* The WHERE clause */
|
Expr *pWhere, /* The WHERE clause */
|
||||||
u8 orconf, /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */
|
u8 orconf, /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */
|
||||||
@@ -850,6 +850,14 @@ SrcList *sqlite3TriggerStepSrc(
|
|||||||
}
|
}
|
||||||
if( pStep->pFrom ){
|
if( pStep->pFrom ){
|
||||||
SrcList *pDup = sqlite3SrcListDup(db, pStep->pFrom, 0);
|
SrcList *pDup = sqlite3SrcListDup(db, pStep->pFrom, 0);
|
||||||
|
if( pDup && pDup->nSrc>1 ){
|
||||||
|
Select *pSubquery;
|
||||||
|
Token as;
|
||||||
|
pSubquery = sqlite3SelectNew(pParse,0,pDup,0,0,0,0,SF_NestedFrom,0);
|
||||||
|
as.n = 0;
|
||||||
|
as.z = 0;
|
||||||
|
pDup = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&as,pSubquery,0);
|
||||||
|
}
|
||||||
pSrc = sqlite3SrcListAppendList(pParse, pSrc, pDup);
|
pSrc = sqlite3SrcListAppendList(pParse, pSrc, pDup);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
|
@@ -52,4 +52,79 @@ do_execsql_test 120 {
|
|||||||
} {1 i I 2 ii {} 3 iii II 4 four FOUR}
|
} {1 i I 2 ii {} 3 iii II 4 four FOUR}
|
||||||
|
|
||||||
|
|
||||||
|
reset_db
|
||||||
|
db null -
|
||||||
|
do_execsql_test 200 {
|
||||||
|
CREATE TABLE t1(a INT PRIMARY KEY, b INT, c INT);
|
||||||
|
INSERT INTO t1(a) VALUES(1),(2),(8),(19);
|
||||||
|
CREATE TABLE c1(x INTEGER PRIMARY KEY, b INT);
|
||||||
|
INSERT INTO c1(x,b) VALUES(1,1),(8,8),(17,17),(NULL,NULL);
|
||||||
|
CREATE TABLE c2(x INT,c INT);
|
||||||
|
INSERT INTO c2(x,c) VALUES(2,2),(8,8),(NULL,NULL);
|
||||||
|
CREATE TABLE dual(dummy TEXT);
|
||||||
|
INSERT INTO dual VALUES('X');
|
||||||
|
} {}
|
||||||
|
do_execsql_test 210 {
|
||||||
|
BEGIN;
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
UPDATE t1 SET b=c1.b, c=c2.c
|
||||||
|
FROM dual, c1 NATURAL RIGHT JOIN c2
|
||||||
|
WHERE x=a;
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
ROLLBACK;
|
||||||
|
} {
|
||||||
|
1 - -
|
||||||
|
2 - -
|
||||||
|
8 - -
|
||||||
|
19 - -
|
||||||
|
1 - -
|
||||||
|
2 - 2
|
||||||
|
8 8 8
|
||||||
|
19 - -
|
||||||
|
}
|
||||||
|
do_execsql_test 300 {
|
||||||
|
CREATE TABLE t2(x);
|
||||||
|
CREATE TRIGGER AFTER INSERT ON t2 BEGIN
|
||||||
|
UPDATE t1 SET b=c1.b, c=c2.c
|
||||||
|
FROM dual, c1 NATURAL RIGHT JOIN c2
|
||||||
|
WHERE x=a;
|
||||||
|
END;
|
||||||
|
} {}
|
||||||
|
do_execsql_test 310 {
|
||||||
|
BEGIN;
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
INSERT INTO t2(x) VALUES(1);
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
ROLLBACK;
|
||||||
|
} {
|
||||||
|
1 - -
|
||||||
|
2 - -
|
||||||
|
8 - -
|
||||||
|
19 - -
|
||||||
|
1 - -
|
||||||
|
2 - 2
|
||||||
|
8 8 8
|
||||||
|
19 - -
|
||||||
|
}
|
||||||
|
|
||||||
|
# 2022-05-26 dbsqlfuzz crash-9401d6ba699f1257d352a657de236286bf2b14da
|
||||||
|
#
|
||||||
|
reset_db
|
||||||
|
db null -
|
||||||
|
do_execsql_test 400 {
|
||||||
|
CREATE TABLE t2(x,y,z PRIMARY KEY) WITHOUT ROWID;
|
||||||
|
INSERT INTO t2 VALUES(89,-89,6);
|
||||||
|
CREATE TABLE t1(a INT,b TEXT,c TEXT,d REAL) STRICT;
|
||||||
|
INSERT INTO t1 VALUES(1,'xyz','def',4.5);
|
||||||
|
CREATE TRIGGER t1tr BEFORE UPDATE ON t1 BEGIN
|
||||||
|
INSERT INTO t1(a,b) VALUES(1000,'uvw');
|
||||||
|
UPDATE t1 SET b=NULL FROM (SELECT CAST(a AS varchar) FROM t1 ORDER BY b) NATURAL LEFT FULL JOIN t1 AS text;
|
||||||
|
END;
|
||||||
|
UPDATE t1 SET b=b|100;
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
} {
|
||||||
|
1 100 def 4.5
|
||||||
|
1000 - - -
|
||||||
|
}
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
Reference in New Issue
Block a user