/ Hex Artifact Content
Login

Artifact bbd404d6ee6bfe326ebf04699a0fabcc28e50a91:


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 31 31 31 20 32 30 30 34 2f 31 31  ,v 1.111 2004/11
0240: 2f 31 33 20 30 33 3a 34 38 3a 30 37 20 64 72 68  /13 03:48:07 drh
0250: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0260: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0270: 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68  .#include "tcl.h
0280: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  ".#include "os.h
0290: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  ".#include <stdl
02a0: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
02b0: 73 74 72 69 6e 67 2e 68 3e 0a 0a 73 74 61 74 69  string.h>..stati
02c0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 65  c const char * e
02d0: 72 72 6f 72 4e 61 6d 65 28 69 6e 74 20 72 63 29  rrorName(int rc)
02e0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
02f0: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 73 77 69  zName = 0;.  swi
0300: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63  tch( rc ){.    c
0310: 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20  ase SQLITE_OK:  
0320: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
0330: 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20  SQLITE_OK";     
0340: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0350: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f  case SQLITE_ERRO
0360: 52 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  R:      zName = 
0370: 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20  "SQLITE_ERROR"; 
0380: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
0390: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
03a0: 45 52 4e 41 4c 3a 20 20 20 7a 4e 61 6d 65 20 3d  ERNAL:   zName =
03b0: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41   "SQLITE_INTERNA
03c0: 4c 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  L";    break;.  
03d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
03e0: 52 4d 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  RM:       zName 
03f0: 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b  = "SQLITE_PERM";
0400: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
0410: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
0420: 42 4f 52 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65  BORT:      zName
0430: 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54   = "SQLITE_ABORT
0440: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
0450: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0460: 42 55 53 59 3a 20 20 20 20 20 20 20 7a 4e 61 6d  BUSY:       zNam
0470: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
0480: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
0490: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
04a0: 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 7a 4e 61  _LOCKED:     zNa
04b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
04c0: 4b 45 44 22 3b 20 20 20 20 20 20 62 72 65 61 6b  KED";      break
04d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
04e0: 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 7a 4e  E_NOMEM:      zN
04f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
0500: 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61  MEM";       brea
0510: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0520: 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 7a  TE_READONLY:   z
0530: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
0540: 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 62 72 65  EADONLY";    bre
0550: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0560: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20  ITE_INTERRUPT:  
0570: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0580: 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20 62 72  INTERRUPT";   br
0590: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
05a0: 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20  LITE_IOERR:     
05b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
05c0: 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 62  _IOERR";       b
05d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
05e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20  QLITE_CORRUPT:  
05f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0600: 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20  E_CORRUPT";     
0610: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0620: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a  SQLITE_NOTFOUND:
0630: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0640: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
0650: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
0660: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20   SQLITE_FULL:   
0670: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0680: 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20  ITE_FULL";      
0690: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
06a0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
06b0: 4e 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  N:   zName = "SQ
06c0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20  LITE_CANTOPEN"; 
06d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
06e0: 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  se SQLITE_PROTOC
06f0: 4f 4c 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  OL:   zName = "S
0700: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b  QLITE_PROTOCOL";
0710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
0720: 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  ase SQLITE_EMPTY
0730: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
0740: 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20  SQLITE_EMPTY";  
0750: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
0760: 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45  case SQLITE_SCHE
0770: 4d 41 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  MA:     zName = 
0780: 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b  "SQLITE_SCHEMA";
0790: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
07a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f   case SQLITE_TOO
07b0: 42 49 47 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  BIG:     zName =
07c0: 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22   "SQLITE_TOOBIG"
07d0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
07e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
07f0: 4e 53 54 52 41 49 4e 54 3a 20 7a 4e 61 6d 65 20  NSTRAINT: zName 
0800: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
0810: 41 49 4e 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  AINT";  break;. 
0820: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
0830: 49 53 4d 41 54 43 48 3a 20 20 20 7a 4e 61 6d 65  ISMATCH:   zName
0840: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41   = "SQLITE_MISMA
0850: 54 43 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  TCH";    break;.
0860: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
0870: 4d 49 53 55 53 45 3a 20 20 20 20 20 7a 4e 61 6d  MISUSE:     zNam
0880: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55  e = "SQLITE_MISU
0890: 53 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  SE";      break;
08a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
08b0: 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 7a 4e 61  _NOLFS:      zNa
08c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c  me = "SQLITE_NOL
08d0: 46 53 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  FS";       break
08e0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
08f0: 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20 7a 4e  E_AUTH:       zN
0900: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55  ame = "SQLITE_AU
0910: 54 48 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  TH";        brea
0920: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
0930: 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 7a  TE_FORMAT:     z
0940: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
0950: 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 62 72 65  ORMAT";      bre
0960: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
0970: 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20  ITE_RANGE:      
0980: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
0990: 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20 62 72  RANGE";       br
09a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
09b0: 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20  LITE_ROW:       
09c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
09d0: 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20 62  _ROW";         b
09e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
09f0: 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20  QLITE_DONE:     
0a00: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
0a10: 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20  E_DONE";        
0a20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
0a30: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20  SQLITE_NOTADB:  
0a40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0a50: 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20  TE_NOTADB";     
0a60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
0a70: 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 20  ult:            
0a80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
0a90: 49 54 45 5f 55 6e 6b 6e 6f 77 6e 22 3b 20 20 20  ITE_Unknown";   
0aa0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
0ab0: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
0ac0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
0ad0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20 69   sqlite3_stmt* i
0ae0: 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 2a 2e  nto an sqlite3*.
0af0: 20 20 54 68 69 73 20 64 65 70 65 6e 64 73 20 6f    This depends o
0b00: 6e 20 74 68 65 0a 2a 2a 20 66 61 63 74 20 74 68  n the.** fact th
0b10: 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20  at the sqlite3* 
0b20: 69 73 20 74 68 65 20 66 69 72 73 74 20 66 69 65  is the first fie
0b30: 6c 64 20 69 6e 20 74 68 65 20 56 64 62 65 20 73  ld in the Vdbe s
0b40: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65  tructure..*/.#de
0b50: 66 69 6e 65 20 53 74 6d 74 54 6f 44 62 28 58 29  fine StmtToDb(X)
0b60: 20 20 20 28 2a 28 73 71 6c 69 74 65 33 2a 2a 29     (*(sqlite3**)
0b70: 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  (X))../*.** Chec
0b80: 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  k a return value
0b90: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
0ba0: 20 61 67 72 65 65 73 20 77 69 74 68 20 74 68 65   agrees with the
0bb0: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d   results.** from
0bc0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
0bd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0be0: 54 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f  TestErrCode(Tcl_
0bf0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0c00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
0c10: 20 72 63 29 7b 0a 20 20 69 66 28 20 72 63 21 3d   rc){.  if( rc!=
0c20: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26  SQLITE_MISUSE &&
0c30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
0c40: 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  & sqlite3_errcod
0c50: 65 28 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20  e(db)!=rc ){.   
0c60: 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
0c70: 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71  .    int r2 = sq
0c80: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
0c90: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
0ca0: 42 75 66 2c 20 22 65 72 72 6f 72 20 63 6f 64 65  Buf, "error code
0cb0: 20 25 73 20 28 25 64 29 20 64 6f 65 73 20 6e 6f   %s (%d) does no
0cc0: 74 20 6d 61 74 63 68 20 73 71 6c 69 74 65 33 5f  t match sqlite3_
0cd0: 65 72 72 63 6f 64 65 20 25 73 20 28 25 64 29 22  errcode %s (%d)"
0ce0: 2c 0a 20 20 20 20 20 20 20 65 72 72 6f 72 4e 61  ,.       errorNa
0cf0: 6d 65 28 72 63 29 2c 20 72 63 2c 20 65 72 72 6f  me(rc), rc, erro
0d00: 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29 3b 0a  rName(r2), r2);.
0d10: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
0d20: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
0d30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0d40: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0d50: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  0);.    return 1
0d60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
0d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
0d80: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
0d90: 6e 20 73 71 6c 69 74 65 33 20 6f 62 6a 65 63 74  n sqlite3 object
0da0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0db0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
0dc0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0dd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
0de0: 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29   sqlite3 **ppDb)
0df0: 7b 0a 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c  {.  *ppDb = (sql
0e00: 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54 65 78  ite3*)sqlite3Tex
0e10: 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72 65  tToPtr(zA);.  re
0e20: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
0e30: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
0e40: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
0e50: 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74  ite3_stmt object
0e60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0e70: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 0a  getStmtPointer(.
0e80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0e90: 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63  terp, .  const c
0ea0: 68 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 73  har *zArg,  .  s
0eb0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
0ec0: 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d  Stmt.){.  *ppStm
0ed0: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d  t = (sqlite3_stm
0ee0: 74 2a 29 73 71 6c 69 74 65 33 54 65 78 74 54 6f  t*)sqlite3TextTo
0ef0: 50 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74  Ptr(zArg);.  ret
0f00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
0f10: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70 6f  *.** Decode a po
0f20: 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
0f30: 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e  te3_stmt object.
0f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
0f50: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 0a 20  etFilePointer(. 
0f60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0f70: 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  erp, .  const ch
0f80: 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 4f 73  ar *zArg,  .  Os
0f90: 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 0a 29 7b  File **ppFile.){
0fa0: 0a 20 20 2a 70 70 46 69 6c 65 20 3d 20 28 4f 73  .  *ppFile = (Os
0fb0: 46 69 6c 65 2a 29 73 71 6c 69 74 65 33 54 65 78  File*)sqlite3Tex
0fc0: 74 54 6f 50 74 72 28 7a 41 72 67 29 3b 0a 20 20  tToPtr(zArg);.  
0fd0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
0fe0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
0ff0: 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65 6e   a text represen
1000: 74 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e  tation of a poin
1010: 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65 20  ter that can be 
1020: 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79  understood.** by
1030: 20 74 68 65 20 67 65 74 44 62 50 6f 69 6e 74 65   the getDbPointe
1040: 72 20 61 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74  r and getVmPoint
1050: 65 72 20 72 6f 75 74 69 6e 65 73 20 61 62 6f 76  er routines abov
1060: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  e..**.** The pro
1070: 62 6c 65 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65  blem is, on some
1080: 20 6d 61 63 68 69 6e 65 73 20 28 53 6f 6c 61 72   machines (Solar
1090: 69 73 29 20 69 66 20 79 6f 75 20 64 6f 20 61 20  is) if you do a 
10a0: 70 72 69 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22  printf with.** "
10b0: 25 70 22 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74  %p" you cannot t
10c0: 75 72 6e 20 61 72 6f 75 6e 64 20 61 6e 64 20 64  urn around and d
10d0: 6f 20 61 20 73 63 61 6e 66 20 77 69 74 68 20 74  o a scanf with t
10e0: 68 65 20 73 61 6d 65 20 22 25 70 22 20 61 6e 64  he same "%p" and
10f0: 0a 2a 2a 20 67 65 74 20 79 6f 75 72 20 70 6f 69  .** get your poi
1100: 6e 74 65 72 20 62 61 63 6b 2e 20 20 59 6f 75 20  nter back.  You 
1110: 68 61 76 65 20 74 6f 20 70 72 65 70 65 6e 64 20  have to prepend 
1120: 61 20 22 30 78 22 20 62 65 66 6f 72 65 20 69 74  a "0x" before it
1130: 20 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20   will.** work.  
1140: 4f 72 20 61 74 20 6c 65 61 73 74 20 74 68 61 74  Or at least that
1150: 20 69 73 20 77 68 61 74 20 69 73 20 72 65 70 6f   is what is repo
1160: 72 74 65 64 20 74 6f 20 6d 65 20 28 64 72 68 29  rted to me (drh)
1170: 2e 20 20 42 75 74 20 74 68 69 73 0a 2a 2a 20 62  .  But this.** b
1180: 65 68 61 76 69 6f 72 20 76 61 72 69 65 73 20 66  ehavior varies f
1190: 72 6f 6d 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d  rom machine to m
11a0: 61 63 68 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c  achine.  The sol
11b0: 75 74 69 6f 6e 20 75 73 65 64 20 68 65 72 20 69  ution used her i
11c0: 73 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  s.** to test the
11d0: 20 73 74 72 69 6e 67 20 72 69 67 68 74 20 61 66   string right af
11e0: 74 65 72 20 69 74 20 69 73 20 67 65 6e 65 72 61  ter it is genera
11f0: 74 65 64 20 74 6f 20 73 65 65 20 69 66 20 69 74  ted to see if it
1200: 20 63 61 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72   can be.** under
1210: 73 74 6f 6f 64 20 62 79 20 73 63 61 6e 66 2c 20  stood by scanf, 
1220: 61 6e 64 20 69 66 20 6e 6f 74 2c 20 74 72 79 20  and if not, try 
1230: 70 72 65 70 65 6e 64 69 6e 67 20 61 6e 20 22 30  prepending an "0
1240: 78 22 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20  x" to see if.** 
1250: 74 68 61 74 20 68 65 6c 70 73 2e 20 20 49 66 20  that helps.  If 
1260: 6e 6f 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61  nothing works, a
1270: 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 73 20   fatal error is 
1280: 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 73 74  generated..*/.st
1290: 61 74 69 63 20 69 6e 74 20 6d 61 6b 65 50 6f 69  atic int makePoi
12a0: 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74 65  nterStr(Tcl_Inte
12b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61 72  rp *interp, char
12c0: 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70 29   *zPtr, void *p)
12d0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  {.  sqlite3_snpr
12e0: 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c 20  intf(100, zPtr, 
12f0: 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74 75  "%p", p);.  retu
1300: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1310: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
1320: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71 6c   routine for sql
1330: 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
1340: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1350: 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  t exec_printf_cb
1360: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
1370: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
1380: 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 29  gv, char **name)
1390: 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  {.  Tcl_DString 
13a0: 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74 72  *str = (Tcl_DStr
13b0: 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ing*)pArg;.  int
13c0: 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f 44   i;..  if( Tcl_D
13d0: 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74 72  StringLength(str
13e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )==0 ){.    for(
13f0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
1400: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74  ){.      Tcl_DSt
1410: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
1420: 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f  t(str, name[i] ?
1430: 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c   name[i] : "NULL
1440: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
1450: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
1460: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44   i++){.    Tcl_D
1470: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
1480: 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69 5d  ent(str, argv[i]
1490: 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e 55   ? argv[i] : "NU
14a0: 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LL");.  }.  retu
14b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn 0;.}../*.** U
14c0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
14d0: 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42 20 20  xec_printf  DB  
14e0: 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 0a 2a  FORMAT  STRING.*
14f0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
1500: 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69  sqlite3_exec_pri
1510: 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65 20  ntf() interface 
1520: 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64  using the open d
1530: 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20  atabase.** DB.  
1540: 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20 73  The SQL is the s
1550: 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54  tring FORMAT.  T
1560: 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
1570: 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
1580: 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e  ** one %s or %q.
1590: 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65 20    STRING is the 
15a0: 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69  value inserted i
15b0: 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f  nto %s or %q..*/
15c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
15d0: 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a 20 20  _exec_printf(.  
15e0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
15f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1600: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
1610: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
1620: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
1630: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
1640: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
1650: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1660: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
1670: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
1680: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
1690: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
16a0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
16b0: 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72   *db;.  Tcl_DStr
16c0: 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72  ing str;.  int r
16d0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
16e0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71  = 0;.  char *zSq
16f0: 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  l;.  char zBuf[3
1700: 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  0];.  if( argc!=
1710: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1720: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1730: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1740: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1750: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1760: 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52   " DB FORMAT STR
1770: 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ING", 0);.    re
1780: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1790: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
17a0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
17b0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
17c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17d0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
17e0: 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c  it(&str);.  zSql
17f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1800: 74 66 28 61 72 67 76 5b 32 5d 2c 20 61 72 67 76  tf(argv[2], argv
1810: 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  [3]);.  rc = sql
1820: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53  ite3_exec(db, zS
1830: 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f  ql, exec_printf_
1840: 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29  cb, &str, &zErr)
1850: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1860: 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74  (zSql);.  sprint
1870: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  f(zBuf, "%d", rc
1880: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
1890: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
18a0: 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Buf);.  Tcl_Appe
18b0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
18c0: 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , rc==SQLITE_OK 
18d0: 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ? Tcl_DStringVal
18e0: 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29  ue(&str) : zErr)
18f0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
1900: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28  ree(&str);.  if(
1910: 20 7a 45 72 72 20 29 20 66 72 65 65 28 7a 45 72   zErr ) free(zEr
1920: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
1930: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
1940: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
1950: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1960: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1980: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
1990: 74 66 5f 7a 5f 74 65 73 74 20 20 53 45 50 41 52  tf_z_test  SEPAR
19a0: 41 54 4f 52 20 20 41 52 47 30 20 20 41 52 47 31  ATOR  ARG0  ARG1
19b0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20   ....**.** Test 
19c0: 74 68 65 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66  the %z format of
19d0: 20 6d 70 72 69 6e 74 66 28 29 2e 20 20 55 73 65   mprintf().  Use
19e0: 20 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74   multiple mprint
19f0: 66 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  f() calls to .**
1a00: 20 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67   concatenate arg
1a10: 30 20 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75  0 through argn u
1a20: 73 69 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61  sing separator a
1a30: 73 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e  s the separator.
1a40: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72  .** Return the r
1a50: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
1a60: 20 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74   int test_mprint
1a70: 66 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  f_z(.  void *Not
1a80: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
1a90: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1aa0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1ab0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1ac0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1ad0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1af0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1b00: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
1b10: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
1b20: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
1b30: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
1b40: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20  char *zResult = 
1b50: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66  0;.  int i;..  f
1b60: 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 3b 20  or(i=2; i<argc; 
1b70: 69 2b 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c  i++){.    zResul
1b80: 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1b90: 74 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65  tf("%z%s%s", zRe
1ba0: 73 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61  sult, argv[1], a
1bb0: 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54  rgv[i]);.  }.  T
1bc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1bd0: 69 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c  interp, zResult,
1be0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65   0);.  sqliteFre
1bf0: 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72 65  e(zResult);.  re
1c00: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c10: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1c20: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
1c30: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
1c40: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
1c50: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
1c60: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
1c70: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
1c80: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
1c90: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
1ca0: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
1cb0: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
1cc0: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
1cd0: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
1ce0: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
1cf0: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
1d00: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
1d10: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
1d20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1d30: 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  t_get_table_prin
1d40: 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  tf(.  void *NotU
1d50: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
1d60: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1d70: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1d80: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1d90: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1da0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
1db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dc0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1dd0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
1de0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
1df0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
1e00: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
1e10: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63  qlite3 *db;.  Tc
1e20: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
1e30: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
1e40: 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74  *zErr = 0;.  int
1e50: 20 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63   nRow, nCol;.  c
1e60: 68 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20  har **aResult;. 
1e70: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a   int i;.  char z
1e80: 42 75 66 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20  Buf[30];.  char 
1e90: 2a 7a 53 71 6c 3b 0a 20 20 69 66 28 20 61 72 67  *zSql;.  if( arg
1ea0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
1eb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ec0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1ed0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1ee0: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1ef0: 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20      " DB FORMAT 
1f00: 53 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20  STRING", 0);.   
1f10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f20: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1f30: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1f40: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1f50: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f60: 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  OR;.  Tcl_DStrin
1f70: 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a  gInit(&str);.  z
1f80: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1f90: 72 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 61 72  rintf(argv[2],ar
1fa0: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
1fb0: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
1fc0: 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73  (db, zSql, &aRes
1fd0: 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f  ult, &nRow, &nCo
1fe0: 6c 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c  l, &zErr);.  sql
1ff0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2000: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
2010: 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63   "%d", rc);.  Tc
2020: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
2030: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
2040: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2050: 4f 4b 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  OK ){.    sprint
2060: 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 52  f(zBuf, "%d", nR
2070: 6f 77 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ow);.    Tcl_App
2080: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2090: 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 73 70  p, zBuf);.    sp
20a0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22  rintf(zBuf, "%d"
20b0: 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 54 63 6c  , nCol);.    Tcl
20c0: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
20d0: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
20e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 6e 52    for(i=0; i<(nR
20f0: 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 20 69 2b 2b 29  ow+1)*nCol; i++)
2100: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
2110: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2120: 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20 61  , aResult[i] ? a
2130: 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55 4c  Result[i] : "NUL
2140: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  L");.    }.  }el
2150: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  se{.    Tcl_Appe
2160: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2170: 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73  , zErr);.  }.  s
2180: 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62 6c  qlite3_free_tabl
2190: 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69 66  e(aResult);.  if
21a0: 28 20 7a 45 72 72 20 29 20 66 72 65 65 28 7a 45  ( zErr ) free(zE
21b0: 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rr);.  if( sqlit
21c0: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
21d0: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
21e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
21f0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2200: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
2210: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73  ge:  sqlite3_las
2220: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44  t_insert_rowid D
2230: 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
2240: 74 68 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49  the integer ROWI
2250: 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  D of the most re
2260: 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a  cent insert..*/.
2270: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
2280: 6c 61 73 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f  last_rowid(.  vo
2290: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
22a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
22b0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
22c0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
22d0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
22e0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
22f0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2300: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2310: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2320: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2330: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2340: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2350: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2360: 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  db;.  char zBuf[
2370: 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  30];..  if( argc
2380: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
2390: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
23a0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
23b0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
23c0: 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c  , argv[0], " DB\
23d0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
23e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23f0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2400: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
2410: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
2420: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2430: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
2440: 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c  %lld", sqlite3_l
2450: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
2460: 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70  (db));.  Tcl_App
2470: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2480: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
2490: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
24b0: 20 73 71 6c 69 74 65 33 5f 6b 65 79 20 44 42 20   sqlite3_key DB 
24c0: 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68  KEY.**.** Set th
24d0: 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a  e codec key..*/.
24e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
24f0: 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  key(.  void *Not
2500: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2510: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2520: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2530: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2540: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2550: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2570: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2580: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
2590: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
25a0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
25b0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
25c0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
25d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b  onst char *zKey;
25e0: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
25f0: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
2600: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2610: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
2620: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
2630: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
2640: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
2650: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
2660: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2670: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2680: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2690: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
26a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26b0: 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76  R;.  zKey = argv
26c0: 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74  [2];.  nKey = st
26d0: 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69 66 64  rlen(zKey);.#ifd
26e0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
26f0: 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65  DEC.  sqlite3_ke
2700: 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  y(db, zKey, nKey
2710: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
2720: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2730: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
2740: 74 65 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59  te3_rekey DB KEY
2750: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  .**.** Change th
2760: 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a  e codec key..*/.
2770: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
2780: 72 65 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e  rekey(.  void *N
2790: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
27a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
27b0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
27c0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
27d0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
27e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2800: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2810: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2820: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2830: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2840: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2850: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2860: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
2870: 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  y;.  int nKey;. 
2880: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
2890: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
28a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
28b0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
28c0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
28d0: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
28e0: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
28f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2900: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2910: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2920: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2930: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2940: 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72  ROR;.  zKey = ar
2950: 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20  gv[2];.  nKey = 
2960: 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 23 69  strlen(zKey);.#i
2970: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
2980: 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 5f  CODEC.  sqlite3_
2990: 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20  rekey(db, zKey, 
29a0: 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nKey);.#endif.  
29b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
29c0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
29d0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 44 42  sqlite3_close DB
29e0: 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68  .**.** Closes th
29f0: 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
2a00: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6f 70 65  d by sqlite3_ope
2a10: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2a20: 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f   sqlite_test_clo
2a30: 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  se(.  void *NotU
2a40: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
2a50: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2a60: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2a70: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2a80: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2a90: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
2aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ab0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2ac0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
2ad0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
2ae0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
2af0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
2b00: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
2b10: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
2b20: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
2b30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2b40: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2b50: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2b60: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
2b70: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
2b80: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2b90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ba0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2bb0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2bc0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2bd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
2be0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65   = sqlite3_close
2bf0: 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  (db);.  Tcl_SetR
2c00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
2c10: 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28  har *)errorName(
2c20: 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
2c30: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2c40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  K;.}../*.** Impl
2c50: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
2c60: 65 20 78 5f 63 6f 61 6c 65 73 63 65 28 29 20 66  e x_coalesce() f
2c70: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75  unction..** Retu
2c80: 72 6e 20 74 68 65 20 66 69 72 73 74 20 61 72 67  rn the first arg
2c90: 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  ument non-NULL a
2ca0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
2cb0: 69 63 20 76 6f 69 64 20 69 66 6e 75 6c 6c 46 75  ic void ifnullFu
2cc0: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
2cd0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74  xt *context, int
2ce0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
2cf0: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
2d00: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
2d10: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
2d20: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
2d30: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
2d40: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29  ue_type(argv[i])
2d50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d60: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
2d70: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
2d80: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
2d90: 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20  ]), -1,.        
2da0: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
2db0: 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  NT);.      break
2dc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2dd0: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
2de0: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 61   into which to a
2df0: 63 63 75 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a  ccumulate text..
2e00: 2a 2f 0a 73 74 72 75 63 74 20 64 73 74 72 20 7b  */.struct dstr {
2e10: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20  .  int nAlloc;  
2e20: 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
2e30: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65  ed */.  int nUse
2e40: 64 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73  d;   /* Space us
2e50: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  ed */.  char *z;
2e60: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 63       /* The spac
2e70: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
2e80: 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20  ppend text to a 
2e90: 64 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dstr.*/.static v
2ea0: 6f 69 64 20 64 73 74 72 41 70 70 65 6e 64 28 73  oid dstrAppend(s
2eb0: 74 72 75 63 74 20 64 73 74 72 20 2a 70 2c 20 63  truct dstr *p, c
2ec0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
2ed0: 74 20 64 69 76 69 64 65 72 29 7b 0a 20 20 69 6e  t divider){.  in
2ee0: 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b  t n = strlen(z);
2ef0: 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64 20  .  if( p->nUsed 
2f00: 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c  + n + 2 > p->nAl
2f10: 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20  loc ){.    char 
2f20: 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41  *zNew;.    p->nA
2f30: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  lloc = p->nAlloc
2f40: 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20 20  *2 + n + 200;.  
2f50: 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 52    zNew = sqliteR
2f60: 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e  ealloc(p->z, p->
2f70: 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
2f80: 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   zNew==0 ){.    
2f90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e    sqliteFree(p->
2fa0: 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  z);.      memset
2fb0: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
2fc0: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
2fd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a  ;.    }.    p->z
2fe0: 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = zNew;.  }.  i
2ff0: 66 28 20 64 69 76 69 64 65 72 20 26 26 20 70 2d  f( divider && p-
3000: 3e 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20  >nUsed>0 ){.    
3010: 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  p->z[p->nUsed++]
3020: 20 3d 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a   = divider;.  }.
3030: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70    memcpy(&p->z[p
3040: 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31  ->nUsed], z, n+1
3050: 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d  );.  p->nUsed +=
3060: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   n;.}../*.** Inv
3070: 6f 6b 65 64 20 66 6f 72 20 65 61 63 68 20 63 61  oked for each ca
3080: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69  llback from sqli
3090: 74 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73  te3ExecFunc.*/.s
30a0: 74 61 74 69 63 20 69 6e 74 20 65 78 65 63 46 75  tatic int execFu
30b0: 6e 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  ncCallback(void 
30c0: 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63  *pData, int argc
30d0: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
30e0: 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a  har **NotUsed){.
30f0: 20 20 73 74 72 75 63 74 20 64 73 74 72 20 2a 70    struct dstr *p
3100: 20 3d 20 28 73 74 72 75 63 74 20 64 73 74 72 2a   = (struct dstr*
3110: 29 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b  )pData;.  int i;
3120: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
3130: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  gc; i++){.    if
3140: 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a  ( argv[i]==0 ){.
3150: 20 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64        dstrAppend
3160: 28 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29  (p, "NULL", ' ')
3170: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3180: 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c     dstrAppend(p,
3190: 20 61 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a   argv[i], ' ');.
31a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
31b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
31c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
31d0: 20 74 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78   the x_sqlite_ex
31e0: 65 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ec() function.  
31f0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61  This function ta
3200: 6b 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  kes.** a single 
3210: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74  argument and att
3220: 65 6d 70 74 73 20 74 6f 20 65 78 65 63 75 74 65  empts to execute
3230: 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61   that argument a
3240: 73 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54  s SQL code..** T
3250: 68 69 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61  his is illegal a
3260: 6e 64 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68  nd should set th
3270: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  e SQLITE_MISUSE 
3280: 66 6c 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61  flag on the data
3290: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34  base..**.** 2004
32a0: 2d 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76  -Jan-07:  We hav
32b0: 65 20 63 68 61 6e 67 65 64 20 74 68 69 73 20 74  e changed this t
32c0: 6f 20 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20  o make it legal 
32d0: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  to call sqlite3_
32e0: 65 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77  exec().** from w
32f0: 69 74 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e  ithin a function
3300: 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20   call.  .** .** 
3310: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d  This routine sim
3320: 75 6c 61 74 65 73 20 74 68 65 20 65 66 66 65 63  ulates the effec
3330: 74 20 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20  t of having two 
3340: 74 68 72 65 61 64 73 20 61 74 74 65 6d 70 74 20  threads attempt 
3350: 74 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61  to.** use the sa
3360: 6d 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  me database at t
3370: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f  he same time..*/
3380: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
3390: 69 74 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20  ite3ExecFunc(.  
33a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
33b0: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
33c0: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
33d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
33e0: 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72  ){.  struct dstr
33f0: 20 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c   x;.  memset(&x,
3400: 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
3410: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28    sqlite3_exec((
3420: 73 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33  sqlite3*)sqlite3
3430: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
3440: 78 74 29 2c 0a 20 20 20 20 20 20 73 71 6c 69 74  xt),.      sqlit
3450: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
3460: 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20 65 78  gv[0]),.      ex
3470: 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 2c 20  ecFuncCallback, 
3480: 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  &x, 0);.  sqlite
3490: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
34a0: 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55  ntext, x.z, x.nU
34b0: 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  sed, SQLITE_TRAN
34c0: 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
34d0: 46 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a  Free(x.z);.}../*
34e0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
34f0: 74 65 5f 74 65 73 74 5f 63 72 65 61 74 65 5f 66  te_test_create_f
3500: 75 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a  unction DB.**.**
3510: 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65   Call the sqlite
3520: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
3530: 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76  n API on the giv
3540: 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f  en database in o
3550: 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74  rder.** to creat
3560: 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  e a function nam
3570: 65 64 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e  ed "x_coalesce".
3580: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
3590: 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74 68  does the same th
35a0: 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 63  ing.** as the "c
35b0: 6f 61 6c 65 73 63 65 22 20 66 75 6e 63 74 69 6f  oalesce" functio
35c0: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
35d0: 6e 20 61 6c 73 6f 20 72 65 67 69 73 74 65 72 73  n also registers
35e0: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
35f0: 0a 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c  .** named "x_sql
3600: 69 74 65 5f 65 78 65 63 22 20 74 68 61 74 20 69  ite_exec" that i
3610: 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65  nvokes sqlite3_e
3620: 78 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67  xec().  Invoking
3630: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
3640: 2a 2a 20 69 6e 20 74 68 69 73 20 77 61 79 20 69  ** in this way i
3650: 73 20 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73  s illegal recurs
3660: 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72  ion and should r
3670: 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d  aise an SQLITE_M
3680: 49 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20  ISUSE error..** 
3690: 54 68 65 20 65 66 66 65 63 74 20 69 73 20 73 69  The effect is si
36a0: 6d 69 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20  milar to trying 
36b0: 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  to use the same 
36c0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
36d0: 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20  ion from.** two 
36e0: 74 68 72 65 61 64 73 20 61 74 20 74 68 65 20 73  threads at the s
36f0: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
3700: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74  The original mot
3710: 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ivation for this
3720: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20   routine was to 
3730: 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20  be able to call 
3740: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  the.** sqlite3_c
3750: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66  reate_function f
3760: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20  unction while a 
3770: 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67  query is in prog
3780: 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  ress in order.**
3790: 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c   to test the SQL
37a0: 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63  ITE_MISUSE detec
37b0: 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73  tion logic..*/.s
37c0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
37d0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
37e0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
37f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3800: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3810: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3820: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3830: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3840: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
3850: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3860: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
3870: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
3880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
3890: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
38a0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
38b0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
38c0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
38d0: 65 20 2a 70 56 61 6c 3b 0a 20 20 65 78 74 65 72  e *pVal;.  exter
38e0: 6e 20 76 6f 69 64 20 4d 64 35 5f 52 65 67 69 73  n void Md5_Regis
38f0: 74 65 72 28 73 71 6c 69 74 65 33 2a 29 3b 0a 0a  ter(sqlite3*);..
3900: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
3910: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
3920: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
3930: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
3940: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
3950: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49  [0],.       " FI
3960: 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20  LENAME\"", 0);. 
3970: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3980: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
3990: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
39a0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
39b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
39c0: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
39d0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
39e0: 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 61 6c  tion(db, "x_coal
39f0: 65 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54  esce", -1, SQLIT
3a00: 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20  E_ANY, 0, .     
3a10: 20 20 20 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30     ifnullFunc, 0
3a20: 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 55 73 65 20  , 0);..  /* Use 
3a30: 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61  the sqlite3_crea
3a40: 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29 20  te_function16() 
3a50: 41 50 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79  API here. Mainly
3a60: 20 66 6f 72 20 66 75 6e 2c 20 62 75 74 20 61 6c   for fun, but al
3a70: 73 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  so .  ** because
3a80: 20 69 74 20 69 73 20 6e 6f 74 20 74 65 73 74 65   it is not teste
3a90: 64 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65 2e  d anywhere else.
3aa0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
3ab0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
3ac0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
3ad0: 75 65 4e 65 77 28 29 3b 0a 20 20 20 20 73 71 6c  ueNew();.    sql
3ae0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
3af0: 70 56 61 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c  pVal, -1, "x_sql
3b00: 69 74 65 5f 65 78 65 63 22 2c 20 53 51 4c 49 54  ite_exec", SQLIT
3b10: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
3b20: 54 41 54 49 43 29 3b 0a 20 20 20 20 72 63 20 3d  TATIC);.    rc =
3b30: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
3b40: 66 75 6e 63 74 69 6f 6e 31 36 28 64 62 2c 20 0a  function16(db, .
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
3b60: 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
3b70: 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Val, SQLITE_UTF1
3b80: 36 4e 41 54 49 56 45 29 2c 0a 20 20 20 20 20 20  6NATIVE),.      
3b90: 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49 54          1, SQLIT
3ba0: 45 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71 6c  E_UTF16, db, sql
3bb0: 69 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30 2c  ite3ExecFunc, 0,
3bc0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
3bd0: 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
3be0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
3bf0: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
3c00: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
3c10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3c20: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3c30: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  K;.}../*.** Rout
3c40: 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  ines to implemen
3c50: 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28 29 20  t the x_count() 
3c60: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
3c70: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
3c80: 74 72 75 63 74 20 43 6f 75 6e 74 43 74 78 20 43  truct CountCtx C
3c90: 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74 20  ountCtx;.struct 
3ca0: 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74  CountCtx {.  int
3cb0: 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f   n;.};.static vo
3cc0: 69 64 20 63 6f 75 6e 74 53 74 65 70 28 73 71 6c  id countStep(sql
3cd0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
3ce0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
3cf0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3d00: 2a 61 72 67 76 29 7b 0a 20 20 43 6f 75 6e 74 43  *argv){.  CountC
3d10: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
3d20: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
3d30: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
3d40: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
3d50: 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53  f( (argc==0 || S
3d60: 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69  QLITE_NULL!=sqli
3d70: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
3d80: 72 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20 29  rgv[0]) ) && p )
3d90: 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20  {.    p->n++;.  
3da0: 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76 6f  }.}   .static vo
3db0: 69 64 20 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65  id countFinalize
3dc0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
3dd0: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 43 6f   *context){.  Co
3de0: 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  untCtx *p;.  p =
3df0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
3e00: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
3e10: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  xt, sizeof(*p));
3e20: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
3e30: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
3e40: 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 7d 0a   ? p->n : 0);.}.
3e50: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3e60: 71 6c 69 74 65 5f 74 65 73 74 5f 63 72 65 61 74  qlite_test_creat
3e70: 65 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a 2a  e_aggregate DB.*
3e80: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
3e90: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
3ea0: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
3eb0: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
3ec0: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
3ed0: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
3ee0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22   named "x_count"
3ef0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
3f00: 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74   does the same t
3f10: 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22  hing.** as the "
3f20: 6d 64 35 73 75 6d 22 20 66 75 6e 63 74 69 6f 6e  md5sum" function
3f30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
3f40: 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20  inal motivation 
3f50: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
3f60: 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20   was to be able 
3f70: 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73  to call the.** s
3f80: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67  qlite3_create_ag
3f90: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
3fa0: 20 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69   while a query i
3fb0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e  s in progress in
3fc0: 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73   order.** to tes
3fd0: 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53  t the SQLITE_MIS
3fe0: 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f  USE detection lo
3ff0: 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  gic..*/.static i
4000: 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 61  nt test_create_a
4010: 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69 64  ggregate(.  void
4020: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
4030: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4040: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
4050: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
4060: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
4070: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
4080: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
4090: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
40a0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
40b0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
40c0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
40d0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
40e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
40f0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
4100: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
4110: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4120: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
4130: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
4140: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
4150: 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41  .       " FILENA
4160: 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ME\"", 0);.    r
4170: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4180: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
4190: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
41a0: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
41b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
41c0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
41d0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
41e0: 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20  (db, "x_count", 
41f0: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
4200: 30 2c 20 30 2c 0a 20 20 20 20 20 20 63 6f 75 6e  0, 0,.      coun
4210: 74 53 74 65 70 2c 63 6f 75 6e 74 46 69 6e 61 6c  tStep,countFinal
4220: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ize);.  if( rc==
4230: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4240: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
4250: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f  function(db, "x_
4260: 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54  count", 1, SQLIT
4270: 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20  E_UTF8, 0, 0,.  
4280: 20 20 20 20 20 20 63 6f 75 6e 74 53 74 65 70 2c        countStep,
4290: 63 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a  countFinalize);.
42a0: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
42b0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
42c0: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
42d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
42e0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
42f0: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  ;.}..../*.** Usa
4300: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
4310: 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41 54 20  intf_int FORMAT 
4320: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
4330: 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61  INTEGER.**.** Ca
4340: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
4350: 74 68 72 65 65 20 69 6e 74 65 67 65 72 20 61 72  three integer ar
4360: 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  guments.*/.stati
4370: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
4380: 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69  rintf_int(.  voi
4390: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
43a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
43b0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
43c0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
43d0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
43e0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
43f0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
4400: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
4410: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
4420: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4430: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4440: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4450: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
4460: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
4470: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
4480: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
4490: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
44a0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
44b0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
44c0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
44d0: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
44e0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
44f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4500: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
4510: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
4520: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
4530: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  , argv[i], &a[i-
4540: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
4550: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
4560: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
4570: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
4580: 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20   a[1], a[2]);.  
4590: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
45a0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
45b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
45c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
45d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
45e0: 7a 4e 75 6d 20 72 65 70 72 65 73 65 6e 74 73 20  zNum represents 
45f0: 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  an integer that 
4600: 77 69 6c 6c 20 66 69 74 20 69 6e 20 36 34 2d 62  will fit in 64-b
4610: 69 74 73 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a  its, then set.**
4620: 20 2a 70 56 61 6c 75 65 20 74 6f 20 74 68 61 74   *pValue to that
4630: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74   integer and ret
4640: 75 72 6e 20 74 72 75 65 2e 20 20 4f 74 68 65 72  urn true.  Other
4650: 77 69 73 65 20 72 65 74 75 72 6e 20 66 61 6c 73  wise return fals
4660: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4670: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 36 34   sqlite3GetInt64
4680: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 75  (const char *zNu
4690: 6d 2c 20 69 36 34 20 2a 70 56 61 6c 75 65 29 7b  m, i64 *pValue){
46a0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
46b0: 74 73 49 6e 36 34 42 69 74 73 28 7a 4e 75 6d 29  tsIn64Bits(zNum)
46c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 61   ){.    sqlite3a
46d0: 74 6f 69 36 34 28 7a 4e 75 6d 2c 20 70 56 61 6c  toi64(zNum, pVal
46e0: 75 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ue);.    return 
46f0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4700: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  0;.}../*.** Usag
4710: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
4720: 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41 54  ntf_int64 FORMAT
4730: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
4740: 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43   INTEGER.**.** C
4750: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
4760: 20 74 68 72 65 65 20 36 34 2d 62 69 74 20 69 6e   three 64-bit in
4770: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 0a  teger arguments.
4780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
4790: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
47a0: 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  t64(.  void *Not
47b0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
47c0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
47d0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
47e0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
47f0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
4800: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
4810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4820: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4830: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
4840: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
4850: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
4860: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
4870: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 5f  int i;.  sqlite_
4880: 69 6e 74 36 34 20 61 5b 33 5d 3b 0a 20 20 63 68  int64 a[3];.  ch
4890: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
48a0: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
48b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
48c0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
48d0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
48e0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
48f0: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
4900: 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a  INT INT\"", 0);.
4910: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4920: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
4930: 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=2; i<5; i++){.
4940: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
4950: 47 65 74 49 6e 74 36 34 28 61 72 67 76 5b 69 5d  GetInt64(argv[i]
4960: 2c 20 26 61 5b 69 2d 32 5d 29 20 29 7b 0a 20 20  , &a[i-2]) ){.  
4970: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4980: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 72  sult(interp, "ar
4990: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 20  gument is not a 
49a0: 76 61 6c 69 64 20 36 34 2d 62 69 74 20 69 6e 74  valid 64-bit int
49b0: 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20  eger", 0);.     
49c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
49d0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  R;.    }.  }.  z
49e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
49f0: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
4a00: 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20  , a[1], a[2]);. 
4a10: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4a20: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
4a30: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
4a40: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
4a50: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
4a60: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
4a70: 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54  rintf_str FORMAT
4a80: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
4a90: 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61   STRING.**.** Ca
4aa0: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
4ab0: 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75  two integer argu
4ac0: 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74  ments and one st
4ad0: 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f  ring argument.*/
4ae0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4af0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28  te3_mprintf_str(
4b00: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
4b10: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4b20: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
4b30: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
4b40: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
4b50: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
4b60: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
4b70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b80: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
4b90: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
4ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
4bb0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
4bc0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
4bd0: 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20  a[3], i;.  char 
4be0: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 34  *z;.  if( argc<4
4bf0: 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20 20   || argc>5 ){.  
4c00: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4c10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
4c20: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
4c30: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
4c40: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
4c50: 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e  T INT INT ?STRIN
4c60: 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  G?\"", 0);.    r
4c70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4c80: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
4c90: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
4ca0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
4cb0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
4cc0: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
4cd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4ce0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
4cf0: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
4d00: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e  [0], a[1], argc>
4d10: 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55  4 ? argv[4] : NU
4d20: 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  LL);.  Tcl_Appen
4d30: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4d40: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
4d50: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
4d60: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
4d70: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
4d80: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20  te3_mprintf_str 
4d90: 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49  FORMAT INTEGER I
4da0: 4e 54 45 47 45 52 20 44 4f 55 42 4c 45 0a 2a 2a  NTEGER DOUBLE.**
4db0: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
4dc0: 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65   with two intege
4dd0: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  r arguments and 
4de0: 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  one double argum
4df0: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ent.*/.static in
4e00: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
4e10: 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64  f_double(.  void
4e20: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
4e30: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
4e40: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
4e50: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
4e60: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
4e70: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
4e80: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
4e90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
4ea0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
4eb0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
4ec0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
4ed0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
4ee0: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
4ef0: 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20  ;.  double r;.  
4f00: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
4f10: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
4f20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4f30: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4f40: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
4f50: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
4f60: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e       " FORMAT IN
4f70: 54 20 49 4e 54 20 53 54 52 49 4e 47 5c 22 22 2c  T INT STRING\"",
4f80: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4f90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4fa0: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
4fb0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
4fc0: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
4fd0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
4fe0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4ff0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
5000: 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e  Tcl_GetDouble(in
5010: 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26  terp, argv[4], &
5020: 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  r) ) return TCL_
5030: 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c  ERROR;.  z = sql
5040: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
5050: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
5060: 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  , r);.  Tcl_Appe
5070: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5080: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
5090: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
50a0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
50b0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
50c0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
50d0: 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44   FORMAT DOUBLE D
50e0: 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  OUBLE.**.** Call
50f0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
5100: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
5110: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
5120: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
5130: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
5140: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
5150: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
5160: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
5170: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
5180: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
5190: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
51a0: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
51b0: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
51c0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
51d0: 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20 76  intf_scaled(.  v
51e0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
51f0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5200: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
5210: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
5220: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
5230: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
5240: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
5250: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5260: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
5270: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
5280: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
5290: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
52a0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
52b0: 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20   double r[2];.  
52c0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
52d0: 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  rgc!=4 ){.    Tc
52e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
52f0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
5300: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
5310: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
5320: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44 4f       " FORMAT DO
5330: 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20  UBLE DOUBLE\"", 
5340: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
5350: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
5360: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
5370: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
5380: 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70  GetDouble(interp
5390: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d  , argv[i], &r[i-
53a0: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
53b0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
53c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
53d0: 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a  f(argv[1], r[0]*
53e0: 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  r[1]);.  Tcl_App
53f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5400: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
5410: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
5420: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5430: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
5440: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
5450: 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54 52  ronly FORMAT STR
5460: 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  ING.**.** Call m
5470: 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69  printf with a si
5480: 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75  ngle double argu
5490: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68  ment which is th
54a0: 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65  e product of the
54b0: 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  .** two argument
54c0: 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20  s given above.  
54d0: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
54e0: 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f  generate overflo
54f0: 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a  w and underflow.
5500: 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65  ** doubles to te
5510: 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65  st that they are
5520: 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65   converted prope
5530: 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rly..*/.static i
5540: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
5550: 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f  tf_stronly(.  vo
5560: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
5570: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
5580: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
5590: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
55a0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
55b0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
55c0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
55d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
55e0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
55f0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
5600: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
5610: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
5620: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
5630: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
5640: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
5650: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
5660: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
5670: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
5680: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
5690: 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20  RMAT STRING\"", 
56a0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
56b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
56c0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
56d0: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67  ntf(argv[1], arg
56e0: 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
56f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5700: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
5710: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
5720: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5730: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
5740: 69 74 65 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 20  ite_malloc_fail 
5750: 4e 0a 2a 2a 0a 2a 2a 20 52 69 67 20 73 71 6c 69  N.**.** Rig sqli
5760: 74 65 4d 61 6c 6c 6f 63 28 29 20 74 6f 20 66 61  teMalloc() to fa
5770: 69 6c 20 6f 6e 20 74 68 65 20 4e 2d 74 68 20 63  il on the N-th c
5780: 61 6c 6c 2e 20 20 54 75 72 6e 20 6f 66 66 20 74  all.  Turn off t
5790: 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a  his mechanism.**
57a0: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 73   and reset the s
57b0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
57c0: 69 6c 65 64 20 76 61 72 69 61 62 6c 65 20 69 73  iled variable is
57d0: 20 4e 3d 3d 30 2e 0a 2a 2f 0a 23 69 66 64 65 66   N==0..*/.#ifdef
57e0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
57f0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
5800: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 28 0a 20 20 76  malloc_fail(.  v
5810: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
5820: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5830: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
5840: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
5850: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
5860: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
5870: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
5880: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5890: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
58a0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
58b0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
58c0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
58d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  */.){.  int n;. 
58e0: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
58f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
5900: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
5910: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
5920: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
5930: 30 5d 2c 20 22 20 4e 5c 22 22 2c 20 30 29 3b 0a  0], " N\"", 0);.
5940: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
5950: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
5960: 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
5970: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20  p, argv[1], &n) 
5980: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
5990: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 4d  OR;.  sqlite3_iM
59a0: 61 6c 6c 6f 63 46 61 69 6c 20 3d 20 6e 3b 0a 20  allocFail = n;. 
59b0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f   sqlite3_malloc_
59c0: 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 72 65  failed = 0;.  re
59d0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
59e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  endif../*.** Usa
59f0: 67 65 3a 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  ge: sqlite_mallo
5a00: 63 5f 73 74 61 74 0a 2a 2a 0a 2a 2a 20 52 65 74  c_stat.**.** Ret
5a10: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
5a20: 66 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f  f prior calls to
5a30: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
5a40: 61 6e 64 20 73 71 6c 69 74 65 46 72 65 65 28 29  and sqliteFree()
5a50: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
5a60: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
5a70: 69 6e 74 20 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  int sqlite_mallo
5a80: 63 5f 73 74 61 74 28 0a 20 20 76 6f 69 64 20 2a  c_stat(.  void *
5a90: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
5aa0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
5ab0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
5ac0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
5ad0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
5ae0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
5af0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5b00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
5b10: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
5b20: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
5b30: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
5b40: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
5b50: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30  .  char zBuf[200
5b60: 5d 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  ];.  sprintf(zBu
5b70: 66 2c 20 22 25 64 20 25 64 20 25 64 22 2c 20 73  f, "%d %d %d", s
5b80: 71 6c 69 74 65 33 5f 6e 4d 61 6c 6c 6f 63 2c 20  qlite3_nMalloc, 
5b90: 73 71 6c 69 74 65 33 5f 6e 46 72 65 65 2c 20 73  sqlite3_nFree, s
5ba0: 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
5bb0: 69 6c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  il);.  Tcl_Appen
5bc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5bd0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
5be0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
5bf0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
5c00: 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a  :  sqlite_abort.
5c10: 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  **.** Shutdown t
5c20: 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64  he process immed
5c30: 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73  iately.  This is
5c40: 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75   not a clean shu
5c50: 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63  tdown..** This c
5c60: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
5c70: 6f 20 74 65 73 74 20 74 68 65 20 72 65 63 6f 76  o test the recov
5c80: 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64  erability of a d
5c90: 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68  atabase in.** th
5ca0: 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f  e event of a pro
5cb0: 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73  gram crash..*/.s
5cc0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
5cd0: 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a  _abort(.  void *
5ce0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
5cf0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
5d00: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
5d10: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
5d20: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
5d30: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
5d40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5d50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
5d60: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
5d70: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
5d80: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
5d90: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
5da0: 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74 65 72  .  assert( inter
5db0: 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68 69  p==0 );   /* Thi
5dc0: 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  s will always fa
5dd0: 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  il */.  return T
5de0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
5df0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
5e00: 75 74 69 6e 65 20 69 73 20 61 20 75 73 65 72 2d  utine is a user-
5e10: 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63  defined SQL func
5e20: 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70 6f  tion whose purpo
5e30: 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73 74  se.** is to test
5e40: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f   the sqlite_set_
5e50: 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f  result() API..*/
5e60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
5e70: 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  tFunc(sqlite3_co
5e80: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
5e90: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
5ea0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
5eb0: 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e 3d  .  while( argc>=
5ec0: 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  2 ){.    const c
5ed0: 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 73 71 6c  har *zArg0 = sql
5ee0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5ef0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
5f00: 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20 20 20  ( zArg0 ){.     
5f10: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
5f20: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20 22 69  trICmp(zArg0, "i
5f30: 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nt") ){.        
5f40: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
5f50: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  nt(context, sqli
5f60: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
5f70: 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d  gv[1]));.      }
5f80: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
5f90: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 69  StrICmp(zArg0,"i
5fa0: 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20  nt64")==0 ){.   
5fb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
5fc0: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
5fd0: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
5fe0: 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 29  _int64(argv[1]))
5ff0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6000: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6010: 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67 22 29  (zArg0,"string")
6020: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
6030: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6040: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  xt(context, sqli
6050: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6060: 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20  rgv[1]), -1,.   
6070: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6080: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
6090: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
60a0: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
60b0: 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b  ,"double")==0 ){
60c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
60d0: 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63  _result_double(c
60e0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
60f0: 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67  value_double(arg
6100: 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65  v[1]));.      }e
6110: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
6120: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75  trICmp(zArg0,"nu
6130: 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ll")==0 ){.     
6140: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6150: 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b  t_null(context);
6160: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6170: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6180: 7a 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d  zArg0,"value")==
6190: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
61a0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
61b0: 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b  e(context, argv[
61c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
61d0: 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20  t(argv[1])]);.  
61e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
61f0: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
6200: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
6210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f  else{.      goto
6220: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
6230: 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b  }.    argc -= 2;
6240: 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a  .    argv += 2;.
6250: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65    }.  return;..e
6260: 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  rror_out:.  sqli
6270: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
6280: 28 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20  (context,"first 
6290: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
62a0: 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20  be one of: ".   
62b0: 20 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74     "int int64 st
62c0: 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c  ring double null
62d0: 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a   value", -1);.}.
62e0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
62f0: 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f  sqlite_register_
6300: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44  test_function  D
6310: 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65  B  NAME.**.** Re
6320: 67 69 73 74 65 72 20 74 68 65 20 74 65 73 74 20  gister the test 
6330: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20  SQL function on 
6340: 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20  the database DB 
6350: 75 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e  under the name N
6360: 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  AME..*/.static i
6370: 6e 74 20 74 65 73 74 5f 72 65 67 69 73 74 65 72  nt test_register
6380: 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  _func(.  void *N
6390: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
63a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
63b0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
63c0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
63d0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
63e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6400: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
6410: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
6420: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
6430: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
6440: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
6450: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
6460: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61   int rc;.  if( a
6470: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
6480: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
6490: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
64a0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
64b0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
64c0: 20 20 20 20 20 20 22 20 44 42 20 46 55 4e 43 54        " DB FUNCT
64d0: 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20  ION-NAME", 0);. 
64e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
64f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
6500: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
6510: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
6520: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
6530: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
6540: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6550: 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d  tion(db, argv[2]
6560: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
6570: 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73  8, 0, .      tes
6580: 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  tFunc, 0, 0);.  
6590: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
65a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
65b0: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
65c0: 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
65d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
65e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
65f0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
6600: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
6610: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
6620: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
6630: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
6640: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
6650: 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54  3_finalize  STMT
6660: 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65   .**.** Finalize
6670: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e   a statement han
6680: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
6690: 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65  nt test_finalize
66a0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
66b0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
66c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
66d0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
66e0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
66f0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
6700: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
6710: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
6720: 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  db;..  if( objc!
6730: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
6740: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6750: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
6760: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
6770: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
6780: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
6790: 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54  jv[0], 0), " <ST
67a0: 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  MT>", 0);.    re
67b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
67c0: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
67d0: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
67e0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
67f0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
6800: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
6810: 52 52 4f 52 3b 0a 0a 20 20 64 62 20 3d 20 53 74  RROR;..  db = St
6820: 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20  mtToDb(pStmt);. 
6830: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
6840: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
6850: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
6860: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65  nterp, (char *)e
6870: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
6880: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  L_STATIC);.  if(
6890: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
68a0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
68b0: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
68c0: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
68d0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
68e0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
68f0: 33 5f 72 65 73 65 74 20 20 53 54 4d 54 20 0a 2a  3_reset  STMT .*
6900: 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20  *.** Finalize a 
6910: 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65  statement handle
6920: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6930: 74 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f  test_reset(.  vo
6940: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
6950: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
6960: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
6970: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
6980: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
6990: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
69a0: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tmt;.  int rc;..
69b0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
69c0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
69d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
69e0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
69f0: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
6a00: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
6a10: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
6a20: 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c  , 0), " <STMT>",
6a30: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
6a40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
6a50: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
6a60: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
6a70: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
6a80: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
6a90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6aa0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6ab0: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
6ac0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
6ad0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
6ae0: 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
6af0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
6b00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
6b10: 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
6b20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
6b30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
6b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
6b50: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
6b60: 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
6b70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
6b80: 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
6b90: 68 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  he database by t
6ba0: 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65  he last SQL.** e
6bb0: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  xecution..*/.sta
6bc0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 68 61  tic int test_cha
6bd0: 6e 67 65 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  nges(.  void * c
6be0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
6bf0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6c00: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
6c10: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
6c20: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
6c30: 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a  3 *db;.  if( obj
6c40: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
6c50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
6c60: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
6c70: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
6c80: 22 2c 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ",.       Tcl_Ge
6c90: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
6ca0: 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
6cb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6cc0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
6cd0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
6ce0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
6cf0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
6d00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6d10: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
6d20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
6d30: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
6d40: 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29  te3_changes(db))
6d50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
6d60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
6d70: 73 20 69 73 20 74 68 65 20 22 73 74 61 74 69 63  s is the "static
6d80: 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20 74 68 61  _bind_value" tha
6d90: 74 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  t variables are 
6da0: 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a  bound to when.**
6db0: 20 74 68 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e   the FLAG option
6dc0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   of sqlite3_bind
6dd0: 20 69 73 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a   is "static".*/.
6de0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c  static char *sql
6df0: 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
6e00: 76 61 6c 75 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  value = 0;../*.*
6e10: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
6e20: 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58 20  3_bind  VM  IDX 
6e30: 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a   VALUE  FLAGS.**
6e40: 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61 6c  .** Sets the val
6e50: 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74 68  ue of the IDX-th
6e60: 20 6f 63 63 75 72 61 6e 63 65 20 6f 66 20 22 3f   occurance of "?
6e70: 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  " in the origina
6e80: 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e  l SQL.** string.
6e90: 20 20 56 41 4c 55 45 20 69 73 20 74 68 65 20 6e    VALUE is the n
6ea0: 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46 4c  ew value.  If FL
6eb0: 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e  AGS=="null" then
6ec0: 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e   VALUE is.** ign
6ed0: 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  ored and the val
6ee0: 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
6ef0: 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 73  L.  If FLAGS=="s
6f00: 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74  tatic" then.** t
6f10: 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
6f20: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  to the value of 
6f30: 61 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c  a static variabl
6f40: 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69  e named.** "sqli
6f50: 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
6f60: 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47 53  alue".  If FLAGS
6f70: 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20  =="normal" then 
6f80: 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65  a copy.** of the
6f90: 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e 0a   VALUE is made..
6fa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
6fb0: 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20  st_bind(.  void 
6fc0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
6fd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
6fe0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
6ff0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
7000: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
7010: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
7020: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
7030: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
7040: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
7050: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
7060: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
7070: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
7080: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
7090: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
70a0: 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
70b0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
70c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
70d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
70e0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
70f0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
7100: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 56 4d 20  ], .       " VM 
7110: 49 44 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c  IDX VALUE (null|
7120: 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22  static|normal)\"
7130: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
7140: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
7150: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
7160: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
7170: 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20 29  gv[1], &pStmt) )
7180: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7190: 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
71a0: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
71b0: 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
71c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
71d0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
71e0: 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29  [4],"null")==0 )
71f0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7200: 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
7210: 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73  mt, idx);.  }els
7220: 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
7230: 76 5b 34 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d  v[4],"static")==
7240: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
7250: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
7260: 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69  pStmt, idx, sqli
7270: 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
7280: 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  alue, -1, 0);.  
7290: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
72a0: 28 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c  (argv[4],"normal
72b0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
72c0: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
72d0: 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ext(pStmt, idx, 
72e0: 61 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c  argv[3], -1, SQL
72f0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
7300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
7310: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7320: 74 65 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d  terp, "4th argum
7330: 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  ent should be ".
7340: 20 20 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c          "\"null\
7350: 22 20 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20  " or \"static\" 
7360: 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20  or \"normal\"", 
7370: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
7380: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
7390: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
73a0: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
73b0: 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
73c0: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
73d0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
73e0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
73f0: 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e  f[50];.    sprin
7400: 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22  tf(zBuf, "(%d) "
7410: 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
7420: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7430: 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
7440: 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
7450: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7460: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
7470: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
7480: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64  /*.** Usage: add
7490: 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64  _test_collate <d
74a0: 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75  b ptr> <utf8> <u
74b0: 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
74c0: 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  >.**.** This fun
74d0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
74e0: 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
74f0: 65 20 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f  e selects the co
7500: 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a  rrect collation.
7510: 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61 6c 6c  ** sequence call
7520: 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70  back when multip
7530: 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72  le versions (for
7540: 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20   different text 
7550: 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72  encodings).** ar
7560: 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  e available..**.
7570: 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
7580: 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
7590: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
75a0: 73 65 71 75 65 6e 63 65 20 22 74 65 73 74 5f 63  sequence "test_c
75b0: 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68 20  ollate".** with 
75c0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
75d0: 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64  <db>. The second
75e0: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
75f0: 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65  e a list of thre
7600: 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  e.** boolean val
7610: 75 65 73 2e 20 49 66 20 74 68 65 20 66 69 72 73  ues. If the firs
7620: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
7630: 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73  a version of tes
7640: 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20  t_collate is.** 
7650: 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55  registered for U
7660: 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73 65 63  TF-8, if the sec
7670: 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61 20 76  ond is true, a v
7680: 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74  ersion is regist
7690: 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d  ered for.** UTF-
76a0: 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74 68 69  16le, if the thi
76b0: 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 55 54  rd is true, a UT
76c0: 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69  F-16be version i
76d0: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20  s available..** 
76e0: 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e  Previous version
76f0: 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74  s of test_collat
7700: 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a  e are deleted..*
7710: 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
7720: 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65 73 74  on sequence test
7730: 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c  _collate is impl
7740: 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69  emented by calli
7750: 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  ng the.** follow
7760: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a  ing TCL script:.
7770: 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f  **.**   "test_co
7780: 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73  llate <enc> <lhs
7790: 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54  > <rhs>".**.** T
77a0: 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68  he <lhs> and <rh
77b0: 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f 20 76  s> are the two v
77c0: 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f 6d 70  alues being comp
77d0: 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e  ared, encoded in
77e0: 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c   UTF-8..** The <
77f0: 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72 20 69  enc> parameter i
7800: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f  s the encoding o
7810: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
7820: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
7830: 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 65 64   SQLite selected
7840: 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54 43   to call. The TC
7850: 4c 20 74 65 73 74 20 73 63 72 69 70 74 20 69 6d  L test script im
7860: 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20  plements the.** 
7870: 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70  "test_collate" p
7880: 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  roc..**.** Note 
7890: 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c 20 6f  that this will o
78a0: 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e  nly work with on
78b0: 65 20 69 6e 74 65 70 72 65 74 65 72 20 61 74 20  e intepreter at 
78c0: 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65 0a 2a  a time, as the.*
78d0: 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74 65 72  * interp pointer
78e0: 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65 76 61   to use when eva
78f0: 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43 4c 20  luating the TCL 
7900: 73 63 72 69 70 74 20 69 73 20 73 74 6f 72 65 64  script is stored
7910: 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c 6c   in.** pTestColl
7920: 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74  ateInterp..*/.st
7930: 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 2a  atic Tcl_Interp*
7940: 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
7950: 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  erp;.static int 
7960: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
7970: 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  c(.  void *pCtx,
7980: 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73   .  int nA, cons
7990: 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e  t void *zA,.  in
79a0: 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64  t nB, const void
79b0: 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e   *zB.){.  Tcl_In
79c0: 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73 74 43  terp *i = pTestC
79d0: 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20 20  ollateInterp;.  
79e0: 69 6e 74 20 65 6e 63 69 6e 20 3d 20 28 69 6e 74  int encin = (int
79f0: 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 72 65 73  )pCtx;.  int res
7a00: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ;..  sqlite3_val
7a10: 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f  ue *pVal;.  Tcl_
7a20: 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d  Obj *pX;..  pX =
7a30: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
7a40: 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  j("test_collate"
7a50: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
7a60: 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a  rRefCount(pX);..
7a70: 20 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20    switch( encin 
7a80: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
7a90: 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54  TE_UTF8:.      T
7aa0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
7ab0: 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
7ac0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
7ad0: 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20  TF-8",-1));.    
7ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7af0: 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  e SQLITE_UTF16LE
7b00: 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
7b10: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
7b20: 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
7b30: 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45  ingObj("UTF-16LE
7b40: 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72  ",-1));.      br
7b50: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
7b60: 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20  LITE_UTF16BE:.  
7b70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
7b80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
7b90: 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  X,Tcl_NewStringO
7ba0: 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31  bj("UTF-16BE",-1
7bb0: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
7bc0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
7bd0: 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
7be0: 20 7d 0a 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c   }..  pVal = sql
7bf0: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a  ite3ValueNew();.
7c00: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
7c10: 74 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a  tStr(pVal, nA, z
7c20: 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45  A, encin, SQLITE
7c30: 5f 53 54 41 54 49 43 29 3b 0a 20 20 54 63 6c 5f  _STATIC);.  Tcl_
7c40: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
7c50: 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65  ment(i,pX,Tcl_Ne
7c60: 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
7c70: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
7c80: 61 6c 29 2c 2d 31 29 29 3b 0a 20 20 73 71 6c 69  al),-1));.  sqli
7c90: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
7ca0: 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63  Val, nB, zB, enc
7cb0: 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  in, SQLITE_STATI
7cc0: 43 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  C);.  Tcl_ListOb
7cd0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
7ce0: 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,pX,Tcl_NewStrin
7cf0: 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 76 61 6c  gObj(sqlite3_val
7d00: 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d 31  ue_text(pVal),-1
7d10: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  ));.  sqlite3Val
7d20: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
7d30: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
7d40: 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
7d50: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
7d60: 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  ;.  Tcl_GetIntFr
7d70: 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65 74  omObj(i, Tcl_Get
7d80: 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c 20 26 72  ObjResult(i), &r
7d90: 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  es);.  return re
7da0: 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  s;.}.static int 
7db0: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20  test_collate(.  
7dc0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
7dd0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
7de0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
7df0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
7e00: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
7e10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
7e20: 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69   int val;.  sqli
7e30: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
7e40: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
7e50: 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f  ( objc!=5 ) goto
7e60: 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65   bad_args;.  pTe
7e70: 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20  stCollateInterp 
7e80: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20  = interp;.  if( 
7e90: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
7ea0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
7eb0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
7ec0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
7ed0: 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c  RROR;..  if( TCL
7ee0: 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
7ef0: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
7f00: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
7f10: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
7f20: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
7f30: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
7f40: 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ation(db, "test_
7f50: 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45  collate", SQLITE
7f60: 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20  _UTF8, .        
7f70: 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45    (void *)SQLITE
7f80: 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f  _UTF8, val?test_
7f90: 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b  collate_func:0);
7fa0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7fb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
7fc0: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
7fd0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
7fe0: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
7ff0: 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
8000: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63 20  L_ERROR;.    rc 
8010: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
8020: 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
8030: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53  test_collate", S
8040: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a  QLITE_UTF16LE, .
8050: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
8060: 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36  d *)SQLITE_UTF16
8070: 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c  LE, val?test_col
8080: 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20  late_func:0);.  
8090: 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
80a0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
80b0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
80c0: 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [4], &val) ) ret
80d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
80e0: 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
80f0: 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a 20 20  e3ValueNew();.  
8100: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
8110: 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22  tStr(pVal, -1, "
8120: 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53  test_collate", S
8130: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
8140: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
8150: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
8160: 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20 73  ollation16(db, s
8170: 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
8180: 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
8190: 31 36 4e 41 54 49 56 45 29 2c 20 0a 20 20 20 20  16NATIVE), .    
81a0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
81b0: 31 36 42 45 2c 20 28 76 6f 69 64 20 2a 29 53 51  16BE, (void *)SQ
81c0: 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 76 61  LITE_UTF16BE, va
81d0: 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  l?test_collate_f
81e0: 75 6e 63 3a 30 29 3b 0a 20 20 20 20 73 71 6c 69  unc:0);.    sqli
81f0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
8200: 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  l);.  }.  if( sq
8210: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
8220: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
8230: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
8240: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
8250: 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
8260: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
8270: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8280: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8290: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
82a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
82b0: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
82c0: 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20  , " <DB> <utf8> 
82d0: 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
82e0: 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74 75  be>", 0);.  retu
82f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
8300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
8310: 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
8320: 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  _cb(.  void *pCt
8330: 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  x, .  sqlite3 *d
8340: 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  b,.  int eTextRe
8350: 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  p,.  const void 
8360: 2a 6e 6f 74 55 73 65 64 0a 29 7b 0a 20 20 69 6e  *notUsed.){.  in
8370: 74 20 65 6e 63 20 3d 20 64 62 2d 3e 65 6e 63 3b  t enc = db->enc;
8380: 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
8390: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 20  e_collation(.   
83a0: 20 20 20 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c     db, "test_col
83b0: 6c 61 74 65 22 2c 20 64 62 2d 3e 65 6e 63 2c 20  late", db->enc, 
83c0: 28 76 6f 69 64 20 2a 29 65 6e 63 2c 20 74 65 73  (void *)enc, tes
83d0: 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 29 3b  t_collate_func);
83e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
83f0: 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74   add_test_collat
8400: 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f 0a 73  e_needed DB.*/.s
8410: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
8420: 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28 0a 20  ollate_needed(. 
8430: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
8440: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
8450: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
8460: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
8470: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
8480: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8490: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
84a0: 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20   objc!=2 ) goto 
84b0: 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20  bad_args;.  if( 
84c0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
84d0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
84e0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
84f0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
8500: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
8510: 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
8520: 65 65 64 65 64 31 36 28 64 62 2c 20 30 2c 20 74  eeded16(db, 0, t
8530: 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
8540: 65 64 5f 63 62 29 3b 0a 20 20 69 66 28 20 73 71  ed_cb);.  if( sq
8550: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
8560: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
8570: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
8580: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
8590: 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
85a0: 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  .  Tcl_WrongNumA
85b0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
85c0: 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65  bjv, "DB");.  re
85d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
85e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
85f0: 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  add_test_functio
8600: 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38  n <db ptr> <utf8
8610: 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
8620: 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  16be>.**.** This
8630: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
8640: 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  d to test that S
8650: 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68  QLite selects th
8660: 65 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a  e correct user.*
8670: 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62  * function callb
8680: 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c  ack when multipl
8690: 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20  e versions (for 
86a0: 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65  different text e
86b0: 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65  ncodings).** are
86c0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
86d0: 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * Calling this r
86e0: 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
86f0: 20 75 70 20 74 6f 20 74 68 72 65 65 20 76 65 72   up to three ver
8700: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65  sions of the use
8710: 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74  r function.** "t
8720: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69  est_function" wi
8730: 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  th database hand
8740: 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65  le <db>.  If the
8750: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
8760: 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   is.** true, the
8770: 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
8780: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20  est_function is 
8790: 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55  registered for U
87a0: 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20  TF-8, if the.** 
87b0: 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61  third is true, a
87c0: 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
87d0: 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31  stered for UTF-1
87e0: 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72  6le, if the four
87f0: 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61  th is.** true, a
8800: 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f   UTF-16be versio
8810: 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  n is available. 
8820: 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
8830: 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75  ns of.** test_fu
8840: 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74  nction are delet
8850: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73  ed..**.** The us
8860: 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  er function is i
8870: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61  mplemented by ca
8880: 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  lling the follow
8890: 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a  ing TCL script:.
88a0: 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75  **.**   "test_fu
88b0: 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72  nction <enc> <ar
88c0: 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20  g>".**.** Where 
88d0: 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20  <enc> is one of 
88e0: 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20  UTF-8, UTF-16LE 
88f0: 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20  or UTF16BE, and 
8900: 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20  <arg> is the.** 
8910: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
8920: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 53 51  passed to the SQ
8930: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  L function. The 
8940: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
8950: 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72  y.** the TCL scr
8960: 69 70 74 20 69 73 20 75 73 65 64 20 61 73 20 74  ipt is used as t
8970: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
8980: 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  of the SQL funct
8990: 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61  ion. It.** is pa
89a0: 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75  ssed to SQLite u
89b0: 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f  sing UTF-16BE fo
89c0: 72 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66  r a UTF-8 test_f
89d0: 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38  unction(), UTF-8
89e0: 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36  .** for a UTF-16
89f0: 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  LE test_function
8a00: 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45  (), and UTF-16LE
8a10: 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e   for an implemen
8a20: 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70  tation that.** p
8a30: 72 65 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e  refers UTF-16BE.
8a40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8a50: 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
8a60: 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  f8(.  sqlite3_co
8a70: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
8a80: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
8a90: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8aa0: 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
8ab0: 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
8ac0: 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  Obj *pX;.  sqlit
8ad0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
8ae0: 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f    interp = (Tcl_
8af0: 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33  Interp *)sqlite3
8b00: 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
8b10: 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ;.  pX = Tcl_New
8b20: 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
8b30: 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a  function", -1);.
8b40: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
8b50: 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69  nt(pX);.  Tcl_Li
8b60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
8b70: 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54  nt(interp, pX, T
8b80: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8b90: 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a 20  "UTF-8", -1));. 
8ba0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8bb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8bc0: 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
8bd0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
8be0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8bf0: 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
8c00: 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
8c10: 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
8c20: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
8c30: 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69 74  unt(pX);.  sqlit
8c40: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
8c50: 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  Ctx, Tcl_GetStri
8c60: 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
8c70: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
8c80: 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20  NSIENT);.  pVal 
8c90: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
8ca0: 77 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  w();.  sqlite3Va
8cb0: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
8cc0: 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
8cd0: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
8ce0: 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
8cf0: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
8d00: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
8d10: 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70  esult_text16be(p
8d20: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
8d30: 75 65 5f 74 65 78 74 31 36 62 65 28 70 56 61 6c  ue_text16be(pVal
8d40: 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
8d50: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
8d60: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
8d70: 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74  ee(pVal);.}.stat
8d80: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
8d90: 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a 20  ction_utf16le(. 
8da0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
8db0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
8dc0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
8dd0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
8de0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8df0: 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
8e00: 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
8e10: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
8e20: 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
8e30: 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
8e40: 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
8e50: 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
8e60: 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
8e70: 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
8e80: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
8e90: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
8ea0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
8eb0: 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
8ec0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
8ed0: 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54  16LE", -1));.  T
8ee0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8ef0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8f00: 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e  pX, .      Tcl_N
8f10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
8f20: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
8f30: 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20  rgv[0]), -1));. 
8f40: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
8f50: 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20  nterp, pX, 0);. 
8f60: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
8f70: 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20  t(pX);.  pVal = 
8f80: 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
8f90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
8fa0: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
8fb0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
8fc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a  esult(interp), .
8fd0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
8fe0: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
8ff0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
9000: 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 73 71  ult_text(pCtx,sq
9010: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
9020: 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45  (pVal),-1,SQLITE
9030: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
9040: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
9050: 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20  pVal);.}.static 
9060: 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69  void test_functi
9070: 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73 71  on_utf16be(.  sq
9080: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
9090: 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
90a0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
90b0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
90c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
90d0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
90e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
90f0: 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
9100: 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
9110: 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
9120: 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
9130: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
9140: 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
9150: 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
9160: 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
9170: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
9180: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
9190: 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
91a0: 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42  ringObj("UTF-16B
91b0: 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  E", -1));.  Tcl_
91c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
91d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
91e0: 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53   .      Tcl_NewS
91f0: 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
9200: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9210: 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  [0]), -1));.  Tc
9220: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
9230: 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  rp, pX, 0);.  Tc
9240: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
9250: 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  X);.  pVal = sql
9260: 69 74 65 33 56 61 6c 75 65 4e 65 77 28 29 3b 0a  ite3ValueNew();.
9270: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
9280: 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
9290: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
92a0: 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
92b0: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
92c0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
92d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
92e0: 5f 74 65 78 74 31 36 6c 65 28 70 43 74 78 2c 20  _text16le(pCtx, 
92f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
9300: 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
9310: 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
9320: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
9330: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
9340: 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  al);.}.static in
9350: 74 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  t test_function(
9360: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
9370: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
9380: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
9390: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
93a0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
93b0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
93c0: 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20  ;.  int val;..  
93d0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f  if( objc!=5 ) go
93e0: 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69  to bad_args;.  i
93f0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
9400: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
9410: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
9420: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
9430: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
9440: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
9450: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
9460: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
9470: 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
9480: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76  L_ERROR;.  if( v
9490: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
94a0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
94b0: 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63  n(db, "test_func
94c0: 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45  tion", 1, SQLITE
94d0: 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20  _UTF8, .        
94e0: 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
94f0: 63 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30  ction_utf8, 0, 0
9500: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c  );.  }.  if( TCL
9510: 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
9520: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
9530: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
9540: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
9550: 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
9560: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
9570: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
9580: 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
9590: 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
95a0: 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  F16LE, .        
95b0: 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
95c0: 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30  ction_utf16le, 0
95d0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
95e0: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
95f0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
9600: 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
9610: 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
9620: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76  L_ERROR;.  if( v
9630: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
9640: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
9650: 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63  n(db, "test_func
9660: 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45  tion", 1, SQLITE
9670: 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20  _UTF16BE, .     
9680: 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f     interp, test_
9690: 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65  function_utf16be
96a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
96b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62  return TCL_OK;.b
96c0: 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41  ad_args:.  Tcl_A
96d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
96e0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
96f0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9700: 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  ,.      Tcl_GetS
9710: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
9720: 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e  v[0], 0), " <DB>
9730: 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
9740: 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29  > <utf16be>", 0)
9750: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
9760: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  RROR;.}../*.** U
9770: 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 74 65  sage:         te
9780: 73 74 5f 65 72 72 73 74 72 20 3c 65 72 72 20 63  st_errstr <err c
9790: 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ode>.**.** Test 
97a0: 74 68 61 74 20 74 68 65 20 65 6e 67 6c 69 73 68  that the english
97b0: 20 6c 61 6e 67 75 61 67 65 20 73 74 72 69 6e 67   language string
97c0: 20 65 71 75 69 76 61 6c 65 6e 74 73 20 66 6f 72   equivalents for
97d0: 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
97e0: 64 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e  des.** are sane.
97f0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   The parameter i
9800: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70  s an integer rep
9810: 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c  resenting an sql
9820: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
9830: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69 73  ** The result is
9840: 20 61 20 6c 69 73 74 20 6f 66 20 74 77 6f 20 65   a list of two e
9850: 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 72  lements, the str
9860: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
9870: 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72  on of the.** err
9880: 6f 72 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20  or code and the 
9890: 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  english language
98a0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f   explanation..*/
98b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
98c0: 5f 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64 20  _errstr(.  void 
98d0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
98e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
98f0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
9900: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
9910: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61   objv[].){.  cha
9920: 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20  r *zCode;.  int 
9930: 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  i;.  if( objc!=1
9940: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
9950: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
9960: 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f   1, objv, "<erro
9970: 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a  r code>");.  }..
9980: 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65    zCode = Tcl_Ge
9990: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
99a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32  ;.  for(i=0; i<2
99b0: 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  00; i++){.    if
99c0: 28 20 30 3d 3d 73 74 72 63 6d 70 28 65 72 72 6f  ( 0==strcmp(erro
99d0: 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29  rName(i), zCode)
99e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
99f0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
9a00: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
9a10: 6c 69 74 65 33 45 72 72 53 74 72 28 69 29 2c 20  lite3ErrStr(i), 
9a20: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
9a30: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
9a40: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 61 73 68  nt sqlite3_crash
9a50: 70 61 72 61 6d 73 28 0a 20 20 76 6f 69 64 20 2a  params(.  void *
9a60: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
9a70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9a80: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
9a90: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
9aa0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 64 65 66  objv[].){.#ifdef
9ab0: 20 4f 53 5f 54 45 53 54 0a 20 20 69 6e 74 20 64   OS_TEST.  int d
9ac0: 65 6c 61 79 3b 0a 20 20 69 66 28 20 6f 62 6a 63  elay;.  if( objc
9ad0: 21 3d 33 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=3 ) goto bad_a
9ae0: 72 67 73 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  rgs;.  if( Tcl_G
9af0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
9b00: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 64  erp, objv[1], &d
9b10: 65 6c 61 79 29 20 29 20 72 65 74 75 72 6e 20 54  elay) ) return T
9b20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
9b30: 74 65 33 53 65 74 43 72 61 73 68 50 61 72 61 6d  te3SetCrashParam
9b40: 73 28 64 65 6c 61 79 2c 20 54 63 6c 5f 47 65 74  s(delay, Tcl_Get
9b50: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29  String(objv[2]))
9b60: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
9b70: 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 23 69 66 64 65  n TCL_OK;..#ifde
9b80: 66 20 4f 53 5f 54 45 53 54 0a 62 61 64 5f 61 72  f OS_TEST.bad_ar
9b90: 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  gs:.  Tcl_Append
9ba0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9bb0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
9bc0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
9bd0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
9be0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
9bf0: 20 30 29 2c 20 22 3c 64 65 6c 61 79 3e 20 3c 66   0), "<delay> <f
9c00: 69 6c 65 6e 61 6d 65 3e 22 2c 20 30 29 3b 0a 20  ilename>", 0);. 
9c10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9c20: 52 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  R;.#endif.}.../*
9c30: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72  .** Usage:    br
9c40: 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54  eakpoint.**.** T
9c50: 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73  his routine exis
9c60: 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f  ts for one purpo
9c70: 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20  se - to provide 
9c80: 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61  a place to put a
9c90: 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77  .** breakpoint w
9ca0: 69 74 68 20 47 44 42 20 74 68 61 74 20 63 61 6e  ith GDB that can
9cb0: 20 62 65 20 74 72 69 67 67 65 72 65 64 20 75 73   be triggered us
9cc0: 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54  ing TCL code.  T
9cd0: 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68  he use.** for th
9ce0: 69 73 20 69 73 20 77 68 65 6e 20 61 20 70 61 72  is is when a par
9cf0: 74 69 63 75 6c 61 72 20 74 65 73 74 20 66 61 69  ticular test fai
9d00: 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20  ls on (say) the 
9d10: 31 34 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e  1485th iteration
9d20: 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20  ..** In the TCL 
9d30: 74 65 73 74 20 73 63 72 69 70 74 2c 20 77 65 20  test script, we 
9d40: 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b  can add code lik
9d50: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
9d60: 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20    if {$i==1485} 
9d70: 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a  breakpoint.**.**
9d80: 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69   Then run testfi
9d90: 78 74 75 72 65 20 69 6e 20 74 68 65 20 64 65 62  xture in the deb
9da0: 75 67 67 65 72 20 61 6e 64 20 77 61 69 74 20 66  ugger and wait f
9db0: 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e  or the breakpoin
9dc0: 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54  t to.** fire.  T
9dd0: 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62  hen additional b
9de0: 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62  reakpoints can b
9df0: 65 20 73 65 74 20 74 6f 20 74 72 61 63 65 20 64  e set to trace d
9e00: 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a  own the bug..*/.
9e10: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
9e20: 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f  breakpoint(.  vo
9e30: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
9e40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9e50: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
9e60: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
9e70: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
9e80: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
9e90: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
9ea0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9eb0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
9ec0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
9ed0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
9ee0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
9ef0: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43  /.){.  return TC
9f00: 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  L_OK;         /*
9f10: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d   Do nothing */.}
9f20: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
9f30: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
9f40: 74 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  t  STMT N VALUE.
9f50: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
9f60: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
9f70: 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
9f80: 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
9f90: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
9fa0: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
9fb0: 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
9fc0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
9fd0: 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
9fe0: 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32  nd.** binds a 32
9ff0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
a000: 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
a010: 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
a020: 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74  nt test_bind_int
a030: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
a040: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
a050: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
a060: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
a070: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
a080: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
a090: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
a0a0: 20 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75   idx;.  int valu
a0b0: 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
a0c0: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
a0d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a0e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
a0f0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
a100: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
a110: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
a120: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
a130: 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
a140: 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  UE", 0);.    ret
a150: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a160: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
a170: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
a180: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
a190: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
a1a0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
a1b0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
a1c0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
a1d0: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
a1e0: 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
a1f0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
a200: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
a210: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
a220: 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72   &value) ) retur
a230: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
a240: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
a250: 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78  d_int(pStmt, idx
a260: 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20  , value);.  if( 
a270: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
a280: 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
a290: 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
a2a0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
a2b0: 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
a2c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
a2d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a2e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
a2f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
a300: 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
a310: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54  3_bind_int64  ST
a320: 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  MT N VALUE.**.**
a330: 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
a340: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74  3_bind_int64 int
a350: 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
a360: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
a370: 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
a380: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
a390: 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
a3a0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
a3b0: 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
a3c0: 2a 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69  ** binds a 64-bi
a3d0: 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20  t integer VALUE 
a3e0: 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64  to that wildcard
a3f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a400: 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28  test_bind_int64(
a410: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
a420: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
a430: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
a440: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
a450: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
a460: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
a470: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
a480: 69 64 78 3b 0a 20 20 69 36 34 20 76 61 6c 75 65  idx;.  i64 value
a490: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
a4a0: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
a4b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a4c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
a4d0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
a4e0: 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
a4f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a500: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
a510: 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
a520: 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
a530: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
a540: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
a550: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
a560: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
a570: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
a580: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
a590: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
a5a0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
a5b0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
a5c0: 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
a5d0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
a5e0: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
a5f0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
a600: 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65  3], &value) ) re
a610: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a620: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
a630: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
a640: 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20  , idx, value);. 
a650: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
a660: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
a670: 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
a680: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
a690: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
a6a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a6b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a6c0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
a6d0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
a6e0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
a6f0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
a700: 6c 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  le  STMT N VALUE
a710: 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
a720: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
a730: 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ble interface.  
a740: 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
a750: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
a760: 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
a770: 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
a780: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
a790: 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
a7a0: 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
a7b0: 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
a7c0: 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77   VALUE to that w
a7d0: 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
a7e0: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
a7f0: 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  _double(.  void 
a800: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
a810: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
a820: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
a830: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
a840: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
a850: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
a860: 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64  ;.  int idx;.  d
a870: 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69  ouble value;.  i
a880: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
a890: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
a8a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a8b0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
a8c0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
a8d0: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
a8e0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a8f0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
a900: 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30  STMT N VALUE", 0
a910: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
a920: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
a930: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
a940: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
a950: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
a960: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
a970: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a980: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
a990: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
a9a0: 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
a9b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a9c0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44  ;.  if( Tcl_GetD
a9d0: 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
a9e0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
a9f0: 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54  alue) ) return T
aa00: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
aa10: 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64  = sqlite3_bind_d
aa20: 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78  ouble(pStmt, idx
aa30: 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20  , value);.  if( 
aa40: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
aa50: 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
aa60: 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
aa70: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
aa80: 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
aa90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
aaa0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
aab0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
aac0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
aad0: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
aae0: 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54  _bind_null  STMT
aaf0: 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68   N.**.** Test th
ab00: 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  e sqlite3_bind_n
ab10: 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ull interface.  
ab20: 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
ab30: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
ab40: 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
ab50: 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
ab60: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
ab70: 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
ab80: 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
ab90: 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69  a NULL to the wi
aba0: 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
abb0: 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
abc0: 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  null(.  void * c
abd0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
abe0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
abf0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
ac00: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
ac10: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
ac20: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
ac30: 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
ac40: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
ac50: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
ac60: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ac70: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
ac80: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
ac90: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
aca0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
acb0: 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
acc0: 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T N", 0);.    re
acd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ace0: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
acf0: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
ad00: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
ad10: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
ad20: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ad30: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
ad40: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
ad50: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
ad60: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
ad70: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
ad80: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
ad90: 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a  ll(pStmt, idx);.
ada0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
adb0: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
adc0: 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
add0: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
ade0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
adf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ae00: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ae10: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
ae20: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
ae30: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
ae40: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
ae50: 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20    STMT N STRING 
ae60: 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
ae70: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
ae80: 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63 65  d_text interface
ae90: 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
aea0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
aeb0: 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
aec0: 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
aed0: 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
aee0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
aef0: 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
af00: 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e  ds a UTF-8 strin
af10: 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
af20: 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
af30: 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
af40: 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
af50: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
af60: 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f  _bind_text(.  vo
af70: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
af80: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
af90: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
afa0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
afb0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
afc0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
afd0: 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
afe0: 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
aff0: 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e  har *value;.  in
b000: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
b010: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
b020: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b030: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
b040: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
b050: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
b060: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
b070: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
b080: 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45  TMT N VALUE BYTE
b090: 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
b0a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b0b0: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
b0c0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
b0d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b0e0: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
b0f0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b100: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
b110: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
b120: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
b130: 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
b140: 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d  ERROR;.  value =
b150: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
b160: 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[3]);.  if( T
b170: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
b180: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
b190: 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
b1a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
b1b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
b1c0: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
b1d0: 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65 73  dx, value, bytes
b1e0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
b1f0: 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  NT);.  if( sqlit
b200: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
b210: 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
b220: 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
b230: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b240: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b250: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
b260: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
b270: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
b290: 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
b2a0: 5f 74 65 78 74 31 36 20 20 53 54 4d 54 20 4e 20  _text16  STMT N 
b2b0: 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a  STRING BYTES.**.
b2c0: 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
b2d0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20  te3_bind_text16 
b2e0: 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
b2f0: 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
b300: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
b310: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
b320: 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
b330: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
b340: 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
b350: 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54  nd.** binds a UT
b360: 46 2d 31 36 20 73 74 72 69 6e 67 20 53 54 52 49  F-16 string STRI
b370: 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  NG to the wildca
b380: 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20  rd.  The string 
b390: 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a  is BYTES bytes.*
b3a0: 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  * long..*/.stati
b3b0: 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
b3c0: 74 65 78 74 31 36 28 0a 20 20 76 6f 69 64 20 2a  text16(.  void *
b3d0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
b3e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b3f0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
b400: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
b410: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
b420: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
b430: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
b440: 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20  t bytes;.  char 
b450: 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63  *value;.  int rc
b460: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
b470: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
b480: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b490: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
b4a0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
b4b0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
b4c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
b4d0: 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
b4e0: 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20  N VALUE BYTES", 
b4f0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
b500: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
b510: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
b520: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
b530: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
b540: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
b550: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b560: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
b570: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b580: 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
b590: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b5a0: 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c  R;.  value = Tcl
b5b0: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
b5c0: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29  mObj(objv[3], 0)
b5d0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
b5e0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
b5f0: 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65  , objv[4], &byte
b600: 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
b610: 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
b620: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
b630: 31 36 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28  16(pStmt, idx, (
b640: 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79  void *)value, by
b650: 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  tes, SQLITE_TRAN
b660: 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71  SIENT);.  if( sq
b670: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
b680: 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
b690: 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
b6a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b6b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b6c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
b6d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b6e0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
b6f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
b700: 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
b710: 69 6e 64 5f 62 6c 6f 62 20 20 53 54 4d 54 20 4e  ind_blob  STMT N
b720: 20 44 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a   DATA BYTES.**.*
b730: 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
b740: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74  e3_bind_blob int
b750: 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
b760: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
b770: 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
b780: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
b790: 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
b7a0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
b7b0: 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
b7c0: 2a 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20  ** binds a BLOB 
b7d0: 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
b7e0: 20 20 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59    The BLOB is BY
b7f0: 54 45 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a  TES bytes in siz
b800: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b810: 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28   test_bind_blob(
b820: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
b830: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
b840: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
b850: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
b860: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
b870: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
b880: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
b890: 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  idx;.  int bytes
b8a0: 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b  ;.  char *value;
b8b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
b8c0: 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
b8d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b8e0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
b8f0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
b900: 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
b910: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
b920: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
b930: 2c 20 22 20 53 54 4d 54 20 4e 20 44 41 54 41 20  , " STMT N DATA 
b940: 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20  BYTES", 0);.    
b950: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b960: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
b970: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
b980: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
b990: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
b9a0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
b9b0: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
b9c0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
b9d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
b9e0: 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
b9f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c  TCL_ERROR;.  val
ba00: 75 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ue = Tcl_GetStri
ba10: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69  ng(objv[3]);.  i
ba20: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
ba30: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
ba40: 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[4], &bytes) ) 
ba50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ba60: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
ba70: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
ba80: 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62  t, idx, value, b
ba90: 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41  ytes, SQLITE_TRA
baa0: 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73  NSIENT);.  if( s
bab0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
bac0: 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
bad0: 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
bae0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
baf0: 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
bb00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
bb10: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bb20: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
bb30: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
bb40: 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
bb50: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
bb60: 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  ount  STMT.**.**
bb70: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
bb80: 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73 20  er of wildcards 
bb90: 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74 61  in the given sta
bba0: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  tement..*/.stati
bbb0: 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
bbc0: 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28  parameter_count(
bbd0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
bbe0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
bbf0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
bc00: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
bc10: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
bc20: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
bc30: 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
bc40: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
bc50: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
bc60: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
bc70: 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72  , "STMT");.    r
bc80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bc90: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
bca0: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
bcb0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
bcc0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
bcd0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
bce0: 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
bcf0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
bd00: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
bd10: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
bd20: 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d  meter_count(pStm
bd30: 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
bd40: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
bd50: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
bd60: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
bd70: 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a 2a  name  STMT  N.**
bd80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
bd90: 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20 77  ame of the Nth w
bda0: 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66 69  ildcard.  The fi
bdb0: 72 73 74 20 77 69 6c 64 63 61 72 64 20 69 73 20  rst wildcard is 
bdc0: 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73  1..** An empty s
bdd0: 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65  tring is returne
bde0: 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66  d if N is out of
bdf0: 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68 65   range or if the
be00: 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73 20   wildcard.** is 
be10: 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61  nameless..*/.sta
be20: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
be30: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
be40: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
be50: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
be60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
be70: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
be80: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
be90: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
bea0: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
beb0: 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   i;..  if( objc!
bec0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
bed0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
bee0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
bef0: 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  T N");.    retur
bf00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
bf10: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
bf20: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
bf30: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
bf40: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
bf50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bf60: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
bf70: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
bf80: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29  , objv[2], &i) )
bf90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bfa0: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
bfb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20  esult(interp, . 
bfc0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
bfd0: 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e  gObj(sqlite3_bin
bfe0: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
bff0: 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20  (pStmt,i),-1).  
c000: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
c010: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
c020: 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
c030: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
c040: 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a  ex  STMT  NAME.*
c050: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c060: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69 6c  index of the wil
c070: 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d  dcard called NAM
c080: 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  E.  Return 0 if 
c090: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73  there is.** no s
c0a0: 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  uch wildcard..*/
c0b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
c0c0: 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
c0d0: 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20 2a 20  index(.  void * 
c0e0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
c0f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c100: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
c110: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
c120: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
c130: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
c140: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
c150: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
c160: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
c170: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 41  , objv, "STMT NA
c180: 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ME");.    return
c190: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
c1a0: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
c1b0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
c1c0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
c1d0: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
c1e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c1f0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
c200: 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  ult(interp, .   
c210: 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28    Tcl_NewIntObj(
c220: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
c230: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
c240: 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f 47  ndex(pStmt,Tcl_G
c250: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
c260: 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a 20  )).     ).  );. 
c270: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
c280: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
c290: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20  sqlite3_errcode 
c2a0: 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
c2b0: 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
c2c0: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
c2d0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
c2e0: 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72  ite3_* API.** er
c2f0: 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22  ror code. e.g. "
c300: 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a  SQLITE_ERROR"..*
c310: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
c320: 74 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69  t_errcode(.  voi
c330: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
c340: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
c350: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
c360: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
c370: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
c380: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
c390: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
c3a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
c3b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
c3c0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
c3d0: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
c3e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c3f0: 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
c400: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
c410: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
c420: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
c430: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
c440: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
c450: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
c460: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
c470: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
c480: 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e  , (char *)errorN
c490: 61 6d 65 28 73 71 6c 69 74 65 33 5f 65 72 72 63  ame(sqlite3_errc
c4a0: 6f 64 65 28 64 62 29 29 2c 20 30 29 3b 0a 20 20  ode(db)), 0);.  
c4b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
c4c0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
c4d0: 20 74 65 73 74 5f 65 72 72 6d 73 67 20 44 42 0a   test_errmsg DB.
c4e0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
c4f0: 65 20 55 54 46 2d 38 20 72 65 70 72 65 73 65 6e  e UTF-8 represen
c500: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72  tation of the er
c510: 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
c520: 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f  ng for the.** mo
c530: 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
c540: 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f  3_* API call..*/
c550: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
c560: 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69 64 20  _errmsg(.  void 
c570: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
c580: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c590: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
c5a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
c5b0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
c5c0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
c5d0: 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a 20  t char *zErr;.. 
c5e0: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
c5f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
c600: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
c610: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
c620: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
c630: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
c640: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
c650: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
c660: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
c670: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
c680: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
c690: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
c6a0: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
c6b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a   TCL_ERROR;..  z
c6c0: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72  Err = sqlite3_er
c6d0: 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63 6c 5f  rmsg(db);.  Tcl_
c6e0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
c6f0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
c700: 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29 29  ngObj(zErr, -1))
c710: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
c720: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
c730: 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67  e:   test_errmsg
c740: 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  16 DB.**.** Retu
c750: 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36 20 72  rns the UTF-16 r
c760: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
c770: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
c780: 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ge string for th
c790: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
c7a0: 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63   sqlite3_* API c
c7b0: 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61 20 62  all. This is a b
c7c0: 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65 63 74  yte array object
c7d0: 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a 20   at the TCL .** 
c7e0: 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20 69 6e  level, and it in
c7f0: 63 6c 75 64 65 73 20 74 68 65 20 30 78 30 30 20  cludes the 0x00 
c800: 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20  0x00 terminator 
c810: 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e 64  bytes at the end
c820: 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d 31   of the.** UTF-1
c830: 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  6 string..*/.sta
c840: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
c850: 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  msg16(.  void * 
c860: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
c870: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c880: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
c890: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
c8a0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
c8b0: 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
c8c0: 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20 20 69 6e  void *zErr;.  in
c8d0: 74 20 62 79 74 65 73 3b 0a 0a 20 20 69 66 28 20  t bytes;..  if( 
c8e0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
c8f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c900: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
c910: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
c920: 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
c930: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c940: 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
c950: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c960: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
c970: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
c980: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
c990: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
c9a0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
c9b0: 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d  ERROR;..  zErr =
c9c0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31   sqlite3_errmsg1
c9d0: 36 28 64 62 29 3b 0a 20 20 62 79 74 65 73 20 3d  6(db);.  bytes =
c9e0: 20 73 71 6c 69 74 65 33 75 74 66 31 36 42 79 74   sqlite3utf16Byt
c9f0: 65 4c 65 6e 28 7a 45 72 72 2c 20 2d 31 29 3b 0a  eLen(zErr, -1);.
ca00: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
ca10: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
ca20: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a  ewByteArrayObj(z
ca30: 45 72 72 2c 20 62 79 74 65 73 29 29 3b 0a 20 20  Err, bytes));.  
ca40: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
ca50: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
ca60: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 44  qlite3_prepare D
ca70: 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
ca80: 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  var.**.** Compil
ca90: 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
caa0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
cab0: 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
cac0: 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
cad0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
cae0: 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
caf0: 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
cb00: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
cb10: 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
cb20: 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
cb30: 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
cb40: 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
cb50: 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
cb60: 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
cb70: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
cb80: 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 28  nt test_prepare(
cb90: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
cba0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
cbb0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
cbc0: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
cbd0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
cbe0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
cbf0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
cc00: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65  zSql;.  int byte
cc10: 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s;.  const char 
cc20: 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *zTail = 0;.  sq
cc30: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
cc40: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
cc50: 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63  uf[50];.  int rc
cc60: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
cc70: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
cc80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
cc90: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
cca0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
ccb0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
ccc0: 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
ccd0: 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
cce0: 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20  ilvar", 0);.    
ccf0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cd00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
cd10: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
cd20: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
cd30: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
cd40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
cd50: 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
cd60: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
cd70: 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
cd80: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
cd90: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74  p, objv[3], &byt
cda0: 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
cdb0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
cdc0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
cdd0: 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c  db, zSql, bytes,
cde0: 20 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29   &pStmt, &zTail)
cdf0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
ce00: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
ce10: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
ce20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ce30: 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20   if( zTail ){.  
ce40: 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29    if( bytes>=0 )
ce50: 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20  {.      bytes = 
ce60: 62 79 74 65 73 20 2d 20 28 7a 54 61 69 6c 2d 7a  bytes - (zTail-z
ce70: 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
ce80: 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
ce90: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
cea0: 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
ceb0: 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
cec0: 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
ced0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cee0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
cef0: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70  tmt==0 );.    sp
cf00: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
cf10: 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
cf20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
cf30: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
cf40: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
cf50: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
cf60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
cf70: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
cf80: 20 20 20 69 66 28 20 6d 61 6b 65 50 6f 69 6e 74     if( makePoint
cf90: 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
cfa0: 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
cfb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cfc0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
cfd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
cfe0: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
cff0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
d000: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
d010: 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71  e3_prepare DB sq
d020: 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a  l bytes tailvar.
d030: 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
d040: 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
d050: 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
d060: 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
d070: 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
d080: 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
d090: 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
d0a0: 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
d0b0: 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
d0c0: 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
d0d0: 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
d0e0: 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
d0f0: 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
d100: 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
d110: 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
d120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
d130: 65 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20  est_prepare16(. 
d140: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
d150: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
d160: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
d170: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
d180: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
d190: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
d1a0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53    const void *zS
d1b0: 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ql;.  const void
d1c0: 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54   *zTail = 0;.  T
d1d0: 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20  cl_Obj *pTail = 
d1e0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
d1f0: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
d200: 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a  char zBuf[50]; .
d210: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
d220: 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20  bytes;          
d230: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
d240: 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61  eger specified a
d250: 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74  s arg 3 */.  int
d260: 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20   objlen;        
d270: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79         /* The by
d280: 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20  te-array length 
d290: 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69  of arg 2 */..  i
d2a0: 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
d2b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
d2c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
d2d0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
d2e0: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
d2f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
d300: 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
d310: 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22  l bytes tailvar"
d320: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
d330: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d340: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
d350: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
d360: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
d370: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
d380: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
d390: 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ql = Tcl_GetByte
d3a0: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
d3b0: 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a  v[2], &objlen);.
d3c0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
d3d0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
d3e0: 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
d3f0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d400: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
d410: 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64  ite3_prepare16(d
d420: 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
d430: 26 70 53 74 6d 74 2c 20 26 7a 54 61 69 6c 29 3b  &pStmt, &zTail);
d440: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
d450: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
d460: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
d470: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d480: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
d490: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d4a0: 20 20 7d 0a 0a 20 20 69 66 28 20 7a 54 61 69 6c    }..  if( zTail
d4b0: 20 29 7b 0a 20 20 20 20 6f 62 6a 6c 65 6e 20 3d   ){.    objlen =
d4c0: 20 6f 62 6a 6c 65 6e 20 2d 20 28 28 75 38 20 2a   objlen - ((u8 *
d4d0: 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71  )zTail-(u8 *)zSq
d4e0: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
d4f0: 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d   objlen = 0;.  }
d500: 0a 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e  .  pTail = Tcl_N
d510: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
d520: 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c  u8 *)zTail, objl
d530: 65 6e 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  en);.  Tcl_IncrR
d540: 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a  efCount(pTail);.
d550: 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
d560: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
d570: 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a  , 0, pTail, 0);.
d580: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
d590: 6e 74 28 70 54 61 69 6c 29 3b 0a 0a 20 20 69 66  nt(pTail);..  if
d5a0: 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
d5b0: 66 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53 74  f( makePointerSt
d5c0: 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
d5d0: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
d5e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
d5f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
d600: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
d610: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
d620: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
d630: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
d640: 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69  n filename ?opti
d650: 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61  ons-list?.*/.sta
d660: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65  tic int test_ope
d670: 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
d680: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
d690: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
d6a0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
d6b0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
d6c0: 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ].){.  const cha
d6d0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
d6e0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
d6f0: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42  nt rc;.  char zB
d700: 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
d710: 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21  objc!=3 && objc!
d720: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
d730: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d740: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
d750: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
d760: 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
d770: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
d780: 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69   " filename opti
d790: 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20  ons-list", 0);. 
d7a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d7b0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c  ROR;.  }..  zFil
d7c0: 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  ename = Tcl_GetS
d7d0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
d7e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
d7f0: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  pen(zFilename, &
d800: 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 6d 61  db);.  .  if( ma
d810: 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
d820: 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29  erp, zBuf, db) )
d830: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d840: 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  R;.  Tcl_AppendR
d850: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
d860: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
d870: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
d880: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
d890: 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65  _open16 filename
d8a0: 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74   options.*/.stat
d8b0: 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e  ic int test_open
d8c0: 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
d8d0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
d8e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
d8f0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
d900: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
d910: 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f  [].){.  const vo
d920: 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  id *zFilename;. 
d930: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d940: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
d950: 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
d960: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
d970: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d980: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
d990: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
d9a0: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
d9b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
d9c0: 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
d9d0: 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c  e options-list",
d9e0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
d9f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
da00: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63    zFilename = Tc
da10: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
da20: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
da30: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
da40: 33 5f 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61  3_open16(zFilena
da50: 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69  me, &db);.  .  i
da60: 66 28 20 6d 61 6b 65 50 6f 69 6e 74 65 72 53 74  f( makePointerSt
da70: 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
da80: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
da90: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
daa0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
dab0: 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
dac0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
dad0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
dae0: 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36  lite3_complete16
daf0: 20 3c 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e   <UTF-16 string>
db00: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
db10: 69 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  if the supplied 
db20: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f  argument is a co
db30: 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
db40: 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ment, or zero.**
db50: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
db60: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
db70: 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69  omplete16(.  voi
db80: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
db90: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
dba0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
dbb0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
dbc0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
dbd0: 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66  har *zBuf;..  if
dbe0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
dbf0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
dc00: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
dc10: 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e  v, "<utf-16 sql>
dc20: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
dc30: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
dc40: 20 7a 42 75 66 20 3d 20 54 63 6c 5f 47 65 74 42   zBuf = Tcl_GetB
dc50: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
dc60: 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54  objv[1], 0);.  T
dc70: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
dc80: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
dc90: 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ntObj(sqlite3_co
dca0: 6d 70 6c 65 74 65 31 36 28 7a 42 75 66 29 29 29  mplete16(zBuf)))
dcb0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
dcc0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
dcd0: 65 3a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20  e: sqlite3_step 
dce0: 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e  STMT.**.** Advan
dcf0: 63 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ce the statement
dd00: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
dd10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
dd20: 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69  test_step(.  voi
dd30: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
dd40: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
dd50: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
dd60: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
dd70: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
dd80: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
dd90: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
dda0: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
ddb0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ddc0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
ddd0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
dde0: 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
ddf0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
de00: 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
de10: 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
de20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
de30: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
de40: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
de50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
de60: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
de70: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
de80: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
de90: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
dea0: 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d 53 51  .  /* if( rc!=SQ
deb0: 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 21  LITE_DONE && rc!
dec0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 65  =SQLITE_ROW ) re
ded0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20  turn TCL_ERROR; 
dee0: 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  */.  Tcl_SetResu
def0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
df00: 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28 72 63 29   *)errorName(rc)
df10: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
df20: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
df30: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
df40: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d 54  olumn_count STMT
df50: 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74   .**.** Return t
df60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
df70: 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
df80: 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
df90: 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  nt STMT..*/.stat
dfa0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
dfb0: 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  mn_count(.  void
dfc0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
dfd0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
dfe0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
dff0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
e000: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
e010: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
e020: 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
e030: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
e040: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e050: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
e060: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
e070: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
e080: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
e090: 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
e0a0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
e0b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
e0c0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
e0d0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
e0e0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
e0f0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
e100: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e110: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
e120: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
e130: 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
e140: 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
e150: 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
e160: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
e170: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
e180: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54  3_column_type ST
e190: 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
e1a0: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
e1b0: 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e 20 63  of the data in c
e1c0: 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f  olumn 'column' o
e1d0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
e1e0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
e1f0: 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70   test_column_typ
e200: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
e210: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
e220: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
e230: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
e240: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
e250: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
e260: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
e270: 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b  t col;.  int tp;
e280: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
e290: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
e2a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e2b0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
e2c0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
e2d0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
e2e0: 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
e2f0: 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
e300: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
e310: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
e320: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
e330: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
e340: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
e350: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
e360: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e370: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
e380: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
e390: 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
e3a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e3b0: 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74 65 33  ..  tp = sqlite3
e3c0: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
e3d0: 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74  mt, col);.  swit
e3e0: 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20 63 61  ch( tp ){.    ca
e3f0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45  se SQLITE_INTEGE
e400: 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  R: .      Tcl_Se
e410: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
e420: 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f 53  "INTEGER", TCL_S
e430: 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
e440: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
e450: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20  QLITE_NULL:.    
e460: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
e470: 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20  interp, "NULL", 
e480: 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
e490: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
e4a0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
e4b0: 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  :.      Tcl_SetR
e4c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46  esult(interp, "F
e4d0: 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41 54 49  LOAT", TCL_STATI
e4e0: 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
e4f0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
e500: 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 54 63  E_TEXT:.      Tc
e510: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
e520: 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43 4c 5f  rp, "TEXT", TCL_
e530: 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
e540: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
e550: 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20  SQLITE_BLOB:.   
e560: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
e570: 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c  (interp, "BLOB",
e580: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
e590: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e5a0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
e5b0: 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20  ssert(0);.  }.. 
e5c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
e5d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
e5e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
e5f0: 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  nt64 STMT column
e600: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
e610: 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e  e data in column
e620: 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65   'column' of the
e630: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73   current row cas
e640: 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20  t as an.** wide 
e650: 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67 65 72  (64-bit) integer
e660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e670: 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  test_column_int6
e680: 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  4(.  void * clie
e690: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
e6a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
e6b0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
e6c0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
e6d0: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
e6e0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
e6f0: 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56 61  t col;.  i64 iVa
e700: 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
e710: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
e720: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e730: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
e740: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
e750: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
e760: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
e770: 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
e780: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
e790: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
e7a0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
e7b0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
e7c0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
e7d0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
e7e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e7f0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
e800: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
e810: 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
e820: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e830: 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71 6c  R;..  iVal = sql
e840: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
e850: 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  4(pStmt, col);. 
e860: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
e870: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
e880: 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56 61 6c  wWideIntObj(iVal
e890: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
e8a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
e8b0: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
e8c0: 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63 6f  umn_blob STMT co
e8d0: 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
e8e0: 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62  nt test_column_b
e8f0: 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
e900: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
e910: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
e920: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
e930: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
e940: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
e950: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
e960: 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20  int col;..  int 
e970: 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  len;.  const voi
e980: 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66 28  d *pBlob;..  if(
e990: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
e9a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e9b0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
e9c0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
e9d0: 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
e9e0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
e9f0: 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
ea00: 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
ea10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ea20: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
ea30: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
ea40: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ea50: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
ea60: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
ea70: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
ea80: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
ea90: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
eaa0: 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
eab0: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 42 6c  CL_ERROR;..  pBl
eac0: 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ob = sqlite3_col
ead0: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  umn_blob(pStmt, 
eae0: 63 6f 6c 29 3b 0a 20 20 6c 65 6e 20 3d 20 73 71  col);.  len = sq
eaf0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
eb00: 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  es(pStmt, col);.
eb10: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
eb20: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
eb30: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 70  ewByteArrayObj(p
eb40: 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20 72  Blob, len));.  r
eb50: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
eb60: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
eb70: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
eb80: 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ble STMT column.
eb90: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
eba0: 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20   data in column 
ebb0: 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20  'column' of the 
ebc0: 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74  current row cast
ebd0: 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f   as a double..*/
ebe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
ebf0: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a  _column_double(.
ec00: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
ec10: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
ec20: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
ec30: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
ec40: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
ec50: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
ec60: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
ec70: 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56 61  ol;.  double rVa
ec80: 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
ec90: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
eca0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ecb0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
ecc0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
ecd0: 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
ece0: 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
ecf0: 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
ed00: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
ed10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
ed20: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
ed30: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
ed40: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
ed50: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
ed60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ed70: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
ed80: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
ed90: 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
eda0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
edb0: 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71 6c  R;..  rVal = sql
edc0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
edd0: 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  le(pStmt, col);.
ede0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
edf0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
ee00: 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61 6c  ewDoubleObj(rVal
ee10: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
ee20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
ee30: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 61 74  age: sqlite3_dat
ee40: 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a  a_count STMT .**
ee50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
ee60: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
ee70: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
ee80: 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53   sql statement S
ee90: 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  TMT..*/.static i
eea0: 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75  nt test_data_cou
eeb0: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
eec0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
eed0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
eee0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
eef0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
ef00: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
ef10: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
ef20: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
ef30: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ef40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
ef50: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
ef60: 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
ef70: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
ef80: 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
ef90: 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
efa0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
efb0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
efc0: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
efd0: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
efe0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
eff0: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
f000: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c  CL_ERROR;..  Tcl
f010: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
f020: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
f030: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74 61  Obj(sqlite3_data
f040: 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b  _count(pStmt)));
f050: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
f060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
f070: 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
f080: 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d  _text STMT colum
f090: 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
f0a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
f0b0: 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  cltype STMT colu
f0c0: 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
f0d0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
f0e0: 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ame STMT column.
f0f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
f100: 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20 20  st_stmt_utf8(.  
f110: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
f120: 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  a,        /* Poi
f130: 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
f140: 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
f150: 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54 63  e invoke */.  Tc
f160: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f170: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
f180: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
f190: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
f1a0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
f1b0: 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e    int col;.  con
f1c0: 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e 63  st char *(*xFunc
f1d0: 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
f1e0: 20 69 6e 74 29 20 3d 20 63 6c 69 65 6e 74 44 61   int) = clientDa
f1f0: 74 61 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ta;.  const char
f200: 20 2a 7a 52 65 74 3b 0a 0a 20 20 69 66 28 20 6f   *zRet;..  if( o
f210: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
f220: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f230: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
f240: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
f250: 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
f260: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
f270: 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
f280: 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
f290: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f2a0: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
f2b0: 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
f2c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f2d0: 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
f2e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f2f0: 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
f300: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
f310: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
f320: 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
f330: 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d  _ERROR;.  zRet =
f340: 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
f350: 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29  l);.  if( zRet )
f360: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
f370: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
f380: 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20  r *)zRet, 0);.  
f390: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
f3a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
f3b0: 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
f3c0: 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
f3d0: 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
f3e0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
f3f0: 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
f400: 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
f410: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f420: 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
f430: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
f440: 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a  est_stmt_utf16(.
f450: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
f460: 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ata,     /* Poin
f470: 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
f480: 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
f490: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
f4a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f4b0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
f4c0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
f4d0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
f4e0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
f4f0: 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 54 63 6c    int col;.  Tcl
f500: 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 63 6f  _Obj *pRet;.  co
f510: 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 31  nst void *zName1
f520: 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6;.  const void 
f530: 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65  *(*xFunc)(sqlite
f540: 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 20 3d 20  3_stmt*, int) = 
f550: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 69  clientData;..  i
f560: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
f570: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
f580: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
f590: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
f5a0: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
f5b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f5c0: 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
f5d0: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
f5e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f5f0: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
f600: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
f610: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
f620: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
f630: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
f640: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
f650: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
f660: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
f670: 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
f680: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a   TCL_ERROR;..  z
f690: 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63 28 70  Name16 = xFunc(p
f6a0: 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66  Stmt, col);.  if
f6b0: 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20 20  ( zName16 ){.   
f6c0: 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42   pRet = Tcl_NewB
f6d0: 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d  yteArrayObj(zNam
f6e0: 65 31 36 2c 20 73 71 6c 69 74 65 33 75 74 66 31  e16, sqlite3utf1
f6f0: 36 42 79 74 65 4c 65 6e 28 7a 4e 61 6d 65 31 36  6ByteLen(zName16
f700: 2c 20 2d 31 29 2b 32 29 3b 0a 20 20 20 20 54 63  , -1)+2);.    Tc
f710: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
f720: 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
f730: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
f740: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
f750: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
f760: 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75  mn_int STMT colu
f770: 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
f780: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
f790: 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ytes STMT column
f7a0: 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
f7b0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
f7c0: 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  es16 STMT column
f7d0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
f7e0: 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28  t test_stmt_int(
f7f0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
f800: 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e  Data,    /* Poin
f810: 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
f820: 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
f830: 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
f840: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f850: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
f860: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
f870: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
f880: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
f890: 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
f8a0: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
f8b0: 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 20 3d 20  3_stmt*, int) = 
f8c0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 69  clientData;..  i
f8d0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
f8e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
f8f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
f900: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
f910: 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
f920: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f930: 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
f940: 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
f950: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f960: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
f970: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
f980: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
f990: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
f9a0: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
f9b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
f9c0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
f9d0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
f9e0: 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
f9f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
fa00: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
fa10: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
fa20: 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53 74 6d  ntObj(xFunc(pStm
fa30: 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65 74  t, col)));.  ret
fa40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
fa50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
fa60: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
fa70: 69 74 65 20 3c 66 69 6c 65 6e 61 6d 65 3e 0a 2a  ite <filename>.*
fa80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
fa90: 74 5f 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  t_sqlite3OsOpenR
faa0: 65 61 64 57 72 69 74 65 28 0a 20 20 76 6f 69 64  eadWrite(.  void
fab0: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
fac0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
fad0: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
fae0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
faf0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 4f 73  T objv[].){.  Os
fb00: 46 69 6c 65 20 2a 20 70 46 69 6c 65 3b 0a 20 20  File * pFile;.  
fb10: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 64 75  int rc;.  int du
fb20: 6d 6d 79 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  mmy;.  char zBuf
fb30: 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
fb40: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
fb50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fb60: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
fb70: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
fb80: 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
fb90: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
fba0: 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 22 2c  ]), " filename",
fbb0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
fbc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
fbd0: 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    pFile = sqlite
fbe0: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 4f 73  Malloc(sizeof(Os
fbf0: 46 69 6c 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  File));.  rc = s
fc00: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
fc10: 57 72 69 74 65 28 54 63 6c 5f 47 65 74 53 74 72  Write(Tcl_GetStr
fc20: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 70 46  ing(objv[1]), pF
fc30: 69 6c 65 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  ile, &dummy);.  
fc40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fc50: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  K ){.    sqliteF
fc60: 72 65 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ree(pFile);.    
fc70: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
fc80: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72  terp, (char *)er
fc90: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
fca0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
fcb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fcc0: 20 20 7d 0a 20 20 6d 61 6b 65 50 6f 69 6e 74 65    }.  makePointe
fcd0: 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
fce0: 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20 54 63 6c  f, pFile);.  Tcl
fcf0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
fd00: 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
fd10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fd20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
fd30: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
fd40: 20 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e 0a 2a   <file handle>.*
fd50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
fd60: 74 5f 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65  t_sqlite3OsClose
fd70: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
fd80: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
fd90: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
fda0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
fdb0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
fdc0: 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20 70  .){.  OsFile * p
fdd0: 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  File;.  int rc;.
fde0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
fdf0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
fe00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
fe10: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
fe20: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
fe30: 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
fe40: 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
fe50: 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29 3b 0a  ilehandle", 0);.
fe60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fe70: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
fe80: 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   getFilePointer(
fe90: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
fea0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
feb0: 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  &pFile) ){.    r
fec0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fed0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
fee0: 74 65 33 4f 73 43 6c 6f 73 65 28 70 46 69 6c 65  te3OsClose(pFile
fef0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ff00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
ff10: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
ff20: 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72 6f  rp, (char *)erro
ff30: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
ff40: 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
ff50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ff60: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
ff70: 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  File);.  return 
ff80: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
ff90: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
ffa0: 4f 73 4c 6f 63 6b 20 3c 66 69 6c 65 20 68 61 6e  OsLock <file han
ffb0: 64 6c 65 3e 20 3c 6c 6f 63 6b 74 79 70 65 3e 0a  dle> <locktype>.
ffc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
ffd0: 73 74 5f 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  st_sqlite3OsLock
ffe0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
fff0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
10000 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
10010 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
10020 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
10030 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20 70  .){.  OsFile * p
10040 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  File;.  int rc;.
10050 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
10060 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
10070 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10080 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
10090 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
100a0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
100b0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 0a 20  ing(objv[0]), . 
100c0 20 20 20 20 20 20 20 22 20 66 69 6c 65 68 61 6e         " filehan
100d0 64 6c 65 20 28 53 48 41 52 45 44 7c 52 45 53 45  dle (SHARED|RESE
100e0 52 56 45 44 7c 50 45 4e 44 49 4e 47 7c 45 58 43  RVED|PENDING|EXC
100f0 4c 55 53 49 56 45 29 22 2c 20 30 29 3b 0a 20 20  LUSIVE)", 0);.  
10100 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10110 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
10120 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69 6e  etFilePointer(in
10130 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
10140 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
10150 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
10160 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10170 20 7d 0a 0a 20 20 69 66 28 20 30 3d 3d 73 74 72   }..  if( 0==str
10180 63 6d 70 28 22 53 48 41 52 45 44 22 2c 20 54 63  cmp("SHARED", Tc
10190 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
101a0 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 72 63 20  [2])) ){.    rc 
101b0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
101c0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f  pFile, SHARED_LO
101d0 43 4b 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20  CK);.  }.  else 
101e0 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 52  if( 0==strcmp("R
101f0 45 53 45 52 56 45 44 22 2c 20 54 63 6c 5f 47 65  ESERVED", Tcl_Ge
10200 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
10210 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
10220 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c  lite3OsLock(pFil
10230 65 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e, RESERVED_LOCK
10240 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
10250 28 20 30 3d 3d 73 74 72 63 6d 70 28 22 50 45 4e  ( 0==strcmp("PEN
10260 44 49 4e 47 22 2c 20 54 63 6c 5f 47 65 74 53 74  DING", Tcl_GetSt
10270 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29  ring(objv[2])) )
10280 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
10290 65 33 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  e3OsLock(pFile, 
102a0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 3b 0a 20  PENDING_LOCK);. 
102b0 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 30 3d   }.  else if( 0=
102c0 3d 73 74 72 63 6d 70 28 22 45 58 43 4c 55 53 49  =strcmp("EXCLUSI
102d0 56 45 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  VE", Tcl_GetStri
102e0 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 20 29 7b 0a  ng(objv[2])) ){.
102f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10300 4f 73 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 45 58  OsLock(pFile, EX
10310 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
10320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
10330 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10340 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
10350 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
10360 22 2c 20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  ", .        Tcl_
10370 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
10380 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 22 20 66  ]), .        " f
10390 69 6c 65 68 61 6e 64 6c 65 20 28 53 48 41 52 45  ilehandle (SHARE
103a0 44 7c 52 45 53 45 52 56 45 44 7c 50 45 4e 44 49  D|RESERVED|PENDI
103b0 4e 47 7c 45 58 43 4c 55 53 49 56 45 29 22 2c 20  NG|EXCLUSIVE)", 
103c0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
103d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
103e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
103f0 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
10400 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
10410 28 63 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d  (char *)errorNam
10420 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
10430 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
10440 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10450 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10460 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
10470 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 20  sqlite3OsUnlock 
10480 3c 66 69 6c 65 20 68 61 6e 64 6c 65 3e 0a 2a 2f  <file handle>.*/
10490 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
104a0 5f 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b  _sqlite3OsUnlock
104b0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
104c0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
104d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
104e0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
104f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
10500 0a 29 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 20 70  .){.  OsFile * p
10510 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  File;.  int rc;.
10520 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
10530 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
10540 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10550 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
10560 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
10570 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
10580 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
10590 69 6c 65 68 61 6e 64 6c 65 22 2c 20 30 29 3b 0a  ilehandle", 0);.
105a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
105b0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
105c0 20 67 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   getFilePointer(
105d0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
105e0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
105f0 26 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  &pFile) ){.    r
10600 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10610 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10620 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 69 6c  te3OsUnlock(pFil
10630 65 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 69  e, NO_LOCK);.  i
10640 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10650 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
10660 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
10670 68 61 72 20 2a 29 65 72 72 6f 72 4e 61 6d 65 28  har *)errorName(
10680 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
10690 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
106a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
106b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
106c0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
106d0 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
106e0 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ame.*/.static in
106f0 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 4f 73  t test_sqlite3Os
10700 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 0a 20 20  TempFileName(.  
10710 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10720 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10730 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10740 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10750 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10760 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c    char zFile[SQL
10770 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
10780 45 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  E];.  int rc;.. 
10790 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
107a0 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c  empFileName(zFil
107b0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
107c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
107d0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
107e0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 65 72 72  erp, (char *)err
107f0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
10800 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
10810 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10820 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52   }.  Tcl_AppendR
10830 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 46  esult(interp, zF
10840 69 6c 65 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ile, 0);.  retur
10850 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
10860 2a 2a 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76  ** Usage:  tcl_v
10870 61 72 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52  ariable_type VAR
10880 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  IABLENAME.**.** 
10890 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
108a0 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  of the internal 
108b0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66  representation f
108c0 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  or the.** value 
108d0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 76 61 72  of the given var
108e0 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
108f0 20 69 6e 74 20 74 63 6c 5f 76 61 72 69 61 62 6c   int tcl_variabl
10900 65 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a  e_type(.  void *
10910 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
10920 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10930 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
10940 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
10950 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f  objv[].){.  Tcl_
10960 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28  Obj *pVar;.  if(
10970 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
10980 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10990 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
109a0 2c 20 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20  , "VARIABLE");. 
109b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
109c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20  ROR;.  }.  pVar 
109d0 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28  = Tcl_GetVar2Ex(
109e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
109f0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10a00 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52  0, TCL_LEAVE_ERR
10a10 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61  _MSG);.  if( pVa
10a20 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  r==0 ) return TC
10a30 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70  L_ERROR;.  if( p
10a40 56 61 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a  Var->typePtr ){.
10a50 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
10a60 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
10a70 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56  _NewStringObj(pV
10a80 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
10a90 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72  e, -1));.  }.  r
10aa0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
10ab0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10ac0 69 6e 65 20 73 65 74 73 20 65 6e 74 72 69 65 73  ine sets entries
10ad0 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 3a   in the global :
10ae0 3a 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 28  :sqlite_options(
10af0 29 20 61 72 72 61 79 20 76 61 72 69 61 62 6c 65  ) array variable
10b00 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  .** according to
10b10 20 74 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   the compile-tim
10b20 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
10b30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
10b40 20 20 54 65 73 74 0a 2a 2a 20 70 72 6f 63 65 64    Test.** proced
10b50 75 72 65 73 20 75 73 65 20 74 68 69 73 20 74 6f  ures use this to
10b60 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
10b70 74 65 73 74 73 20 73 68 6f 75 6c 64 20 62 65 20  tests should be 
10b80 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  omitted..*/.stat
10b90 69 63 20 76 6f 69 64 20 73 65 74 5f 6f 70 74 69  ic void set_opti
10ba0 6f 6e 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ons(Tcl_Interp *
10bb0 69 6e 74 65 72 70 29 7b 0a 23 69 66 64 65 66 20  interp){.#ifdef 
10bc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
10bd0 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 54 63 6c 5f  ORIZATION.  Tcl_
10be0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
10bf0 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
10c00 2c 20 22 61 75 74 68 22 2c 20 22 30 22 2c 20 54  , "auth", "0", T
10c10 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
10c20 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74  .#else.  Tcl_Set
10c30 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71  Var2(interp, "sq
10c40 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22  lite_options", "
10c50 61 75 74 68 22 2c 20 22 31 22 2c 20 54 43 4c 5f  auth", "1", TCL_
10c60 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
10c70 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
10c80 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 20  TE_OMIT_VACUUM. 
10c90 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
10ca0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
10cb0 69 6f 6e 73 22 2c 20 22 76 61 63 75 75 6d 22 2c  ions", "vacuum",
10cc0 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c   "0", TCL_GLOBAL
10cd0 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20  _ONLY);.#else.  
10ce0 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65  Tcl_SetVar2(inte
10cf0 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69  rp, "sqlite_opti
10d00 6f 6e 73 22 2c 20 22 76 61 63 75 75 6d 22 2c 20  ons", "vacuum", 
10d10 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "1", TCL_GLOBAL_
10d20 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ONLY);.#endif.#i
10d30 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
10d40 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
10d50 43 4b 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  CK.  Tcl_SetVar2
10d60 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
10d70 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 70 72 6f 67  _options", "prog
10d80 72 65 73 73 22 2c 20 22 30 22 2c 20 54 43 4c 5f  ress", "0", TCL_
10d90 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
10da0 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  lse.  Tcl_SetVar
10db0 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
10dc0 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 70 72 6f  e_options", "pro
10dd0 67 72 65 73 73 22 2c 20 22 31 22 2c 20 54 43 4c  gress", "1", TCL
10de0 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23  _GLOBAL_ONLY);.#
10df0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
10e00 49 54 45 5f 4f 4d 49 54 5f 44 41 54 45 54 49 4d  ITE_OMIT_DATETIM
10e10 45 5f 46 55 4e 43 53 0a 20 20 54 63 6c 5f 53 65  E_FUNCS.  Tcl_Se
10e20 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73  tVar2(interp, "s
10e30 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20  qlite_options", 
10e40 22 64 61 74 65 74 69 6d 65 22 2c 20 22 30 22 2c  "datetime", "0",
10e50 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
10e60 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53  );.#else.  Tcl_S
10e70 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22  etVar2(interp, "
10e80 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
10e90 20 22 64 61 74 65 74 69 6d 65 22 2c 20 22 31 22   "datetime", "1"
10ea0 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
10eb0 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  Y);.#endif.#if d
10ec0 65 66 69 6e 65 64 28 54 48 52 45 41 44 53 41 46  efined(THREADSAF
10ed0 45 29 20 26 26 20 54 48 52 45 41 44 53 41 46 45  E) && THREADSAFE
10ee0 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69  .  Tcl_SetVar2(i
10ef0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
10f00 70 74 69 6f 6e 73 22 2c 20 22 74 68 72 65 61 64  ptions", "thread
10f10 73 61 66 65 22 2c 20 22 31 22 2c 20 54 43 4c 5f  safe", "1", TCL_
10f20 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
10f30 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  lse.  Tcl_SetVar
10f40 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
10f50 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 74 68 72  e_options", "thr
10f60 65 61 64 73 61 66 65 22 2c 20 22 30 22 2c 20 54  eadsafe", "0", T
10f70 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
10f80 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
10f90 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
10fa0 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 54 63 6c  UND_SELECT.  Tcl
10fb0 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
10fc0 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
10fd0 22 2c 20 22 63 6f 6d 70 6f 75 6e 64 22 2c 20 22  ", "compound", "
10fe0 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  0", TCL_GLOBAL_O
10ff0 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63  NLY);.#else.  Tc
11000 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
11010 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
11020 73 22 2c 20 22 63 6f 6d 70 6f 75 6e 64 22 2c 20  s", "compound", 
11030 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "1", TCL_GLOBAL_
11040 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ONLY);.#endif.#i
11050 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
11060 5f 54 52 49 47 47 45 52 0a 20 20 54 63 6c 5f 53  _TRIGGER.  Tcl_S
11070 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22  etVar2(interp, "
11080 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
11090 20 22 74 72 69 67 67 65 72 22 2c 20 22 30 22 2c   "trigger", "0",
110a0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
110b0 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53  );.#else.  Tcl_S
110c0 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22  etVar2(interp, "
110d0 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
110e0 20 22 74 72 69 67 67 65 72 22 2c 20 22 31 22 2c   "trigger", "1",
110f0 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
11100 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
11110 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11120 57 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  W.  Tcl_SetVar2(
11130 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
11140 6f 70 74 69 6f 6e 73 22 2c 20 22 76 69 65 77 22  options", "view"
11150 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  , "0", TCL_GLOBA
11160 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20  L_ONLY);.#else. 
11170 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
11180 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
11190 69 6f 6e 73 22 2c 20 22 76 69 65 77 22 2c 20 22  ions", "view", "
111a0 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  1", TCL_GLOBAL_O
111b0 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  NLY);.#endif.#if
111c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
111d0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
111e0 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e    Tcl_SetVar2(in
111f0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70  terp, "sqlite_op
11200 74 69 6f 6e 73 22 2c 20 22 69 6e 74 65 67 72 69  tions", "integri
11210 74 79 63 6b 22 2c 20 22 30 22 2c 20 54 43 4c 5f  tyck", "0", TCL_
11220 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
11230 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  lse.  Tcl_SetVar
11240 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
11250 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 69 6e 74  e_options", "int
11260 65 67 72 69 74 79 63 6b 22 2c 20 22 31 22 2c 20  egrityck", "1", 
11270 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
11280 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
11290 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
112a0 49 47 4e 5f 4b 45 59 0a 20 20 54 63 6c 5f 53 65  IGN_KEY.  Tcl_Se
112b0 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73  tVar2(interp, "s
112c0 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20  qlite_options", 
112d0 22 66 6f 72 65 69 67 6e 6b 65 79 22 2c 20 22 30  "foreignkey", "0
112e0 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
112f0 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c  LY);.#else.  Tcl
11300 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  _SetVar2(interp,
11310 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73   "sqlite_options
11320 22 2c 20 22 66 6f 72 65 69 67 6e 6b 65 79 22 2c  ", "foreignkey",
11330 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c   "1", TCL_GLOBAL
11340 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23  _ONLY);.#endif.#
11350 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
11360 54 5f 43 4f 4e 46 4c 49 43 54 5f 43 4c 41 55 53  T_CONFLICT_CLAUS
11370 45 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  E.  Tcl_SetVar2(
11380 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
11390 6f 70 74 69 6f 6e 73 22 2c 20 22 63 6f 6e 66 6c  options", "confl
113a0 69 63 74 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47  ict", "0", TCL_G
113b0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c  LOBAL_ONLY);.#el
113c0 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  se.  Tcl_SetVar2
113d0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
113e0 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 63 6f 6e 66  _options", "conf
113f0 6c 69 63 74 22 2c 20 22 31 22 2c 20 54 43 4c 5f  lict", "1", TCL_
11400 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
11410 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
11420 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
11430 5f 50 4f 49 4e 54 0a 20 20 54 63 6c 5f 53 65 74  _POINT.  Tcl_Set
11440 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71  Var2(interp, "sq
11450 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22  lite_options", "
11460 66 6c 6f 61 74 69 6e 67 70 6f 69 6e 74 22 2c 20  floatingpoint", 
11470 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "0", TCL_GLOBAL_
11480 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54  ONLY);.#else.  T
11490 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72  cl_SetVar2(inter
114a0 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f  p, "sqlite_optio
114b0 6e 73 22 2c 20 22 66 6c 6f 61 74 69 6e 67 70 6f  ns", "floatingpo
114c0 69 6e 74 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47  int", "1", TCL_G
114d0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  LOBAL_ONLY);.#en
114e0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
114f0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
11500 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e    Tcl_SetVar2(in
11510 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70  terp, "sqlite_op
11520 74 69 6f 6e 73 22 2c 20 22 6d 65 6d 6f 72 79 64  tions", "memoryd
11530 62 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f  b", "0", TCL_GLO
11540 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65  BAL_ONLY);.#else
11550 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69  .  Tcl_SetVar2(i
11560 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
11570 70 74 69 6f 6e 73 22 2c 20 22 6d 65 6d 6f 72 79  ptions", "memory
11580 64 62 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c  db", "1", TCL_GL
11590 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64  OBAL_ONLY);.#end
115a0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
115b0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63  _OMIT_UTF16.  Tc
115c0 6c 5f 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  l_SetVar2(interp
115d0 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e  , "sqlite_option
115e0 73 22 2c 20 22 75 74 66 31 36 22 2c 20 22 30 22  s", "utf16", "0"
115f0 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
11600 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f  Y);.#else.  Tcl_
11610 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
11620 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
11630 2c 20 22 75 74 66 31 36 22 2c 20 22 31 22 2c 20  , "utf16", "1", 
11640 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
11650 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
11660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
11670 41 49 4e 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  AIN.  Tcl_SetVar
11680 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
11690 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 65 78 70  e_options", "exp
116a0 6c 61 69 6e 22 2c 20 22 30 22 2c 20 54 43 4c 5f  lain", "0", TCL_
116b0 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
116c0 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  lse.  Tcl_SetVar
116d0 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
116e0 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 65 78 70  e_options", "exp
116f0 6c 61 69 6e 22 2c 20 22 31 22 2c 20 54 43 4c 5f  lain", "1", TCL_
11700 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
11710 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
11720 54 45 5f 4f 4d 49 54 5f 54 43 4c 5f 56 41 52 49  TE_OMIT_TCL_VARI
11730 41 42 4c 45 0a 20 20 54 63 6c 5f 53 65 74 56 61  ABLE.  Tcl_SetVa
11740 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  r2(interp, "sqli
11750 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 74 63  te_options", "tc
11760 6c 76 61 72 22 2c 20 22 30 22 2c 20 54 43 4c 5f  lvar", "0", TCL_
11770 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
11780 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  lse.  Tcl_SetVar
11790 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
117a0 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 74 63 6c  e_options", "tcl
117b0 76 61 72 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47  var", "1", TCL_G
117c0 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  LOBAL_ONLY);.#en
117d0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
117e0 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45  E_OMIT_BLOB_LITE
117f0 52 41 4c 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  RAL.  Tcl_SetVar
11800 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
11810 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 62 6c 6f  e_options", "blo
11820 62 6c 69 74 22 2c 20 22 30 22 2c 20 54 43 4c 5f  blit", "0", TCL_
11830 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
11840 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72  lse.  Tcl_SetVar
11850 32 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  2(interp, "sqlit
11860 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22 62 6c 6f  e_options", "blo
11870 62 6c 69 74 22 2c 20 22 31 22 2c 20 54 43 4c 5f  blit", "1", TCL_
11880 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65  GLOBAL_ONLY);.#e
11890 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
118a0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
118b0 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e    Tcl_SetVar2(in
118c0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70  terp, "sqlite_op
118d0 74 69 6f 6e 73 22 2c 20 22 72 65 69 6e 64 65 78  tions", "reindex
118e0 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "0", TCL_GLOB
118f0 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73 65 0a  AL_ONLY);.#else.
11900 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e    Tcl_SetVar2(in
11910 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70  terp, "sqlite_op
11920 74 69 6f 6e 73 22 2c 20 22 72 65 69 6e 64 65 78  tions", "reindex
11930 22 2c 20 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42  ", "1", TCL_GLOB
11940 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66  AL_ONLY);.#endif
11950 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
11960 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
11970 20 54 63 6c 5f 53 65 74 56 61 72 32 28 69 6e 74   Tcl_SetVar2(int
11980 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 74  erp, "sqlite_opt
11990 69 6f 6e 73 22 2c 20 22 61 6c 74 65 72 74 61 62  ions", "altertab
119a0 6c 65 22 2c 20 22 30 22 2c 20 54 43 4c 5f 47 4c  le", "0", TCL_GL
119b0 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6c 73  OBAL_ONLY);.#els
119c0 65 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28  e.  Tcl_SetVar2(
119d0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
119e0 6f 70 74 69 6f 6e 73 22 2c 20 22 61 6c 74 65 72  options", "alter
119f0 74 61 62 6c 65 22 2c 20 22 31 22 2c 20 54 43 4c  table", "1", TCL
11a00 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23  _GLOBAL_ONLY);.#
11a10 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
11a20 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
11a30 52 45 4d 45 4e 54 0a 20 20 54 63 6c 5f 53 65 74  REMENT.  Tcl_Set
11a40 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71  Var2(interp, "sq
11a50 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22  lite_options", "
11a60 61 75 74 6f 69 6e 63 22 2c 20 22 30 22 2c 20 54  autoinc", "0", T
11a70 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
11a80 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74  .#else.  Tcl_Set
11a90 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71  Var2(interp, "sq
11aa0 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22  lite_options", "
11ab0 61 75 74 6f 69 6e 63 22 2c 20 22 31 22 2c 20 54  autoinc", "1", T
11ac0 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
11ad0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
11ae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11af0 56 41 43 55 55 4d 0a 20 20 54 63 6c 5f 53 65 74  VACUUM.  Tcl_Set
11b00 56 61 72 32 28 69 6e 74 65 72 70 2c 20 22 73 71  Var2(interp, "sq
11b10 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c 20 22  lite_options", "
11b20 61 75 74 6f 76 61 63 75 75 6d 22 2c 20 22 30 22  autovacuum", "0"
11b30 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
11b40 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f  Y);.#else.  Tcl_
11b50 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
11b60 22 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22  "sqlite_options"
11b70 2c 20 22 61 75 74 6f 76 61 63 75 75 6d 22 2c 20  , "autovacuum", 
11b80 22 31 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f  "1", TCL_GLOBAL_
11b90 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  ONLY);.#endif /*
11ba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11bb0 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 69 66 20 21  OVACUUM */.#if !
11bc0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
11bd0 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 43 55  EFAULT_AUTOVACCU
11be0 4d 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46  M) || SQLITE_DEF
11bf0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
11c00 3d 30 0a 20 20 54 63 6c 5f 53 65 74 56 61 72 32  =0.  Tcl_SetVar2
11c10 28 69 6e 74 65 72 70 2c 22 73 71 6c 69 74 65 5f  (interp,"sqlite_
11c20 6f 70 74 69 6f 6e 73 22 2c 22 64 65 66 61 75 6c  options","defaul
11c30 74 5f 61 75 74 6f 76 61 63 75 75 6d 22 2c 22 30  t_autovacuum","0
11c40 22 2c 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  ",TCL_GLOBAL_ONL
11c50 59 29 3b 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f  Y);.#else.  Tcl_
11c60 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 22  SetVar2(interp,"
11c70 73 71 6c 69 74 65 5f 6f 70 74 69 6f 6e 73 22 2c  sqlite_options",
11c80 22 64 65 66 61 75 6c 74 5f 61 75 74 6f 76 61 63  "default_autovac
11c90 75 75 6d 22 2c 22 31 22 2c 54 43 4c 5f 47 4c 4f  uum","1",TCL_GLO
11ca0 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69  BAL_ONLY);.#endi
11cb0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  f.}../*.** Regis
11cc0 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74  ter commands wit
11cd0 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  h the TCL interp
11ce0 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71  reter..*/.int Sq
11cf0 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54  litetest1_Init(T
11d00 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11d10 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  p){.  extern int
11d20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
11d30 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
11d40 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  int sqlite3_inte
11d50 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65  rrupt_count;.  e
11d60 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
11d70 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  3_open_file_coun
11d80 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
11d90 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75  sqlite3_sort_cou
11da0 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
11db0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
11dc0 5f 74 69 6d 65 3b 0a 20 20 73 74 61 74 69 63 20  _time;.  static 
11dd0 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
11de0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
11df0 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72  Tcl_CmdProc *xPr
11e00 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d  oc;.  } aCmd[] =
11e10 20 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74   {.     { "sqlit
11e20 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c  e3_mprintf_int",
11e30 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
11e40 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
11e50 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20  _mprintf_int    
11e60 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
11e70 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
11e80 22 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ",         (Tcl_
11e90 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
11ea0 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20  _mprintf_int64  
11eb0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
11ec0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c  e3_mprintf_str",
11ed0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
11ee0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
11ef0 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20  _mprintf_str    
11f00 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
11f10 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
11f20 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  ly",       (Tcl_
11f30 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
11f40 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79  _mprintf_stronly
11f50 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
11f60 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
11f70 65 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  e",        (Tcl_
11f80 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
11f90 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20  _mprintf_double 
11fa0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
11fb0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
11fc0 64 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  d",        (Tcl_
11fd0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
11fe0 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20  _mprintf_scaled 
11ff0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
12000 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
12010 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
12020 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70  CmdProc*)test_mp
12030 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d  rintf_z        }
12040 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
12050 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
12060 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43  wid",     (Tcl_C
12070 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73  mdProc*)test_las
12080 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c  t_rowid       },
12090 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
120a0 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20  _exec_printf",  
120b0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
120c0 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
120d0 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a  _printf      },.
120e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
120f0 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
12100 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ",      (Tcl_Cmd
12110 50 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74  Proc*)test_get_t
12120 61 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 20  able_printf },. 
12130 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
12140 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20  lose",          
12150 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
12160 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74  roc*)sqlite_test
12170 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20  _close     },.  
12180 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
12190 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  eate_function", 
121a0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
121b0 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f  oc*)test_create_
121c0 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20  function  },.   
121d0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
121e0 61 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20  ate_aggregate", 
121f0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
12200 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61  c*)test_create_a
12210 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20  ggregate },.    
12220 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73   { "sqlite_regis
12230 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  ter_test_functio
12240 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  n", (Tcl_CmdProc
12250 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  *)test_register_
12260 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20  func    },.     
12270 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22  { "sqlite_abort"
12280 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12290 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
122a0 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20  )sqlite_abort   
122b0 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66         },.#ifdef
122c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
122d0 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 6d 61 6c     { "sqlite_mal
122e0 6c 6f 63 5f 66 61 69 6c 22 2c 20 20 20 20 20 20  loc_fail",      
122f0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
12300 6f 63 2a 29 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f  oc*)sqlite_mallo
12310 63 5f 66 61 69 6c 20 20 20 20 7d 2c 0a 20 20 20  c_fail    },.   
12320 20 20 7b 20 22 73 71 6c 69 74 65 5f 6d 61 6c 6c    { "sqlite_mall
12330 6f 63 5f 73 74 61 74 22 2c 20 20 20 20 20 20 20  oc_stat",       
12340 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
12350 63 2a 29 73 71 6c 69 74 65 5f 6d 61 6c 6c 6f 63  c*)sqlite_malloc
12360 5f 73 74 61 74 20 20 20 20 7d 2c 0a 23 65 6e 64  _stat    },.#end
12370 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
12380 65 5f 62 69 6e 64 22 2c 20 20 20 20 20 20 20 20  e_bind",        
12390 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
123a0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 69  CmdProc*)test_bi
123b0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  nd             }
123c0 2c 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b 70  ,.     { "breakp
123d0 6f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  oint",          
123e0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
123f0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72 65  mdProc*)test_bre
12400 61 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c  akpoint       },
12410 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
12420 5f 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20 20  _key",          
12430 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
12440 64 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65 79 20  dProc*)test_key 
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
12460 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
12470 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20  rekey",         
12480 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
12490 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b 65 79  Proc*)test_rekey
124a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
124b0 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72   };.  static str
124c0 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
124d0 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
124e0 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72  _ObjCmdProc *xPr
124f0 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63  oc;.     void *c
12500 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61  lientData;.  } a
12510 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  ObjCmd[] = {.   
12520 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
12530 64 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  d_int",         
12540 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69       test_bind_i
12550 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20  nt,      0 },.  
12560 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
12570 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  nd_int64",      
12580 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
12590 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20  int64,    0 },. 
125a0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
125b0 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  ind_double",    
125c0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
125d0 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a  _double,   0 },.
125e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
125f0 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20  bind_null",     
12600 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
12610 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c  d_null     ,0 },
12620 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
12630 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20  _bind_text",    
12640 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
12650 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d  nd_text     ,0 }
12660 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
12670 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20  3_bind_text16", 
12680 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
12690 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20  ind_text16   ,0 
126a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
126b0 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20  e3_bind_blob",  
126c0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
126d0 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30  bind_blob     ,0
126e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
126f0 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
12700 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74  er_count",  test
12710 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
12720 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20  count, 0},.     
12730 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
12740 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c  parameter_name",
12750 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72     test_bind_par
12760 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d  ameter_name,  0}
12770 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
12780 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
12790 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62  _index",  test_b
127a0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
127b0 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  dex, 0},.     { 
127c0 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  "sqlite3_errcode
127d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
127e0 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20   test_errcode   
127f0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
12800 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   "sqlite3_errmsg
12810 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
12820 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20    test_errmsg   
12830 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
12840 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  { "sqlite3_errms
12850 67 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  g16",           
12860 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36     test_errmsg16
12870 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
12880 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e   { "sqlite3_open
12890 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
128a0 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20      test_open   
128b0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
128c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
128d0 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  n16",           
128e0 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36       test_open16
128f0 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
12900 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
12910 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20 20 20  mplete16",      
12920 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70 6c        test_compl
12930 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a 0a  ete16    ,0 },..
12940 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
12950 70 72 65 70 61 72 65 22 2c 20 20 20 20 20 20 20  prepare",       
12960 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65          test_pre
12970 70 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d 2c  pare       ,0 },
12980 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
12990 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20 20 20  _prepare16",    
129a0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
129b0 65 70 61 72 65 31 36 20 20 20 20 20 2c 30 20 7d  epare16     ,0 }
129c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
129d0 33 5f 66 69 6e 61 6c 69 7a 65 22 2c 20 20 20 20  3_finalize",    
129e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 66            test_f
129f0 69 6e 61 6c 69 7a 65 20 20 20 20 20 20 2c 30 20  inalize      ,0 
12a00 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
12a10 65 33 5f 72 65 73 65 74 22 2c 20 20 20 20 20 20  e3_reset",      
12a20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
12a30 72 65 73 65 74 20 20 20 20 20 20 20 20 20 2c 30  reset         ,0
12a40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
12a50 74 65 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20  te3_changes",   
12a60 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
12a70 5f 63 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c  _changes       ,
12a80 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
12a90 69 74 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20  ite3_step",     
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
12ab0 74 5f 73 74 65 70 20 20 20 20 20 20 20 20 20 20  t_step          
12ac0 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73  ,0 },..     /* s
12ad0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28  qlite3_column_*(
12ae0 29 20 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20  ) API */.     { 
12af0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
12b00 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  count",         
12b10 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75   test_column_cou
12b20 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  nt  ,0 },.     {
12b30 20 22 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63   "sqlite3_data_c
12b40 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
12b50 20 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e    test_data_coun
12b60 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  t    ,0 },.     
12b70 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
12b80 6e 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20  n_type",        
12b90 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74     test_column_t
12ba0 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  ype   ,0 },.    
12bb0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
12bc0 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  mn_blob",       
12bd0 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
12be0 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20  blob   ,0 },.   
12bf0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
12c00 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  umn_double",    
12c10 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
12c20 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20  _double ,0 },.  
12c30 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
12c40 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20  lumn_int64",    
12c50 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
12c60 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20  n_int64  ,0 },. 
12c70 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
12c80 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 20  olumn_int",     
12c90 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74     test_stmt_int
12ca0 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,   sqlite3_colu
12cb0 6d 6e 5f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a  mn_int       },.
12cc0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
12cd0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20  column_bytes",  
12ce0 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e      test_stmt_in
12cf0 74 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c  t,   sqlite3_col
12d00 75 6d 6e 5f 62 79 74 65 73 20 20 20 20 20 7d 2c  umn_bytes     },
12d10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
12d20 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22  _column_bytes16"
12d30 2c 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69  ,    test_stmt_i
12d40 6e 74 2c 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  nt,   sqlite3_co
12d50 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 20 20 7d  lumn_bytes16   }
12d60 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
12d70 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20  3_column_text", 
12d80 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f        test_stmt_
12d90 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33 5f 63  utf8,  sqlite3_c
12da0 6f 6c 75 6d 6e 5f 74 65 78 74 20 20 20 20 20 20  olumn_text      
12db0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
12dc0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
12dd0 70 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74  pe",   test_stmt
12de0 5f 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33 5f  _utf8,  sqlite3_
12df0 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20  column_decltype 
12e00 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
12e10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22  te3_column_name"
12e20 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d  ,       test_stm
12e30 74 5f 75 74 66 38 2c 20 20 73 71 6c 69 74 65 33  t_utf8,  sqlite3
12e40 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 20 20 20  _column_name    
12e50 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
12e60 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
12e70 31 36 22 2c 20 20 20 20 20 74 65 73 74 5f 73 74  16",     test_st
12e80 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74 65  mt_utf16, sqlite
12e90 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 20  3_column_text16 
12ea0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
12eb0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
12ec0 6c 74 79 70 65 31 36 22 2c 20 74 65 73 74 5f 73  ltype16", test_s
12ed0 74 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69 74  tmt_utf16, sqlit
12ee0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
12ef0 70 65 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73  pe16},.     { "s
12f00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
12f10 6d 65 31 36 22 2c 20 20 20 20 20 74 65 73 74 5f  me16",     test_
12f20 73 74 6d 74 5f 75 74 66 31 36 2c 20 73 71 6c 69  stmt_utf16, sqli
12f30 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31  te3_column_name1
12f40 36 20 20 20 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a  6    },..     /*
12f50 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20   Functions from 
12f60 6f 73 2e 68 20 2a 2f 0a 20 20 20 20 20 7b 20 22  os.h */.     { "
12f70 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
12f80 64 57 72 69 74 65 22 2c 74 65 73 74 5f 73 71 6c  dWrite",test_sql
12f90 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
12fa0 69 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ite, 0 },.     {
12fb0 20 22 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65   "sqlite3OsClose
12fc0 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 73  ",        test_s
12fd0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 2c 20 30  qlite3OsClose, 0
12fe0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
12ff0 74 65 33 4f 73 4c 6f 63 6b 22 2c 20 20 20 20 20  te3OsLock",     
13000 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33      test_sqlite3
13010 4f 73 4c 6f 63 6b 2c 20 30 20 7d 2c 0a 20 20 20  OsLock, 0 },.   
13020 20 20 7b 20 22 73 71 6c 69 74 65 33 4f 73 54 65    { "sqlite3OsTe
13030 6d 70 46 69 6c 65 4e 61 6d 65 22 2c 20 74 65 73  mpFileName", tes
13040 74 5f 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46  t_sqlite3OsTempF
13050 69 6c 65 4e 61 6d 65 2c 20 30 20 7d 2c 0a 20 20  ileName, 0 },.  
13060 20 0a 20 20 20 20 20 2f 2a 20 43 75 73 74 6f 6d   .     /* Custom
13070 20 74 65 73 74 20 69 6e 74 65 72 66 61 63 65 73   test interfaces
13080 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   */.     { "sqli
13090 74 65 33 4f 73 55 6e 6c 6f 63 6b 22 2c 20 20 20  te3OsUnlock",   
130a0 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74        test_sqlit
130b0 65 33 4f 73 55 6e 6c 6f 63 6b 2c 20 30 20 20 20  e3OsUnlock, 0   
130c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
130d0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 20  test_collate",  
130e0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c 61        test_colla
130f0 74 65 2c 20 30 20 20 20 20 20 20 20 20 20 20 20  te, 0           
13100 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
13110 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
13120 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  ded", test_colla
13130 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20 20 20  te_needed, 0    
13140 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
13150 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
13160 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e 63 74        test_funct
13170 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20 20 20  ion, 0          
13180 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
13190 74 65 33 5f 63 72 61 73 68 70 61 72 61 6d 73 22  te3_crashparams"
131a0 2c 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  ,     sqlite3_cr
131b0 61 73 68 70 61 72 61 6d 73 2c 20 30 20 20 20 20  ashparams, 0    
131c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
131d0 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 22  te3_test_errstr"
131e0 2c 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74  ,     test_errst
131f0 72 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  r, 0            
13200 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f   },.     { "tcl_
13210 76 61 72 69 61 62 6c 65 5f 74 79 70 65 22 2c 20  variable_type", 
13220 20 20 20 20 20 20 74 63 6c 5f 76 61 72 69 61 62        tcl_variab
13230 6c 65 5f 74 79 70 65 2c 20 30 20 20 20 20 20 20  le_type, 0      
13240 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
13250 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
13260 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61 63 65 3b  qlite3_os_trace;
13270 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ..  for(i=0; i<s
13280 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65  izeof(aCmd)/size
13290 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b  of(aCmd[0]); i++
132a0 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ){.    Tcl_Creat
132b0 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
132c0 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20   aCmd[i].zName, 
132d0 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30  aCmd[i].xProc, 0
132e0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  , 0);.  }.  for(
132f0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f  i=0; i<sizeof(aO
13300 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f  bjCmd)/sizeof(aO
13310 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  bjCmd[0]); i++){
13320 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
13330 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
13340 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61  , aObjCmd[i].zNa
13350 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f 62  me, .        aOb
13360 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61  jCmd[i].xProc, a
13370 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74  ObjCmd[i].client
13380 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Data, 0);.  }.  
13390 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
133a0 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 65 61 72  rp, "sqlite_sear
133b0 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  ch_count", .    
133c0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
133d0 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20  3_search_count, 
133e0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
133f0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
13400 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 6f 72  erp, "sqlite_sor
13410 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20  t_count", .     
13420 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
13430 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54 43 4c  _sort_count, TCL
13440 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
13450 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
13460 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72 72  , "sqlite_interr
13470 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  upt_count", .   
13480 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
13490 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
134a0 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
134b0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
134c0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
134d0 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74  _open_file_count
134e0 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
134f0 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66  )&sqlite3_open_f
13500 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ile_count, TCL_L
13510 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
13520 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
13530 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f  "sqlite_current_
13540 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28 63  time", .      (c
13550 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63 75  har*)&sqlite3_cu
13560 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c 5f  rrent_time, TCL_
13570 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
13580 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
13590 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63   "sqlite_os_trac
135a0 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
135b0 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 72 61  )&sqlite3_os_tra
135c0 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ce, TCL_LINK_INT
135d0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
135e0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
135f0 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
13600 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ue",.      (char
13610 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63  *)&sqlite_static
13620 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c  _bind_value, TCL
13630 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
13640 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
13650 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d  erp, "sqlite_tem
13660 70 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20  p_directory",.  
13670 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
13680 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
13690 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  ry, TCL_LINK_STR
136a0 49 4e 47 29 3b 0a 20 20 73 65 74 5f 6f 70 74 69  ING);.  set_opti
136b0 6f 6e 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 72  ons(interp);.  r
136c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.