- C Merge\sperformance\senhancements\sand\scompiler\swarning\sfixes\sfrom\strunk.
- D 2013-08-20T13:02:16.832
-C Defer\sthe\screation\sof\sautomatic\sindices\suntil\sthe\sindex\sis\sactually\sused.
-D 2013-08-22T02:56:28.029
++C Merge\sin\sminor\sbug\sfixes\sand\sperformance\stweaks\sfrom\strunk\sleading\sup\sto\nthe\sversion\s3.8.0\srelease.
++D 2013-08-22T15:07:08.266
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
-F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e
+F Makefile.in aff38bc64c582dd147f18739532198372587b0f0
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
-F Makefile.msc e9f41f89111627baaabd95cab4988b8d1c3e47c9
+F Makefile.msc e5cc521bbc9fb09f032f7fef563542da7ac5544a
F Makefile.vxworks db21ed42a01d5740e656b16f92cb5d8d5e5dd315
F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6
F VERSION f135b651727f978b7191bd6fa12c7fc1e13e13ac
F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
F src/ctime.c 4262c227bc91cecc61ae37ed3a40f08069cfa267
F src/date.c 067a81c9942c497aafd2c260e13add8a7d0c7dd4
-F src/delete.c 2317c814866d9aa71fea16b3faf4fdd4d6a49b94
+F src/delete.c 30ed4bc76a1a32c55bf17ac1528c5867aa5502c0
- F src/expr.c 42d8235af422661ab80be097bebca485b33e2e14
+ F src/expr.c 6bab61c757c4c4c94a92e98d507025d5d18afd3c
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
F src/fkey.c 914a6bbd987d857c41ac9d244efa6641f36faadb
- F src/func.c 5c50c1ea31fd864b0fe921fe1a8d4c55acd609ef
+ F src/func.c d7be77897c91d5b9887beb372f1e6deb515c92af
F src/global.c 5caf4deab621abb45b4c607aad1bd21c20aac759
F src/hash.c ac3470bbf1ca4ae4e306a8ecb0fdf1731810ffe4
F src/hash.h 8890a25af81fb85a9ad7790d32eedab4b994da22
F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
F src/select.c 8b148eb851f384412aea57091659d14b369918ca
F src/shell.c 1c317a4c96d61d8d9fdad9fd1811d9b10b8c7f57
-F src/sqlite.h.in bd1451ba1ab681022a53bccc3c39580ba094a3ff
+F src/sqlite.h.in dcca940021f8f6643630fb7711bfd4e3fa002566
F src/sqlite3.rc fea433eb0a59f4c9393c8e6d76a6e2596b1fe0c0
F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
- F src/sqliteInt.h a24a7f54dd59e8f59d67f7ab0682b5c22f554855
-F src/sqliteInt.h 124e4b19cd5533116909ccf203bdcdd04a28f99a
++F src/sqliteInt.h 93fe5b4c6234942cb9ca14fc25ad634d0e2ff775
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
F src/utf.c 8d819e2e5104a430fc2005f018db14347c95a38f
F src/util.c f566b5138099a2df8533b190d0dcc74b7dfbe0c9
F src/vacuum.c d9c5759f4c5a438bb43c2086f72c5d2edabc36c8
- F src/vdbe.c 76502f0813c3ecf1a54611fc5262c8bc77a54fb7
-F src/vdbe.c d37aee2c89e2a589f2b1599e0178eb17a08a3ccb
-F src/vdbe.h 4f554b5627f26710c4c36d919110a3fc611ca5c4
-F src/vdbeInt.h cbe71b8b36d8b3bba5709cc3f436c7e3b47b7b08
-F src/vdbeapi.c 96b24b946cf21894f63d9393e821baa2f0a80979
-F src/vdbeaux.c c7fe2695e256dbf254113c4fe90d3ec9aabe3bbe
-F src/vdbeblob.c 5dc79627775bd9a9b494dd956e26297946417d69
++F src/vdbe.c 08a46d04e5bdfd95884664eeeb8fbe5e4de426ee
+F src/vdbe.h 7aa3ab6210a68471c8490dedfc9aa4ef5684b9a0
+F src/vdbeInt.h 9bf236dc477fb8f1f54b078cf80064663f8a409a
+F src/vdbeapi.c ae87d198eb3ce67c02886601baee0fd478092076
- F src/vdbeaux.c 6549864e5fffa3d04941551610e4800de72e1be9
++F src/vdbeaux.c 20ec92cdc43374b6537fbd7bc2cf7a28967bbe44
+F src/vdbeblob.c 1268e0bcb8e21fa32520b0fc376e1bcdfaa0c642
- F src/vdbemem.c 833005f1cbbf447289f1973dba2a0c2228c7b8ab
+ F src/vdbemem.c 61d5ddb8e4d4e14f625062bf5bcc7ce08bb20af3
F src/vdbesort.c 3937e06b2a0e354500e17dc206ef4c35770a5017
F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc
- F src/vtab.c 2e8b489db47e20ae36cd247932dc671c9ded0624
+ F src/vtab.c 165ce0e797c2cd23badb104c9f2ae9042d6d942c
F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
F src/walker.c 4fa43583d0a84b48f93b1e88f11adf2065be4e73
F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae
F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
- P 67587a3348b84424b2ab1f2df1ea923a5168e2e4 7f72fc4f47445a2c01910b268335873de9f75059
- R 38645eeb23d643e57952026ace84c002
-P 617e23ec283d3147fc3fd29c474ccedf4915cdc7
-R c8cf06f49dffbef3bb0170f8252069c7
++P 3e4033285deb417bd72c008917729dbf3bf4e90d 0775501acf152dcbf4dd039f4511f3d8c4330d85
++R f6e422c39c44105817eb40d9d54618de
U drh
- Z 8d51de2c92073e757664e09f591c4bfa
-Z c5e5b20d4589a0c600c887ab3fa62d4e
++Z f9597afebde4efa08f5ab31e24bede7f
}
}
+ #ifndef SQLITE_OMIT_VIRTUALTABLE
+ /*
+ ** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored
+ ** in memory obtained from sqlite3_malloc) into a Vdbe.zErrMsg (text stored
+ ** in memory obtained from sqlite3DbMalloc).
+ */
+ void sqlite3VtabImportErrmsg(Vdbe *p, sqlite3_vtab *pVtab){
+ sqlite3 *db = p->db;
+ sqlite3DbFree(db, p->zErrMsg);
+ p->zErrMsg = sqlite3DbStrDup(db, pVtab->zErrMsg);
+ sqlite3_free(pVtab->zErrMsg);
+ pVtab->zErrMsg = 0;
+ }
+ #endif /* SQLITE_OMIT_VIRTUALTABLE */
++
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
+
+/*
+** If the second argument is not NULL, release any allocations associated
+** with the memory cells in the p->aMem[] array. Also free the UnpackedRecord
+** structure itself, using sqlite3DbFree().
+**
+** This function is used to free UnpackedRecord structures allocated by
+** the vdbeUnpackRecord() function found in vdbeapi.c.
+*/
+static void vdbeFreeUnpacked(sqlite3 *db, UnpackedRecord *p){
+ if( p ){
+ int i;
+ for(i=0; i<p->nField; i++){
+ Mem *pMem = &p->aMem[i];
+ if( pMem->zMalloc ) sqlite3VdbeMemRelease(pMem);
+ }
+ sqlite3DbFree(db, p);
+ }
+}
+
+/*
+** Invoke the pre-update hook. If this is an UPDATE or DELETE pre-update call,
+** then cursor passed as the second argument should point to the row about
+** to be update or deleted. If the application calls sqlite3_preupdate_old(),
+** the required value will be read from the row the cursor points to.
+*/
+void sqlite3VdbePreUpdateHook(
+ Vdbe *v, /* Vdbe pre-update hook is invoked by */
+ VdbeCursor *pCsr, /* Cursor to grab old.* values from */
+ int op, /* SQLITE_INSERT, UPDATE or DELETE */
+ const char *zDb, /* Database name */
+ Table *pTab, /* Modified table */
+ i64 iKey1, /* Initial key value */
+ int iReg /* Register for new.* record */
+){
+ sqlite3 *db = v->db;
+ i64 iKey2;
+ PreUpdate preupdate;
+ const char *zTbl = pTab->zName;
+ static const u8 fakeSortOrder = 0;
+
+ assert( db->pPreUpdate==0 );
+ memset(&preupdate, 0, sizeof(PreUpdate));
+ if( op==SQLITE_UPDATE ){
+ iKey2 = v->aMem[iReg].u.i;
+ }else{
+ iKey2 = iKey1;
+ }
+
+ assert( pCsr->nField==pTab->nCol
+ || (pCsr->nField==pTab->nCol+1 && op==SQLITE_DELETE && iReg==-1)
+ );
+
+ preupdate.v = v;
+ preupdate.pCsr = pCsr;
+ preupdate.op = op;
+ preupdate.iNewReg = iReg;
+ preupdate.keyinfo.db = db;
+ preupdate.keyinfo.enc = ENC(db);
+ preupdate.keyinfo.nField = pTab->nCol;
+ preupdate.keyinfo.aSortOrder = (u8*)&fakeSortOrder;
+ preupdate.iKey1 = iKey1;
+ preupdate.iKey2 = iKey2;
+ preupdate.iPKey = pTab->iPKey;
+
+ db->pPreUpdate = &preupdate;
+ db->xPreUpdateCallback(db->pPreUpdateArg, db, op, zDb, zTbl, iKey1, iKey2);
+ db->pPreUpdate = 0;
+ sqlite3DbFree(db, preupdate.aRecord);
+ vdbeFreeUnpacked(db, preupdate.pUnpacked);
+ vdbeFreeUnpacked(db, preupdate.pNewUnpacked);
+ if( preupdate.aNew ){
+ int i;
+ for(i=0; i<pCsr->nField; i++){
+ sqlite3VdbeMemRelease(&preupdate.aNew[i]);
+ }
+ sqlite3DbFree(db, preupdate.aNew);
+ }
+}
+#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */