- 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
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
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
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
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
- fc9ae839569eb28eb734c52d95676c59b2e27494
-81891288d9f281cf2ceb4cd701c0c3231b1bab19
++3a2a1bd47875e114d8e6f31c1768908f401d2861
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 * * * * *
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);
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
#