/ Hex Artifact Content
Login

Artifact 85f5c743a899063fa48296d21de2f32c26d09a21c8582b2a0bc482e8de183e7a:


0000: 2f 2a 0a 2a 2a 20 32 30 31 37 20 41 70 72 69 6c  /*.** 2017 April
0010: 20 30 37 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75   07.**.** The au
0020: 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63  thor disclaims c
0030: 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73  opyright to this
0040: 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49   source code.  I
0050: 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20  n place of.** a 
0060: 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65  legal notice, he
0070: 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67  re is a blessing
0080: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79  :.**.**    May y
0090: 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e  ou do good and n
00a0: 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d  ot evil..**    M
00b0: 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67  ay you find forg
00c0: 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72  iveness for your
00d0: 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65  self and forgive
00e0: 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d   others..**    M
00f0: 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65  ay you share fre
0100: 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e  ely, never takin
0110: 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20  g more than you 
0120: 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  give..**.*******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  **.*/..#if defin
0180: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
0190: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
01a0: 65 33 65 78 70 65 72 74 2e 68 22 0a 23 69 6e 63  e3expert.h".#inc
01b0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01c0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
01d0: 2e 68 3e 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .h>..#if defined
01e0: 28 49 4e 43 4c 55 44 45 5f 53 51 4c 49 54 45 5f  (INCLUDE_SQLITE_
01f0: 54 43 4c 5f 48 29 0a 23 20 20 69 6e 63 6c 75 64  TCL_H).#  includ
0200: 65 20 22 73 71 6c 69 74 65 5f 74 63 6c 2e 68 22  e "sqlite_tcl.h"
0210: 0a 23 65 6c 73 65 0a 23 20 20 69 6e 63 6c 75 64  .#else.#  includ
0220: 65 20 22 74 63 6c 2e 68 22 0a 23 20 20 69 66 6e  e "tcl.h".#  ifn
0230: 64 65 66 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  def SQLITE_TCLAP
0240: 49 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  I.#    define SQ
0250: 4c 49 54 45 5f 54 43 4c 41 50 49 0a 23 20 20 65  LITE_TCLAPI.#  e
0260: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0270: 2a 2a 20 45 78 74 72 61 63 74 20 61 6e 20 73 71  ** Extract an sq
0280: 6c 69 74 65 33 2a 20 64 62 20 68 61 6e 64 6c 65  lite3* db handle
0290: 20 66 72 6f 6d 20 74 68 65 20 6f 62 6a 65 63 74   from the object
02a0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
02b0: 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
02c0: 74 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  t. If successful
02d0: 2c 20 73 65 74 20 2a 70 44 62 20 74 6f 20 70 6f  , set *pDb to po
02e0: 69 6e 74 20 74 6f 20 74 68 65 20 64 62 20 68 61  int to the db ha
02f0: 6e 64 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  ndle and return.
0300: 2a 2a 20 54 43 4c 5f 4f 4b 2e 20 4f 74 68 65 72  ** TCL_OK. Other
0310: 77 69 73 65 2c 20 72 65 74 75 72 6e 20 54 43 4c  wise, return TCL
0320: 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69  _ERROR..*/.stati
0330: 63 20 69 6e 74 20 64 62 48 61 6e 64 6c 65 46 72  c int dbHandleFr
0340: 6f 6d 4f 62 6a 28 54 63 6c 5f 49 6e 74 65 72 70  omObj(Tcl_Interp
0350: 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62   *interp, Tcl_Ob
0360: 6a 20 2a 70 4f 62 6a 2c 20 73 71 6c 69 74 65 33  j *pObj, sqlite3
0370: 20 2a 2a 70 44 62 29 7b 0a 20 20 54 63 6c 5f 43   **pDb){.  Tcl_C
0380: 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  mdInfo info;.  i
0390: 66 28 20 30 3d 3d 54 63 6c 5f 47 65 74 43 6f 6d  f( 0==Tcl_GetCom
03a0: 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
03b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
03c0: 4f 62 6a 29 2c 20 26 69 6e 66 6f 29 20 29 7b 0a  Obj), &info) ){.
03d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
03e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
03f0: 20 73 75 63 68 20 68 61 6e 64 6c 65 3a 20 22 2c   such handle: ",
0400: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70   Tcl_GetString(p
0410: 4f 62 6a 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  Obj), 0);.    re
0420: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0430: 20 20 7d 0a 0a 20 20 2a 70 44 62 20 3d 20 2a 28    }..  *pDb = *(
0440: 73 71 6c 69 74 65 33 20 2a 2a 29 69 6e 66 6f 2e  sqlite3 **)info.
0450: 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20  objClientData;. 
0460: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
0470: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 63 6c 63 6d 64  }.../*.** Tclcmd
0480: 3a 20 20 24 65 78 70 65 72 74 20 73 71 6c 20 53  :  $expert sql S
0490: 51 4c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 24  QL.**          $
04a0: 65 78 70 65 72 74 20 61 6e 61 6c 79 7a 65 0a 2a  expert analyze.*
04b0: 2a 20 20 20 20 20 20 20 20 20 20 24 65 78 70 65  *          $expe
04c0: 72 74 20 63 6f 75 6e 74 0a 2a 2a 20 20 20 20 20  rt count.**     
04d0: 20 20 20 20 20 24 65 78 70 65 72 74 20 72 65 70       $expert rep
04e0: 6f 72 74 20 53 54 4d 54 20 45 52 45 50 4f 52 54  ort STMT EREPORT
04f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 24 65 78  .**          $ex
0500: 70 65 72 74 20 64 65 73 74 72 6f 79 0a 2a 2f 0a  pert destroy.*/.
0510: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
0520: 45 5f 54 43 4c 41 50 49 20 74 65 73 74 45 78 70  E_TCLAPI testExp
0530: 65 72 74 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a  ertCmd(.  void *
0540: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
0550: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0560: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
0570: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
0580: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
0590: 65 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72  e3expert *pExper
05a0: 74 20 3d 20 28 73 71 6c 69 74 65 33 65 78 70 65  t = (sqlite3expe
05b0: 72 74 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  rt*)clientData;.
05c0: 20 20 73 74 72 75 63 74 20 53 75 62 63 6d 64 20    struct Subcmd 
05d0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
05e0: 20 2a 7a 53 75 62 3b 0a 20 20 20 20 69 6e 74 20   *zSub;.    int 
05f0: 6e 41 72 67 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nArg;.    const 
0600: 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 7d 20  char *zMsg;.  } 
0610: 61 53 75 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aSub[] = {.    {
0620: 20 22 73 71 6c 22 2c 20 20 20 20 20 20 20 31 2c   "sql",       1,
0630: 20 22 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20   "TABLE",       
0640: 20 7d 2c 20 2f 2a 20 30 20 2a 2f 0a 20 20 20 20   }, /* 0 */.    
0650: 7b 20 22 61 6e 61 6c 79 7a 65 22 2c 20 20 20 30  { "analyze",   0
0660: 2c 20 22 22 2c 20 20 20 20 20 20 20 20 20 20 20  , "",           
0670: 20 20 7d 2c 20 2f 2a 20 31 20 2a 2f 0a 20 20 20    }, /* 1 */.   
0680: 20 7b 20 22 63 6f 75 6e 74 22 2c 20 20 20 20 20   { "count",     
0690: 30 2c 20 22 22 2c 20 20 20 20 20 20 20 20 20 20  0, "",          
06a0: 20 20 20 7d 2c 20 2f 2a 20 32 20 2a 2f 0a 20 20     }, /* 2 */.  
06b0: 20 20 7b 20 22 72 65 70 6f 72 74 22 2c 20 20 20    { "report",   
06c0: 20 32 2c 20 22 53 54 4d 54 20 45 52 45 50 4f 52   2, "STMT EREPOR
06d0: 54 22 2c 20 7d 2c 20 2f 2a 20 33 20 2a 2f 0a 20  T", }, /* 3 */. 
06e0: 20 20 20 7b 20 22 64 65 73 74 72 6f 79 22 2c 20     { "destroy", 
06f0: 20 20 30 2c 20 22 22 2c 20 20 20 20 20 20 20 20    0, "",        
0700: 20 20 20 20 20 7d 2c 20 2f 2a 20 34 20 2a 2f 0a       }, /* 4 */.
0710: 20 20 20 20 7b 20 30 20 7d 0a 20 20 7d 3b 0a 20      { 0 }.  };. 
0720: 20 69 6e 74 20 69 53 75 62 3b 0a 20 20 69 6e 74   int iSub;.  int
0730: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
0740: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
0750: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
0760: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
0770: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
0780: 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d 41   objv, "SUBCOMMA
0790: 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
07a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
07b0: 20 20 7d 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47    }.  rc = Tcl_G
07c0: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74  etIndexFromObjSt
07d0: 72 75 63 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  ruct(interp, .  
07e0: 20 20 20 20 6f 62 6a 76 5b 31 5d 2c 20 61 53 75      objv[1], aSu
07f0: 62 2c 20 73 69 7a 65 6f 66 28 61 53 75 62 5b 30  b, sizeof(aSub[0
0800: 5d 29 2c 20 22 73 75 62 2d 63 6f 6d 6d 61 6e 64  ]), "sub-command
0810: 22 2c 20 30 2c 20 26 69 53 75 62 0a 20 20 29 3b  ", 0, &iSub.  );
0820: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
0830: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
0840: 20 69 66 28 20 6f 62 6a 63 21 3d 32 2b 61 53 75   if( objc!=2+aSu
0850: 62 5b 69 53 75 62 5d 2e 6e 41 72 67 20 29 7b 0a  b[iSub].nArg ){.
0860: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
0870: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
0880: 6f 62 6a 76 2c 20 61 53 75 62 5b 69 53 75 62 5d  objv, aSub[iSub]
0890: 2e 7a 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75  .zMsg);.    retu
08a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
08b0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 69 53 75  }..  switch( iSu
08c0: 62 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  b ){.    case 0:
08d0: 20 7b 20 20 20 20 20 20 2f 2a 20 73 71 6c 20 2a   {      /* sql *
08e0: 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41  /.      char *zA
08f0: 72 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  rg = Tcl_GetStri
0900: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20  ng(objv[2]);.   
0910: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
0920: 65 78 70 65 72 74 5f 73 71 6c 28 70 45 78 70 65  expert_sql(pExpe
0930: 72 74 2c 20 7a 41 72 67 2c 20 26 7a 45 72 72 29  rt, zArg, &zErr)
0940: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
0950: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 31     }..    case 1
0960: 3a 20 7b 20 20 20 20 20 20 2f 2a 20 61 6e 61 6c  : {      /* anal
0970: 79 7a 65 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  yze */.      rc 
0980: 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
0990: 5f 61 6e 61 6c 79 7a 65 28 70 45 78 70 65 72 74  _analyze(pExpert
09a0: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  , &zErr);.      
09b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
09c0: 20 20 63 61 73 65 20 32 3a 20 7b 20 20 20 20 20    case 2: {     
09d0: 20 2f 2a 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20   /* count */.   
09e0: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
09f0: 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e 74 28  e3_expert_count(
0a00: 70 45 78 70 65 72 74 29 3b 0a 20 20 20 20 20 20  pExpert);.      
0a10: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
0a20: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
0a30: 49 6e 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 20 20  IntObj(n));.    
0a40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
0a50: 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 20 20      case 3: {   
0a60: 20 20 20 2f 2a 20 72 65 70 6f 72 74 20 2a 2f 0a     /* report */.
0a70: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
0a80: 20 2a 61 45 6e 75 6d 5b 5d 20 3d 20 7b 0a 20 20   *aEnum[] = {.  
0a90: 20 20 20 20 20 20 22 73 71 6c 22 2c 20 22 69 6e        "sql", "in
0aa0: 64 65 78 65 73 22 2c 20 22 70 6c 61 6e 22 2c 20  dexes", "plan", 
0ab0: 22 63 61 6e 64 69 64 61 74 65 73 22 2c 20 30 0a  "candidates", 0.
0ac0: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 69        };.      i
0ad0: 6e 74 20 69 45 6e 75 6d 3b 0a 20 20 20 20 20 20  nt iEnum;.      
0ae0: 69 6e 74 20 69 53 74 6d 74 3b 0a 20 20 20 20 20  int iStmt;.     
0af0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
0b00: 70 6f 72 74 3b 0a 0a 20 20 20 20 20 20 69 66 28  port;..      if(
0b10: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
0b20: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
0b30: 32 5d 2c 20 26 69 53 74 6d 74 29 20 0a 20 20 20  2], &iStmt) .   
0b40: 20 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e      || Tcl_GetIn
0b50: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
0b60: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 61 45 6e 75  p, objv[3], aEnu
0b70: 6d 2c 20 22 72 65 70 6f 72 74 22 2c 20 30 2c 20  m, "report", 0, 
0b80: 26 69 45 6e 75 6d 29 0a 20 20 20 20 20 20 29 7b  &iEnum).      ){
0b90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0ba0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
0bb0: 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
0bc0: 28 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  ( EXPERT_REPORT_
0bd0: 53 51 4c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  SQL==1 );.      
0be0: 61 73 73 65 72 74 28 20 45 58 50 45 52 54 5f 52  assert( EXPERT_R
0bf0: 45 50 4f 52 54 5f 49 4e 44 45 58 45 53 3d 3d 32  EPORT_INDEXES==2
0c00: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
0c10: 28 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  ( EXPERT_REPORT_
0c20: 50 4c 41 4e 3d 3d 33 20 29 3b 0a 20 20 20 20 20  PLAN==3 );.     
0c30: 20 61 73 73 65 72 74 28 20 45 58 50 45 52 54 5f   assert( EXPERT_
0c40: 52 45 50 4f 52 54 5f 43 41 4e 44 49 44 41 54 45  REPORT_CANDIDATE
0c50: 53 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 7a 52  S==4 );.      zR
0c60: 65 70 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 5f  eport = sqlite3_
0c70: 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 45  expert_report(pE
0c80: 78 70 65 72 74 2c 20 69 53 74 6d 74 2c 20 31 2b  xpert, iStmt, 1+
0c90: 69 45 6e 75 6d 29 3b 0a 20 20 20 20 20 20 54 63  iEnum);.      Tc
0ca0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
0cb0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
0cc0: 72 69 6e 67 4f 62 6a 28 7a 52 65 70 6f 72 74 2c  ringObj(zReport,
0cd0: 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65   -1));.      bre
0ce0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  ak;.    }..    d
0cf0: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 2f 2a  efault:       /*
0d00: 20 64 65 73 74 72 6f 79 20 2a 2f 0a 20 20 20 20   destroy */.    
0d10: 20 20 61 73 73 65 72 74 28 20 69 53 75 62 3d 3d    assert( iSub==
0d20: 34 20 29 3b 20 20 20 20 20 0a 20 20 20 20 20 20  4 );     .      
0d30: 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e  Tcl_DeleteComman
0d40: 64 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  d(interp, Tcl_Ge
0d50: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
0d60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
0d70: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 54    }..  if( rc!=T
0d80: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  CL_OK ){.    if(
0d90: 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 54   zErr ){.      T
0da0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
0db0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
0dc0: 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d  tringObj(zErr, -
0dd0: 31 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1));.    }else{.
0de0: 20 20 20 20 20 20 65 78 74 65 72 6e 20 63 6f 6e        extern con
0df0: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
0e00: 45 72 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 20 20  ErrName(int);.  
0e10: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
0e20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
0e30: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
0e40: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
0e50: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20  , -1));.    }.  
0e60: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
0e70: 28 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e  (zErr);.  return
0e80: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76   rc;.}..static v
0e90: 6f 69 64 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  oid SQLITE_TCLAP
0ea0: 49 20 74 65 73 74 45 78 70 65 72 74 44 65 6c 28  I testExpertDel(
0eb0: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
0ec0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 65 78 70 65  ){.  sqlite3expe
0ed0: 72 74 20 2a 70 45 78 70 65 72 74 20 3d 20 28 73  rt *pExpert = (s
0ee0: 71 6c 69 74 65 33 65 78 70 65 72 74 2a 29 63 6c  qlite3expert*)cl
0ef0: 69 65 6e 74 44 61 74 61 3b 0a 20 20 73 71 6c 69  ientData;.  sqli
0f00: 74 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74 72  te3_expert_destr
0f10: 6f 79 28 70 45 78 70 65 72 74 29 3b 0a 7d 0a 0a  oy(pExpert);.}..
0f20: 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 78  /*.** sqlite3_ex
0f30: 70 65 72 74 5f 6e 65 77 20 44 42 0a 2a 2f 0a 73  pert_new DB.*/.s
0f40: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
0f50: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71 6c  _TCLAPI test_sql
0f60: 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 28  ite3_expert_new(
0f70: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
0f80: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
0f90: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
0fa0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
0fb0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
0fc0: 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
0fd0: 69 43 6d 64 20 3d 20 30 3b 0a 20 20 73 71 6c 69  iCmd = 0;.  sqli
0fe0: 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
0ff0: 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20 20 63 68 61  *zCmd = 0;.  cha
1000: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 73  r *zErr = 0;.  s
1010: 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70 45  qlite3expert *pE
1020: 78 70 65 72 74 3b 0a 20 20 69 6e 74 20 72 63 20  xpert;.  int rc 
1030: 3d 20 54 43 4c 5f 4f 4b 3b 0a 0a 20 20 69 66 28  = TCL_OK;..  if(
1040: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1050: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1060: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1070: 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
1080: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1090: 20 7d 0a 20 20 69 66 28 20 64 62 48 61 6e 64 6c   }.  if( dbHandl
10a0: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
10b0: 20 6f 62 6a 76 5b 31 5d 2c 20 26 64 62 29 20 29   objv[1], &db) )
10c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
10d0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a  _ERROR;.  }..  z
10e0: 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Cmd = sqlite3_mp
10f0: 72 69 6e 74 66 28 22 73 71 6c 69 74 65 33 65 78  rintf("sqlite3ex
1100: 70 65 72 74 25 64 22 2c 20 2b 2b 69 43 6d 64 29  pert%d", ++iCmd)
1110: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
1120: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1130: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1140: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c  "out of memory",
1150: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
1160: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1170: 3b 0a 20 20 7d 0a 0a 20 20 70 45 78 70 65 72 74  ;.  }..  pExpert
1180: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
1190: 74 5f 6e 65 77 28 64 62 2c 20 26 7a 45 72 72 29  t_new(db, &zErr)
11a0: 3b 0a 20 20 69 66 28 20 70 45 78 70 65 72 74 3d  ;.  if( pExpert=
11b0: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =0 ){.    Tcl_Ap
11c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11d0: 70 2c 20 7a 45 72 72 2c 20 28 63 68 61 72 2a 29  p, zErr, (char*)
11e0: 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  0);.    rc = TCL
11f0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
1200: 0a 20 20 20 20 76 6f 69 64 20 2a 70 20 3d 20 28  .    void *p = (
1210: 76 6f 69 64 2a 29 70 45 78 70 65 72 74 3b 0a 20  void*)pExpert;. 
1220: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
1230: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
1240: 7a 43 6d 64 2c 20 74 65 73 74 45 78 70 65 72 74  zCmd, testExpert
1250: 43 6d 64 2c 20 70 2c 20 74 65 73 74 45 78 70 65  Cmd, p, testExpe
1260: 72 74 44 65 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  rtDel);.    Tcl_
1270: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1280: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
1290: 6e 67 4f 62 6a 28 7a 43 6d 64 2c 20 2d 31 29 29  ngObj(zCmd, -1))
12a0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
12b0: 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a 20 20 73  _free(zCmd);.  s
12c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
12d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12e0: 7d 0a 0a 69 6e 74 20 54 65 73 74 45 78 70 65 72  }..int TestExper
12f0: 74 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  t_Init(Tcl_Inter
1300: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 73 74  p *interp){.  st
1310: 72 75 63 74 20 43 6d 64 20 7b 0a 20 20 20 20 63  ruct Cmd {.    c
1320: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b  onst char *zCmd;
1330: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50  .    Tcl_ObjCmdP
1340: 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20  roc *xProc;.  } 
1350: 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aCmd[] = {.    {
1360: 20 22 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74   "sqlite3_expert
1370: 5f 6e 65 77 22 2c 20 74 65 73 74 5f 73 71 6c 69  _new", test_sqli
1380: 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 20 7d  te3_expert_new }
1390: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
13a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
13b0: 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f  zeof(aCmd)/sizeo
13c0: 66 28 73 74 72 75 63 74 20 43 6d 64 29 3b 20 69  f(struct Cmd); i
13d0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
13e0: 43 6d 64 20 2a 70 20 3d 20 26 61 43 6d 64 5b 69  Cmd *p = &aCmd[i
13f0: 5d 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ];.    Tcl_Creat
1400: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
1410: 72 70 2c 20 70 2d 3e 7a 43 6d 64 2c 20 70 2d 3e  rp, p->zCmd, p->
1420: 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20  xProc, 0, 0);.  
1430: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
1440: 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a        OK;.}..#endif.