diff --git a/ext/qrf/README.md b/ext/qrf/README.md index 68919fe61d..394390e613 100644 --- a/ext/qrf/README.md +++ b/ext/qrf/README.md @@ -241,7 +241,8 @@ inject ANSI cursor movement sequences to hide nefarious values. The QRF_ESC_Auto value for eEsc means that the query result formatter gets to pick whichever control-character encoding it thinks is best for -the situation. This will usually be QRF_ESC_Ascii. +the situation. This will usually be QRF_ESC_Ascii, but there can be +exceptions. The TAB (U+0009), LF (U+000a) and CR-LF (U+000d,U+000a) character sequence are always output literally and are not mapped to alternative diff --git a/ext/qrf/qrf.c b/ext/qrf/qrf.c index 5f01f7953d..cd896e949c 100644 --- a/ext/qrf/qrf.c +++ b/ext/qrf/qrf.c @@ -2992,7 +2992,11 @@ qrf_reinit: } } if( p->spec.eEsc==QRF_Auto ){ - p->spec.eEsc = QRF_ESC_Ascii; + if( p->spec.eText==QRF_TEXT_Csv ){ + p->spec.eEsc = QRF_ESC_Off; + }else{ + p->spec.eEsc = QRF_ESC_Ascii; + } } if( p->spec.eText==QRF_Auto ){ p->spec.eText = QRF_TEXT_Plain; diff --git a/ext/session/sessionfault2.test b/ext/session/sessionfault2.test index a2dc39e437..c2e0ad3df9 100644 --- a/ext/session/sessionfault2.test +++ b/ext/session/sessionfault2.test @@ -217,7 +217,7 @@ do_faultsim_test 2.4 -faults oom* -prep { set {} {} } -test { catch { R delete } - faultsim_test_result {0 {}} {1 SQLITE_NOMEM} + faultsim_test_result_strict {0 {}} {1 SQLITE_NOMEM} } do_faultsim_test 2.5 -faults oom* -prep { catch {db2 close} diff --git a/ext/session/sessionrebase2.test b/ext/session/sessionrebase2.test index be42ece12c..8ea5e9df2a 100644 --- a/ext/session/sessionrebase2.test +++ b/ext/session/sessionrebase2.test @@ -54,8 +54,55 @@ do_test 2.0 { } {1 SQLITE_ERROR} do_test 2.1 { - set I2 [R rebase $I] + list [catch { set I2 [R rebase $I] } msg] $msg +} {1 SQLITE_CORRUPT} +do_test 2.2 { R delete } {} +#------------------------------------------------------------------------- +# +reset_db + +proc get_changeset {sql} { + execsql BEGIN + set cs [changeset_from_sql $sql] + execsql ROLLBACK + return $cs +} + +proc xConflict {args} { + set res [lindex $::lConflict 0] + set ::lConflict [lrange $::lConflict 1 end] + return $res +} + + +proc rebased {blobs cs} { + sqlite3rebaser_create R + foreach b $blobs { R configure $b } + set out [R rebase $cs] + R delete + changeset_to_list $out +} + +do_execsql_test 3.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); + INSERT INTO t1 VALUES(1, 'x'); +} + + +set c_peer1 [get_changeset {DELETE FROM t1 WHERE a=1}] +set c_peer2 [get_changeset {UPDATE t1 SET b='peer2' WHERE a=1}] +set c_local [changeset_from_sql {UPDATE t1 SET b='local' WHERE a=1}] + +set ::lConflict REPLACE +set b1 [sqlite3changeset_apply_v2 db $c_peer1 xConflict] +set ::lConflict OMIT +set b2 [sqlite3changeset_apply_v2 db $c_peer2 xConflict] + +do_test 3.1 { rebased [list $b1] $c_local } {} +do_test 3.2 { rebased [list $b2 $b1] $c_local } {} +do_test 3.3 { rebased [list $b1 $b2] $c_local } {} + finish_test diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index 0e22d221f8..98888ad8e7 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -6214,7 +6214,7 @@ static int sessionChangeMerge( } }else if( bRebase ){ if( pExist->op==SQLITE_DELETE && pExist->bIndirect ){ - *ppNew = pExist; + pNew = pExist; }else{ sqlite3_int64 nByte = nRec + pExist->nRecord + sizeof(SessionChange); pNew = (SessionChange*)sqlite3_malloc64(nByte); @@ -7223,6 +7223,7 @@ static int sessionRebase( } } sqlite3_free(sOut.aBuf); + if( rc==SQLITE_OK ) rc = pIter->rc; return rc; } diff --git a/ext/session/test_session.c b/ext/session/test_session.c index 40680ead74..bb8d46b099 100644 --- a/ext/session/test_session.c +++ b/ext/session/test_session.c @@ -13,6 +13,8 @@ typedef unsigned char u8; #endif +#include "sqliteInt.h" + extern const char *sqlite3ErrName(int); typedef struct TestSession TestSession; @@ -102,7 +104,9 @@ int sql_exec_changeset( static int sqlite3_test_changeset(int, void *, char **); static void assert_changeset_is_ok(int n, void *p){ char *z = 0; + sqlite3BeginBenignMalloc(); (void)sqlite3_test_changeset(n, p, &z); + sqlite3EndBenignMalloc(); assert( z==0 ); } #else diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile index 2822484f58..b47c5c1898 100644 --- a/ext/wasm/GNUmakefile +++ b/ext/wasm/GNUmakefile @@ -1096,7 +1096,6 @@ emcc.flags.fiddle = \ -sENVIRONMENT=web,worker \ -sMODULARIZE \ -sDYNAMIC_EXECUTION=0 \ - -sWASM_BIGINT=$(emcc.WASM_BIGINT) \ -sEXPORT_NAME=$(sqlite3.js.init-func) \ -Wno-limited-postlink-optimizations \ $(emcc.exportedRuntimeMethods),FS \ @@ -1312,7 +1311,6 @@ emcc.speedtest1.common += -sALLOW_TABLE_GROWTH emcc.speedtest1.common += -sDYNAMIC_EXECUTION=0 emcc.speedtest1.common += --minify 0 emcc.speedtest1.common += -sEXPORT_NAME=$(sqlite3.js.init-func) -emcc.speedtest1.common += -sWASM_BIGINT=$(emcc.WASM_BIGINT) speedtest1.exit-runtime0 = -sEXIT_RUNTIME=0 speedtest1.exit-runtime1 = -sEXIT_RUNTIME=1 # Re -sEXIT_RUNTIME=1 vs 0: if it's 1 and speedtest1 crashes, we get diff --git a/ext/wasm/api/sqlite3-api-glue.c-pp.js b/ext/wasm/api/sqlite3-api-glue.c-pp.js index ab9dcedefa..615c189934 100644 --- a/ext/wasm/api/sqlite3-api-glue.c-pp.js +++ b/ext/wasm/api/sqlite3-api-glue.c-pp.js @@ -1605,8 +1605,8 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ return __bindText(pStmt, iCol, text, nText, xDestroy); }else if(text instanceof ArrayBuffer){ text = new Uint8Array(text); - }else if(Array.isArray(pMem)){ - text = pMem.join(''); + }else if(Array.isArray(text)){ + text = text.join(''); } let p, n; try{ @@ -1614,7 +1614,7 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ p = wasm.allocFromTypedArray(text); n = text.byteLength; }else if('string'===typeof text){ - [p, n] = wasm.allocCString(text); + [p, n] = wasm.allocCString(text, true); }else{ return util.sqlite3__wasm_db_error( capi.sqlite3_db_handle(pStmt), capi.SQLITE_MISUSE, @@ -1648,7 +1648,7 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ p = wasm.allocFromTypedArray(pMem); n = nMem>=0 ? nMem : pMem.byteLength; }else if('string'===typeof pMem){ - [p, n] = wasm.allocCString(pMem); + [p, n] = wasm.allocCString(pMem, true); }else{ return util.sqlite3__wasm_db_error( capi.sqlite3_db_handle(pStmt), capi.SQLITE_MISUSE, diff --git a/ext/wasm/mkwasmbuilds.c b/ext/wasm/mkwasmbuilds.c index b883ff1733..7e4232d887 100644 --- a/ext/wasm/mkwasmbuilds.c +++ b/ext/wasm/mkwasmbuilds.c @@ -242,7 +242,7 @@ const BuildDefs oBuildDefs = { .zDotWasm = 0, .zCmppD = 0, .zEmcc = 0, - .zEmccExtra = "$(emcc.MEMORY64) -sWASM_BIGINT=1", + .zEmccExtra = "$(emcc.MEMORY64)", .zEnv = 0, .zDeps = 0, .zIfCond = 0, @@ -270,7 +270,7 @@ const BuildDefs oBuildDefs = { .zDotWasm = 0, .zCmppD = "-Dtarget:es6-module", .zEmcc = 0, - .zEmccExtra = "$(emcc.MEMORY64) -sWASM_BIGINT=1", + .zEmccExtra = "$(emcc.MEMORY64)", .zEnv = 0, .zDeps = 0, .zIfCond = 0, @@ -313,7 +313,7 @@ const BuildDefs oBuildDefs = { .zEmcc = "$(emcc.speedtest1)" " $(emcc.speedtest1.common)" - " $(emcc.MEMORY64) -sWASM_BIGINT=1" + " $(emcc.MEMORY64)" " $(pre-post.speedtest164.flags)" " $(cflags.common)" " -DSQLITE_SPEEDTEST1_WASM" @@ -496,11 +496,15 @@ static void mk_prologue(void){ ** Performance gains or losses are _not_ taken into account ** here, only wasm file size. */ +#if 1 + /* -Oz builds fail to build if we remove this block, for + as-yet-unknown reasons. */ "--enable-bulk-memory-opt " /* required */ "--all-features " /* required */ "--disable-compact-imports " /* https://github.com/emscripten-core/emscripten/issues/28016 */ +#endif "--post-emscripten " /* Saves roughly 12kb */ "--strip-debug " /* We already wasm-strip, but in ** case this environment has no @@ -880,9 +884,8 @@ static void mk_lib_mode(const char *zBuildName, const BuildDef * pB){ /* althttpd will automatically try to execute wasm files if they have the +x bit set. Why that bit is set at all is a mystery. */); - pf("\t@$(call b.call.wasm-strip,%s)\n", zBuildName); - pf("\t@$(call b.do.wasm-opt,%s)\n", zBuildName); + pf("\t@$(call b.call.wasm-strip,%s)\n", zBuildName); pf("\t@$(call b.strip-js-emcc-bindings,$(logtag.%s))\n", zBuildName); pf("\t@if [ x1 = 'x$(base64.wasm)' ]; then \\\n" diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js index 4307c7930b..bf57afdec2 100644 --- a/ext/wasm/tester1.c-pp.js +++ b/ext/wasm/tester1.c-pp.js @@ -1604,9 +1604,8 @@ T.g('sqlite3.oo1') //////////////////////////////////////////////////////////////////// .t('DB.Stmt', function(sqlite3){ - let st = this.db.prepare( - new TextEncoder('utf-8').encode("select 3 as a") - ); + this.textEncoder = new TextEncoder('utf-8'); + let st = this.db.prepare( this.textEncoder.encode("select 3 as a") ); let rc; try { T.assert(wasm.isPtr(st.pointer)) @@ -1701,6 +1700,71 @@ T.g('sqlite3.oo1') }); }) + //////////////////////////////////////////////////////////////////////// + .t('sqlite3_bind_text/blob() with JS values', function(){ + /* Derived from [bugs:bbb715c3f2a0e989]. */ + const q = this.db.prepare("select ?1, typeof(?1), octet_length(?1)"); + const enc = this.textEncoder, denc = new TextDecoder('utf-8'); + const BindText = capi.sqlite3_bind_text, BindBlob = capi.sqlite3_bind_blob; + /* Bind value v of length n to q using binding function f(), step + it, fetch it, reset it, and return the fetched row. */ + const bindAndGet = (f, v, n)=>{ + const rc = f(q, 1, v, n, capi.SQLITE_WASM_DEALLOC); + q.step(); + const rv = q.get([]); + T.assert( 3===rv.length ); + rv.unshift(rc); + q.reset(true); + return rv; + }; + /* Pass (v,n) through sqlite3_bind_text() and affirm that + expect === column 0 of the result. */ + const checkText = (v, n, expect)=>{ + const [rc, val, type, len] = bindAndGet(BindText, v, n); + T.assert(0===rc) + .assert(expect===val) + .assert('text'===type) + .assert(enc.encode(expect).byteLength===len); + }; + /* Pass (v,n) through sqlite3_bind_blob() and affirm that + the resulting value has a length of expectLen. Returns + the resulting Uint8Array.*/ + const checkBlob = (v, n, expectLen)=>{ + const [rc, val, type, len] = bindAndGet(BindBlob, v, n); + T.assert(0===rc, "bind_blob rc", rc) + .assert('blob'===type) + .assert(expectLen===len) + .assert(val instanceof Uint8Array && expectLen===val.byteLength); + return val; + }; + const checkBlobText = (v, n, expectLen, expectText)=>{ + const rv = checkBlob(v, n, expectLen); + T.assert(denc.decode(rv)===expectText, "checkBlobText()", expectText); + } + try{ + checkText("SQLite", -1, "SQLite"); + checkText(["Früh","stück"], -1, "Frühstück"); + checkText("", -1, ""); + checkText(enc.encode("SQLite"), -1, "SQLite"); + const xenc = enc.encode("a string"); + checkText(new Int8Array(xenc), -1, "a string"); + checkText(xenc.buffer, -1, "a string"); + checkBlobText("SQLite", -1, 6, "SQLite"); + checkBlobText("SQLite", 2, 6, "SQLite"); + checkBlob("", -1, 0); + checkBlobText(["SQL", "i", "te"], -1, 6, "SQLite"); + T.assert("SQL"===denc.decode(checkBlob(enc.encode("SQLite"), 3, 3))); + T.assert(capi.SQLITE_MISUSE===bindAndGet( + BindBlob, {}, -1 + )[0]); + T.assert(capi.SQLITE_MISUSE===bindAndGet( + BindText, {}, -1 + )[0]); + }finally{ + q.finalize(); + } + })/*sqlite3_bind_text/blob()*/ + //////////////////////////////////////////////////////////////////////// .t('sqlite3_js_...()', function(){ const db = this.db; diff --git a/manifest b/manifest index 796c6ae1b9..b4d5b84302 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sadverse\sinteraction\sbetween\striggers\schanging\sa\stable\sthat\suses\nON\sDELETE\sSET\sNULL\sconstraints\sand\sthe\soptimization\sat\s[8c5dd6cc259e0cda],\nalmost\s12\syears\sago.\n[bugs:/info/2026-10-19T06:36:47Z|Bug\s2026-10-19T06:36:47Z]. -D 2026-10-20T00:14:02.927 +C Merge\sthe\slatest\sbranch-3.54\sfixes\sinto\strunk +D 2026-10-20T00:17:35.624 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -425,9 +425,9 @@ F ext/misc/wholenumber.c e41953e078894e66a0ff05dd6c76a61f904828c9a4620c7255fac26 F ext/misc/windirent.h 02211ce51f3034c675f2dbf4d228194d51b3ee05734678bad5106fff6292e60c F ext/misc/zipfile.c 54bd61f1d80a170dde6c15e6eee790ff89a0acbe3bf57e9d63eba6e3414a6a0c F ext/misc/zorder.c bddff2e1b9661a90c95c2a9a9c7ecd8908afab5763256294dd12d609d4664eee -F ext/qrf/README.md c5c47a8b82ee870557ec9c6734bf93c296ae4821d33cf60253b36f2fcee09601 +F ext/qrf/README.md 394a70c5cda1d0f57c82434751b0174a594b1c8800c8584fad6091e867cd5a90 F ext/qrf/dev-notes.md e68a6d91ce4c7eb296ef2daadc2bb79c95c317ad15b9fafe40850c67b29c2430 -F ext/qrf/qrf.c 13d6c899814afe61fb0213be3bdcd23732251e185c820d80fee12badb89a4f43 +F ext/qrf/qrf.c 61b756cad31024165f3980f98f1b3a131e02eb8a6dfc53e85b6c488a7b6f5fc9 F ext/qrf/qrf.h b04e50048695aa4a5a41577fb4a56c1feed0bef816354995713116780a4bdacb F ext/rbu/rbu.c 801450b24eaf14440d8fd20385aacc751d5c9d6123398df41b1b5aa804bf4ce8 F ext/rbu/rbu1.test 25870dd7db7eb5597e2b4d6e29e7a7e095abf332660f67d89959552ce8f8f255 @@ -570,7 +570,7 @@ F ext/session/sessionconflict2.test dcaa9979a71d47ff524d01757d137a66cd1dee8faaf9 F ext/session/sessioncorrupt.test e4e4c346415b09f3354a1ade13d25cf08bb073beb750ebaea9fc6d6313f857d9 x F ext/session/sessiondiff.test e89f7aedcdd89e5ebac3a455224eb553a171e9586fc3e1e6a7b3388d2648ba8d F ext/session/sessionfault.test c2b43d01213b389a3f518e90775fca2120812ba51e50444c4066962263e45c11 -F ext/session/sessionfault2.test b0d6a7c1d7398a7e800d84657404909c7d385965ea8576dc79ed344c46fbf41c +F ext/session/sessionfault2.test 0c050779bc8daa21d1b9233dfd36b84716d51fad750b7b460cee12e21eb3f59c F ext/session/sessionfault3.test eb981a9f1165132d405952f593998e65ddd140805624906b799678588b385890 F ext/session/sessioninvert.test 7ccb7609a2c11e4e13e606df439bf3d484ba8e455d0bd3aa8d4828a940e1a242 x F ext/session/sessionmem.test f2a735db84a3e9e19f571033b725b0b2daf847f3f28b1da55a0c1a4e74f1de09 @@ -578,14 +578,14 @@ F ext/session/sessionnoact.test 2cf060c12a7a23e663f0ec796561e58638c5c10a846653d3 F ext/session/sessionnoop.test a9366a36a95ef85f8a3687856ebef46983df399541174cb1ede2ee53b8011bc7 F ext/session/sessionnoop2.test 2d8146321785bdc7cee8966d984560184cfca83fd46da2ff81ea883d6e977b36 F ext/session/sessionrebase.test 702378bdcb5062f1106e74457beca8797d09c113a81768734a58b197b5b334e2 -F ext/session/sessionrebase2.test b3c9ca8f40290d9bca97beec6f985d8e56fee80328ea639ee0a0104275a9b4a9 +F ext/session/sessionrebase2.test 6946c5df7ab15f8cf792b36418da2777dca9781e0dac8296c674c3096ffed3b2 F ext/session/sessionrowid.test 85187c2f1b38861a5844868126f69f9ec62223a03449a98a80600a44396f7363 F ext/session/sessionsize.test 8fcf4685993c3dbaa46a24183940ab9f5aa9ed0d23e5fb63bfffbdb56134b795 F ext/session/sessionstat1.test 5e718d5888c0c49bbb33a7a4f816366db85f59f6a4f97544a806421b85dc2dec F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc -F ext/session/sqlite3session.c 46c81df7e294663e2aa5bf720d7d3236600a7d1281c6befef45eb60a56de25ed +F ext/session/sqlite3session.c 26f68307d1d876493d94efceb4ae62a19802cdee7fb4d0d3b0bdb96986cfcc99 F ext/session/sqlite3session.h ca7c4422c1514a95056cc8d333217df6b1829d39058126b1de85d10cd62d7a9c -F ext/session/test_session.c f465f13c661919f8ba4485a9d0690c4df5bff1cc79e962cfdafa9ff376d5119f +F ext/session/test_session.c b30b1ecbb042d08f42406eb4fcfb2efef9609507e1b6b04b0a1ea4cb0a3cffe3 F ext/vec1/Makefile 791bd52e40d5b65026c63c8778dbdfc6d66083457ee50cf873d6483d98f43437 F ext/vec1/Makefile.msc 66fbdf78ebb987bdbe646e3b1c895fc8785e14c50666f6694b840a0cdd3b7f9e F ext/vec1/test/vec1_common.tcl 72226d9ee7cea8ad331905b28496392e4771f7b7c9d2890575795eddefc19db3 @@ -648,7 +648,7 @@ F ext/vec1/tool/vec1bench.tcl a117caee3cb99712f0477fe2fa85c94c260866951d3a9d667b F ext/vec1/tool/vec1bench_addcols.tcl 8c509253d07b179928f2ee32e3591a2c70d13c914217e1328c01afa148717051 F ext/vec1/tool/vec1bench_vibe2db.py 84ddb0236bc3d02a0393abce41986a1b7dad7f0d83884576f8318c2883e3aed3 F ext/vec1/vec1.c 7c930e6b5577622326dcf32569318f06d5f73fcc81912e43fb258f3ce396b00e -F ext/wasm/GNUmakefile 390cf98771f3c99e9e6a4a34c506d911f49016d7ed0d4913f78a41a63cda69f1 +F ext/wasm/GNUmakefile b656d39f7792b6ff8d9129d38452804bccba29e1fe22976655cebb3e1e9f184b F ext/wasm/README-dist.txt f01081a850ce38a56706af6b481e3a7878e24e42b314cfcd4b129f0f8427066a F ext/wasm/README.md 6d820c98468ebcee1dbf547467a03f65d256a2be48a9dcbeb5637d3da569c6fe F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff @@ -665,7 +665,7 @@ F ext/wasm/api/opfs-common-shared.c-pp.js 51d86e01ec20438552d09d233dfad97e681364 F ext/wasm/api/post-js-footer.js a50c1a2c4d008aede7b2aa1f18891a7ee71437c2f415b8aeb3db237ddce2935b F ext/wasm/api/post-js-header.js f35d2dcf1ab7f22a93d565f8e0b622a2934fc4e743edf3b708e4dd8140eeff55 F ext/wasm/api/pre-js.c-pp.js 145da76085bd31bbe9c9b2d52bc56106116745576699d03b8bd6eaaf78e1e537 -F ext/wasm/api/sqlite3-api-glue.c-pp.js 0e41b7b571219eaf91a66d8cdbcbcab2b16db537046c0a35af8e0e48a72f99ca +F ext/wasm/api/sqlite3-api-glue.c-pp.js 15ac205ced4b55134de9f447fff285906072f4410bd5d1b1db8408d39b700c6b F ext/wasm/api/sqlite3-api-oo1.c-pp.js d41c122250a213002adf294487156ed46f146760a4d904e13996dcc425d7c15e F ext/wasm/api/sqlite3-api-prologue.js 0084e15d66fbcd75cacbaa58e3b473d5e57082c30f3122be7fdadff5589cf6b6 F ext/wasm/api/sqlite3-api-worker1.c-pp.js eee70a9962c02d86d2332f2432e257ccdf5eb7a742f90d34bdc137346fbc97ae @@ -704,7 +704,7 @@ F ext/wasm/jaccwabyt/jaccwabyt.js 99039632cd8fa6f82acdb01e213850d2efe220388441fa F ext/wasm/jaccwabyt/jaccwabyt.md 6aa90fa1a973d0ad10d077088bea163b241d8470c75eafdef87620a1de1dea41 F ext/wasm/libcmpp.c a5bec47a754206aac2ffb45ba4adaec6af3b4fcc24c705c61a6f47893b72aef5 F ext/wasm/mkdist.sh f8883b077a2ca47cf92e6f0ce305fbf72ca648c3501810125056c4b09c2d5554 x -F ext/wasm/mkwasmbuilds.c 0ec4b858fe04921d88de98216a65fd6d885eb98170e9c2d27a81cb2295eef811 +F ext/wasm/mkwasmbuilds.c a012ba85adc4dea9cc6a6ed6ffb1d127ceda6bcc8e18cd0a118bf4d6e9049caa F ext/wasm/module-symbols.html e54f42112e0aac2a31f850ab33e7f2630a2ea4f63496f484a12469a2501e07e2 F ext/wasm/scratchpad-wasmfs.html a3d7388f3c4b263676b58b526846e9d02dfcb4014ff29d3a5040935286af5b96 F ext/wasm/scratchpad-wasmfs.mjs 66034b9256b218de59248aad796760a1584c1dd842231505895eff00dbd57c63 @@ -719,7 +719,7 @@ F ext/wasm/sql/001-sudoku.sql 35b7cb7239ba5d5f193bc05ec379bcf66891bce6f2a5b3879f F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555e685bce3da8c3f F ext/wasm/tester1-worker.c-pp.html e81f5a74c045499262b47beaef39cd36963f67021c6575f920ee3f11d0501420 F ext/wasm/tester1.c-pp.html 69403505b2c0b6cd76c8a210e3a09e80a8eb84a47c3eae591ab0e81c3934af61 -F ext/wasm/tester1.c-pp.js 84c86fbdd6b2867fae245e0c1fa87ab885f1feed018b48eeb1ba3a3ae18f755b +F ext/wasm/tester1.c-pp.js 06776391c86c17c57cebb6aabe7aac40c525461e309dc93179495da5c2856916 F ext/wasm/tests/opfs/concurrency/index.html 706eab6308343c04ac2360aba6001af4ffaf46d8f33a0ccd02c64d93e3216a43 F ext/wasm/tests/opfs/concurrency/test.js 6919778fceaac1b7cc78caf41d796f545d2c4433b31188aa9689f05b5ad28828 F ext/wasm/tests/opfs/concurrency/worker.js 704d82c5e287e47f612349e027765943a58ad967dcf178fb5a1c3a8eaafb09af @@ -740,7 +740,7 @@ F mptest/multiwrite01.test dab5c5f8f9534971efce679152c5146da265222d F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 1b9c24374a85dfc7eb8fa7c4266ee0db4f9609cceecfc5481cd8307e5af04366 F sqlite3.pc.in e6dee284fba59ef500092fdc1843df3be8433323a3733c91da96690a50a5b398 -F src/alter.c 1032f83df87e620e18662f085071bd33b8a4d5d1341575547ebb122c6b81a010 +F src/alter.c 4df4a8dbaea089dbfd1c3530171edaaa0e9b5c59d7f735262f80347f5effdc87 F src/analyze.c 73162482c656187823217f4c00758c9ee13a420c8745bc542129e0279b792287 F src/attach.c 40a83de1c720dfb3552458ebf6c9dac7ed6b2fcde4e073658fd9a38d90cb329e F src/auth.c b5ece4e1edccad082c0332fa0087df225473bae0feea9269f824312201377185 @@ -1500,7 +1500,7 @@ F test/mallocJ.test b5d1839da331d96223e5f458856f8ffe1366f62e F test/mallocK.test 25897506da0098cea09b302ff432b0fb6d8002773c1e0fc9732aa8b444bfd455 F test/mallocL.test fb311ff80afddf3b1a75e52289081f4754d901dc F test/mallocM.test 78bbe9d3da84a5c679123cdb40d7b2010b18fc46e13897e4f253c6ba6fbff134 -F test/malloc_common.tcl 806c50379cf4fa65008cd4d5af18273e5dac8ab62d1d4316c76aa2ecd2e54018 +F test/malloc_common.tcl e3731f2f42f660fc58648d9a715d928da5d0ead133d50dfeb2a43c128289dc2f F test/malloctraceviewer.tcl 3e3ddf11e30d2b20f53aa16aa6615082fb24a100bea61cca7214c927b742eba6 F test/manydb.test 28385ae2087967aa05c38624cec7d96ec74feb3e F test/mem5.test c6460fba403c5703141348cd90de1c294188c68f @@ -1535,7 +1535,7 @@ F test/mmapcorrupt.test 470fb44fe92e99c1d23701d156f8c17865f5b027063c9119dcfdb842 F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3 F test/mmapleak.test 7542cafa4771abba531d072ea905f474a2875a153337a04f327f0a9319cdb72c F test/mmapwarm.test 2272005969cd17a910077bd5082f70bc1fefad9a875afec7fc9af483898ecaf3 -F test/modeA.sql 555cc4724b59fb9e437efbdbcf6b64cadf7f46d42d1dbb51b7dbf85bf2696403 +F test/modeA.sql 8fc797edf0d04be08168302dcc509a075a6896a71c65b07a197cc46040a5843f F test/multiplex.test d74c034e52805f6de8cc5432cef8c9eb774bb64ec29b83a22effc8ca4dac1f08 F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a F test/multiplex3.test fac575e0b1b852025575a6a8357701d80933e98b5d2fe6d35ddaa68f92f6a1f7 @@ -2294,8 +2294,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P fd341a1952ded314e3b3d129c14552318246c0f187c63bea82a0f7bf8aec6759 -R 7120feee1743f3e7210d0aff5ab60d0a +P 15424da529e827f3eca7d70b1c54b57f2e9e05ed866a872ea45fa538e8b72825 d45943cbaf35f21f72b78aafa88f72830343bfeb3a0198a3af0da063dcf6a707 +R aecb776e642164957603f92bcf1cc00c U drh -Z 648661a2562c4b8c375a0ac686e09793 +Z 42c9e74b37b241a3bd771a8cfc9167b1 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f9baa701f5..6f409d479c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -15424da529e827f3eca7d70b1c54b57f2e9e05ed866a872ea45fa538e8b72825 +b3606f7019b2a2dc77d9e476055156631d07c33dfef2d8bc0fdd75b13fad54fd diff --git a/src/alter.c b/src/alter.c index 4c27cde855..a0e6df4d23 100644 --- a/src/alter.c +++ b/src/alter.c @@ -2387,12 +2387,12 @@ void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, const Token *pName){ if( i==pTab->iPKey ){ sqlite3VdbeAddOp2(v, OP_Null, 0, regOut); }else{ - char aff = pTab->aCol[i].affinity; - if( aff==SQLITE_AFF_REAL ){ - pTab->aCol[i].affinity = SQLITE_AFF_NUMERIC; - } sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, i, regOut); - pTab->aCol[i].affinity = aff; + assert( pParse->nErr + || sqlite3VdbeGetOp(v,sqlite3VdbeCurrentAddr(v)-1)->opcode + != OP_RealAffinity + || pTab->aCol[i].affinity==SQLITE_AFF_REAL ); + sqlite3VdbeDeletePriorOpcode(v, OP_RealAffinity); } nField++; } diff --git a/test/malloc_common.tcl b/test/malloc_common.tcl index 7d3c942f77..9457bfd601 100644 --- a/test/malloc_common.tcl +++ b/test/malloc_common.tcl @@ -193,7 +193,8 @@ proc oom_injectstart {nRepeat iFail} { sqlite3_memdebug_fail [expr $iFail-1] -repeat $nRepeat } proc oom_injectstop {} { - sqlite3_memdebug_fail -1 + set nFail [sqlite3_memdebug_fail -1 -benigncnt nBenign] + return [expr $nFail - $nBenign] } # The following procs are used as [do_one_faultsim_test] callbacks when @@ -296,6 +297,16 @@ proc faultsim_test_result_int {args} { error "nfail=$testnfail rc=$testrc result=$testresult list=$r" } } +proc faultsim_test_result_int_strict {args} { + upvar testrc testrc testresult testresult testnfail testnfail + set t [list $testrc $testresult] + set r $args + + set idx [lsearch -exact $r $t] + if {($testnfail==0 && $idx!=0) || ($testnfail>0 && $idx<=0)} { + error "nfail=$testnfail rc=$testrc result=$testresult list=$r" + } +} #-------------------------------------------------------------------------- # Usage do_one_faultsim_test NAME ?OPTIONS...? @@ -348,6 +359,9 @@ proc do_one_faultsim_test {testname args} { proc faultsim_test_result {args} " uplevel faultsim_test_result_int \$args [list $O(-injecterrlist)] " + proc faultsim_test_result_strict {args} " + uplevel faultsim_test_result_int_strict \$args [list $O(-injecterrlist)] + " eval $O(-injectinstall) eval $O(-install) diff --git a/test/modeA.sql b/test/modeA.sql index b7767fb65e..cb4e98da3a 100644 --- a/test/modeA.sql +++ b/test/modeA.sql @@ -281,7 +281,7 @@ SELECT * FROM t1; .testcase 601 SELECT 'abc',char(0x05,0x18,0x33),'xyz'; -.check --glob abc,"*3",xyz +.check --glob abc,"??3",xyz .testcase 610 .mode csv -reset