1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-29 08:01:23 +03:00

Correct a Tester1.java test which inadvertently created a spurious db file in the current dir. Unrelated minor cleanups.

FossilOrigin-Name: 016bbdadbf9f95cef185d2606c23e3b3c724586fcca470e11e6fbdbaefd75c79
This commit is contained in:
stephan
2023-09-01 16:28:46 +00:00
parent 4ea63e5609
commit a5f425cc6e
16 changed files with 196 additions and 103 deletions

View File

@ -2303,7 +2303,7 @@ S3JniApi(sqlite3_bind_text(),jint,1bind_1text)(
return (jint)rc; return (jint)rc;
} }
S3JniApi(sqlite3_text16(),jint,1bind_1text16)( S3JniApi(sqlite3_bind_text16(),jint,1bind_1text16)(
JniArgsEnvClass, jobject jpStmt, jint ndx, jbyteArray baData, jint nMax JniArgsEnvClass, jobject jpStmt, jint ndx, jbyteArray baData, jint nMax
){ ){
jbyte * const pBuf = baData ? s3jni_jbytearray_bytes(baData) : 0; jbyte * const pBuf = baData ? s3jni_jbytearray_bytes(baData) : 0;
@ -2412,7 +2412,7 @@ S3JniApi(sqlite3_cancel_auto_extension(),jboolean,1cancel_1auto_1extension)(
jboolean rc = JNI_FALSE; jboolean rc = JNI_FALSE;
int i; int i;
S3JniAutoExt_mutex_enter; S3JniAutoExt_mutex_enter;
/* This algo mirrors the one in the core. */ /* This algo corresponds to the one in the core. */
for( i = SJG.autoExt.nExt-1; i >= 0; --i ){ for( i = SJG.autoExt.nExt-1; i >= 0; --i ){
ax = &SJG.autoExt.aExt[i]; ax = &SJG.autoExt.aExt[i];
if( ax->jObj && (*env)->IsSameObject(env, ax->jObj, jAutoExt) ){ if( ax->jObj && (*env)->IsSameObject(env, ax->jObj, jAutoExt) ){
@ -2430,7 +2430,6 @@ S3JniApi(sqlite3_cancel_auto_extension(),jboolean,1cancel_1auto_1extension)(
return rc; return rc;
} }
/* Wrapper for sqlite3_close(_v2)(). */ /* Wrapper for sqlite3_close(_v2)(). */
static jint s3jni_close_db(JNIEnv * const env, jobject jDb, int version){ static jint s3jni_close_db(JNIEnv * const env, jobject jDb, int version){
int rc = 0; int rc = 0;
@ -2586,8 +2585,7 @@ S3JniApi(sqlite3_column_text(),jbyteArray,1column_1text)(
} }
#if 0 #if 0
// this impl might prove useful, but we'd need to publish the // this impl might prove useful.
// bytearray-returning impl with a different name.
S3JniApi(sqlite3_column_text(),jstring,1column_1text)( S3JniApi(sqlite3_column_text(),jstring,1column_1text)(
JniArgsEnvClass, jobject jpStmt, jint ndx JniArgsEnvClass, jobject jpStmt, jint ndx
){ ){
@ -2648,11 +2646,15 @@ static void s3jni_rollback_hook_impl(void *pP){
(void)s3jni_commit_rollback_hook_impl(0, pP); (void)s3jni_commit_rollback_hook_impl(0, pP);
} }
/*
** Proxy for sqlite3_commit_hook() (if isCommit is true) or
** sqlite3_rollback_hook().
*/
static jobject s3jni_commit_rollback_hook(int isCommit, JNIEnv * const env, static jobject s3jni_commit_rollback_hook(int isCommit, JNIEnv * const env,
jobject jDb, jobject jHook){ jobject jDb, jobject jHook){
S3JniDb * ps; S3JniDb * ps;
jobject pOld = 0; jobject pOld = 0; /* previous hoook */
S3JniHook * pHook; S3JniHook * pHook; /* ps->hooks.commit|rollback */
S3JniDb_mutex_enter; S3JniDb_mutex_enter;
ps = S3JniDb_from_java(jDb); ps = S3JniDb_from_java(jDb);
@ -2684,7 +2686,7 @@ static jobject s3jni_commit_rollback_hook(int isCommit, JNIEnv * const env,
S3JniExceptionReport; S3JniExceptionReport;
S3JniExceptionClear; S3JniExceptionClear;
s3jni_db_error(ps->pDb, SQLITE_ERROR, s3jni_db_error(ps->pDb, SQLITE_ERROR,
"Cannot not find matching call() in" "Cannot not find matching call() method in"
"hook object."); "hook object.");
}else{ }else{
pHook->midCallback = xCallback; pHook->midCallback = xCallback;
@ -2711,9 +2713,10 @@ S3JniApi(sqlite3_commit_hook(),jobject,1commit_1hook)(
S3JniApi(sqlite3_compileoption_get(),jstring,1compileoption_1get)( S3JniApi(sqlite3_compileoption_get(),jstring,1compileoption_1get)(
JniArgsEnvClass, jint n JniArgsEnvClass, jint n
){ ){
jstring const rv = (*env)->NewStringUTF( env, sqlite3_compileoption_get(n) ) const char * z = sqlite3_compileoption_get(n);
jstring const rv = z ? (*env)->NewStringUTF( env, z ) : 0;
/* We know these to be ASCII, so MUTF-8 is fine. */; /* We know these to be ASCII, so MUTF-8 is fine. */;
s3jni_oom_check(rv); s3jni_oom_check(z ? !!rv : 1);
return rv; return rv;
} }
@ -4382,8 +4385,7 @@ S3JniApi(sqlite3_value_text(),jbyteArray,1value_1text)(
} }
#if 0 #if 0
// this impl might prove useful, but we'd need to publish the // this impl might prove useful.
// bytearray-returning impl with a different name.
S3JniApi(sqlite3_value_text(),jstring,1value_1text)( S3JniApi(sqlite3_value_text(),jstring,1value_1text)(
JniArgsEnvClass, jobject jpSVal JniArgsEnvClass, jobject jpSVal
){ ){

View File

@ -220,7 +220,15 @@ public class Tester1 implements Runnable {
outln("\t"+optName+"\t (used="+ outln("\t"+optName+"\t (used="+
sqlite3_compileoption_used(optName)+")"); sqlite3_compileoption_used(optName)+")");
} }
}
private void testCompileOption(){
int i = 0;
String optName;
for( ; null != (optName = sqlite3_compileoption_get(i)); ++i){
}
affirm( i > 10 );
affirm( null==sqlite3_compileoption_get(-1) );
} }
private void testOpenDb1(){ private void testOpenDb1(){
@ -1330,7 +1338,7 @@ public class Tester1 implements Runnable {
sqlite3 db = createNewDb(); sqlite3 db = createNewDb();
affirm( 4==val.value ); affirm( 4==val.value );
execSql(db, "ATTACH ':memory' as foo"); execSql(db, "ATTACH ':memory:' as foo");
affirm( 4==val.value, "ATTACH uses the same connection, not sub-connections." ); affirm( 4==val.value, "ATTACH uses the same connection, not sub-connections." );
sqlite3_close(db); sqlite3_close(db);
db = null; db = null;
@ -1450,19 +1458,17 @@ public class Tester1 implements Runnable {
rc = sqlite3_stmt_explain(stmt, 2); rc = sqlite3_stmt_explain(stmt, 2);
affirm( 2 == sqlite3_stmt_isexplain(stmt) ); affirm( 2 == sqlite3_stmt_isexplain(stmt) );
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
sqlite3_close_v2(db); sqlite3_close_v2(db);
} }
private void testLimit(){ private void testLimit(){
final sqlite3 db = createNewDb(); final sqlite3 db = createNewDb();
int v;
int v1, v2; v = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1);
v1 = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1); affirm( v > 0 );
affirm( v1 > 0 ); affirm( v == sqlite3_limit(db, SQLITE_LIMIT_LENGTH, v-1) );
affirm( v1 == sqlite3_limit(db, SQLITE_LIMIT_LENGTH, v1-1) ); affirm( v-1 == sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1) );
affirm( v1-1 == sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1) );
sqlite3_close_v2(db); sqlite3_close_v2(db);
} }

View File

@ -475,12 +475,12 @@ public class SQLTester {
the db's result code. the db's result code.
appendMode specifies how/whether to append results to the result appendMode specifies how/whether to append results to the result
buffer. lineMode specifies whether to output all results in a buffer. rowMode specifies whether to output all results in a
single line or one line per row. If appendMode is single line or one line per row. If appendMode is
ResultBufferMode.NONE then lineMode is ignored and may be null. ResultBufferMode.NONE then rowMode is ignored and may be null.
*/ */
public int execSql(sqlite3 db, boolean throwOnError, public int execSql(sqlite3 db, boolean throwOnError,
ResultBufferMode appendMode, ResultRowMode lineMode, ResultBufferMode appendMode, ResultRowMode rowMode,
String sql) throws SQLTesterException { String sql) throws SQLTesterException {
if( null==db && null==aDb[0] ){ if( null==db && null==aDb[0] ){
// Delay opening of the initial db to enable tests to change its // Delay opening of the initial db to enable tests to change its
@ -562,7 +562,7 @@ public class SQLTester {
throw new SQLTesterException("Unhandled ResultBufferMode: "+appendMode); throw new SQLTesterException("Unhandled ResultBufferMode: "+appendMode);
} }
} }
if( ResultRowMode.NEWLINE == lineMode ){ if( ResultRowMode.NEWLINE == rowMode ){
spacing = 0; spacing = 0;
sb.append('\n'); sb.append('\n');
} }
@ -1128,8 +1128,9 @@ class TestScript {
} }
public String getOutputPrefix(){ public String getOutputPrefix(){
String rc = "["+(moduleName==null ? filename : moduleName)+"]"; String rc = "["+(moduleName==null ? "<unnamed>" : moduleName)+"]";
if( null!=testCaseName ) rc += "["+testCaseName+"]"; if( null!=testCaseName ) rc += "["+testCaseName+"]";
if( null!=filename ) rc += "["+filename+"]";
return rc + " line "+ cur.lineNo; return rc + " line "+ cur.lineNo;
} }
@ -1273,6 +1274,7 @@ class TestScript {
} }
private boolean checkRequiredProperties(SQLTester t, String[] props) throws SQLTesterException{ private boolean checkRequiredProperties(SQLTester t, String[] props) throws SQLTesterException{
if( true ) return false;
int nOk = 0; int nOk = 0;
for(String rp : props){ for(String rp : props){
verbose1("REQUIRED_PROPERTIES: ",rp); verbose1("REQUIRED_PROPERTIES: ",rp);
@ -1293,6 +1295,12 @@ class TestScript {
t.appendDbInitSql("pragma temp_store=0;"); t.appendDbInitSql("pragma temp_store=0;");
++nOk; ++nOk;
break; break;
case "AUTOVACUUM":
t.appendDbInitSql("pragma auto_vacuum=full;");
++nOk;
case "INCRVACUUM":
t.appendDbInitSql("pragma auto_vacuum=incremental;");
++nOk;
default: default:
break; break;
} }
@ -1331,9 +1339,9 @@ class TestScript {
m = patternRequiredProperties.matcher(line); m = patternRequiredProperties.matcher(line);
if( m.find() ){ if( m.find() ){
final String rp = m.group(1); final String rp = m.group(1);
//if( ! checkRequiredProperties( tester, rp.split("\\s+") ) ){ if( ! checkRequiredProperties( tester, rp.split("\\s+") ) ){
throw new IncompatibleDirective(this, "REQUIRED_PROPERTIES: "+rp); throw new IncompatibleDirective(this, "REQUIRED_PROPERTIES: "+rp);
//} }
} }
m = patternMixedModuleName.matcher(line); m = patternMixedModuleName.matcher(line);
if( m.find() ){ if( m.find() ){

View File

@ -6,7 +6,8 @@
** xMODULE_NAME: module-name ** xMODULE_NAME: module-name
** xREQUIRED_PROPERTIES: small fast reliable ** xREQUIRED_PROPERTIES: small fast reliable
** xREQUIRED_PROPERTIES: RECURSIVE_TRIGGERS ** xREQUIRED_PROPERTIES: RECURSIVE_TRIGGERS
** xREQUIRED_PROPERTIES: TEMPSTORE_MEM TEMPSTORE_FILE ** xREQUIRED_PROPERTIES: TEMPSTORE_FILE TEMPSTORE_MEM
** xREQUIRED_PROPERTIES: AUTOVACUUM INCRVACUUM
** **
*/ */
--print starting up 😃 --print starting up 😃

View File

@ -112,12 +112,6 @@ class SQLTesterException extends globalThis.Error {
} }
this.name = 'SQLTesterException'; this.name = 'SQLTesterException';
} }
/**
If this overrideable method returns false (the default) then
exceptions of that type are fatal to a whole test run, instead of
just the test which triggered it. If the the "keep going" flag
is set, this preference is ignored.
*/
isFatal() { return false; } isFatal() { return false; }
} }
@ -169,6 +163,7 @@ const __SAB = ('undefined'===typeof globalThis.SharedArrayBuffer)
? function(){} : globalThis.SharedArrayBuffer; ? function(){} : globalThis.SharedArrayBuffer;
/* Frequently-reused regexes. */
const Rx = newObj({ const Rx = newObj({
requiredProperties: / REQUIRED_PROPERTIES:[ \t]*(\S.*)\s*$/, requiredProperties: / REQUIRED_PROPERTIES:[ \t]*(\S.*)\s*$/,
scriptModuleName: / SCRIPT_MODULE_NAME:[ \t]*(\S+)\s*$/, scriptModuleName: / SCRIPT_MODULE_NAME:[ \t]*(\S+)\s*$/,
@ -176,7 +171,6 @@ const Rx = newObj({
command: /^--(([a-z-]+)( .*)?)$/, command: /^--(([a-z-]+)( .*)?)$/,
//! "Special" characters - we have to escape output if it contains any. //! "Special" characters - we have to escape output if it contains any.
special: /[\x00-\x20\x22\x5c\x7b\x7d]/, special: /[\x00-\x20\x22\x5c\x7b\x7d]/,
//! Either of '{' or '}'.
squiggly: /[{}]/ squiggly: /[{}]/
}); });
@ -189,7 +183,7 @@ const Util = newObj({
argvToString: (list)=>{ argvToString: (list)=>{
const m = [...list]; const m = [...list];
m.shift(); m.shift() /* strip command name */;
return m.join(" ") return m.join(" ")
}, },
@ -257,9 +251,10 @@ class Outer {
} }
} }
static #verboseLabel = ["🔈",/*"🔉",*/"🔊","📢"];
verboseN(lvl, args){ verboseN(lvl, args){
if( this.#verbosity>=lvl ){ if( this.#verbosity>=lvl ){
this.#outlnImpl(lvl,'VERBOSE ',lvl,': ',...args); this.#outlnImpl(lvl, Outer.#verboseLabel[lvl-1],': ',...args);
} }
} }
verbose1(...args){ return this.verboseN(1,args); } verbose1(...args){ return this.verboseN(1,args); }
@ -364,8 +359,24 @@ class SQLTester {
this.#resultBuffer.push(line); this.#resultBuffer.push(line);
if( addNL ) this.#resultBuffer.push('\n'); if( addNL ) this.#resultBuffer.push('\n');
} }
appendDbInitSql(sql){
this.#db.initSql.push(sql);
if( this.currentDb() ){
this.execSql(null, true, ResultBufferMode.NONE, null, sql);
}
}
#clearBuffer(buffer){ #runInitSql(pDb){
let rc = 0;
for(const sql of this.#db.initSql){
this.#outer.verbose2("RUNNING DB INIT CODE: ",sql);
rc = this.execSql(pDb, false, ResultBufferMode.NONE, null, sql);
if( rc ) break;
}
return rc;
}
#clearBuffer(buffer){
buffer.length = 0; buffer.length = 0;
return buffer; return buffer;
} }
@ -390,27 +401,21 @@ class SQLTester {
} }
nullValue(){ nullValue(){
if( 0==arguments.length ){ return (0==arguments.length)
return this.#nullView; ? this.#nullView
}else{ : (this.#nullView = ''+arguments[0]);
this.#nullView = ''+arguments[0];
}
} }
outputColumnNames(){ outputColumnNames(){
if( 0==arguments.length ){ return (0==arguments.length)
return this.#emitColNames; ? this.#emitColNames
}else{ : (this.#emitColNames = !!arguments[0]);
this.#emitColNames = !!arguments[0];
}
} }
currentDbId(){ currentDbId(){
if( 0==arguments.length ){ return (0==arguments.length)
return this.#db.iCurrentDb; ? this.#db.iCurrentDb
}else{ : (this.#affirmDbId(arguments[0]).#db.iCurrentDb = arguments[0]);
this.#affirmDbId(arguments[0]).#db.iCurrentDb = arguments[0];
}
} }
#affirmDbId(id){ #affirmDbId(id){
@ -438,9 +443,9 @@ class SQLTester {
if( 0==arguments.length ){ if( 0==arguments.length ){
id = this.#db.iCurrentDb; id = this.#db.iCurrentDb;
} }
const db = this.#affirmDbId(id).#db.list[id]; const pDb = this.#affirmDbId(id).#db.list[id];
if( db ){ if( pDb ){
sqlite3.capi.sqlite3_close_v2(db); sqlite3.capi.sqlite3_close_v2(pDb);
this.#db.list[id] = null; this.#db.list[id] = null;
} }
} }
@ -474,10 +479,9 @@ class SQLTester {
rc = sqlite3.capi.sqlite3_open_v2(name, ppOut, flags, null); rc = sqlite3.capi.sqlite3_open_v2(name, ppOut, flags, null);
pDb = wasm.peekPtr(ppOut); pDb = wasm.peekPtr(ppOut);
}); });
let sql;
if( 0==rc && this.#db.initSql.length > 0){ if( 0==rc && this.#db.initSql.length > 0){
this.#outer.verbose2("RUNNING DB INIT CODE: ",this.#db.initSql.toString()); rc = this.#runInitSql(pDb);
rc = this.execSql(pDb, false, ResultBufferMode.NONE,
null, this.#db.initSql.join(''));
} }
if( 0!=rc ){ if( 0!=rc ){
sqlite3.SQLite3Error.toss( sqlite3.SQLite3Error.toss(
@ -613,7 +617,7 @@ class SQLTester {
sqlite3.oo1.DB.checkRc(pDb, rc); sqlite3.oo1.DB.checkRc(pDb, rc);
} }
execSql(pDb, throwOnError, appendMode, lineMode, sql){ execSql(pDb, throwOnError, appendMode, rowMode, sql){
if( !pDb && !this.#db.list[0] ){ if( !pDb && !this.#db.list[0] ){
this.#setupInitialDb(); this.#setupInitialDb();
} }
@ -685,7 +689,7 @@ class SQLTester {
} }
}/* column loop */ }/* column loop */
}/* row loop */ }/* row loop */
if( ResultRowMode.NEWLINE === lineMode ){ if( ResultRowMode.NEWLINE === rowMode ){
spacing = 0; spacing = 0;
sb.push('\n'); sb.push('\n');
} }
@ -806,8 +810,9 @@ class TestScript {
} }
getOutputPrefix() { getOutputPrefix() {
let rc = "["+(this.#moduleName || this.#filename)+"]"; let rc = "["+(this.#moduleName || '<unnamed>')+"]";
if( this.#testCaseName ) rc += "["+this.#testCaseName+"]"; if( this.#testCaseName ) rc += "["+this.#testCaseName+"]";
if( this.#filename ) rc += '['+this.#filename+']';
return rc + " line "+ this.#cursor.lineNo; return rc + " line "+ this.#cursor.lineNo;
} }
@ -829,6 +834,42 @@ class TestScript {
return args.length ? this : rc; return args.length ? this : rc;
} }
#checkRequiredProperties(tester, props){
if(true) return false;
let nOk = 0;
for(const rp of props){
this.verbose2("REQUIRED_PROPERTIES: ",rp);
switch(rp){
case "RECURSIVE_TRIGGERS":
tester.appendDbInitSql("pragma recursive_triggers=on;");
++nOk;
break;
case "TEMPSTORE_FILE":
/* This _assumes_ that the lib is built with SQLITE_TEMP_STORE=1 or 2,
which we just happen to know is the case */
tester.appendDbInitSql("pragma temp_store=1;");
++nOk;
break;
case "TEMPSTORE_MEM":
/* This _assumes_ that the lib is built with SQLITE_TEMP_STORE=1 or 2,
which we just happen to know is the case */
tester.appendDbInitSql("pragma temp_store=0;");
++nOk;
break;
case "AUTOVACUUM":
tester.appendDbInitSql("pragma auto_vacuum=full;");
++nOk;
break;
case "INCRVACUUM":
tester.appendDbInitSql("pragma auto_vacuum=incremental;");
++nOk;
default:
break;
}
}
return props.length == nOk;
}
#checkForDirective(tester,line){ #checkForDirective(tester,line){
if(line.startsWith("#")){ if(line.startsWith("#")){
throw new IncompatibleDirective(this, "C-preprocessor input: "+line); throw new IncompatibleDirective(this, "C-preprocessor input: "+line);
@ -843,9 +884,9 @@ class TestScript {
m = Rx.requiredProperties.exec(line); m = Rx.requiredProperties.exec(line);
if( m ){ if( m ){
const rp = m[1]; const rp = m[1];
//if( ! checkRequiredProperties( tester, rp.split("\\s+") ) ){ if( !this.#checkRequiredProperties( tester, rp.split(/\s+/).filter(v=>!!v) ) ){
throw new IncompatibleDirective(this, "REQUIRED_PROPERTIES: "+rp); throw new IncompatibleDirective(this, "REQUIRED_PROPERTIES: "+rp);
//} }
} }
m = Rx.mixedModuleName.exec(line); m = Rx.mixedModuleName.exec(line);

View File

@ -42,7 +42,8 @@ let ts = new ns.TestScript('/foo.test',`
** xMODULE_NAME: module-name ** xMODULE_NAME: module-name
** xREQUIRED_PROPERTIES: small fast reliable ** xREQUIRED_PROPERTIES: small fast reliable
** xREQUIRED_PROPERTIES: RECURSIVE_TRIGGERS ** xREQUIRED_PROPERTIES: RECURSIVE_TRIGGERS
** xREQUIRED_PROPERTIES: TEMPSTORE_MEM TEMPSTORE_FILE ** xREQUIRED_PROPERTIES: TEMPSTORE_FILE TEMPSTORE_MEM
** xREQUIRED_PROPERTIES: AUTOVACUUM INCRVACUUM
** **
*/ */
/* --verbosity 3 */ /* --verbosity 3 */

View File

@ -895,7 +895,7 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
sah.read( header, {at: 0} ); sah.read( header, {at: 0} );
util.affirmDbHeader( header ); util.affirmDbHeader( header );
} }
sah.write(new Uint8Array(2), { sah.write(new Uint8Array([1,1]), {
at: HEADER_OFFSET_DATA + 18 at: HEADER_OFFSET_DATA + 18
}/*force db out of WAL mode*/); }/*force db out of WAL mode*/);
}catch(e){ }catch(e){
@ -927,7 +927,7 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
this.setAssociatedPath(sah, '', 0); this.setAssociatedPath(sah, '', 0);
toss("Expected to write "+n+" bytes but wrote "+nWrote+"."); toss("Expected to write "+n+" bytes but wrote "+nWrote+".");
}else{ }else{
sah.write(new Uint8Array([0,0]), {at: HEADER_OFFSET_DATA+18} sah.write(new Uint8Array([1,1]), {at: HEADER_OFFSET_DATA+18}
/* force db out of WAL mode */); /* force db out of WAL mode */);
this.setAssociatedPath(sah, name, capi.SQLITE_OPEN_MAIN_DB); this.setAssociatedPath(sah, name, capi.SQLITE_OPEN_MAIN_DB);
} }

View File

@ -1197,7 +1197,7 @@ const installOpfsVfs = function callee(options){
sah.read( header, {at: 0} ); sah.read( header, {at: 0} );
util.affirmDbHeader( header ); util.affirmDbHeader( header );
} }
sah.write(new Uint8Array(2), {at: 18}/*force db out of WAL mode*/); sah.write(new Uint8Array([1,1]), {at: 18}/*force db out of WAL mode*/);
return nWrote; return nWrote;
}catch(e){ }catch(e){
await sah.close(); await sah.close();
@ -1255,7 +1255,7 @@ const installOpfsVfs = function callee(options){
if(nWrote != n){ if(nWrote != n){
toss("Expected to write "+n+" bytes but wrote "+nWrote+"."); toss("Expected to write "+n+" bytes but wrote "+nWrote+".");
} }
sah.write(new Uint8Array(2), {at: 18}) /* force db out of WAL mode */; sah.write(new Uint8Array([1,1]), {at: 18}) /* force db out of WAL mode */;
return nWrote; return nWrote;
}catch(e){ }catch(e){
if( sah ){ await sah.close(); sah = undefined; } if( sah ){ await sah.close(); sah = undefined; }

View File

@ -1,5 +1,5 @@
C Make\sthe\sJNI-internal\smetrics\sopt-in\srather\sthan\sopt-out\sso\sclient\sbuilds\swon't\shave\sthem\sby\sdefault.\sUnrelated\sdoc\stweaks. C Correct\sa\sTester1.java\stest\swhich\sinadvertently\screated\sa\sspurious\sdb\sfile\sin\sthe\scurrent\sdir.\sUnrelated\sminor\scleanups.
D 2023-09-01T14:20:39.576 D 2023-09-01T16:28:46.444
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@ -237,7 +237,7 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
F ext/jni/GNUmakefile 3e0e28c1c451eab31dd4fa9d262951ef67ed3ece3270a2efc8ec66ec57068547 F ext/jni/GNUmakefile 3e0e28c1c451eab31dd4fa9d262951ef67ed3ece3270a2efc8ec66ec57068547
F ext/jni/README.md 1332b1fa27918bd5d9ca2d0d4f3ac3a6ab86b9e3699dc5bfe32904a027f3d2a9 F ext/jni/README.md 1332b1fa27918bd5d9ca2d0d4f3ac3a6ab86b9e3699dc5bfe32904a027f3d2a9
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
F ext/jni/src/c/sqlite3-jni.c 0a814e8dbc333ff8a1a8a74aebaece435d2982ed6d4d8e8bf9b7082688b20221 F ext/jni/src/c/sqlite3-jni.c 00469db3f64a7f53bc1ecb60749260b937f8892ddc56d4c61d5f427f6e6758a7
F ext/jni/src/c/sqlite3-jni.h c22f0189254abe26fad3ba132b484785b19a1aa96d34d30d7d8c5ffe6a9b25d1 F ext/jni/src/c/sqlite3-jni.h c22f0189254abe26fad3ba132b484785b19a1aa96d34d30d7d8c5ffe6a9b25d1
F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436 F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4 F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
@ -265,7 +265,7 @@ F ext/jni/src/org/sqlite/jni/SQLFunction.java 544a875d33fd160467d82e2397ac33157b
F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 98f8d62492e2d6693336dd42c12267ea7f21eefe219aa85b8dd399bd6b0732bd F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 98f8d62492e2d6693336dd42c12267ea7f21eefe219aa85b8dd399bd6b0732bd
F ext/jni/src/org/sqlite/jni/ScalarFunction.java 6d387bb499fbe3bc13c53315335233dbf6a0c711e8fa7c521683219b041c614c F ext/jni/src/org/sqlite/jni/ScalarFunction.java 6d387bb499fbe3bc13c53315335233dbf6a0c711e8fa7c521683219b041c614c
F ext/jni/src/org/sqlite/jni/TableColumnMetadata.java 54511b4297fa28dcb3f49b24035e34ced10e3fd44fd0e458e784f4d6b0096dab F ext/jni/src/org/sqlite/jni/TableColumnMetadata.java 54511b4297fa28dcb3f49b24035e34ced10e3fd44fd0e458e784f4d6b0096dab
F ext/jni/src/org/sqlite/jni/Tester1.java d4ab6f3f83cbb96e763dd4feb6e5527864d9957eb5e79259bfbe57dcf6d0103e F ext/jni/src/org/sqlite/jni/Tester1.java 2a6ef03fca523280731a88f697cdc8ece9548cd4cbe7e1cc90823e5bb5998e27
F ext/jni/src/org/sqlite/jni/TesterFts5.java 02b59ea7d75666fd565d90bb8dc7b0c09441bb9d1af091fad9f6d7377297a474 F ext/jni/src/org/sqlite/jni/TesterFts5.java 02b59ea7d75666fd565d90bb8dc7b0c09441bb9d1af091fad9f6d7377297a474
F ext/jni/src/org/sqlite/jni/TraceV2Callback.java beb0b064c1a5f8bfe585a324ed39a4e33edbe379a3fc60f1401661620d3ca7c0 F ext/jni/src/org/sqlite/jni/TraceV2Callback.java beb0b064c1a5f8bfe585a324ed39a4e33edbe379a3fc60f1401661620d3ca7c0
F ext/jni/src/org/sqlite/jni/UpdateHookCallback.java 8376f4a931f2d5612b295c003c9515ba933ee76d8f95610e89c339727376e36c F ext/jni/src/org/sqlite/jni/UpdateHookCallback.java 8376f4a931f2d5612b295c003c9515ba933ee76d8f95610e89c339727376e36c
@ -284,9 +284,9 @@ F ext/jni/src/org/sqlite/jni/sqlite3.java 62b1b81935ccf3393472d17cb883dc5ff39c38
F ext/jni/src/org/sqlite/jni/sqlite3_context.java 66ca95ce904044263a4aff684abe262d56f73e6b06bca6cf650761d79d7779ad F ext/jni/src/org/sqlite/jni/sqlite3_context.java 66ca95ce904044263a4aff684abe262d56f73e6b06bca6cf650761d79d7779ad
F ext/jni/src/org/sqlite/jni/sqlite3_stmt.java 78e6d1b95ac600a9475e9db4623f69449322b0c93d1bd4e1616e76ed547ed9fc F ext/jni/src/org/sqlite/jni/sqlite3_stmt.java 78e6d1b95ac600a9475e9db4623f69449322b0c93d1bd4e1616e76ed547ed9fc
F ext/jni/src/org/sqlite/jni/sqlite3_value.java 3d1d4903e267bc0bc81d57d21f5e85978eff389a1a6ed46726dbe75f85e6914a F ext/jni/src/org/sqlite/jni/sqlite3_value.java 3d1d4903e267bc0bc81d57d21f5e85978eff389a1a6ed46726dbe75f85e6914a
F ext/jni/src/org/sqlite/jni/tester/SQLTester.java e5a1a4b55ed940e61558be1292aa66563219f360c7c1f9d40d770307e6da3c07 F ext/jni/src/org/sqlite/jni/tester/SQLTester.java a6863d0284c8ec8ca5abd3d40e1fb297e7ae57fb97282ba335cd896a770e3918
F ext/jni/src/org/sqlite/jni/tester/test-script-interpreter.md f9f25126127045d051e918fe59004a1485311c50a13edbf18c79a6ff9160030e F ext/jni/src/org/sqlite/jni/tester/test-script-interpreter.md f9f25126127045d051e918fe59004a1485311c50a13edbf18c79a6ff9160030e
F ext/jni/src/tests/000-000-sanity.test cfe6dc1b950751d6096e3f5695becaadcdaa048bfe9567209d6eb676e693366d F ext/jni/src/tests/000-000-sanity.test c3427a0e0ac84d7cbe4c95fdc1cd4b61f9ddcf43443408f3000139478c4dc745
F ext/jni/src/tests/000-001-ignored.test e17e874c6ab3c437f1293d88093cf06286083b65bf162317f91bbfd92f961b70 F ext/jni/src/tests/000-001-ignored.test e17e874c6ab3c437f1293d88093cf06286083b65bf162317f91bbfd92f961b70
F ext/jni/src/tests/900-001-fts.test bf0ce17a8d082773450e91f2388f5bbb2dfa316d0b676c313c637a91198090f0 F ext/jni/src/tests/900-001-fts.test bf0ce17a8d082773450e91f2388f5bbb2dfa316d0b676c313c637a91198090f0
F ext/lsm1/Makefile a553b728bba6c11201b795188c5708915cc4290f02b7df6ba7e8c4c943fd5cd9 F ext/lsm1/Makefile a553b728bba6c11201b795188c5708915cc4290f02b7df6ba7e8c4c943fd5cd9
@ -550,8 +550,8 @@ F ext/wasm/GNUmakefile 0e362f3fc04eab6628cbe4f1e35f4ab4a200881f6b5f753b27fb45eab
F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576
F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193 F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193
F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff
F ext/wasm/SQLTester/SQLTester.mjs 20309ff838209601711087932b008734bab00176e6a47e41d95e11f6d363bae0 F ext/wasm/SQLTester/SQLTester.mjs ec2f6ba63a0f2f0562941a0fb8e46b7dc55589711513f1952349785966edfe50
F ext/wasm/SQLTester/SQLTester.run.mjs addeb962f33fb6bca723ab12f0b018303ff962dfc57ee969d051fcbf4f191569 F ext/wasm/SQLTester/SQLTester.run.mjs c72b7fe2072d05992f7a3d8c6a1d34e95712513ceabe40849784e24e41c84638
F ext/wasm/SQLTester/index.html 3a12895015c165281307eb47786ce3c46b3c3f06383ad6a9fe3a8526105632f1 F ext/wasm/SQLTester/index.html 3a12895015c165281307eb47786ce3c46b3c3f06383ad6a9fe3a8526105632f1
F ext/wasm/SQLTester/touint8array.c 2d5ece04ec1393a6a60c4bf96385bda5e1a10ad49f3038b96460fc5e5aa7e536 F ext/wasm/SQLTester/touint8array.c 2d5ece04ec1393a6a60c4bf96385bda5e1a10ad49f3038b96460fc5e5aa7e536
F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api d6a5078f48a5301ed17b9a30331075d9b2506e1360c1f0dee0c7816c10acd9ab F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api d6a5078f48a5301ed17b9a30331075d9b2506e1360c1f0dee0c7816c10acd9ab
@ -571,8 +571,8 @@ F ext/wasm/api/sqlite3-api-worker1.js 9f32af64df1a031071912eea7a201557fe39b17386
F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89 F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89
F ext/wasm/api/sqlite3-opfs-async-proxy.js 8cf8a897726f14071fae6be6648125162b256dfb4f96555b865dbb7a6b65e379 F ext/wasm/api/sqlite3-opfs-async-proxy.js 8cf8a897726f14071fae6be6648125162b256dfb4f96555b865dbb7a6b65e379
F ext/wasm/api/sqlite3-v-helper.js 7daa0eab0a513a25b05e9abae7b5beaaa39209b3ed12f86aeae9ef8d2719ed25 F ext/wasm/api/sqlite3-v-helper.js 7daa0eab0a513a25b05e9abae7b5beaaa39209b3ed12f86aeae9ef8d2719ed25
F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js 561463ac5380e4ccf1839a1922e6d7a5585660f32e3b9701a270b78cd35566cf F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js 327a8c363a8c84c61770dc3c46cc83d7cc0eb6b59a3b29728bddf087651d3b77
F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js d9e62d42b86f7bb3143eb071628b24e2ba7dcc749e41a0e9d3e2451bfea1a6b6 F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 46c4afa6c50d7369252c104f274ad977a97e91ccfafc38b400fe36e90bdda88e
F ext/wasm/api/sqlite3-wasm.c 65d60439671e24d50d9119ca805ac1c68fb36129e164377eb46f8d037bd88b07 F ext/wasm/api/sqlite3-wasm.c 65d60439671e24d50d9119ca805ac1c68fb36129e164377eb46f8d037bd88b07
F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js bc06df0d599e625bde6a10a394e326dc68da9ff07fa5404354580f81566e591f F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js bc06df0d599e625bde6a10a394e326dc68da9ff07fa5404354580f81566e591f
F ext/wasm/api/sqlite3-worker1.c-pp.js da509469755035e919c015deea41b4514b5e84c12a1332e6cc8d42cb2cc1fb75 F ext/wasm/api/sqlite3-worker1.c-pp.js da509469755035e919c015deea41b4514b5e84c12a1332e6cc8d42cb2cc1fb75
@ -659,14 +659,14 @@ F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
F src/expr.c 1affe0cc049683ef0ef3545d9b6901508556b0ef7e2892a344c3df6d7288d79d F src/expr.c 1affe0cc049683ef0ef3545d9b6901508556b0ef7e2892a344c3df6d7288d79d
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36 F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c c96c7f55b97493ce278937e6ab6578a866b7e5d6dd486d58b220e9d17e88a750 F src/func.c 154f08966f8a3a7cad6c438205df1abf58fb2826961a0683e82e120fa647e84c
F src/global.c 29f56a330ed9d1b5cd9b79ac0ca36f97ac3afc730ff8bfa987b0db9e559d684d F src/global.c 29f56a330ed9d1b5cd9b79ac0ca36f97ac3afc730ff8bfa987b0db9e559d684d
F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220 F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220
F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51
F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276 F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276
F src/json.c ae840f87b418f039f5d336b488933d09396bd31e6b31e855b93055ccaee4e255 F src/json.c 51141f1c09ccb177057e5813e6302a5e32e5ba88cc4a756318a35081010fc6df
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
F src/loadext.c 98cfba10989b3da6f1807ad42444017742db7f100a54f1032af7a8b1295912c0 F src/loadext.c 98cfba10989b3da6f1807ad42444017742db7f100a54f1032af7a8b1295912c0
F src/main.c 2adfb1973ee495977f8c75d6590aae9882161d5f8749b46621299656a2df0cc6 F src/main.c 2adfb1973ee495977f8c75d6590aae9882161d5f8749b46621299656a2df0cc6
@ -706,7 +706,7 @@ F src/printf.c e3ba080e2f409f9bfcc8d34724e6fc160e9c718dc92d0548f6b71b8b6f860ce2
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c 37953a5f36c60bea413c3c04efcd433b6177009f508ef2ace0494728912fe2e9 F src/resolve.c 37953a5f36c60bea413c3c04efcd433b6177009f508ef2ace0494728912fe2e9
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
F src/select.c 5f545a2c8702d4d3430bbb188cfec47d6c122d899061ef00cbe56af14591c574 F src/select.c e9fb48546ab1882639a3a960383f6342dddb776c0227615f8e19de51f0102f68
F src/shell.c.in 2f9be25294b68b07e7e81f0adcec4475aba6011b64f160e414efe226910c4d7b F src/shell.c.in 2f9be25294b68b07e7e81f0adcec4475aba6011b64f160e414efe226910c4d7b
F src/sqlite.h.in 7dbea32976fb18740214edc314253c902e127dac7645a705e566644ed4aa5ef5 F src/sqlite.h.in 7dbea32976fb18740214edc314253c902e127dac7645a705e566644ed4aa5ef5
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@ -1179,7 +1179,7 @@ F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f75
F test/fts4unicode.test 82a9c16b68ba2f358a856226bb2ee02f81583797bc4744061c54401bf1a0f4c9 F test/fts4unicode.test 82a9c16b68ba2f358a856226bb2ee02f81583797bc4744061c54401bf1a0f4c9
F test/fts4upfrom.test f25835162c989dffd5e2ef91ec24c4848cc9973093e2d492d1c7b32afac1b49d F test/fts4upfrom.test f25835162c989dffd5e2ef91ec24c4848cc9973093e2d492d1c7b32afac1b49d
F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d
F test/func.test 719076723b13a6bfcff7b00b7987b1d7b06876ceb71e868b3d13d571d9b42cae F test/func.test cbcf086273529d4a99b7199086da637a99039d2cad81dd7d7c4c9e25258ae164
F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f
F test/func3.test 600a632c305a88f3946d38f9a51efe145c989b2e13bd2b2a488db47fe76bab6a F test/func3.test 600a632c305a88f3946d38f9a51efe145c989b2e13bd2b2a488db47fe76bab6a
F test/func4.test 2285fb5792d593fef442358763f0fd9de806eda47dbc7a5934df57ffdc484c31 F test/func4.test 2285fb5792d593fef442358763f0fd9de806eda47dbc7a5934df57ffdc484c31
@ -1298,7 +1298,7 @@ F test/json/json-generator.tcl dc0dd0f393800c98658fc4c47eaa6af29d4e17527380cd286
F test/json/json-q1.txt 65f9d1cdcc4cffa9823fb73ed936aae5658700cd001fde448f68bfb91c807307 F test/json/json-q1.txt 65f9d1cdcc4cffa9823fb73ed936aae5658700cd001fde448f68bfb91c807307
F test/json/json-speed-check.sh 8b7babf530faa58bd59d6d362cec8e9036a68c5457ff46f3b1f1511d21af6737 x F test/json/json-speed-check.sh 8b7babf530faa58bd59d6d362cec8e9036a68c5457ff46f3b1f1511d21af6737 x
F test/json101.test dc9d5a2a5b1fd1b54dbd71c538b17933cc98d84b4c1f821ead754933663dca55 F test/json101.test dc9d5a2a5b1fd1b54dbd71c538b17933cc98d84b4c1f821ead754933663dca55
F test/json102.test 24f6f204f9cde45b971016691d0b92a9b4c58040d699e36d6b12cb165f9083ff F test/json102.test 4c69694773a470f1fda34e5f4ba24920b35184fb66050b450fc2ef9ab5ad310b
F test/json103.test 53df87f83a4e5fa0c0a56eb29ff6c94055c6eb919f33316d62161a8880112dbe F test/json103.test 53df87f83a4e5fa0c0a56eb29ff6c94055c6eb919f33316d62161a8880112dbe
F test/json104.test 1b844a70cddcfa2e4cd81a5db0657b2e61e7f00868310f24f56a9ba0114348c1 F test/json104.test 1b844a70cddcfa2e4cd81a5db0657b2e61e7f00868310f24f56a9ba0114348c1
F test/json105.test 11670a4387f4308ae0318cadcbd6a918ea7edcd19fbafde020720a073952675d F test/json105.test 11670a4387f4308ae0318cadcbd6a918ea7edcd19fbafde020720a073952675d
@ -1525,7 +1525,7 @@ F test/selectD.test 6d1909b49970bf92f45ce657505befcef5fc7cbc13544e18103a316d3218
F test/selectE.test a8730ca330fcf40ace158f134f4fe0eb00c7edbf F test/selectE.test a8730ca330fcf40ace158f134f4fe0eb00c7edbf
F test/selectF.test 21c94e6438f76537b72532fa9fd4710cdd455fc3 F test/selectF.test 21c94e6438f76537b72532fa9fd4710cdd455fc3
F test/selectG.test 089f7d3d7e6db91566f00b036cb353107a2cca6220eb1cb264085a836dae8840 F test/selectG.test 089f7d3d7e6db91566f00b036cb353107a2cca6220eb1cb264085a836dae8840
F test/selectH.test 88237ded5925adfb3f27fdafb5428c2ffc4d61e313bceb854e225ffc3ef0d206 F test/selectH.test 0b54599f1917d99568c9b929df22ec6261ed7b6d2f02a46b5945ef81b7871aac
F test/session.test 78fa2365e93d3663a6e933f86e7afc395adf18be F test/session.test 78fa2365e93d3663a6e933f86e7afc395adf18be
F test/sessionfuzz-data1.db 1f8d5def831f19b1c74571037f0d53a588ea49a6c4ca2a028fc0c27ef896dbcb F test/sessionfuzz-data1.db 1f8d5def831f19b1c74571037f0d53a588ea49a6c4ca2a028fc0c27ef896dbcb
F test/sessionfuzz.c 5eef09af01eeff6f20250ae4c0112c2e576e4d2f2026cc9a49dc5be6886fa6ee F test/sessionfuzz.c 5eef09af01eeff6f20250ae4c0112c2e576e4d2f2026cc9a49dc5be6886fa6ee
@ -2116,8 +2116,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P eb24f97253d9c8e7c728c2ac67a0824b10ca67362ac4f8abb94d5d3c54c58c5b P aa72d25a22c80a7a376127266b8923f0661147c8bc483baa327230364851a255
R b5c8106325c21efbc360de8a5178bfb9 R 42c737a27d848aaab44302c5d742eacf
U stephan U stephan
Z a20aea990735784858db150336da744c Z 76973b081c5a9e008b03ef52a45413be
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
aa72d25a22c80a7a376127266b8923f0661147c8bc483baa327230364851a255 016bbdadbf9f95cef185d2606c23e3b3c724586fcca470e11e6fbdbaefd75c79

View File

@ -1907,7 +1907,8 @@ static void avgFinalize(sqlite3_context *context){
if( p && p->cnt>0 ){ if( p && p->cnt>0 ){
double r; double r;
if( p->approx ){ if( p->approx ){
r = p->rSum+p->rErr; r = p->rSum;
if( !sqlite3IsNaN(p->rErr) ) r += p->rErr;
}else{ }else{
r = (double)(p->iSum); r = (double)(p->iSum);
} }
@ -1920,7 +1921,8 @@ static void totalFinalize(sqlite3_context *context){
p = sqlite3_aggregate_context(context, 0); p = sqlite3_aggregate_context(context, 0);
if( p ){ if( p ){
if( p->approx ){ if( p->approx ){
r = p->rSum+p->rErr; r = p->rSum;
if( !sqlite3IsNaN(p->rErr) ) r += p->rErr;
}else{ }else{
r = (double)(p->iSum); r = (double)(p->iSum);
} }

View File

@ -2484,7 +2484,9 @@ static void jsonArrayLengthFunc(
} }
if( pNode->eType==JSON_ARRAY ){ if( pNode->eType==JSON_ARRAY ){
while( 1 /*exit-by-break*/ ){ while( 1 /*exit-by-break*/ ){
for(i=1; i<=pNode->n; n++){ i = 1;
while( i<=pNode->n ){
if( (pNode[i].jnFlags & JNODE_REMOVE)==0 ) n++;
i += jsonNodeSize(&pNode[i]); i += jsonNodeSize(&pNode[i]);
} }
if( (pNode->jnFlags & JNODE_APPEND)==0 ) break; if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;

View File

@ -5301,12 +5301,12 @@ static int disableUnusedSubqueryResultColumns(SrcItem *pItem){
assert( pItem->pSelect!=0 ); assert( pItem->pSelect!=0 );
pSub = pItem->pSelect; pSub = pItem->pSelect;
assert( pSub->pEList->nExpr==pTab->nCol ); assert( pSub->pEList->nExpr==pTab->nCol );
if( (pSub->selFlags & (SF_Distinct|SF_Aggregate))!=0 ){
testcase( pSub->selFlags & SF_Distinct );
testcase( pSub->selFlags & SF_Aggregate );
return 0;
}
for(pX=pSub; pX; pX=pX->pPrior){ for(pX=pSub; pX; pX=pX->pPrior){
if( (pX->selFlags & (SF_Distinct|SF_Aggregate))!=0 ){
testcase( pX->selFlags & SF_Distinct );
testcase( pX->selFlags & SF_Aggregate );
return 0;
}
if( pX->pPrior && pX->op!=TK_ALL ){ if( pX->pPrior && pX->op!=TK_ALL ){
/* This optimization does not work for compound subqueries that /* This optimization does not work for compound subqueries that
** use UNION, INTERSECT, or EXCEPT. Only UNION ALL is allowed. */ ** use UNION, INTERSECT, or EXCEPT. Only UNION ALL is allowed. */

View File

@ -1549,8 +1549,8 @@ do_catchsql_test func-37.120 {
# Incorrect handling of infinity by SUM(). # Incorrect handling of infinity by SUM().
# #
do_execsql_test func-38.100 { do_execsql_test func-38.100 {
WITH t1(x) AS (VALUES(9e+999)) SELECT sum(x) FROM t1; WITH t1(x) AS (VALUES(9e+999)) SELECT sum(x), avg(x), total(x) FROM t1;
WITH t1(x) AS (VALUES(-9e+999)) SELECT sum(x) FROM t1; WITH t1(x) AS (VALUES(-9e+999)) SELECT sum(x), avg(x), total(x) FROM t1;
} {Inf -Inf} } {Inf Inf Inf -Inf -Inf -Inf}
finish_test finish_test

View File

@ -48,6 +48,9 @@ do_execsql_test json102-180 {
do_execsql_test json102-190 { do_execsql_test json102-190 {
SELECT json_array_length('[1,2,3,4]'); SELECT json_array_length('[1,2,3,4]');
} {{4}} } {{4}}
do_execsql_test json102-191 {
SELECT json_array_length( json_remove('[1,2,3,4]','$[2]') );
} {{3}}
do_execsql_test json102-200 { do_execsql_test json102-200 {
SELECT json_array_length('[1,2,3,4]', '$'); SELECT json_array_length('[1,2,3,4]', '$');
} {{4}} } {{4}}

View File

@ -113,6 +113,33 @@ do_execsql_test 4.1 {
CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT);
SELECT 1 FROM (SELECT DISTINCT name COLLATE rtrim FROM sqlite_schema SELECT 1 FROM (SELECT DISTINCT name COLLATE rtrim FROM sqlite_schema
UNION ALL SELECT a FROM t1); UNION ALL SELECT a FROM t1);
} 1 } {1 1}
do_execsql_test 4.2 {
SELECT DISTINCT name COLLATE rtrim FROM sqlite_schema
UNION ALL
SELECT a FROM t1
} {v1 t1}
#-------------------------------------------------------------------------
# forum post https://sqlite.org/forum/forumpost/b83c7b2168
#
reset_db
do_execsql_test 5.0 {
CREATE TABLE t1 (val1);
INSERT INTO t1 VALUES(4);
INSERT INTO t1 VALUES(5);
CREATE TABLE t2 (val2);
}
do_execsql_test 5.1 {
SELECT DISTINCT val1 FROM t1 UNION ALL SELECT val2 FROM t2;
} {
4 5
}
do_execsql_test 5.2 {
SELECT count(1234) FROM (
SELECT DISTINCT val1 FROM t1 UNION ALL SELECT val2 FROM t2
)
} {2}
finish_test finish_test