]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Merge the latest enhancements from trunk.
authordrh <drh@noemail.net>
Tue, 2 May 2017 19:45:14 +0000 (19:45 +0000)
committerdrh <drh@noemail.net>
Tue, 2 May 2017 19:45:14 +0000 (19:45 +0000)
FossilOrigin-Name: a7dcf6a79f7e1c5884baee2909a4bf3174ae06d561dae87b390856e573f81b49

1  2 
ext/expert/test_expert.c
manifest
manifest.uuid
src/sqlite.h.in
src/sqliteInt.h
src/vdbe.c
src/vdbeaux.c

index 587f95c91ba9311051ab1b0a87eec0b525bbac42,0000000000000000000000000000000000000000..ad83872f9a1b9cc8dfd252b43a8d31d97d96c90e
mode 100644,000000..100644
--- /dev/null
@@@ -1,219 -1,0 +1,215 @@@
- #if defined(SQLITE_TEST) && defined(SQLITE_ENABLE_WHEREINFO_HOOK)
 +/*
 +** 2017 April 07
 +**
 +** The author disclaims copyright to this source code.  In place of
 +** a legal notice, here is a blessing:
 +**
 +**    May you do good and not evil.
 +**    May you find forgiveness for yourself and forgive others.
 +**    May you share freely, never taking more than you give.
 +**
 +*************************************************************************
 +*/
 +
