]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge in all recent preformance enhancements from trunk.
authordrh <drh@noemail.net>
Sat, 14 Dec 2013 18:24:46 +0000 (18:24 +0000)
committerdrh <drh@noemail.net>
Sat, 14 Dec 2013 18:24:46 +0000 (18:24 +0000)
FossilOrigin-Name: 32477642d79615fb85680bdac812ad9655cf6902

13 files changed:
1  2 
Makefile.in
Makefile.msc
main.mk
manifest
manifest.uuid
src/main.c
src/sqlite.h.in
src/sqliteInt.h
src/vdbe.c
src/vdbeInt.h
src/vdbeapi.c
src/vdbeaux.c
test/tester.tcl

diff --cc Makefile.in
Simple merge
diff --cc Makefile.msc
Simple merge
diff --cc main.mk
Simple merge
diff --cc manifest
index 6a877d835f1e14eaa003703c2c6134fe7dcdd9ee,92e7b53f9fb2ccee803c033a92086f2894e37fff..464679b544224f93ba5a704d93342c3e54fe0f82
+++ b/manifest
@@@ -1,12 -1,12 +1,12 @@@
- C Update\sto\sthe\s3.8.2\srelease.
- D 2013-12-06T15:49:45.770
 -C Allow\sthe\sSQLITE_DETERMINISTIC\sflag\sto\sbe\sORed\sinto\sthe\spreferred\stext\sencoding\nof\sapplication-defined\sfunctions,\sto\smark\sthe\sfunction\sas\sdeterministic.
 -D 2013-12-14T13:44:22.886
++C Merge\sin\sall\srecent\spreformance\senhancements\sfrom\strunk.
++D 2013-12-14T18:24:46.659
  F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
- F Makefile.in 06b851f767034811d4f6e159367c453dc28d3925
 -F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
++F Makefile.in e4ee6d36cdf6136aee0158675a3b24dd3bf31a5a
  F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
- F Makefile.msc 6a5de96f1aa7295af16da686c8248fea9e0a694c
 -F Makefile.msc 4d4ead6b71d1bf03028fbd61da0ba0ec5e1556e1
++F Makefile.msc 043280f9ca15befa7236484a6c1448d9271abd73
  F Makefile.vxworks db21ed42a01d5740e656b16f92cb5d8d5e5dd315
  F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6
- F VERSION 52f7e22bfcec71a462e34194b4ae1671380fde59
+ F VERSION 8ed548d87d0a27fd7d7620476f9e25f9fa742d73
  F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
  F addopcodes.awk 87ca612393d0f439550634bd2c156ea9ff6195ae
  F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
@@@ -156,7 -142,7 +156,7 @@@ F ext/session/test_session.c d38968307c
  F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x
  F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8
  F magic.txt f439556c5ce01ced70987e5ee86549a45165d9ff
- F main.mk a0a333b9ec8d5156c0b8f1a9e91da883a1890cfe
 -F main.mk 9f091ea7920f8b15e48c7b6e5b6fb0182577ab2e
++F main.mk 3cbbebc94dfb328e26647e13be242ded25b7e17f
  F mkdll.sh 7d09b23c05d56532e9d44a50868eb4b12ff4f74a
  F mkextu.sh 416f9b7089d80e5590a29692c9d9280a10dbad9f
  F mkextw.sh d2a981497b404d6498f5ff3e3b1f3816bdfcb338
@@@ -202,8 -188,8 +202,8 @@@ F src/journal.c b4124532212b6952f42eb2c
  F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12
  F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b
  F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303
- F src/main.c f432ac8a820b4b9fbfd41c40c686f8d971791abe
- F src/malloc.c 543a8eb5508eaf4cadf55a9b503379eba2088128
 -F src/main.c 45e08d8ca4808625c4512a14898e9c61553e3d2a
++F src/main.c 292a67f4f803068ce5d160cfe76c052d8713e045
+ F src/malloc.c 0203ebce9152c6a0e5de520140b8ba65187350be
  F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
  F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b
  F src/mem2.c dce31758da87ec2cfa52ba4c5df1aed6e07d8e8f
@@@ -234,16 -220,16 +234,16 @@@ F src/random.c 0b2dbc37fdfbfa6bd455b091
  F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6
  F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
  F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a
- F src/shell.c 936a72ff784efff3832cce274a96ed0b036e6758
- F src/sqlite.h.in afb55228e32532456938c5c4ac0b9aa0828f3677
+ F src/shell.c 18924f6ccfa70da98bf9e388bab512c0fd1e792e
 -F src/sqlite.h.in 4ef56464aeaa3785a2c5ca37fb3a0fb229d68b2e
++F src/sqlite.h.in 9ccaa04411778b0b3a95df6a9fc9c396b779f0cb
  F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
  F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
