]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge performance enhancements and compiler warning fixes from trunk.
authordrh <drh@noemail.net>
Tue, 20 Aug 2013 13:02:16 +0000 (13:02 +0000)
committerdrh <drh@noemail.net>
Tue, 20 Aug 2013 13:02:16 +0000 (13:02 +0000)
FossilOrigin-Name: 3e4033285deb417bd72c008917729dbf3bf4e90d

1  2 
manifest
manifest.uuid
src/vdbe.c
src/vdbeInt.h
src/vdbeapi.c

diff --cc manifest
index 48fcb7f92565a71b842720011594e3895ec5c198,9ad5c805c7f0f720972795582c3fe32707fa12d2..e33c6933067ce9b228e58dcaeaf5ca3d063e061b
+++ b/manifest
@@@ -1,9 -1,9 +1,9 @@@
- C Merge\sin\sall\sthe\slatest\supdates\sand\senhancements\sfrom\strunk.
- D 2013-08-19T12:49:06.766
 -C Performance\soptimizations\sin\sthe\sVDBE\sand\sespecially\sto\sthe\sOP_Next\sand\nrelated\sopcodes\sand\sin\sthe\ssqlite3BtreeNext()\sand\ssqlite3BtreePrevious()\nroutines.\s\sThis\sis\sa\scherrypick\sof\s[6f99b54aedeb],\s[d2efea1682a7],\sand\n[d78c5d89de4b].
 -D 2013-08-20T03:13:51.513
++C Merge\sperformance\senhancements\sand\scompiler\swarning\sfixes\sfrom\strunk.
++D 2013-08-20T13:02:16.832
  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
@@@ -184,8 -171,8 +184,8 @@@ F src/callback.c d7e46f40c3cf53c43550b7
  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 0bbb44462a19169189b2709fbbd800950521b5ae
+ F src/expr.c 42d8235af422661ab80be097bebca485b33e2e14
  F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
  F src/fkey.c 914a6bbd987d857c41ac9d244efa6641f36faadb
  F src/func.c 5c50c1ea31fd864b0fe921fe1a8d4c55acd609ef
@@@ -230,11 -217,11 +230,11 @@@ F src/random.c cd4a67b3953b88019f8cd4cc
  F src/resolve.c 9d53899cc6e1f4ec0b4632d07e97d57827bf63b9
  F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
  F src/select.c 8b148eb851f384412aea57091659d14b369918ca
- F src/shell.c 909f6c4a52c8e0265ce0048e2b3cbadda1bd6051
+ 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 eae58298bc7c9a491ad2fc6c600f534b74be8a11
 +F src/sqliteInt.h a24a7f54dd59e8f59d67f7ab0682b5c22f554855
  F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
  F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
  F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@@ -290,12 -277,12 +290,12 @@@ F src/update.c e3668141dd97010236812392
  F src/utf.c 8d819e2e5104a430fc2005f018db14347c95a38f
  F src/util.c f566b5138099a2df8533b190d0dcc74b7dfbe0c9
  F src/vacuum.c d9c5759f4c5a438bb43c2086f72c5d2edabc36c8
- F src/vdbe.c fab5d86a09f735db4bfd53d977465fa82cd5c213
 -F src/vdbe.c 938feb53407dee2234849aad0f103ae9b941595e
 -F src/vdbe.h 4f554b5627f26710c4c36d919110a3fc611ca5c4
 -F src/vdbeInt.h cbe71b8b36d8b3bba5709cc3f436c7e3b47b7b08
 -F src/vdbeapi.c 96b24b946cf21894f63d9393e821baa2f0a80979
 -F src/vdbeaux.c a6ea36a9dc714e1128a0173249a0532ddcab0489
 -F src/vdbeblob.c 5dc79627775bd9a9b494dd956e26297946417d69
++F src/vdbe.c 76502f0813c3ecf1a54611fc5262c8bc77a54fb7
 +F src/vdbe.h 7aa3ab6210a68471c8490dedfc9aa4ef5684b9a0
