1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00

Fix a case causing infinitely recursive calls to vec1.xSavepoint.

FossilOrigin-Name: a6f0843000e537a68be9e65693e8da276a4f66302a9a3c72f3a3417b6d275272
This commit is contained in:
dan
2026-10-06 10:30:12 +00:00
parent a3426a5bcc
commit 77dd26bbed
4 changed files with 79 additions and 11 deletions

View File

@@ -0,0 +1,55 @@
# 2026-10-06
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#***********************************************************************
#
# Test cases where a %_idx list is flushed to disk mid-transaction.
#
source [file join [file dirname [info script]] vec1_common.tcl]
set testprefix vec1overflow
vec1_load db
do_execsql_test 1.0 {
CREATE VIRTUAL TABLE v1 USING vec1(v);
CREATE TABLE t1(x);
WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100)
INSERT INTO t1 SELECT random_vector(8) FROM s;
INSERT INTO v1(cmd, arg) VALUES('rebuild', (
SELECT vec1_train(x, '{nbucket:1}') FROM t1
));
INSERT INTO v1(rowid, v) SELECT rowid, x FROM t1;
}
do_execsql_test 1.1 {
INSERT INTO v1(rowid, v) VALUES(4294967296, random_vector(8));
PRAGMA integrity_check;
} {ok}
reset_db
vec1_load db
do_execsql_test 2.0 {
CREATE VIRTUAL TABLE v1 USING vec1(v);
CREATE TABLE t1(x);
WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100)
INSERT INTO t1 SELECT random_vector(8) FROM s;
INSERT INTO v1(cmd, arg) VALUES('rebuild', (
SELECT vec1_train(x, '{nbucket:1}') FROM t1
));
INSERT INTO v1(cmd, arg) VALUES('blocksize', 1024);
}
do_execsql_test 2.1 {
WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<200)
INSERT INTO v1(rowid, v) SELECT i, random_vector(8) FROM s;
SELECT count(*)>1 FROM v1_idx;
PRAGMA integrity_check;
} {1 ok}
finish_test

View File

