From: drh Date: Wed, 27 Nov 2013 21:53:51 +0000 (+0000) Subject: Merge all recent trunk changes. X-Git-Tag: version-3.13.0~148^2~169 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5b8d1ab454ca2fdc1cb0a5946d3307d23ec8bbb4;p=thirdparty%2Fsqlite.git Merge all recent trunk changes. FossilOrigin-Name: 3a2a1bd47875e114d8e6f31c1768908f401d2861 --- 5b8d1ab454ca2fdc1cb0a5946d3307d23ec8bbb4 diff --cc manifest index 271132e76b,2b11db792d..ee7e6c8dc2 --- a/manifest +++ 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 c76da8bbba,d8103977d6..b00a655abf --- a/manifest.uuid +++ b/manifest.uuid @@@ -1,1 -1,1 +1,1 @@@ - fc9ae839569eb28eb734c52d95676c59b2e27494 -81891288d9f281cf2ceb4cd701c0c3231b1bab19 ++3a2a1bd47875e114d8e6f31c1768908f401d2861 diff --cc src/vdbe.c index 765d5eb224,8ae4ce484c..908e5bcb39 --- a/src/vdbe.c +++ b/src/vdbe.c @@@ -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 ){ @@@ -4113,8 -4074,13 +4104,8 @@@ 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; } @@@ -4148,12 -4108,7 +4139,11 @@@ case OP_Delete: { i64 iKey; VdbeCursor *pC; + const char *zDb; + Table *pTab; + int opflags; + opflags = pOp->p2; - iKey = 0; assert( pOp->p1>=0 && pOp->p1nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); @@@ -4171,44 -4126,17 +4161,43 @@@ rc = sqlite3VdbeCursorMoveto(pC); if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error; + /* 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->isTable ); - assert( pC->rowidIsValid ); /* lastRowid set by previous OP_NotFound */ ++ assert( pC->rowidIsValid || !HasRowid(pOp->p4.pTab) ); + iKey = pC->lastRowid; + zDb = db->aDb[pC->iDb].zName; + pTab = pOp->p4.pTab; - } ++ } + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + /* Invoke the pre-update-hook if required. */ - if( db->xPreUpdateCallback && pOp->p4.z ){ ++ 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 612c0b9ef8,d512562174..976a4125eb --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@@ -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 09fc9e8678,de6fbdd254..28f0a66681 --- a/test/hook.test +++ b/test/hook.test @@@ -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 #