]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge in various obscure bug fixes and the removal of Mem.memType from trunk.
authordrh <drh@noemail.net>
Wed, 5 Mar 2014 14:49:51 +0000 (14:49 +0000)
committerdrh <drh@noemail.net>
Wed, 5 Mar 2014 14:49:51 +0000 (14:49 +0000)
FossilOrigin-Name: 0828975d580d309a1c66da4b6caeb65b21a01199

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

diff --cc manifest
index 3b11b2b199dcd78bd9ca5d1a775b091d28b4c207,89fddcc445b10925ec5b1f195e22071f769fc6c3..98e2c9e72e3b267ecea45c06afc65164871ad8cd
+++ b/manifest
@@@ -1,11 -1,11 +1,11 @@@
- C Merge\sthe\sperformance\senhancements\sof\strunk\s(and\ssome\sobscure\sbug\sfixes)\ninto\sthe\ssessions\sbranch.
- D 2014-03-04T14:34:14.215
 -C When\sconverting\sa\sresult\stype\sfrom\sTEXT\sto\sBLOB\susing\sthe\nsqlite3_value_blob()\sinterface,\scontinue\sto\sreport\sSQLITE_TEXT\sas\nthe\strue\stype\sfrom\ssqlite3_value_text()\sas\slong\sas\sthat\stext\sis\sstill\nvalid.\s\sThe\smaintains\slegacy\sbehavior\sfrom\sbefore\sthe\snoMemType\schange.
 -D 2014-03-05T14:40:22.888
++C Merge\sin\svarious\sobscure\sbug\sfixes\sand\sthe\sremoval\sof\sMem.memType\sfrom\strunk.
++D 2014-03-05T14:49:51.294
  F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 -F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
 +F Makefile.in e4ee6d36cdf6136aee0158675a3b24dd3bf31a5a
  F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
 -F Makefile.msc fdacba6fb574868c71fde6db6b77789a383a4c19
 +F Makefile.msc b448317831d9c364bf501538becce5cc1f0a0f8b
  F Makefile.vxworks db21ed42a01d5740e656b16f92cb5d8d5e5dd315
- F README.md 64f270c43c38c46de749e419c22f0ae2f4499fe8 w README
+ F README.md 64f270c43c38c46de749e419c22f0ae2f4499fe8
  F VERSION 0dc30ad5cf90736d5fd9e540c9f05c542658abe7
  F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
  F addopcodes.awk 9eb448a552d5c0185cf62c463f9c173cedae3811
@@@ -230,12 -216,12 +230,12 @@@ F src/printf.c 85d07756e45d7496d19439dc
  F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece
  F src/resolve.c 273d5f47c4e2c05b2d3d2bffeda939551ab59e66
  F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
- F src/select.c 780bbf39e401091845ba745a38326eabe5d44293
+ F src/select.c 0adf172d33cc610ff5ffe26edfd2ba67c3551655
  F src/shell.c 7bf07bcacb181ecc3fc3ccacfdfeb4084aee67ed
 -F src/sqlite.h.in a2ef671f92747a5a1c8a47bad5c585a8dd9eca80
 +F src/sqlite.h.in a31c8b7782a0388b4bd823ed3a3a3e4b93b0cf42
  F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
  F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
 -F src/sqliteInt.h bf529055591dd81ec92a84d35dba0854642f6cc2
 +F src/sqliteInt.h 9c34060f8d1aa29006b93838399c86ae9af71156
  F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
  F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
  F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@@ -291,13 -277,13 +291,13 @@@ F src/update.c 7bb549d61efc6853f5cc708c
  F src/utf.c 6dc9ec9f1b3db43ae8ba0365377f11df1ee4c01c
  F src/util.c c46c90459ef9bdc0c6c73803cf4c55425b4771cf
  F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179
- F src/vdbe.c 69e2bd96704c5f56365db050a62430c3f261b611
 -F src/vdbe.c 8c6fc7bb9f2218c0e43f24d847e596effa8671e2
 -F src/vdbe.h d189f92468a17a6f04daeec9df3b767f50557b21
 -F src/vdbeInt.h e54fc4f289fce48e81b3371128446033d097733b
 -F src/vdbeapi.c 0ed6053f947edd0b30f64ce5aeb811872a3450a4
 -F src/vdbeaux.c 43bee29ac866f7ce6af90c4f084bb22c160b8b70
 -F src/vdbeblob.c d939997de046b8fcc607cfee4248f3d33dbcca50
