]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge all recent trunk changes.
authordrh <drh@noemail.net>
Wed, 27 Nov 2013 21:53:51 +0000 (21:53 +0000)
committerdrh <drh@noemail.net>
Wed, 27 Nov 2013 21:53:51 +0000 (21:53 +0000)
FossilOrigin-Name: 3a2a1bd47875e114d8e6f31c1768908f401d2861

1  2 
manifest
manifest.uuid
src/sqlite.h.in
src/vdbe.c
src/vdbeapi.c
test/hook.test

diff --cc manifest
index 271132e76bcbe4c61a83def5d5f476f0b9fd3040,2b11db792dbc086ab60737b1551d5dbf2134588b..ee7e6c8dc2f06b633f611bccba2cc05f745bb352
+++ b/manifest
@@@ -1,9 -1,9 +1,9 @@@
- C Merge\sin\sperformance\senhancements\sfrom\strunk.
- D 2013-11-26T18:00:29.602
 -C Remove\sunnecessary\slocal\svariables\sfrom\ssqlite3VdbeExec()\sin\sorder\sto\nreduce\sstack-space\srequirements\sof\sthat\sroutine.
 -D 2013-11-27T21:07:03.594
++C Merge\sall\srecent\strunk\schanges.
++D 2013-11-27T21:53:51.759
  F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 -F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b
 +F Makefile.in 06b851f767034811d4f6e159367c453dc28d3925
  F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
 -F Makefile.msc a6247094079f3ef97dcd7a69d0e13ff718c7073e
 +F Makefile.msc da7f2a230af6e39b71b2706dbb4c35fff7222a0f
  F Makefile.vxworks db21ed42a01d5740e656b16f92cb5d8d5e5dd315
  F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6
  F VERSION 52f7e22bfcec71a462e34194b4ae1671380fde59
@@@ -231,14 -217,14 +231,14 @@@ F src/pragma.c 5ab7279d132143feb77f7736
  F src/prepare.c 359d1a1e9c9bd4488e4dd3a1aaaf2d2ebb9bb768
  F src/printf.c da9119eb31a187a4b99f60aa4a225141c0ebb74b
  F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68
- F src/resolve.c a70e32ae6ccb7b780f2b6d3e9e21837affc25ee5
+ F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6
  F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
  F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a
- F src/shell.c c4d06a9238a515ff4bc86b8626139633c09a00a2
- F src/sqlite.h.in c84ef520934601e4d1a95c6858fef71dc369e940
+ F src/shell.c 936a72ff784efff3832cce274a96ed0b036e6758
 -F src/sqlite.h.in af7f4349f939c40848bdfa217855d0bb88f3a581
++F src/sqlite.h.in e7a96fad3f5a2e96f5b69cf395d3dfa657f4ab59
  F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
  F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
 -F src/sqliteInt.h 9d586cb37572cd9e0a48242d449c6a69c2e74e72
 +F src/sqliteInt.h dad3dff932c055304fc75b339f2cf68aab9cf19e
  F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
  F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
  F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@@ -294,12 -280,12 +294,12 @@@ F src/update.c 046d7df2a4b3d85442a758f4
  F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269
  F src/util.c cbe054290f780fcd472b89d701c7404c51ec9684
  F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
- F src/vdbe.c 520dcda659ff32e3da7d141e9ac083d3599a2079
 -F src/vdbe.c 54894fde8dc806d259e015ac7c9680145e725835
 -F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644
 -F src/vdbeInt.h 05fbda0e061dbc4aaa2709a8cccf3515c245b263
 -F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed
 -F src/vdbeaux.c a880c3c7d7c58543574ff7c96feddc5a1deaeae2
 -F src/vdbeblob.c 8cd05a5630e6d5563ad017bf82edaf812b28acde
++F src/vdbe.c 9c6fb9ed1b9165427b0fdc812bc9c48c031f77da
 +F src/vdbe.h b7bfa7b468fcad2cf1890969fe7459325da00385
 +F src/vdbeInt.h 1a5c604f33a5d46c839fee0cab16743aa3e1bc2e
- F src/vdbeapi.c 8ade912f7023a3b35ee64497a94718ddbd7269c3
++F src/vdbeapi.c e80d6d9dea792bd823cb64ae05cba446a7b3556a
 +F src/vdbeaux.c 9270db4725c0143e572a2df660fabac7104a9db3
 +F src/vdbeblob.c a2809461743e0b9dd9be871149ac65e8d2c80c08
  F src/vdbemem.c af650c2019dc197f062440cdb4650b7204e648bf
  F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147
  F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc
@@@ -601,7 -587,7 +601,7 @@@ F test/fuzz_malloc.test 328f70aaca63adf
  F test/fuzzer1.test d4c52aaf3ef923da293a2653cfab33d02f718a36
  F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536
  F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98
