]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge recent performance enhancements and the CAST operator enhancements
authordrh <drh@noemail.net>
Tue, 26 Aug 2014 02:15:07 +0000 (02:15 +0000)
committerdrh <drh@noemail.net>
Tue, 26 Aug 2014 02:15:07 +0000 (02:15 +0000)
into the sessions branch.

FossilOrigin-Name: 08ae974ac80fabe53f515bbbd93ccf55de8ee671

1  2 
manifest
manifest.uuid
src/main.c
src/sqliteInt.h
src/vdbe.c
src/vdbeInt.h
src/vdbeapi.c
src/vdbeaux.c
src/vdbeblob.c

diff --cc manifest
index f47a3f4e0f9594c0f4daac7b31e337d6ad057e5d,a75c4cd6f732dab803c4316a1680715c9ae7eaf8..1ee12f681d727e957793ff281156539f16008de9
+++ b/manifest
@@@ -1,9 -1,9 +1,9 @@@
- C Merge\sall\srecent\strunk\schanges,\sespecially\sthe\sfix\sfor\nticket\s[369d57fb8e5ccdff06f1],\sbut\salso\sthe\sskip-scan\simprovement\sand\nperformance\simprovements\sin\sthe\sb-tree\scode.
- D 2014-08-21T16:09:36.975
 -C Add\san\sassert()\sand\sfive\stestcase()\smacros\sto\sthe\sOP_Cast\sopcode\simplementation\nto\shelp\sverify\sthat\sit\sis\sfully\stested.
 -D 2014-08-25T22:37:19.150
++C Merge\srecent\sperformance\senhancements\sand\sthe\sCAST\soperator\senhancements\ninto\sthe\ssessions\sbranch.
++D 2014-08-26T02:15:07.293
  F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 -F Makefile.in 5eb79e334a5de69c87740edd56af6527dd219308
 +F Makefile.in d5ad373b7a23525414b8843b3084cf90c560d92f
  F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
 -F Makefile.msc 5b04e657cf08a9ac7fc47d876c5c8be962c47d6b
 +F Makefile.msc f1bbf555916b6e60887d86cea62f27e6a26cdb24
  F Makefile.vxworks 034289efa9d591b04b1a73598623119c306cbba0
  F README.md 64f270c43c38c46de749e419c22f0ae2f4499fe8
  F VERSION 53a0b870e7f16d3b06623c31d233a304c163a6af
@@@ -192,22 -176,22 +192,22 @@@ F src/callback.c b97d0695ffcf6a8710ee44
  F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
  F src/ctime.c 0231df905e2c4abba4483ee18ffc05adc321df2a
  F src/date.c 593c744b2623971e45affd0bde347631bdfa4625
 -F src/delete.c 5adcd322c6b08fc25d215d780ca62cebce66304d
 +F src/delete.c cb7a757eb829ebb046c66f6399435c6636fe1314
- F src/expr.c f749009cf4a8534efb5e0d5cd7c9fb1fb0f2836c
+ F src/expr.c 358634f4ddeeb4e69643cb6db5819104a7834c60
  F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
- F src/fkey.c 8545f3b36da47473e10800ea4fb0810fd4062514
+ F src/fkey.c 8d81a780ad78d16ec9082585758a8f1d6bf02ca3
  F src/func.c bbb724b74ed96ca42675a7274646a71dd52bcda7
  F src/global.c 1e4bd956dc2f608f87d2a929abc4a20db65f30e4
- F src/hash.c d139319967164f139c8d1bb8a11b14db9c4ba3cd
- F src/hash.h 8890a25af81fb85a9ad7790d32eedab4b994da22
+ F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5
+ F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094
  F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08
 -F src/insert.c d1a104e67b33314d4cc5c1356147446086ab9fc8
 +F src/insert.c 3d41db1398a5863c4a1c064d2082d0dc43274628
  F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d