- #else /* defined(SQLITE_TEST) && defined(SQLITE_ENABLE_WHEREINFO_HOOK) */
- int TestExpert_Init(Tcl_Interp *interp){
-   return TCL_OK;
- }
++#if defined(SQLITE_TEST)
 +
 +#include "sqlite3expert.h"
 +#include <assert.h>
 +#include <string.h>
 +
 +#if defined(INCLUDE_SQLITE_TCL_H)
 +#  include "sqlite_tcl.h"
 +#else
 +#  include "tcl.h"
 +#  ifndef SQLITE_TCLAPI
 +#    define SQLITE_TCLAPI
 +#  endif
 +#endif
 +
 +/*
 +** Extract an sqlite3* db handle from the object passed as the second
 +** argument. If successful, set *pDb to point to the db handle and return
 +** TCL_OK. Otherwise, return TCL_ERROR.
 +*/
 +static int dbHandleFromObj(Tcl_Interp *interp, Tcl_Obj *pObj, sqlite3 **pDb){
 +  Tcl_CmdInfo info;
 +  if( 0==Tcl_GetCommandInfo(interp, Tcl_GetString(pObj), &info) ){
 +    Tcl_AppendResult(interp, "no such handle: ", Tcl_GetString(pObj), 0);
 +    return TCL_ERROR;
 +  }
 +
 +  *pDb = *(sqlite3 **)info.objClientData;
 +  return TCL_OK;
 +}
 +
 +
 +/*
 +** Tclcmd:  $expert sql SQL
 +**          $expert analyze
 +**          $expert count
 +**          $expert report STMT EREPORT
 +**          $expert destroy
 +*/
 +static int SQLITE_TCLAPI testExpertCmd(
 +  void *clientData,
 +  Tcl_Interp *interp,
 +  int objc,
 +  Tcl_Obj *CONST objv[]
 +){
 +  sqlite3expert *pExpert = (sqlite3expert*)clientData;
 +  struct Subcmd {
 +    const char *zSub;
 +    int nArg;
 +    const char *zMsg;
 +  } aSub[] = {
 +    { "sql",       1, "TABLE",        }, /* 0 */
 +    { "analyze",   0, "",             }, /* 1 */
 +    { "count",     0, "",             }, /* 2 */
 +    { "report",    2, "STMT EREPORT", }, /* 3 */
 +    { "destroy",   0, "",             }, /* 4 */
 +    { 0 }
 +  };
 +  int iSub;
 +  int rc = TCL_OK;
 +  char *zErr = 0;
 +
 +  if( objc<2 ){
 +    Tcl_WrongNumArgs(interp, 1, objv, "SUBCOMMAND ...");
 +    return TCL_ERROR;
 +  }
 +  rc = Tcl_GetIndexFromObjStruct(interp, 
 +      objv[1], aSub, sizeof(aSub[0]), "sub-command", 0, &iSub
 +  );
 +  if( rc!=TCL_OK ) return rc;
 +  if( objc!=2+aSub[iSub].nArg ){
 +    Tcl_WrongNumArgs(interp, 2, objv, aSub[iSub].zMsg);
 +    return TCL_ERROR;
 +  }
 +
 +  switch( iSub ){
 +    case 0: {      /* sql */
 +      char *zArg = Tcl_GetString(objv[2]);
 +      rc = sqlite3_expert_sql(pExpert, zArg, &zErr);
 +      break;
 +    }
 +
 +    case 1: {      /* analyze */
 +      rc = sqlite3_expert_analyze(pExpert, &zErr);
 +      break;
 +    }
 +
 +    case 2: {      /* count */
 +      int n = sqlite3_expert_count(pExpert);
 +      Tcl_SetObjResult(interp, Tcl_NewIntObj(n));
 +      break;
 +    }
 +
 +    case 3: {      /* report */
 +      const char *aEnum[] = {
 +        "sql", "indexes", "plan", "candidates", 0
 +      };
 +      int iEnum;
 +      int iStmt;
 +      const char *zReport;
 +
 +      if( Tcl_GetIntFromObj(interp, objv[2], &iStmt) 
 +       || Tcl_GetIndexFromObj(interp, objv[3], aEnum, "report", 0, &iEnum)
 +      ){
 +        return TCL_ERROR;
 +      }
 +
 +      assert( EXPERT_REPORT_SQL==1 );
 +      assert( EXPERT_REPORT_INDEXES==2 );
 +      assert( EXPERT_REPORT_PLAN==3 );
 +      assert( EXPERT_REPORT_CANDIDATES==4 );
 +      zReport = sqlite3_expert_report(pExpert, iStmt, 1+iEnum);
 +      Tcl_SetObjResult(interp, Tcl_NewStringObj(zReport, -1));
 +      break;
 +    }
 +
 +    default:       /* destroy */
 +      assert( iSub==4 );     
 +      Tcl_DeleteCommand(interp, Tcl_GetString(objv[0]));
 +      break;
 +  }
 +
 +  if( rc!=TCL_OK ){
 +    if( zErr ){
 +      Tcl_SetObjResult(interp, Tcl_NewStringObj(zErr, -1));
 +    }else{
 +      extern const char *sqlite3ErrName(int);
 +      Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1));
 +    }
 +  }
 +  sqlite3_free(zErr);
 +  return rc;
 +}
 +
 +static void SQLITE_TCLAPI testExpertDel(void *clientData){
 +  sqlite3expert *pExpert = (sqlite3expert*)clientData;
 +  sqlite3_expert_destroy(pExpert);
 +}
 +
 +/*
 +** sqlite3_expert_new DB
 +*/
 +static int SQLITE_TCLAPI test_sqlite3_expert_new(
 +  void * clientData,
 +  Tcl_Interp *interp,
 +  int objc,
 +  Tcl_Obj *CONST objv[]
 +){
 +  static int iCmd = 0;
 +  sqlite3 *db;
 +  char *zCmd = 0;
 +  char *zErr = 0;
 +  sqlite3expert *pExpert;
 +  int rc = TCL_OK;
 +
 +  if( objc!=2 ){
 +    Tcl_WrongNumArgs(interp, 1, objv, "DB");
 +    return TCL_ERROR;
 +  }
 +  if( dbHandleFromObj(interp, objv[1], &db) ){
 +    return TCL_ERROR;
 +  }
 +
 +  zCmd = sqlite3_mprintf("sqlite3expert%d", ++iCmd);
 +  if( zCmd==0 ){
 +    Tcl_AppendResult(interp, "out of memory", (char*)0);
 +    return TCL_ERROR;
 +  }
 +
 +  pExpert = sqlite3_expert_new(db, &zErr);
 +  if( pExpert==0 ){
 +    Tcl_AppendResult(interp, zErr, (char*)0);
 +    rc = TCL_ERROR;
 +  }else{
 +    void *p = (void*)pExpert;
 +    Tcl_CreateObjCommand(interp, zCmd, testExpertCmd, p, testExpertDel);
 +    Tcl_SetObjResult(interp, Tcl_NewStringObj(zCmd, -1));
 +  }
 +
 +  sqlite3_free(zCmd);
 +  sqlite3_free(zErr);
 +  return rc;
 +}
 +
 +int TestExpert_Init(Tcl_Interp *interp){
 +  struct Cmd {
 +    const char *zCmd;
 +    Tcl_ObjCmdProc *xProc;
 +  } aCmd[] = {
 +    { "sqlite3_expert_new", test_sqlite3_expert_new },
 +  };
 +  int i;
 +
 +  for(i=0; i<sizeof(aCmd)/sizeof(struct Cmd); i++){
 +    struct Cmd *p = &aCmd[i];
 +    Tcl_CreateObjCommand(interp, p->zCmd, p->xProc, 0, 0);
 +  }
 +
 +  return TCL_OK;
 +}
 +
 +#endif
