Avoid dropping RETURNING triggers when the schema is reset while preparing a statement.

FossilOrigin-Name: e26bcef7522a6f6ee8d55fa30e7fe06419566cf4e8c2df0c33c92a4c89f58c05
This commit is contained in:
dan
2025-11-10 17:37:59 +00:00
parent a79f685533
commit 14fcb8252a
7 changed files with 99 additions and 15 deletions
+13 -10
View File
@@ -1,5 +1,5 @@
C Fix\sa\smissing\sva_end()\scall\sin\sthe\sintckMprintf()\sfunction\sof\sthe\nincremental\sintegrity-check\sextension.
D 2025-11-10T11:05:36.073
C Avoid\sdropping\sRETURNING\striggers\swhen\sthe\sschema\sis\sreset\swhile\spreparing\sa\sstatement.
D 2025-11-10T17:37:59.666
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -675,7 +675,7 @@ F src/btree.c 0ad524883ec4ccac3221c97bdc2c5d5f6e149504e14cf269bbed31362c3f4393
F src/btree.h e823c46d87f63d904d735a24b76146d19f51f04445ea561f71cc3382fd1307f0
F src/btreeInt.h 9c0f9ea5c9b5f4dcaea18111d43efe95f2ac276cd86d770dce10fd99ccc93886
F src/build.c 611e07299d72ff04bbcb9e7109183467e30925d203c3e121ef9bb3cf6876289b
F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859
F src/callback.c afa59adfaa483f668260ce69f740c8273dee3e6fee9106846e0499ebdd1ac076
F src/carray.c ff6081a31878fc34df8fa1052a9cbf17ddc22652544dcb3e2326886ed1053b55
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
F src/date.c e19e0cfff9a41bfdd884c655755f6f00bca4c1a22272b56e0dd6667b7ea893a2
@@ -687,8 +687,8 @@ F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f
F src/func.c 0b802107498048d3dcac0b757720bcb8506507ce02159e213ab8161458eb293b
F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b
F src/hash.c 73934a7f7ab1cb110614a9388cb516893b0cf5b7b69e4fd1a0780ac4ce166be7
F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf
F src/hash.c e592527b97e99cd9046946a397d9ed63d8b466b385c8129249175a3bf22ee33c
F src/hash.h c5f4a02aaf1dca835a68b51c8b906af265c6ca3d8d53d255e0453f0abce561be
F src/hwtime.h d4d1b98c1afdc56986a5c0eba882786ef017e2180a320da25b4231b8e7e463e8
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
F src/insert.c dfd311b0ac2d4f6359e62013db67799757f4d2cc56cca5c10f4888acfbbfa3fd
@@ -1522,7 +1522,7 @@ F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2
F test/reservebytes.test 6163640b5a5120c0dee6591481e673a0fa0bf0d12d4da7513bad692c1a49a162
F test/resetdb.test 54c06f18bc832ac6d6319e5ab23d5c8dd49fdbeec7c696d791682a8006bd5fc3
F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb
F test/returning1.test 212cd4111bb941a60abf608f20250db666c21eb1bc4d49217e96c87ff3ab9d1a
F test/returning1.test cd32517148948859db214dd814354597dd40e7489259590fac1a4f7bf44deb97
F test/returningfault.test ae4c4b5e8745813287a359d9ccdb9d5c883c2e68afb18fb0767937d5de5692a4
F test/rollback.test 952c4d805bca96adc2be76f621ea22115fe40b330015af36fcc8028c8547fcee
F test/rollback2.test 3f3a4e20401825017df7e7671e9f31b6de5fae5620c2b9b49917f52f8c160a8f
@@ -2167,8 +2167,11 @@ F tool/version-info.c 33d0390ef484b3b1cb685d59362be891ea162123cea181cb8e6d2cf6dd
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P 7a644178c8d289ca18631844b2d73b32fddc72afcc80906633dd38c14eba2ca9
R bd6b05ffc04557a9ff7d69a81e6084d5
U drh
Z a1230748ab427e1519659da8a04065cb
P 62ad2350e368dc337ba2d0fb6847d07c40a6f79520dd6414d22b5b54983b0b12
R 43727fa3b19bd9f550a5daad80497dd6
T *branch * returning-fix
T *sym-returning-fix *
T -sym-trunk *
U dan
Z 7df20ffae687bc1753586d20b75ba681
# Remove this line to create a well-formed Fossil manifest.
+2 -2
View File
@@ -1,2 +1,2 @@
branch trunk
tag trunk
branch returning-fix
tag returning-fix
+1 -1
View File
@@ -1 +1 @@
62ad2350e368dc337ba2d0fb6847d07c40a6f79520dd6414d22b5b54983b0b12
e26bcef7522a6f6ee8d55fa30e7fe06419566cf4e8c2df0c33c92a4c89f58c05
+10 -2
View File
@@ -504,8 +504,16 @@ void sqlite3SchemaClear(void *p){
temp2 = pSchema->trigHash;
sqlite3HashInit(&pSchema->trigHash);
sqlite3HashClear(&pSchema->idxHash);
for(pElem=sqliteHashFirst(&temp2); pElem; pElem=sqliteHashNext(pElem)){
sqlite3DeleteTrigger(&xdb, (Trigger*)sqliteHashData(pElem));
for(pElem=sqliteHashFirst(&temp2); pElem; ){
HashElem *pNext = sqliteHashNext(pElem);
Trigger *pTrig = (Trigger*)sqliteHashData(pElem);
if( pTrig->bReturning ){
/* Do not remove RETURNING triggers from the temp-triggers hash */
sqlite3HashTransfer(&pSchema->trigHash, &temp2, pElem);
}else{
sqlite3DeleteTrigger(&xdb, pTrig);
}
pElem = pNext;
}
sqlite3HashClear(&temp2);
sqlite3HashInit(&pSchema->tblHash);
+22
View File
@@ -270,3 +270,25 @@ void *sqlite3HashInsert(Hash *pH, const char *pKey, void *data){
insertElement(pH, pH->ht ? &pH->ht[new_elem->h % pH->htsize] : 0, new_elem);
return 0;
}
/*
** Parameter pElem is currently part of hash table pFrom. Add it to hash
** table pTo.
**
** This procedure corrupts hash table pFrom. Specifically, it removes element
** pElem from the list of all elements in the hash table, but may leave
** a pointer to it in one of the hash buckets of pFrom. This is not a problem
** because this function is only called if hash table pFrom will be cleared
** before any further lookups or inserts are attempted.
*/
void sqlite3HashTransfer(Hash *pTo, Hash *pFrom, HashElem *pElem){
if( pElem->prev ){
pElem->prev->next = pElem->next;
}else{
assert( pFrom->first==pElem );
pFrom->first = pElem->next;
}
insertElement(pTo, pTo->ht ? &pTo->ht[pElem->h % pTo->htsize] : 0, pElem);
}
+1
View File
@@ -70,6 +70,7 @@ void sqlite3HashInit(Hash*);
void *sqlite3HashInsert(Hash*, const char *pKey, void *pData);
void *sqlite3HashFind(const Hash*, const char *pKey);
void sqlite3HashClear(Hash*);
void sqlite3HashTransfer(Hash*, Hash*, HashElem *pElem);
/*
** Macros for looping over all elements of a hash table. The idiom is
+50
View File
@@ -544,4 +544,54 @@ do_catchsql_test 22.1 {
} {1 {no such column: sqlite_master.name}}
#-------------------------------------------------------------------------
reset_db
do_execsql_test 23.0 {
PRAGMA recursive_triggers = 1;
CREATE TABLE t1(x, y);
CREATE TRIGGER t1insert AFTER INSERT ON t1 WHEN new.x<5 BEGIN
INSERT INTO t1 VALUES(new.x+1, new.y);
END;
}
do_execsql_test 23.1 {
INSERT INTO t1 VALUES(1, 'one') RETURNING *;
} {1 one}
do_execsql_test 23.2 {
SELECT * FROM t1
} {1 one 2 one 3 one 4 one 5 one}
#-------------------------------------------------------------------------
reset_db
ifcapable fts5 {
do_execsql_test 24.0 {
CREATE VIRTUAL TABLE ft USING fts5(c);
CREATE TABLE t1(x);
INSERT INTO t1 VALUES('x');
}
db close
sqlite3 db test.db
sqlite3 db2 test.db
do_execsql_test 24.1 {
SELECT * FROM t1
} {x}
do_execsql_test -db db2 24.2 {
CREATE TABLE t2(y);
INSERT INTO t2 VALUES('y');
} {}
db2 close
do_execsql_test 24.3 {
INSERT INTO ft VALUES('hello world') RETURNING *
} {{hello world}}
}
finish_test