/ Hex Artifact Content
Login

Artifact 963f4417d1770f5238672ff5b817a9103842eeb7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you 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 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 70  or testing the p
0190: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
01a0: 65 20 74 6f 20 53 51 4c 69 74 65 2e 20 20 54 68  e to SQLite.  Th
01b0: 69 73 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f  is code.** is no
01c0: 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  t included in th
01d0: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
01e0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 66 6f  .  It is used fo
01f0: 72 20 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74  r automated.** t
0200: 65 73 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51  esting of the SQ
0210: 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2a  Lite library..**
0220: 0a 2a 2a 20 24 49 64 3a 20 74 65 73 74 31 2e 63  .** $Id: test1.c
0230: 2c 76 20 31 2e 37 38 20 32 30 30 34 2f 30 36 2f  ,v 1.78 2004/06/
0240: 31 38 20 30 34 3a 32 34 3a 35 35 20 64 61 6e 69  18 04:24:55 dani
0250: 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a 2f  elk1977 Exp $.*/
0260: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0270: 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  eInt.h".#include
0280: 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64   "tcl.h".#includ
0290: 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64  e "os.h".#includ
02a0: 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
02b0: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
02c0: 0a 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 23 20 64  ..#if OS_WIN.# d
02d0: 65 66 69 6e 65 20 50 54 52 5f 46 4d 54 20 22 25  efine PTR_FMT "%
02e0: 78 22 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  x".#else.# defin
02f0: 65 20 50 54 52 5f 46 4d 54 20 22 25 70 22 0a 23  e PTR_FMT "%p".#
0300: 65 6e 64 69 66 0a 0a 69 6e 74 20 73 71 6c 69 74  endif..int sqlit
0310: 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  e3_exec_printf(.
0320: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20    sqlite *db,   
0330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0340: 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62  /* An open datab
0350: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ase */.  const c
0360: 68 61 72 20 2a 73 71 6c 46 6f 72 6d 61 74 2c 20  har *sqlFormat, 
0370: 20 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 66         /* printf
0380: 2d 73 74 79 6c 65 20 66 6f 72 6d 61 74 20 73 74  -style format st
0390: 72 69 6e 67 20 66 6f 72 20 74 68 65 20 53 51 4c  ring for the SQL
03a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f 63 61 6c   */.  sqlite_cal
03b0: 6c 62 61 63 6b 20 78 43 61 6c 6c 62 61 63 6b 2c  lback xCallback,
03c0: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
03d0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
03e0: 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  id *pArg,       
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
0400: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 63  st argument to c
0410: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
0420: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 65 72 72   */.  char **err
0430: 6d 73 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  msg,            
0440: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67      /* Error msg
0450: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
0460: 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  .  ...          
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f   /* Arguments to
0490: 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   the format stri
04a0: 6e 67 2e 20 2a 2f 0a 29 3b 0a 69 6e 74 20 73 71  ng. */.);.int sq
04b0: 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
04c0: 66 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c  f(.  sqlite *db,
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04e0: 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61     /* An open da
04f0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
0500: 74 20 63 68 61 72 20 2a 73 71 6c 46 6f 72 6d 61  t char *sqlForma
0510: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 72 69  t,        /* pri
0520: 6e 74 66 2d 73 74 79 6c 65 20 66 6f 72 6d 61 74  ntf-style format
0530: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
0540: 53 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 5f  SQL */.  sqlite_
0550: 63 61 6c 6c 62 61 63 6b 20 78 43 61 6c 6c 62 61  callback xCallba
0560: 63 6b 2c 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61  ck,    /* Callba
0570: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
0580: 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20   void *pArg,    
0590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
05a0: 2a 20 31 73 74 20 61 72 67 75 6d 65 6e 74 20 74  * 1st argument t
05b0: 6f 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  o callback funct
05c0: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ion */.  char **
05d0: 65 72 72 6d 73 67 2c 20 20 20 20 20 20 20 20 20  errmsg,         
05e0: 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
05f0: 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65 72 65  msg written here
0600: 20 2a 2f 0a 20 20 2e 2e 2e 20 20 20 20 20 20 20   */.  ...       
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0620: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
0630: 20 74 6f 20 74 68 65 20 66 6f 72 6d 61 74 20 73   to the format s
0640: 74 72 69 6e 67 2e 20 2a 2f 0a 29 3b 0a 69 6e 74  tring. */.);.int
0650: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
0660: 6c 65 5f 70 72 69 6e 74 66 28 0a 20 20 73 71 6c  le_printf(.  sql
0670: 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20 20 20  ite *db,        
0680: 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64      /* An open d
0690: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
06a0: 73 74 20 63 68 61 72 20 2a 73 71 6c 46 6f 72 6d  st char *sqlForm
06b0: 61 74 2c 20 2f 2a 20 70 72 69 6e 74 66 2d 73 74  at, /* printf-st
06c0: 79 6c 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  yle format strin
06d0: 67 20 66 6f 72 20 74 68 65 20 53 51 4c 20 2a 2f  g for the SQL */
06e0: 0a 20 20 63 68 61 72 20 2a 2a 2a 72 65 73 75 6c  .  char ***resul
06f0: 74 70 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 73  tp,       /* Res
0700: 75 6c 74 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ult written to a
0710: 20 63 68 61 72 20 2a 5b 5d 20 20 74 68 61 74 20   char *[]  that 
0720: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 2a  this points to *
0730: 2f 0a 20 20 69 6e 74 20 2a 6e 72 6f 77 2c 20 20  /.  int *nrow,  
0740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0750: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 72  mber of result r
0760: 6f 77 73 20 77 72 69 74 74 65 6e 20 68 65 72 65  ows written here
0770: 20 2a 2f 0a 20 20 69 6e 74 20 2a 6e 63 6f 6c 2c   */.  int *ncol,
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0790: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
07a0: 20 63 6f 6c 75 6d 6e 73 20 77 72 69 74 74 65 6e   columns written
07b0: 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20   here */.  char 
07c0: 2a 2a 65 72 72 6d 73 67 2c 20 20 20 20 20 20 20  **errmsg,       
07d0: 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77    /* Error msg w
07e0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
07f0: 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20   ...            
0800: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
0810: 65 6e 74 73 20 74 6f 20 74 68 65 20 66 6f 72 6d  ents to the form
0820: 61 74 20 73 74 72 69 6e 67 20 2a 2f 0a 29 3b 0a  at string */.);.
0830: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
0840: 61 72 20 2a 20 65 72 72 6f 72 4e 61 6d 65 28 69  ar * errorName(i
0850: 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20  nt rc){.  const 
0860: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
0870: 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b  .  switch( rc ){
0880: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0890: 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  _OK:         zNa
08a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22  me = "SQLITE_OK"
08b0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
08c0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
08d0: 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 7a 4e  E_ERROR:      zN
08e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52  ame = "SQLITE_ER
08f0: 52 4f 52 22 3b 20 20 20 20 20 20 20 62 72 65 61  ROR";       brea
0900: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0910: 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 7a  TE_INTERNAL:   z
0920: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
0930: 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 62 72 65  NTERNAL";    bre
0940: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0950: 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20  ITE_PERM:       
0960: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0970: 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 62 72  PERM";        br
0980: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0990: 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20  LITE_ABORT:     
09a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
09b0: 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20 62  _ABORT";       b
09c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
09d0: 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20  QLITE_BUSY:     
09e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
09f0: 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20  E_BUSY";        
0a00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0a10: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20  SQLITE_LOCKED:  
0a20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0a30: 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  TE_LOCKED";     
0a40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0a50: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20   SQLITE_NOMEM:  
0a60: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0a70: 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ITE_NOMEM";     
0a80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0a90: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
0aa0: 59 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  Y:   zName = "SQ
0ab0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20  LITE_READONLY"; 
0ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0ad0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  se SQLITE_INTERR
0ae0: 55 50 54 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  UPT:  zName = "S
0af0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22  QLITE_INTERRUPT"
0b00: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
0b10: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
0b20: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
0b30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20  SQLITE_IOERR";  
0b40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0b50: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
0b60: 55 50 54 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  UPT:    zName = 
0b70: 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22  "SQLITE_CORRUPT"
0b80: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
0b90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
0ba0: 46 4f 55 4e 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  FOUND:   zName =
0bb0: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e   "SQLITE_NOTFOUN
0bc0: 44 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  D";    break;.  
0bd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
0be0: 4c 4c 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  LL:       zName 
0bf0: 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b  = "SQLITE_FULL";
0c00: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0c10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
0c20: 41 4e 54 4f 50 45 4e 3a 20 20 20 7a 4e 61 6d 65  ANTOPEN:   zName
0c30: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
0c40: 50 45 4e 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  PEN";    break;.
0c50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0c60: 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 7a 4e 61 6d  PROTOCOL:   zNam
0c70: 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54  e = "SQLITE_PROT
0c80: 4f 43 4f 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b  OCOL";    break;
0c90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
0ca0: 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 7a 4e 61  _EMPTY:      zNa
0cb0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50  me = "SQLITE_EMP
0cc0: 54 59 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  TY";       break
0cd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
0ce0: 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 7a 4e  E_SCHEMA:     zN
0cf0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43  ame = "SQLITE_SC
0d00: 48 45 4d 41 22 3b 20 20 20 20 20 20 62 72 65 61  HEMA";      brea
0d10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0d20: 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 7a  TE_TOOBIG:     z
0d30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54  Name = "SQLITE_T
0d40: 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 62 72 65  OOBIG";      bre
0d50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0d60: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20  ITE_CONSTRAINT: 
0d70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0d80: 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 62 72  CONSTRAINT";  br
0d90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
0da0: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20  LITE_MISMATCH:  
0db0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
0dc0: 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 62  _MISMATCH";    b
0dd0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
0de0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20  QLITE_MISUSE:   
0df0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0e00: 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20  E_MISUSE";      
0e10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0e20: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20  SQLITE_NOLFS:   
0e30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0e40: 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20  TE_NOLFS";      
0e50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0e60: 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20   SQLITE_AUTH:   
0e70: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0e80: 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20  ITE_AUTH";      
0e90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
0ea0: 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a  e SQLITE_FORMAT:
0eb0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
0ec0: 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20  LITE_FORMAT";   
0ed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
0ee0: 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a  se SQLITE_RANGE:
0ef0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
0f00: 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20  QLITE_RANGE";   
0f10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0f20: 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20  ase SQLITE_ROW: 
0f30: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0f40: 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20  SQLITE_ROW";    
0f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0f60: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45  case SQLITE_DONE
0f70: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
0f80: 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20  "SQLITE_DONE";  
0f90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0fa0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
0fb0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
0fc0: 20 22 53 51 4c 49 54 45 5f 55 6e 6b 6e 6f 77 6e   "SQLITE_Unknown
0fd0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
0fe0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
0ff0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
1000: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
1010: 6e 20 73 71 6c 69 74 65 20 6f 62 6a 65 63 74 2e  n sqlite object.
1020: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1030: 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f  etDbPointer(Tcl_
1040: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
1060: 73 71 6c 69 74 65 20 2a 2a 70 70 44 62 29 7b 0a  sqlite **ppDb){.
1070: 20 20 69 66 28 20 73 73 63 61 6e 66 28 7a 41 2c    if( sscanf(zA,
1080: 20 50 54 52 5f 46 4d 54 2c 20 28 76 6f 69 64 2a   PTR_FMT, (void*
1090: 2a 29 70 70 44 62 29 21 3d 31 20 26 26 20 0a 20  *)ppDb)!=1 && . 
10a0: 20 20 20 20 20 28 7a 41 5b 30 5d 21 3d 27 30 27       (zA[0]!='0'
10b0: 20 7c 7c 20 7a 41 5b 31 5d 21 3d 27 78 27 20 7c   || zA[1]!='x' |
10c0: 7c 20 73 73 63 61 6e 66 28 26 7a 41 5b 32 5d 2c  | sscanf(&zA[2],
10d0: 20 50 54 52 5f 46 4d 54 2c 20 28 76 6f 69 64 2a   PTR_FMT, (void*
10e0: 2a 29 70 70 44 62 29 21 3d 31 29 0a 20 20 29 7b  *)ppDb)!=1).  ){
10f0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1100: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 5c  esult(interp, "\
1110: 22 22 2c 20 7a 41 2c 20 22 5c 22 20 69 73 20 6e  "", zA, "\" is n
1120: 6f 74 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ot a valid point
1130: 65 72 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20  er value", 0);. 
1140: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1150: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
1160: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1170: 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e  ** Decode a poin
1180: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
1190: 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a  3_stmt object..*
11a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
11b0: 53 74 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54  StmtPointer(.  T
11c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11d0: 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p, .  const char
11e0: 20 2a 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69   *zArg,  .  sqli
11f0: 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
1200: 74 0a 29 7b 0a 20 20 69 66 28 20 73 73 63 61 6e  t.){.  if( sscan
1210: 66 28 7a 41 72 67 2c 20 50 54 52 5f 46 4d 54 2c  f(zArg, PTR_FMT,
1220: 20 28 76 6f 69 64 2a 2a 29 70 70 53 74 6d 74 29   (void**)ppStmt)
1230: 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=1 ){.    Tcl_A
1240: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1250: 72 70 2c 20 22 5c 22 22 2c 20 7a 41 72 67 2c 20  rp, "\"", zArg, 
1260: 22 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  "\" is not a val
1270: 69 64 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65  id pointer value
1280: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1290: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12a0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
12b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
12c0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
12d0: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  n sqlite3_stmt o
12e0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
12f0: 20 69 6e 74 20 67 65 74 46 69 6c 65 50 6f 69 6e   int getFilePoin
1300: 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ter(.  Tcl_Inter
1310: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f  p *interp, .  co
1320: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20  nst char *zArg, 
1330: 20 0a 20 20 4f 73 46 69 6c 65 20 2a 2a 70 70 46   .  OsFile **ppF
1340: 69 6c 65 0a 29 7b 0a 20 20 69 66 28 20 73 73 63  ile.){.  if( ssc
1350: 61 6e 66 28 7a 41 72 67 2c 20 50 54 52 5f 46 4d  anf(zArg, PTR_FM
1360: 54 2c 20 28 76 6f 69 64 2a 2a 29 70 70 46 69 6c  T, (void**)ppFil
1370: 65 29 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  e)!=1 ){.    Tcl
1380: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1390: 74 65 72 70 2c 20 22 5c 22 22 2c 20 7a 41 72 67  terp, "\"", zArg
13a0: 2c 20 22 5c 22 20 69 73 20 6e 6f 74 20 61 20 76  , "\" is not a v
13b0: 61 6c 69 64 20 70 6f 69 6e 74 65 72 20 76 61 6c  alid pointer val
13c0: 75 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ue", 0);.    ret
13d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
13f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  OK;.}../*.** Gen
1400: 65 72 61 74 65 20 61 20 74 65 78 74 20 72 65 70  erate a text rep
1410: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
1420: 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 63 61   pointer that ca
1430: 6e 20 62 65 20 75 6e 64 65 72 73 74 6f 6f 64 0a  n be understood.
1440: 2a 2a 20 62 79 20 74 68 65 20 67 65 74 44 62 50  ** by the getDbP
1450: 6f 69 6e 74 65 72 20 61 6e 64 20 67 65 74 56 6d  ointer and getVm
1460: 50 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e 65 73  Pointer routines
1470: 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   above..**.** Th
1480: 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c 20 6f 6e  e problem is, on
1490: 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65 73 20 28   some machines (
14a0: 53 6f 6c 61 72 69 73 29 20 69 66 20 79 6f 75 20  Solaris) if you 
14b0: 64 6f 20 61 20 70 72 69 6e 74 66 20 77 69 74 68  do a printf with
14c0: 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20 63 61 6e  .** "%p" you can
14d0: 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75 6e 64 20  not turn around 
14e0: 61 6e 64 20 64 6f 20 61 20 73 63 61 6e 66 20 77  and do a scanf w
14f0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 22 25 70  ith the same "%p
1500: 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20 79 6f 75  " and.** get you
1510: 72 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 2e 20  r pointer back. 
1520: 20 59 6f 75 20 68 61 76 65 20 74 6f 20 70 72 65   You have to pre
1530: 70 65 6e 64 20 61 20 22 30 78 22 20 62 65 66 6f  pend a "0x" befo
1540: 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 77 6f  re it will.** wo
1550: 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65 61 73 74  rk.  Or at least
1560: 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69 73   that is what is
1570: 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
1580: 28 64 72 68 29 2e 20 20 42 75 74 20 74 68 69 73  (drh).  But this
1590: 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20 76 61 72  .** behavior var
15a0: 69 65 73 20 66 72 6f 6d 20 6d 61 63 68 69 6e 65  ies from machine
15b0: 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20 20 54 68   to machine.  Th
15c0: 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73 65 64 20  e solution used 
15d0: 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20 74 65 73  her is.** to tes
15e0: 74 20 74 68 65 20 73 74 72 69 6e 67 20 72 69 67  t the string rig
15f0: 68 74 20 61 66 74 65 72 20 69 74 20 69 73 20 67  ht after it is g
1600: 65 6e 65 72 61 74 65 64 20 74 6f 20 73 65 65 20  enerated to see 
1610: 69 66 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20  if it can be.** 
1620: 75 6e 64 65 72 73 74 6f 6f 64 20 62 79 20 73 63  understood by sc
1630: 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e 6f 74 2c  anf, and if not,
1640: 20 74 72 79 20 70 72 65 70 65 6e 64 69 6e 67 20   try prepending 
1650: 61 6e 20 22 30 78 22 20 74 6f 20 73 65 65 20 69  an "0x" to see i
1660: 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c 70 73 2e  f.** that helps.
1670: 20 20 49 66 20 6e 6f 74 68 69 6e 67 20 77 6f 72    If nothing wor
1680: 6b 73 2c 20 61 20 66 61 74 61 6c 20 65 72 72 6f  ks, a fatal erro
1690: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e 0a  r is generated..
16a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61  */.static int ma
16b0: 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63 6c  kePointerStr(Tcl
16c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16d0: 20 63 68 61 72 20 2a 7a 50 74 72 2c 20 76 6f 69   char *zPtr, voi
16e0: 64 20 2a 70 29 7b 0a 20 20 76 6f 69 64 20 2a 70  d *p){.  void *p
16f0: 32 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 50 74  2;.  sprintf(zPt
1700: 72 2c 20 50 54 52 5f 46 4d 54 2c 20 70 29 3b 0a  r, PTR_FMT, p);.
1710: 20 20 69 66 28 20 73 73 63 61 6e 66 28 7a 50 74    if( sscanf(zPt
1720: 72 2c 20 50 54 52 5f 46 4d 54 2c 20 26 70 32 29  r, PTR_FMT, &p2)
1730: 21 3d 31 20 7c 7c 20 70 32 21 3d 70 20 29 7b 0a  !=1 || p2!=p ){.
1740: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 50 74 72      sprintf(zPtr
1750: 2c 20 22 30 78 22 20 50 54 52 5f 46 4d 54 2c 20  , "0x" PTR_FMT, 
1760: 70 29 3b 0a 20 20 20 20 69 66 28 20 73 73 63 61  p);.    if( ssca
1770: 6e 66 28 7a 50 74 72 2c 20 50 54 52 5f 46 4d 54  nf(zPtr, PTR_FMT
1780: 2c 20 26 70 32 29 21 3d 31 20 7c 7c 20 70 32 21  , &p2)!=1 || p2!
1790: 3d 70 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =p ){.      Tcl_
17a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
17b0: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
17c0: 63 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65  convert a pointe
17d0: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 22 0a  r to a string ".
17e0: 20 20 20 20 20 20 20 20 20 22 69 6e 20 74 68 65           "in the
17f0: 20 66 69 6c 65 20 22 20 5f 5f 46 49 4c 45 5f 5f   file " __FILE__
1800: 20 22 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6d   " in function m
1810: 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 29 2e  akePointerStr().
1820: 20 20 50 6c 65 61 73 65 20 22 0a 20 20 20 20 20    Please ".     
1830: 20 20 20 20 22 72 65 70 6f 72 74 20 74 68 69 73      "report this
1840: 20 70 72 6f 62 6c 65 6d 20 74 6f 20 74 68 65 20   problem to the 
1850: 53 51 4c 69 74 65 20 6d 61 69 6c 69 6e 67 20 6c  SQLite mailing l
1860: 69 73 74 20 6f 72 20 61 73 20 61 20 6e 65 77 20  ist or as a new 
1870: 62 75 74 20 22 0a 20 20 20 20 20 20 20 20 20 22  but ".         "
1880: 72 65 70 6f 72 74 2e 20 20 50 6c 65 61 73 65 20  report.  Please 
1890: 70 72 6f 76 69 64 65 20 64 65 74 61 69 6c 65 64  provide detailed
18a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
18b0: 75 74 20 68 6f 77 20 79 6f 75 20 63 6f 6d 70 69  ut how you compi
18c0: 6c 65 64 20 22 0a 20 20 20 20 20 20 20 20 20 22  led ".         "
18d0: 53 51 4c 69 74 65 20 61 6e 64 20 77 68 61 74 20  SQLite and what 
18e0: 63 6f 6d 70 75 74 65 72 20 79 6f 75 20 61 72 65  computer you are
18f0: 20 72 75 6e 6e 69 6e 67 20 6f 6e 2e 22 2c 20 30   running on.", 0
1900: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1910: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
1920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1930: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  L_OK;.}../*.** T
1940: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
1950: 69 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ine for sqlite3_
1960: 65 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a 2a  exec_printf()..*
1970: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65  /.static int exe
1980: 63 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69 64  c_printf_cb(void
1990: 20 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67 63   *pArg, int argc
19a0: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
19b0: 68 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20 54  har **name){.  T
19c0: 63 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72 20  cl_DString *str 
19d0: 3d 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a 29  = (Tcl_DString*)
19e0: 70 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  pArg;.  int i;..
19f0: 20 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69 6e    if( Tcl_DStrin
1a00: 67 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30 20  gLength(str)==0 
1a10: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
1a20: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
1a30: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41      Tcl_DStringA
1a40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72  ppendElement(str
1a50: 2c 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d 65  , name[i] ? name
1a60: 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20  [i] : "NULL");. 
1a70: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
1a80: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
1a90: 7b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  {.    Tcl_DStrin
1aa0: 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73  gAppendElement(s
1ab0: 74 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61 72  tr, argv[i] ? ar
1ac0: 67 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b  gv[i] : "NULL");
1ad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1ae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1af0: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70    sqlite3_exec_p
1b00: 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41  rintf  DB  FORMA
1b10: 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20  T  STRING.**.** 
1b20: 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74  Invoke the sqlit
1b30: 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 29  e3_exec_printf()
1b40: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
1b50: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1b60: 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53  se.** DB.  The S
1b70: 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  QL is the string
1b80: 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f   FORMAT.  The fo
1b90: 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75  rmat string shou
1ba0: 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e  ld contain.** on
1bb0: 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52  e %s or %q.  STR
1bc0: 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75 65  ING is the value
1bd0: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
1be0: 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74  s or %q..*/.stat
1bf0: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63  ic int test_exec
1c00: 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20  _printf(.  void 
1c10: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1c20: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1c30: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1c40: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1c50: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1c60: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
1c70: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1c80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1c90: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
1ca0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
1cb0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
1cc0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1cd0: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a  {.  sqlite *db;.
1ce0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74    Tcl_DString st
1cf0: 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  r;.  int rc;.  c
1d00: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
1d10: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
1d20: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
1d30: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1d40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1d50: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1d60: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1d70: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
1d80: 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22  B FORMAT STRING"
1d90: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1da0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1db0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1dc0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1dd0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1de0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1df0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
1e00: 73 74 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  str);.  rc = sql
1e10: 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
1e20: 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 65 78  (db, argv[2], ex
1e30: 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73  ec_printf_cb, &s
1e40: 74 72 2c 20 26 7a 45 72 72 2c 20 61 72 67 76 5b  tr, &zErr, argv[
1e50: 33 5d 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  3]);.  sprintf(z
1e60: 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a  Buf, "%d", rc);.
1e70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
1e80: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
1e90: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
1ea0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
1eb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
1ec0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
1ed0: 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20  &str) : zErr);. 
1ee0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
1ef0: 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45  (&str);.  if( zE
1f00: 72 72 20 29 20 66 72 65 65 28 7a 45 72 72 29 3b  rr ) free(zErr);
1f10: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1f20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1f30: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
1f40: 74 66 5f 7a 5f 74 65 73 74 20 20 53 45 50 41 52  tf_z_test  SEPAR
1f50: 41 54 4f 52 20 20 41 52 47 30 20 20 41 52 47 31  ATOR  ARG0  ARG1
1f60: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20   ....**.** Test 
1f70: 74 68 65 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66  the %z format of
1f80: 20 6d 70 72 69 6e 74 66 28 29 2e 20 20 55 73 65   mprintf().  Use
1f90: 20 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74   multiple mprint
1fa0: 66 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  f() calls to .**
1fb0: 20 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67   concatenate arg
1fc0: 30 20 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75  0 through argn u
1fd0: 73 69 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61  sing separator a
1fe0: 73 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e  s the separator.
1ff0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
2000: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
2010: 20 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74   int test_mprint
2020: 66 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  f_z(.  void *Not
2030: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2040: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2050: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2060: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2070: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2080: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
20b0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
20c0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
20d0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
20e0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
20f0: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20  char *zResult = 
2100: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66  0;.  int i;..  f
2110: 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20  or(i=2; i<argc; 
2120: 69 2b 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c  i++){.    zResul
2130: 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
2140: 74 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65  tf("%z%s%s", zRe
2150: 73 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61  sult, argv[1], a
2160: 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54  rgv[i]);.  }.  T
2170: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2180: 69 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c  interp, zResult,
2190: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   0);.  sqliteFre
21a0: 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72 65  e(zResult);.  re
21b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
21c0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
21d0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
21e0: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
21f0: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
2200: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
2210: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
2220: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
2230: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
2240: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
2250: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
2260: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
2270: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
2280: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
2290: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
22a0: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
22b0: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
22c0: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
22d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
22e0: 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  t_get_table_prin
22f0: 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  tf(.  void *NotU
2300: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
2310: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2320: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2330: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2340: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2350: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
2360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2370: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2380: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
2390: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
23a0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
23b0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
23c0: 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 54 63 6c  qlite *db;.  Tcl
23d0: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
23e0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
23f0: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zErr = 0;.  int 
2400: 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63 68  nRow, nCol;.  ch
2410: 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20 20  ar **aResult;.  
2420: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42  int i;.  char zB
2430: 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72  uf[30];.  if( ar
2440: 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=4 ){.    Tcl
2450: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2460: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
2470: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
2480: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
2490: 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54       " DB FORMAT
24a0: 20 53 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20   STRING", 0);.  
24b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24c0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
24d0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
24e0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
24f0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2500: 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ROR;.  Tcl_DStri
2510: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
2520: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  rc = sqlite3_get
2530: 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 64 62  _table_printf(db
2540: 2c 20 61 72 67 76 5b 32 5d 2c 20 26 61 52 65 73  , argv[2], &aRes
2550: 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f  ult, &nRow, &nCo
2560: 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  l, .            
2570: 20 20 20 26 7a 45 72 72 2c 20 61 72 67 76 5b 33     &zErr, argv[3
2580: 5d 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  ]);.  sprintf(zB
2590: 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20  uf, "%d", rc);. 
25a0: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
25b0: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29  nt(interp, zBuf)
25c0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
25d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 70 72  TE_OK ){.    spr
25e0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
25f0: 20 6e 52 6f 77 29 3b 0a 20 20 20 20 54 63 6c 5f   nRow);.    Tcl_
2600: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2610: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20  terp, zBuf);.   
2620: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
2630: 25 64 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  %d", nCol);.    
2640: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
2650: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b  t(interp, zBuf);
2660: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2670: 28 6e 52 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 20 69  (nRow+1)*nCol; i
2680: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ++){.      Tcl_A
2690: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
26a0: 65 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20  erp, aResult[i] 
26b0: 3f 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22  ? aResult[i] : "
26c0: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20  NULL");.    }.  
26d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41  }else{.    Tcl_A
26e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
26f0: 65 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a  erp, zErr);.  }.
2700: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74    sqlite3_free_t
2710: 61 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20  able(aResult);. 
2720: 20 69 66 28 20 7a 45 72 72 20 29 20 66 72 65 65   if( zErr ) free
2730: 28 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e  (zErr);.  return
2740: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
2750: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
2760: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
2770: 6f 77 69 64 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  owid DB.**.** Re
2780: 74 75 72 6e 73 20 74 68 65 20 69 6e 74 65 67 65  turns the intege
2790: 72 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d  r ROWID of the m
27a0: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
27b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
27c0: 20 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64   test_last_rowid
27d0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
27e0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
27f0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2800: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2810: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2820: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2830: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
2840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2850: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2860: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
2870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2880: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
2890: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
28a0: 69 74 65 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  ite *db;.  char 
28b0: 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28  zBuf[30];..  if(
28c0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
28d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
28e0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
28f0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2900: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2910: 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20  " DB\"", 0);.   
2920: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2930: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2940: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2950: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
2960: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2970: 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  OR;.  sprintf(zB
2980: 75 66 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69  uf, "%lld", sqli
2990: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
29a0: 72 6f 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63  rowid(db));.  Tc
29b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
29c0: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
29d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
29f0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c  age:  sqlite3_cl
2a00: 6f 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f  ose DB.**.** Clo
2a10: 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
2a20: 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
2a30: 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  e3_open..*/.stat
2a40: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74 65  ic int sqlite_te
2a50: 73 74 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69 64  st_close(.  void
2a60: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
2a70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2a80: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2a90: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2aa0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2ab0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
2ac0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
2ad0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2ae0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
2af0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
2b00: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
2b10: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
2b20: 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b  ){.  sqlite *db;
2b30: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
2b40: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2b50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2b60: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
2b70: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
2b80: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
2b90: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
2ba0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2bb0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2bc0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2bd0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
2be0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
2bf0: 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
2c00: 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 72 65  _close(db);.  re
2c10: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2c20: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
2c30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f  tion of the x_co
2c40: 61 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f  alesce() functio
2c50: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  n..** Return the
2c60: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
2c70: 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
2c80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2c90: 64 20 69 66 6e 75 6c 6c 46 75 6e 63 28 73 71 6c  d ifnullFunc(sql
2ca0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
2cb0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
2cc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2cd0: 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 69 3b  *argv){.  int i;
2ce0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
2cf0: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  gc; i++){.    if
2d00: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73  ( SQLITE_NULL!=s
2d10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
2d20: 65 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20  e(argv[i]) ){.  
2d30: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2d40: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
2d50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
2d60: 65 78 74 28 61 72 67 76 5b 69 5d 29 2c 20 2d 31  ext(argv[i]), -1
2d70: 2c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ,.          SQLI
2d80: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
2d90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2da0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
2db0: 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20   structure into 
2dc0: 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75 6c  which to accumul
2dd0: 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 72  ate text..*/.str
2de0: 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69 6e 74  uct dstr {.  int
2df0: 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53 70 61   nAlloc;  /* Spa
2e00: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  ce allocated */.
2e10: 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 20 2f    int nUsed;   /
2e20: 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a 2f 0a  * Space used */.
2e30: 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 2f    char *z;     /
2e40: 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f 0a 7d  * The space */.}
2e50: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  ;../*.** Append 
2e60: 74 65 78 74 20 74 6f 20 61 20 64 73 74 72 0a 2a  text to a dstr.*
2e70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 73  /.static void ds
2e80: 74 72 41 70 70 65 6e 64 28 73 74 72 75 63 74 20  trAppend(struct 
2e90: 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74 20 63  dstr *p, const c
2ea0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69 76 69  har *z, int divi
2eb0: 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  der){.  int n = 
2ec0: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66 28  strlen(z);.  if(
2ed0: 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20 2b 20   p->nUsed + n + 
2ee0: 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  2 > p->nAlloc ){
2ef0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  .    char *zNew;
2f00: 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d  .    p->nAlloc =
2f10: 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e   p->nAlloc*2 + n
2f20: 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e 65 77   + 200;.    zNew
2f30: 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63   = sqliteRealloc
2f40: 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63  (p->z, p->nAlloc
2f50: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 3d  );.    if( zNew=
2f60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2f70: 74 65 46 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20  teFree(p->z);.  
2f80: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
2f90: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2fa0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2fb0: 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65  }.    p->z = zNe
2fc0: 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 76  w;.  }.  if( div
2fd0: 69 64 65 72 20 26 26 20 70 2d 3e 6e 55 73 65 64  ider && p->nUsed
2fe0: 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70  >0 ){.    p->z[p
2ff0: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69 76  ->nUsed++] = div
3000: 69 64 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  ider;.  }.  memc
3010: 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65  py(&p->z[p->nUse
3020: 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70  d], z, n+1);.  p
3030: 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a  ->nUsed += n;.}.
3040: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20 66  ./*.** Invoked f
3050: 6f 72 20 65 61 63 68 20 63 61 6c 6c 62 61 63 6b  or each callback
3060: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 65   from sqlite3Exe
3070: 63 46 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63 20  cFunc.*/.static 
3080: 69 6e 74 20 65 78 65 63 46 75 6e 63 43 61 6c 6c  int execFuncCall
3090: 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
30a0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
30b0: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
30c0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 73 74 72 75  NotUsed){.  stru
30d0: 63 74 20 64 73 74 72 20 2a 70 20 3d 20 28 73 74  ct dstr *p = (st
30e0: 72 75 63 74 20 64 73 74 72 2a 29 70 44 61 74 61  ruct dstr*)pData
30f0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
3100: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
3110: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76  +){.    if( argv
3120: 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
3130: 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 22 4e  dstrAppend(p, "N
3140: 55 4c 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20 20  ULL", ' ');.    
3150: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 73 74  }else{.      dst
3160: 72 41 70 70 65 6e 64 28 70 2c 20 61 72 67 76 5b  rAppend(p, argv[
3170: 69 5d 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 0a  i], ' ');.    }.
3180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3190: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
31a0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78  ntation of the x
31b0: 5f 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20  _sqlite3_exec() 
31c0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
31d0: 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a  function takes.*
31e0: 2a 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d  * a single argum
31f0: 65 6e 74 20 61 6e 64 20 61 74 74 65 6d 70 74 73  ent and attempts
3200: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
3210: 20 61 72 67 75 6d 65 6e 74 20 61 73 20 53 51 4c   argument as SQL
3220: 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69   code..** This i
3230: 73 20 69 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68  s illegal and sh
3240: 6f 75 6c 64 20 73 65 74 20 74 68 65 20 53 51 4c  ould set the SQL
3250: 49 54 45 5f 4d 49 53 55 53 45 20 66 6c 61 67 20  ITE_MISUSE flag 
3260: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
3270: 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d  .**.** 2004-Jan-
3280: 30 37 3a 20 20 57 65 20 68 61 76 65 20 63 68 61  07:  We have cha
3290: 6e 67 65 64 20 74 68 69 73 20 74 6f 20 6d 61 6b  nged this to mak
32a0: 65 20 69 74 20 6c 65 67 61 6c 20 74 6f 20 63 61  e it legal to ca
32b0: 6c 6c 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  ll sqlite3_exec(
32c0: 29 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e  ).** from within
32d0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
32e0: 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  .  .** .** This 
32f0: 72 6f 75 74 69 6e 65 20 73 69 6d 75 6c 61 74 65  routine simulate
3300: 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
3310: 68 61 76 69 6e 67 20 74 77 6f 20 74 68 72 65 61  having two threa
3320: 64 73 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ds attempt to.**
3330: 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61   use the same da
3340: 74 61 62 61 73 65 20 61 74 20 74 68 65 20 73 61  tabase at the sa
3350: 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74  me time..*/.stat
3360: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45  ic void sqlite3E
3370: 78 65 63 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  xecFunc(.  sqlit
3380: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
3390: 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
33a0: 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ,  .  sqlite3_va
33b0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
33c0: 73 74 72 75 63 74 20 64 73 74 72 20 78 3b 0a 20  struct dstr x;. 
33d0: 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73   memset(&x, 0, s
33e0: 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 73 71 6c  izeof(x));.  sql
33f0: 69 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69 74  ite3_exec((sqlit
3400: 65 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  e*)sqlite3_user_
3410: 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a 20  data(context),. 
3420: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
3430: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
3440: 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75 6e 63  ,.      execFunc
3450: 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20 30 29  Callback, &x, 0)
3460: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
3470: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
3480: 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c 20 53   x.z, x.nUsed, S
3490: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
34a0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 78  ;.  sqliteFree(x
34b0: 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  .z);.}../*.** Us
34c0: 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 74 65 73  age:  sqlite_tes
34d0: 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  t_create_functio
34e0: 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  n DB.**.** Call 
34f0: 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61  the sqlite3_crea
3500: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20  te_function API 
3510: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  on the given dat
3520: 61 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a  abase in order.*
3530: 2a 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75  * to create a fu
3540: 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f  nction named "x_
3550: 63 6f 61 6c 65 73 63 65 22 2e 20 20 54 68 69 73  coalesce".  This
3560: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
3570: 68 65 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a  he same thing.**
3580: 20 61 73 20 74 68 65 20 22 63 6f 61 6c 65 73 63   as the "coalesc
3590: 65 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  e" function.  Th
35a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  is function also
35b0: 20 72 65 67 69 73 74 65 72 73 20 61 6e 20 53 51   registers an SQ
35c0: 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61  L function.** na
35d0: 6d 65 64 20 22 78 5f 73 71 6c 69 74 65 33 5f 65  med "x_sqlite3_e
35e0: 78 65 63 22 20 74 68 61 74 20 69 6e 76 6f 6b 65  xec" that invoke
35f0: 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  s sqlite3_exec()
3600: 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73 71 6c 69  .  Invoking sqli
3610: 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 69 6e  te3_exec().** in
3620: 20 74 68 69 73 20 77 61 79 20 69 73 20 69 6c 6c   this way is ill
3630: 65 67 61 6c 20 72 65 63 75 72 73 69 6f 6e 20 61  egal recursion a
3640: 6e 64 20 73 68 6f 75 6c 64 20 72 61 69 73 65 20  nd should raise 
3650: 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  an SQLITE_MISUSE
3660: 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 65   error..** The e
3670: 66 66 65 63 74 20 69 73 20 73 69 6d 69 6c 61 72  ffect is similar
3680: 20 74 6f 20 74 72 79 69 6e 67 20 74 6f 20 75 73   to trying to us
3690: 65 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  e the same datab
36a0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ase connection f
36b0: 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68 72 65 61  rom.** two threa
36c0: 64 73 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  ds at the same t
36d0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ime..**.** The o
36e0: 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69  riginal motivati
36f0: 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  on for this rout
3700: 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61 62  ine was to be ab
3710: 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a  le to call the.*
3720: 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
3730: 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69  _function functi
3740: 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65 72 79  on while a query
3750: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20   is in progress 
3760: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74  in order.** to t
3770: 65 73 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  est the SQLITE_M
3780: 49 53 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20  ISUSE detection 
3790: 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  logic..*/.static
37a0: 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65   int test_create
37b0: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69  _function(.  voi
37c0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
37d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
37e0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
37f0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3800: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3810: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3820: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
3830: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3840: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3850: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
3860: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
3870: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
3880: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  .){.  sqlite *db
3890: 3b 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20  ;.  extern void 
38a0: 4d 64 35 5f 52 65 67 69 73 74 65 72 28 73 71 6c  Md5_Register(sql
38b0: 69 74 65 2a 29 3b 0a 20 20 69 66 28 20 61 72 67  ite*);.  if( arg
38c0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
38d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
38e0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
38f0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
3900: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
3910: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
3920: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
3930: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
3940: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
3950: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
3960: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
3970: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
3980: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
3990: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f  nction(db, "x_co
39a0: 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c  alesce", -1, SQL
39b0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20  ITE_UTF8, 0, 0, 
39c0: 0a 20 20 20 20 20 20 69 66 6e 75 6c 6c 46 75 6e  .      ifnullFun
39d0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  c, 0, 0);.  sqli
39e0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
39f0: 69 6f 6e 28 64 62 2c 20 22 78 5f 73 71 6c 69 74  ion(db, "x_sqlit
3a00: 65 33 5f 65 78 65 63 22 2c 20 31 2c 20 53 51 4c  e3_exec", 1, SQL
3a10: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 64 62 2c  ITE_UTF8, 0, db,
3a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
3a30: 65 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  ecFunc, 0, 0);. 
3a40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
3a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
3a60: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
3a70: 68 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67  he x_count() agg
3a80: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
3a90: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
3aa0: 63 74 20 43 6f 75 6e 74 43 74 78 20 43 6f 75 6e  ct CountCtx Coun
3ab0: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 43 6f 75  tCtx;.struct Cou
3ac0: 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b  ntCtx {.  int n;
3ad0: 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .};.static void 
3ae0: 63 6f 75 6e 74 53 74 65 70 28 73 71 6c 69 74 65  countStep(sqlite
3af0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
3b00: 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71  xt, int argc, sq
3b10: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
3b20: 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43 74 78 20  gv){.  CountCtx 
3b30: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
3b40: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
3b50: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
3b60: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
3b70: 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49  (argc==0 || SQLI
3b80: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
3b90: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
3ba0: 5b 30 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20  [0]) ) && p ){. 
3bb0: 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 7d     p->n++;.  }.}
3bc0: 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20     .static void 
3bd0: 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71  countFinalize(sq
3be0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3bf0: 6f 6e 74 65 78 74 29 7b 0a 20 20 43 6f 75 6e 74  ontext){.  Count
3c00: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
3c10: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
3c20: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
3c30: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
3c40: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
3c50: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20  nt(context, p ? 
3c60: 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a  p->n : 0);.}../*
3c70: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3c80: 74 65 5f 74 65 73 74 5f 63 72 65 61 74 65 5f 61  te_test_create_a
3c90: 67 67 72 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a  ggregate DB.**.*
3ca0: 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74  * Call the sqlit
3cb0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
3cc0: 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69  on API on the gi
3cd0: 76 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20  ven database in 
3ce0: 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61  order.** to crea
3cf0: 74 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61  te a function na
3d00: 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20  med "x_count".  
3d10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
3d20: 65 73 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e  es the same thin
3d30: 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 6d 64 35  g.** as the "md5
3d40: 73 75 6d 22 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  sum" function..*
3d50: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
3d60: 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72  l motivation for
3d70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
3d80: 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  s to be able to 
3d90: 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69  call the.** sqli
3da0: 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65  te3_create_aggre
3db0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77 68  gate function wh
3dc0: 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20 69  ile a query is i
3dd0: 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72  n progress in or
3de0: 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74  der.** to test t
3df0: 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  he SQLITE_MISUSE
3e00: 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63   detection logic
3e10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3e20: 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72  test_create_aggr
3e30: 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e  egate(.  void *N
3e40: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
3e50: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
3e60: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
3e70: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
3e80: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
3e90: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3eb0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
3ec0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
3ed0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
3ee0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3ef0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3f00: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
3f10: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
3f20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
3f30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
3f40: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
3f50: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
3f60: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
3f70: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
3f80: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3f90: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
3fa0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
3fb0: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
3fc0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3fd0: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72  OR;.  sqlite3_cr
3fe0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
3ff0: 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20  , "x_count", 0, 
4000: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
4010: 30 2c 20 30 2c 0a 20 20 20 20 20 20 63 6f 75 6e  0, 0,.      coun
4020: 74 53 74 65 70 2c 63 6f 75 6e 74 46 69 6e 61 6c  tStep,countFinal
4030: 69 7a 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ize);.  sqlite3_
4040: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
4050: 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 31  db, "x_count", 1
4060: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
4070: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 63 6f  , 0, 0,.      co
4080: 75 6e 74 53 74 65 70 2c 63 6f 75 6e 74 46 69 6e  untStep,countFin
4090: 61 6c 69 7a 65 29 3b 0a 20 20 72 65 74 75 72 6e  alize);.  return
40a0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a   TCL_OK;.}..../*
40b0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
40c0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20  te3_mprintf_int 
40d0: 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49  FORMAT INTEGER I
40e0: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a  NTEGER INTEGER.*
40f0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
4100: 66 20 77 69 74 68 20 74 68 72 65 65 20 69 6e 74  f with three int
4110: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a  eger arguments.*
4120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
4130: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
4140: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4150: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
4160: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4170: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4180: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4190: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
41a0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
41b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
41c0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
41d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
41f0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4200: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
4210: 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72   a[3], i;.  char
4220: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21   *z;.  if( argc!
4230: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
4240: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4250: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4260: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4270: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
4280: 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e   " FORMAT INT IN
4290: 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20  T INT\"", 0);.  
42a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
42b0: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
42c0: 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  2; i<5; i++){.  
42d0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
42e0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
42f0: 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74  , &a[i-2]) ) ret
4300: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4310: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
4320: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
4330: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b  , a[0], a[1], a[
4340: 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2]);.  Tcl_Appen
4350: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4360: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
4370: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
4380: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
4390: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
43a0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20  te3_mprintf_str 
43b0: 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49  FORMAT INTEGER I
43c0: 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a 2a 2a  NTEGER STRING.**
43d0: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
43e0: 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65   with two intege
43f0: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  r arguments and 
4400: 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d  one string argum
4410: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ent.*/.static in
4420: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
4430: 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e  f_str(.  void *N
4440: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
4450: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
4460: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
4470: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
4480: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
4490: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
44b0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
44c0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
44d0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
44e0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
44f0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
4500: 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20    int a[3], i;. 
4510: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
4520: 61 72 67 63 3c 34 20 7c 7c 20 61 72 67 63 3e 35  argc<4 || argc>5
4530: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4540: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4550: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4560: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4570: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
4580: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
4590: 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b  ?STRING?\"", 0);
45a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
45b0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
45c0: 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b  (i=2; i<4; i++){
45d0: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
45e0: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
45f0: 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20  [i], &a[i-2]) ) 
4600: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4610: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
4620: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
4630: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
4640: 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76 5b 34   argc>4 ? argv[4
4650: 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c  ] : NULL);.  Tcl
4660: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4670: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
4680: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
4690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
46a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
46b0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
46c0: 66 5f 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54  f_str FORMAT INT
46d0: 45 47 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55  EGER INTEGER DOU
46e0: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  BLE.**.** Call m
46f0: 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20  printf with two 
4700: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
4710: 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65  s and one double
4720: 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61   argument.*/.sta
4730: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
4740: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a  mprintf_double(.
4750: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
4760: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
4770: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
4780: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
4790: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
47a0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
47b0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
47c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
47d0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
47e0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
47f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
4800: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
4810: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
4820: 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65  [3], i;.  double
4830: 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   r;.  char *z;. 
4840: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
4850: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4860: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4870: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4880: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4890: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
48a0: 4d 41 54 20 49 4e 54 20 49 4e 54 20 53 54 52 49  MAT INT INT STRI
48b0: 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NG\"", 0);.    r
48c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
48d0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
48e0: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
48f0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
4900: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
4910: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
4920: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4930: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75    if( Tcl_GetDou
4940: 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ble(interp, argv
4950: 5b 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72  [4], &r) ) retur
4960: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
4970: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
4980: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
4990: 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63  , a[1], r);.  Tc
49a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
49b0: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
49c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
49d0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
49e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
49f0: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
4a00: 74 66 5f 73 74 72 20 46 4f 52 4d 41 54 20 44 4f  tf_str FORMAT DO
4a10: 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a  UBLE DOUBLE.**.*
4a20: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
4a30: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
4a40: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
4a50: 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75 63  ch is the produc
4a60: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20  t of the.** two 
4a70: 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20  arguments given 
4a80: 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20  above.  This is 
4a90: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
4aa0: 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e   overflow and un
4ab0: 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c  derflow.** doubl
4ac0: 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  es to test that 
4ad0: 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74  they are convert
4ae0: 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ed properly..*/.
4af0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
4b00: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
4b10: 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  d(.  void *NotUs
4b20: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
4b30: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4b40: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4b50: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4b60: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4b70: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
4b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4b90: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4ba0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
4bb0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
4bc0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
4bd0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
4be0: 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 5b  t i;.  double r[
4bf0: 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  2];.  char *z;. 
4c00: 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b 0a   if( argc!=4 ){.
4c10: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4c20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4c30: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4c40: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4c50: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
4c60: 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c  MAT DOUBLE DOUBL
4c70: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
4c80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4c90: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
4ca0: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <4; i++){.    if
4cb0: 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28  ( Tcl_GetDouble(
4cc0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c  interp, argv[i],
4cd0: 20 26 72 5b 69 2d 32 5d 29 20 29 20 72 65 74 75   &r[i-2]) ) retu
4ce0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4cf0: 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  }.  z = sqlite3_
4d00: 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c  mprintf(argv[1],
4d10: 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54   r[0]*r[1]);.  T
4d20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4d30: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
4d40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
4d50: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
4d60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4d70: 65 3a 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  e: sqlite_malloc
4d80: 5f 66 61 69 6c 20 4e 0a 2a 2a 0a 2a 2a 20 52 69  _fail N.**.** Ri
4d90: 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  g sqliteMalloc()
4da0: 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   to fail on the 
4db0: 4e 2d 74 68 20 63 61 6c 6c 2e 20 20 54 75 72 6e  N-th call.  Turn
4dc0: 20 6f 66 66 20 74 68 69 73 20 6d 65 63 68 61 6e   off this mechan
4dd0: 69 73 6d 0a 2a 2a 20 61 6e 64 20 72 65 73 65 74  ism.** and reset
4de0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 61 6c   the sqlite3_mal
4df0: 6c 6f 63 5f 66 61 69 6c 65 64 20 76 61 72 69 61  loc_failed varia
4e00: 62 6c 65 20 69 73 20 4e 3d 3d 30 2e 0a 2a 2f 0a  ble is N==0..*/.
4e10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
4e20: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 73  BUG.static int s
4e30: 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69  qlite_malloc_fai
4e40: 6c 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  l(.  void *NotUs
4e50: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
4e60: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
4e70: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
4e80: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
4e90: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
4ea0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
4eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4ec0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4ed0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
4ee0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
4ef0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
4f00: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
4f10: 74 20 6e 3b 0a 20 20 69 66 28 20 61 72 67 63 21  t n;.  if( argc!
4f20: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
4f30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4f40: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4f50: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4f60: 20 61 72 67 76 5b 30 5d 2c 20 22 20 4e 5c 22 22   argv[0], " N\""
4f70: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4f80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4f90: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
4fa0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
4fb0: 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54  , &n) ) return T
4fc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
4fd0: 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 20  te3_iMallocFail 
4fe0: 3d 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = n;.  sqlite3_m
4ff0: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 30  alloc_failed = 0
5000: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
5010: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
5020: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
5030: 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 0a 2a 2a 0a  _malloc_stat.**.
5040: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
5050: 6d 62 65 72 20 6f 66 20 70 72 69 6f 72 20 63 61  mber of prior ca
5060: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 4d 61 6c  lls to sqliteMal
5070: 6c 6f 63 28 29 20 61 6e 64 20 73 71 6c 69 74 65  loc() and sqlite
5080: 46 72 65 65 28 29 2e 0a 2a 2f 0a 23 69 66 64 65  Free()..*/.#ifde
5090: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
50a0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
50b0: 5f 6d 61 6c 6c 6f 63 5f 73 74 61 74 28 0a 20 20  _malloc_stat(.  
50c0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
50d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
50e0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
50f0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
5100: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
5110: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
5120: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
5130: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5140: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
5150: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
5160: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
5170: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
5180: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42   */.){.  char zB
5190: 75 66 5b 32 30 30 5d 3b 0a 20 20 73 70 72 69 6e  uf[200];.  sprin
51a0: 74 66 28 7a 42 75 66 2c 20 22 25 64 20 25 64 20  tf(zBuf, "%d %d 
51b0: 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 6e 4d 61  %d", sqlite3_nMa
51c0: 6c 6c 6f 63 2c 20 73 71 6c 69 74 65 33 5f 6e 46  lloc, sqlite3_nF
51d0: 72 65 65 2c 20 73 71 6c 69 74 65 33 5f 69 4d 61  ree, sqlite3_iMa
51e0: 6c 6c 6f 63 46 61 69 6c 29 3b 0a 20 20 54 63 6c  llocFail);.  Tcl
51f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5200: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
5210: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
5220: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
5230: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
5240: 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74  abort.**.** Shut
5250: 64 6f 77 6e 20 74 68 65 20 70 72 6f 63 65 73 73  down the process
5260: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54   immediately.  T
5270: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6c 65  his is not a cle
5280: 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20  an shutdown..** 
5290: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
52a0: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
52b0: 20 72 65 63 6f 76 65 72 61 62 69 6c 69 74 79 20   recoverability 
52c0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  of a database in
52d0: 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74 20 6f 66  .** the event of
52e0: 20 61 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68   a program crash
52f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5300: 73 71 6c 69 74 65 5f 61 62 6f 72 74 28 0a 20 20  sqlite_abort(.  
5310: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
5320: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
5330: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
5340: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
5350: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
5360: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
5370: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
5380: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5390: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
53a0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
53b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
53c0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
53d0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
53e0: 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b 20 20 20   interp==0 );   
53f0: 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 61 6c 77  /* This will alw
5400: 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20 72 65  ays fail */.  re
5410: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5420: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
5430: 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 61  ing routine is a
5440: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53 51   user-defined SQ
5450: 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f 73 65  L function whose
5460: 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69 73 20 74   purpose.** is t
5470: 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69 74  o test the sqlit
5480: 65 5f 73 65 74 5f 72 65 73 75 6c 74 28 29 20 41  e_set_result() A
5490: 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  PI..*/.static vo
54a0: 69 64 20 74 65 73 74 46 75 6e 63 28 73 71 6c 69  id testFunc(sqli
54b0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
54c0: 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20  text, int argc, 
54d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
54e0: 61 72 67 76 29 7b 0a 20 20 77 68 69 6c 65 28 20  argv){.  while( 
54f0: 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 63  argc>=2 ){.    c
5500: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 30  onst char *zArg0
5510: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5520: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
5530: 20 20 20 20 69 66 28 20 7a 41 72 67 30 20 29 7b      if( zArg0 ){
5540: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
5550: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
5560: 67 30 2c 20 22 69 6e 74 22 29 20 29 7b 0a 20 20  g0, "int") ){.  
5570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5580: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
5590: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
55a0: 69 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20  int(argv[1]));. 
55b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
55c0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
55d0: 72 67 30 2c 22 69 6e 74 36 34 22 29 3d 3d 30 20  rg0,"int64")==0 
55e0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
55f0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
5600: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
5610: 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72 67  _value_int64(arg
5620: 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65  v[1]));.      }e
5630: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
5640: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 73 74  trICmp(zArg0,"st
5650: 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ring")==0 ){.   
5660: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5670: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
5680: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
5690: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 20 2d  text(argv[1]), -
56a0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  1,.            S
56b0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
56c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
56d0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
56e0: 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c 65 22 29  (zArg0,"double")
56f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
5700: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
5710: 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 73 71  uble(context, sq
5720: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62  lite3_value_doub
5730: 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20  le(argv[1]));.  
5740: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
5750: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
5760: 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b  g0,"null")==0 ){
5770: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5780: 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e  _result_null(con
5790: 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  text);.      }el
57a0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
57b0: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 76 61 6c  rICmp(zArg0,"val
57c0: 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ue")==0 ){.     
57d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
57e0: 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c  t_value(context,
57f0: 20 61 72 67 76 5b 73 71 6c 69 74 65 33 5f 76 61   argv[sqlite3_va
5800: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
5810: 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
5820: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72  .        goto er
5830: 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ror_out;.      }
5840: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5850: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
5860: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 67 63  ;.    }.    argc
5870: 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72 67 76 20   -= 2;.    argv 
5880: 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  += 2;.  }.  retu
5890: 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a  rn;..error_out:.
58a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
58b0: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22  _error(context,"
58c0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73  first argument s
58d0: 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a  hould be one of:
58e0: 20 22 0a 20 20 20 20 20 20 22 69 6e 74 20 69 6e   ".      "int in
58f0: 74 36 34 20 73 74 72 69 6e 67 20 64 6f 75 62 6c  t64 string doubl
5900: 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22 2c 20 2d  e null value", -
5910: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  1);.}../*.** Usa
5920: 67 65 3a 20 20 20 73 71 6c 69 74 65 5f 72 65 67  ge:   sqlite_reg
5930: 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74  ister_test_funct
5940: 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45 0a 2a 2a  ion  DB  NAME.**
5950: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65  .** Register the
5960: 20 74 65 73 74 20 53 51 4c 20 66 75 6e 63 74 69   test SQL functi
5970: 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  on on the databa
5980: 73 65 20 44 42 20 75 6e 64 65 72 20 74 68 65 20  se DB under the 
5990: 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74  name NAME..*/.st
59a0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65  atic int test_re
59b0: 67 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20 76  gister_func(.  v
59c0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
59d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
59e0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
59f0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
5a00: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
5a10: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
5a20: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
5a30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5a40: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
5a50: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
5a60: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
5a70: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
5a80: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a  */.){.  sqlite *
5a90: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
5aa0: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
5ab0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
5ac0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
5ad0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
5ae0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
5af0: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
5b00: 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20  FUNCTION-NAME", 
5b10: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
5b20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
5b30: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
5b40: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
5b50: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
5b60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
5b70: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
5b80: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72  _function(db, ar
5b90: 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  gv[2], -1, SQLIT
5ba0: 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 0a 20  E_UTF8, 0, 0, . 
5bb0: 20 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20 30       testFunc, 0
5bc0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
5bd0: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
5be0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5bf0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
5c00: 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
5c10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5c20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
5c30: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
5c40: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  ge:  sqlite3_fin
5c50: 61 6c 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a 0a  alize  STMT .**.
5c60: 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73 74  ** Finalize a st
5c70: 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a  atement handle..
5c80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
5c90: 73 74 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76  st_finalize(.  v
5ca0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
5cb0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
5cc0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
5cd0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
5ce0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
5cf0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
5d00: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
5d10: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
5d20: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
5d30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
5d40: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
5d50: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
5d60: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
5d70: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
5d80: 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22  ], 0), " <STMT>"
5d90: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
5da0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
5db0: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
5dc0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
5dd0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
5de0: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
5df0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5e00: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
5e10: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
5e20: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
5e30: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
5e40: 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29   *)errorName(rc)
5e50: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
5e60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
5e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
5e80: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 20   sqlite3_reset  
5e90: 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61  STMT .**.** Fina
5ea0: 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74  lize a statement
5eb0: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
5ec0: 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 73 65  ic int test_rese
5ed0: 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
5ee0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
5ef0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
5f00: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
5f10: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
5f20: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
5f30: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
5f40: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
5f50: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
5f60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
5f70: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
5f80: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
5f90: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
5fa0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
5fb0: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
5fc0: 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
5fd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
5fe0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
5ff0: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
6000: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
6010: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
6020: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
6030: 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
6040: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
6050: 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  tmt);.  if( rc )
6060: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
6070: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
6080: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
6090: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
60a0: 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42  lite3_changes DB
60b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
60c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
60d0: 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
60e0: 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 20  database by the 
60f0: 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63  last SQL.** exec
6100: 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
6110: 20 69 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65   int test_change
6120: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
6130: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
6140: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
6150: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
6160: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
6170: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
6180: 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  db;.  if( objc!=
6190: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
61a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
61b0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
61c0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
61d0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
61e0: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
61f0: 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
6200: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6210: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
6220: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
6230: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
6240: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
6250: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6260: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
6270: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
6280: 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
6290: 5f 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a  _changes(db)));.
62a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
62b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
62c0: 73 20 74 68 65 20 22 73 74 61 74 69 63 5f 62 69  s the "static_bi
62d0: 6e 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76  nd_value" that v
62e0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75  ariables are bou
62f0: 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68  nd to when.** th
6300: 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66  e FLAG option of
6310: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73   sqlite3_bind is
6320: 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61   "static".*/.sta
6330: 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65  tic char *sqlite
6340: 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
6350: 75 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55  ue = 0;../*.** U
6360: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 62  sage:  sqlite3_b
6370: 69 6e 64 20 20 56 4d 20 20 49 44 58 20 20 56 41  ind  VM  IDX  VA
6380: 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a  LUE  FLAGS.**.**
6390: 20 53 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   Sets the value 
63a0: 6f 66 20 74 68 65 20 49 44 58 2d 74 68 20 6f 63  of the IDX-th oc
63b0: 63 75 72 61 6e 63 65 20 6f 66 20 22 3f 22 20 69  curance of "?" i
63c0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
63d0: 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56  QL.** string.  V
63e0: 41 4c 55 45 20 69 73 20 74 68 65 20 6e 65 77 20  ALUE is the new 
63f0: 76 61 6c 75 65 2e 20 20 49 66 20 46 4c 41 47 53  value.  If FLAGS
6400: 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41  =="null" then VA
6410: 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  LUE is.** ignore
6420: 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
6430: 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
6440: 20 49 66 20 46 4c 41 47 53 3d 3d 22 73 74 61 74   If FLAGS=="stat
6450: 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ic" then.** the 
6460: 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
6470: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
6480: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 6e  tatic variable n
6490: 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  amed.** "sqlite_
64a0: 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
64b0: 65 22 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  e".  If FLAGS=="
64c0: 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61 20 63  normal" then a c
64d0: 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41  opy.** of the VA
64e0: 4c 55 45 20 69 73 20 6d 61 64 65 2e 0a 2a 2f 0a  LUE is made..*/.
64f0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
6500: 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  bind(.  void *No
6510: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
6520: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
6530: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
6540: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
6550: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
6560: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6580: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
6590: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
65a0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
65b0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
65c0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
65d0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
65e0: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
65f0: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28    int idx;.  if(
6600: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
6610: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6620: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
6630: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
6640: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
6650: 0a 20 20 20 20 20 20 20 22 20 56 4d 20 49 44 58  .       " VM IDX
6660: 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74 61   VALUE (null|sta
6670: 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20  tic|normal)\"", 
6680: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6690: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
66a0: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
66b0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
66c0: 31 5d 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  1], &pStmt) ) re
66d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
66e0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
66f0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
6700: 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
6710: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
6720: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
6730: 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"null")==0 ){. 
6740: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6750: 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
6760: 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20 69   idx);.  }else i
6770: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
6780: 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d 30 20 29  ],"static")==0 )
6790: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
67a0: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
67b0: 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f  mt, idx, sqlite_
67c0: 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
67d0: 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65 6c  e, -1, 0);.  }el
67e0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
67f0: 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d  gv[4],"normal")=
6800: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
6810: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
6820: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61 72 67  (pStmt, idx, arg
6830: 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  v[3], -1, SQLITE
6840: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
6850: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
6860: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6870: 70 2c 20 22 34 74 68 20 61 72 67 75 6d 65 6e 74  p, "4th argument
6880: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
6890: 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f       "\"null\" o
68a0: 72 20 5c 22 73 74 61 74 69 63 5c 22 20 6f 72 20  r \"static\" or 
68b0: 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30 29 3b  \"normal\"", 0);
68c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
68d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
68e0: 20 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20   rc ){.    char 
68f0: 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70  zBuf[50];.    sp
6900: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
6910: 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
6920: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6930: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
6940: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
6950: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6960: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
6970: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
6980: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
6990: 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  add_test_collate
69a0: 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e   <db ptr> <utf8>
69b0: 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31   <utf16le> <utf1
69c0: 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  6be>.**.** This 
69d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
69e0: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
69f0: 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65  Lite selects the
6a00: 20 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69   correct collati
6a10: 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63  on.** sequence c
6a20: 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c  allback when mul
6a30: 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28  tiple versions (
6a40: 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65  for different te
6a50: 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a  xt encodings).**
6a60: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a   are available..
6a70: 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  **.** Calling th
6a80: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73  is routine regis
6a90: 74 65 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  ters the collati
6aa0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 22 74 65 73  on sequence "tes
6ab0: 74 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69  t_collate".** wi
6ac0: 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  th database hand
6ad0: 6c 65 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63  le <db>. The sec
6ae0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  ond argument mus
6af0: 74 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74  t be a list of t
6b00: 68 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20  hree.** boolean 
6b10: 76 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66  values. If the f
6b20: 69 72 73 74 20 69 73 20 74 72 75 65 2c 20 74 68  irst is true, th
6b30: 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  en a version of 
6b40: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a  test_collate is.
6b50: 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  ** registered fo
6b60: 72 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20  r UTF-8, if the 
6b70: 73 65 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20  second is true, 
6b80: 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67  a version is reg
6b90: 69 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55  istered for.** U
6ba0: 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20  TF-16le, if the 
6bb0: 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61  third is true, a
6bc0: 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f   UTF-16be versio
6bd0: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  n is available..
6be0: 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73  ** Previous vers
6bf0: 69 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c  ions of test_col
6c00: 6c 61 74 65 20 61 72 65 20 64 65 6c 65 74 65 64  late are deleted
6c10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
6c20: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
6c30: 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69  est_collate is i
6c40: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61  mplemented by ca
6c50: 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c  lling the.** fol
6c60: 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70  lowing TCL scrip
6c70: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74  t:.**.**   "test
6c80: 5f 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c  _collate <enc> <
6c90: 6c 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a  lhs> <rhs>".**.*
6ca0: 2a 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20  * The <lhs> and 
6cb0: 3c 72 68 73 3e 20 61 72 65 20 74 68 65 20 74 77  <rhs> are the tw
6cc0: 6f 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63  o values being c
6cd0: 6f 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64  ompared, encoded
6ce0: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68   in UTF-8..** Th
6cf0: 65 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65  e <enc> paramete
6d00: 72 20 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  r is the encodin
6d10: 67 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  g of the collati
6d20: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  on function that
6d30: 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63  .** SQLite selec
6d40: 74 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65  ted to call. The
6d50: 20 54 43 4c 20 74 65 73 74 20 73 63 72 69 70 74   TCL test script
6d60: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a   implements the.
6d70: 2a 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  ** "test_collate
6d80: 22 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  " proc..**.** No
6d90: 74 65 20 74 68 61 74 20 74 68 69 73 20 77 69 6c  te that this wil
6da0: 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68  l only work with
6db0: 20 6f 6e 65 20 69 6e 74 65 70 72 65 74 65 72 20   one intepreter 
6dc0: 61 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68  at a time, as th
6dd0: 65 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e  e.** interp poin
6de0: 74 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ter to use when 
6df0: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54  evaluating the T
6e00: 43 4c 20 73 63 72 69 70 74 20 69 73 20 73 74 6f  CL script is sto
6e10: 72 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43  red in.** pTestC
6e20: 6f 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f  ollateInterp..*/
6e30: 0a 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65  .static Tcl_Inte
6e40: 72 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65  rp* pTestCollate
6e50: 49 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69  Interp;.static i
6e60: 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  nt test_collate_
6e70: 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43  func(.  void *pC
6e80: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63  tx, .  int nA, c
6e90: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20  onst void *zA,. 
6ea0: 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76   int nB, const v
6eb0: 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c  oid *zB.){.  Tcl
6ec0: 5f 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65  _Interp *i = pTe
6ed0: 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b  stCollateInterp;
6ee0: 0a 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 28  .  int encin = (
6ef0: 69 6e 74 29 70 43 74 78 3b 0a 20 20 69 6e 74 20  int)pCtx;.  int 
6f00: 72 65 73 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  res;..  sqlite3_
6f10: 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54  value *pVal;.  T
6f20: 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70  cl_Obj *pX;..  p
6f30: 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
6f40: 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61  gObj("test_colla
6f50: 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  te", -1);.  Tcl_
6f60: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
6f70: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 65 6e 63  ;..  switch( enc
6f80: 69 6e 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  in ){.    case S
6f90: 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20  QLITE_UTF8:.    
6fa0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6fb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
6fc0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6fd0: 28 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20  ("UTF-8",-1));. 
6fe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6ff0: 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31  case SQLITE_UTF1
7000: 36 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c  6LE:.      Tcl_L
7010: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7020: 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77  ent(i,pX,Tcl_New
7030: 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
7040: 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20  6LE",-1));.     
7050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7060: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3a   SQLITE_UTF16BE:
7070: 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
7080: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
7090: 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
70a0: 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22  ngObj("UTF-16BE"
70b0: 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65  ,-1));.      bre
70c0: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
70d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
70e0: 3b 0a 20 20 7d 0a 0a 20 20 70 56 61 6c 20 3d 20  ;.  }..  pVal = 
70f0: 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
7100: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
7110: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 41  eSetStr(pVal, nA
7120: 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c  , zA, encin, SQL
7130: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 54  ITE_STATIC);.  T
7140: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
7150: 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
7160: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
7170: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7180: 28 70 56 61 6c 29 2c 2d 31 29 29 3b 0a 20 20 73  (pVal),-1));.  s
7190: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
71a0: 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20  r(pVal, nB, zB, 
71b0: 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54  encin, SQLITE_ST
71c0: 41 54 49 43 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ATIC);.  Tcl_Lis
71d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
71e0: 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74  t(i,pX,Tcl_NewSt
71f0: 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f  ringObj(sqlite3_
7200: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
7210: 2c 2d 31 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  ,-1));.  sqlite3
7220: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
7230: 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ..  Tcl_EvalObjE
7240: 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  x(i, pX, 0);.  T
7250: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
7260: 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e  pX);.  Tcl_GetIn
7270: 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f  tFromObj(i, Tcl_
7280: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c  GetObjResult(i),
7290: 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e   &res);.  return
72a0: 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69   res;.}.static i
72b0: 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28  nt test_collate(
72c0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
72d0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
72e0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
72f0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
7300: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
7310: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
7320: 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20  ;.  int val;..  
7330: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f  if( objc!=5 ) go
7340: 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70  to bad_args;.  p
7350: 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
7360: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66  p = interp;.  if
7370: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
7380: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
7390: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
73a0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
73b0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
73c0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
73d0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
73e0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
73f0: 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
7400: 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
7410: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
7420: 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c  on(db, "test_col
7430: 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
7440: 46 38 2c 20 0a 20 20 20 20 20 20 20 20 28 76 6f  F8, .        (vo
7450: 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38  id *)SQLITE_UTF8
7460: 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61  , val?test_colla
7470: 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66  te_func:0);.  if
7480: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
7490: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
74a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
74b0: 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
74c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
74d0: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
74e0: 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ation(db, "test_
74f0: 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45  collate", SQLITE
7500: 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20  _UTF16LE, .     
7510: 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
7520: 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74  E_UTF16LE, val?t
7530: 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
7540: 3a 30 29 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f  :0);.  if( TCL_O
7550: 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
7560: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
7570: 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20   objv[4], &val) 
7580: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
7590: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72  OR;.  sqlite3_cr
75a0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
75b0: 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  b, "test_collate
75c0: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ", SQLITE_UTF16B
75d0: 45 2c 20 0a 20 20 20 20 20 20 20 20 28 76 6f 69  E, .        (voi
75e0: 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36  d *)SQLITE_UTF16
75f0: 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c  BE, val?test_col
7600: 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20  late_func:0);.  
7610: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
7620: 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  ;..bad_args:.  T
7630: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7640: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
7650: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
7660: 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f   \"",.      Tcl_
7670: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
7680: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
7690: 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  <DB> <utf8> <utf
76a0: 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22  16le> <utf16be>"
76b0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
76c0: 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
76d0: 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72 65  ** Usage:    bre
76e0: 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68  akpoint.**.** Th
76f0: 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74  is routine exist
7700: 73 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73  s for one purpos
7710: 65 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61  e - to provide a
7720: 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a   place to put a.
7730: 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69  ** breakpoint wi
7740: 74 68 20 47 44 42 20 74 68 61 74 20 63 61 6e 20  th GDB that can 
7750: 62 65 20 74 72 69 67 67 65 72 65 64 20 75 73 69  be triggered usi
7760: 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68  ng TCL code.  Th
7770: 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69  e use.** for thi
7780: 73 20 69 73 20 77 68 65 6e 20 61 20 70 61 72 74  s is when a part
7790: 69 63 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c  icular test fail
77a0: 73 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31  s on (say) the 1
77b0: 34 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e  485th iteration.
77c0: 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74  .** In the TCL t
77d0: 65 73 74 20 73 63 72 69 70 74 2c 20 77 65 20 63  est script, we c
77e0: 61 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65  an add code like
77f0: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
7800: 20 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62   if {$i==1485} b
7810: 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20  reakpoint.**.** 
7820: 54 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78  Then run testfix
7830: 74 75 72 65 20 69 6e 20 74 68 65 20 64 65 62 75  ture in the debu
7840: 67 67 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f  gger and wait fo
7850: 72 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74  r the breakpoint
7860: 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68   to.** fire.  Th
7870: 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72  en additional br
7880: 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65  eakpoints can be
7890: 20 73 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f   set to trace do
78a0: 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73  wn the bug..*/.s
78b0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
78c0: 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69  reakpoint(.  voi
78d0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
78e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
78f0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
7900: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
7910: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
7920: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
7930: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
7940: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
7950: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
7960: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
7970: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
7980: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
7990: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .){.  return TCL
79a0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
79b0: 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a  Do nothing */.}.
79c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
79d0: 5f 62 69 6e 64 5f 69 6e 74 33 32 28 0a 20 20 76  _bind_int32(.  v
79e0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
79f0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
7a00: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
7a10: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
7a20: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
7a30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
7a40: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
7a50: 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20  .  int value;.  
7a60: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
7a70: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
7a80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7a90: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
7aa0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
7ab0: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
7ac0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
7ad0: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
7ae0: 20 3c 53 54 4d 54 3e 20 3c 70 61 72 61 6d 20 6e   <STMT> <param n
7af0: 6f 2e 3e 20 3c 76 61 6c 75 65 3e 22 2c 20 30 29  o.> <value>", 0)
7b00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
7b10: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
7b20: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
7b30: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
7b40: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
7b50: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
7b60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7b70: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
7b80: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
7b90: 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
7ba0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7bb0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
7bc0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
7bd0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
7be0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
7bf0: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
7c00: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
7c10: 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
7c20: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7c30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
7c40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7c50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
7c60: 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
7c70: 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e  int test_bind_in
7c80: 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t64(.  void * cl
7c90: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
7ca0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
7cb0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
7cc0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
7cd0: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
7ce0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
7cf0: 69 6e 74 20 69 64 78 3b 0a 20 20 69 36 34 20 76  int idx;.  i64 v
7d00: 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
7d10: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
7d20: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
7d30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7d40: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
7d50: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
7d60: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
7d70: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
7d80: 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 20  ], 0), " <STMT> 
7d90: 3c 70 61 72 61 6d 20 6e 6f 2e 3e 20 3c 76 61 6c  <param no.> <val
7da0: 75 65 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ue>", 0);.    re
7db0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7dc0: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
7dd0: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
7de0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
7df0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
7e00: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
7e10: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
7e20: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
7e30: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
7e40: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
7e50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
7e60: 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
7e70: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
7e80: 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20  v[3], &value) ) 
7e90: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7ea0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
7eb0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
7ec0: 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b  mt, idx, value);
7ed0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7ee0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
7ef0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7f00: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
7f10: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
7f20: 74 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62  t test_bind_doub
7f30: 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  le(.  void * cli
7f40: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
7f50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
7f60: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
7f70: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
7f80: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
7f90: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
7fa0: 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c 65  nt idx;.  double
7fb0: 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63   value;.  int rc
7fc0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
7fd0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
7fe0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7ff0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8000: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
8010: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
8020: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
8030: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
8040: 3e 20 3c 70 61 72 61 6d 20 6e 6f 2e 3e 20 3c 76  > <param no.> <v
8050: 61 6c 75 65 3e 22 2c 20 30 29 3b 0a 20 20 20 20  alue>", 0);.    
8060: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8070: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
8080: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
8090: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
80a0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
80b0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
80c0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
80d0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
80e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
80f0: 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
8100: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
8110: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
8120: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
8130: 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
8140: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8150: 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
8160: 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70  e3_bind_double(p
8170: 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
8180: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8190: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
81a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
81b0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
81c0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
81d0: 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75  int test_bind_nu
81e0: 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ll(.  void * cli
81f0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
8200: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
8210: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
8220: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
8230: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
8240: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
8250: 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72 63  nt idx;.  int rc
8260: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
8270: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
8280: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8290: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
82a0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
82b0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
82c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
82d0: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
82e0: 3e 20 3c 70 61 72 61 6d 20 6e 6f 2e 3e 22 2c 20  > <param no.>", 
82f0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
8300: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
8310: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
8320: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
8330: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
8340: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
8350: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8360: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
8370: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
8380: 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
8390: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
83a0: 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
83b0: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
83c0: 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20  mt, idx);.  if( 
83d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
83e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
83f0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
8400: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8410: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
8420: 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69  bind_text(.  voi
8430: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
8440: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8450: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
8460: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
8470: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
8480: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
8490: 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
84a0: 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
84b0: 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
84c0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
84d0: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
84e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
84f0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8500: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8510: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
8520: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
8530: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
8540: 54 4d 54 3e 20 3c 70 61 72 61 6d 20 6e 6f 2e 3e  TMT> <param no.>
8550: 20 3c 76 61 6c 75 65 3e 22 0a 20 20 20 20 20 20   <value>".      
8560: 20 20 22 20 3c 62 79 74 65 73 3e 22 2c 20 30 29    " <bytes>", 0)
8570: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
8580: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
8590: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
85a0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
85b0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
85c0: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
85d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
85e0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
85f0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
8600: 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
8610: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8620: 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47  .  value = Tcl_G
8630: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
8640: 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
8650: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
8660: 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
8670: 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
8680: 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
8690: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
86a0: 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
86b0: 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49  lue, bytes, SQLI
86c0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
86d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
86e0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
86f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
8700: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
8710: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
8720: 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36  test_bind_text16
8730: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
8740: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
8750: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
8760: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
8770: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
8780: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
8790: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
87a0: 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65   idx;.  int byte
87b0: 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65  s;.  char *value
87c0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
87d0: 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
87e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
87f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
8800: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
8810: 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
8820: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
8830: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
8840: 29 2c 20 22 20 3c 53 54 4d 54 3e 20 3c 70 61 72  ), " <STMT> <par
8850: 61 6d 20 6e 6f 2e 3e 20 3c 76 61 6c 75 65 3e 22  am no.> <value>"
8860: 0a 20 20 20 20 20 20 20 20 22 20 3c 62 79 74 65  .        " <byte
8870: 73 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  s>", 0);.    ret
8880: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8890: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
88a0: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
88b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
88c0: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
88d0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
88e0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
88f0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
8900: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
8910: 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
8920: 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20  _ERROR;.  value 
8930: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
8940: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ayFromObj(objv[3
8950: 5d 2c 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c  ], 0);.  if( Tcl
8960: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
8970: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
8980: 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
8990: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
89a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
89b0: 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2c 20 69  _text16(pStmt, i
89c0: 64 78 2c 20 28 76 6f 69 64 20 2a 29 76 61 6c 75  dx, (void *)valu
89d0: 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45  e, bytes, SQLITE
89e0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69  _TRANSIENT);.  i
89f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8a00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
8a10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
8a20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
8a30: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
8a40: 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20 20  st_bind_blob(.  
8a50: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
8a60: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
8a70: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
8a80: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
8a90: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
8aa0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
8ab0: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
8ac0: 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
8ad0: 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20   char *value;.  
8ae0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
8af0: 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
8b00: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8b10: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
8b20: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
8b30: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
8b40: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8b50: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
8b60: 20 3c 53 54 4d 54 3e 20 3c 70 61 72 61 6d 20 6e   <STMT> <param n
8b70: 6f 2e 3e 20 3c 76 61 6c 75 65 3e 22 0a 20 20 20  o.> <value>".   
8b80: 20 20 20 20 20 22 20 3c 62 79 74 65 73 3e 22 2c       " <bytes>",
8b90: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8ba0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
8bb0: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
8bc0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
8bd0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
8be0: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
8bf0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8c00: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
8c10: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
8c20: 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
8c30: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8c40: 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63  OR;.  value = Tc
8c50: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
8c60: 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [3]);.  if( Tcl_
8c70: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
8c80: 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
8c90: 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
8ca0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
8cb0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
8cc0: 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c  blob(pStmt, idx,
8cd0: 20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 53   value, bytes, S
8ce0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
8cf0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8d00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
8d10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8d20: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
8d30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
8d40: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72  age: sqlite3_err
8d50: 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  code DB.**.** Re
8d60: 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20  turn the string 
8d70: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
8d80: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
8d90: 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a  t sqlite3_* API.
8da0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65  ** error code. e
8db0: 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  .g. "SQLITE_ERRO
8dc0: 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  R"..*/.static in
8dd0: 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a  t test_errcode(.
8de0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
8df0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
8e00: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
8e10: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
8e20: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
8e30: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
8e40: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
8e50: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
8e60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8e70: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
8e80: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
8e90: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
8ea0: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
8eb0: 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
8ec0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8ed0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
8ee0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
8ef0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
8f00: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
8f10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8f20: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
8f30: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65  nterp, (char *)e
8f40: 72 72 6f 72 4e 61 6d 65 28 73 71 6c 69 74 65 33  rrorName(sqlite3
8f50: 5f 65 72 72 63 6f 64 65 28 64 62 29 29 2c 20 30  _errcode(db)), 0
8f60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8f70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
8f80: 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73  ge:   test_errms
8f90: 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  g DB.**.** Retur
8fa0: 6e 73 20 74 68 65 20 55 54 46 2d 38 20 72 65 70  ns the UTF-8 rep
8fb0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
8fc0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
8fd0: 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a   string for the.
8fe0: 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  ** most recent s
8ff0: 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c  qlite3_* API cal
9000: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
9010: 20 74 65 73 74 5f 65 72 72 6d 73 67 28 0a 20 20   test_errmsg(.  
9020: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
9030: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
9040: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
9050: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
9060: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
9070: 20 20 73 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20    sqlite *db;.  
9080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
9090: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
90a0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
90b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
90c0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
90d0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
90e0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
90f0: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
9100: 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
9110: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9120: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
9130: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
9140: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
9150: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
9160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9170: 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
9180: 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20  3_errmsg(db);.  
9190: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
91a0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
91b0: 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20  StringObj(zErr, 
91c0: 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  -1));.  return T
91d0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
91e0: 55 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72  Usage:   test_er
91f0: 72 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20  rmsg16 DB.**.** 
9200: 52 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d  Returns the UTF-
9210: 31 36 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  16 representatio
9220: 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d  n of the error m
9230: 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f  essage string fo
9240: 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  r the.** most re
9250: 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
9260: 50 49 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73  PI call. This is
9270: 20 61 20 62 79 74 65 20 61 72 72 61 79 20 6f 62   a byte array ob
9280: 6a 65 63 74 20 61 74 20 74 68 65 20 54 43 4c 20  ject at the TCL 
9290: 0a 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69  .** level, and i
92a0: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30  t includes the 0
92b0: 78 30 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61  x00 0x00 termina
92c0: 74 6f 72 20 62 79 74 65 73 20 61 74 20 74 68 65  tor bytes at the
92d0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55   end of the.** U
92e0: 54 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f  TF-16 string..*/
92f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
9300: 5f 65 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69  _errmsg16(.  voi
9310: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
9320: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9330: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
9340: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
9350: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
9360: 71 6c 69 74 65 20 2a 64 62 3b 0a 20 20 63 6f 6e  qlite *db;.  con
9370: 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20  st void *zErr;. 
9380: 20 69 6e 74 20 62 79 74 65 73 3b 0a 0a 20 20 69   int bytes;..  i
9390: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
93a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
93b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
93c0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
93d0: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
93e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
93f0: 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
9400: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
9410: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
9420: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
9430: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
9440: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
9450: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
9460: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72  CL_ERROR;..  zEr
9470: 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  r = sqlite3_errm
9480: 73 67 31 36 28 64 62 29 3b 0a 20 20 62 79 74 65  sg16(db);.  byte
9490: 73 20 3d 20 73 71 6c 69 74 65 33 75 74 66 31 36  s = sqlite3utf16
94a0: 42 79 74 65 4c 65 6e 28 7a 45 72 72 2c 20 2d 31  ByteLen(zErr, -1
94b0: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
94c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
94d0: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
94e0: 6a 28 7a 45 72 72 2c 20 62 79 74 65 73 29 29 3b  j(zErr, bytes));
94f0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9500: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9510: 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
9520: 65 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  e DB sql bytes t
9530: 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ailvar.**.** Com
9540: 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65  pile up to <byte
9550: 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  s> bytes of the 
9560: 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72  supplied SQL str
9570: 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a  ing <sql> using.
9580: 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
9590: 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72  le <DB>. The par
95a0: 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e  ameter <tailval>
95b0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
95c0: 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69  a global.** vari
95d0: 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74  able that is set
95e0: 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70   to the unused p
95f0: 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20  ortion of <sql> 
9600: 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53  (if any). A.** S
9610: 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65  TMT handle is re
9620: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
9630: 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61  c int test_prepa
9640: 72 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  re(.  void * cli
9650: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
9660: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
9670: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
9680: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
9690: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
96a0: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
96b0: 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62  r *zSql;.  int b
96c0: 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ytes;.  const ch
96d0: 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20  ar *zTail = 0;. 
96e0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
96f0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
9700: 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74   zBuf[50];.  int
9710: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
9720: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
9730: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9740: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9750: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9760: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
9770: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
9780: 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
9790: 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20   tailvar", 0);. 
97a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
97b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
97c0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
97d0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
97e0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
97f0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9800: 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63  ROR;.  zSql = Tc
9810: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
9820: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [2]);.  if( Tcl_
9830: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
9840: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
9850: 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
9860: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
9870: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
9880: 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74  re(db, zSql, byt
9890: 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54 61  es, &pStmt, &zTa
98a0: 69 6c 29 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c  il);.  if( zTail
98b0: 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
98c0: 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
98d0: 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 7a  tes = bytes - (z
98e0: 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20  Tail-zSql);.    
98f0: 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74  }.    Tcl_ObjSet
9900: 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
9910: 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77  v[4], 0, Tcl_New
9920: 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c  StringObj(zTail,
9930: 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d   bytes), 0);.  }
9940: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
9950: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
9960: 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  rt( pStmt==0 );.
9970: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
9980: 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
9990: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
99a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
99b0: 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  f, sqlite3_errms
99c0: 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
99d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
99e0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
99f0: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 61 6b  t ){.    if( mak
9a00: 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
9a10: 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
9a20: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9a30: 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
9a40: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9a50: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
9a60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
9a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
9a80: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
9a90: 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
9aa0: 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  ilvar.**.** Comp
9ab0: 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73  ile up to <bytes
9ac0: 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73  > bytes of the s
9ad0: 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69  upplied SQL stri
9ae0: 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a  ng <sql> using.*
9af0: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
9b00: 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61  e <DB>. The para
9b10: 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20  meter <tailval> 
9b20: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
9b30: 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61   global.** varia
9b40: 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20  ble that is set 
9b50: 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f  to the unused po
9b60: 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28  rtion of <sql> (
9b70: 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54  if any). A.** ST
9b80: 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74  MT handle is ret
9b90: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
9ba0: 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72   int test_prepar
9bb0: 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  e16(.  void * cl
9bc0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
9bd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
9be0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
9bf0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
9c00: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
9c10: 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
9c20: 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73  id *zSql;.  cons
9c30: 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20  t void *zTail = 
9c40: 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54  0;.  Tcl_Obj *pT
9c50: 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
9c60: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
9c70: 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
9c80: 35 30 5d 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  50];.  int bytes
9c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9ca0: 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   /* The integer 
9cb0: 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67  specified as arg
9cc0: 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c   3 */.  int objl
9cd0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
9ce0: 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72    /* The byte-ar
9cf0: 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72  ray length of ar
9d00: 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  g 2 */..  if( ob
9d10: 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
9d20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9d30: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
9d40: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
9d50: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
9d60: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
9d70: 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
9d80: 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b  es tailvar", 0);
9d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9da0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
9db0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
9dc0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
9dd0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
9de0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
9df0: 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
9e00: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
9e10: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
9e20: 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28   &objlen);.  if(
9e30: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
9e40: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
9e50: 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
9e60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9e70: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
9e80: 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  !=sqlite3_prepar
9e90: 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  e16(db, zSql, by
9ea0: 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 26 7a 54  tes, &pStmt, &zT
9eb0: 61 69 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ail) ){.    retu
9ec0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9ed0: 7d 0a 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 29  }..  if( zTail )
9ee0: 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f  {.    objlen = o
9ef0: 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a 29 7a  bjlen - ((u8 *)z
9f00: 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29  Tail-(u8 *)zSql)
9f10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
9f20: 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20  bjlen = 0;.  }. 
9f30: 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77   pTail = Tcl_New
9f40: 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38  ByteArrayObj((u8
9f50: 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e   *)zTail, objlen
9f60: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
9f70: 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
9f80: 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
9f90: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
9fa0: 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20  0, pTail, 0);.  
9fb0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
9fc0: 28 70 54 61 69 6c 29 3b 0a 0a 20 20 69 66 28 20  (pTail);..  if( 
9fd0: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28  pStmt ){.    if(
9fe0: 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28   makePointerStr(
9ff0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
a000: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
a010: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
a020: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a030: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
a040: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
a050: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
a060: 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20  e: sqlite3_open 
a070: 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e  filename ?option
a080: 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69  s-list?.*/.stati
a090: 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28  c int test_open(
a0a0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
a0b0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
a0c0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
a0d0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
a0e0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
a0f0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
a100: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71  *zFilename;.  sq
a110: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
a120: 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66   rc;.  char zBuf
a130: 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
a140: 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=3 && objc!=2
a150: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
a160: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a170: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
a180: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
a190: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
a1a0: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
a1b0: 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
a1c0: 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
a1d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a1e0: 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
a1f0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
a200: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
a210: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
a220: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62  n(zFilename, &db
a230: 29 3b 0a 20 20 0a 20 20 69 66 28 20 6d 61 6b 65  );.  .  if( make
a240: 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
a250: 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
a260: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a270: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
a280: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
a290: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
a2a0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
a2b0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f  Usage: sqlite3_o
a2c0: 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f  pen16 filename o
a2d0: 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63  ptions.*/.static
a2e0: 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31 36   int test_open16
a2f0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
a300: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
a310: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
a320: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
a330: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
a340: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  .){.  const void
a350: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73   *zFilename;.  s
a360: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
a370: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75  t rc;.  char zBu
a380: 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  f[100];..  if( o
a390: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
a3a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a3b0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
a3c0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
a3d0: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
a3e0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
a3f0: 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20  0]), " filename 
a400: 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30  options-list", 0
a410: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
a420: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
a430: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f  zFilename = Tcl_
a440: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
a450: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
a460: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
a470: 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65  open16(zFilename
a480: 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28  , &db);.  .  if(
a490: 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28   makePointerStr(
a4a0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62  interp, zBuf, db
a4b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
a4c0: 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65  RROR;.  Tcl_Appe
a4d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a4e0: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
a4f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
a500: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
a510: 74 65 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a  te3_step STMT.**
a520: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
a530: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
a540: 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74   next row..*/.st
a550: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
a560: 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ep(.  void * cli
a570: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
a580: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
a590: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
a5a0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
a5b0: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
a5c0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
a5d0: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
a5e0: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
a5f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a600: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
a610: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
a620: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
a630: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
a640: 5d 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b  ]), " STMT", 0);
a650: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a660: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
a670: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
a680: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
a690: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
a6a0: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
a6b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
a6c0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
a6d0: 28 70 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69  (pStmt);..  /* i
a6e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  f( rc!=SQLITE_DO
a6f0: 4e 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  NE && rc!=SQLITE
a700: 5f 52 4f 57 20 29 20 72 65 74 75 72 6e 20 54 43  _ROW ) return TC
a710: 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63  L_ERROR; */.  Tc
a720: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
a730: 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f  rp, (char *)erro
a740: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
a750: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
a760: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
a770: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
a780: 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  ount STMT .**.**
a790: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
a7a0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
a7b0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71  turned by the sq
a7c0: 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54  l statement STMT
a7d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a7e0: 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  test_column_coun
a7f0: 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
a800: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
a810: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
a820: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
a830: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
a840: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
a850: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
a860: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
a870: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a880: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
a890: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
a8a0: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
a8b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
a8c0: 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
a8d0: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
a8e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a8f0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
a900: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
a910: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
a920: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
a930: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
a940: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f  L_ERROR;..  Tcl_
a950: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
a960: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
a970: 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  bj(sqlite3_colum
a980: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  n_count(pStmt)))
a990: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
a9a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
a9b0: 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
a9c0: 6e 5f 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  n_type STMT colu
a9d0: 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
a9e0: 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20  the type of the 
a9f0: 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27  data in column '
aa00: 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63  column' of the c
aa10: 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73  urrent row..*/.s
aa20: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
aa30: 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f  olumn_type(.  vo
aa40: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
aa50: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
aa60: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
aa70: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
aa80: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
aa90: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
aaa0: 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
aab0: 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28    int tp;..  if(
aac0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
aad0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
aae0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
aaf0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
ab00: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
ab10: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ab20: 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
ab30: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
ab40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ab50: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
ab60: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
ab70: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ab80: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
ab90: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
aba0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
abb0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
abc0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
abd0: 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
abe0: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20  CL_ERROR;..  tp 
abf0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
ac00: 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c  _type(pStmt, col
ac10: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 74 70 20  );.  switch( tp 
ac20: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
ac30: 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20  TE_INTEGER: .   
ac40: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
ac50: 28 69 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45  (interp, "INTEGE
ac60: 52 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  R", TCL_STATIC);
ac70: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
ac80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
ac90: 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  ULL:.      Tcl_S
aca0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
acb0: 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41   "NULL", TCL_STA
acc0: 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
acd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
ace0: 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20  ITE_FLOAT:.     
acf0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
ad00: 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20  nterp, "FLOAT", 
ad10: 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
ad20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
ad30: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
ad40: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
ad50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45  sult(interp, "TE
ad60: 58 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  XT", TCL_STATIC)
ad70: 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
ad80: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ad90: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f  BLOB:.      Tcl_
ada0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
adb0: 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54  , "BLOB", TCL_ST
adc0: 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
add0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
ade0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  :.      assert(0
adf0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
ae00: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
ae10: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
ae20: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54  _column_int64 ST
ae30: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
ae40: 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20  Return the data 
ae50: 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
ae60: 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
ae70: 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e  t row cast as an
ae80: 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74  .** wide (64-bit
ae90: 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  ) integer..*/.st
aea0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
aeb0: 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f  lumn_int64(.  vo
aec0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
aed0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
aee0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
aef0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
af00: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
af10: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
af20: 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
af30: 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69    i64 iVal;..  i
af40: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
af50: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
af60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
af70: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
af80: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
af90: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
afa0: 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
afb0: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
afc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
afd0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
afe0: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
aff0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
b000: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
b010: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
b020: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
b030: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
b040: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
b050: 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
b060: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69   TCL_ERROR;..  i
b070: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
b080: 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
b090: 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
b0a0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
b0b0: 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
b0c0: 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72  tObj(iVal));.  r
b0d0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
b0e0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
b0f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
b100: 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f  b STMT column.*/
b110: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
b120: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20  _column_blob(.  
b130: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
b140: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
b150: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
b160: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
b170: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
b180: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
b190: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
b1a0: 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ;..  int len;.  
b1b0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f  const void *pBlo
b1c0: 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  b;..  if( objc!=
b1d0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
b1e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b1f0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
b200: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
b210: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
b220: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
b230: 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
b240: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
b250: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
b260: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
b270: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
b280: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
b290: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
b2a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b2b0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
b2c0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b2d0: 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
b2e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b2f0: 52 3b 0a 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71  R;..  pBlob = sq
b300: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
b310: 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  b(pStmt, col);. 
b320: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63   len = sqlite3_c
b330: 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
b340: 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
b350: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
b360: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  rp, Tcl_NewByteA
b370: 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c  rrayObj(pBlob, l
b380: 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  en));.  return T
b390: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
b3a0: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
b3b0: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d  olumn_double STM
b3c0: 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
b3d0: 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69  eturn the data i
b3e0: 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
b3f0: 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
b400: 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 20 64   row cast as a d
b410: 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ouble..*/.static
b420: 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
b430: 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  _double(.  void 
b440: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
b450: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
b460: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
b470: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
b480: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
b490: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
b4a0: 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64  ;.  int col;.  d
b4b0: 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69  ouble rVal;..  i
b4c0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
b4d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b4e0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
b4f0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
b500: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
b510: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
b520: 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
b530: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
b540: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b550: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
b560: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
b570: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
b580: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
b590: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
b5a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
b5b0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
b5c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
b5d0: 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
b5e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
b5f0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
b600: 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d  lumn_double(pStm
b610: 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
b620: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
b630: 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  rp, Tcl_NewDoubl
b640: 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72  eObj(rVal));.  r
b650: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
b660: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
b670: 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74  lite3_data_count
b680: 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74   STMT .**.** Ret
b690: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
b6a0: 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
b6b0: 65 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74  ed by the sql st
b6c0: 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f  atement STMT..*/
b6d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
b6e0: 5f 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76  _data_count(.  v
b6f0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
b700: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
b710: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
b720: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
b730: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
b740: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
b750: 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
b760: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
b770: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b780: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
b790: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
b7a0: 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
b7b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
b7c0: 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
b7d0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
b7e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
b7f0: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
b800: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
b810: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
b820: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
b830: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b840: 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
b850: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
b860: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
b870: 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28  ite3_data_count(
b880: 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
b890: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
b8a0: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
b8b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53  e3_column_text S
b8c0: 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
b8d0: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
b8e0: 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20  column_decltype 
b8f0: 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
b900: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
b910: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d  _column_name STM
b920: 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  T column.*/.stat
b930: 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
b940: 5f 75 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20  _utf8(.  void * 
b950: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
b960: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b970: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
b980: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
b990: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
b9a0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
b9b0: 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e    int col;.  con
b9c0: 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e 63  st char *(*xFunc
b9d0: 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
b9e0: 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61   int) = clientDa
b9f0: 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ta;.  const char
ba00: 20 2a 7a 52 65 74 3b 0a 0a 20 20 69 66 28 20 6f   *zRet;..  if( o
ba10: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
ba20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ba30: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
ba40: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
ba50: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
ba60: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
ba70: 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
ba80: 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
ba90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
baa0: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
bab0: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
bac0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
bad0: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
bae0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
baf0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
bb00: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
bb10: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
bb20: 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
bb30: 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d  _ERROR;.  zRet =
bb40: 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
bb50: 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29  l);.  if( zRet )
bb60: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
bb70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
bb80: 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20  r *)zRet, 0);.  
bb90: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
bba0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
bbb0: 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
bbc0: 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
bbd0: 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
bbe0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
bbf0: 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
bc00: 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
bc10: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
bc20: 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
bc30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
bc40: 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a  est_stmt_utf16(.
bc50: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
bc60: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
bc70: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
bc80: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
bc90: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
bca0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
bcb0: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
bcc0: 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  ol;.  Tcl_Obj *p
bcd0: 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Ret;.  const voi
bce0: 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f  d *zName16;.  co
bcf0: 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e  nst void *(*xFun
bd00: 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
bd10: 2c 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44  , int) = clientD
bd20: 61 74 61 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ata;..  if( objc
bd30: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
bd40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
bd50: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
bd60: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
bd70: 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
bd80: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
bd90: 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
bda0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
bdb0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
bdc0: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
bdd0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
bde0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
bdf0: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
be00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
be10: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
be20: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
be30: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
be40: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
be50: 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20  ROR;..  zName16 
be60: 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
be70: 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ol);.  if( zName
be80: 31 36 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  16 ){.    pRet =
be90: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
bea0: 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 73 71  yObj(zName16, sq
beb0: 6c 69 74 65 33 75 74 66 31 36 42 79 74 65 4c 65  lite3utf16ByteLe
bec0: 6e 28 7a 4e 61 6d 65 31 36 2c 20 2d 31 29 2b 32  n(zName16, -1)+2
bed0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
bee0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
bef0: 70 52 65 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  pRet);.  }..  re
bf00: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
bf10: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
bf20: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20  ite3_column_int 
bf30: 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
bf40: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
bf50: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54  _column_bytes ST
bf60: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
bf70: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
bf80: 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54  olumn_bytes16 ST
bf90: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a  MT column.**.*/.
bfa0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
bfb0: 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64  stmt_int(.  void
bfc0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
bfd0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
bfe0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
bff0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
c000: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
c010: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
c020: 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
c030: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  int (*xFunc)(sql
c040: 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
c050: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a   = clientData;..
c060: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
c070: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
c080: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
c090: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
c0a0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
c0b0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
c0c0: 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
c0d0: 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
c0e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c0f0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
c100: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
c110: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
c120: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
c130: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
c140: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
c150: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
c160: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
c170: 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
c180: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
c190: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
c1a0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
c1b0: 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70  ewIntObj(xFunc(p
c1c0: 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20  Stmt, col)));.  
c1d0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
c1e0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
c1f0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
c200: 64 57 72 69 74 65 20 3c 66 69 6c 65 6e 61 6d 65  dWrite <filename
c210: 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  >.*/.static int 
c220: 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4f 70  test_sqlite3OsOp
c230: 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20 76  enReadWrite(.  v
c240: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
c250: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
c260: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
c270: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
c280: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
c290: 20 4f 73 46 69 6c 65 20 2a 20 70 46 69 6c 65 3b   OsFile * pFile;
c2a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
c2b0: 20 64 75 6d 6d 79 3b 0a 20 20 63 68 61 72 20 7a   dummy;.  char z
c2c0: 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
c2d0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
c2e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c2f0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
c300: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
c310: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
c320: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
c330: 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
c340: 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  e", 0);.    retu
c350: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c360: 7d 0a 0a 20 20 70 46 69 6c 65 20 3d 20 73 71 6c  }..  pFile = sql
c370: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
c380: 28 4f 73 46 69 6c 65 29 29 3b 0a 20 20 72 63 20  (OsFile));.  rc 
c390: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
c3a0: 65 61 64 57 72 69 74 65 28 54 63 6c 5f 47 65 74  eadWrite(Tcl_Get
c3b0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
c3c0: 20 70 46 69 6c 65 2c 20 26 64 75 6d 6d 79 29 3b   pFile, &dummy);
c3d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c3e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
c3f0: 74 65 46 72 65 65 28 70 46 69 6c 65 29 3b 0a 20  teFree(pFile);. 
c400: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
c410: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
c420: 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  )errorName(rc), 
c430: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
c440: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c450: 52 3b 0a 20 20 7d 0a 20 20 6d 61 6b 65 50 6f 69  R;.  }.  makePoi
c460: 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
c470: 7a 42 75 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20  zBuf, pFile);.  
c480: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
c490: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
c4a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c4b0: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OR;.}../*.** Usa
c4c0: 67 65 3a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  ge:  sqlite3OsCl
c4d0: 6f 73 65 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65  ose <file handle
c4e0: 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  >.*/.static int 
c4f0: 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c  test_sqlite3OsCl
c500: 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ose(.  void * cl
c510: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
c520: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
c530: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
c540: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
c550: 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20  v[].){.  OsFile 
c560: 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  * pFile;.  int r
c570: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
c580: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
c590: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
c5a0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
c5b0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
c5c0: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
c5d0: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
c5e0: 22 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30  " filehandle", 0
c5f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c600: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
c610: 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74  if( getFilePoint
c620: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
c630: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
c640: 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20  ), &pFile) ){.  
c650: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c660: 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
c670: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 46  qlite3OsClose(pF
c680: 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ile);.  if( rc!=
c690: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c6a0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
c6b0: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65  nterp, (char *)e
c6c0: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
c6d0: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
c6e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c6f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
c700: 65 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75  e(pFile);.  retu
c710: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
c720: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
c730: 74 65 33 4f 73 4c 6f 63 6b 20 3c 66 69 6c 65 20  te3OsLock <file 
c740: 68 61 6e 64 6c 65 3e 20 3c 6c 6f 63 6b 74 79 70  handle> <locktyp
c750: 65 3e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e>.*/.static int
c760: 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c   test_sqlite3OsL
c770: 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ock(.  void * cl
c780: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
c790: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
c7a0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
c7b0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
c7c0: 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20  v[].){.  OsFile 
c7d0: 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  * pFile;.  int r
c7e0: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
c7f0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
c800: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
c810: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
c820: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
c830: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
c840: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
c850: 20 0a 20 20 20 20 20 20 20 20 22 20 66 69 6c 65   .        " file
c860: 68 61 6e 64 6c 65 20 28 53 48 41 52 45 44 7c 52  handle (SHARED|R
c870: 45 53 45 52 56 45 44 7c 50 45 4e 44 49 4e 47 7c  ESERVED|PENDING|
c880: 45 58 43 4c 55 53 49 56 45 29 22 2c 20 30 29 3b  EXCLUSIVE)", 0);
c890: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c8a0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
c8b0: 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  ( getFilePointer
c8c0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
c8d0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
c8e0: 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20   &pFile) ){.    
c8f0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c900: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 30 3d 3d  ;.  }..  if( 0==
c910: 73 74 72 63 6d 70 28 22 53 48 41 52 45 44 22 2c  strcmp("SHARED",
c920: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c930: 62 6a 76 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20  bjv[2])) ){.    
c940: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
c950: 63 6b 28 70 46 69 6c 65 2c 20 53 48 41 52 45 44  ck(pFile, SHARED
c960: 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c  _LOCK);.  }.  el
c970: 73 65 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70  se if( 0==strcmp
c980: 28 22 52 45 53 45 52 56 45 44 22 2c 20 54 63 6c  ("RESERVED", Tcl
c990: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
c9a0: 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  2])) ){.    rc =
c9b0: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
c9c0: 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 4c  File, RESERVED_L
c9d0: 4f 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  OCK);.  }.  else
c9e0: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22   if( 0==strcmp("
c9f0: 50 45 4e 44 49 4e 47 22 2c 20 54 63 6c 5f 47 65  PENDING", Tcl_Ge
ca00: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
ca10: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
ca20: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c  lite3OsLock(pFil
ca30: 65 2c 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  e, PENDING_LOCK)
ca40: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
ca50: 20 30 3d 3d 73 74 72 63 6d 70 28 22 45 58 43 4c   0==strcmp("EXCL
ca60: 55 53 49 56 45 22 2c 20 54 63 6c 5f 47 65 74 53  USIVE", Tcl_GetS
ca70: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20  tring(objv[2])) 
ca80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
ca90: 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c  te3OsLock(pFile,
caa0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
cab0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
cac0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
cad0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
cae0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
caf0: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 54   \"", .        T
cb00: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
cb10: 76 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20  v[0]), .        
cb20: 22 20 66 69 6c 65 68 61 6e 64 6c 65 20 28 53 48  " filehandle (SH
cb30: 41 52 45 44 7c 52 45 53 45 52 56 45 44 7c 50 45  ARED|RESERVED|PE
cb40: 4e 44 49 4e 47 7c 45 58 43 4c 55 53 49 56 45 29  NDING|EXCLUSIVE)
cb50: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
cb60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
cb70: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
cb80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
cb90: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
cba0: 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72  p, (char *)error
cbb0: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
cbc0: 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72  ATIC);.    retur
cbd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
cbe0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
cbf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
cc00: 3a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  :  sqlite3OsUnlo
cc10: 63 6b 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e  ck <file handle>
cc20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
cc30: 65 73 74 5f 73 71 6c 69 74 65 33 4f 73 55 6e 6c  est_sqlite3OsUnl
cc40: 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ock(.  void * cl
cc50: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
cc60: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
cc70: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
cc80: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
cc90: 76 5b 5d 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20  v[].){.  OsFile 
cca0: 2a 20 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  * pFile;.  int r
ccb0: 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
ccc0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
ccd0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
cce0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
ccf0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
cd00: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
cd10: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
cd20: 22 20 66 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30  " filehandle", 0
cd30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
cd40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
cd50: 69 66 28 20 67 65 74 46 69 6c 65 50 6f 69 6e 74  if( getFilePoint
cd60: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
cd70: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
cd80: 29 2c 20 26 70 46 69 6c 65 29 20 29 7b 0a 20 20  ), &pFile) ){.  
cd90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
cda0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
cdb0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
cdc0: 46 69 6c 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  File, NO_LOCK);.
cdd0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cde0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
cdf0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
ce00: 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61   (char *)errorNa
ce10: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
ce20: 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
ce30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
ce40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
ce50: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  }.../*.** Regist
ce60: 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68  er commands with
ce70: 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
ce80: 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c  eter..*/.int Sql
ce90: 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
cea0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ceb0: 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
cec0: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
ced0: 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
cee0: 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  nt sqlite3_inter
cef0: 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  rupt_count;.  ex
cf00: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
cf10: 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
cf20: 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
cf30: 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
cf40: 69 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 73 74  ime;.  static st
cf50: 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
cf60: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63   *zName;.     Tc
cf70: 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  l_CmdProc *xProc
cf80: 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b  ;.  } aCmd[] = {
cf90: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
cfa0: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20  _mprintf_int",  
cfb0: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
cfc0: 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
cfd0: 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c  printf_int    },
cfe0: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
cff0: 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20  _mprintf_str",  
d000: 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
d010: 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
d020: 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c  printf_str    },
d030: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
d040: 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22  _mprintf_double"
d050: 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
d060: 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
d070: 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c  printf_double },
d080: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
d090: 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22  _mprintf_scaled"
d0a0: 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
d0b0: 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
d0c0: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c  printf_scaled },
d0d0: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
d0e0: 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22  _mprintf_z_test"
d0f0: 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
d100: 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69  dProc*)test_mpri
d110: 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a  ntf_z        },.
d120: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
d130: 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
d140: 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  d",     (Tcl_Cmd
d150: 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f  Proc*)test_last_
d160: 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20  rowid       },. 
d170: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
d180: 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20  xec_printf",    
d190: 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
d1a0: 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70  roc*)test_exec_p
d1b0: 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20  rintf      },.  
d1c0: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65     { "sqlite3_ge
d1d0: 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c  t_table_printf",
d1e0: 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
d1f0: 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61 62  oc*)test_get_tab
d200: 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 20 20 20  le_printf },.   
d210: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f    { "sqlite3_clo
d220: 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  se",            
d230: 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
d240: 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  c*)sqlite_test_c
d250: 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20 20  lose     },.    
d260: 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
d270: 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20  te_function",   
d280: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
d290: 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  *)test_create_fu
d2a0: 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20  nction  },.     
d2b0: 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
d2c0: 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20 20  e_aggregate",   
d2d0: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
d2e0: 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67  )test_create_agg
d2f0: 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b  regate },.     {
d300: 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65   "sqlite_registe
d310: 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  r_test_function"
d320: 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
d330: 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75  test_register_fu
d340: 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nc    },.     { 
d350: 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20  "sqlite_abort", 
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
d380: 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20 20  qlite_abort     
d390: 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20 53       },.#ifdef S
d3a0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
d3b0: 20 7b 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f   { "sqlite_mallo
d3c0: 63 5f 66 61 69 6c 22 2c 20 20 20 20 20 20 20 20  c_fail",        
d3d0: 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
d3e0: 2a 29 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f  *)sqlite_malloc_
d3f0: 66 61 69 6c 20 20 20 20 7d 2c 0a 20 20 20 20 20  fail    },.     
d400: 7b 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  { "sqlite_malloc
d410: 5f 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20  _stat",         
d420: 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
d430: 29 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63 5f 73  )sqlite_malloc_s
d440: 74 61 74 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66  tat    },.#endif
d450: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
d460: 62 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20  bind",          
d470: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
d480: 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e  mdProc*)test_bin
d490: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  d             },
d4a0: 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f  .     { "breakpo
d4b0: 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
d4c0: 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
d4d0: 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72 65  mdProc*)test_bre
d4e0: 61 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c  akpoint       },
d4f0: 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 73  .  };.  static s
d500: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
d510: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54  r *zName;.     T
d520: 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78  cl_ObjCmdProc *x
d530: 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20  Proc;.     void 
d540: 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d  *clientData;.  }
d550: 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20   aObjCmd[] = {. 
d560: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
d570: 69 6e 64 5f 69 6e 74 33 32 22 2c 20 20 20 20 20  ind_int32",     
d580: 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
d590: 5f 69 6e 74 33 32 2c 20 30 20 20 20 20 7d 2c 0a  _int32, 0    },.
d5a0: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
d5b0: 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20  bind_int64",    
d5c0: 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
d5d0: 64 5f 69 6e 74 36 34 20 2c 20 30 20 20 20 7d 2c  d_int64 , 0   },
d5e0: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
d5f0: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20  _bind_double",  
d600: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
d610: 6e 64 5f 64 6f 75 62 6c 65 2c 20 30 20 20 20 7d  nd_double, 0   }
d620: 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
d630: 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20  3_bind_null",   
d640: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
d650: 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20  ind_null     ,0 
d660: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
d670: 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20  e3_bind_text",  
d680: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
d690: 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30  bind_text     ,0
d6a0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
d6b0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22  te3_bind_text16"
d6c0: 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
d6d0: 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c  _bind_text16   ,
d6e0: 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
d6f0: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c  ite3_bind_blob",
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
d710: 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20  t_bind_blob     
d720: 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
d730: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c 20  lite3_errcode", 
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
d750: 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20 20  st_errcode      
d760: 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
d770: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22 2c 20  qlite3_errmsg", 
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
d790: 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20 20 20  est_errmsg      
d7a0: 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
d7b0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36  sqlite3_errmsg16
d7c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
d7d0: 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 20 20  test_errmsg16   
d7e0: 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
d7f0: 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c 20  "sqlite3_open", 
d800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d810: 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20 20 20   test_open      
d820: 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
d830: 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36   "sqlite3_open16
d840: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
d850: 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20 20 20    test_open16   
d860: 20 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20       ,0 },..    
d870: 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
d880: 61 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  are",           
d890: 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
d8a0: 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
d8b0: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65    { "sqlite3_pre
d8c0: 70 61 72 65 31 36 22 2c 20 20 20 20 20 20 20 20  pare16",        
d8d0: 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72       test_prepar
d8e0: 65 31 36 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  e16     ,0 },.  
d8f0: 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69     { "sqlite3_fi
d900: 6e 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20  nalize",        
d910: 20 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c        test_final
d920: 69 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  ize      ,0 },. 
d930: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
d940: 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20  eset",          
d950: 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73 65         test_rese
d960: 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  t         ,0 },.
d970: 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
d980: 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20  changes",       
d990: 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 68 61          test_cha
d9a0: 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c  nges       ,0 },
d9b0: 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
d9c0: 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20 20 20  _step",         
d9d0: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74           test_st
d9e0: 65 70 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  ep          ,0 }
d9f0: 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ,..     /* sqlit
da00: 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50  e3_column_*() AP
da10: 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c  I */.     { "sql
da20: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
da30: 74 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  t",          tes
da40: 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20  t_column_count  
da50: 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
da60: 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74  lite3_data_count
da70: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
da80: 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20  st_data_count   
da90: 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
daa0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
dab0: 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  pe",           t
dac0: 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20  est_column_type 
dad0: 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
dae0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
daf0: 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  lob",           
db00: 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  test_column_blob
db10: 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
db20: 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
db30: 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20  double",        
db40: 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75   test_column_dou
db50: 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  ble ,0 },.     {
db60: 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
db70: 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
db80: 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e    test_column_in
db90: 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  t64  ,0 },.     
dba0: 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
dbb0: 6e 5f 69 6e 74 22 2c 20 74 65 73 74 5f 73 74 6d  n_int", test_stm
dbc0: 74 5f 69 6e 74 20 2c 73 71 6c 69 74 65 33 5f 63  t_int ,sqlite3_c
dbd0: 6f 6c 75 6d 6e 5f 69 6e 74 20 7d 2c 0a 20 20 20  olumn_int },.   
dbe0: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
dbf0: 75 6d 6e 5f 62 79 74 65 73 22 2c 20 74 65 73 74  umn_bytes", test
dc00: 5f 73 74 6d 74 5f 69 6e 74 20 2c 73 71 6c 69 74  _stmt_int ,sqlit
dc10: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20  e3_column_bytes 
dc20: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
dc30: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31  e3_column_bytes1
dc40: 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e  6", test_stmt_in
dc50: 74 20 2c 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  t ,sqlite3_colum
dc60: 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20 20 20  n_bytes16 },.   
dc70: 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
dc80: 75 6d 6e 5f 74 65 78 74 22 2c 20 74 65 73 74 5f  umn_text", test_
dc90: 73 74 6d 74 5f 75 74 66 38 2c 20 20 20 20 20 20  stmt_utf8,      
dca0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
dcb0: 74 65 78 74 7d 2c 0a 20 20 20 20 20 7b 20 22 73  text},.     { "s
dcc0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
dcd0: 63 6c 74 79 70 65 22 2c 20 74 65 73 74 5f 73 74  cltype", test_st
dce0: 6d 74 5f 75 74 66 38 2c 20 20 20 73 71 6c 69 74  mt_utf8,   sqlit
dcf0: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
dd00: 70 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  pe},.     { "sql
dd10: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
dd20: 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ", test_stmt_utf
dd30: 38 2c 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  8,       sqlite3
dd40: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 7d 2c 0a 20  _column_name},. 
dd50: 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
dd60: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 74  olumn_text16", t
dd70: 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
dd80: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
dd90: 6e 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20 20 20  n_text16},.     
dda0: 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
ddb0: 6e 5f 64 65 63 6c 74 79 70 65 31 36 22 2c 20 74  n_decltype16", t
ddc0: 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 73  est_stmt_utf16,s
ddd0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
dde0: 63 6c 74 79 70 65 31 36 7d 2c 0a 20 20 20 20 20  cltype16},.     
ddf0: 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
de00: 6e 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f  n_name16", test_
de10: 73 74 6d 74 5f 75 74 66 31 36 2c 20 20 20 20 73  stmt_utf16,    s
de20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
de30: 6d 65 31 36 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20  me16},..     /* 
de40: 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f  Functions from o
de50: 73 2e 68 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73  s.h */.     { "s
de60: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
de70: 57 72 69 74 65 22 2c 74 65 73 74 5f 73 71 6c 69  Write",test_sqli
de80: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69  te3OsOpenReadWri
de90: 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  te, 0 },.     { 
dea0: 22 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 22  "sqlite3OsClose"
deb0: 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71  ,        test_sq
dec0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 2c 20 30 20  lite3OsClose, 0 
ded0: 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
dee0: 65 33 4f 73 4c 6f 63 6b 22 2c 20 20 20 20 20 20  e3OsLock",      
def0: 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f     test_sqlite3O
df00: 73 4c 6f 63 6b 2c 20 30 20 7d 2c 0a 20 20 20 20  sLock, 0 },.    
df10: 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 55 6e 6c   { "sqlite3OsUnl
df20: 6f 63 6b 22 2c 20 20 20 20 20 20 20 74 65 73 74  ock",       test
df30: 5f 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b  _sqlite3OsUnlock
df40: 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61  , 0 },.     { "a
df50: 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  dd_test_collate"
df60: 2c 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c  ,      test_coll
df70: 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 20 7d  ate, 0         }
df80: 2c 0a 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  ,..  };.  int i;
df90: 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
dfa0: 6c 69 74 65 33 5f 6f 73 5f 74 72 61 63 65 3b 0a  lite3_os_trace;.
dfb0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
dfc0: 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f  zeof(aCmd)/sizeo
dfd0: 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29  f(aCmd[0]); i++)
dfe0: 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
dff0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
e000: 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61  aCmd[i].zName, a
e010: 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c  Cmd[i].xProc, 0,
e020: 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69   0);.  }.  for(i
e030: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62  =0; i<sizeof(aOb
e040: 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62  jCmd)/sizeof(aOb
e050: 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  jCmd[0]); i++){.
e060: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
e070: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
e080: 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d   aObjCmd[i].zNam
e090: 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f 62 6a  e, .        aObj
e0a0: 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f  Cmd[i].xProc, aO
e0b0: 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44  bjCmd[i].clientD
e0c0: 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54  ata, 0);.  }.  T
e0d0: 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
e0e0: 70 2c 20 22 73 71 6c 69 74 65 5f 73 65 61 72 63  p, "sqlite_searc
e0f0: 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20  h_count", .     
e100: 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
e110: 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54  _search_count, T
e120: 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
e130: 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
e140: 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65  rp, "sqlite_inte
e150: 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20  rrupt_count", . 
e160: 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
e170: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
e180: 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
e190: 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
e1a0: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
e1b0: 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
e1c0: 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
e1d0: 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e  r*)&sqlite3_open
e1e0: 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c  _file_count, TCL
e1f0: 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
e200: 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
e210: 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e  , "sqlite_curren
e220: 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20  t_time", .      
e230: 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
e240: 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43  current_time, TC
e250: 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
e260: 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
e270: 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72  p, "sqlite_os_tr
e280: 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ace",.      (cha
e290: 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  r*)&sqlite3_os_t
e2a0: 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
e2b0: 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
e2c0: 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
e2d0: 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
e2e0: 61 6c 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68  alue",.      (ch
e2f0: 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74  ar*)&sqlite_stat
e300: 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54  ic_bind_value, T
e310: 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b  CL_LINK_STRING);
e320: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
e330: 3b 0a 7d 0a                                      ;.}.