- F test/hook.test 777b2541f6dd4f4ca5e8d6b66c1df1b3717aeab6
 -F test/hook.test 162d7cef7a2d2b04839fe14402934e6a1b79442f
++F test/hook.test 5429d34d6e59086175d8efbcd7e14d891375bdfb
  F test/icu.test 70df4faca133254c042d02ae342c0a141f2663f4
  F test/in.test 047c4671328e9032ab95666a67021adbbd36e98e
  F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75
@@@ -1158,7 -1145,7 +1160,7 @@@ F tool/vdbe-compress.tcl f12c884766bd14
  F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
  F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
  F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
- P 7596d1bf8040f7cefc7b22c5e609acc5d66820bf 6f91dca0de908dc2b15130a6593a61c3147a409f
- R 4bfa42555a9c1bb80b9d6441159a988c
 -P ec2d47a1db2349d5c9b4fe465506e0e347f77921
 -R 7567a16f49e2bdddacaa25bcadbc50b4
++P fc9ae839569eb28eb734c52d95676c59b2e27494 81891288d9f281cf2ceb4cd701c0c3231b1bab19
++R 82cfa20fdf0a662273b8437808c19755
  U drh
- Z ab8c142eff787cc8d595e6a709628910
 -Z d833492813320be0733490cbebae9751
++Z 5ce6e39b92ce4cf1a9fbbd5b784d1d3b
diff --cc manifest.uuid
index c76da8bbba452eb6ecc11e53528807fd489896fb,d8103977d6c10c8bfa832e90049136dd82b3b686..b00a655abfdb6c75e6c7a215e4992f375255d410
@@@ -1,1 -1,1 +1,1 @@@
- fc9ae839569eb28eb734c52d95676c59b2e27494
 -81891288d9f281cf2ceb4cd701c0c3231b1bab19