- F src/sqliteInt.h f4056513ed1a1690f1ff0ec6df15b38581676f2f
 -F src/sqliteInt.h 3c1c14a551b019c94e1addcb67d92dd14a62e058
++F src/sqliteInt.h 8c7d6a7f3474c3b487311baeb03ba72120e35716
  F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
  F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
  F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
 -F src/tclsqlite.c 651b10698c87bbc3ae5772e2491e3444c5bbf153
 +F src/tclsqlite.c 758fa6b6cfd39330db8b71b1f94e46f03ef375b8
- F src/test1.c 760e0419705f712d80595f47199568cd7e3b57a4
+ F src/test1.c 633e5e6a116acf4473b9289240bcceb5320a9d93
  F src/test2.c 7355101c085304b90024f2261e056cdff13c6c35
  F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c
  F src/test4.c 9b32d22f5f150abe23c1830e2057c4037c45b3df
@@@ -290,19 -276,19 +290,19 @@@ F src/test_vfstrace.c 3a0ab304682fecbce
  F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
  F src/tokenize.c ec4c1a62b890bf1dbcdb966399e140b904c700a4
  F src/trigger.c d84e1f3669e9a217731a14a9d472b1c7b87c87ba
 -F src/update.c d1c2477dcf14d90999d1935af4efb4806553250b
 +F src/update.c 4ada523da2d315996296456a8e384f11983a9aa0
  F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269
- F src/util.c 76ed0519296e3f62e97e57dab1999e34184c8e49
+ F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c
  F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
- F src/vdbe.c 9c6fb9ed1b9165427b0fdc812bc9c48c031f77da
 -F src/vdbe.c 919422843c859a1db08db0c88189912dbf625fc7
 -F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644
 -F src/vdbeInt.h a7bc268f844d75be48bb7ae16f77b418fd3c641c
 -F src/vdbeapi.c ce4e68ea4842cc6081046f533d088dcf01d247ad
 -F src/vdbeaux.c a22cbd91b24503b82690cb03324ffec9f4ef63f6
 -F src/vdbeblob.c 8cd05a5630e6d5563ad017bf82edaf812b28acde
++F src/vdbe.c d8df062f9b24a5cb83348ca2c14ff211a321a092
 +F src/vdbe.h b7bfa7b468fcad2cf1890969fe7459325da00385
- F src/vdbeInt.h 1a5c604f33a5d46c839fee0cab16743aa3e1bc2e
- F src/vdbeapi.c e80d6d9dea792bd823cb64ae05cba446a7b3556a
- F src/vdbeaux.c e3228efe9460dccdc92a0ef4f38a7147166226da
++F src/vdbeInt.h 062d6e86551ffad25056f3e154fbe5a02e4d8cce
++F src/vdbeapi.c 647d65813a5595c7f667b9f43d119ecd8d70be08
++F src/vdbeaux.c 0ee1dc808fe245bc85988c12478582d666351330
 +F src/vdbeblob.c a2809461743e0b9dd9be871149ac65e8d2c80c08
- F src/vdbemem.c 20e349d2ca928802fc8f2d42a2cc488fd6981d3f
+ F src/vdbemem.c 0e69351b2c6ff7d8b638688c0ae336a26befa6b2
  F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147
- F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc
+ F src/vdbetrace.c f7eb148eb3b4fa3401b20024630dcb43d322e73c
  F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
  F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4
  F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
@@@ -855,7 -841,7 +856,7 @@@ F test/tclsqlite.test a7308276aad2e6c0b
  F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c
  F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30
  F test/temptrigger.test 8ec228b0db5d7ebc4ee9b458fc28cb9e7873f5e1
- F test/tester.tcl f1316f88470a06db624fae39d5279ce21ed49652
 -F test/tester.tcl 08e9f317afe60d398fa900993503ecaef3295bad
++F test/tester.tcl 1b1ba4c0f5e7f76c7c74dbb8a20ad9f72a3f46f0
  F test/thread001.test 9f22fd3525a307ff42a326b6bc7b0465be1745a5
  F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58
  F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7
@@@ -1154,13 -1140,13 +1155,13 @@@ F tool/speedtest8inst1.c 293327bc76823f
  F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c
  F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43
  F tool/symbols-mingw.sh 4dbcea7e74768305384c9fd2ed2b41bbf9f0414d
 -F tool/symbols.sh fec58532668296d7c7dc48be9c87f75ccdb5814f
 +F tool/symbols.sh c5a617b8c61a0926747a56c65f5671ef8ac0e148
  F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
- F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
+ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891
  F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
  F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
  F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
- P a2914d6b17358de05eb39f764c0c13d2d4cf8f3b 27392118af4c38c5203a04b8013e1afdb1cebd0d
- R 69ae16677deb75edc22ded28f7bb30e5
 -P bc5febef921bd12ca7760e9d07d3be0e67140320
 -R 08fd6b0f6ffb77c364a2bec4efb57810
