- C Merge\sthe\slatest\sfixes\sand\senhancements\sfrom\strunk.
- D 2016-01-14T14:48:17.709
- F Makefile.in c61147c9afcc7a058a3a88876a5b9344fce55353
-C Improve\sperformance\sof\ssqlite3VtabImportErrmsg().
-D 2016-01-20T08:47:55.546
-F Makefile.in a476545d0c8626224d0bacac85c6e2967474af81
++C Merge\srecent\senhancements\sfrom\strunk.
++D 2016-01-20T11:33:37.587
++F Makefile.in a47ec69daac0cdfe3413e50ceea6dc8da3dc4ecb
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
- F Makefile.msc d35026ada75f21433cd34be90dc3865972cea6df
-F Makefile.msc 01e855f958932d0d3ed62ec675fc63e2cef61fcb
++F Makefile.msc b4d0270955b3f102214b2242f2a1b802c22ee21b
F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7
F VERSION 866588d1edf0ccb5b0d33896974338f97564f719
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60
- F main.mk 727b093cca39460048ae9948b283063857b04402
-F main.mk 8670f56454bdc59d5e33397bf8c7e43eb33af50c
++F main.mk ad2c0fe02599cf4d58d13776ee57be1e53883909
F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83
F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271
F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504
F src/backup.c 2869a76c03eb393ee795416e2387005553df72bc
F src/bitvec.c 1a78d450a17c5016710eec900bedfc5729bf9bdf
F src/btmutex.c bc87dd3b062cc26edfe79918de2200ccb8d41e73
- F src/btree.c 5d93e2477acb99d50a8b045f2e26a0be3d7751fe
+ F src/btree.c f224ae877fde69d1a9d430f502edaf8502752dbe
F src/btree.h 68ef301795e00cdf1d3ab93abc44a43b7fe771e0
F src/btreeInt.h c18b7d2a3494695133e4e60ee36061d37f45d9a5
- F src/build.c 9d497ff4bf3c82cecb520436e0e9963785627583
- F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0
+ F src/build.c 31af80bba31ac159967951ef58f3144cc7db9d70
+ F src/callback.c 29ae4faba226c7ebb9aee93016b5ce8a8f071261
F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f
F src/ctime.c 60e135af364d777a9ab41c97e5e89cd224da6198
- F src/date.c e4655393bb403fa310eef66cc4583d75d4d7fd93
+ F src/date.c 997651e3ee6c2818fbf7fcdb7156cef9eb3ece20
F src/dbstat.c ffd63fc8ba7541476ced189b95e95d7f2bc63f78
-F src/delete.c 00af9f08a15ddc5cba5962d3d3e5bf2d67b2e7da
+F src/delete.c 86e3940d07fe69a40270c2aaf6ca6c7adf19246c
- F src/expr.c fe55c489362d1429c364e98c877514f4455f45a6
+ F src/expr.c df0d7c3230d59abd679da22ff5ce4cfd0e3a0e63
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
F src/fkey.c e18b3dff7d47c7bcac5ac4fc178a89b9fd322b44
F src/func.c ccaf46fa98f795673afbfab73dff7c18db88f3cd
F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5
F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094
F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
- F src/insert.c a2302c96652242b2d871445c9975a7a849316dcf
-F src/insert.c a00e6d8a843dc22e2c136df04e6300c4528d9b9f
++F src/insert.c 0be969e32a28107a4a7008ea4fe7cb15ff47b0ef
F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e
F src/loadext.c 84996d7d70a605597d79c1f1d7b2012a5fd34f2b
- F src/main.c a88a45514be79e5f48b5cf4a147956f267425fa7
- F src/malloc.c 8f787669e79de26efc42272b5797bc00fff527c6
-F src/main.c b686dabe9a7ece9121da87120d5c7bf402d77eb3
++F src/main.c c7d4a1858446db5f611891ddce62572b1fdec040
+ F src/malloc.c b67c26c359c13836d370350b3f43d228dff5b360
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c 6919bcf12f221868ea066eec27e579fed95ce98b
F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3
F src/pcache.c 73895411fa6b7bd6f0091212feabbe833b358d23
F src/pcache.h 4d0ccaad264d360981ec5e6a2b596d6e85242545
F src/pcache1.c 72f644dc9e1468c72922eff5904048427b817051
- F src/pragma.c f3e7147299ca05ef4304a36f1fd6e002729c72c6
+ F src/pragma.c ea290193369faa0a26ae2f924e7b86289b4a7987
F src/pragma.h 64c78a648751b9f4f297276c4eb7507b14b4628c
- F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1
+ F src/prepare.c 74855ddbdfad6a1c4a4d5c4b0913ebb01174ba19
F src/printf.c af589a27b7d40f6f4f704e9eea99f02f18ad6d32
F src/random.c ba2679f80ec82c4190062d756f22d0c358180696
- F src/resolve.c a83b41104e6ff69855d03cd0aaa09e93927ec39f
+ F src/resolve.c 9f7ce3a3c087afb7597b7c916c99126ff3f12f0c
F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e
- F src/select.c 5b0f2aa9f73ec7b65d1711d485471854d5bad23c
+ F src/select.c 718954db86277d696c520fe671148db1e9c4ed3c
-F src/shell.c dcd7a83645ef2a58ee9c6d0ea4714d877d7835c4
-F src/sqlite.h.in 214476a62012e578f42133a9a3b4f97a9aa421a3
+F src/shell.c 01e109c27300379b1c35b254cd294cde635f0179
+F src/sqlite.h.in bb645ccc4090a6e95e7b5d92818f46e41033d076
F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
F src/sqlite3ext.h dfbe62ffd95b99afe2140d8c35b180d11924072d
- F src/sqliteInt.h 09f70fe715a74ea0048ae05526f2a1b6e3a3b6a2
-F src/sqliteInt.h 8c1debffeeb1579bdc264d54c72c05892e23b7ee
++F src/sqliteInt.h cf3ca8ec73daef3b744d41663e124c2275fb6f26
F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46
F src/status.c 70912d7be68e9e2dbc4010c93d344af61d4c59ba
F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e
F src/threads.c bbfb74450643cb5372a43ad4f6cffd7e9dfcecb0
F src/tokenize.c 5606871a377f390af7040ec3c12e0d183512d785
F src/treeview.c 78842e90c1f71269e7a73a1d4221b6fe360bab66
- F src/trigger.c de3ed31ad3218a20d7d7e18bf1b3b734e78bda66
+ F src/trigger.c 056e51182a3677434423e3be0c74e61b90b4a663
-F src/update.c 17332f9fe818cbc0444c36a811800af8498af4c3
+F src/update.c d8d675aa299336ac086ad2039d7e812cd6237db0
F src/utf.c 32d7f82aa921322f3e1c956f4b58f019ebd2c6b3
F src/util.c e802e8e311a0d6c48cd1b3e89db164f6f0248d70
F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701
- F src/vdbe.c 9b4da74dbc1554045c69dacbbceb373272d2e0be
- F src/vdbe.h bfe3f80dba435377cdb64fd917f2529f0f48ab77
-F src/vdbe.c b90d9d38e5e0260c2eafa3cb4c2274d8ea94da27
-F src/vdbe.h 7a733ea8aac1b77305a67698e784fa3484ee3337
-F src/vdbeInt.h 42eefa4f9e7432b9968d321b44e48821ec13b189
-F src/vdbeapi.c ffae8f5af4570fbd548504e815e9fb7227f0822e
-F src/vdbeaux.c 07f8f485a6cbc0a62da660f14e303061d45d5cb6
-F src/vdbeblob.c 37c3d11a753e403698c69e17383d282e1ae73e75
-F src/vdbemem.c b9181e77eca2a095929d46250daf85c8d2621fc0
++F src/vdbe.c 1443ca69877410c90ba521220d4336d5ef689cdd
++F src/vdbe.h 19162d5d75d00ee9e634ad630f2a873e1cf76359
+F src/vdbeInt.h 1bff4effc71888e3f304e2e6ac7484e39ab78c28
- F src/vdbeapi.c ab2cb8fe23fb9f3195f1311eaa800495d83b6118
- F src/vdbeaux.c 30f329b90af08d92739185788c6fbfd1c233b8b4
- F src/vdbeblob.c cc13eca96b8ec51b6248de785a1aec5df11f5805
- F src/vdbemem.c 25b6cfd665b5073480452426e84136edd94140c0
++F src/vdbeapi.c 75fa852c0d6e7e9c1334aaaa91b6821cba6a713b
++F src/vdbeaux.c 3781db199a8d9376c9512fb7e1304aae7af67dfa
++F src/vdbeblob.c 6ccda01a78b3f9d9a0c75f79e7a1150f3fb0cb39
++F src/vdbemem.c 6c962ee0a77de009dafb6d7f3c7e8bf7b82c47f8
F src/vdbesort.c 0971557e5d3c289e46f56a52aed2197c13251de7
F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0
- F src/vtab.c 2a8b44aa372c33f6154208e7a7f6c44254549806
+ F src/vtab.c 320682cca733115b4cbe71320b5c5eeb1074ebde
F src/vxworks.h 974e7d9a98f602d6310d563e1dc4e08f9fc48e47
F src/wal.c d21b99fd1458159d0b1ecdccc8ee6ada4fdc4c54
F src/wal.h 2f7c831cf3b071fa548bf2d5cac640846a7ff19c
F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98
F test/hexlit.test d7b0a5f41123df1e43985b91b8b2e70f95282d21
F test/hidden.test 23c1393a79e846d68fd902d72c85d5e5dcf98711
- F test/hook.test aa41c095d26822b8a51aa4c82904a14347961be6
-F test/hook.test 162d7cef7a2d2b04839fe14402934e6a1b79442f
++F test/hook.test 40523db3aa76d62bda71c26f824fa0eabc420f0e
F test/icu.test 70df4faca133254c042d02ae342c0a141f2663f4
F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607
F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
- P c4a858b228a164be2f89f5b01833f0b5e0d7735b 8dedff3b9ac3e6bf9c131fee19f7d26dc1ebd61f
- R 99385ae0fdf1facdff7c072dfc1f2a57
-P ff8eadbed5004ab03438f737492387dee6b9750a
-R 9def3e1e6201afa0dc73a868079c61c0
-U dan
-Z 16223910bb7e7f6f85293111cf2f150d
++P 007e5c6df60f9743ac6914332f59925e4a7a861c 18d61c8e40ed1466b6a3a2f53bf0eeb09687c20e
++R 062849fc5c2e599b32ec755e50c1d8e3
+U drh
- Z c131c7ae38d871cc572c248d8ac0f193
++Z 10a2fcf1cf68156c27545982ac8f140d
** 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;
+ if( pVtab->zErrMsg ){
+ 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 */