++3a2a1bd47875e114d8e6f31c1768908f401d2861
diff --cc src/sqlite.h.in
Simple merge
diff --cc src/vdbe.c
index 765d5eb224badd9f2ff276985384dc49d70bcaae,8ae4ce484cb13131dbb1bb2c516ae4f139f15f34..908e5bcb392da65c2000a90260207ce899450c76
@@@ -4071,24 -4050,6 +4061,25 @@@ case OP_InsertInt: 
      iKey = pOp->p3;
    }
  
 +  if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){
 +    assert( pC->isTable );
 +    assert( pC->iDb>=0 );
 +    zDb = db->aDb[pC->iDb].zName;
 +    pTab = pOp->p4.pTab;
 +    op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT);
 +  }
 +
 +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
 +  /* Invoke the pre-update hook, if any */
 +  if( db->xPreUpdateCallback 
 +   && pOp->p4type==P4_TABLE
 +   && (!(pOp->p5 & OPFLAG_ISUPDATE) || pC->rowidIsValid==0)
++   && HasRowid(pTab)
 +  ){
 +    sqlite3VdbePreUpdateHook(p, pC, SQLITE_INSERT, zDb, pTab, iKey, pOp->p2);
 +  }
 +#endif
 +
    if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++;
    if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = lastRowid = iKey;
    if( pData->flags & MEM_Null ){
    pC->cacheStatus = CACHE_STALE;
  
    /* Invoke the update-hook if required. */
-   if( rc==SQLITE_OK && db->xUpdateCallback && op ){
 -  if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){
 -    zDb = db->aDb[pC->iDb].zName;
 -    zTbl = pOp->p4.z;
 -    op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT);
 -    assert( pC->isTable );
 -    db->xUpdateCallback(db->pUpdateArg, op, zDb, zTbl, iKey);
 -    assert( pC->iDb>=0 );
++  if( rc==SQLITE_OK && db->xUpdateCallback && op && HasRowid(pTab) ){
 +    db->xUpdateCallback(db->pUpdateArg, op, zDb, pTab->zName, iKey);
    }
    break;
  }
  case OP_Delete: {
    i64 iKey;
    VdbeCursor *pC;
 +  const char *zDb;
 +  Table *pTab;
 +  int opflags;
  
-   iKey = 0;
 +  opflags = pOp->p2;
    assert( pOp->p1>=0 && pOp->p1<p->nCursor );
    pC = p->apCsr[pOp->p1];
    assert( pC!=0 );
    rc = sqlite3VdbeCursorMoveto(pC);
    if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error;
  
-     assert( pC->isTable );
-     assert( pC->rowidIsValid );  /* lastRowid set by previous OP_NotFound */
 +  /* If the update-hook or pre-update-hook will be invoked, set iKey to 
 +  ** the rowid of the row being deleted. Set zDb and zTab as well.
 +  */
 +  if( pOp->p4.z && HAS_UPDATE_HOOK(db) ){
 +    assert( pC->iDb>=0 );
-   }
++    assert( pC->rowidIsValid || !HasRowid(pOp->p4.pTab) );
 +    iKey = pC->lastRowid;
 +    zDb = db->aDb[pC->iDb].zName;
 +    pTab = pOp->p4.pTab;
-   if( db->xPreUpdateCallback && pOp->p4.z ){
++ }
 +
 +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
 +  /* Invoke the pre-update-hook if required. */
++  if( db->xPreUpdateCallback && pOp->p4.z && HasRowid(pTab) ){
 +    assert( !(opflags & OPFLAG_ISUPDATE) || (aMem[pOp->p3].flags & MEM_Int) );
 +    sqlite3VdbePreUpdateHook(p, pC,
 +        (opflags & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_DELETE, 
 +        zDb, pTab, iKey,
 +        pOp->p3
 +    );
 +  }
 +#endif
 +
 +  if( opflags & OPFLAG_ISNOOP ) break;
 +
    sqlite3BtreeSetCachedRowid(pC->pCursor, 0);
    rc = sqlite3BtreeDelete(pC->pCursor);
    pC->cacheStatus = CACHE_STALE;
  
 -  /* Invoke the update-hook if required. */
 -  if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z && pC->isTable ){
 -    db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE,
 -                        db->aDb[pC->iDb].zName, pOp->p4.z, iKey);
 -    assert( pC->iDb>=0 );
 +  /* Update the change-counter and invoke the update-hook if required. */
 +  if( opflags & OPFLAG_NCHANGE ){
 +    p->nChange++;
 +    assert( pOp->p4.z );
-     if( rc==SQLITE_OK && db->xUpdateCallback ){
++    if( rc==SQLITE_OK && db->xUpdateCallback && HasRowid(pTab) ){
 +      db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, pTab->zName,iKey);
 +    }
    }
 -  if( pOp->p2 & OPFLAG_NCHANGE ) p->nChange++;
    break;
  }
  /* Opcode: ResetCount * * * * *
diff --cc src/vdbeapi.c
index 612c0b9ef8afb4cbd748e9ff9b5e8bebec296571,d51256217413188766279307e3a9721b9ed8e94c..976a4125eb1b8b6356c1931f6a5220aab004ee3d
@@@ -728,27 -708,27 +728,6 @@@ static Mem *columnMem(sqlite3_stmt *pSt
      sqlite3_mutex_enter(pVm->db->mutex);
      pOut = &pVm->pResultSet[i];
    }else{
--    /* If the value passed as the second argument is out of range, return
--    ** a pointer to the following static Mem object which contains the
--    ** value SQL NULL. Even though the Mem structure contains an element
--    ** of type i64, on certain architectures (x86) with certain compiler
--    ** switches (-Os), gcc may align this Mem object on a 4-byte boundary
--    ** instead of an 8-byte one. This all works fine, except that when
--    ** running with SQLITE_DEBUG defined the SQLite code sometimes assert()s
--    ** that a Mem structure is located on an 8-byte boundary. To prevent
--    ** these assert()s from failing, when building with SQLITE_DEBUG defined
--    ** using gcc, we force nullMem to be 8-byte aligned using the magical
--    ** __attribute__((aligned(8))) macro.  */
--    static const Mem nullMem 
--#if defined(SQLITE_DEBUG) && defined(__GNUC__)
--      __attribute__((aligned(8))) 
--#endif
--      = {0, "", (double)0, {0}, 0, MEM_Null, SQLITE_NULL, 0,
--#ifdef SQLITE_DEBUG
--         0, 0,  /* pScopyFrom, pFiller */
--#endif
--         0, 0 };
--
      if( pVm && ALWAYS(pVm->db) ){
        sqlite3_mutex_enter(pVm->db->mutex);
        sqlite3Error(pVm->db, SQLITE_RANGE, 0);
diff --cc test/hook.test
index 09fc9e8678d0df8c2213cee47088809a26bffa21,de6fbdd254299abd8f6343f0bc52a57ff5e10686..28f0a66681dd70b640876f0b8960edc866874517
@@@ -160,6 -190,23 +191,24 @@@ do_test hook-4.1.2 
      DELETE main t1 4 \
  ]
  
+ # EVIDENCE-OF: R-61808-14344 The sqlite3_update_hook() interface does
+ # not fire callbacks for changes to a WITHOUT ROWID table.
+ #
+ # EVIDENCE-OF: R-33257-44249 The update hook is not invoked when WITHOUT
+ # ROWID tables are modified.
+ #
++breakpoint
+ do_test hook-4.1.2w {
+   set ::update_hook {}
+   execsql {
+     INSERT INTO t1w VALUES(4, 'four');
+     DELETE FROM t1w WHERE b = 'two';
+     UPDATE t1w SET b = '' WHERE a = 1 OR a = 3;
+     DELETE FROM t1w WHERE 1; -- Avoid the truncate optimization (for now)
+   }
+   set ::update_hook
+ } {}
  ifcapable trigger {
    # Update hook is not invoked for changes to sqlite_master
    #