++P e579661a7950fe9f8eb10012946100c874ba54b0 5716fc2341ddd8cf64139e7168597f864da4e10b
++R 44ea540ed51c079699ffafd30e405197
  U drh
- Z 5c635bf114a19e035a1d251cc9d8650c
 -Z d2313ea9b793ebbfa6428f7e8b022d58
++Z a4d623448ba4efed34874461e572fbbf
diff --cc manifest.uuid
index 08ac41ad9506534ec5ca06f27f2303c48ce5c215,0d64591d7bbff8e7c3c5336ad8b61d5e1064b9b5..75bdc105ef96f9a1fe8863f8c7d90cda669aebdd
@@@ -1,1 -1,1 +1,1 @@@
- e579661a7950fe9f8eb10012946100c874ba54b0
 -5716fc2341ddd8cf64139e7168597f864da4e10b
++32477642d79615fb85680bdac812ad9655cf6902
diff --cc src/main.c
Simple merge
diff --cc src/sqlite.h.in
Simple merge
diff --cc src/sqliteInt.h
Simple merge
diff --cc src/vdbe.c
Simple merge
diff --cc src/vdbeInt.h
Simple merge
diff --cc src/vdbeapi.c
index 976a4125eb1b8b6356c1931f6a5220aab004ee3d,ea383dffda35b60c88b28fdb2f4d8a3c23000fe4..080eee3fedc9aebbc523d198c36f5883f8b7446d
@@@ -1315,186 -1317,3 +1316,187 @@@ int sqlite3_stmt_status(sqlite3_stmt *p
    if( resetFlag ) pVdbe->aCounter[op] = 0;
    return (int)v;
  }
 +
 +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
 +/*
 +** Allocate and populate an UnpackedRecord structure based on the serialized
 +** record in nKey/pKey. Return a pointer to the new UnpackedRecord structure
 +** if successful, or a NULL pointer if an OOM error is encountered.
 +*/
 +static UnpackedRecord *vdbeUnpackRecord(
 +  KeyInfo *pKeyInfo, 
 +  int nKey, 
 +  const void *pKey
 +){
 +  char *dummy;                    /* Dummy argument for AllocUnpackedRecord() */
 +  UnpackedRecord *pRet;           /* Return value */
 +
 +  pRet = sqlite3VdbeAllocUnpackedRecord(pKeyInfo, 0, 0, &dummy);
 +  if( pRet ){
++    memset(pRet->aMem, 0, sizeof(Mem)*(pKeyInfo->nField+1));
 +    sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, pRet);
 +  }
 +  return pRet;
 +}
 +
 +/*
 +** This function is called from within a pre-update callback to retrieve
 +** a field of the row currently being updated or deleted.
 +*/
 +int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){
 +  PreUpdate *p = db->pPreUpdate;
 +  int rc = SQLITE_OK;
 +
 +  /* Test that this call is being made from within an SQLITE_DELETE or
 +  ** SQLITE_UPDATE pre-update callback, and that iIdx is within range. */
 +  if( !p || p->op==SQLITE_INSERT ){
 +    rc = SQLITE_MISUSE_BKPT;
 +    goto preupdate_old_out;
 +  }
 +  if( iIdx>=p->pCsr->nField || iIdx<0 ){
 +    rc = SQLITE_RANGE;
 +    goto preupdate_old_out;
 +  }
 +
 +  /* If the old.* record has not yet been loaded into memory, do so now. */
 +  if( p->pUnpacked==0 ){
 +    u32 nRec;
 +    u8 *aRec;
 +
 +    rc = sqlite3BtreeDataSize(p->pCsr->pCursor, &nRec);
 +    if( rc!=SQLITE_OK ) goto preupdate_old_out;
 +    aRec = sqlite3DbMallocRaw(db, nRec);
 +    if( !aRec ) goto preupdate_old_out;
 +    rc = sqlite3BtreeData(p->pCsr->pCursor, 0, nRec, aRec);
 +    if( rc==SQLITE_OK ){
 +      p->pUnpacked = vdbeUnpackRecord(&p->keyinfo, nRec, aRec);
 +      if( !p->pUnpacked ) rc = SQLITE_NOMEM;
 +    }
 +    if( rc!=SQLITE_OK ){
 +      sqlite3DbFree(db, aRec);
 +      goto preupdate_old_out;
 +    }
 +    p->aRecord = aRec;
 +  }
 +
 +  if( iIdx>=p->pUnpacked->nField ){
 +    *ppValue = (sqlite3_value *)columnNullValue();
 +  }else{
 +    *ppValue = &p->pUnpacked->aMem[iIdx];
 +    if( iIdx==p->iPKey ){
 +      sqlite3VdbeMemSetInt64(*ppValue, p->iKey1);
 +    }
 +    sqlite3VdbeMemStoreType(*ppValue);
 +  }
 +
 + preupdate_old_out:
 +  sqlite3Error(db, rc, 0);
 +  return sqlite3ApiExit(db, rc);
 +}
 +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
 +
 +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
 +/*
 +** This function is called from within a pre-update callback to retrieve
 +** the number of columns in the row being updated, deleted or inserted.
 +*/
 +int sqlite3_preupdate_count(sqlite3 *db){
 +  PreUpdate *p = db->pPreUpdate;
 +  return (p ? p->keyinfo.nField : 0);
 +}
 +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
 +
 +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
 +/*
 +** This function is designed to be called from within a pre-update callback
 +** only. It returns zero if the change that caused the callback was made
 +** immediately by a user SQL statement. Or, if the change was made by a
 +** trigger program, it returns the number of trigger programs currently
 +** on the stack (1 for a top-level trigger, 2 for a trigger fired by a 
 +** top-level trigger etc.).
 +**
 +** For the purposes of the previous paragraph, a foreign key CASCADE, SET NULL
 +** or SET DEFAULT action is considered a trigger.
 +*/
 +int sqlite3_preupdate_depth(sqlite3 *db){
 +  PreUpdate *p = db->pPreUpdate;
 +  return (p ? p->v->nFrame : 0);
 +}
 +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
 +
 +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK
 +/*
 +** This function is called from within a pre-update callback to retrieve
 +** a field of the row currently being updated or inserted.
 +*/
 +int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){
 +  PreUpdate *p = db->pPreUpdate;
 +  int rc = SQLITE_OK;
 +  Mem *pMem;
 +
 +  if( !p || p->op==SQLITE_DELETE ){
 +    rc = SQLITE_MISUSE_BKPT;
 +    goto preupdate_new_out;
 +  }
 +  if( iIdx>=p->pCsr->nField || iIdx<0 ){
 +    rc = SQLITE_RANGE;
 +    goto preupdate_new_out;
 +  }
 +
 +  if( p->op==SQLITE_INSERT ){
 +    /* For an INSERT, memory cell p->iNewReg contains the serialized record
 +    ** that is being inserted. Deserialize it. */
 +    UnpackedRecord *pUnpack = p->pNewUnpacked;
 +    if( !pUnpack ){
 +      Mem *pData = &p->v->aMem[p->iNewReg];
 +      rc = sqlite3VdbeMemExpandBlob(pData);
 +      if( rc!=SQLITE_OK ) goto preupdate_new_out;
 +      pUnpack = vdbeUnpackRecord(&p->keyinfo, pData->n, pData->z);
 +      if( !pUnpack ){
 +        rc = SQLITE_NOMEM;
 +        goto preupdate_new_out;
 +      }
 +      p->pNewUnpacked = pUnpack;
 +    }
 +    if( iIdx>=pUnpack->nField ){
 +      pMem = (sqlite3_value *)columnNullValue();
 +    }else{
 +      pMem = &pUnpack->aMem[iIdx];
 +      if( iIdx==p->iPKey ){
 +        sqlite3VdbeMemSetInt64(pMem, p->iKey2);
 +      }
 +      sqlite3VdbeMemStoreType(pMem);
 +    }
 +  }else{
 +    /* For an UPDATE, memory cell (p->iNewReg+1+iIdx) contains the required
 +    ** value. Make a copy of the cell contents and return a pointer to it.
 +    ** It is not safe to return a pointer to the memory cell itself as the
 +    ** caller may modify the value text encoding.
 +    */
 +    assert( p->op==SQLITE_UPDATE );
 +    if( !p->aNew ){
 +      p->aNew = (Mem *)sqlite3DbMallocZero(db, sizeof(Mem) * p->pCsr->nField);
 +      if( !p->aNew ){
 +        rc = SQLITE_NOMEM;
 +        goto preupdate_new_out;
 +      }
 +    }
 +    assert( iIdx>=0 && iIdx<p->pCsr->nField );
 +    pMem = &p->aNew[iIdx];
 +    if( pMem->flags==0 ){
 +      if( iIdx==p->iPKey ){
 +        sqlite3VdbeMemSetInt64(pMem, p->iKey2);
 +      }else{
 +        rc = sqlite3VdbeMemCopy(pMem, &p->v->aMem[p->iNewReg+1+iIdx]);
 +        if( rc!=SQLITE_OK ) goto preupdate_new_out;
 +      }
 +      sqlite3VdbeMemStoreType(pMem);
 +    }
 +  }
 +  *ppValue = pMem;
 +
 + preupdate_new_out:
 +  sqlite3Error(db, rc, 0);
 +  return sqlite3ApiExit(db, rc);
 +}
 +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
diff --cc src/vdbeaux.c
Simple merge
diff --cc test/tester.tcl
Simple merge