- F src/legacy.c febc2a9e7ad6c1a6191c7b5b9170b325d263f343
+ F src/legacy.c 87c92f4a08e2f70220e3b22a9c3b2482d36a134a
  F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b
- F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303
- F src/main.c 7f8200240d0ca790804b04deeca9f2461013355e
- F src/malloc.c 0203ebce9152c6a0e5de520140b8ba65187350be
+ F src/loadext.c 31c2122b7dd05a179049bbf163fd4839f181cbab
 -F src/main.c 900dd06e41d22795cbb23ab0240397f1e2901bf7
++F src/main.c f375a8d81960b5ff3a7a765e1367b0d0cd90f222
+ F src/malloc.c 954de5f998c23237e04474a3f2159bf483bba65a
  F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
  F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b
  F src/mem2.c dce31758da87ec2cfa52ba4c5df1aed6e07d8e8f
@@@ -240,11 -224,11 +240,11 @@@ F src/random.c d10c1f85b6709ca97278428f
  F src/resolve.c 0ea356d32a5e884add23d1b9b4e8736681dd5697
  F src/rowset.c a9c9aae3234b44a6d7c6f5a3cadf90dce1e627be
  F src/select.c ea48e891406ccdf748f3eb02893e056d134a0fea
 -F src/shell.c 728d2226594d356bf4fbdbdfd08538fd78fd06f3
 -F src/sqlite.h.in ed9d35990c61f0388ca6405706455c4095310553
 +F src/shell.c 34be9dc9e7b96081488acebecae6cd92632397a6
 +F src/sqlite.h.in 021a1f5c50e83060675d994a6014fd409e611d9e
  F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
  F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
- F src/sqliteInt.h d60dbbadfd64374a5a2f362fc6f45899540c2c8e
 -F src/sqliteInt.h d8a9be2aa123a78c90ad4aba09b23e7dd3f8cc9f
++F src/sqliteInt.h 2ecc10cd81d38e8617e24ed425e6ec792195b0f0
  F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
  F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
  F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@@ -295,21 -279,21 +295,21 @@@ F src/test_vfs.c f84075a388527892ff1849
  F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698
  F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
  F src/tokenize.c ae45399d6252b4d736af43bee1576ce7bff86aec
- F src/trigger.c 66f3470b03b52b395e839155786966e3e037fddb
+ F src/trigger.c 4bddd12803275aa98f1c7ce0118fceb02b2167f6
 -F src/update.c ea336ce7b8b3fc5e316ba8f082e6445babf81059
 +F src/update.c b0f38fda25d532343d54b7dc49f55ab73e92ca45
- F src/utf.c a0314e637768a030e6e84a957d0c4f6ba910cc05
- F src/util.c 3076bdd51cdbf60a6e2e57fada745be37133c73e
+ F src/utf.c 77abb5e6d27f3d236e50f7c8fff1d00e15262359
+ F src/util.c 068dcd26354a3898ccc64ad5c4bdb95a7a15d33a
  F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
- F src/vdbe.c ff9bec31cc128e98d852ebee6e5d4e160846e0c5
 -F src/vdbe.c 2f8fbc520cac2f5bacc43de2aeed6a4880c9cb57
 -F src/vdbe.h c63fad052c9e7388d551e556e119c0bcf6bebdf8
 -F src/vdbeInt.h df58400454823954cfb241e5858f07f37fc1fd78
 -F src/vdbeapi.c cda974083d7597f807640d344ffcf76d872201ce
 -F src/vdbeaux.c dba006f67c9fd1b1d07ee7fb0fb38aa1905161d1
 -F src/vdbeblob.c 848238dc73e93e48432991bb5651bf87d865eca4
++F src/vdbe.c 5e576d164e6cfb8ef1c6324c3d6eca56322fd656
 +F src/vdbe.h ca3b6df299adce6e2f499c57e42ae54f142ae823