diff --cc manifest
index d5f08dc338cfad76223381ea2dc2e1056c4e9b60,84aba2e596cfb092cabe37bb96e16f4b5006f0d4..9ca3ce06e1d36f5f56cda62aadfeb6ac283e31e6
+++ b/manifest
@@@ -1,5 -1,5 +1,5 @@@
- C Update\sthis\sbranch\swith\slatest\strunk\schanges.
- D 2017-05-01T14:25:34.571
 -C Fix\sthe\sfts3EvalAverageDocsize()\sroutine\sso\sthat\sit\sreturns\serrors\sfrom\nsqlite3_reset()\srather\sthan\salways\sreturning\sSQLITE_OK.
 -D 2017-05-02T18:00:31.645
++C Merge\sthe\slatest\senhancements\sfrom\strunk.
++D 2017-05-02T19:45:14.234
  F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb
  F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
  F Makefile.msc 6a8c838220f7c00820e1fc0ac1bccaaa8e5676067e1dbfa1bafa7a4ffecf8ae6
@@@ -40,12 -40,6 +40,12 @@@ F ext/README.md fd5f78013b0a2bc6f0067af
  F ext/async/README.txt e12275968f6fde133a80e04387d0e839b0c51f91
  F ext/async/sqlite3async.c 0f3070cc3f5ede78f2b9361fb3b629ce200d7d74
  F ext/async/sqlite3async.h f489b080af7e72aec0e1ee6f1d98ab6cf2e4dcef
- F ext/expert/test_expert.c b01a5115f9444a9b416582c985138f5dfdb279848ce8b7452be383530be27f01
 +F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3
 +F ext/expert/expert.c 33842ef151d84c5f8000f9c7b938998c6b999eaef7ce1f4eeb0df8ffe6739496
 +F ext/expert/expert1.test 1033e43071b69dc2f4e88fbf03fc7f18846c9865cac14f28c80f581437f09acb
 +F ext/expert/sqlite3expert.c 4bc1820a70d68b478884a26a2215df8c1f2d44fb40d9cd8c47d2046c8ce0c8bc
 +F ext/expert/sqlite3expert.h af6354f8ee5c9e025024e63fec3bd640a802afcc3099a44d804752cf0791d811
++F ext/expert/test_expert.c 85f5c743a899063fa48296d21de2f32c26d09a21c8582b2a0bc482e8de183e7a
  F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e
  F ext/fts1/ft_hash.c 3927bd880e65329bdc6f506555b228b28924921b
  F ext/fts1/ft_hash.h 06df7bba40dadd19597aa400a875dbc2fed705ea
@@@ -351,10 -345,10 +351,10 @@@ F src/auth.c 930b376a9c56998557367e6f7f
  F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b
  F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
  F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca
- F src/btree.c a0d9a1c782ff3d22df5d217a4fa7125dd69ad5849caa51c4442c10246ca8ae27
+ F src/btree.c 8c1fd4cfa2b0bf021386e0a1f4e30b64eea7a2c1bc2e0c3e5901a626b1ab6aa9
  F src/btree.h 80f518c0788be6cec8d9f8e13bd8e380df299d2b5e4ac340dc887b0642647cfc
  F src/btreeInt.h a392d353104b4add58b4a59cb185f5d5693dde832c565b77d8d4c343ed98f610
 -F src/build.c 4026a9c554b233e50c5e9ad46963e676cf54dd2306d952aa1eaa07a1bc9ce14f
 +F src/build.c 3fd46781483b527ee18508e7854e87e60a259211bb9bbf16b6fafaf08a043a64
  F src/callback.c 2e76147783386374bf01b227f752c81ec872d730
  F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
  F src/ctime.c 47d91a25ad8f199a71a5b1b7b169d6dd0d6e98c5719eca801568798743d1161c
@@@ -408,12 -402,12 +408,12 @@@ F src/printf.c 8757834f1b54dae512fb25eb
  F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
  F src/resolve.c 3e518b962d932a997fae373366880fc028c75706
  F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
- F src/select.c 478e95d424bb86d34c7c95d20872cbd78df97af5f83c3fd7de55d5b2413f927d
+ F src/select.c 4f0adefaa5e9417459b07757e0f6060cac97930a86f0fba9797bab233ced66c0
  F src/shell.c 21b79c0e1b93f8e35fd7b4087d6ba438326c3d7e285d0dd51dfd741475f858a1
- F src/sqlite.h.in 900a07463a87be50b9954817f4c24a0660b4c4ddc1bfe83dedea484c6ac98425
 -F src/sqlite.h.in eeb1da70a61d52e1d58e5b55446b85bbac571699421d3cf857421c56214013ce
