mirror of
https://github.com/tursodatabase/libsql.git
synced 2025-03-14 06:38:01 +00:00
RETURNING bug fix: Correctly deal with RETURNING statements on changes to
TEMP tables that also have triggers. dbsqlfuzz 78b9400770ef8cc7d9427dfba26f4fcf46ea7dc2 FossilOrigin-Name: d0b15eccbfe1e50c3daf7b2fd4769a52bba35d553b07e462ca3f5f22df6742fd
This commit is contained in:
20
manifest
20
manifest
@ -1,5 +1,5 @@
|
||||
C Fix\sa\ssegfault\sthat\scould\soccur\swhen\squerying\sa\scorrupt\sdata\sstructures\swith\san\sfts5token\stable.
|
||||
D 2021-04-27T11:28:57.305
|
||||
C RETURNING\sbug\sfix:\s\sCorrectly\sdeal\swith\sRETURNING\sstatements\son\schanges\sto\nTEMP\stables\sthat\salso\shave\striggers.\ndbsqlfuzz\s78b9400770ef8cc7d9427dfba26f4fcf46ea7dc2
|
||||
D 2021-04-27T13:04:18.170
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||
@ -487,7 +487,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
|
||||
F src/btree.c 0555f7e97ede886ac3d7aaec363b44498c9716dd45f3f0484de31eb90e30a37e
|
||||
F src/btree.h 096cc53baa58be22b02c896d1cf933c38cfc6d65f9253c1367ece8cc88a24de5
|
||||
F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0
|
||||
F src/build.c f4072218dacf42f45b733d1a9a98b3a4d7b8c676a7e5d8ff17d70b60aff687ae
|
||||
F src/build.c 1310181a298ea9d9b36a3d3d74b0b1d6d3e164b25c6252fa9d30fa7c0a7691a5
|
||||
F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c
|
||||
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
|
||||
F src/ctime.c 2a322b9a3d75771fb4d99e0702851f4f68dda982507a0f798eefb0712969a410
|
||||
@ -609,7 +609,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
||||
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
||||
F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e
|
||||
F src/treeview.c e483aeedf6f207000db1f90eb6abd816350493314c30e8749d319bdb9ab3b08c
|
||||
F src/trigger.c f8493674f5c8f103c1a2cd0616af9dca85c7058450f9fe47cacd15cf5d512d52
|
||||
F src/trigger.c 6b32e50b880c5e570c3c37331d47f2cb18335935a9816f143c0b414d2beee93c
|
||||
F src/update.c b3abdaf4a314bbed238da69a6ca54c0f21262119389b412ee5778fffe62dd3cc
|
||||
F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235
|
||||
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
|
||||
@ -645,7 +645,7 @@ F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13
|
||||
F test/alter.test f53d8a4ecd35f051c07e54a36beec5d0a30d30a9d98bc723f6cde6afbfb3c5ca
|
||||
F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687
|
||||
F test/alter3.test e487958dec7932453e0b83baf21d6b1e71d5e7d9a55bc20eadfa62a51ddffc29
|
||||
F test/alter4.test dfd6086faf461b27ca2d2999848dcd207edf23352fc1592d0005c0844f3f08cf
|
||||
F test/alter4.test 716caa071dd8a3c6d57225778d15d3c3cbf5e34b2e84ae44199aeb2bbf50a707
|
||||
F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959
|
||||
F test/alterauth2.test 381b1ab603c9ef96314a3158528ea17f7964449385a28eeaf8191120b2e24a8d
|
||||
F test/altercol.test b11fa1b131e80ab5b6ecfb3b725fb0419c14ca6efba5adb57aeabfc9baa0c8f3
|
||||
@ -1299,7 +1299,7 @@ F test/releasetest.tcl 8dcfc21d6b4a4a1d9a8503de0a94800d129ec8f03ef53d6e68b79ef78
|
||||
F test/releasetest_data.tcl a864d27370e812c34a05224d6144ca082463906d5a4651782ad3b43712ab166a
|
||||
F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b
|
||||
F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb
|
||||
F test/returning1.test 99012dc464860e1502153276d5e5c2bee32c53d3a866dcfc09b39932048e2276
|
||||
F test/returning1.test 03ef5c149d6e04c75d5ddd0d4a58a5bed5859faa4a72d74ac7a2093d6a2ede19
|
||||
F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa
|
||||
F test/rollback2.test 3f3a4e20401825017df7e7671e9f31b6de5fae5620c2b9b49917f52f8c160a8f
|
||||
F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a
|
||||
@ -1914,7 +1914,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P 7e18e114b245d17aa259ea9ab42752ccc9ad5303bbac8d8e46928dd10319f545
|
||||
R 94e1ea33ad9ba6b0dbbaecf2b13998ec
|
||||
U dan
|
||||
Z ee8ca3be45fa2c821c20209430a0aa50
|
||||
P cbedfa05501f3eb9750fb21e2ab8516f8f14c479c847f454e52572af278aab71
|
||||
R a976188e13a3ac3ca205f341c810934f
|
||||
U drh
|
||||
Z 3100e8a3f8619ad426bba2c803a9756c
|
||||
|
@ -1 +1 @@
|
||||
cbedfa05501f3eb9750fb21e2ab8516f8f14c479c847f454e52572af278aab71
|
||||
d0b15eccbfe1e50c3daf7b2fd4769a52bba35d553b07e462ca3f5f22df6742fd
|
@ -1323,6 +1323,7 @@ void sqlite3AddReturning(Parse *pParse, ExprList *pList){
|
||||
pRet->retTrig.tr_tm = TRIGGER_AFTER;
|
||||
pRet->retTrig.bReturning = 1;
|
||||
pRet->retTrig.pSchema = db->aDb[1].pSchema;
|
||||
pRet->retTrig.pTabSchema = db->aDb[1].pSchema;
|
||||
pRet->retTrig.step_list = &pRet->retTStep;
|
||||
pRet->retTStep.op = TK_RETURNING;
|
||||
pRet->retTStep.pTrig = &pRet->retTrig;
|
||||
|
@ -60,30 +60,44 @@ Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){
|
||||
if( p==0 ){
|
||||
return pTab->pTrigger;
|
||||
}
|
||||
pList = pTab->pTrigger;
|
||||
if( pTmpSchema!=pTab->pSchema ){
|
||||
while( p ){
|
||||
Trigger *pTrig = (Trigger *)sqliteHashData(p);
|
||||
if( pTrig->pTabSchema==pTab->pSchema
|
||||
&& 0==sqlite3StrICmp(pTrig->table, pTab->zName)
|
||||
){
|
||||
pTrig->pNext = pList;
|
||||
pList = pTrig;
|
||||
}else if( pTrig->op==TK_RETURNING
|
||||
#ifndef SQLITE_OMIT_VIRTUALTABLE
|
||||
&& pParse->db->pVtabCtx==0
|
||||
#endif
|
||||
){
|
||||
assert( pParse->bReturning );
|
||||
assert( &(pParse->u1.pReturning->retTrig) == pTrig );
|
||||
pTrig->table = pTab->zName;
|
||||
pTrig->pTabSchema = pTab->pSchema;
|
||||
pTrig->pNext = pList;
|
||||
pList = pTrig;
|
||||
}
|
||||
p = sqliteHashNext(p);
|
||||
}
|
||||
if( pTmpSchema==pTab->pSchema ){
|
||||
pList = 0;
|
||||
}else{
|
||||
pList = pTab->pTrigger;
|
||||
}
|
||||
while( p ){
|
||||
Trigger *pTrig = (Trigger *)sqliteHashData(p);
|
||||
if( pTrig->pTabSchema==pTab->pSchema
|
||||
&& pTrig->table
|
||||
&& 0==sqlite3StrICmp(pTrig->table, pTab->zName)
|
||||
){
|
||||
pTrig->pNext = pList;
|
||||
pList = pTrig;
|
||||
}else if( pTrig->op==TK_RETURNING
|
||||
#ifndef SQLITE_OMIT_VIRTUALTABLE
|
||||
&& pParse->db->pVtabCtx==0
|
||||
#endif
|
||||
){
|
||||
assert( pParse->bReturning );
|
||||
assert( &(pParse->u1.pReturning->retTrig) == pTrig );
|
||||
pTrig->table = pTab->zName;
|
||||
pTrig->pTabSchema = pTab->pSchema;
|
||||
pTrig->pNext = pList;
|
||||
pList = pTrig;
|
||||
}
|
||||
p = sqliteHashNext(p);
|
||||
}
|
||||
#if 0
|
||||
if( pList ){
|
||||
Trigger *pX;
|
||||
printf("Triggers for %s:", pTab->zName);
|
||||
for(pX=pList; pX; pX=pX->pNext){
|
||||
printf(" %s", pX->zName);
|
||||
}
|
||||
printf("\n");
|
||||
fflush(stdout);
|
||||
}
|
||||
#endif
|
||||
return pList;
|
||||
}
|
||||
|
||||
|
@ -318,16 +318,16 @@ ifcapable trigger&&tempdb {
|
||||
END;
|
||||
|
||||
INSERT INTO t1 VALUES(1, 2);
|
||||
SELECT * FROM log;
|
||||
SELECT * FROM log ORDER BY trig, a, b;
|
||||
}
|
||||
} {b 1 2 a 1 2}
|
||||
} {a 1 2 b 1 2}
|
||||
do_test alter4-6.2 {
|
||||
execsql {
|
||||
ALTER TABLE t1 ADD COLUMN c DEFAULT 'c';
|
||||
INSERT INTO t1(a, b) VALUES(3, 4);
|
||||
SELECT * FROM log;
|
||||
SELECT * FROM log ORDER BY trig, a, b;
|
||||
}
|
||||
} {b 1 2 a 1 2 b 3 4 a 3 4}
|
||||
} {a 1 2 a 3 4 b 1 2 b 3 4}
|
||||
}
|
||||
|
||||
# Ticket #1183 - Make sure adding columns to large tables does not cause
|
||||
|
@ -224,4 +224,60 @@ do_execsql_test 10.4 {
|
||||
SELECT * FROM log;
|
||||
} {}
|
||||
|
||||
# 2021-04-27 dbsqlfuzz 78b9400770ef8cc7d9427dfba26f4fcf46ea7dc2
|
||||
# Returning clauses on TEMP tables with triggers.
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 11.1 {
|
||||
CREATE TEMP TABLE t1(a,b);
|
||||
CREATE TEMP TABLE t2(c,d);
|
||||
CREATE TEMP TABLE t3(e,f);
|
||||
CREATE TEMP TABLE log(op,x,y);
|
||||
CREATE TEMP TRIGGER t1r1 AFTER INSERT ON t1 BEGIN
|
||||
INSERT INTO log(op,x,y) VALUES('I1',new.a,new.b);
|
||||
END;
|
||||
CREATE TEMP TRIGGER t1r2 BEFORE DELETE ON t1 BEGIN
|
||||
INSERT INTO log(op,x,y) VALUES('D1',old.a,old.b);
|
||||
END;
|
||||
CREATE TEMP TRIGGER t2r3 AFTER UPDATE ON t1 BEGIN
|
||||
INSERT INTO log(op,x,y) VALUES('U1',new.a,new.b);
|
||||
END;
|
||||
CREATE TEMP TRIGGER t2r1 BEFORE INSERT ON t2 BEGIN
|
||||
INSERT INTO log(op,x,y) VALUES('I2',new.c,new.d);
|
||||
END;
|
||||
CREATE TEMP TRIGGER t3r1 AFTER DELETE ON t3 BEGIN
|
||||
INSERT INTO log(op,x,y) VALUES('D3',old.e,old.f);
|
||||
END;
|
||||
CREATE TEMP TRIGGER t3r2 BEFORE UPDATE ON t3 BEGIN
|
||||
INSERT INTO log(op,x,y) VALUES('U3',new.e,new.f);
|
||||
END;
|
||||
INSERT INTO t1(a,b) VALUES(1,2),('happy','glad') RETURNING a, b, '|';
|
||||
} {1 2 | happy glad |}
|
||||
do_execsql_test 11.2 {
|
||||
UPDATE t1 SET b=9 WHERE a=1 RETURNING a, b, 'x';
|
||||
} {1 9 x}
|
||||
do_execsql_test 11.3 {
|
||||
DELETE FROM t1 WHERE a<>'xray' RETURNING a, b, '@';
|
||||
} {1 9 @ happy glad @}
|
||||
do_execsql_test 11.4 {
|
||||
SELECT * FROM log;
|
||||
DELETE FROM log;
|
||||
} {I1 1 2 I1 happy glad U1 1 9 D1 1 9 D1 happy glad}
|
||||
do_execsql_test 11.5 {
|
||||
INSERT INTO t2 VALUES('bravo','charlie') RETURNING d, c, 'z';
|
||||
} {charlie bravo z}
|
||||
do_execsql_test 11.6 {
|
||||
SELECT * FROM log;
|
||||
DELETE FROM log;
|
||||
} {I2 bravo charlie}
|
||||
do_execsql_test 11.7 {
|
||||
INSERT INTO t3(e) VALUES(1),(2),(3) RETURNING 'I', e;
|
||||
UPDATE t3 SET f=e+100 RETURNING 'U', e, f;
|
||||
DELETE FROM t3 WHERE f>100 RETURNING 'D', e, f;
|
||||
} {I 1 I 2 I 3 U 1 101 U 2 102 U 3 103 D 1 101 D 2 102 D 3 103}
|
||||
do_execsql_test 11.6 {
|
||||
SELECT * FROM log;
|
||||
DELETE FROM log;
|
||||
} {U3 1 101 U3 2 102 U3 3 103 D3 1 101 D3 2 102 D3 3 103}
|
||||
|
||||
finish_test
|
||||
|
Reference in New Issue
Block a user