From 10586997d9fae6132371c9f0016070226d2a2d97 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 19 Oct 2026 12:02:08 +0000 Subject: [PATCH 01/11] Fix the ".dump" command in the CLI so that it is not affected by mode settings like --fpfmt, --ifmt, or --textjsonb. [bugs:/info/2026-10-18T20:39:22Z|/info/2026-10-18T20:39:22Z] FossilOrigin-Name: a9d8123e27fa71bf7d29ec4cc7aa997f5e94de3c5b48907ccb7242795e44144c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 5 +++++ test/modeA.sql | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 6af7ad4a9d..d27db89232 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\srun\sthe\sOR\soptimization\son\sthe\sleft\soperand\sof\sa\sLEFT\sJOIN.\n[bugs:/info/2026-10-18T16:10:55Z|Bug\s2026-10-18T16:10:55Z]. -D 2026-10-18T23:45:59.905 +C Fix\sthe\s".dump"\scommand\sin\sthe\sCLI\sso\sthat\sit\sis\snot\saffected\sby\nmode\ssettings\slike\s--fpfmt,\s--ifmt,\sor\s--textjsonb.\n[bugs:/info/2026-10-18T20:39:22Z|/info/2026-10-18T20:39:22Z] +D 2026-10-19T12:02:08.747 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -803,7 +803,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 0e0990f60c93db38c735d85e5d1741130e72dd0670aec204b5a39118b53c8044 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 1367ef94822d7f9179c119906315f4a1ef1765aa04c0e08db0cd66a58e2d191d -F src/shell.c.in 3e11598ebd82077fb525874046250117502e665ac75b6e9912acf29a8514ffd7 +F src/shell.c.in 7b2b927ade38b5ac1553eeeba3e22d42da87ba585c00d5277b8595090ac96c59 F src/sqlite.h.in 648fdc66f52433fc0f6cf9564ac924cde544eca9605bbac36aa22d8c944f11ed F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 F src/sqlite3ext.h 5e113c4c0442f2f1b3345d44cbe4b82fad45f2fc0c35f0ed4eef27fb8f1cb394 @@ -1529,7 +1529,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 85875b8d676a3f4f7cb320f1a3d2b87e739dd9f3958902689a37a675affa125c +F test/modeA.sql ef3227057969c2bc22f9ac741f37b0fad4166c184f010a17a660623aa89fc7a9 F test/multiplex.test d74c034e52805f6de8cc5432cef8c9eb774bb64ec29b83a22effc8ca4dac1f08 F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a F test/multiplex3.test fac575e0b1b852025575a6a8357701d80933e98b5d2fe6d35ddaa68f92f6a1f7 @@ -2287,8 +2287,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 845190e3f2ede1f64d7e26ec9391d3551080c1d787599d49bad402c3734d81aa -R 097ca74841620a107f4b676054a6633b +P b4974127526b290149447849bf9c24c9ea01678755a58af3843c9e2c73c417d2 +R 173f8968dabb00bebdb6a472f81cd6fe U drh -Z 9ef3372a867dded1c7f0a5b2abcca5f3 +Z 79a8816ac565f6a1aed056d06beacd35 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3bcfe694d0..2b793f30ec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b4974127526b290149447849bf9c24c9ea01678755a58af3843c9e2c73c417d2 +a9d8123e27fa71bf7d29ec4cc7aa997f5e94de3c5b48907ccb7242795e44144c diff --git a/src/shell.c.in b/src/shell.c.in index 706e85b3f8..66b45246e6 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -4292,6 +4292,9 @@ static int dump_callback(void *pArg, int nArg, char **azArg, char **azNotUsed){ p->mode.spec.eBlob = QRF_BLOB_Sql; p->mode.spec.bTitles = QRF_No; p->mode.spec.nCharLimit = 0; + p->mode.spec.bTextJsonb = QRF_No; + p->mode.spec.zIFmt = 0; + p->mode.spec.zFpFmt = 0; rc = shell_exec(p, sSelect.zTxt, 0); if( (rc&0xff)==SQLITE_CORRUPT ){ cli_puts("/****** CORRUPTION ERROR *******/\n", p->out); @@ -10614,6 +10617,8 @@ static int do_meta_command(const char *zLine, ShellState *p){ p->shellFlgs = savedShellFlags; modeFree(&p->mode); p->mode = saved_mode; + if( p->mode.spec.zFpFmt ) p->mode.spec.zFpFmt = p->mode.zFpFmt; + if( p->mode.spec.zIFmt ) p->mode.spec.zIFmt = p->mode.zIFmt; rc = p->nErr>0; }else diff --git a/test/modeA.sql b/test/modeA.sql index ddadabe49e..cdcbf47be5 100644 --- a/test/modeA.sql +++ b/test/modeA.sql @@ -670,3 +670,44 @@ SELECT '' AS ''; │ │ ╰──╯ END + +# Bug 2026-10-18T20:39:22Z +# +# .dump should not be affected by the --fpfmt, --ifmt, and --textjsonb +# settings of .mode +# +.open :memory: +.testcase 1400 +CREATE TABLE t1(a,b,c); +INSERT INTO t1 VALUES(1234.5678, 16, jsonb('{"a":1}')); +INSERT INTO t1 VALUES(0.5, 1234567, x'0102'); +.mode list --fpfmt %.2f --ifmt %x --textjsonb on +.dump +.check < Date: Mon, 19 Oct 2026 14:34:34 +0000 Subject: [PATCH 02/11] The default floating point format for JSON and INSERT output modes should be "%!0.17" to preserve full binary→text→binary round-trips with no loss of precision. [bugs:/info/2026-10-18T20:37:23Z|Bug 2026-10-18T20:37:23Z]. FossilOrigin-Name: c31221e954bcca2e6505338446635d0efb809f453008c4927441ebd6f0e1b873 --- ext/qrf/qrf.c | 4 ++-- manifest | 14 +++++++------- manifest.uuid | 2 +- test/modeA.sql | 25 ++++++++++++++++++++++--- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/ext/qrf/qrf.c b/ext/qrf/qrf.c index 7329983231..5f01f7953d 100644 --- a/ext/qrf/qrf.c +++ b/ext/qrf/qrf.c @@ -2932,7 +2932,7 @@ qrf_reinit: case QRF_STYLE_Json: { p->spec.eText = QRF_TEXT_Json; p->spec.zNull = "null"; - if( p->spec.zFpFmt==0 ) p->spec.zFpFmt = "%0.16g"; + if( p->spec.zFpFmt==0 ) p->spec.zFpFmt = "%!0.17g"; break; } case QRF_STYLE_Html: { @@ -2946,7 +2946,7 @@ qrf_reinit: if( p->spec.zTableName==0 || p->spec.zTableName[0]==0 ){ p->spec.zTableName = "tab"; } - if( p->spec.zFpFmt==0 ) p->spec.zFpFmt = "%0.16g"; + if( p->spec.zFpFmt==0 ) p->spec.zFpFmt = "%!0.17g"; p->u.nIns = 0; break; } diff --git a/manifest b/manifest index d27db89232..4a5b480cb7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\s".dump"\scommand\sin\sthe\sCLI\sso\sthat\sit\sis\snot\saffected\sby\nmode\ssettings\slike\s--fpfmt,\s--ifmt,\sor\s--textjsonb.\n[bugs:/info/2026-10-18T20:39:22Z|/info/2026-10-18T20:39:22Z] -D 2026-10-19T12:02:08.747 +C The\sdefault\sfloating\spoint\sformat\sfor\sJSON\sand\sINSERT\soutput\smodes\nshould\sbe\s"%!0.17"\sto\spreserve\sfull\sbinary→text→binary\sround-trips\nwith\sno\sloss\sof\sprecision.\n[bugs:/info/2026-10-18T20:37:23Z|Bug\s2026-10-18T20:37:23Z]. +D 2026-10-19T14:34:34.551 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -425,7 +425,7 @@ F ext/misc/zipfile.c 54bd61f1d80a170dde6c15e6eee790ff89a0acbe3bf57e9d63eba6e3414 F ext/misc/zorder.c bddff2e1b9661a90c95c2a9a9c7ecd8908afab5763256294dd12d609d4664eee F ext/qrf/README.md c5c47a8b82ee870557ec9c6734bf93c296ae4821d33cf60253b36f2fcee09601 F ext/qrf/dev-notes.md e68a6d91ce4c7eb296ef2daadc2bb79c95c317ad15b9fafe40850c67b29c2430 -F ext/qrf/qrf.c 395f16f676c3254b83b0b540ca91c891bfc88290df80930f6a7d9e52c340c34f +F ext/qrf/qrf.c 13d6c899814afe61fb0213be3bdcd23732251e185c820d80fee12badb89a4f43 F ext/qrf/qrf.h b04e50048695aa4a5a41577fb4a56c1feed0bef816354995713116780a4bdacb F ext/rbu/rbu.c 801450b24eaf14440d8fd20385aacc751d5c9d6123398df41b1b5aa804bf4ce8 F ext/rbu/rbu1.test 25870dd7db7eb5597e2b4d6e29e7a7e095abf332660f67d89959552ce8f8f255 @@ -1529,7 +1529,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 ef3227057969c2bc22f9ac741f37b0fad4166c184f010a17a660623aa89fc7a9 +F test/modeA.sql 555cc4724b59fb9e437efbdbcf6b64cadf7f46d42d1dbb51b7dbf85bf2696403 F test/multiplex.test d74c034e52805f6de8cc5432cef8c9eb774bb64ec29b83a22effc8ca4dac1f08 F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a F test/multiplex3.test fac575e0b1b852025575a6a8357701d80933e98b5d2fe6d35ddaa68f92f6a1f7 @@ -2287,8 +2287,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P b4974127526b290149447849bf9c24c9ea01678755a58af3843c9e2c73c417d2 -R 173f8968dabb00bebdb6a472f81cd6fe +P a9d8123e27fa71bf7d29ec4cc7aa997f5e94de3c5b48907ccb7242795e44144c +R a3cb7a0de919be3d3c7a546007ca270e U drh -Z 79a8816ac565f6a1aed056d06beacd35 +Z caab71dfa7cb28c4221853205e2bf5f8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2b793f30ec..0365f452d7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a9d8123e27fa71bf7d29ec4cc7aa997f5e94de3c5b48907ccb7242795e44144c +c31221e954bcca2e6505338446635d0efb809f453008c4927441ebd6f0e1b873 diff --git a/test/modeA.sql b/test/modeA.sql index cdcbf47be5..b7767fb65e 100644 --- a/test/modeA.sql +++ b/test/modeA.sql @@ -640,7 +640,7 @@ SELECT 1.25e+12, 0x1234; .testcase 1200 .mode jobject --fpfmt auto SELECT 1 AS a, +9.0e+999 AS b, -9.0e+999 AS c, 0.0 AS d; -.check {"a":1,"b":9e+999,"c":-9e+999,"d":0} +.check {"a":1,"b":9.0e+999,"c":-9.0e+999,"d":0.0} .open :memory: .testcase 1210 CREATE TABLE t1(a); @@ -651,9 +651,9 @@ PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE t1(a); INSERT INTO t1 VALUES(123); -INSERT INTO t1 VALUES(9e+999); +INSERT INTO t1 VALUES(9.0e+999); INSERT INTO t1 VALUES('hello'); -INSERT INTO t1 VALUES(-9e+999); +INSERT INTO t1 VALUES(-9.0e+999); INSERT INTO t1 VALUES(x'313233'); COMMIT; END @@ -711,3 +711,22 @@ END .testcase 1430 .mode .check ".mode list --fpfmt %.2f --ifmt %,d --limits on --textjsonb on" + +# Bug 2026-10-18T20:37:23Z +# +# Preserve full double precision for .dump and .mode insert. +# +.open :memory: +.testcase 1500 +CREATE TABLE t(x REAL); +INSERT INTO t VALUES(1.7976931348623157e308),(0.1+0.2),(123456789.123456789); +.dump +.check < Date: Mon, 19 Oct 2026 14:50:22 +0000 Subject: [PATCH 03/11] JS: reject URL arguments which may influence the load path for sqlite3.js and sqlite3.wasm if those values look like they might be remote URLs. sqlite3.mjs (ESM) is unaffected by this. This addresses [bugs:74f052d3d2|bug report 2026-10-19T12:25:33Z] but is a preliminary measure, with follow-ups expected. FossilOrigin-Name: 5080eb6d7a7a7a5c2cdfd08a766f0e096d0d5536488fcf0b325e7b06a6bdd092 --- ext/wasm/api/extern-post-js.c-pp.js | 37 +++++++++++++++++-- ext/wasm/api/pre-js.c-pp.js | 24 ++++++------ ext/wasm/api/sqlite3-worker1-promiser.c-pp.js | 9 ++++- ext/wasm/api/sqlite3-worker1.c-pp.js | 7 +++- ext/wasm/tester1-worker.c-pp.html | 10 ++++- ext/wasm/tester1.c-pp.js | 5 ++- manifest | 24 ++++++------ manifest.uuid | 2 +- 8 files changed, 85 insertions(+), 33 deletions(-) diff --git a/ext/wasm/api/extern-post-js.c-pp.js b/ext/wasm/api/extern-post-js.c-pp.js index a3a02c8019..43a2a24907 100644 --- a/ext/wasm/api/extern-post-js.c-pp.js +++ b/ext/wasm/api/extern-post-js.c-pp.js @@ -65,9 +65,40 @@ const toExportForESM = ? (...args)=>console.warn('sqlite3.debugModule:',...args) : ()=>{}; - if(sIMS.urlParams.has('sqlite3.dir')){ - sIMS.sqlite3Dir = sIMS.urlParams.get('sqlite3.dir') +'/'; - }else if(sIMS.moduleScript){ + /** + Fetchs sIMS.urlParams.get(key). If that looks like it might + be a remote path value then null is returned and a console + warning may be emitted. If it looks like it's a local path, + it is returned. + + [bugs:74f052d3d2]: do not allow URL arguments which are used for + determining file locations to be anything other than what appears + to be a local file reference. That is the only documented use for + these args and allowing URLs as values leads to chaos. This is + believed to resolve that report but is also considered a stopgap + measure. TODO is only allow query parameters from the same origin + as this script. + */ + sIMS.getPathArgument = (key)=>{ + const s = sIMS.urlParams.get(key); + //console.warn("sIMS.getPathArgument(",key,")",s); + if( !s ) return s; + if( s.indexOf(':')>=0 || s.indexOf('//')>=0 ){ + console.warn( + "Rejecting path string",key," because it does not look", + "like a local path:",s + ); + return null; + } + return s; + }; + + if( sIMS.urlParams.has('sqlite3.dir') ){ + const s = sIMS.getPathArgument('sqlite3.dir'); + if( s ){ + sIMS.sqlite3Dir = s + (s[s.length-1]==='/' ? '' : '/'); + } + }else if( sIMS.moduleScript ){ const li = sIMS.moduleScript.src.split('/'); li.pop(); sIMS.sqlite3Dir = li.join('/') + '/'; diff --git a/ext/wasm/api/pre-js.c-pp.js b/ext/wasm/api/pre-js.c-pp.js index 1a3d46f1d9..4e9bc4e659 100644 --- a/ext/wasm/api/pre-js.c-pp.js +++ b/ext/wasm/api/pre-js.c-pp.js @@ -56,7 +56,8 @@ Worker constructor or importScripts() to be able to resolve foo/bar/X.wasm (in the latter case, with some help): - 1) If URL param named the same as `path` is set, it is returned. + 1) If URL param named the same as `path` is set and it looks like + a local path reference, it is returned. 2) If sqlite3InitModuleState.sqlite3Dir is set, then (thatName + path) is returned (it's assumed to end with '/'). @@ -84,21 +85,20 @@ return new URL(path, import.meta.url).href; //#else 'use strict'; - let theFile; - const up = this.urlParams; - if(up?.has(path)){ - theFile = up.get(path); - }else if(this.sqlite3Dir){ - theFile = this.sqlite3Dir + path; - }else if(this.scriptDir){ - theFile = this.scriptDir + path; - }else{ - theFile = prefix + path; + let theFile = this.getPathArgument(path); + if( !theFile ){ + if(this.sqlite3Dir){ + theFile = this.sqlite3Dir + path; + }else if(this.scriptDir){ + theFile = this.scriptDir + path; + }else{ + theFile = prefix + path; + } } this.debugModule( "locateFile(",arguments[0], ',', arguments[1],")", 'sqlite3InitModuleState.scriptDir =',this.scriptDir, - 'up.entries() =',Array.from(up.entries()), + 'urlParams.entries() =',Array.from(this.urlParams.entries()), "result =", theFile ); return theFile; diff --git a/ext/wasm/api/sqlite3-worker1-promiser.c-pp.js b/ext/wasm/api/sqlite3-worker1-promiser.c-pp.js index bcbf3fa9f8..b21f8a3a28 100644 --- a/ext/wasm/api/sqlite3-worker1-promiser.c-pp.js +++ b/ext/wasm/api/sqlite3-worker1-promiser.c-pp.js @@ -272,7 +272,14 @@ globalThis.sqlite3Worker1Promiser.defaultConfig = { //sqlite3.config.warn("promiser currentScript, theJs =",this.currentScript,theJs); }else if(globalThis.location){ //sqlite3.config.warn("promiser globalThis.location =",globalThis.location); - const urlParams = new URL(globalThis.location.href).searchParams; + const s = urlParams.get('sqlite3.dir'); + if( s ){ + if( s.indexOf(':')<0 && s.indexOf('//')<0 ){ + theJs = s + '/' + theJs; + }else{ + console.warn("Invalid sqlite3.dir value:",s); + } + } if(urlParams.has('sqlite3.dir')){ theJs = urlParams.get('sqlite3.dir') + '/' + theJs; } diff --git a/ext/wasm/api/sqlite3-worker1.c-pp.js b/ext/wasm/api/sqlite3-worker1.c-pp.js index 046243baa5..0e560c9789 100644 --- a/ext/wasm/api/sqlite3-worker1.c-pp.js +++ b/ext/wasm/api/sqlite3-worker1.c-pp.js @@ -44,7 +44,12 @@ import sqlite3InitModule from './sqlite3.mjs'; : new URLSearchParams(); let theJs = 'sqlite3.js'; if(urlParams.has('sqlite3.dir')){ - theJs = urlParams.get('sqlite3.dir') + '/' + theJs; + const s = urlParams.get('sqlite3.dir'); + if( s && s.indexOf(':')<0 && s.indexOf('//')<0 ){ + theJs = s + '/' + theJs; + }else{ + console.warn("Invalid sqlite3.dir value:",s); + } } //console.warn("worker1 theJs =",theJs); importScripts(theJs); diff --git a/ext/wasm/tester1-worker.c-pp.html b/ext/wasm/tester1-worker.c-pp.html index fb6421cfdf..dec3ed04da 100644 --- a/ext/wasm/tester1-worker.c-pp.html +++ b/ext/wasm/tester1-worker.c-pp.html @@ -76,8 +76,16 @@ "sqlite3 tester #1: ES6 Worker Module (@bitness@-bit WASM)"; }); }else{ - workerArgs.push(baseName+'.js?sqlite3.dir=jswasm'); + const l = globalThis.location; + workerArgs.push(baseName+'.js?sqlite3.dir='+( + 0/*set to 1 only for testing*/ + ? (l.protocol+'//'+l.host+'/jswasm') + /* ^^^ must be rejected by module loader without trying to + load that */ + : 'jswasm' + )); } + console.warn("workerArgs =",workerArgs); const w = new Worker(...workerArgs); w.onmessage = function({data}){ switch(data.type){ diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js index 5c6e1fe959..50b7a3c658 100644 --- a/ext/wasm/tester1.c-pp.js +++ b/ext/wasm/tester1.c-pp.js @@ -4642,8 +4642,9 @@ if(!globalThis.sqlite3InitModule && !isUIThread()){ support for locating the wasm, so remove that dir part. */; const urlParams = new URL(globalThis.location.href).searchParams; - if(urlParams.has('sqlite3.dir')){ - sqlite3Js = urlParams.get('sqlite3.dir') + '/' + sqlite3Js; + const s3d = urlParams.get('sqlite3.dir'); + if( s3d ){ + sqlite3Js = s3d + '/' + sqlite3Js; } importScripts(sqlite3Js); } diff --git a/manifest b/manifest index 4a5b480cb7..8ba803b8f0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sdefault\sfloating\spoint\sformat\sfor\sJSON\sand\sINSERT\soutput\smodes\nshould\sbe\s"%!0.17"\sto\spreserve\sfull\sbinary→text→binary\sround-trips\nwith\sno\sloss\sof\sprecision.\n[bugs:/info/2026-10-18T20:37:23Z|Bug\s2026-10-18T20:37:23Z]. -D 2026-10-19T14:34:34.551 +C JS:\sreject\sURL\sarguments\swhich\smay\sinfluence\sthe\sload\spath\sfor\ssqlite3.js\sand\ssqlite3.wasm\sif\sthose\svalues\slook\slike\sthey\smight\sbe\sremote\sURLs.\ssqlite3.mjs\s(ESM)\sis\sunaffected\sby\sthis.\sThis\saddresses\s[bugs:74f052d3d2|bug\sreport\s2026-10-19T12:25:33Z]\sbut\sis\sa\spreliminary\smeasure,\swith\sfollow-ups\sexpected. +D 2026-10-19T14:50:22.561 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -653,13 +653,13 @@ F ext/wasm/SQLTester/index.html 64f3435084c7d6139b08d1f2a713828a73f68de2ae6a3112 F ext/wasm/SQLTester/touint8array.c 2d5ece04ec1393a6a60c4bf96385bda5e1a10ad49f3038b96460fc5e5aa7e536 F ext/wasm/api/EXPORTED_FUNCTIONS.c-pp 0b0eee602791286ab18e07eadd38a531389285681bd3dbe92c5520ff81ca769a F ext/wasm/api/README.md a905d5c6bfc3e2df875bd391d6d6b7b48d41b43bdee02ad115b47244781a7e81 -F ext/wasm/api/extern-post-js.c-pp.js cba0f9735f741ce266aa0c52e6e1224f9fb027f20253292d3e71480787675a05 +F ext/wasm/api/extern-post-js.c-pp.js 22f9437272a44c385bac4ef66f632ab63ee662e31cbf7053a8961f276a28b6a4 F ext/wasm/api/extern-pre-js.js cc61c09c7a24a07dbecb4c352453c3985170cec12b4e7e7e7a4d11d43c5c8f41 F ext/wasm/api/opfs-common-inline.c-pp.js f84640e2b1e9c5903deb55ef3d7bf537587e31eb6f4f257b4a75827146d2b5a9 F ext/wasm/api/opfs-common-shared.c-pp.js 51d86e01ec20438552d09d233dfad97e681364b3e432fc083e2b8cd88fdcc865 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 2d12b65e1caefda202edc67ccbe248918ed1aee7fd4907527bffb3e6bca599c0 +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-oo1.c-pp.js d41c122250a213002adf294487156ed46f146760a4d904e13996dcc425d7c15e F ext/wasm/api/sqlite3-api-prologue.js 0084e15d66fbcd75cacbaa58e3b473d5e57082c30f3122be7fdadff5589cf6b6 @@ -673,8 +673,8 @@ F ext/wasm/api/sqlite3-vfs-opfs-wl.c-pp.js 60fa106fc11d31adb1773ac16dd60fc9335a3 F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 5dd8410121acf623ce53005a4aab2c7b2b7f5d1ad072f69ebc208882bc7b7236 F ext/wasm/api/sqlite3-vtab-helper.c-pp.js 3218318194b11fa625ebda9f7900280c5c26cf257ab5b2b66709ce58e9531624 F ext/wasm/api/sqlite3-wasm.c 5ac22d03231318615112fdea462ea6abbee6cadf964f22b6dfcc813dd6b37b85 -F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js 46919740f8176c10f691431a81c769c35657e3b537e2ed2bde691f9017b0ee8a -F ext/wasm/api/sqlite3-worker1.c-pp.js 21b20d3b8d43471d1647123616a7e5435b1e4b6fa447714f91ffc7f950ea01e8 +F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js 3b551b4c4434d96c5daa21fe849c2f3f9ed1356d931b231975c32828efaa3c86 +F ext/wasm/api/sqlite3-worker1.c-pp.js d274d5eb7f43f4f3b35a4d1f9213a1e34aa5ae27df7af9e74df9f89a50ee7bda F ext/wasm/common/SqliteTestUtil.js dae753b95e72248c4395d8de8359e0d055cd9928488e8dd84aef89e46d23b32e F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15 F ext/wasm/common/testing.css e97549bab24126c24e0daabfe2de9bb478fb0a69fdb2ddd0a73a992c091aad6f @@ -712,9 +712,9 @@ F ext/wasm/split-speedtest1-script.sh a3e271938d4d14ee49105eb05567c6a69ba4c1f129 F ext/wasm/sql/000-mandelbrot.sql 775337a4b80938ac8146aedf88808282f04d02d983d82675bd63d9c2d97a15f0 F ext/wasm/sql/001-sudoku.sql 35b7cb7239ba5d5f193bc05ec379bcf66891bce6f2a5b3879f2f78d0917299b5 F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555e685bce3da8c3f -F ext/wasm/tester1-worker.c-pp.html 441b8b12769670a6bf03be205e6f20ec05827348a565ddcee94219c44ec313e3 +F ext/wasm/tester1-worker.c-pp.html 3295e3abc51599573bd363ee26948e64cc1693992e8e30ad0a3a1662786a5e3a F ext/wasm/tester1.c-pp.html 69403505b2c0b6cd76c8a210e3a09e80a8eb84a47c3eae591ab0e81c3934af61 -F ext/wasm/tester1.c-pp.js de7cdfee3b1dace334698be34a36945f2476be265f20d8c84d6b2408d5d8f8fd +F ext/wasm/tester1.c-pp.js 77c741e438d62e23c94302a5fafa56259dea2857d5a0303b6267e3eca98608ad 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 @@ -2287,8 +2287,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P a9d8123e27fa71bf7d29ec4cc7aa997f5e94de3c5b48907ccb7242795e44144c -R a3cb7a0de919be3d3c7a546007ca270e -U drh -Z caab71dfa7cb28c4221853205e2bf5f8 +P c31221e954bcca2e6505338446635d0efb809f453008c4927441ebd6f0e1b873 +R 1b44b97ce0051b7a496005ba6b1c390f +U stephan +Z 3cdf726eb407d58fd9231dee11be8280 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0365f452d7..c09bfad9fc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c31221e954bcca2e6505338446635d0efb809f453008c4927441ebd6f0e1b873 +5080eb6d7a7a7a5c2cdfd08a766f0e096d0d5536488fcf0b325e7b06a6bdd092 From 55b6ae8606c9e59818ecc69bb67676a000049527 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 19 Oct 2026 15:06:38 +0000 Subject: [PATCH 04/11] Apply [5080eb6d7a7a] to a similar case in the JS test suite. FossilOrigin-Name: 336154a23a2a98df12a2a5e6ef51221acccef4063936cbb48cbb77a24cf1bd26 --- ext/wasm/tester1-worker.c-pp.html | 7 +++---- ext/wasm/tester1.c-pp.js | 6 +++++- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/ext/wasm/tester1-worker.c-pp.html b/ext/wasm/tester1-worker.c-pp.html index dec3ed04da..2b61f92e39 100644 --- a/ext/wasm/tester1-worker.c-pp.html +++ b/ext/wasm/tester1-worker.c-pp.html @@ -79,10 +79,9 @@ const l = globalThis.location; workerArgs.push(baseName+'.js?sqlite3.dir='+( 0/*set to 1 only for testing*/ - ? (l.protocol+'//'+l.host+'/jswasm') - /* ^^^ must be rejected by module loader without trying to - load that */ - : 'jswasm' + ? (l.protocol+'//'+l.host+'/jswasm') + /* ^^^ must be rejected/ignored by module init */ + : 'jswasm' )); } console.warn("workerArgs =",workerArgs); diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js index 50b7a3c658..4307c7930b 100644 --- a/ext/wasm/tester1.c-pp.js +++ b/ext/wasm/tester1.c-pp.js @@ -4644,7 +4644,11 @@ if(!globalThis.sqlite3InitModule && !isUIThread()){ const urlParams = new URL(globalThis.location.href).searchParams; const s3d = urlParams.get('sqlite3.dir'); if( s3d ){ - sqlite3Js = s3d + '/' + sqlite3Js; + if( s3d.indexOf(':')<0 && s3d.indexOf('//')<0 ){ + sqlite3Js = s3d + '/' + sqlite3Js; + }else{ + throw new Error("Invalid sqlite3.dir value: "+s3d); + } } importScripts(sqlite3Js); } diff --git a/manifest b/manifest index 8ba803b8f0..fe918a94fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C JS:\sreject\sURL\sarguments\swhich\smay\sinfluence\sthe\sload\spath\sfor\ssqlite3.js\sand\ssqlite3.wasm\sif\sthose\svalues\slook\slike\sthey\smight\sbe\sremote\sURLs.\ssqlite3.mjs\s(ESM)\sis\sunaffected\sby\sthis.\sThis\saddresses\s[bugs:74f052d3d2|bug\sreport\s2026-10-19T12:25:33Z]\sbut\sis\sa\spreliminary\smeasure,\swith\sfollow-ups\sexpected. -D 2026-10-19T14:50:22.561 +C Apply\s[5080eb6d7a7a]\sto\sa\ssimilar\scase\sin\sthe\sJS\stest\ssuite. +D 2026-10-19T15:06:38.626 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -712,9 +712,9 @@ F ext/wasm/split-speedtest1-script.sh a3e271938d4d14ee49105eb05567c6a69ba4c1f129 F ext/wasm/sql/000-mandelbrot.sql 775337a4b80938ac8146aedf88808282f04d02d983d82675bd63d9c2d97a15f0 F ext/wasm/sql/001-sudoku.sql 35b7cb7239ba5d5f193bc05ec379bcf66891bce6f2a5b3879f2f78d0917299b5 F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555e685bce3da8c3f -F ext/wasm/tester1-worker.c-pp.html 3295e3abc51599573bd363ee26948e64cc1693992e8e30ad0a3a1662786a5e3a +F ext/wasm/tester1-worker.c-pp.html e81f5a74c045499262b47beaef39cd36963f67021c6575f920ee3f11d0501420 F ext/wasm/tester1.c-pp.html 69403505b2c0b6cd76c8a210e3a09e80a8eb84a47c3eae591ab0e81c3934af61 -F ext/wasm/tester1.c-pp.js 77c741e438d62e23c94302a5fafa56259dea2857d5a0303b6267e3eca98608ad +F ext/wasm/tester1.c-pp.js 84c86fbdd6b2867fae245e0c1fa87ab885f1feed018b48eeb1ba3a3ae18f755b 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 @@ -2287,8 +2287,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P c31221e954bcca2e6505338446635d0efb809f453008c4927441ebd6f0e1b873 -R 1b44b97ce0051b7a496005ba6b1c390f +P 5080eb6d7a7a7a5c2cdfd08a766f0e096d0d5536488fcf0b325e7b06a6bdd092 +R 96b94d3dcc56eef7e43d0795b7d99215 U stephan -Z 3cdf726eb407d58fd9231dee11be8280 +Z ad98ab687863df3f0cc0f3af23b4d533 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c09bfad9fc..ce0af02f74 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5080eb6d7a7a7a5c2cdfd08a766f0e096d0d5536488fcf0b325e7b06a6bdd092 +336154a23a2a98df12a2a5e6ef51221acccef4063936cbb48cbb77a24cf1bd26 From c7885735ac24df1f299ffb39ee45b741969ee00d Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 19 Oct 2026 15:14:13 +0000 Subject: [PATCH 05/11] Correctly handle compound SELECTs with explicit COLLATE clauses on ORDER BY expressions, even if they appear in a CTE or VIEW definition. Report [bugs:/info/2026-10-19T08:22:22Z | 2026-10-19T08:22:22Z]. FossilOrigin-Name: 36803e2660eed4f3d16750f1d3a4af796e2c15034838f07f472c2fbb0f9b52b0 --- manifest | 16 +++++++------- manifest.uuid | 2 +- src/select.c | 39 ++++++++++++++++++++++++--------- test/selectE.test | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index fe918a94fb..4d1990a212 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Apply\s[5080eb6d7a7a]\sto\sa\ssimilar\scase\sin\sthe\sJS\stest\ssuite. -D 2026-10-19T15:06:38.626 +C Correctly\shandle\scompound\sSELECTs\swith\sexplicit\sCOLLATE\sclauses\son\sORDER\sBY\sexpressions,\seven\sif\sthey\sappear\sin\sa\sCTE\sor\sVIEW\sdefinition.\sReport\s[bugs:/info/2026-10-19T08:22:22Z\s|\s2026-10-19T08:22:22Z]. +D 2026-10-19T15:14:13.436 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -802,7 +802,7 @@ F src/printf.c 4bd228ed9e9346d558362be562757ee5eef6f9bf483b7f02751ca42cf95174d3 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 0e0990f60c93db38c735d85e5d1741130e72dd0670aec204b5a39118b53c8044 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c 1367ef94822d7f9179c119906315f4a1ef1765aa04c0e08db0cd66a58e2d191d +F src/select.c 6a3ccf273bb808a2c0f9a59dbcde988568d7e00b559410a58a35414189d38c68 F src/shell.c.in 7b2b927ade38b5ac1553eeeba3e22d42da87ba585c00d5277b8595090ac96c59 F src/sqlite.h.in 648fdc66f52433fc0f6cf9564ac924cde544eca9605bbac36aa22d8c944f11ed F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 @@ -1684,7 +1684,7 @@ F test/selectA.test 1da8ce3884c326e11d2855baffb76436b0d7e044404af8a2a70d1399a4ff F test/selectB.test 954e4e49cf1f896d61794e440669e03a27ceea25 F test/selectC.test 38c530b0cc5728b793c3c11f52b52c70290d39822224acd39011c89c1853bd31 F test/selectD.test 6d1909b49970bf92f45ce657505befcef5fc7cbc13544e18103a316d32189bfb -F test/selectE.test a8730ca330fcf40ace158f134f4fe0eb00c7edbf +F test/selectE.test eb48c5abc126d5e17c8de2db509d0669762beafd1b074b016b8619fab8495d3c F test/selectF.test 21c94e6438f76537b72532fa9fd4710cdd455fc3 F test/selectG.test 089f7d3d7e6db91566f00b036cb353107a2cca6220eb1cb264085a836dae8840 F test/selectH.test 0b54599f1917d99568c9b929df22ec6261ed7b6d2f02a46b5945ef81b7871aac @@ -2287,8 +2287,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 5080eb6d7a7a7a5c2cdfd08a766f0e096d0d5536488fcf0b325e7b06a6bdd092 -R 96b94d3dcc56eef7e43d0795b7d99215 -U stephan -Z ad98ab687863df3f0cc0f3af23b4d533 +P 336154a23a2a98df12a2a5e6ef51221acccef4063936cbb48cbb77a24cf1bd26 +R 96680c5010108db7ede64b935e828c8c +U dan +Z 174709ab7d70346d08e48e37b887de0d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ce0af02f74..936a083aa5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -336154a23a2a98df12a2a5e6ef51221acccef4063936cbb48cbb77a24cf1bd26 +36803e2660eed4f3d16750f1d3a4af796e2c15034838f07f472c2fbb0f9b52b0 diff --git a/src/select.c b/src/select.c index b58c118d40..87d218ebd4 100644 --- a/src/select.c +++ b/src/select.c @@ -5763,6 +5763,8 @@ With *sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ return pWith; } +static int selectExpanderWalk(Walker*, Select*); + /* ** This function checks to see if argument pFrom refers to a CTE declared by ** a WITH clause on the stack currently maintained by the parser (on the @@ -5921,7 +5923,7 @@ static int resolveFromTermToCte( return 2; } }else{ - if( sqlite3WalkSelect(pWalker, pSel) ){ + if( selectExpanderWalk(pWalker, pSel) ){ pParse->pWith = pSavedWith; return 2; } @@ -6183,7 +6185,10 @@ static int selectExpander(Walker *pWalker, Select *p){ pTab->nCol = -1; pWalker->eCode = 1; /* Turn on Select.selId renumbering */ if( pFrom->fg.isSubquery ){ - sqlite3WalkSelect(pWalker, pFrom->u4.pSubq->pSelect); + bft hasCompound = pParse->hasCompound; + pParse->hasCompound = 1; + selectExpanderWalk(pWalker, pFrom->u4.pSubq->pSelect); + pParse->hasCompound = hasCompound; } pWalker->eCode = eCodeOrig; pTab->nCol = nCol; @@ -6471,6 +6476,27 @@ void sqlite3SelectWalkAssert2(Walker *NotUsed, Select *NotUsed2){ assert( 0 ); } #endif + +/* +** The first argument is a Walker object created by sqlite3SelectExpand(). +** This function uses the walker to expand the SELECT statement passed +** as the second argument. If necessary, it also converts any compound +** SELECT statements that have COLLATE clauses on ORDER BY expressions +** to sub-queries. Return the return value of sqlite3WalkSelect(). +*/ +static int selectExpanderWalk(Walker *pWalker, Select *pSelect){ + assert( pWalker->xExprCallback==sqlite3ExprWalkNoop ); + assert( pWalker->pParse!=0 ); + if( OK_IF_ALWAYS_TRUE(pWalker->pParse->hasCompound) ){ + pWalker->xSelectCallback = convertCompoundSelectToSubquery; + pWalker->xSelectCallback2 = 0; + sqlite3WalkSelect(pWalker, pSelect); + } + pWalker->xSelectCallback = selectExpander; + pWalker->xSelectCallback2 = sqlite3SelectPopWith; + return sqlite3WalkSelect(pWalker, pSelect); +} + /* ** This routine "expands" a SELECT statement and all of its subqueries. ** For additional information on what it means to "expand" a SELECT @@ -6488,15 +6514,8 @@ static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){ Walker w; w.xExprCallback = sqlite3ExprWalkNoop; w.pParse = pParse; - if( OK_IF_ALWAYS_TRUE(pParse->hasCompound) ){ - w.xSelectCallback = convertCompoundSelectToSubquery; - w.xSelectCallback2 = 0; - sqlite3WalkSelect(&w, pSelect); - } - w.xSelectCallback = selectExpander; - w.xSelectCallback2 = sqlite3SelectPopWith; w.eCode = 0; - sqlite3WalkSelect(&w, pSelect); + selectExpanderWalk(&w, pSelect); } diff --git a/test/selectE.test b/test/selectE.test index 1cabeff370..da384678f6 100644 --- a/test/selectE.test +++ b/test/selectE.test @@ -42,6 +42,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix selectE do_test selectE-1.0 { db eval { @@ -75,6 +76,31 @@ do_test selectE-1.3 { } } {DEF abc} +do_execsql_test selectE-1.4 { + WITH xyz AS ( + SELECT a FROM t2 EXCEPT SELECT a FROM t3 ORDER BY a + ) + SELECT * FROM xyz; +} {DEF abc} + +do_execsql_test selectE-1.5 { + WITH xyz AS ( + SELECT a FROM t2 EXCEPT SELECT a FROM t3 ORDER BY a COLLATE nocase + ) + SELECT * FROM xyz; +} {abc DEF} + +do_execsql_test selectE-1.6 { + CREATE VIEW v1 AS SELECT a FROM t2 EXCEPT SELECT a FROM t3 ORDER BY a; + SELECT * FROM v1; +} {DEF abc} + +do_execsql_test selectE-1.7 { + CREATE VIEW v2 AS + SELECT a FROM t2 EXCEPT SELECT a FROM t3 ORDER BY a COLLATE nocase; + SELECT * FROM v2; +} {abc DEF} + do_test selectE-2.1 { db eval { DELETE FROM t2; @@ -96,5 +122,35 @@ do_catchsql_test selectE-3.1 { SELECT 1 EXCEPT SELECT 2 ORDER BY 1 COLLATE nocase EXCEPT SELECT 3; } {1 {ORDER BY clause should come after EXCEPT not before}} +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 4.0 { + CREATE TABLE t1(a); + CREATE TABLE t2(a); + INSERT INTO t1 VALUES ('def'); + INSERT INTO t2 VALUES ('DEF'); +} + +do_execsql_test 4.1 { + WITH c AS MATERIALIZED ( + SELECT a FROM t1 + EXCEPT SELECT a FROM t2 + ORDER BY a COLLATE nocase + ) + SELECT * FROM c; +} {def} + +do_execsql_test 4.2 { + SELECT a FROM t1 + EXCEPT SELECT a FROM t2 + ORDER BY a COLLATE nocase +} {def} + +do_execsql_test 4.3 { + CREATE VIEW vvv AS + SELECT a FROM t1 EXCEPT SELECT a FROM t2 ORDER BY a COLLATE nocase; + SELECT * FROM vvv; +} {def} finish_test From c3ba37e71c67ef0c6ed41f599c07db588a5fcb48 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 19 Oct 2026 16:06:56 +0000 Subject: [PATCH 06/11] Update sqldiff so that the script it outputs preserves the full precision of floating point values. This fixes the first of two issues reported by [bugs:/info/2026-10-18T20:38:30Z|Bug 2026-10-18T20:38:30Z] FossilOrigin-Name: 2a439593d068a75a30807ab41e764c8aac1dafb205229a78071b716997d2650c --- manifest | 16 ++++---- manifest.uuid | 2 +- test/sqldiff1.test | 93 ++++++++++++++++++++++++++++++++++++++++++++++ tool/sqldiff.c | 2 +- 4 files changed, 103 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 4d1990a212..8ca3a3e12f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Correctly\shandle\scompound\sSELECTs\swith\sexplicit\sCOLLATE\sclauses\son\sORDER\sBY\sexpressions,\seven\sif\sthey\sappear\sin\sa\sCTE\sor\sVIEW\sdefinition.\sReport\s[bugs:/info/2026-10-19T08:22:22Z\s|\s2026-10-19T08:22:22Z]. -D 2026-10-19T15:14:13.436 +C Update\ssqldiff\sso\sthat\sthe\sscript\sit\soutputs\spreserves\sthe\sfull\nprecision\sof\sfloating\spoint\svalues.\s\sThis\sfixes\sthe\sfirst\sof\stwo\nissues\sreported\sby\s[bugs:/info/2026-10-18T20:38:30Z|Bug\s2026-10-18T20:38:30Z] +D 2026-10-19T16:06:56.019 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -1756,7 +1756,7 @@ F test/spellfix.test 09c4b3aecb6754dd9fd4a01ae3a712935c3a8456bc70d81480926f55d1e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 F test/spellfix4.test 7c56a09de68b95051ef0627fe235e514efbba2aa816dc2a9c5c670d98877e632 -F test/sqldiff1.test 1b7ab4f312442c5cc6b3a5f299fa8ca051416d1dd173cb1126fd51bf64f2c3fb +F test/sqldiff1.test b2486da15013e4a54be82067893e49052082be9c72a1410d1ebce66c17967a43 F test/sqllimits1.test 95dcc54332b5fdb00036876d1d98e91d22f4ea0f3b6c076ee8106bd157390977 F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a F test/starschema1.test f5388cd32527ab18d3f98f9e3402ec780f6a186e04e0d9c8531d7568ee734e11 @@ -2266,7 +2266,7 @@ F tool/soak1.tcl a3892082ed1079671565c044e93b55c3c7f38829aedf53cc597c65d23ffdadd F tool/spaceanal.tcl cf693cae76f88cf4e378ccb9de1a6c84dcb9762b336ade56cd3206d10a446db1 F tool/spellsift.tcl 52b4b04dc4333c7ab024f09d9d66ed6b6f7c6eb00b38497a09f338fa55d40618 x F tool/split-sqlite3c.tcl fca49ffd65f54b2d219200ed6b199433a9e6a0a397835045e478601c4c0ea89c -F tool/sqldiff.c c038c3a058f8d8c992eefee6f7e173b1361b81d7f3e3bd871b9808f7d0e96a9a +F tool/sqldiff.c b3d5f5d970a5339d880f7630c9d0481b24c718697204d5df9dd20f80e743d476 F tool/sqlite3_analyzer.c.in 14f02cb5ec3c264cd6107d1f1dad77092b1cf440fc196c30b69ae87b56a1a43b F tool/sqlite3_rsync.c a342f9762653f968e12993bb2dc9083c52ad755c23f6005c575d8a376f970422 F tool/sqltclsh.c.in c103c6fc7d42bce611f9d4596774d60b7ef3d0b291a1f58c9e6184e458b89296 @@ -2287,8 +2287,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 336154a23a2a98df12a2a5e6ef51221acccef4063936cbb48cbb77a24cf1bd26 -R 96680c5010108db7ede64b935e828c8c -U dan -Z 174709ab7d70346d08e48e37b887de0d +P 36803e2660eed4f3d16750f1d3a4af796e2c15034838f07f472c2fbb0f9b52b0 +R e4a2779e8c9b1988611adbf409f3d359 +U drh +Z 0d867da854f816575dbfaf8b7245ec18 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 936a083aa5..29d0496faf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -36803e2660eed4f3d16750f1d3a4af796e2c15034838f07f472c2fbb0f9b52b0 +2a439593d068a75a30807ab41e764c8aac1dafb205229a78071b716997d2650c diff --git a/test/sqldiff1.test b/test/sqldiff1.test index 5a3c11cb9c..4edecc8232 100644 --- a/test/sqldiff1.test +++ b/test/sqldiff1.test @@ -85,4 +85,97 @@ do_test sqldiff-2.1 { set ::MSG } {ALTER TABLE t1 ADD COLUMN b;} +# Bug 2026-10-18T20:38:30Z +# +proc sqldiff_apply_test {tn} { + set patch [exec $::PROG test.db test2.db] + sqlite3 db test.db + set rc [catch {db eval $patch} msg] + db close + if {$rc} { + puts "PATCH: [list $patch]" + } + do_test $tn.1 [list list $rc $msg] {0 {}} + do_test $tn.2 {exec $::PROG test.db test2.db} {} +} + +forcedelete test.db test2.db +sqlite3 db test.db +do_execsql_test sqldiff-3.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b REAL); +} +db backup test2.db +db close +sqlite3 db test2.db +do_execsql_test sqldiff-3.1 { + INSERT INTO t1 VALUES(1, 0.1+0.2); + INSERT INTO t1 VALUES(2, 1.0/3.0); + INSERT INTO t1 VALUES(3, 1.7976931348623157e308); + INSERT INTO t1 VALUES(4, -1.7976931348623157e308); + INSERT INTO t1 VALUES(5, 4.9406564584124654e-324); + INSERT INTO t1 VALUES(6, 123456789.12345678); +} +db close +sqldiff_apply_test sqldiff-3.2 +sqlite3 db test.db +do_execsql_test sqldiff-3.3 { + ATTACH 'test2.db' AS x2; + SELECT a FROM t1 WHERE b IS NOT (SELECT b FROM x2.t1 AS y WHERE y.a=t1.a); +} {} +db close + +forcedelete test.db test2.db +sqlite3 db test.db +do_execsql_test sqldiff-4.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b REAL); +} +db backup test2.db +db close +sqlite3 db test2.db +do_execsql_test sqldiff-4.1 { + INSERT INTO t1 VALUES(1, 9e999); + INSERT INTO t1 VALUES(2, -9e999); +} +db close +sqldiff_apply_test sqldiff-4.2 +sqlite3 db test.db +do_execsql_test sqldiff-4.3 { + SELECT a, b>1e308, b<-1e308 FROM t1 ORDER BY a; +} {1 1 0 2 0 1} +db close + +# The following test cases demonstrate that if the source table contains +# an AUTOINCREMENT table but there is no corresponding entry in the +# sqlite_sequence table, then the sqlite_sequence table is not updated +# correctly. This is a long-standing deficiency in sqldiff, though the +# issue is contrived and does not appear in practice. If the issue is +# ever fixed, then simply uncomment the following test sequence to verify +# the fix. +# +if 0 { + forcedelete test.db test2.db + sqlite3 db test.db + do_execsql_test sqldiff-5.0 { + CREATE TABLE a1(id INTEGER PRIMARY KEY AUTOINCREMENT, x); + } + db backup test2.db + db close + sqlite3 db test2.db + do_execsql_test sqldiff-5.1 { + INSERT INTO a1(x) VALUES('one'),('two'),('three'); + DELETE FROM a1 WHERE id=3; + SELECT seq FROM sqlite_sequence WHERE name='a1'; + } {3} + db close + sqldiff_apply_test sqldiff-5.2 + sqlite3 db test.db + do_execsql_test sqldiff-5.3 { + SELECT seq FROM sqlite_sequence WHERE name='a1'; + } {3} + do_execsql_test sqldiff-5.4 { + INSERT INTO a1(x) VALUES('four'); + SELECT id FROM a1 WHERE x='four'; + } {4} +} + finish_test diff --git a/tool/sqldiff.c b/tool/sqldiff.c index 0f8778e38f..a6c1cfd2f5 100644 --- a/tool/sqldiff.c +++ b/tool/sqldiff.c @@ -341,7 +341,7 @@ static void printQuoted(FILE *out, sqlite3_value *X){ double r1; char zBuf[50]; r1 = sqlite3_value_double(X); - sqlite3_snprintf(sizeof(zBuf), zBuf, "%!.15g", r1); + sqlite3_snprintf(sizeof(zBuf), zBuf, "%!0.17g", r1); sqlite3_fprintf(out, "%s", zBuf); break; } From ee16b84fb6b36c486cc36280e7fd026232425de9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 19 Oct 2026 16:25:28 +0000 Subject: [PATCH 07/11] In the CLI, do not read the ~/.sqliterc file or an alternative specified by the --init command-line option if the --safe option is used. [bugs:/info/2026-10-19T12:32:27Z|Bug 2026-10-19T12:32:27Z] FossilOrigin-Name: f1e94b6042f056f103eaf4ac11004fc2f559499ccf2b93eae0c9283150a6e921 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8ca3a3e12f..fc3097342a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\ssqldiff\sso\sthat\sthe\sscript\sit\soutputs\spreserves\sthe\sfull\nprecision\sof\sfloating\spoint\svalues.\s\sThis\sfixes\sthe\sfirst\sof\stwo\nissues\sreported\sby\s[bugs:/info/2026-10-18T20:38:30Z|Bug\s2026-10-18T20:38:30Z] -D 2026-10-19T16:06:56.019 +C In\sthe\sCLI,\sdo\snot\sread\sthe\s~/.sqliterc\sfile\sor\san\salternative\sspecified\sby\nthe\s--init\scommand-line\soption\sif\sthe\s--safe\soption\sis\sused.\n[bugs:/info/2026-10-19T12:32:27Z|Bug\s2026-10-19T12:32:27Z] +D 2026-10-19T16:25:28.449 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -803,7 +803,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 0e0990f60c93db38c735d85e5d1741130e72dd0670aec204b5a39118b53c8044 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 6a3ccf273bb808a2c0f9a59dbcde988568d7e00b559410a58a35414189d38c68 -F src/shell.c.in 7b2b927ade38b5ac1553eeeba3e22d42da87ba585c00d5277b8595090ac96c59 +F src/shell.c.in e2896f49b601c6f7a3906411fd0d1ac4143f345de62310d6355aa322b01b86de F src/sqlite.h.in 648fdc66f52433fc0f6cf9564ac924cde544eca9605bbac36aa22d8c944f11ed F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 F src/sqlite3ext.h 5e113c4c0442f2f1b3345d44cbe4b82fad45f2fc0c35f0ed4eef27fb8f1cb394 @@ -2287,8 +2287,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 36803e2660eed4f3d16750f1d3a4af796e2c15034838f07f472c2fbb0f9b52b0 -R e4a2779e8c9b1988611adbf409f3d359 +P 2a439593d068a75a30807ab41e764c8aac1dafb205229a78071b716997d2650c +R 4c2ef7a5bf4d180b574f1bf6dace7bef U drh -Z 0d867da854f816575dbfaf8b7245ec18 +Z 821214f0b402039550c2ac90106f35dd # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 29d0496faf..f03a03b495 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2a439593d068a75a30807ab41e764c8aac1dafb205229a78071b716997d2650c +f1e94b6042f056f103eaf4ac11004fc2f559499ccf2b93eae0c9283150a6e921 diff --git a/src/shell.c.in b/src/shell.c.in index 66b45246e6..63198598fa 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -14439,7 +14439,7 @@ int SQLITE_CDECL main(int argc, char **argv){ }else if( cli_strcmp(z,"-unsafe-testing")==0 ){ ShellSetFlag(&data,SHFLG_TestingMode); }else if( cli_strcmp(z,"-safe")==0 ){ - /* no-op - catch this on the second pass */ + noInit = 1; /* --safe implies --noinit */ }else if( cli_strcmp(z,"-escape")==0 && i+1 Date: Mon, 19 Oct 2026 17:24:43 +0000 Subject: [PATCH 08/11] Fix JSON parsing to properly recognize a backslash-continuation at the end of a string. [bugs:/info/2026-10-18T04:42:37Z|Bug 2026-10-18T04:42:37Z] FossilOrigin-Name: d8c93a5f2c19622d1da29f503145223ff433e1597235510273fbebefe455c4c4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/json.c | 7 ++++++- test/json501.test | 23 +++++++++++++++++++++++ 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index fc3097342a..71bee78d85 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sCLI,\sdo\snot\sread\sthe\s~/.sqliterc\sfile\sor\san\salternative\sspecified\sby\nthe\s--init\scommand-line\soption\sif\sthe\s--safe\soption\sis\sused.\n[bugs:/info/2026-10-19T12:32:27Z|Bug\s2026-10-19T12:32:27Z] -D 2026-10-19T16:25:28.449 +C Fix\sJSON\sparsing\sto\sproperly\srecognize\sa\sbackslash-continuation\sat\sthe\nend\sof\sa\sstring.\n[bugs:/info/2026-10-18T04:42:37Z|Bug\s2026-10-18T04:42:37Z] +D 2026-10-19T17:24:43.871 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -763,7 +763,7 @@ F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf F src/hwtime.h 5cb15147c8583d0fc4748e1c12ea6f38c9deaeefa147a4d8d379fd9bc81fee9a F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 482d853c980f4765f045bbea3ab095067a52cd57f47e357f9f17aa7c7fff793f -F src/json.c c3ba268dda607a377f210dcf84603bb3d282f9833c8aa0abfb0c8951aefc40be +F src/json.c df4beb89047f68419a8105e80673ca26cd6165e0901a5ebca7fde9d12de5d457 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 5cd4cd7ec6e1a46416806899086363fbf95eecd3bfb9a388b436c9a77243c902 F src/main.c a32bcae6e3bfd9209d922b02c28ba796fa628322c3c4be0c5a76c418be793d13 @@ -1443,7 +1443,7 @@ F test/json106.test 4aed3afd16549045d198a8d9cea00deea96e1f2ecf55864dce96cac558b8 F test/json107.test 59054e815c8f6b67d634d44ace421cf975828fb5651c4460aa66015c8e19d562 F test/json108.test eab1859b19138ee03acd4415751308fc3849943c669a06b515bba658b96b55c3 F test/json109.test 441cea5d73c24a1a34d284101740dfae5a082237c048c8a66b03aeebe5e3643e -F test/json501.test b95e2d14988b682a5cadf079dd6162f0f85fb74cd59c6b1f1624110104a974eb +F test/json501.test 3289f2e3f7ed9e4c86192f1dd59a4e9538f35ef22adbc9bf701beb7af0cebdcc F test/json502.test 4ef68e4f272dfb083d4cbceb4e9e51d67ec1186a185e0c13637c50a4dc2f9796 F test/jsonb01.test 42419c8080af5660cdfd3fddec322d28bdbc244d9800ee9569091d455f1c0dea F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff @@ -2287,8 +2287,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 2a439593d068a75a30807ab41e764c8aac1dafb205229a78071b716997d2650c -R 4c2ef7a5bf4d180b574f1bf6dace7bef +P f1e94b6042f056f103eaf4ac11004fc2f559499ccf2b93eae0c9283150a6e921 +R 362e27b73c798c4f8da4ccbb159bd9ac U drh -Z 821214f0b402039550c2ac90106f35dd +Z add75ac0bb068f79ad62637b98ddf622 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f03a03b495..a57154c225 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f1e94b6042f056f103eaf4ac11004fc2f559499ccf2b93eae0c9283150a6e921 +d8c93a5f2c19622d1da29f503145223ff433e1597235510273fbebefe455c4c4 diff --git a/src/json.c b/src/json.c index e5d9830a3c..fc4c4039c0 100644 --- a/src/json.c +++ b/src/json.c @@ -3503,7 +3503,12 @@ static void jsonReturnFromBlob( if( c=='\\' ){ u32 v; u32 szEscape = jsonUnescapeOneChar(&z[iIn], sz-iIn, &v); - if( v<=0x7f ){ + if( v==0 && iIn+szEscape==sz + && (z[iIn+1]=='\n' || z[iIn+1]=='\r' || (u8)z[iIn+1]==0xe2) + ){ + /* A JSON5 line continuation at the end of the string + ** contributes no characters */ + }else if( v<=0x7f ){ zOut[iOut++] = (char)v; }else if( v<=0x7ff ){ assert( szEscape>=2 ); diff --git a/test/json501.test b/test/json501.test index bfd21055a7..aeef3a5f3d 100644 --- a/test/json501.test +++ b/test/json501.test @@ -332,5 +332,28 @@ for {set c 1} {$c<=0x1f} {incr c} { } "{{\"label\":\"abc${e}xyz\"}}" } +# Bug 2026-10-18T04:42:37Z +# +do_execsql_test 14.1 { + SELECT hex(('"ab\' || char(10) || '"') ->> '$'); +} {6162} +do_execsql_test 14.2 { + SELECT hex(('"ab\' || char(13,10) || '"') ->> '$'); +} {6162} +do_execsql_test 14.3 { + SELECT hex(('"ab\' || char(8232) || '"') ->> '$'); +} {6162} +do_execsql_test 14.4 { + SELECT hex(('"\' || char(10) || '"') ->> '$'); +} {{}} +do_execsql_test 14.5 { + SELECT hex(jsonb('"ab\' || char(10) || '"') ->> '$'); +} {6162} +do_execsql_test 14.6 { + SELECT hex(('"ab\' || char(10) || 'c"') ->> '$'); +} {616263} +do_execsql_test 14.7 { + SELECT hex('"ab\u0000"' ->> '$'); +} {616200} finish_test From 18a23191bf22a9c9d1de29ffaedea805c43fe5c9 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 19 Oct 2026 17:44:46 +0000 Subject: [PATCH 09/11] Avoid crashing if an RBU vacuum is attempted with a VFS that does not support RBU. Report [bugs:/info/2026-10-19T12:21:34Z | 2026-10-19T12:21:34Z]. FossilOrigin-Name: 5024b528dcf419393086d89eff50aa1b52116bb05b6e07849555f76891bc68a0 --- ext/rbu/rbu3.test | 7 +++++++ ext/rbu/sqlite3rbu.c | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/ext/rbu/rbu3.test b/ext/rbu/rbu3.test index 4ea6adbcda..e579f3f979 100644 --- a/ext/rbu/rbu3.test +++ b/ext/rbu/rbu3.test @@ -163,6 +163,13 @@ do_test 4.1 { do_test 4.2 { list [catch { rbu close } msg] $msg } {1 {SQLITE_ERROR - rbu vfs not found}} +do_test 4.3 { + sqlite3rbu_vacuum rbu file:test.db?vfs=tvfs + list [catch { rbu step } msg] $msg +} {0 SQLITE_ERROR} +do_test 4.4 { + list [catch { rbu close } msg] $msg +} {1 {SQLITE_ERROR - rbu vfs not found}} tvfs delete #------------------------------------------------------------------------- diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index 1e9756d136..caeb55456f 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -2891,7 +2891,7 @@ static void rbuOpenDatabase(sqlite3rbu *p, sqlite3 *dbMain, int *pbRetry){ p->nRbu = 0; p->pRbuFd = 0; rc = sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p); - if( rc!=SQLITE_NOTFOUND ) p->rc = rc; + if( rc!=SQLITE_NOTFOUND || p->pRbuFd==0 ) p->rc = rc; if( p->eStage>=RBU_STAGE_MOVE ){ bOpen = 1; }else{ diff --git a/manifest b/manifest index 71bee78d85..eac7fcb2cd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sJSON\sparsing\sto\sproperly\srecognize\sa\sbackslash-continuation\sat\sthe\nend\sof\sa\sstring.\n[bugs:/info/2026-10-18T04:42:37Z|Bug\s2026-10-18T04:42:37Z] -D 2026-10-19T17:24:43.871 +C Avoid\scrashing\sif\san\sRBU\svacuum\sis\sattempted\swith\sa\sVFS\sthat\sdoes\snot\ssupport\sRBU.\sReport\s[bugs:/info/2026-10-19T12:21:34Z\s|\s2026-10-19T12:21:34Z]. +D 2026-10-19T17:44:46.491 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -434,7 +434,7 @@ F ext/rbu/rbu11.test 3b71377c018b05dd39c30ea2feb272a087eb0faeff1b7b4511144f87219 F ext/rbu/rbu12.test ec63aa7bfc3c65c1d774bf4357ed731723827d211d9d7cb0efa171bbaeeebaf4 F ext/rbu/rbu13.test 658edbc3325d79252a98b761fde95460e439f80e820ff29e10261e25f870b3b6 F ext/rbu/rbu14.test 05dac607a62f62102f4db92135979a8a4501143638060019aca08c753822cf39 -F ext/rbu/rbu3.test 4a81517af618c3bf8c72e2d0b81c7c06acb8d176036d63d8e6669b73342306ae +F ext/rbu/rbu3.test b84d4e74c1a1beef5c31fce6ecba0147dab946220c4c7dced8e852f0d41e160f F ext/rbu/rbu5.test e21820b83822ae4c12afc2078a7b6c0523fb0cefe69c8b23c044cea91359e81c F ext/rbu/rbu6.test db2ff1f832dfc9e34c7910b17e157c2fe0e36024a3fe1119dd6437640dc07c82 F ext/rbu/rbu7.test 5fa41734613a3ae1bb93d280eb3c341cff5dcc72652ff9ec7fbaa12425eda9c2 @@ -473,7 +473,7 @@ F ext/rbu/rbuvacuum.test 6ded47e692b89c5c31f0bef31d899eecfaa3f0df7e1e969746ea507 F ext/rbu/rbuvacuum2.test 1a9bd41f127be2826de2a65204df9118525a8af8d16e61e6bc63ba3ac0010a23 F ext/rbu/rbuvacuum3.test 3ce42695fdf21aaa3499e857d7d4253bc499ad759bcd6c9362042c13cd37d8de F ext/rbu/rbuvacuum4.test ffccd22f67e2d0b380d2889685742159dfe0d19a3880ca3d2d1d69eefaebb205 -F ext/rbu/sqlite3rbu.c d1bb89154707af558b48d92f3c4d81a9d9ea1a2a13e6f46c445945f66398310e +F ext/rbu/sqlite3rbu.c 29be4d2e7a7fbc8124545d2833570bdefef8724239c6cdd81a8d1e6dd07889f2 F ext/rbu/sqlite3rbu.h e3a5bf21e09ca93ce4e8740e00d6a853e90a697968ec0ea98f40826938bdb68e F ext/rbu/test_rbu.c 8b6e64e486c28c41ef29f6f4ea6be7b3091958987812784904f5e903f6b56418 F ext/recover/dbdata.c 10d3c56968a9af6853722a47280805ad1564714d79ea45ac6f7da14bb57fd137 @@ -2287,8 +2287,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P f1e94b6042f056f103eaf4ac11004fc2f559499ccf2b93eae0c9283150a6e921 -R 362e27b73c798c4f8da4ccbb159bd9ac -U drh -Z add75ac0bb068f79ad62637b98ddf622 +P d8c93a5f2c19622d1da29f503145223ff433e1597235510273fbebefe455c4c4 +R 942b49389799779290061af07de27b92 +U dan +Z 2034d08dbe0509bc3214a3243740acf0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a57154c225..c9108af12f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d8c93a5f2c19622d1da29f503145223ff433e1597235510273fbebefe455c4c4 +5024b528dcf419393086d89eff50aa1b52116bb05b6e07849555f76891bc68a0 From 16327cc106869cdbff7d1774f894eddc782fd2e7 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 19 Oct 2026 18:05:25 +0000 Subject: [PATCH 10/11] JS: resolve a [https://github.com/emscripten-core/emscripten/issues/28016|build regression] triggered by Emscripten 6.0.5+. Remove the -sWASM_BIGINT flag from the build because (A) it's been Emscripten's default for a long time and (B) Emscripten now warns loudly if it's used. Remove a stray build flag from fiddle, inadvertently introduced in [c32cf3e355], which caused it to build in 64-bit mode. FossilOrigin-Name: cc9457981e2a63d271525b1d891a63dd28b1c2da04777228e27132d7cc743cfa --- ext/wasm/GNUmakefile | 5 +++-- ext/wasm/mkwasmbuilds.c | 3 +++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile index 78abf83445..2822484f58 100644 --- a/ext/wasm/GNUmakefile +++ b/ext/wasm/GNUmakefile @@ -757,7 +757,9 @@ emcc.jsflags = -fPIC #emcc.jsflags += -Wno-gcc-install-dir-libstdcxx #emcc is not passing ^^^ this on to clang emcc.jsflags += --no-entry -emcc.jsflags += -sWASM_BIGINT=$(emcc.WASM_BIGINT) +# emcc 6.0.12+ emits ugly warnings if we turn on BIGINT, +# despite the value being the same one it will use by +# default: emcc.jsflags += -sWASM_BIGINT=$(emcc.WASM_BIGINT) emcc.jsflags += -sMODULARIZE emcc.jsflags += -sDYNAMIC_EXECUTION=0 emcc.jsflags += -sNO_POLYFILL @@ -1084,7 +1086,6 @@ $(EXPORTED_FUNCTIONS.fiddle): $(EXPORTED_FUNCTIONS.api.in) \ emcc.flags.fiddle = \ $(emcc.cflags) $(emcc_opt_full) \ - $(emcc.MEMORY64) \ --minify 0 \ -sALLOW_TABLE_GROWTH \ -sALLOW_MEMORY_GROWTH \ diff --git a/ext/wasm/mkwasmbuilds.c b/ext/wasm/mkwasmbuilds.c index 81f2cae3a7..b883ff1733 100644 --- a/ext/wasm/mkwasmbuilds.c +++ b/ext/wasm/mkwasmbuilds.c @@ -498,6 +498,9 @@ static void mk_prologue(void){ */ "--enable-bulk-memory-opt " /* required */ "--all-features " /* required */ + "--disable-compact-imports " /* + https://github.com/emscripten-core/emscripten/issues/28016 + */ "--post-emscripten " /* Saves roughly 12kb */ "--strip-debug " /* We already wasm-strip, but in ** case this environment has no diff --git a/manifest b/manifest index eac7fcb2cd..f90d1fbf5b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\scrashing\sif\san\sRBU\svacuum\sis\sattempted\swith\sa\sVFS\sthat\sdoes\snot\ssupport\sRBU.\sReport\s[bugs:/info/2026-10-19T12:21:34Z\s|\s2026-10-19T12:21:34Z]. -D 2026-10-19T17:44:46.491 +C JS:\sresolve\sa\s[https://github.com/emscripten-core/emscripten/issues/28016|build\sregression]\striggered\sby\sEmscripten\s6.0.5+.\sRemove\sthe\s-sWASM_BIGINT\sflag\sfrom\sthe\sbuild\sbecause\s(A)\sit's\sbeen\sEmscripten's\sdefault\sfor\sa\slong\stime\sand\s(B)\sEmscripten\snow\swarns\sloudly\sif\sit's\sused.\sRemove\sa\sstray\sbuild\sflag\sfrom\sfiddle,\sinadvertently\sintroduced\sin\s[c32cf3e355],\swhich\scaused\sit\sto\sbuild\sin\s64-bit\smode. +D 2026-10-19T18:05:25.048 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -643,7 +643,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 ef90ba7178fbb02a33165f40f3a9ca0893bb397c992a844e34d2f655e60743ba -F ext/wasm/GNUmakefile d93df7101619ae363f431704bb77c0e683240e4d9e7edfb32a0e96e31c23f214 +F ext/wasm/GNUmakefile 390cf98771f3c99e9e6a4a34c506d911f49016d7ed0d4913f78a41a63cda69f1 F ext/wasm/README-dist.txt f01081a850ce38a56706af6b481e3a7878e24e42b314cfcd4b129f0f8427066a F ext/wasm/README.md 6d820c98468ebcee1dbf547467a03f65d256a2be48a9dcbeb5637d3da569c6fe F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff @@ -699,7 +699,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 d2cd19cf2e373ae4cc7b08baf6520c0c125b24f30311fcfcd91e69606213a5ec +F ext/wasm/mkwasmbuilds.c 0ec4b858fe04921d88de98216a65fd6d885eb98170e9c2d27a81cb2295eef811 F ext/wasm/module-symbols.html e54f42112e0aac2a31f850ab33e7f2630a2ea4f63496f484a12469a2501e07e2 F ext/wasm/scratchpad-wasmfs.html a3d7388f3c4b263676b58b526846e9d02dfcb4014ff29d3a5040935286af5b96 F ext/wasm/scratchpad-wasmfs.mjs 66034b9256b218de59248aad796760a1584c1dd842231505895eff00dbd57c63 @@ -2287,8 +2287,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P d8c93a5f2c19622d1da29f503145223ff433e1597235510273fbebefe455c4c4 -R 942b49389799779290061af07de27b92 -U dan -Z 2034d08dbe0509bc3214a3243740acf0 +P 5024b528dcf419393086d89eff50aa1b52116bb05b6e07849555f76891bc68a0 +R 9b1cbc7bb86e82acb85a4584107051f8 +U stephan +Z a9642e82ab8463e2368070ac3f7b77aa # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c9108af12f..57cfbaa51b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5024b528dcf419393086d89eff50aa1b52116bb05b6e07849555f76891bc68a0 +cc9457981e2a63d271525b1d891a63dd28b1c2da04777228e27132d7cc743cfa From aa037e12be5b3892fc28c8ed23d6fb3e641486ba Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 19 Oct 2026 18:20:03 +0000 Subject: [PATCH 11/11] Correct the handling of SQLITE_IGNORE returns from authorizer calls for UPDATE on the rowid or INTEGER PRIMARY KEY. See the test cases in TH3 for details. FossilOrigin-Name: 606005419f60bd14eec71ee87a770051c8c551273c9a7567d830283eeb1058e8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/update.c | 12 ++++++++---- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index f90d1fbf5b..0a7d9c2540 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C JS:\sresolve\sa\s[https://github.com/emscripten-core/emscripten/issues/28016|build\sregression]\striggered\sby\sEmscripten\s6.0.5+.\sRemove\sthe\s-sWASM_BIGINT\sflag\sfrom\sthe\sbuild\sbecause\s(A)\sit's\sbeen\sEmscripten's\sdefault\sfor\sa\slong\stime\sand\s(B)\sEmscripten\snow\swarns\sloudly\sif\sit's\sused.\sRemove\sa\sstray\sbuild\sflag\sfrom\sfiddle,\sinadvertently\sintroduced\sin\s[c32cf3e355],\swhich\scaused\sit\sto\sbuild\sin\s64-bit\smode. -D 2026-10-19T18:05:25.048 +C Correct\sthe\shandling\sof\sSQLITE_IGNORE\sreturns\sfrom\sauthorizer\scalls\nfor\sUPDATE\son\sthe\srowid\sor\sINTEGER\sPRIMARY\sKEY.\s\sSee\sthe\stest\scases\nin\sTH3\sfor\sdetails. +D 2026-10-19T18:20:03.443 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -864,7 +864,7 @@ F src/threads.c 85d8b9f05f78211c61e3739ab5db761d7118766d1916ae7f2764735106bc4e13 F src/tokenize.c e9d52d9f7374d82dadcd11726bea8a597d43709d6672704f3f0375bf1d726912 F src/treeview.c 3a9e59b0d2b9e54e403fa65056ba90716eb91b5cc6e3fe0cda0edea060ddd281 F src/trigger.c d6d8991ca346eb6f56e50a3c5df486176b67a9179336798a75bb05e622c72cac -F src/update.c 2c5ea3803c19e5726960df9416a50759322d750b820db7d2b623b4f122e25bf9 +F src/update.c a38e0fa71f66a0c1eec564f08c20ec0935db8e3e558f0b9e305549972b91e4f4 F src/upsert.c dd9f0fcccbfb4f20e1026a21a7254ba3f2c08e9cfa92affaff5b5ec3b00ea549 F src/utf.c c5bec56770b71fe75e12f1f7b0a512032e1fd3d1f83c50c4ab4474ced20347a4 F src/util.c 4437408e09cef6dbb63a8b8ba28be53bdc098ec890e5e64ad7ae1fc83448962e @@ -2287,8 +2287,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 5024b528dcf419393086d89eff50aa1b52116bb05b6e07849555f76891bc68a0 -R 9b1cbc7bb86e82acb85a4584107051f8 -U stephan -Z a9642e82ab8463e2368070ac3f7b77aa +P cc9457981e2a63d271525b1d891a63dd28b1c2da04777228e27132d7cc743cfa +R f8517f17f1191dd75c69be8234708732 +U drh +Z 6fa0fdd5ac854a6919241e6274a443bc # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 57cfbaa51b..8750f73100 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cc9457981e2a63d271525b1d891a63dd28b1c2da04777228e27132d7cc743cfa +606005419f60bd14eec71ee87a770051c8c551273c9a7567d830283eeb1058e8 diff --git a/src/update.c b/src/update.c index ea17e96c55..ec6b5a8258 100644 --- a/src/update.c +++ b/src/update.c @@ -519,10 +519,14 @@ void sqlite3Update( rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName, j<0 ? "ROWID" : pTab->aCol[j].zCnName, db->aDb[iDb].zDbSName); - if( rc==SQLITE_DENY ){ - goto update_cleanup; - }else if( rc==SQLITE_IGNORE ){ - aXRef[j] = -1; + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DENY ){ + goto update_cleanup; + }else if( j<0 || j==pTab->iPKey ){ + chngRowid = 0; + }else{ + aXRef[j] = -1; + } } } #endif