- F src/vdbeInt.h 5eee1752eff410de9373196e2b327f7deefb3920
- F src/vdbeapi.c 11d97cd50ca78f6c6ce796d0c78913ef27f5383d
- F src/vdbeaux.c 22aabbdea2394cea26e35b2190fa9111e4bc18c2
- F src/vdbeblob.c d7c232d1c6afc7ee1176c38b7d81b2e17af15ceb
- F src/vdbemem.c d90a1e8acf8b63dc9d14cbbea12bfec6cec31394
++F src/vdbeInt.h 6a50eb240aac711ac609f624daa225781711c6fd
++F src/vdbeapi.c ce34bb80571f72463dbd45380e3eae65ddc52018
++F src/vdbeaux.c 236cc1afd82ab542fc752ed760471ac816cb7902
++F src/vdbeblob.c d65b01f439df63911ac3d7a9a85c15503965f2c3
+ F src/vdbemem.c 4e08ea087aea367dae7c45129b75487e0056e819
  F src/vdbesort.c f7f5563bf7d4695ca8f3203f3bf9de96d04ed0b3
  F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767
- F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
+ F src/vtab.c 019dbfd0406a7447c990e1f7bd1dfcdb8895697f
  F src/wal.c 264df50a1b33124130b23180ded2e2c5663c652a
  F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
  F src/walker.c 11edb74d587bc87b33ca96a5173e3ec1b8389e45
@@@ -1205,7 -1188,7 +1205,7 @@@ F tool/vdbe_profile.tcl 67746953071a9f8
  F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
  F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
  F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
- P 6d5b9332e8d8bb572ac98b0f4e47e59ad12aac26 7029b3404d3f5f698a496934f3a3f2972051b257
- R a953db417f3d0f990497f5e1512b276c
 -P 1ad70ec550c004160d9c0c57e6c416812cdead5e
 -R b751a4133861a7b502aa405ba96eea49
++P 0b9e2c3269695713b538561d999c68097db70f0c af364cce9da0961593ef876b646197f82df08ad5
++R 7c6d04c5134339ec2be8d6e1d0b0aa83
  U drh
- Z d706f9a9d70b2e75b205ef1091dd3b5f
 -Z 0bd8a75e39f468a6e4b9b4599a579487
++Z 9ac7a7803f5fd67d6db4d00d2f3fd4ea
diff --cc manifest.uuid
index 523d250c73af0ac19f49c47910661ae77749e695,c36f309914dde001766de24ef7b98aa7ce57cfb0..796f45da2d2b7226a6a8fd4e1ece6e8b88c7dd12
@@@ -1,1 -1,1 +1,1 @@@
- 0b9e2c3269695713b538561d999c68097db70f0c
 -af364cce9da0961593ef876b646197f82df08ad5
++08ae974ac80fabe53f515bbbd93ccf55de8ee671
diff --cc src/main.c
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 0631fce87fb31b16e8d596d9749f74f891e81d59,b2d805915337e40af0f7eaf1cc48059f314205a0..85cbd7203773f52672a343d2b4f19dce6efca7a5
@@@ -1355,184 -1365,3 +1365,184 @@@ int sqlite3_stmt_status(sqlite3_stmt *p
    if( resetFlag ) pVdbe->aCounter[op] = 0;
    return (int)v;
  }
-   sqlite3Error(db, rc, 0);
 +
 +#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);
 +    }
 +  }
 +
 + preupdate_old_out:
-   sqlite3Error(db, rc, 0);
++  sqlite3Error(db, rc);
 +  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);
 +      }
 +    }
 +  }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;
 +      }
 +    }
 +  }
 +  *ppValue = pMem;
 +
 + preupdate_new_out:
++  sqlite3Error(db, rc);
 +  return sqlite3ApiExit(db, rc);
 +}
 +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
diff --cc src/vdbeaux.c
Simple merge
diff --cc src/vdbeblob.c
Simple merge