From: dan Date: Tue, 14 Apr 2026 18:08:30 +0000 (+0000) Subject: In RBU vacuum commands, do as SQLite does and ignore any trailing SQL statements... X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=ab6a63ec67b17c00370b3474a352fbd618451376;p=thirdparty%2Fsqlite.git In RBU vacuum commands, do as SQLite does and ignore any trailing SQL statements in the sql column of the sqlite_schema table. FossilOrigin-Name: cf7dad1b105ab35cd7180efec735b7cbeaf42b8d53dfec5582b63cd121c3425c --- diff --git a/ext/rbu/rbuvacuum.test b/ext/rbu/rbuvacuum.test index ad377a4beb..d98d3ab16b 100644 --- a/ext/rbu/rbuvacuum.test +++ b/ext/rbu/rbuvacuum.test @@ -397,4 +397,65 @@ do_test 3.5 { } {0 SQLITE_DONE} catch { db close } + +#------------------------------------------------------------------------- +# Test that a database that uses custom collation sequences can be RBU +# vacuumed. +# +reset_db + +do_execsql_test 4.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); + INSERT INTO t1 VALUES(1, 'i'); + INSERT INTO t1 VALUES(2, 'iiii'); + INSERT INTO t1 VALUES(3, 'ii'); + INSERT INTO t1 VALUES(4, 'iii'); + + PRAGMA writable_schema = ON; + UPDATE sqlite_schema SET sql = sql || '; SELECT blow_up_the_world();'; + + SELECT sql FROM sqlite_schema; +} {{CREATE TABLE t1(a INTEGER PRIMARY KEY, b); SELECT blow_up_the_world();}} + +set ::eof 0 +proc blowup {} { + set ::eof 1 +} + + +db close + +do_test 4.1 { + sqlite3rbu_vacuum rbu test.db state.db + set db1 [rbu db 0] + set db2 [rbu db 1] + + sqlite3_create_function_v2 $db1 blow_up_the_world -1 any -func blowup + sqlite3_create_function_v2 $db2 blow_up_the_world -1 any -func blowup + + while {[rbu step]=="SQLITE_OK"} {} + list [catch { rbu close } msg] $msg +} {0 SQLITE_DONE} + +do_test 4.2 { set ::eof } 0 + +sqlite3 db test.db +do_execsql_test 4.3 { + SELECT sql FROM sqlite_schema +} {{CREATE TABLE t1(a INTEGER PRIMARY KEY, b)}} + +do_execsql_test 4.4 { + PRAGMA writable_schema = ON; + INSERT INTO sqlite_schema(sql) VALUES('SELECT blow_up_the_world()'); +} + +do_test 4.5 { + sqlite3rbu_vacuum rbu test.db state.db + while {[rbu step]=="SQLITE_OK"} {} + list [catch { rbu close } msg] $msg +} {1 {SQLITE_CORRUPT - malformed database schema (?)}} + + + + finish_test diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index f377d5c30d..39fe3167d6 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -3655,7 +3655,12 @@ static void rbuCreateTargetSchema(sqlite3rbu *p){ while( p->rc==SQLITE_OK && sqlite3_step(pSql)==SQLITE_ROW ){ const char *zSql = (const char*)sqlite3_column_text(pSql, 0); - p->rc = sqlite3_exec(p->dbMain, zSql, 0, 0, &p->zErrmsg); + sqlite3_stmt *pStmt = 0; + p->rc = prepareAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, zSql); + if( p->rc==SQLITE_OK ){ + sqlite3_step(pStmt); + rbuFinalize(p, pStmt); + } } rbuFinalize(p, pSql); if( p->rc!=SQLITE_OK ) return; diff --git a/manifest b/manifest index 12b8179713..a6cbb0c767 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Check-in\s[495e4851d4296b49]\sbreaks\sthe\sbuild\sfor\sWindows.\s\sFixed\shere. -D 2026-04-14T18:06:41.509 +C In\sRBU\svacuum\scommands,\sdo\sas\sSQLite\sdoes\sand\signore\sany\strailing\sSQL\sstatements\sin\sthe\ssql\scolumn\sof\sthe\ssqlite_schema\stable. +D 2026-04-14T18:08:30.170 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -463,11 +463,11 @@ F ext/rbu/rburesume.test 1403752d152b55efb7fc25749c0fccc790061371ec9ffe428cc04f8 F ext/rbu/rbusave.test 588b618dad9d65c4b13d03a79931de82213503fedc26bdf5789c996ecf427fba F ext/rbu/rbusplit.test a6dedd23cf37bcf2e8646d9d7139846e96d60d92f9bc6d6ba6ca8c24c0bd1f72 F ext/rbu/rbutemplimit.test 4980df2d4b74f4dd982add8f78809106154ef5a3c4bdce747422ab0b0481e029 -F ext/rbu/rbuvacuum.test 542561741ff2b262e3694bc6012b44694ee62c545845319a06f323783b15311e +F ext/rbu/rbuvacuum.test e3585cfda220038e8186c583e9bd2aaa9eccd0a5c2e40ed861de3c987c93f68c F ext/rbu/rbuvacuum2.test 1a9bd41f127be2826de2a65204df9118525a8af8d16e61e6bc63ba3ac0010a23 F ext/rbu/rbuvacuum3.test 3ce42695fdf21aaa3499e857d7d4253bc499ad759bcd6c9362042c13cd37d8de F ext/rbu/rbuvacuum4.test ffccd22f67e2d0b380d2889685742159dfe0d19a3880ca3d2d1d69eefaebb205 -F ext/rbu/sqlite3rbu.c e99400d29d029936075e27495b269a2dcdceae3cf8c86b1d0869b4af487be3ab +F ext/rbu/sqlite3rbu.c 28246b647831409e84dfb8286fbeda55f1de89e934571509a23a67ada572d0c0 F ext/rbu/sqlite3rbu.h e3a5bf21e09ca93ce4e8740e00d6a853e90a697968ec0ea98f40826938bdb68e F ext/rbu/test_rbu.c 8b6e64e486c28c41ef29f6f4ea6be7b3091958987812784904f5e903f6b56418 F ext/recover/dbdata.c 10d3c56968a9af6853722a47280805ad1564714d79ea45ac6f7da14bb57fd137 @@ -2198,8 +2198,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P aa3432af90b2b9ab0b92f56a8e9c926930b9859e986500bd00d5600c1dd036bf -R 1fe24f779b0bd589c28180efb499a161 -U drh -Z f3928a2dde1f65cfcdc7de9df306f3dd +P 5b004348c3ec15a02dd657b3619502b6f8ba1c6f46918108b3de9534622076a0 +R 5a78f3486ec2ef3c0d457d1e4a6e8841 +U dan +Z 77a5371b12f9a0b0266c2dba35f30986 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 795f279855..d1b84b1daf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b004348c3ec15a02dd657b3619502b6f8ba1c6f46918108b3de9534622076a0 +cf7dad1b105ab35cd7180efec735b7cbeaf42b8d53dfec5582b63cd121c3425c