@@ -5870,7 +5870,7 @@ static int vec1PrepareSql(
}
#define VEC1_SQL_SCAN_BASE 1
#define VEC1_SQL_REPLACE_IDX 2
#define VEC1_SQL_INSERT_IDX 2
#define VEC1_SQL_SCAN_IDX 3
#define VEC1_SQL_CNT_IDX 4
@@ -5889,7 +5889,7 @@ static int vec1GetSql(Vec1Tab *pTab, int eSql, sqlite3_stmt **ppStmt){
#define VEC1_SQL_INSERT_BASE 0
"INSERT INTO %Q.'%q_base' VALUES(?, ?%s)",
"SELECT * FROM %Q.'%q_base' ORDER BY 1",
"REPLACE INTO %Q.'%q_idx'(id, bucket, first, last, val)VALUES(?,?,?,?,?)",
"INSERT INTO %Q.'%q_idx'(id, bucket, first, last, val)VALUES(?,?,?,?,?)",
"SELECT val, bucket, rowid FROM %Q.'%q_idx'",
"SELECT sum( length(val) / ? ) FROM %Q.'%q_idx'",
@@ -9983,7 +9983,19 @@ static int vec1ListBuilderFlush(Vec1ListBuilder *p){
memcpy(&aBlob[VEC1_LIST_SZHDR], p->bufRowid.a, p->bufRowid.n);
memcpy(&aBlob[VEC1_LIST_SZHDR+p->bufRowid.n], p->bufData.a, p->bufData.n);
rc = vec1GetSql(p->pTab, VEC1_SQL_REPLACE_IDX, &pStmt);
if( p->iId>0 ){
/* If there is an existing entry, remove it */
rc = vec1GetSql(p->pTab, VEC1_SQL_DELETE_FROM_IDX, &pStmt);
if( rc==SQLITE_OK ){
sqlite3_bind_int64(pStmt, 1, p->iId);
sqlite3_step(pStmt);
vec1StmtReset(&rc, pStmt);
}
}
if( rc==SQLITE_OK ){
rc = vec1GetSql(p->pTab, VEC1_SQL_INSERT_IDX, &pStmt);
}
if( rc==SQLITE_OK ){
if( p->iId==0 ){
sqlite3_bind_null(pStmt, 1);

View File

@@ -1,5 +1,5 @@
C Fix\sthe\sbuild\sfor\sSQLITE_OMIT_WSD.
D 2026-10-06T09:30:23.599
C Fix\sa\scase\scausing\sinfinitely\srecursive\scalls\sto\svec1.xSavepoint.
D 2026-10-06T10:30:12.845
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -623,6 +623,7 @@ F ext/vec1/test/vec1meta.test 5a3ae0338a6168bab4a381817b13425028b6ab04dff2700650
F ext/vec1/test/vec1meta2.test 4997a26728d24aaf8219b3c168209df00f8174eec521415ff94dfdd2d7db5da0
F ext/vec1/test/vec1meta3.test 91907adb451e17b777f526dd39c8cdfd2c5928a47b3a864eb2df6b812a8ce461
F ext/vec1/test/vec1nan.test 3ff3fe4b0f33a5c1f4129ba318443e7d927fd9dd6fc339349fea3c57fe140a8c
F ext/vec1/test/vec1overflow.test f007c6b149b434bc6593501c48214535151cb989620e18d48dbca51e7d9c98c7
F ext/vec1/test/vec1pq.test 81d74f516971a3883782d2d443efe3f6a7501d4c9f980a758e1c2eb8b5f22885
F ext/vec1/test/vec1query.test 7120a2824b9f6563f7986c436204870c9d6e4af2bff3a39d38ef277188ef9189
F ext/vec1/test/vec1rollback.test 41565f526e153b24615ed38edda835fbb185f2f07f5e72f5c947add810b33d71
@@ -640,7 +641,7 @@ F ext/vec1/tool/vec1_algo_test.c c62b828a3e46a39a8656f26b74804906cc3160758f8afc6
F ext/vec1/tool/vec1bench.tcl a117caee3cb99712f0477fe2fa85c94c260866951d3a9d667b62631b480c2d2d
F ext/vec1/tool/vec1bench_addcols.tcl 8c509253d07b179928f2ee32e3591a2c70d13c914217e1328c01afa148717051
F ext/vec1/tool/vec1bench_vibe2db.py 84ddb0236bc3d02a0393abce41986a1b7dad7f0d83884576f8318c2883e3aed3
F ext/vec1/vec1.c 08cd74248dd2707e8a59943007e1dbcac2946e60b9d55c261f4810d1689b17fa
F ext/vec1/vec1.c 80a28a4914a0abea720372d9ae36f6855aa664edfa0709542a0abce5945fe440
F ext/wasm/GNUmakefile cc28e65dec12f1b992957152d8395484f4fcf7f94e6b6736a09ee4f48e7ec048
F ext/wasm/README-dist.txt f01081a850ce38a56706af6b481e3a7878e24e42b314cfcd4b129f0f8427066a
F ext/wasm/README.md 2e87804e12c98f1d194b7a06162a88441d33bb443efcfe00dc6565a780d2f259
@@ -2279,8 +2280,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
P a61987887a942abc4bdd10691455211b9b93028dd8c6cd5302bbd406f6474cc7
R e0073611c3c3666a5d43429d53f9b682
U drh
Z 09a82a3497a92b71660982af068e85b0
P 4bf968095f427e87ae3afe498f74e00e9058b154e12e2d261f317640f4b49cc4
R 45397a61da4ae3f4271291969ad517da
U dan
Z 51feb3211d73fd62480d652a105feaad
# Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
4bf968095f427e87ae3afe498f74e00e9058b154e12e2d261f317640f4b49cc4
a6f0843000e537a68be9e65693e8da276a4f66302a9a3c72f3a3417b6d275272