]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Update this branch with latest changes from trunk.
authordan <Dan Kennedy>
Tue, 2 May 2023 21:10:14 +0000 (21:10 +0000)
committerdan <Dan Kennedy>
Tue, 2 May 2023 21:10:14 +0000 (21:10 +0000)
FossilOrigin-Name: 6f22c7679f235ffe22cd59bb780396b2285b352e3a1abc2c3fa7092bf54c69b6

24 files changed:
1  2 
Makefile.in
ext/session/changebatch1.test
ext/session/sessionH.test
ext/session/sqlite3session.c
ext/session/sqlite3session.h
ext/session/test_session.c
manifest
manifest.uuid
src/btree.c
src/btreeInt.h
src/build.c
src/func.c
src/main.c
src/os_unix.c
src/pager.c
src/parse.y
src/select.c
src/sqlite.h.in
src/sqliteInt.h
src/test1.c
src/update.c
src/vdbe.c
src/vdbeaux.c
src/wal.c

diff --cc Makefile.in
Simple merge
index 2fbe368947444d5ffbc1d7c6c11a083e2203b189,0000000000000000000000000000000000000000..16053d26d2057218beeea21d8420b8856e5128b1
mode 100644,000000..100644
--- /dev/null
@@@ -1,222 -1,0 +1,222 @@@
- } {SQLITE_CONSTRAINT}
 +# 2016 August 23
 +#
 +# The author disclaims copyright to this source code.  In place of
 +# a legal notice, here is a blessing:
 +#
 +#    May you do good and not evil.
 +#    May you find forgiveness for yourself and forgive others.
 +#    May you share freely, never taking more than you give.
 +#
 +#***********************************************************************
 +# This file implements regression tests for SQLite library.
 +#
 +
 +if {![info exists testdir]} {
 +  set testdir [file join [file dirname [info script]] .. .. test]
 +} 
 +source $testdir/tester.tcl
 +ifcapable !session {finish_test; return}
 +
 +set testprefix changebatch1
 +
 +
 +proc sql_to_changeset {method sql} {
 +  sqlite3session S db main
 +  S attach *
 +  execsql $sql
 +  set ret [S $method]
 +  S delete
 +  return $ret
 +}
 +
 +proc do_changebatch_test {tn method args} {
 +  set C [list]
 +  foreach a $args {
 +    lappend C [sql_to_changeset $method $a]
 +  }
 +
 +  sqlite3changebatch cb db
 +  set i 1
 +  foreach ::cs [lrange $C 0 end-1] {
 +    set rc [cb add $::cs]
 +    if {$rc!="SQLITE_OK"} { error "expected SQLITE_OK, got $rc (i=$i)" }
 +    incr i
 +  }
 +
 +  set ::cs [lindex $C end]
 +  do_test $tn { cb add [set ::cs] } SQLITE_CONSTRAINT
 +  cb delete
 +}
 +
 +proc do_changebatch_test1 {tn args} {
 +  uplevel do_changebatch_test $tn changeset $args
 +}
 +proc do_changebatch_test2 {tn args} {
 +  uplevel do_changebatch_test $tn fullchangeset $args
 +}
 +
 +#-------------------------------------------------------------------------
 +# The body of the following loop contains tests for database schemas
 +# that do not feature multi-column UNIQUE constraints. In this case
 +# it doesn't matter if the changesets are generated using
 +# sqlite3session_changeset() or sqlite3session_fullchangeset().
 +#
 +foreach {tn testfunction} {
 +  1 do_changebatch_test1
 +  2 do_changebatch_test2
 +} {
 +  reset_db
 +
 +  #-------------------------------------------------------------------------
 +  #
 +  do_execsql_test $tn.1.0 {
 +    CREATE TABLE t1(a PRIMARY KEY, b);
 +  }
 +  
 +  $testfunction $tn.1.1 {
 +    INSERT INTO t1 VALUES(1, 1);
 +  } {
 +    DELETE FROM t1 WHERE a=1;
 +  }
 +  
 +  do_execsql_test $tn.1.2.0 {
 +    INSERT INTO t1 VALUES(1, 1);
 +    INSERT INTO t1 VALUES(2, 2);
 +    INSERT INTO t1 VALUES(3, 3);
 +  }
 +  $testfunction $tn.1.2.1 {
 +    DELETE FROM t1 WHERE a=2;
 +  } {
 +    INSERT INTO t1 VALUES(2, 2);
 +  }
 +  
 +  #-------------------------------------------------------------------------
 +  #
 +  do_execsql_test $tn.2.0 {
 +    CREATE TABLE x1(a, b PRIMARY KEY, c UNIQUE);
 +    CREATE TABLE x2(a PRIMARY KEY, b UNIQUE, c UNIQUE);
 +    CREATE INDEX x1a ON x1(a);
 +  
 +    INSERT INTO x1 VALUES(1, 1, 'a');
 +    INSERT INTO x1 VALUES(1, 2, 'b');
 +    INSERT INTO x1 VALUES(1, 3, 'c');
 +  }
 +  
 +  $testfunction $tn.2.1 {
 +    DELETE FROM x1 WHERE b=2;
 +  } {
 +    UPDATE x1 SET c='b' WHERE b=3;
 +  }
 +  
 +  $testfunction $tn.2.2 {
 +    DELETE FROM x1 WHERE b=1;
 +  } {
 +    INSERT INTO x1 VALUES(1, 5, 'a');
 +  }
 +
 +  set L [list]
 +  for {set i 1000} {$i < 10000} {incr i} {
 +    lappend L "INSERT INTO x2 VALUES($i, $i, 'x' || $i)"
 +  }
 +  lappend L "DELETE FROM x2 WHERE b=1005"
 +  $testfunction $tn.2.3 {*}$L
 +
 +  execsql { INSERT INTO x1 VALUES('f', 'f', 'f') }
 +  $testfunction $tn.2.4 {
 +    INSERT INTO x2 VALUES('f', 'f', 'f');
 +  } {
 +    INSERT INTO x1 VALUES('g', 'g', 'g');
 +  } {
 +    DELETE FROM x1 WHERE b='f';
 +  } {
 +    INSERT INTO x2 VALUES('g', 'g', 'g');
 +  } {
 +    INSERT INTO x1 VALUES('f', 'f', 'f');
 +  }
 +
 +  execsql {
 +    DELETE FROM x1;
 +    INSERT INTO x1 VALUES(1.5, 1.5, 1.5);
 +  }
 +  $testfunction $tn.2.5 {
 +    DELETE FROM x1 WHERE b BETWEEN 1 AND 2;
 +  } {
 +    INSERT INTO x1 VALUES(2.5, 2.5, 2.5);
 +  } {
 +    INSERT INTO x1 VALUES(1.5, 1.5, 1.5);
 +  }
 +
 +  execsql {
 +    DELETE FROM x2;
 +    INSERT INTO x2 VALUES(X'abcd', X'1234', X'7890');
 +    INSERT INTO x2 VALUES(X'0000', X'0000', X'0000');
 +  }
 +  breakpoint
 +  $testfunction $tn.2.6 {
 +    UPDATE x2 SET c = X'1234' WHERE a=X'abcd';
 +    INSERT INTO x2 VALUES(X'1234', X'abcd', X'7890');
 +  } {
 +    DELETE FROM x2 WHERE b=X'0000';
 +  } {
 +    INSERT INTO x2 VALUES(1, X'0000', NULL);
 +  }
 +}
 +
 +#-------------------------------------------------------------------------
 +# Test some multi-column UNIQUE constraints. First Using _changeset() to
 +# demonstrate the problem, then using _fullchangeset() to show that it has
 +# been fixed.
 +#
 +reset_db
 +do_execsql_test 3.0 {
 +  CREATE TABLE y1(a PRIMARY KEY, b, c, UNIQUE(b, c));
 +  INSERT INTO y1 VALUES(1, 1, 1);
 +  INSERT INTO y1 VALUES(2, 2, 2);
 +  INSERT INTO y1 VALUES(3, 3, 3);
 +  INSERT INTO y1 VALUES(4, 3, 4);
 +  BEGIN;
 +}
 +
 +do_test 3.1.1 {
 +  set c1 [sql_to_changeset changeset { DELETE FROM y1 WHERE a=4    }]
 +  set c2 [sql_to_changeset changeset { UPDATE y1 SET c=4 WHERE a=3 }]
 +  sqlite3changebatch cb db
 +  cb add $c1
 +  cb add $c2
 +} {SQLITE_OK}
 +do_test 3.1.2 {
 +  cb delete
 +  execsql ROLLBACK
 +} {}
 +
 +do_test 3.1.1 {
 +  set c1 [sql_to_changeset fullchangeset { DELETE FROM y1 WHERE a=4    }]
 +  set c2 [sql_to_changeset fullchangeset { UPDATE y1 SET c=4 WHERE a=3 }]
 +  sqlite3changebatch cb db
 +  cb add $c1
 +  cb add $c2
++} {SQLITE_OK}
 +do_test 3.1.2 {
 +  cb delete
 +} {}
 +
 +#-------------------------------------------------------------------------
 +#
 +reset_db
 +do_execsql_test 4.0 {
 +  CREATE TABLE t1(x, y, z, PRIMARY KEY(x, y), UNIQUE(z));
 +}
 +
 +do_test 4.1 {
 +  set c1 [sql_to_changeset fullchangeset { INSERT INTO t1 VALUES(1, 2, 3) }]
 +  execsql {
 +    DROP TABLE t1;
 +    CREATE TABLE t1(w, x, y, z, PRIMARY KEY(x, y), UNIQUE(z));
 +  }
 +  sqlite3changebatch cb db
 +  list [catch { cb add $c1 } msg] $msg
 +} {1 SQLITE_RANGE}
 +
 +
 +
 +finish_test