++F src/sqlite.h.in 8872d1f5e0f04bd441620ea6db856a84de219798a5d385b862a54d27892d68e8
  F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
  F src/sqlite3ext.h 58fd0676d3111d02e62e5a35992a7d3da5d3f88753acc174f2d37b774fbbdd28
- F src/sqliteInt.h 0e520ab49f019221dd5a17b6e4006523ce4f33d88b20bcf9115d11952a487c39
 -F src/sqliteInt.h aea3aa1b81e0d07d5b1c39b8c5a54a1dc5e4f10136cb63da392aef9eb2a5108b
++F src/sqliteInt.h a8be6c63ce04fc759e3d8ca2dee2fa2d4128b0a4bf2031c3f6e482fd5c5abdfe
  F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
  F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1
  F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@@@ -475,11 -469,11 +475,11 @@@ F src/update.c c443935c652af9365e033f75
  F src/utf.c 699001c79f28e48e9bcdf8a463da029ea660540c
  F src/util.c ca8440ede81e155d15cff7c101654f60b55a9ae6
  F src/vacuum.c 1fe4555cd8c9b263afb85b5b4ee3a4a4181ad569
- F src/vdbe.c a4e1810c3b2a8119d08746d20ac9bab5d15c0ebed319ea1f57910948414ed114
 -F src/vdbe.c 9bac2bc2313ed682e6f48ccff6644d3263341885bfcbb3cdea7b720c722be2d5
++F src/vdbe.c 356042d11e05064c43242020e8de97acef9fc8931cfc39ae7cf4cf91d6e42c19
  F src/vdbe.h f7d1456e28875c2dcb964056589b5b7149ab7edf39edeca801596a39bb3d3848
  F src/vdbeInt.h c070bc5c8b913bda0ceaa995cd4d939ded5e4fc96cf7c3c1c602d41b871f8ade
  F src/vdbeapi.c 5b08d82592bcff4470601fe78aaabebd50837860
- F src/vdbeaux.c 526b617ac6b5e167a6bd581e067f1ee1dbcb06e7802cff46b76fb1c02ed7d34e
 -F src/vdbeaux.c b4999c744e59deba7ab8733640219ecbc771721b362d7e26ce4c57db575ad80b
++F src/vdbeaux.c 98ced78bb4d8f1c66a4519591804cbf34530f19c295a8589833aaa6004ea8731
  F src/vdbeblob.c 359891617358deefc85bef7bcf787fa6b77facb9
  F src/vdbemem.c 2c70f8f5de6c71fb99a22c5b83be9fab5c47cdd8e279fa44a8c00cfed06d7e89
  F src/vdbesort.c e72fe02a2121386ba767ede8942e9450878b8fc873abf3d1b6824485f092570c
@@@ -1584,7 -1578,7 +1585,7 @@@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a9
  F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
  F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
  F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
- P 9fa2ce3c2b75408594d387684984cd946765776d30bc622a1f4e64d6fe1856d5 4e1df76e3d85922648e0e1cce73a266c3b1ed4511ace259ec0a01d7693af9e6f
- R c99d2e434f8eea958d565fc3fbededc3
- U dan
- Z e2770623607bd1150c892792253a1e62
 -P 9e35c89dbe744312f612e507b51ff9a5bb656def75392d25bc19fc638548cd1e
 -R ff82b9e0856a749852e0a40a30515627
++P 11f4761c3a84e2cc9df62f117a003af8c57f3d226eec5a40d6241b121e78d002 430f539cbb3f806fb89191e0b759a5f8b49d9e5b6c95fe9a4b55a1aa0875762a
++R c37204de6c890801155672b7d23b8abd
+ U drh
 -Z a7183f9c248f45ecd3f1461fb3e694c7
++Z 640e08616c5ac7ee4ced91411da47a09
diff --cc manifest.uuid
index f027c61c4c4de4e58df270611d285bd7ffbca89c,ee0d3109c49195fd6b963307066c8d966a8d99cb..17b09356def7553fc1df115d576fd6d4518c11c9
@@@ -1,1 -1,1 +1,1 @@@
- 11f4761c3a84e2cc9df62f117a003af8c57f3d226eec5a40d6241b121e78d002
 -430f539cbb3f806fb89191e0b759a5f8b49d9e5b6c95fe9a4b55a1aa0875762a
++a7dcf6a79f7e1c5884baee2909a4bf3174ae06d561dae87b390856e573f81b49
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/vdbeaux.c
Simple merge