++F src/vdbe.c ccddf62bcb2981b3aaa991ec72387c26aeaf65f6
 +F src/vdbe.h 6631430dddd1450dfe749ba6fa8e2acdda3933f6
- F src/vdbeInt.h 3fecec2457cac8a57085dc8edf08eb486d370ca0
- F src/vdbeapi.c a130692dd1016cd2becdae323391437f580b2417
- F src/vdbeaux.c c50dc4f192cec40b6127c0c199f19e18f42258e6
++F src/vdbeInt.h aa52feb8bfc05ea29ea262a9ce4050715c57ad5a
++F src/vdbeapi.c d3c662762b62e330a03f29de8e2ac7098ef78030
++F src/vdbeaux.c 955216d35e65dfc93e9b6d0226ad38c0b2e8036a
 +F src/vdbeblob.c 666ce6596264fe88dad51bf60c160668d3cd0920
- F src/vdbemem.c 10b250f09a3843ee2bcabcadf50ca21fc3ff1f87
+ F src/vdbemem.c 6fc77594c60f6155404f3f8d71bf36d1fdeb4447
  F src/vdbesort.c 46801acb342e5e4c07ba1777fe58880c143abb59
  F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767
  F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
@@@ -1170,7 -1155,7 +1170,7 @@@ F tool/vdbe_profile.tcl 67746953071a9f8
  F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
  F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
  F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
- P 2cd35ff6512e1973077f7ffc2c902476eabbe672 9830c343bc954b828f6ca752f8ae63e2c0a980c1
- R 1b0e794620966a99e11eff71e0b47bdf
 -P 12cbebb997705e37769460e00a4aaa52c12f305e
 -R d261f37d595757cff592b0cc63c2909e
++P 7f51ad97f0b24c57453d58faf25eee68861faa23 1d134ba2edbdb8c0cf9e99590a69cd17e0b874a9
++R c692d3c8218b4a70137b86898c9b58c9
  U drh
- Z bda0a10e708d562bf20c5bd0cbfd93f9
 -Z 2ff0e0e9e50bbeda593af44f5801ea80
++Z e57469197d4db84c8507a1f208631345
diff --cc manifest.uuid
index 6f9e315630cbd4c754162e84a1e31b1003416b1e,dbbf09faa43694450d4be6697cbd1de12a771ba8..af132b073707be4342df3f1f7e340823a07f0462
@@@ -1,1 -1,1 +1,1 @@@
- 7f51ad97f0b24c57453d58faf25eee68861faa23
 -1d134ba2edbdb8c0cf9e99590a69cd17e0b874a9
++0828975d580d309a1c66da4b6caeb65b21a01199
diff --cc src/vdbe.c
Simple merge
diff --cc src/vdbeInt.h
index bc26501269da4bac1aa02b086e3ee7fe614dbce4,0394782f7358cf6f2b112b16779fd44f15dc6161..911e34bad3b0d2277a03eb14c377f57fb03a66a0
@@@ -453,10 -434,6 +453,8 @@@ int sqlite3VdbeMemGrow(Mem *pMem, int n
  int sqlite3VdbeCloseStatement(Vdbe *, int);
  void sqlite3VdbeFrameDelete(VdbeFrame*);
  int sqlite3VdbeFrameRestore(VdbeFrame *);
- #define sqlite3VdbeMemStoreType(X)  (X)->memType = (u8)((X)->flags&0x1f)
- /* void sqlite3VdbeMemStoreType(Mem *pMem); */
 +void sqlite3VdbePreUpdateHook(
 +    Vdbe *, VdbeCursor *, int, const char*, Table *, i64, int);
  int sqlite3VdbeTransferError(Vdbe *p);
  
  int sqlite3VdbeSorterInit(sqlite3 *, VdbeCursor *);
diff --cc src/vdbeapi.c
index 7f9862156e2a5a0fec7a759d65720e5bb006cb24,5d7a0b06081bbabf1bc8ece63bc1af0659456d08..d32df40ae2aea51fb517e18e7141db1848fc6cc3
@@@ -1350,187 -1353,3 +1353,184 @@@ int sqlite3_stmt_status(sqlite3_stmt *p
    if( resetFlag ) pVdbe->aCounter[op] = 0;
    return (int)v;
  }
-     sqlite3VdbeMemStoreType(*ppValue);
 +
 +#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(pMem);
 +  }
 +
 + 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;
 +      }
 +    }
 +  }
 +  *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