Simple merge
index 4e0ad827eb220bf6aacdc7099dd03a13b0e274ac,67940884949c060542d4cca72f116ad2870c53e1..1f366a6188370f82666fbf6d280dcc8657a9d3a4
@@@ -25,13 -25,8 +25,15 @@@ typedef struct SessionInput SessionInpu
  # endif
  #endif
  
+ #define SESSIONS_ROWID "_rowid_"
 +/*
 +** The three different types of changesets generated.
 +*/
 +#define SESSIONS_PATCHSET      0
 +#define SESSIONS_CHANGESET     1
 +#define SESSIONS_FULLCHANGESET 2
 +
  static int sessions_strm_chunk_size = SESSIONS_STRM_CHUNK_SIZE;
  
  typedef struct SessionHook SessionHook;
@@@ -2304,10 -2405,10 +2412,10 @@@ static int sessionAppendUpdate
      /* If at least one field has been modified, this is not a no-op. */
      if( bChanged ) bNoop = 0;
  
-     /* Add a field to the old.* record. This is omitted if this modules is
+     /* Add a field to the old.* record. This is omitted if this module is
      ** currently generating a patchset. */
 -    if( bPatchset==0 ){
 -      if( bChanged || abPK[i] ){
 +    if( ePatchset!=SESSIONS_PATCHSET ){
 +      if( ePatchset==SESSIONS_FULLCHANGESET || bChanged || abPK[i] ){
          sessionAppendBlob(pBuf, pCsr, nAdvance, &rc);
        }else{
          sessionAppendByte(pBuf, 0, &rc);
Simple merge
index f8706fb1c33235f42be775de5cf5f393b19a257e,0836238b5d320f62a5d21e0905a2b5ceb57b6f37..754fe9cfe172777a53ee2a9d9a43d86b685ffd48
@@@ -248,20 -249,20 +250,20 @@@ static int SQLITE_TCLAPI test_session_c
      const char *zSub;
      int nArg;
      const char *zMsg;
 -    int iSub;
    } aSub[] = {
 -    { "attach",       1, "TABLE",      }, /* 0 */
 -    { "changeset",    0, "",           }, /* 1 */
 -    { "delete",       0, "",           }, /* 2 */
 -    { "enable",       1, "BOOL",       }, /* 3 */
 -    { "indirect",     1, "BOOL",       }, /* 4 */
 -    { "isempty",      0, "",           }, /* 5 */
 -    { "table_filter", 1, "SCRIPT",     }, /* 6 */
 +    { "attach",       1, "TABLE"       }, /* 0 */
 +    { "changeset",    0, ""            }, /* 1 */
 +    { "delete",       0, ""            }, /* 2 */
 +    { "enable",       1, "BOOL"        }, /* 3 */
 +    { "indirect",     1, "BOOL"        }, /* 4 */
 +    { "isempty",      0, ""            }, /* 5 */
 +    { "table_filter", 1, "SCRIPT"      }, /* 6 */
      { "patchset",     0, "",           }, /* 7 */
 -    { "diff",         2, "FROMDB TBL", }, /* 8 */
 -    { "memory_used",  0, "",           }, /* 9 */
 -    { "changeset_size", 0, "",         }, /* 10 */
 -    { "object_config", 2, "OPTION INTEGER", }, /* 11 */
 +    { "diff",         2, "FROMDB TBL"  }, /* 8 */
 +    { "fullchangeset",0, ""            }, /* 9 */
 +    { "memory_used",  0, "",           }, /* 10 */
 +    { "changeset_size", 0, "",         }, /* 11 */
-     { "object_config_size", 1, "INTEGER", }, /* 12 */
++    { "object_config", 2, "OPTION INTEGER", }, /* 12 */
      { 0 }
    };
    int iSub;
        Tcl_SetObjResult(interp, Tcl_NewWideIntObj(nSize));
        break;
      }
-     case 12: {
 -    case 11: {    /* object_config */
++    case 12: {    /* object_config */
+       struct ObjConfOpt {
+         const char *zName;
+         int opt;
+       } aOpt[] = {
+         { "size", SQLITE_SESSION_OBJCONFIG_SIZE },
+         { "rowid", SQLITE_SESSION_OBJCONFIG_ROWID },
+         { 0, 0 }
+       };
+       size_t sz = sizeof(aOpt[0]);
 -
        int rc;
        int iArg;
-       if( Tcl_GetIntFromObj(interp, objv[2], &iArg) ){
+       int iOpt;
+       if( Tcl_GetIndexFromObjStruct(interp,objv[2],aOpt,sz,"option",0,&iOpt) ){
          return TCL_ERROR;
        }
-       rc = sqlite3session_object_config(
-           pSession, SQLITE_SESSION_OBJCONFIG_SIZE, &iArg
-       );
+       if( Tcl_GetIntFromObj(interp, objv[3], &iArg) ){
+         return TCL_ERROR;
+       }
+       rc = sqlite3session_object_config(pSession, aOpt[iOpt].opt, &iArg);
        if( rc!=SQLITE_OK ){
          extern const char *sqlite3ErrName(int);
          Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
diff --cc manifest
index 5d79799cb7dbb200069ba59579a14eacb292b2be,1499169eac6deeb9a7d26527b3e38779fa78dd42..05b4a960e2316304e5619b49947d7cb0018e307e
+++ b/manifest
@@@ -1,13 -1,13 +1,13 @@@
- C Update\sthe\sbegin-concurrent\sbranch\sto\sversion\s3.41.0
- D 2023-02-21T21:19:26.259
 -C Fix\sa\sproblem\swith\sthe\ssqlite3changeset_size()\sAPI\sand\srowid\stables.
 -D 2023-05-02T20:34:15.093
++C Update\sthis\sbranch\swith\slatest\schanges\sfrom\strunk.
++D 2023-05-02T21:10:14.783
  F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
  F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
  F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
- F Makefile.in df590d23e5a4a6137199e7783fb0550d88c8c1d979c824c92440ad19fdad939e
 -F Makefile.in 764f2e3e8fb4ae1c8dfe03e65b2b3b01bd1fc57edf78ec2cab3a1301e90e1905
++F Makefile.in c4e763adb43bd7b189eb07cb36f56da052d29a50dbd12d7e1b2167461e91a215
  F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241
- F Makefile.msc b0026b61d1242add00c28dbe169271a763fffcb3af6762bcdbeb20c3efe6a69f
- F README.md 8b8df9ca852aeac4864eb1e400002633ee6db84065bd01b78c33817f97d31f5e
- F VERSION 413ec94920a487ae32c9a2a8819544d690662d6f7c7ce025c0d0b8a1e74fa9db
+ F Makefile.msc ada3466f8f0112a8baead4d6cc2a99bf544d228958baae12ca35a3ee5755c806
+ F README.md e05bd8fcb45da04ab045c37f79a98654e8aa3b3b8f302cfbba80a0d510df75f7
+ F VERSION 17f95ae2fdf21f0e9575eb0b0511ea63f15d71dfff431b21c2b4adbfa70cfbbf
  F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
  F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
  F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
@@@ -428,8 -437,6 +438,8 @@@ F ext/rtree/tkt3363.test 142ab96eded44a
  F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff
  F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024
  F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1d2f94ac66
- F ext/session/changebatch1.test 9ceaa8f7b2a505933e250fbe6cbc550e4ce1e59d
++F ext/session/changebatch1.test 7d920231e88582867c338f6e29cb7e07b7864289a7fd6d08ae4b514e9f6351e8
 +F ext/session/changebatchfault.test be49c793219bf387ad692a60856b921f0854ad6d
  F ext/session/changeset.c 7a1e6a14c7e92d36ca177e92e88b5281acd709f3b726298dc34ec0fb58869cb5
  F ext/session/changesetfuzz.c 227076ab0ae4447d742c01ee88a564da6478bbf26b65108bf8fac9cd8b0b24aa
  F ext/session/changesetfuzz1.test 2e1b90d888fbf0eea5e1bd2f1e527a48cc85f8e0ff75df1ec4e320b21f580b3a
@@@ -444,58 -451,59 +454,61 @@@ F ext/session/session9.test 5409d90d814
  F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f
  F ext/session/sessionB.test c4fb7f8a688787111606e123a555f18ee04f65bb9f2a4bb2aa71d55ce4e6d02c
  F ext/session/sessionC.test f8a5508bc059ae646e5ec9bdbca66ad24bc92fe99fda5790ac57e1f59fce2fdf
- F ext/session/sessionD.test 4f91d0ca8afc4c3969c72c9f0b5ea9527e21de29039937d0d973f821e8470724
+ F ext/session/sessionD.test f5c6a762d00bc6ca9d561695c322ba8ecca2bed370486707ef37cf565d2f6c73
  F ext/session/sessionE.test b2010949c9d7415306f64e3c2072ddabc4b8250c98478d3c0c4d064bce83111d
  F ext/session/sessionF.test d37ed800881e742c208df443537bf29aa49fd56eac520d0f0c6df3e6320f3401
- F ext/session/sessionG.test 3828b944cd1285f4379340fd36f8b64c464fc84df6ff3ccbc95578fd87140b9c
- F ext/session/sessionH.test ecabc041e04e48671a94cd7c02993bc73f75dced943280a026e89cdf64374eef
- F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f46840172e9a01e8cc53e
+ F ext/session/sessionG.test 3efe388282d641b65485b5462e67851002cd91a282dc95b685d085eb8efdad0a
 -F ext/session/sessionH.test 71bbff6b1abb2c4ac62b84dee53273c37e0b21e5fde3aed80929403e091ef859
++F ext/session/sessionH.test 29a5441c3dc0a63fa596d745e64bc6c636e062ae04cd89bc84e32c7d98b1fa9b
+ F ext/session/session_common.tcl e5598096425486b363718e2cda48ee85d660c96b4f8ea9d9d7a4c3ef514769da
  F ext/session/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3
- F ext/session/sessionat.test 46fd847f6ed194ebb7ebef9fe68b2e2ec88d9c2383a6846cddc5604b35f1d4ae
- F ext/session/sessionbig.test 890ade19e3f80f3d3a3e83821ff79c5e2af906a67ecb5450879f0015cadf101e
+ F ext/session/sessionat.test 00c8badb35e43a2f12a716d2734a44d614ff62361979b6b85419035bc04b45ee
+ F ext/session/sessionbig.test 47c381e7acfabeef17d98519a3080d69151723354d220afa2053852182ca7adf
  F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec
- F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7
- F ext/session/sessionfault2.test dd593f80b6b4786f7adfe83c5939620bc505559770cc181332da26f29cddd7bb
+ F ext/session/sessionfault.test 573bf027fb870d57bd4e7cf50822a3e4b17b2b923407438747aaa918dec57a09
+ F ext/session/sessionfault2.test b0d6a7c1d7398a7e800d84657404909c7d385965ea8576dc79ed344c46fbf41c
  F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2c52219819bc105a25
  F ext/session/sessionmem.test f2a735db84a3e9e19f571033b725b0b2daf847f3f28b1da55a0c1a4e74f1de09
  F ext/session/sessionnoop.test a9366a36a95ef85f8a3687856ebef46983df399541174cb1ede2ee53b8011bc7
- F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810
- F ext/session/sessionsize.test 6f644aff31c7f1e4871e9ff3542766e18da68fc7e587b83a347ea9820a002dd8
- F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5
+ F ext/session/sessionnoop2.test 5c9a882219e54711c98dccd2fd81392f189a59325e4fb5d8ed25e33a0c2f0ba2
+ F ext/session/sessionrebase.test 702378bdcb5062f1106e74457beca8797d09c113a81768734a58b197b5b334e2
+ F ext/session/sessionrowid.test 6323ba831721205fd729929745038fd54e9d128c66c654b8d0b26853095a321c
+ F ext/session/sessionsize.test 8fcf4685993c3dbaa46a24183940ab9f5aa9ed0d23e5fb63bfffbdb56134b795
+ F ext/session/sessionstat1.test b039e38e2ba83767b464baf39b297cc0b1cc6f3292255cb467ea7e12d0d0280c
  F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc
 -F ext/session/sqlite3session.c e50a9218ee360db0a25298adc6614162d80ebe65d3f6a5b0a021e0902f6536a1
 -F ext/session/sqlite3session.h 653e9d49c4edae231df8a4c8d69c2145195aedb32462d4b44229dbee7d2680fb
 -F ext/session/test_session.c 5285482f83cd92b4c1fe12fcf88210566a18312f4f2aa110f6399dae46aeccbb
 +F ext/session/sqlite3changebatch.c d5553b79e012ee2cb06c0a96bdf9dfe19e66354390ea0036cc46c4953142d517
 +F ext/session/sqlite3changebatch.h e72016998c9a22d439ddfd547b69e1ebac810c24
- F ext/session/sqlite3session.c 7084f9fb1c075cd0724d62d71affe5889ee514d60a02f8548e74e74f8e285df4
- F ext/session/sqlite3session.h c26e54521584ad26dcb459171d94bbe6412ca26ed4613551c7f0c80aad129abd
- F ext/session/test_session.c 0597d013e68abccb4aa808549139f985130a19732c2b827609a05100d8cbfeaf
++F ext/session/sqlite3session.c 3f88516da48852eff1643f4c367e9b65f75c1904d041e8f4a84c0fcda3d8379a
++F ext/session/sqlite3session.h 0acea22732ef17c1d56d68cdd70948101e7ee2053e92764a80051d9572d432d1
++F ext/session/test_session.c 8957ef47655196b0d94cde7095b294fe34d7bac25c5dc7c4bb21a0b6e4f991c7
  F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3
  F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04
  F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb
 -F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c
 +F ext/wasm/EXPORTED_FUNCTIONS.fiddle 7fb73f7150ab79d83bb45a67d257553c905c78cd3d693101699243f36c5ae6c3
- F ext/wasm/GNUmakefile 5418b4702f4ad0f2162a7e0d128042e8d9219827e3d36978bd2dd6e26ce8f68e
+ F ext/wasm/GNUmakefile 38700d5074af690f004e4e5f3533164ab49693b9d0832929c4ecf97a0bc09494
  F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576
  F ext/wasm/README.md ef39861aa21632fdbca0bdd469f78f0096f6449a720f3f39642594af503030e9
 -F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api d6a5078f48a5301ed17b9a30331075d9b2506e1360c1f0dee0c7816c10acd9ab
 +F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-api c5eaceabb9e759aaae7d3101a4a3e542f96ab2c99d89a80ce20ec18c23115f33
+ F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-see fb29e62082a658f0d81102488414d422c393c4b20cc2f685b216bc566237957b
  F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287
  F ext/wasm/api/README.md 77a2f1f2fc60a35def7455dffc8d3f2c56385d6ac5c6cecc60fa938252ea2c54
- F ext/wasm/api/extern-post-js.c-pp.js 44a3a169f55a8dba42cf688954b2625b9b9e6174f2ff02d4918a2ca8c3beab7f
+ F ext/wasm/api/extern-post-js.c-pp.js 393ab78b807da94096eae1a68bfddb999a2299936a185d910162fe87a57a9a3a
  F ext/wasm/api/extern-pre-js.js cc61c09c7a24a07dbecb4c352453c3985170cec12b4e7e7e7a4d11d43c5c8f41
  F ext/wasm/api/post-js-footer.js cd0a8ec768501d9bd45d325ab0442037fb0e33d1f3b4f08902f15c34720ee4a1
  F ext/wasm/api/post-js-header.js 47b6b281f39ad59fa6e8b658308cd98ea292c286a68407b35ff3ed9cfd281a62
- F ext/wasm/api/pre-js.c-pp.js 9ece5de1bb0509f0a8a360712fcc9c1291b9516c0be5bd66acedd6edbcec37a1
- F ext/wasm/api/sqlite3-api-cleanup.js 2d63eb84267a1d15ce002e083d6396a521471da8af3afa76846d50f39a54d65e
- F ext/wasm/api/sqlite3-api-glue.js 0a93e58aabf52b32ddccbb107a1fd4552f2505e103ab63396c4d0a0743704785
- F ext/wasm/api/sqlite3-api-oo1.js 9b50c188513c70438a497914089cfeac79b6ac2d73501775538f9e467325ea15
- F ext/wasm/api/sqlite3-api-prologue.js 5cc817b67a774bfa3c47d4c2fa484b10b24b5529a66094b35546f3ebba1ef646
- F ext/wasm/api/sqlite3-api-worker1.js 9551f04cdfcde354e5a6ccb48951e007d618abb4e95758297b7fd44ccffdf89f
+ F ext/wasm/api/pre-js.c-pp.js ad906703f7429590f2fbf5e6498513bf727a1a4f0ebfa057afb08161d7511219
+ F ext/wasm/api/sqlite3-api-cleanup.js cc21e3486da748463e02bbe51e2464c6ac136587cdfd5aa00cd0b5385f6ca808
+ F ext/wasm/api/sqlite3-api-glue.js f1b2dcb944de5138bb5bd9a1559d2e76a4f3ec25260963d709e8237476688803
+ F ext/wasm/api/sqlite3-api-oo1.js 2691a34a741015127b210954a1b9586764d3ff0c8a20f00fd15c00f339ecc79f
+ F ext/wasm/api/sqlite3-api-prologue.js 17f4ec398ba34c5c666fea8e8c4eb82064a35b302f2f2eb355283cd8d3f68ed5
+ F ext/wasm/api/sqlite3-api-worker1.js 40a5b1813fcbe789f23ae196c833432c8c83e7054d660194ddfc51eab1c5b9bf
  F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89
- F ext/wasm/api/sqlite3-opfs-async-proxy.js 7795b84b66a7a8dedc791340709b310bb497c3c72a80bef364fa2a58e2ddae3f
- F ext/wasm/api/sqlite3-v-helper.js 6f6c3e390a72e08b0a5b16a0d567d7af3c04d172831853a29d72a6f1dd40ff24
- F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js ca291837840b3eae3a60810721a7970c98f7c7cd3ee1c879acb7e91f1e3fe65a
+ F ext/wasm/api/sqlite3-opfs-async-proxy.js 70914ae97784d3028150bbf252e07a423056c42cc345903c81b5fae661ce512f
+ F ext/wasm/api/sqlite3-v-helper.js e5c202a9ecde9ef818536d3f5faf26c03a1a9f5192b1ddea8bdabf30d75ef487
+ F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 89640e4874a60cb2d973306b272384ffb45c7915375c7bb0355c7586f88dc39c
  F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
- F ext/wasm/api/sqlite3-wasm.c 76625a70937a8522d014ef686c32db5b53a3ee61850323f5c601d2ac39fe52fe
+ F ext/wasm/api/sqlite3-wasm.c 12a096d8e58a0af0589142bae5a3c27a0c7e19846755a1a37d2c206352fbedda
 -F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js 2710a06a59620c6bf7ce298ab1fb6c9ce825b9f9379728b74c486db6613beecc
 +F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js c5ac33e39f21a3481812d7333ca6e18853640d423a01960ca8dbc6e7c5c3c21c
- F ext/wasm/api/sqlite3-worker1.c-pp.js 77b3835192469e9da23926ec8f78fb0b114a51d048dc54388709ac22b5c5f0a0
+ F ext/wasm/api/sqlite3-worker1.c-pp.js da509469755035e919c015deea41b4514b5e84c12a1332e6cc8d42cb2cc1fb75
  F ext/wasm/batch-runner.html 4deeed44fe41496dc6898d9fb17938ea3291f40f4bfb977e29d0cef96fbbe4c8
  F ext/wasm/batch-runner.js 0dad6a02ad796f1003d3b7048947d275c4d6277f63767b8e685c27df8fdac93e
  F ext/wasm/c-pp.c 6d80d8569d85713effe8b0818a3cf51dc779e3f0bf8dc88771b8998552ee25b4
@@@ -509,18 -517,19 +522,19 @@@ F ext/wasm/demo-123.js ebae30756585bca6
  F ext/wasm/demo-jsstorage.html 409c4be4af5f207fb2877160724b91b33ea36a3cd8c204e8da1acb828ffe588e
  F ext/wasm/demo-jsstorage.js 44e3ae7ec2483b6c511384c3c290beb6f305c721186bcf5398ca4e00004a06b8
  F ext/wasm/demo-worker1-promiser.html 1de7c248c7c2cfd4a5783d2aa154bce62d74c6de98ab22f5786620b3354ed15f
- F ext/wasm/demo-worker1-promiser.js b99c550763fa792c204e9a7cceadd976004036d9fc3e22fab7051712e30d207d
+ F ext/wasm/demo-worker1-promiser.js 51b02509a109e82f623fb4c900c8b48b9a77cc13fbd038396f9a083b86593ae3
  F ext/wasm/demo-worker1.html 2c178c1890a2beb5a5fecb1453e796d067a4b8d3d2a04d65ca2eb1ab2c68ef5d
- F ext/wasm/demo-worker1.js a619adffc98b75b66c633b00f747b856449a134a9a0357909287d80a182d70fa
- F ext/wasm/dist.make f55f9c9e1980ea11a59964e59535c66175a17f004d1c2e274522c3366b3a084a
- F ext/wasm/fiddle.make 396a0d6e2b3aa63ad448ea71d91676cb9cbbba8f5e6529cf1248d17f29142f47
+ F ext/wasm/demo-worker1.js 2c7794d8bc4ab9ecf9cdc2c15de940b11a006942226e441ea41edd458dfc0a26
+ F ext/wasm/dist.make 451fb1b732257849f6e898d2a862512a0401500ed369ef53bdfeddf9c77bc3b9
+ F ext/wasm/example_extra_init.c 2347cd69d19d839ef4e5e77b7855103a7fe3ef2af86f2e8c95839afd8b05862f
+ F ext/wasm/fiddle.make dbe36b90b8907ae28ecb9c0e9fd8389dbdaecf117ea4fb2ea33864bdfa498a94
  F ext/wasm/fiddle/emscripten.css 3d253a6fdb8983a2ac983855bfbdd4b6fa1ff267c28d69513dd6ef1f289ada3f
  F ext/wasm/fiddle/fiddle-worker.js 163d6139a93fab4bcb72064923df050d4e7c0ff0d8aa061ce8776a6e75da8a10
 +F ext/wasm/fiddle/fiddle.html 550c5aafce40bd218de9bf26192749f69f9b10bc379423ecd2e162bcef885c08
  F ext/wasm/fiddle/fiddle.js 974b995119ac443685d7d94d3b3c58c6a36540e9eb3fed7069d5653284071715
 -F ext/wasm/fiddle/index.html 5daf54e8f3d7777cbb1ca4f93affe28858dbfff25841cb4ab81d694efed28ec2
  F ext/wasm/index-dist.html 22379774f0ad4edcaaa8cf9c674c82e794cc557719a8addabed74eb8069d412e
  F ext/wasm/index.html dd900891844caebd9cadbddd704f66bd841d7c12fd69ce5af490e2c10fb49f45
- F ext/wasm/jaccwabyt/jaccwabyt.js 06f2ef1ad640c26c593def3d960336e9bb789819b920516480895c38ed5f58fa
+ F ext/wasm/jaccwabyt/jaccwabyt.js 8287c0537fa0750414edbe75ce64668a81c8716df5ec4c3e6bb4f11bd1c36031
  F ext/wasm/jaccwabyt/jaccwabyt.md 37911f00db12cbcca73aa1ed72594430365f30aafae2fa9c886961de74e5e0eb
  F ext/wasm/module-symbols.html 841de62fc198988b8330e238c260e70ec93028b096e1a1234db31b187a899d10
  F ext/wasm/scratchpad-wasmfs-main.html 20cf6f1a8f368e70d01e8c17200e3eaa90f1c8e1029186d836d14b83845fbe06
@@@ -558,38 -567,38 +572,38 @@@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47
  F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786
  F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
  F sqlite_cfg.h.in baf2e409c63d4e7a765e17769b6ff17c5a82bbd9cbf1e284fd2e4cefaff3fcf2
- F src/alter.c 3ca2f449c890f8b86ec9e06f0c4fccf0648941c3308a16904cb2852227db83f7
- F src/analyze.c b597c382f23b19cce563211181e84b7e8edddd6871d5f630bbadedb57e562806
+ F src/alter.c 482c534877fbb543f8295992cde925df55443febac5db5438d5aaba6f78c4940
+ F src/analyze.c 6f4d31f7b899528fa06cbc6263d019343461ebe1ce182335daec1e8c2b66a5a9
  F src/attach.c cc9d00d30da916ff656038211410ccf04ed784b7564639b9b61d1839ed69fd39
  F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf
- F src/backup.c a2891172438e385fdbe97c11c9745676bec54f518d4447090af97189fd8e52d7
+ F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523
 -F src/bitvec.c 7c849aac407230278445cb069bebc5f89bf2ddd87c5ed9459b070a9175707b3d
 +F src/bitvec.c 3907fcbe8a0c8c2db58d97087d15cdabbf2842adb9125df9ab9ff87d3db16775
  F src/btmutex.c 6ffb0a22c19e2f9110be0964d0731d2ef1c67b5f7fabfbaeb7b9dabc4b7740ca
- F src/btree.c 0cefb45d6010efd0cd041dc02c1c923fca791875f7cb8f90978cfecd584b19d7
 -F src/btree.c 1949007d2792cf761799348b3760c8489d1964c49efa9e52591aa1f2fcdbc96f
 -F src/btree.h aa354b9bad4120af71e214666b35132712b8f2ec11869cb2315c52c81fad45cc
 -F src/btreeInt.h a9ae91868acc4b3146d47ae2a072aac2cf41ecb7386015752160c8e1a212d9f2
 -F src/build.c 8357d6ca9a8c9afc297c431df28bc2af407b47f3ef2311875276c944b30c4d54
++F src/btree.c 049aea153b5c3102679b96d8d879694b5b9084661e0306c0dabdff61bf0ccce0
 +F src/btree.h 77a092acf63526827e74e88d0480123212d079593a841ff1fe85507adf256ef6
- F src/btreeInt.h c7ee54b020d7895ca7bee154c0d5e52e435587475a0a34543cd982cb190af42f
- F src/build.c c4873f03560d3481e2922aa44bbcdc127316c2393860443b1b945bfde7a47e6a
++F src/btreeInt.h 6b0e8a3bcd995cb0019729c0d3138b7aea19e6cc26d78f8d55e7597e70e8c6cf
++F src/build.c 9648ecfd54e41ffc18994ad3bc43f755be1f1df51bb0d3ac282bfc1dbcedf99b
  F src/callback.c 4cd7225b26a97f7de5fee5ae10464bed5a78f2adefe19534cc2095b3a8ca484a
  F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
  F src/ctime.c 20507cc0b0a6c19cd882fcd0eaeda32ae6a4229fb4b024cfdf3183043d9b703d
  F src/date.c f21815ca7172ce073db3163ac54c8d9f2841077165c1a6123b4d1c376a0c7ec7
- F src/dbpage.c d47549716549311f79dc39fe5c8fb19390a6eb2c960f8e37c89a9c4de0c1052e
+ F src/dbpage.c f3eea5f7ec47e09ee7da40f42b25092ecbe961fc59566b8e5f705f34335b2387
  F src/dbstat.c ec92074baa61d883de58c945162d9e666c13cd7cf3a23bc38b4d1c4d0b2c2bef
- F src/delete.c 86573edae75e3d3e9a8b590d87db8e47222103029df4f3e11fa56044459b514e
- F src/expr.c 2e5e67e800c9416996df52409746a2f3c7dadf5d38b5a367ce379b239e3f40c8
+ F src/delete.c a9c6d3f51c0a31e9b831e0a0580a98d702904b42d216fee530940e40dec34873
+ F src/expr.c 871cfd80c516ee39d90414b2d3da2b5bc9c9e21fe87b7eb787ea7ae4b6461758
  F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
- F src/fkey.c 722f20779f5342a787922deded3628d8c74b5249cab04098cf17ee2f2aaff002
- F src/func.c 9274f1c5c664b35108dfdaaee1444488573317e1ba58f14a4c12638677b1119a
- F src/global.c e06ff8e0acd85aec13563c9ecb44fbbf38232ccf73594998fd880b92d619594b
+ F src/fkey.c 03c134cc8bffe54835f742ddea0b72ebfc8f6b32773d175c71b8afeea6cb5c83
 -F src/func.c d187be57a886ddf4e6b7ef584a494361899be3df5eee6d4a747b68ff4aff4122
++F src/func.c 48acd78a3a583f42d9b5c2172f90f4de570045b37c930a2d8284e67f08c63664
+ F src/global.c bd0892ade7289f6e20bff44c07d06371f2ff9b53cea359e7854b9b72f65adc30
  F src/hash.c c6af5f96a7a76d000f07c5402c48c318c2566beecdee9e78b9d9f60ce7119565
  F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51
  F src/hwtime.h b638809e083b601b618df877b2e89cb87c2a47a01f4def10be4c4ebb54664ac7
  F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
- F src/insert.c 1b11a2e33ee52db93c02fddac67e39d00161d61b69fac2675b82f2aa68c1b61c
- F src/json.c c85ed6fce06f43d414b0d7fff64749d43a0dbd1067123ee407bd3a0752454161
+ F src/insert.c a8de1db43335fc4946370a7a7e47d89975ad678ddb15078a150e993ba2fb37d4
+ F src/json.c 2cbf343884b0f0e7b4c39f8cb8a2dbf4fb49d92161aff4c76a20996d799cbe18
  F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
- F src/loadext.c b04eb648cedc45efe4298e1ef439ac4f0096ae27b5f01accb0a1f49d57789128
- F src/main.c 938078d665c7fd2971a205d3912315291e0c1a6d669004d0ce5616d7eddcaf4f
+ F src/loadext.c be5af440f3192c58681b5d43167dbca3ccbfce394d89faa22378a14264781136
 -F src/main.c 035be2e9ba2a0fc1701a8ab1880af3001a968a24556433538a6c073558ee4341
++F src/main.c 711be7ef7cc818de5f89887bad67e8196fcad8af9bd27a4ac354447e2b5a4833
  F src/malloc.c 47b82c5daad557d9b963e3873e99c22570fb470719082c6658bf64e3012f7d23
  F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
  F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
@@@ -610,33 -619,33 +624,33 @@@ F src/os.h 1ff5ae51d339d0e30d8a9d814f4b
  F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e06
  F src/os_kv.c 4d39e1f1c180b11162c6dc4aa8ad34053873a639bac6baae23272fc03349986a
  F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d872107
- F src/os_unix.c fb17933109e80cb6fbb2d51ca8f92956b48eb0a32546fb1b2e65bbd063f99165
- F src/os_win.c 295fe45f18bd86f2477f4cd79f3377c6f883ceb941b1f46808665c73747f2345
 -F src/os_unix.c 1b3ddb7814c4bf37f494c04d2ab30c1ced5b2c927267e1930ce7cd388787a96d
++F src/os_unix.c db9ded173327ef541a96ecf3f58604bab36eec58468a0b32806eb2bfe4690b37
+ F src/os_win.c 2b2411279f7b24f927591561303fc5871845732df42641cbf695c23640b16975
  F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
- F src/pager.c d45d7453374b49d3478f50f4dfcc1aa20fabf68e60352a256f7482a441abac68
 -F src/pager.c 9d36ddedc842e993c88c222ed914822dbd6f8ece3c648fde04468637012a034a
 -F src/pager.h f82e9844166e1585f5786837ddc7709966138ced17f568c16af7ccf946c2baa3
 -F src/parse.y 146f9a1db7db5ef4299c6897d335e5abed348c2626190d2877d45ffa210fd4ca
++F src/pager.c 5e7fff45faef9a281bd45436b4aa5566fdf0e59ba335ce836136bc29284c4323
 +F src/pager.h 7b2ec7bba30b21a97b68d5bdc0dbb82a75f48c4b1457180988f9d409fb789e16
- F src/parse.y 9006b990da7f22268bb7825603a2d4c32140e13ce15771f4cf35dbb114216c31
- F src/pcache.c f4268f7f73c6a3db12ce22fd25bc68dc42315d19599414ab1207d7cf32f79197
- F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
++F src/parse.y 03d4d7a079481e6fab9f9256971fa87c716af20d46fffba2ecea21583e6f05db
+ F src/pcache.c 8ee13acccfd9accbf0af94910b7323dd7f7d55300d92ddafcf40e34fcc8e21be
+ F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5
  F src/pcache1.c dee95e3cd2b61e6512dc814c5ab76d5eb36f0bfc9441dbb4260fccc0d12bbddc
- F src/pragma.c 82d5090a35eac75876d3b41f48d06b2370553c9576bf2942233c462e03eb94c9
+ F src/pragma.c 26ed2cfdc5c12aa1c707178635709684960288cacc9cff9d491a38ff10e395f1
 -F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
 +F src/pragma.h 1f421360eed1a7721e8c521463df8519a7c8d0d5893ebd9dbfe0dba8de996f8c
- F src/prepare.c ce87a08cfddd45a147150db34190b1986f2d4a0e0828858cb6bd908c78fb02e3
- F src/printf.c ff4b05e38bf928ff1b80d3dda4f977b10fe39ecbfe69c018224c7e5594fb2455
+ F src/prepare.c 6350675966bd0e7ac3a464af9dbfe26db6f0d4237f4e1f1acdb17b12ad371e6e
+ F src/printf.c 7eac1a9896a80697e03e08963e210830532ae2ff610e16c193e95af007ca5623
 -F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 +F src/random.c a3e70f8515721ff24d2c0e6afd83923e8faab5ab79ececea4c1bf9fe4049fbb2
- F src/resolve.c d62c5665279cc7485f9d45b5e20911cc7b19c203f268321a90d05d74f4725750
+ F src/resolve.c 3e53e02ce87c9582bd7e7d22f13f4094a271678d9dc72820fa257a2abb5e4032
  F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
- F src/select.c 25b8637206ab12fd7240998e5b7cb52c55ea7efafd054ab789e4aee0004de975
- F src/shell.c.in 6f36f5ca05f1bebf74935a7fcf2dce983016e807a09cbd752a673583ad7da087
- F src/sqlite.h.in f62533504074a363fcf423f2efeb9635a1290afd11805a1ef0e27a47699b7bea
 -F src/select.c f879cef11c462a2c37a8c906932781e384c3bb32042c355a704a043029c90d27
++F src/select.c 79a6e11500d373b538aef918295d66a27f43481368557e06a07666b3b1c22017
+ F src/shell.c.in a835e8b580b771ed5a3cbaf7406b831dee4c9fc9b2bddd133c94c90ff9e2a9ba
 -F src/sqlite.h.in d6b0b83b2deab8f92ef7cc6f6fb94fa59d21c59f7b55f4c693bfff161ce42238
++F src/sqlite.h.in e0cb5c60fb0654c2e772f61c920dc9d43ae26c9d4f22f038ce09600b8a527a16
  F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
  F src/sqlite3ext.h da473ce2b3d0ae407a6300c4a164589b9a6bfdbec9462688a8593ff16f3bb6e4
- F src/sqliteInt.h 569ba413ef271b0cbf1eae81cf6af3133101d12bddd114fd67189ad54d96b475
 -F src/sqliteInt.h ef0268eeba1449170d5967493a3f6b720344cd6f461c3430299c00d51da74d9d
++F src/sqliteInt.h cc614f14f93d0123745f81880948660f59d84ae65161f11f2aa5896975b844bf
  F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
  F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
  F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
  F src/tclsqlite.c 8522a04fb9c84faa1d80354430ae0ee9349727a3a4b32e3cfe39b9be8324cabd
- F src/test1.c 1c4eab4d0357624dd7db93ddb27e1bedbc3be57dae0cd19a4dcf20bec7cd32b0
 -F src/test1.c 8eab61fb2813aa212d97ab188e85fc9ca7b89d9ff5ff05d59d9aa0c491a6c721
++F src/test1.c fce757d6c5cc7ecf010283fabe674cb021c1ce3f874803b21c978e6c768138e1
  F src/test2.c 827446e259a3b7ab949da1542953edda7b5117982576d3e6f1c24a0dd20a5cef
  F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644
  F src/test4.c 4533b76419e7feb41b40582554663ed3cd77aaa54e135cf76b3205098cd6e664
@@@ -690,32 -699,32 +704,32 @@@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f
  F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
  F src/tokenize.c 1305797eab3542a0896b552c6e7669c972c1468e11e92b370533c1f37a37082b
  F src/treeview.c fccf3b8c517c1f55cb380c1522febe6921fcb2bd800c16c78cab571d0eb0ccbd
- F src/trigger.c 5e68b790f022b8dafbfb0eb244786512a95c9575fc198719d2557d73e5795858
- F src/update.c 1a1073dd3519d2a073d62e5243d8bedf8f1c8e751d0a593588a97b9637cd7d3d
+ F src/trigger.c ad6ab9452715fa9a8075442e15196022275b414b9141b566af8cdb7a1605f2b0
 -F src/update.c 3f4fb5ad7c9b48d7911974d6579192bb3a6c27f46140b6cbb9139cc8a77b8691
++F src/update.c 82588046b02f57c354a50a4999a303ff88abad547ee5853542d636785e496f83
  F src/upsert.c 5303dc6c518fa7d4b280ec65170f465c7a70b7ac2b22491598f6d0b4875b3145
  F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
- F src/util.c 3ff7bc2b48dd425b1448304bb86273b05da1621f136d51dbb9789f8803559a1f
+ F src/util.c d4bcb560471cd94e6e17d448311f8d5bf81a7e5276295a53501058ef1b95dd1a
 -F src/vacuum.c 84ce7f01f8a7a08748e107a441db83bcec13970190ddcb0c9ff522adbc1c23fd
 -F src/vdbe.c 94d5520d2a287216c47e6fb641ee88ffd934b0d40c235d693d38bcd0e0750357
 +F src/vacuum.c f6e47729554e0d2c576bb710c415d5bc414935be0d7a70f38d1f58ffa7a6d8c0
- F src/vdbe.c 7c1da07917a028e7e8de14acafaadb3600d7149d650e2ed7b62296de5fa0de81
- F src/vdbe.h 73b904a6b3bb27f308c6cc287a5751ebc7f1f89456be0ed068a12b92844c6e8c
++F src/vdbe.c c96ce4f64f77946640b1311087d3d6b0b322daa4e77e47d6dd1b4b3ee9a2cb50
+ F src/vdbe.h 637ae853b7d42ae3951034cc63ab7c8af837861f79504cdb5399552fcd89a884
  F src/vdbeInt.h a4147a4ddf613cb1bcb555ace9e9e74a9c099d65facd88155f191b1fb4d74cfb
- F src/vdbeapi.c 40c47b1528d308a322203de21d2e0d711753257ed9771771b6129214b1d65932
- F src/vdbeaux.c 9aa60599fb2a94a7f3603f14c184576963bf29556d42fd6299669047a87ec616
+ F src/vdbeapi.c b4982cde547054c4f7341198db3c3008a48e1eb028f757601bf5bf2fc026cbcf
 -F src/vdbeaux.c 6ee48db408d4c297a363f1e31145c09793a580e7c508bb36063dd017d67117a2
++F src/vdbeaux.c f6d04ddce4450244ef4e845deb74462edd01f731bc57b737ae2d5a13d34a6092
  F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd
- F src/vdbemem.c 0388576b7cf0be13ce14b9e3b8aa90b8a1b923b60321d0242131ae0b5732b43b
+ F src/vdbemem.c 1cac4028c0dabbf1f3259f107440e2780e05ac9fe419e9709e6eb4e166ba714b
  F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35
  F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
  F src/vdbevtab.c aae4bd769410eb7e1d02c42613eec961d514459b1c3c1c63cfc84e92a137daac
- F src/vtab.c a39f6ed161f16a84ff445af9dba4776b2cf0898be08a33bee8e1128a66c0074b
+ F src/vtab.c 4a1b231b5938de0282fbb605eb068ca673a1b6a383130f54d1bcbbac951988ad
  F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
- F src/wal.c 4da9e3c92adba31977cca5960cad1ef51ba1040626a662a8855b3c671b24c422
 -F src/wal.c 3f4ac276a60bda76f9f1f6f1c2c38599bacd4987e5efcd3f7fed2647bf97280a
 -F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a
++F src/wal.c 8245b6e5b7c21d4a8bbb323967e5ecb7d55cef80f436cdb0ce0fce2c3d6bf91c
 +F src/wal.h 7ffe787437f20a098af347011967a6d3bb8e5c3dc645e6be59eff44d2b2c5297
  F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b
- F src/where.c 38c36bb654b4172148aef3b295bbbc1342b52078cf20174f771c746caa98f69a
+ F src/where.c f69d94f34e1c523cd9b66041e4afe015cad29888617f3c09a2a5bc36018917d0
  F src/whereInt.h e25203e5bfee149f5f1225ae0166cfb4f1e65490c998a024249e98bb0647377c
- F src/wherecode.c b82d0d33315e1526904b95155e55e61149c4462147668e1cc4567c812735eff1
- F src/whereexpr.c a60a1f88650c561eded95c5affbe846cda71fac35033e1280f28e47934df33c8
- F src/window.c 76a27cff9ea2ded0c2c3527187029259440fabcc4cc4c07b11d942c78494a614
+ F src/wherecode.c 85790d7e5365ac41085713331ce52e4343586ad3d37d218ffe00572357baa62b
+ F src/whereexpr.c 1dfda1695e4480c24248157df55bb4d66c732dc8d14ac16b4f076bb15de93d63
+ F src/window.c e075ea85bea322e30e361fa6e69eddba74f461e99e2a564dc09973f8a1fb27d9
  F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
  F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
  F test/affinity3.test f094773025eddf31135c7ad4cde722b7696f8eb07b97511f98585addf2a510a9
@@@ -899,15 -898,15 +914,15 @@@ F test/corruptE.test 4143791f2dfb443aec
  F test/corruptF.test be9fde98e4c93648f1ba52b74e5318edc8f59fe4
  F test/corruptG.test adf79b669cbfd19e28c8191a610d083ae53a6d51
  F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454
- F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b
+ F test/corruptI.test 9d8cbf6214e492abe9e822e759b9751ae336cec0a6fe3ff3b37bfbd8ff9c22ca
  F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4
  F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af
- F test/corruptL.test 9d1a0055c8db19baccd12f22ac36a33ec7d63afb59e82eb30835aea8f89b94df
+ F test/corruptL.test b42978028afc5eefc8b51d8d7cd6a9344ba7362d7ed4511ee2070f56e06d5a1c
  F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067
 -F test/corruptN.test 7c099d153a554001b4fb829c799b01f2ea6276cbc32479131e0db0da4efd9cc4
 +F test/corruptN.test 046a637064be7830d202765763063568621551bc5ffd6dea8eaf4db0f3536e82
  F test/cost.test b11cdbf9f11ffe8ef99c9881bf390e61fe92baf2182bad1dbe6de59a7295c576
  F test/count.test cd4bd531066e8d77ef8fe1e3fc8253d042072e117ccab214b290cf83f1602249
- F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86
+ F test/countofview.test 4088e461a10ee33e69803c177a69aa1d7bba81a9ffc2df66d76465a22ca7fdfc
  F test/coveridxscan.test f35c7208dedc4f98e471c569df64c0f95a49f6e072d8dc7c8f99bdee2697de1b
  F test/crash.test fb9dc4a02dcba30d4aa5c2c226f98b220b2b959f
  F test/crash2.test 5b14d4eb58b880e231361d3b609b216acda86651
@@@ -2062,8 -2068,8 +2085,8 @@@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a9
  F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
  F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
  F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
- P 6fb8bb2e8f486a1e0cd65481737fc10ad89aa47e30219ff1846fd38688eb59d1 05941c2a04037fc3ed2ffae11f5d2260706f89431f463518740f72ada350866d
- R 5652ffbb9f3886a948f94ee453c5bb01
- U drh
- Z 14e4ea7c727ff78b8891ed77019c4af0
 -P aac8ac631de5c5b439c48c13f5fd271d76c11b1a5fd0919dfe4506ef7725f5ab
 -R 61d9a9d2668f7db76ae5cd18e6e09935
++P 918aea50ed23191df4b2fa94c633bf76d11dcd7357a68090106c1cdc4a8ad669 92ade220dcf5c1b76a5db605b1467a01051271957cd26f790755904fd82772eb
++R 8ea33aeab33ebf645d3b6e8ab712df0d
+ U dan
 -Z 12f32504ba9b59579e904b79780ed5db
++Z 6c66a93c8858cc2d1e4a9b497370a552
  # Remove this line to create a well-formed Fossil manifest.
diff --cc manifest.uuid
index 64192769ba01b1963b4050b88b39c224f8080c20,782f599e129612143c9982c43627d7c779477c16..6d6d9a3099141084fe0b9f43740ab0424e7ff50e
@@@ -1,1 -1,1 +1,1 @@@
- 918aea50ed23191df4b2fa94c633bf76d11dcd7357a68090106c1cdc4a8ad669
 -92ade220dcf5c1b76a5db605b1467a01051271957cd26f790755904fd82772eb
++6f22c7679f235ffe22cd59bb780396b2285b352e3a1abc2c3fa7092bf54c69b6
diff --cc src/btree.c
index 4077b8dd9831a94567296ffe1c0f727779f1c771,dc9a828d3c65e960de405198bf65d56277d4b701..98b70be1e14318b4b23c2d287bf9fd6d6310eaf4
@@@ -7541,9 -7149,97 +7617,96 @@@ static int insertCell
        memcpy(pTemp, pCell, sz);
        pCell = pTemp;
      }
-     if( iChild ){
-       put4byte(pCell, iChild);
+     put4byte(pCell, iChild);
+     j = pPage->nOverflow++;
+     /* Comparison against ArraySize-1 since we hold back one extra slot
+     ** as a contingency.  In other words, never need more than 3 overflow
+     ** slots but 4 are allocated, just to be safe. */
+     assert( j < ArraySize(pPage->apOvfl)-1 );
+     pPage->apOvfl[j] = pCell;
+     pPage->aiOvfl[j] = (u16)i;
+     /* When multiple overflows occur, they are always sequential and in
+     ** sorted order.  This invariants arise because multiple overflows can
+     ** only occur when inserting divider cells into the parent page during
+     ** balancing, and the dividers are adjacent and sorted.
+     */
+     assert( j==0 || pPage->aiOvfl[j-1]<(u16)i ); /* Overflows in sorted order */
+     assert( j==0 || i==pPage->aiOvfl[j-1]+1 );   /* Overflows are sequential */
+   }else{
++    BtShared *pBt = pPage->pBt;
+     int rc = sqlite3PagerWrite(pPage->pDbPage);
+     if( NEVER(rc!=SQLITE_OK) ){
+       return rc;
+     }
+     assert( sqlite3PagerIswriteable(pPage->pDbPage) );
+     data = pPage->aData;
+     assert( &data[pPage->cellOffset]==pPage->aCellIdx );
+     rc = allocateSpace(pPage, sz, &idx);
+     if( rc ){ return rc; }
+     /* The allocateSpace() routine guarantees the following properties
+     ** if it returns successfully */
+     assert( idx >= 0 );
+     assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB );
+     assert( idx+sz <= (int)pPage->pBt->usableSize );
+     pPage->nFree -= (u16)(2 + sz);
+     /* In a corrupt database where an entry in the cell index section of
+     ** a btree page has a value of 3 or less, the pCell value might point
+     ** as many as 4 bytes in front of the start of the aData buffer for
+     ** the source page.  Make sure this does not cause problems by not
+     ** reading the first 4 bytes */
+     memcpy(&data[idx+4], pCell+4, sz-4);
+     put4byte(&data[idx], iChild);
+     pIns = pPage->aCellIdx + i*2;
+     memmove(pIns+2, pIns, 2*(pPage->nCell - i));
+     put2byte(pIns, idx);
+     pPage->nCell++;
+     /* increment the cell count */
+     if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++;
+     assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell || CORRUPT_DB );
 -#ifndef SQLITE_OMIT_AUTOVACUUM
 -    if( pPage->pBt->autoVacuum ){
++    if( REQUIRE_PTRMAP ){
+       int rc2 = SQLITE_OK;
+       /* The cell may contain a pointer to an overflow page. If so, write
+       ** the entry for the overflow page into the pointer map.
+       */
+       ptrmapPutOvflPtr(pPage, pPage, pCell, &rc2);
+       if( rc2 ) return rc2;
      }
 -#endif
+   }
+   return SQLITE_OK;
+ }
+ /*
+ ** This variant of insertCell() assumes that the pTemp and iChild
+ ** parameters are both zero.  Use this variant in sqlite3BtreeInsert()
+ ** for performance improvement, and also so that this variant is only
+ ** called from that one place, and is thus inlined, and thus runs must
+ ** faster.
+ **
+ ** Fixes or enhancements to this routine should be reflected into
+ ** the insertCell() routine.
+ */
+ static int insertCellFast(
+   MemPage *pPage,   /* Page into which we are copying */
+   int i,            /* New cell becomes the i-th cell of the page */
+   u8 *pCell,        /* Content of the new cell */
+   int sz            /* Bytes of content in pCell */
+ ){
+   int idx = 0;      /* Where to write new cell content in data[] */
+   int j;            /* Loop counter */
+   u8 *data;         /* The content of the whole page */
+   u8 *pIns;         /* The point in pPage->aCellIdx[] where no cell inserted */
+   assert( i>=0 && i<=pPage->nCell+pPage->nOverflow );
+   assert( MX_CELL(pPage->pBt)<=10921 );
+   assert( pPage->nCell<=MX_CELL(pPage->pBt) || CORRUPT_DB );
+   assert( pPage->nOverflow<=ArraySize(pPage->apOvfl) );
+   assert( ArraySize(pPage->apOvfl)==ArraySize(pPage->aiOvfl) );
+   assert( sqlite3_mutex_held(pPage->pBt->mutex) );
+   assert( sz==pPage->xCellSize(pPage, pCell) || CORRUPT_DB );
+   assert( pPage->nFree>=0 );
+   assert( pPage->nOverflow==0 );
+   if( sz+2>pPage->nFree ){
      j = pPage->nOverflow++;
      /* Comparison against ArraySize-1 since we hold back one extra slot
      ** as a contingency.  In other words, never need more than 3 overflow
      ** if it returns successfully */
      assert( idx >= 0 );
      assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB );
 -    assert( idx+sz <= (int)pPage->pBt->usableSize );
 +    assert( idx+sz <= (int)pBt->usableSize );
      pPage->nFree -= (u16)(2 + sz);
-     if( iChild ){
-       /* In a corrupt database where an entry in the cell index section of
-       ** a btree page has a value of 3 or less, the pCell value might point
-       ** as many as 4 bytes in front of the start of the aData buffer for
-       ** the source page.  Make sure this does not cause problems by not
-       ** reading the first 4 bytes */
-       memcpy(&data[idx+4], pCell+4, sz-4);
-       put4byte(&data[idx], iChild);
-     }else{
-       memcpy(&data[idx], pCell, sz);
-     }
+     memcpy(&data[idx], pCell, sz);
      pIns = pPage->aCellIdx + i*2;
      memmove(pIns+2, pIns, 2*(pPage->nCell - i));
      put2byte(pIns, idx);
@@@ -9682,9 -9375,9 +9843,10 @@@ int sqlite3BtreeInsert
    assert( szNew==pPage->xCellSize(pPage, newCell) );
    assert( szNew <= MX_CELL_SIZE(p->pBt) );
    idx = pCur->ix;
+   pCur->info.nSize = 0;
    if( loc==0 ){
      CellInfo info;
 +    BtShared *pBt = p->pBt;
      assert( idx>=0 );
      if( idx>=pPage->nCell ){
        return SQLITE_CORRUPT_BKPT;
@@@ -11311,15 -11003,13 +11476,15 @@@ int sqlite3BtreeIntegrityCheck
    }
    pBt->db->flags = savedDbFlags;
  
 -  /* Make sure every page in the file is referenced
 -  */
    if( !bPartial ){
 -    for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){
 +    /* Make sure every page in the file is referenced. Skip this if the
 +    ** database is currently being written by a CONCURRENT transaction (it 
 +    ** may fail as pages that were part of the free-list when the transaction
 +    ** was opened cannot be counted).  */
 +    for(i=1; ISCONCURRENT==0 && i<=sCheck.nPage && sCheck.mxErr; i++){
  #ifdef SQLITE_OMIT_AUTOVACUUM
        if( getPageReferenced(&sCheck, i)==0 ){
-         checkAppendMsg(&sCheck, "Page %d is never used", i);
+         checkAppendMsg(&sCheck, "Page %u: never used", i);
        }
  #else
        /* If the database supports auto-vacuum, make sure no tables contain
diff --cc src/btreeInt.h
Simple merge
diff --cc src/build.c
Simple merge
diff --cc src/func.c
Simple merge
diff --cc src/main.c
Simple merge
diff --cc src/os_unix.c
Simple merge
diff --cc src/pager.c
Simple merge
diff --cc src/parse.y
index 2400bf68d84b145b32fbd9551fd909eb629e8f59,541b9ffe584c31381219afa7cad1fc767822c13c..a5294df2f28b88da03843e3303ce4402dc530f33
@@@ -311,7 -295,7 +311,6 @@@ columnname(A) ::= nm(A) typetoken(Y). {
  // keywords.  Any non-standard keyword can also be an identifier.
  //
  %token_class id  ID|INDEXED.
--
  // And "ids" is an identifer-or-string.
  //
  %token_class ids  ID|STRING.
diff --cc src/select.c
Simple merge
diff --cc src/sqlite.h.in
Simple merge
diff --cc src/sqliteInt.h
index 59f33eb3fafd2c7da790fa0c262718022a913587,ebb21a2513b509d57093f0c27b80f06c3ad29a7b..bf46c20ff77bf7c644361ac1e7099f3e01434919
@@@ -1801,10 -1790,8 +1808,11 @@@ struct sqlite3 
                                            /*   DELETE, or UPDATE and return */
                                            /*   the count using a callback. */
  #define SQLITE_CorruptRdOnly  HI(0x00002) /* Prohibit writes due to error */
+ #define SQLITE_ReadUncommit   HI(0x00004) /* READ UNCOMMITTED in shared-cache */
  
 +/* Flags used by the Pragma noop_update enhancement */
 +#define SQLITE_NoopUpdate     HI(0x0001000) /* UPDATE operations are no-ops */
 +
  /* Flags used only if debugging */
  #ifdef SQLITE_DEBUG
  #define SQLITE_SqlTrace       HI(0x0100000) /* Debug print SQL as it executes */
diff --cc src/test1.c
Simple merge
diff --cc src/update.c
Simple merge
diff --cc src/vdbe.c
Simple merge
diff --cc src/vdbeaux.c
Simple merge
diff --cc src/wal.c
Simple merge