- F src/vdbeInt.h cc1974b94efa98ecaec6fa14a2584d7c1e82eadf
- F src/vdbeapi.c c8c433043d14b5e00e2ed6f7e44543bcc92d1594
++F src/vdbeInt.h 9bf236dc477fb8f1f54b078cf80064663f8a409a
++F src/vdbeapi.c ae87d198eb3ce67c02886601baee0fd478092076
 +F src/vdbeaux.c 6549864e5fffa3d04941551610e4800de72e1be9
 +F src/vdbeblob.c 1268e0bcb8e21fa32520b0fc376e1bcdfaa0c642
  F src/vdbemem.c 833005f1cbbf447289f1973dba2a0c2228c7b8ab
  F src/vdbesort.c 3937e06b2a0e354500e17dc206ef4c35770a5017
  F src/vdbetrace.c e7ec40e1999ff3c6414424365d5941178966dcbc
@@@ -727,9 -714,9 +727,9 @@@ F test/pagesize.test 1dd51367e752e742f5
  F test/pcache.test b09104b03160aca0d968d99e8cd2c5b1921a993d
  F test/pcache2.test a83efe2dec0d392f814bfc998def1d1833942025
  F test/percentile.test b98fc868d71eb5619d42a1702e9ab91718cbed54
 -F test/permutations.test 461ef4ea10db02cd421dfe5f988eac3e99b5cd9a
 +F test/permutations.test 742b8005bb3c782797a20beccdbe213ef52531fb
  F test/pragma.test 5e7de6c32a5d764f09437d2025f07e4917b9e178
- F test/pragma2.test 76e4a54cd4677966e4e75f8a7fe86ccbc250de2a
+ F test/pragma2.test 224f0381f9411a78ae685cac24c13656a62021b7
  F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552
  F test/progress.test 552dc1edc37333a8d3098b8c26a2b7f06f5799d7
  F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc
@@@ -1119,7 -1105,10 +1119,7 @@@ F tool/warnings-clang.sh f6aa929dc20ef1
  F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
  F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae
  F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
- P 69d5bed017bda3e184857febcc8b6f6bed6ad228 a0d9ca4f07f1dc3a189864f8ed9cdb0b1d791b1a
- R 144b203c75da112b948140b14b84bcaf
 -P dc65ad8c4c67b21e3b042b8df6580d02b634a90b
 -Q +6f99b54aedeb91e46d52f65504d02a9cc61c0062
 -Q +d2efea1682a7e708000c1f5d36370aaf1199b3be
 -Q +d78c5d89de4b840351b026c9db1952fc24e689d0
 -R 539c71750e964e780f11bfb1b59ee716
++P 67587a3348b84424b2ab1f2df1ea923a5168e2e4 7f72fc4f47445a2c01910b268335873de9f75059
++R 38645eeb23d643e57952026ace84c002
  U drh
- Z e4751f746fc0244a4adaef8846371a84
 -Z feae42d544c0a4532e8cd3cb8461eca6
++Z 8d51de2c92073e757664e09f591c4bfa
diff --cc manifest.uuid
index 965f2035470bb8077cbe5810a4fcbcae00c65e5c,42e61610930402875f8c568d3622e7b7492a8e5b..04e1209cd373e73055d56a60513b18a38e4b6e8f
@@@ -1,1 -1,1 +1,1 @@@
- 67587a3348b84424b2ab1f2df1ea923a5168e2e4
 -7f72fc4f47445a2c01910b268335873de9f75059
++3e4033285deb417bd72c008917729dbf3bf4e90d
diff --cc src/vdbe.c
Simple merge
diff --cc src/vdbeInt.h
Simple merge
diff --cc src/vdbeapi.c
index 7e3ae843f0b52c76e9f234275a9beceb8dd98007,52c6b2a797b4d5c244b8450cdb009382b2de071b..079c6801fbc5692fe0dd9b1df36a3e92111ca4aa
@@@ -1309,190 -1298,7 +1318,190 @@@ sqlite3_stmt *sqlite3_next_stmt(sqlite
  */
  int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){
    Vdbe *pVdbe = (Vdbe*)pStmt;
-   int v = pVdbe->aCounter[op-1];
-   if( resetFlag ) pVdbe->aCounter[op-1] = 0;
-   return v;
+   u32 v = pVdbe->aCounter[op];
+   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 ){
 +    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 */