/ Hex Artifact Content
Login

Artifact a711473c79e812e4082fbf045ed6c18c99c16058:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 2d 30 33 2d 30 31  /*.** 2016-03-01
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 20 43 6f 64 65 20 66 6f 72 20 74 65 73 74  ** Code for test
0180: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20  ing the virtual 
0190: 74 61 62 6c 65 20 78 42 65 73 74 49 6e 64 65 78  table xBestIndex
01a0: 20 6d 65 74 68 6f 64 20 61 6e 64 20 74 68 65 20   method and the 
01b0: 71 75 65 72 79 0a 2a 2a 20 70 6c 61 6e 6e 65 72  query.** planner
01c0: 2e 0a 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53  ..*/.../*.** INS
01d0: 54 52 55 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20  TRUCTIONS.**.** 
01e0: 54 68 69 73 20 6d 6f 64 75 6c 65 20 65 78 70 6f  This module expo
01f0: 72 74 73 20 61 20 73 69 6e 67 6c 65 20 74 63 6c  rts a single tcl
0200: 20 63 6f 6d 6d 61 6e 64 20 2d 20 5b 72 65 67 69   command - [regi
0210: 73 74 65 72 5f 74 63 6c 5f 6d 6f 64 75 6c 65 5d  ster_tcl_module]
0220: 2e 20 57 68 65 6e 0a 2a 2a 20 69 6e 76 6f 6b 65  . When.** invoke
0230: 64 2c 20 69 74 20 72 65 67 69 73 74 65 72 73 20  d, it registers 
0240: 61 20 73 70 65 63 69 61 6c 20 76 69 72 74 75 61  a special virtua
0250: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20 77  l table module w
0260: 69 74 68 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ith a database.*
0270: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  * connection..**
0280: 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20  .** The virtual 
0290: 74 61 62 6c 65 20 69 73 20 63 75 72 72 65 6e 74  table is current
02a0: 6c 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 41 6e  ly read-only. An
02b0: 64 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  d always returns
02c0: 20 7a 65 72 6f 20 72 6f 77 73 2e 0a 2a 2a 20 49   zero rows..** I
02d0: 74 20 69 73 20 63 72 65 61 74 65 64 20 77 69 74  t is created wit
02e0: 68 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d  h a single argum
02f0: 65 6e 74 20 2d 20 74 68 65 20 6e 61 6d 65 20 6f  ent - the name o
0300: 66 20 61 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  f a Tcl command 
0310: 2d 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a  - as.** follows:
0320: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
0330: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 78 31  VIRTUAL TABLE x1
0340: 20 55 53 49 4e 47 20 74 63 6c 28 74 63 6c 5f 63   USING tcl(tcl_c
0350: 6f 6d 6d 61 6e 64 29 3b 0a 2a 2a 0a 2a 2a 20 54  ommand);.**.** T
0360: 68 65 20 63 6f 6d 6d 61 6e 64 20 5b 74 63 6c 5f  he command [tcl_
0370: 63 6f 6d 6d 61 6e 64 5d 20 69 73 20 69 6e 76 6f  command] is invo
0380: 6b 65 64 20 77 68 65 6e 20 74 68 65 20 74 61 62  ked when the tab
0390: 6c 65 20 69 73 20 66 69 72 73 74 20 63 72 65 61  le is first crea
03a0: 74 65 64 20 28 6f 72 0a 2a 2a 20 63 6f 6e 6e 65  ted (or.** conne
03b0: 63 74 65 64 29 2c 20 77 68 65 6e 20 74 68 65 20  cted), when the 
03c0: 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74  xBestIndex() met
03d0: 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hod is invoked a
03e0: 6e 64 20 77 68 65 6e 20 74 68 65 20 78 46 69 6c  nd when the xFil
03f0: 74 65 72 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  ter().** method 
0400: 69 73 20 63 61 6c 6c 65 64 2e 20 57 68 65 6e 20  is called. When 
0410: 69 74 20 69 73 20 63 72 65 61 74 65 64 20 28 6f  it is created (o
0420: 72 20 63 6f 6e 6e 65 63 74 65 64 29 2c 20 69 74  r connected), it
0430: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 0a 2a   is invoked as.*
0440: 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  * follows:.**.**
0450: 20 20 20 74 63 6c 5f 63 6f 6d 6d 61 6e 64 20 78     tcl_command x
0460: 43 6f 6e 6e 65 63 74 0a 2a 2a 0a 2a 2a 20 49 6e  Connect.**.** In
0470: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 72   this case the r
0480: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
0490: 68 65 20 73 63 72 69 70 74 20 69 73 20 70 61 73  he script is pas
04a0: 73 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 73 71  sed to the.** sq
04b0: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
04c0: 61 62 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ab() function to
04d0: 20 63 72 65 61 74 65 20 74 68 65 20 76 69 72 74   create the virt
04e0: 75 61 6c 20 74 61 62 6c 65 20 73 63 68 65 6d 61  ual table schema
04f0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
0500: 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65   xBestIndex() me
0510: 74 68 6f 64 20 69 73 20 63 61 6c 6c 65 64 20 62  thod is called b
0520: 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20 54 63  y SQLite, the Tc
0530: 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20  l command is.** 
0540: 69 6e 76 6f 6b 65 64 20 61 73 3a 0a 2a 2a 0a 2a  invoked as:.**.*
0550: 2a 20 20 20 74 63 6c 5f 63 6f 6d 6d 61 6e 64 20  *   tcl_command 
0560: 78 42 65 73 74 49 6e 64 65 78 20 43 4f 4e 53 54  xBestIndex CONST
0570: 52 41 49 4e 54 53 20 4f 52 44 45 52 42 59 20 4d  RAINTS ORDERBY M
0580: 41 53 4b 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  ASK.**.** where 
0590: 43 4f 4e 53 54 52 41 49 4e 54 53 20 69 73 20 61  CONSTRAINTS is a
05a0: 20 74 63 6c 20 72 65 70 72 65 73 65 6e 74 61 74   tcl representat
05b0: 69 6f 6e 20 6f 66 20 74 68 65 20 61 43 6f 6e 73  ion of the aCons
05c0: 74 72 61 69 6e 74 73 5b 5d 20 61 72 72 61 79 2c  traints[] array,
05d0: 0a 2a 2a 20 4f 52 44 45 52 42 59 20 69 73 20 61  .** ORDERBY is a
05e0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
05f0: 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  of the contents 
0600: 6f 66 20 74 68 65 20 61 4f 72 64 65 72 42 79 5b  of the aOrderBy[
0610: 5d 20 61 72 72 61 79 20 61 6e 64 0a 2a 2a 20 4d  ] array and.** M
0620: 41 53 4b 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ASK is a copy of
0630: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
0640: 6e 66 6f 2e 63 6f 6c 55 73 65 64 2e 20 46 6f 72  nfo.colUsed. For
0650: 20 65 78 61 6d 70 6c 65 20 69 66 20 74 68 65 20   example if the 
0660: 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65  virtual.** table
0670: 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 3a   is declared as:
0680: 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20  .**.**   CREATE 
0690: 54 41 42 4c 45 20 78 31 28 61 2c 20 62 2c 20 63  TABLE x1(a, b, c
06a0: 29 0a 2a 2a 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ).**.** and the 
06b0: 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
06c0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
06d0: 78 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  x1 WHERE a=? AND
06e0: 20 63 3c 3f 20 4f 52 44 45 52 20 42 59 20 62 2c   c<? ORDER BY b,
06f0: 20 63 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74   c;.**.** then t
0700: 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69  he Tcl command i
0710: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 74 63 6c 5f 63  s:.**.**   tcl_c
0720: 6f 6d 6d 61 6e 64 20 78 42 65 73 74 49 6e 64 65  ommand xBestInde
0730: 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 5c 0a 2a 2a 20 20 20 20 20 7b 7b 6f 70     \.**     {{op
0760: 20 65 71 20 63 6f 6c 75 6d 6e 20 30 20 75 73 61   eq column 0 usa
0770: 62 6c 65 20 31 7d 20 7b 6f 70 20 6c 74 20 63 6f  ble 1} {op lt co
0780: 6c 75 6d 6e 20 32 20 75 73 61 62 6c 65 20 31 7d  lumn 2 usable 1}
0790: 7d 20 5c 0a 2a 2a 20 20 20 20 20 7b 7b 63 6f 6c  } \.**     {{col
07a0: 75 6d 6e 20 31 20 64 65 73 63 20 30 7d 20 7b 63  umn 1 desc 0} {c
07b0: 6f 6c 75 6d 6e 20 32 20 64 65 73 63 20 30 7d 7d  olumn 2 desc 0}}
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07d0: 20 5c 0a 2a 2a 20 20 20 20 20 37 0a 2a 2a 0a 2a   \.**     7.**.*
07e0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
07f0: 75 65 20 6f 66 20 74 68 65 20 73 63 72 69 70 74  ue of the script
0800: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6b 65   is a list of ke
0810: 79 2d 76 61 6c 75 65 20 70 61 69 72 73 20 75 73  y-value pairs us
0820: 65 64 20 74 6f 0a 2a 2a 20 70 6f 70 75 6c 61 74  ed to.** populat
0830: 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 65  e the output fie
0840: 6c 64 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  lds of the sqlit
0850: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
0860: 72 75 63 74 75 72 65 2e 20 50 6f 73 73 69 62 6c  ructure. Possibl
0870: 65 0a 2a 2a 20 6b 65 79 73 20 61 6e 64 20 74 68  e.** keys and th
0880: 65 20 75 73 61 67 65 20 6f 66 20 74 68 65 20 61  e usage of the a
0890: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 76 61 6c 75  ccompanying valu
08a0: 65 73 20 61 72 65 3a 0a 2a 2a 20 0a 2a 2a 20 20  es are:.** .**  
08b0: 20 22 6f 72 64 65 72 62 79 22 20 20 20 20 20 20   "orderby"      
08c0: 20 20 20 20 28 76 61 6c 75 65 20 6f 66 20 6f 72      (value of or
08d0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 66 6c  derByConsumed fl
08e0: 61 67 29 0a 2a 2a 20 20 20 22 63 6f 73 74 22 20  ag).**   "cost" 
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 61 6c              (val
0900: 75 65 20 6f 66 20 65 73 74 69 6d 61 74 65 64 43  ue of estimatedC
0910: 6f 73 74 20 66 69 65 6c 64 29 0a 2a 2a 20 20 20  ost field).**   
0920: 22 72 6f 77 73 22 20 20 20 20 20 20 20 20 20 20  "rows"          
0930: 20 20 20 28 76 61 6c 75 65 20 6f 66 20 65 73 74     (value of est
0940: 69 6d 61 74 65 64 52 6f 77 73 20 66 69 65 6c 64  imatedRows field
0950: 29 0a 2a 2a 20 20 20 22 75 73 65 22 20 20 20 20  ).**   "use"    
0960: 20 20 20 20 20 20 20 20 20 20 28 69 6e 64 65 78            (index
0970: 20 6f 66 20 75 73 65 64 20 63 6f 6e 73 74 72 61   of used constra
0980: 69 6e 74 20 69 6e 20 61 43 6f 6e 73 74 72 61 69  int in aConstrai
0990: 6e 74 5b 5d 29 0a 2a 2a 20 20 20 22 6f 6d 69 74  nt[]).**   "omit
09a0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c  "             (l
09b0: 69 6b 65 20 22 75 73 65 22 2c 20 62 75 74 20 61  ike "use", but a
09c0: 6c 73 6f 20 73 65 74 73 20 6f 6d 69 74 20 66 6c  lso sets omit fl
09d0: 61 67 29 0a 2a 2a 20 20 20 22 69 64 78 6e 75 6d  ag).**   "idxnum
09e0: 22 20 20 20 20 20 20 20 20 20 20 20 28 76 61 6c  "           (val
09f0: 75 65 20 6f 66 20 69 64 78 4e 75 6d 20 66 69 65  ue of idxNum fie
0a00: 6c 64 29 0a 2a 2a 20 20 20 22 69 64 78 73 74 72  ld).**   "idxstr
0a10: 22 20 20 20 20 20 20 20 20 20 20 20 28 76 61 6c  "           (val
0a20: 75 65 20 6f 66 20 69 64 78 53 74 72 20 66 69 65  ue of idxStr fie
0a30: 6c 64 29 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 20  ld).**.** Refer 
0a40: 74 6f 20 63 6f 64 65 20 62 65 6c 6f 77 20 66 6f  to code below fo
0a50: 72 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  r further detail
0a60: 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 53 51  s..**.** When SQ
0a70: 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 65 20 78  Lite calls the x
0a80: 46 69 6c 74 65 72 28 29 20 6d 65 74 68 6f 64 2c  Filter() method,
0a90: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69 6e 76   this module inv
0aa0: 6f 6b 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  okes the followi
0ab0: 6e 67 0a 2a 2a 20 54 63 6c 20 73 63 72 69 70 74  ng.** Tcl script
0ac0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 74 63 6c 5f 63 6f  :.**.**   tcl_co
0ad0: 6d 6d 61 6e 64 20 78 46 69 6c 74 65 72 20 49 44  mmand xFilter ID
0ae0: 58 4e 55 4d 20 49 44 58 53 54 52 20 41 52 47 4c  XNUM IDXSTR ARGL
0af0: 49 53 54 0a 2a 2a 0a 2a 2a 20 49 44 58 4e 55 4d  IST.**.** IDXNUM
0b00: 20 61 6e 64 20 49 44 58 53 54 52 20 61 72 65 20   and IDXSTR are 
0b10: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
0b20: 65 20 69 64 78 4e 75 6d 20 61 6e 64 20 69 64 78  e idxNum and idx
0b30: 53 74 72 20 70 61 72 61 6d 65 74 65 72 73 0a 2a  Str parameters.*
0b40: 2a 20 70 61 73 73 65 64 20 74 6f 20 78 46 69 6c  * passed to xFil
0b50: 74 65 72 2e 20 41 52 47 4c 49 53 54 20 69 73 20  ter. ARGLIST is 
0b60: 61 20 54 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61  a Tcl list conta
0b70: 69 6e 69 6e 67 20 65 61 63 68 20 6f 66 20 74 68  ining each of th
0b80: 65 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2a 20 70  e arguments.** p
0b90: 61 73 73 65 64 20 74 6f 20 78 46 69 6c 74 65 72  assed to xFilter
0ba0: 20 69 6e 20 74 65 78 74 20 66 6f 72 6d 2e 0a 2a   in text form..*
0bb0: 2a 0a 2a 2a 20 41 73 20 77 69 74 68 20 78 42 65  *.** As with xBe
0bc0: 73 74 49 6e 64 65 78 28 29 2c 20 74 68 65 20 72  stIndex(), the r
0bd0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
0be0: 68 65 20 73 63 72 69 70 74 20 69 73 20 69 6e 74  he script is int
0bf0: 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a  erpreted as a.**
0c00: 20 6c 69 73 74 20 6f 66 20 6b 65 79 2d 76 61 6c   list of key-val
0c10: 75 65 20 70 61 69 72 73 2e 20 54 68 65 72 65 20  ue pairs. There 
0c20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  is currently onl
0c30: 79 20 6f 6e 65 20 6b 65 79 20 64 65 66 69 6e 65  y one key define
0c40: 64 20 2d 20 22 73 71 6c 22 2e 0a 2a 2a 20 54 68  d - "sql"..** Th
0c50: 65 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20  e value must be 
0c60: 74 68 65 20 66 75 6c 6c 20 74 65 78 74 20 6f 66  the full text of
0c70: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
0c80: 74 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 74  t that returns t
0c90: 68 65 20 64 61 74 61 0a 2a 2a 20 66 6f 72 20 74  he data.** for t
0ca0: 68 65 20 63 75 72 72 65 6e 74 20 73 63 61 6e 2e  he current scan.
0cb0: 20 54 68 65 20 6c 65 66 74 6d 6f 73 74 20 63 6f   The leftmost co
0cc0: 6c 75 6d 6e 20 72 65 74 75 72 6e 65 64 20 62 79  lumn returned by
0cd0: 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 61   the SELECT is a
0ce0: 73 73 75 6d 65 64 0a 2a 2a 20 74 6f 20 63 6f 6e  ssumed.** to con
0cf0: 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64 2e 20  tain the rowid. 
0d00: 4f 74 68 65 72 20 63 6f 6c 75 6d 6e 73 20 6d 75  Other columns mu
0d10: 73 74 20 66 6f 6c 6c 6f 77 2c 20 69 6e 20 6f 72  st follow, in or
0d20: 64 65 72 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  der from left to
0d30: 0a 2a 2a 20 72 69 67 68 74 2e 0a 2a 2f 0a 0a 0a  .** right..*/...
0d40: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0d50: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0d60: 22 74 63 6c 2e 68 22 0a 0a 23 69 66 6e 64 65 66  "tcl.h"..#ifndef
0d70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
0d80: 54 55 41 4c 54 41 42 4c 45 0a 0a 74 79 70 65 64  TUALTABLE..typed
0d90: 65 66 20 73 74 72 75 63 74 20 74 63 6c 5f 76 74  ef struct tcl_vt
0da0: 61 62 20 74 63 6c 5f 76 74 61 62 3b 0a 74 79 70  ab tcl_vtab;.typ
0db0: 65 64 65 66 20 73 74 72 75 63 74 20 74 63 6c 5f  edef struct tcl_
0dc0: 63 75 72 73 6f 72 20 74 63 6c 5f 63 75 72 73 6f  cursor tcl_curso
0dd0: 72 3b 0a 0a 2f 2a 20 0a 2a 2a 20 41 20 66 73 20  r;../* .** A fs 
0de0: 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 6f 62  virtual-table ob
0df0: 6a 65 63 74 20 0a 2a 2f 0a 73 74 72 75 63 74 20  ject .*/.struct 
0e00: 74 63 6c 5f 76 74 61 62 20 7b 0a 20 20 73 71 6c  tcl_vtab {.  sql
0e10: 69 74 65 33 5f 76 74 61 62 20 62 61 73 65 3b 0a  ite3_vtab base;.
0e20: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0e30: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  terp;.  Tcl_Obj 
0e40: 2a 70 43 6d 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pCmd;.  sqlite3
0e50: 20 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 74   *db;.};../* A t
0e60: 63 6c 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74  cl cursor object
0e70: 20 2a 2f 0a 73 74 72 75 63 74 20 74 63 6c 5f 63   */.struct tcl_c
0e80: 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65  ursor {.  sqlite
0e90: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61  3_vtab_cursor ba
0ea0: 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  se;.  sqlite3_st
0eb0: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
0ec0: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 64 61        /* Read da
0ed0: 74 61 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a  ta from here */.
0ee0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  };../*.** This f
0ef0: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 69  unction is the i
0f00: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
0f10: 20 62 6f 74 68 20 74 68 65 20 78 43 6f 6e 6e 65   both the xConne
0f20: 63 74 20 61 6e 64 20 78 43 72 65 61 74 65 0a 2a  ct and xCreate.*
0f30: 2a 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  * methods of the
0f40: 20 66 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c   fs virtual tabl
0f50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 67  e..**.** The arg
0f60: 76 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  v[] array contai
0f70: 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ns the following
0f80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 72 67 76 5b 30  :.**.**   argv[0
0f90: 5d 20 20 20 2d 3e 20 6d 6f 64 75 6c 65 20 6e 61  ]   -> module na
0fa0: 6d 65 20 20 28 22 66 73 22 29 0a 2a 2a 20 20 20  me  ("fs").**   
0fb0: 61 72 67 76 5b 31 5d 20 20 20 2d 3e 20 64 61 74  argv[1]   -> dat
0fc0: 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 20 20  abase name.**   
0fd0: 61 72 67 76 5b 32 5d 20 20 20 2d 3e 20 74 61 62  argv[2]   -> tab
0fe0: 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 61 72 67  le name.**   arg
0ff0: 76 5b 2e 2e 2e 5d 20 2d 3e 20 6f 74 68 65 72 20  v[...] -> other 
1000: 6d 6f 64 75 6c 65 20 61 72 67 75 6d 65 6e 74 20  module argument 
1010: 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  fields..*/.stati
1020: 63 20 69 6e 74 20 74 63 6c 43 6f 6e 6e 65 63 74  c int tclConnect
1030: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1040: 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20  .  void *pAux,. 
1050: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
1060: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
1070: 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v,.  sqlite3_vta
1080: 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68  b **ppVtab,.  ch
1090: 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
10a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10b0: 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70  rp = (Tcl_Interp
10c0: 2a 29 70 41 75 78 3b 0a 20 20 74 63 6c 5f 76 74  *)pAux;.  tcl_vt
10d0: 61 62 20 2a 70 54 61 62 3b 0a 20 20 63 6f 6e 73  ab *pTab;.  cons
10e0: 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20  t char *zCmd;.  
10f0: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
1100: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
1110: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29  .  if( argc!=4 )
1120: 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 73  {.    *pzErr = s
1130: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1140: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
1150: 61 72 67 75 6d 65 6e 74 73 22 29 3b 0a 20 20 20  arguments");.   
1160: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1170: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64  RROR;.  }.  zCmd
1180: 20 3d 20 61 72 67 76 5b 33 5d 3b 0a 0a 20 20 70   = argv[3];..  p
1190: 54 61 62 20 3d 20 28 74 63 6c 5f 76 74 61 62 2a  Tab = (tcl_vtab*
11a0: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
11b0: 73 69 7a 65 6f 66 28 74 63 6c 5f 76 74 61 62 29  sizeof(tcl_vtab)
11c0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  );.  if( pTab==0
11d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
11e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
11f0: 28 70 54 61 62 2c 20 30 2c 20 73 69 7a 65 6f 66  (pTab, 0, sizeof
1200: 28 74 63 6c 5f 76 74 61 62 29 29 3b 0a 0a 20 20  (tcl_vtab));..  
1210: 70 54 61 62 2d 3e 70 43 6d 64 20 3d 20 54 63 6c  pTab->pCmd = Tcl
1220: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 43  _NewStringObj(zC
1230: 6d 64 2c 20 2d 31 29 3b 0a 20 20 70 54 61 62 2d  md, -1);.  pTab-
1240: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
1250: 3b 0a 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64  ;.  pTab->db = d
1260: 62 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  b;.  Tcl_IncrRef
1270: 43 6f 75 6e 74 28 70 54 61 62 2d 3e 70 43 6d 64  Count(pTab->pCmd
1280: 29 3b 0a 0a 20 20 70 53 63 72 69 70 74 20 3d 20  );..  pScript = 
1290: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
12a0: 28 70 54 61 62 2d 3e 70 43 6d 64 29 3b 0a 20 20  (pTab->pCmd);.  
12b0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
12c0: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c  (pScript);.  Tcl
12d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 53  ement(interp, pS
12f0: 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74  cript, Tcl_NewSt
1300: 72 69 6e 67 4f 62 6a 28 22 78 43 6f 6e 6e 65 63  ringObj("xConnec
1310: 74 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 72 63 20  t", -1));..  rc 
1320: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
1330: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
1340: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
1350: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
1360: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  _OK ){.    *pzEr
1370: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
1380: 6e 74 66 28 22 25 73 22 2c 20 54 63 6c 5f 47 65  ntf("%s", Tcl_Ge
1390: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
13a0: 74 65 72 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  terp));.    rc =
13b0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
13d0: 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65   sqlite3_declare
13e0: 5f 76 74 61 62 28 64 62 2c 20 54 63 6c 5f 47 65  _vtab(db, Tcl_Ge
13f0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
1400: 74 65 72 70 29 29 3b 0a 20 20 7d 0a 0a 20 20 69  terp));.  }..  i
1410: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1420: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1430: 66 72 65 65 28 70 54 61 62 29 3b 0a 20 20 20 20  free(pTab);.    
1440: 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
1450: 20 2a 70 70 56 74 61 62 20 3d 20 26 70 54 61 62   *ppVtab = &pTab
1460: 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e  ->base;.  return
1470: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 78   rc;.}../* The x
1480: 44 69 73 63 6f 6e 6e 65 63 74 20 61 6e 64 20 78  Disconnect and x
1490: 44 65 73 74 72 6f 79 20 6d 65 74 68 6f 64 73 20  Destroy methods 
14a0: 61 72 65 20 61 6c 73 6f 20 74 68 65 20 73 61 6d  are also the sam
14b0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
14c0: 74 63 6c 44 69 73 63 6f 6e 6e 65 63 74 28 73 71  tclDisconnect(sq
14d0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
14e0: 62 29 7b 0a 20 20 74 63 6c 5f 76 74 61 62 20 2a  b){.  tcl_vtab *
14f0: 70 54 61 62 20 3d 20 28 74 63 6c 5f 76 74 61 62  pTab = (tcl_vtab
1500: 2a 29 70 56 74 61 62 3b 0a 20 20 54 63 6c 5f 44  *)pVtab;.  Tcl_D
1510: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 62  ecrRefCount(pTab
1520: 2d 3e 70 43 6d 64 29 3b 0a 20 20 73 71 6c 69 74  ->pCmd);.  sqlit
1530: 65 33 5f 66 72 65 65 28 70 54 61 62 29 3b 0a 20  e3_free(pTab);. 
1540: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1550: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  K;.}../*.** Open
1560: 20 61 20 6e 65 77 20 74 63 6c 20 63 75 72 73 6f   a new tcl curso
1570: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1580: 20 74 63 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33   tclOpen(sqlite3
1590: 5f 76 74 61 62 20 2a 70 56 54 61 62 2c 20 73 71  _vtab *pVTab, sq
15a0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
15b0: 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20  r **ppCursor){. 
15c0: 20 74 63 6c 5f 63 75 72 73 6f 72 20 2a 70 43 75   tcl_cursor *pCu
15d0: 72 3b 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69  r;.  pCur = sqli
15e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
15f0: 66 28 74 63 6c 5f 63 75 72 73 6f 72 29 29 3b 0a  f(tcl_cursor));.
1600: 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20    if( pCur==0 ) 
1610: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1620: 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  MEM;.  memset(pC
1630: 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 63  ur, 0, sizeof(tc
1640: 6c 5f 63 75 72 73 6f 72 29 29 3b 0a 20 20 2a 70  l_cursor));.  *p
1650: 70 43 75 72 73 6f 72 20 3d 20 26 70 43 75 72 2d  pCursor = &pCur-
1660: 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20  >base;.  return 
1670: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1680: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 74 63 6c 20  .** Close a tcl 
1690: 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  cursor..*/.stati
16a0: 63 20 69 6e 74 20 74 63 6c 43 6c 6f 73 65 28 73  c int tclClose(s
16b0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
16c0: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 74 63 6c 5f  or *cur){.  tcl_
16d0: 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
16e0: 74 63 6c 5f 63 75 72 73 6f 72 20 2a 29 63 75 72  tcl_cursor *)cur
16f0: 3b 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a  ;.  if( pCur ){.
1700: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
1710: 6c 69 7a 65 28 70 43 75 72 2d 3e 70 53 74 6d 74  lize(pCur->pStmt
1720: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1730: 72 65 65 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  ree(pCur);.  }. 
1740: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1750: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
1760: 20 74 63 6c 4e 65 78 74 28 73 71 6c 69 74 65 33   tclNext(sqlite3
1770: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
1780: 74 61 62 43 75 72 73 6f 72 29 7b 0a 20 20 74 63  tabCursor){.  tc
1790: 6c 5f 63 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  l_cursor *pCsr =
17a0: 20 28 74 63 6c 5f 63 75 72 73 6f 72 2a 29 70 56   (tcl_cursor*)pV
17b0: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 74 63 6c  tabCursor;.  tcl
17c0: 5f 76 74 61 62 20 2a 70 54 61 62 20 3d 20 28 74  _vtab *pTab = (t
17d0: 63 6c 5f 76 74 61 62 2a 29 28 70 56 74 61 62 43  cl_vtab*)(pVtabC
17e0: 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20  ursor->pVtab);. 
17f0: 20 69 66 28 20 70 43 73 72 2d 3e 70 53 74 6d 74   if( pCsr->pStmt
1800: 20 29 7b 0a 20 20 20 20 74 63 6c 5f 76 74 61 62   ){.    tcl_vtab
1810: 20 2a 70 54 61 62 20 3d 20 28 74 63 6c 5f 76 74   *pTab = (tcl_vt
1820: 61 62 2a 29 28 70 56 74 61 62 43 75 72 73 6f 72  ab*)(pVtabCursor
1830: 2d 3e 70 56 74 61 62 29 3b 0a 20 20 20 20 69 6e  ->pVtab);.    in
1840: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73  t rc = sqlite3_s
1850: 74 65 70 28 70 43 73 72 2d 3e 70 53 74 6d 74 29  tep(pCsr->pStmt)
1860: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1870: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
1880: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
1890: 72 72 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  rr;.      rc = s
18a0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
18b0: 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  pCsr->pStmt);.  
18c0: 20 20 20 20 70 43 73 72 2d 3e 70 53 74 6d 74 20      pCsr->pStmt 
18d0: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
18e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18f0: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 73          zErr = s
1900: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 54  qlite3_errmsg(pT
1910: 61 62 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  ab->db);.       
1920: 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72   pTab->base.zErr
1930: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
1940: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 45 72 72  rintf("%s", zErr
1950: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1960: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1970: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74  LITE_OK;.}..stat
1980: 69 63 20 69 6e 74 20 74 63 6c 46 69 6c 74 65 72  ic int tclFilter
1990: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
19a0: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
19b0: 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20 69 64 78  rsor, .  int idx
19c0: 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Num, const char 
19d0: 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61  *idxStr,.  int a
19e0: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
19f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74  ue **argv.){.  t
1a00: 63 6c 5f 63 75 72 73 6f 72 20 2a 70 43 73 72 20  cl_cursor *pCsr 
1a10: 3d 20 28 74 63 6c 5f 63 75 72 73 6f 72 2a 29 70  = (tcl_cursor*)p
1a20: 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 74 63  VtabCursor;.  tc
1a30: 6c 5f 76 74 61 62 20 2a 70 54 61 62 20 3d 20 28  l_vtab *pTab = (
1a40: 74 63 6c 5f 76 74 61 62 2a 29 28 70 56 74 61 62  tcl_vtab*)(pVtab
1a50: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a  Cursor->pVtab);.
1a60: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1a70: 74 65 72 70 20 3d 20 70 54 61 62 2d 3e 69 6e 74  terp = pTab->int
1a80: 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
1a90: 70 53 63 72 69 70 74 3b 0a 20 20 54 63 6c 5f 4f  pScript;.  Tcl_O
1aa0: 62 6a 20 2a 70 41 72 67 3b 0a 20 20 69 6e 74 20  bj *pArg;.  int 
1ab0: 69 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ii;.  int rc;.. 
1ac0: 20 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f 44   pScript = Tcl_D
1ad0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 54 61 62  uplicateObj(pTab
1ae0: 2d 3e 70 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 49  ->pCmd);.  Tcl_I
1af0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
1b00: 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ipt);.  Tcl_List
1b10: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1b20: 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74  (interp, pScript
1b30: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1b40: 62 6a 28 22 78 46 69 6c 74 65 72 22 2c 20 2d 31  bj("xFilter", -1
1b50: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
1b60: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1b70: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
1b80: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 64  Tcl_NewIntObj(id
1b90: 78 4e 75 6d 29 29 3b 0a 20 20 69 66 28 20 69 64  xNum));.  if( id
1ba0: 78 53 74 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f  xStr ){.    Tcl_
1bb0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1bc0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 53 63  ment(interp, pSc
1bd0: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
1be0: 69 6e 67 4f 62 6a 28 69 64 78 53 74 72 2c 20 2d  ingObj(idxStr, -
1bf0: 31 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1));.  }else{.  
1c00: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1c10: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1c20: 70 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  p, pScript, Tcl_
1c30: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
1c40: 20 2d 31 29 29 3b 0a 20 20 7d 0a 0a 20 20 70 41   -1));.  }..  pA
1c50: 72 67 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  rg = Tcl_NewObj(
1c60: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
1c70: 43 6f 75 6e 74 28 70 41 72 67 29 3b 0a 20 20 66  Count(pArg);.  f
1c80: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 61 72 67 63  or(ii=0; ii<argc
1c90: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  ; ii++){.    con
1ca0: 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20  st char *zVal = 
1cb0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1cc0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1cd0: 61 72 67 76 5b 69 69 5d 29 3b 0a 20 20 20 20 54  argv[ii]);.    T
1ce0: 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b 0a 20 20  cl_Obj *pVal;.  
1cf0: 20 20 69 66 28 20 7a 56 61 6c 3d 3d 30 20 29 7b    if( zVal==0 ){
1d00: 0a 20 20 20 20 20 20 70 56 61 6c 20 3d 20 54 63  .      pVal = Tc
1d10: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
1d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 56 61  }else{.      pVa
1d30: 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  l = Tcl_NewStrin
1d40: 67 4f 62 6a 28 7a 56 61 6c 2c 20 2d 31 29 3b 0a  gObj(zVal, -1);.
1d50: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69      }.    Tcl_Li
1d60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1d70: 6e 74 28 69 6e 74 65 72 70 2c 20 70 41 72 67 2c  nt(interp, pArg,
1d80: 20 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 54 63   pVal);.  }.  Tc
1d90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1da0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
1db0: 53 63 72 69 70 74 2c 20 70 41 72 67 29 3b 0a 20  Script, pArg);. 
1dc0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1dd0: 74 28 70 41 72 67 29 3b 0a 0a 20 20 72 63 20 3d  t(pArg);..  rc =
1de0: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
1df0: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
1e00: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
1e10: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
1e20: 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
1e30: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 54 63 6c  char *zErr = Tcl
1e40: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
1e50: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 63  (interp);.    rc
1e60: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1e70: 0a 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e  .    pTab->base.
1e80: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
1e90: 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
1ea0: 7a 45 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zErr);.  }else{.
1eb0: 20 20 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74      /* Analyze t
1ec0: 68 65 20 73 63 72 69 70 74 73 20 72 65 74 75 72  he scripts retur
1ed0: 6e 20 76 61 6c 75 65 2e 20 54 68 65 20 72 65 74  n value. The ret
1ee0: 75 72 6e 20 76 61 6c 75 65 20 73 68 6f 75 6c 64  urn value should
1ef0: 20 62 65 20 61 20 74 63 6c 20 0a 20 20 20 20 2a   be a tcl .    *
1f00: 2a 20 6c 69 73 74 20 6f 62 6a 65 63 74 20 77 69  * list object wi
1f10: 74 68 20 61 6e 20 65 76 65 6e 20 6e 75 6d 62 65  th an even numbe
1f20: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 2e 20 54  r of elements. T
1f30: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
1f40: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
1f50: 70 61 69 72 20 6d 75 73 74 20 62 65 20 6f 6e 65  pair must be one
1f60: 20 6f 66 3a 0a 20 20 20 20 2a 2a 20 0a 20 20 20   of:.    ** .   
1f70: 20 2a 2a 20 20 20 22 73 71 6c 22 20 20 20 20 20   **   "sql"     
1f80: 20 20 20 20 20 28 53 51 4c 20 73 74 61 74 65 6d       (SQL statem
1f90: 65 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 64 61  ent to return da
1fa0: 74 61 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54  ta).    */.    T
1fb0: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 20 3d 20 54  cl_Obj *pRes = T
1fc0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
1fd0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
1fe0: 5f 4f 62 6a 20 2a 2a 61 70 45 6c 65 6d 20 3d 20  _Obj **apElem = 
1ff0: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 45 6c 65 6d  0;.    int nElem
2000: 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c  ;.    rc = Tcl_L
2010: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
2020: 73 28 69 6e 74 65 72 70 2c 20 70 52 65 73 2c 20  s(interp, pRes, 
2030: 26 6e 45 6c 65 6d 2c 20 26 61 70 45 6c 65 6d 29  &nElem, &apElem)
2040: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43  ;.    if( rc!=TC
2050: 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f  L_OK ){.      co
2060: 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
2070: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
2080: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
2090: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
20a0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 54 61  ERROR;.      pTa
20b0: 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20  b->base.zErrMsg 
20c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
20d0: 66 28 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  f("%s", zErr);. 
20e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20f0: 69 6e 74 20 69 41 72 67 76 20 3d 20 31 3b 0a 20  int iArgv = 1;. 
2100: 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72       for(ii=0; r
2110: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2120: 69 69 3c 6e 45 6c 65 6d 3b 20 69 69 2b 3d 32 29  ii<nElem; ii+=2)
2130: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2140: 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20 54 63 6c  char *zCmd = Tcl
2150: 5f 47 65 74 53 74 72 69 6e 67 28 61 70 45 6c 65  _GetString(apEle
2160: 6d 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  m[ii]);.        
2170: 54 63 6c 5f 4f 62 6a 20 2a 70 20 3d 20 61 70 45  Tcl_Obj *p = apE
2180: 6c 65 6d 5b 69 69 2b 31 5d 3b 0a 20 20 20 20 20  lem[ii+1];.     
2190: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
21a0: 74 72 69 63 6d 70 28 22 73 71 6c 22 2c 20 7a 43  tricmp("sql", zC
21b0: 6d 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  md)==0 ){.      
21c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
21d0: 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zSql = Tcl_GetSt
21e0: 72 69 6e 67 28 70 29 3b 0a 20 20 20 20 20 20 20  ring(p);.       
21f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2200: 70 72 65 70 61 72 65 5f 76 32 28 70 54 61 62 2d  prepare_v2(pTab-
2210: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
2220: 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b  pCsr->pStmt, 0);
2230: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2240: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2250: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
2260: 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 73  t char *zErr = s
2270: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 54  qlite3_errmsg(pT
2280: 61 62 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  ab->db);.       
2290: 20 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e       pTab->base.
22a0: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
22b0: 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 65 78 70  3_mprintf("unexp
22c0: 65 63 74 65 64 3a 20 25 73 22 2c 20 7a 45 72 72  ected: %s", zErr
22d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
22e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2300: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
2310: 20 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e       pTab->base.
2320: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
2330: 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 65 78 70  3_mprintf("unexp
2340: 65 63 74 65 64 3a 20 25 73 22 2c 20 7a 43 6d 64  ected: %s", zCmd
2350: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2360: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2370: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2380: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2390: 74 63 6c 4e 65 78 74 28 70 56 74 61 62 43 75 72  tclNext(pVtabCur
23a0: 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sor);.  }.  retu
23b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
23c0: 20 69 6e 74 20 74 63 6c 43 6f 6c 75 6d 6e 28 0a   int tclColumn(.
23d0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
23e0: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
23f0: 6f 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 63  or, .  sqlite3_c
2400: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 0a 20 20  ontext *ctx, .  
2410: 69 6e 74 20 69 0a 29 7b 0a 20 20 74 63 6c 5f 63  int i.){.  tcl_c
2420: 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 74  ursor *pCsr = (t
2430: 63 6c 5f 63 75 72 73 6f 72 2a 29 70 56 74 61 62  cl_cursor*)pVtab
2440: 43 75 72 73 6f 72 3b 0a 20 20 73 71 6c 69 74 65  Cursor;.  sqlite
2450: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
2460: 74 78 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  tx, sqlite3_colu
2470: 6d 6e 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70  mn_value(pCsr->p
2480: 53 74 6d 74 2c 20 69 2b 31 29 29 3b 0a 20 20 72  Stmt, i+1));.  r
2490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
24b0: 63 6c 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f  clRowid(sqlite3_
24c0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
24d0: 61 62 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65  abCursor, sqlite
24e0: 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b  _int64 *pRowid){
24f0: 0a 20 20 74 63 6c 5f 63 75 72 73 6f 72 20 2a 70  .  tcl_cursor *p
2500: 43 73 72 20 3d 20 28 74 63 6c 5f 63 75 72 73 6f  Csr = (tcl_curso
2510: 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  r*)pVtabCursor;.
2520: 20 20 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c 69    *pRowid = sqli
2530: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
2540: 28 70 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29  (pCsr->pStmt, 0)
2550: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2560: 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  E_OK;.}..static 
2570: 69 6e 74 20 74 63 6c 45 6f 66 28 73 71 6c 69 74  int tclEof(sqlit
2580: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
2590: 70 56 74 61 62 43 75 72 73 6f 72 29 7b 0a 20 20  pVtabCursor){.  
25a0: 74 63 6c 5f 63 75 72 73 6f 72 20 2a 70 43 73 72  tcl_cursor *pCsr
25b0: 20 3d 20 28 74 63 6c 5f 63 75 72 73 6f 72 2a 29   = (tcl_cursor*)
25c0: 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72  pVtabCursor;.  r
25d0: 65 74 75 72 6e 20 28 70 43 73 72 2d 3e 70 53 74  eturn (pCsr->pSt
25e0: 6d 74 3d 3d 30 29 3b 0a 7d 0a 0a 73 74 61 74 69  mt==0);.}..stati
25f0: 63 20 69 6e 74 20 74 63 6c 42 65 73 74 49 6e 64  c int tclBestInd
2600: 65 78 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ex(sqlite3_vtab 
2610: 2a 74 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *tab, sqlite3_in
2620: 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
2630: 66 6f 29 7b 0a 20 20 74 63 6c 5f 76 74 61 62 20  fo){.  tcl_vtab 
2640: 2a 70 54 61 62 20 3d 20 28 74 63 6c 5f 76 74 61  *pTab = (tcl_vta
2650: 62 2a 29 74 61 62 3b 0a 20 20 54 63 6c 5f 49 6e  b*)tab;.  Tcl_In
2660: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70  terp *interp = p
2670: 54 61 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 54  Tab->interp;.  T
2680: 63 6c 5f 4f 62 6a 20 2a 70 41 72 67 3b 0a 20 20  cl_Obj *pArg;.  
2690: 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74  Tcl_Obj *pScript
26a0: 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e  ;.  int ii;.  in
26b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26c0: 3b 0a 0a 20 20 70 53 63 72 69 70 74 20 3d 20 54  ;..  pScript = T
26d0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
26e0: 70 54 61 62 2d 3e 70 43 6d 64 29 3b 0a 20 20 54  pTab->pCmd);.  T
26f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
2700: 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f  pScript);.  Tcl_
2710: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2720: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 53 63  ment(interp, pSc
2730: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
2740: 69 6e 67 4f 62 6a 28 22 78 42 65 73 74 49 6e 64  ingObj("xBestInd
2750: 65 78 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 70 41  ex", -1));..  pA
2760: 72 67 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  rg = Tcl_NewObj(
2770: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
2780: 43 6f 75 6e 74 28 70 41 72 67 29 3b 0a 20 20 66  Count(pArg);.  f
2790: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 64 78  or(ii=0; ii<pIdx
27a0: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
27b0: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 74  t; ii++){.    st
27c0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
27d0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ex_constraint co
27e0: 6e 73 74 20 2a 70 43 6f 6e 73 20 3d 20 26 70 49  nst *pCons = &pI
27f0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
2800: 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 54 63 6c  int[ii];.    Tcl
2810: 5f 4f 62 6a 20 2a 70 45 6c 65 6d 20 3d 20 54 63  _Obj *pElem = Tc
2820: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
2830: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
2840: 3d 20 22 3f 22 3b 0a 0a 20 20 20 20 54 63 6c 5f  = "?";..    Tcl_
2850: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 45 6c  IncrRefCount(pEl
2860: 65 6d 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68  em);..    switch
2870: 28 20 70 43 6f 6e 73 2d 3e 6f 70 20 29 7b 0a 20  ( pCons->op ){. 
2880: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
2890: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
28a0: 54 5f 45 51 3a 0a 20 20 20 20 20 20 20 20 7a 4f  T_EQ:.        zO
28b0: 70 20 3d 20 22 65 71 22 3b 20 62 72 65 61 6b 3b  p = "eq"; break;
28c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
28d0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
28e0: 49 4e 54 5f 47 54 3a 0a 20 20 20 20 20 20 20 20  INT_GT:.        
28f0: 7a 4f 70 20 3d 20 22 67 74 22 3b 20 62 72 65 61  zOp = "gt"; brea
2900: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
2910: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
2920: 52 41 49 4e 54 5f 4c 45 3a 0a 20 20 20 20 20 20  RAINT_LE:.      
2930: 20 20 7a 4f 70 20 3d 20 22 6c 65 22 3b 20 62 72    zOp = "le"; br
2940: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
2950: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
2960: 53 54 52 41 49 4e 54 5f 4c 54 3a 0a 20 20 20 20  STRAINT_LT:.    
2970: 20 20 20 20 7a 4f 70 20 3d 20 22 6c 74 22 3b 20      zOp = "lt"; 
2980: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
2990: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
29a0: 4f 4e 53 54 52 41 49 4e 54 5f 47 45 3a 0a 20 20  ONSTRAINT_GE:.  
29b0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 67 65 22        zOp = "ge"
29c0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
29d0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ase SQLITE_INDEX
29e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43  _CONSTRAINT_MATC
29f0: 48 3a 0a 20 20 20 20 20 20 20 20 7a 4f 70 20 3d  H:.        zOp =
2a00: 20 22 6d 61 74 63 68 22 3b 20 62 72 65 61 6b 3b   "match"; break;
2a10: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
2a20: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
2a30: 49 4e 54 5f 4c 49 4b 45 3a 0a 20 20 20 20 20 20  INT_LIKE:.      
2a40: 20 20 7a 4f 70 20 3d 20 22 6c 69 6b 65 22 3b 20    zOp = "like"; 
2a50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
2a60: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
2a70: 4f 4e 53 54 52 41 49 4e 54 5f 47 4c 4f 42 3a 0a  ONSTRAINT_GLOB:.
2a80: 20 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 67          zOp = "g
2a90: 6c 6f 62 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  lob"; break;.   
2aa0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
2ab0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
2ac0: 52 45 47 45 58 50 3a 0a 20 20 20 20 20 20 20 20  REGEXP:.        
2ad0: 7a 4f 70 20 3d 20 22 72 65 67 65 78 70 22 3b 20  zOp = "regexp"; 
2ae0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
2af0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2b00: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45  endElement(0, pE
2b10: 6c 65 6d 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  lem, Tcl_NewStri
2b20: 6e 67 4f 62 6a 28 22 6f 70 22 2c 20 2d 31 29 29  ngObj("op", -1))
2b30: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2b40: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
2b50: 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f 4e 65 77  , pElem, Tcl_New
2b60: 53 74 72 69 6e 67 4f 62 6a 28 7a 4f 70 2c 20 2d  StringObj(zOp, -
2b70: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
2b80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2b90: 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f  t(0, pElem, Tcl_
2ba0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f  NewStringObj("co
2bb0: 6c 75 6d 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20  lumn", -1));.   
2bc0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2bd0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6c  ndElement(0, pEl
2be0: 65 6d 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  em, Tcl_NewIntOb
2bf0: 6a 28 70 43 6f 6e 73 2d 3e 69 43 6f 6c 75 6d 6e  j(pCons->iColumn
2c00: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2c10: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2c20: 28 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f 4e  (0, pElem, Tcl_N
2c30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 73 61  ewStringObj("usa
2c40: 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ble", -1));.    
2c50: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c60: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6c 65  dElement(0, pEle
2c70: 6d 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  m, Tcl_NewIntObj
2c80: 28 70 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 29 29  (pCons->usable))
2c90: 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
2ca0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2cb0: 30 2c 20 70 41 72 67 2c 20 70 45 6c 65 6d 29 3b  0, pArg, pElem);
2cc0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2cd0: 43 6f 75 6e 74 28 70 45 6c 65 6d 29 3b 0a 20 20  Count(pElem);.  
2ce0: 7d 0a 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  }..  Tcl_ListObj
2cf0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
2d00: 20 70 53 63 72 69 70 74 2c 20 70 41 72 67 29 3b   pScript, pArg);
2d10: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
2d20: 75 6e 74 28 70 41 72 67 29 3b 0a 0a 20 20 70 41  unt(pArg);..  pA
2d30: 72 67 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  rg = Tcl_NewObj(
2d40: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
2d50: 43 6f 75 6e 74 28 70 41 72 67 29 3b 0a 20 20 66  Count(pArg);.  f
2d60: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 64 78  or(ii=0; ii<pIdx
2d70: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 20  Info->nOrderBy; 
2d80: 69 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63  ii++){.    struc
2d90: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
2da0: 6f 72 64 65 72 62 79 20 63 6f 6e 73 74 20 2a 70  orderby const *p
2db0: 4f 72 64 65 72 20 3d 20 26 70 49 64 78 49 6e 66  Order = &pIdxInf
2dc0: 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 69 69 5d 3b  o->aOrderBy[ii];
2dd0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 45  .    Tcl_Obj *pE
2de0: 6c 65 6d 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  lem = Tcl_NewObj
2df0: 28 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  ();.    Tcl_Incr
2e00: 52 65 66 43 6f 75 6e 74 28 70 45 6c 65 6d 29 3b  RefCount(pElem);
2e10: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
2e20: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
2e30: 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f 4e 65 77  , pElem, Tcl_New
2e40: 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6c 75 6d  StringObj("colum
2e50: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
2e60: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2e70: 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d 2c  lement(0, pElem,
2e80: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70   Tcl_NewIntObj(p
2e90: 4f 72 64 65 72 2d 3e 69 43 6f 6c 75 6d 6e 29 29  Order->iColumn))
2ea0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2eb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
2ec0: 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f 4e 65 77  , pElem, Tcl_New
2ed0: 53 74 72 69 6e 67 4f 62 6a 28 22 64 65 73 63 22  StringObj("desc"
2ee0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
2ef0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2f00: 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54  ment(0, pElem, T
2f10: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 4f 72  cl_NewIntObj(pOr
2f20: 64 65 72 2d 3e 64 65 73 63 29 29 3b 0a 0a 20 20  der->desc));..  
2f30: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2f40: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 41  endElement(0, pA
2f50: 72 67 2c 20 70 45 6c 65 6d 29 3b 0a 20 20 20 20  rg, pElem);.    
2f60: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2f70: 28 70 45 6c 65 6d 29 3b 0a 20 20 7d 0a 0a 20 20  (pElem);.  }..  
2f80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2f90: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72  dElement(0, pScr
2fa0: 69 70 74 2c 20 70 41 72 67 29 3b 0a 20 20 54 63  ipt, pArg);.  Tc
2fb0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
2fc0: 41 72 67 29 3b 0a 0a 20 20 54 63 6c 5f 4c 69 73  Arg);..  Tcl_Lis
2fd0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2fe0: 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63  t(0, pScript, Tc
2ff0: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
3000: 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65  pIdxInfo->colUse
3010: 64 29 29 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c  d));..  rc = Tcl
3020: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
3030: 70 2c 20 70 53 63 72 69 70 74 2c 20 54 43 4c 5f  p, pScript, TCL_
3040: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
3050: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3060: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 69 66 28  (pScript);.  if(
3070: 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20   rc!=TCL_OK ){. 
3080: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
3090: 45 72 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Err = Tcl_GetStr
30a0: 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
30b0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
30c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 70 54  TE_ERROR;.    pT
30d0: 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67  ab->base.zErrMsg
30e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
30f0: 74 66 28 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a  tf("%s", zErr);.
3100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
3110: 41 6e 61 6c 79 7a 65 20 74 68 65 20 73 63 72 69  Analyze the scri
3120: 70 74 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65  pts return value
3130: 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
3140: 75 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74  ue should be a t
3150: 63 6c 20 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  cl .    ** list 
3160: 6f 62 6a 65 63 74 20 77 69 74 68 20 61 6e 20 65  object with an e
3170: 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ven number of el
3180: 65 6d 65 6e 74 73 2e 20 54 68 65 20 66 69 72 73  ements. The firs
3190: 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 65 61 63  t element of eac
31a0: 68 0a 20 20 20 20 2a 2a 20 70 61 69 72 20 6d 75  h.    ** pair mu
31b0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 20 20  st be one of:.  
31c0: 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 20 20 22    ** .    **   "
31d0: 6f 72 64 65 72 62 79 22 20 20 20 20 20 20 20 20  orderby"        
31e0: 20 20 28 76 61 6c 75 65 20 6f 66 20 6f 72 64 65    (value of orde
31f0: 72 42 79 43 6f 6e 73 75 6d 65 64 20 66 6c 61 67  rByConsumed flag
3200: 29 0a 20 20 20 20 2a 2a 20 20 20 22 63 6f 73 74  ).    **   "cost
3210: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76  "             (v
3220: 61 6c 75 65 20 6f 66 20 65 73 74 69 6d 61 74 65  alue of estimate
3230: 64 43 6f 73 74 20 66 69 65 6c 64 29 0a 20 20 20  dCost field).   
3240: 20 2a 2a 20 20 20 22 72 6f 77 73 22 20 20 20 20   **   "rows"    
3250: 20 20 20 20 20 20 20 20 20 28 76 61 6c 75 65 20           (value 
3260: 6f 66 20 65 73 74 69 6d 61 74 65 64 52 6f 77 73  of estimatedRows
3270: 20 66 69 65 6c 64 29 0a 20 20 20 20 2a 2a 20 20   field).    **  
3280: 20 22 75 73 65 22 20 20 20 20 20 20 20 20 20 20   "use"          
3290: 20 20 20 20 28 69 6e 64 65 78 20 6f 66 20 75 73      (index of us
32a0: 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e  ed constraint in
32b0: 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 29 0a   aConstraint[]).
32c0: 20 20 20 20 2a 2a 20 20 20 22 69 64 78 6e 75 6d      **   "idxnum
32d0: 22 20 20 20 20 20 20 20 20 20 20 20 28 76 61 6c  "           (val
32e0: 75 65 20 6f 66 20 69 64 78 4e 75 6d 20 66 69 65  ue of idxNum fie
32f0: 6c 64 29 0a 20 20 20 20 2a 2a 20 20 20 22 69 64  ld).    **   "id
3300: 78 73 74 72 22 20 20 20 20 20 20 20 20 20 20 20  xstr"           
3310: 28 76 61 6c 75 65 20 6f 66 20 69 64 78 53 74 72  (value of idxStr
3320: 20 66 69 65 6c 64 29 0a 20 20 20 20 2a 2a 20 20   field).    **  
3330: 20 22 6f 6d 69 74 22 20 20 20 20 20 20 20 20 20   "omit"         
3340: 20 20 20 20 28 69 6e 64 65 78 20 6f 66 20 6f 6d      (index of om
3350: 69 74 74 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  itted constraint
3360: 20 69 6e 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b   in aConstraint[
3370: 5d 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  ]).    */.    Tc
3380: 6c 5f 4f 62 6a 20 2a 70 52 65 73 20 3d 20 54 63  l_Obj *pRes = Tc
3390: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
33a0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
33b0: 4f 62 6a 20 2a 2a 61 70 45 6c 65 6d 20 3d 20 30  Obj **apElem = 0
33c0: 3b 0a 20 20 20 20 69 6e 74 20 6e 45 6c 65 6d 3b  ;.    int nElem;
33d0: 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69  .    rc = Tcl_Li
33e0: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
33f0: 28 69 6e 74 65 72 70 2c 20 70 52 65 73 2c 20 26  (interp, pRes, &
3400: 6e 45 6c 65 6d 2c 20 26 61 70 45 6c 65 6d 29 3b  nElem, &apElem);
3410: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c  .    if( rc!=TCL
3420: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  _OK ){.      con
3430: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
3440: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
3450: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
3460: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
3470: 52 52 4f 52 3b 0a 20 20 20 20 20 20 70 54 61 62  RROR;.      pTab
3480: 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d  ->base.zErrMsg =
3490: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
34a0: 28 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20  ("%s", zErr);.  
34b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
34c0: 6e 74 20 69 41 72 67 76 20 3d 20 31 3b 0a 20 20  nt iArgv = 1;.  
34d0: 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
34e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
34f0: 69 3c 6e 45 6c 65 6d 3b 20 69 69 2b 3d 32 29 7b  i<nElem; ii+=2){
3500: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
3510: 68 61 72 20 2a 7a 43 6d 64 20 3d 20 54 63 6c 5f  har *zCmd = Tcl_
3520: 47 65 74 53 74 72 69 6e 67 28 61 70 45 6c 65 6d  GetString(apElem
3530: 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 54  [ii]);.        T
3540: 63 6c 5f 4f 62 6a 20 2a 70 20 3d 20 61 70 45 6c  cl_Obj *p = apEl
3550: 65 6d 5b 69 69 2b 31 5d 3b 0a 20 20 20 20 20 20  em[ii+1];.      
3560: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
3570: 72 69 63 6d 70 28 22 63 6f 73 74 22 2c 20 7a 43  ricmp("cost", zC
3580: 6d 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  md)==0 ){.      
3590: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74      rc = Tcl_Get
35a0: 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  DoubleFromObj(in
35b0: 74 65 72 70 2c 20 70 2c 20 26 70 49 64 78 49 6e  terp, p, &pIdxIn
35c0: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
35d0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
35e0: 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  e.        if( sq
35f0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 22 6f  lite3_stricmp("o
3600: 72 64 65 72 62 79 22 2c 20 7a 43 6d 64 29 3d 3d  rderby", zCmd)==
3610: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
3620: 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  c = Tcl_GetIntFr
3630: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 2c  omObj(interp, p,
3640: 20 26 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65   &pIdxInfo->orde
3650: 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20  rByConsumed);.  
3660: 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
3670: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
3680: 73 74 72 69 63 6d 70 28 22 69 64 78 6e 75 6d 22  stricmp("idxnum"
3690: 2c 20 7a 43 6d 64 29 3d 3d 30 20 29 7b 0a 20 20  , zCmd)==0 ){.  
36a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c          rc = Tcl
36b0: 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
36c0: 6e 74 65 72 70 2c 20 70 2c 20 26 70 49 64 78 49  nterp, p, &pIdxI
36d0: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20 20  nfo->idxNum);.  
36e0: 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
36f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
3700: 73 74 72 69 63 6d 70 28 22 69 64 78 73 74 72 22  stricmp("idxstr"
3710: 2c 20 7a 43 6d 64 29 3d 3d 30 20 29 7b 0a 20 20  , zCmd)==0 ){.  
3720: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3730: 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
3740: 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20  dxStr);.        
3750: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53    pIdxInfo->idxS
3760: 74 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  tr = sqlite3_mpr
3770: 69 6e 74 66 28 22 25 73 22 2c 20 54 63 6c 5f 47  intf("%s", Tcl_G
3780: 65 74 53 74 72 69 6e 67 28 70 29 29 3b 0a 20 20  etString(p));.  
3790: 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
37a0: 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
37b0: 74 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  tr = 1;.        
37c0: 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
37d0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
37e0: 70 28 22 72 6f 77 73 22 2c 20 7a 43 6d 64 29 3d  p("rows", zCmd)=
37f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3800: 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64 65  rc = Tcl_GetWide
3810: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
3820: 70 2c 20 70 2c 20 26 70 49 64 78 49 6e 66 6f 2d  p, p, &pIdxInfo-
3830: 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
3840: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
3850: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
3860: 65 33 5f 73 74 72 69 63 6d 70 28 22 75 73 65 22  e3_stricmp("use"
3870: 2c 20 7a 43 6d 64 29 3d 3d 30 20 0a 20 20 20 20  , zCmd)==0 .    
3880: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
3890: 73 74 72 69 63 6d 70 28 22 6f 6d 69 74 22 2c 20  stricmp("omit", 
38a0: 7a 43 6d 64 29 3d 3d 30 20 0a 20 20 20 20 20 20  zCmd)==0 .      
38b0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
38c0: 6e 74 20 69 43 6f 6e 73 3b 0a 20 20 20 20 20 20  nt iCons;.      
38d0: 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74      rc = Tcl_Get
38e0: 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
38f0: 70 2c 20 70 2c 20 26 69 43 6f 6e 73 29 3b 0a 20  p, p, &iCons);. 
3900: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
3910: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3920: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
3930: 6f 6e 73 3c 30 20 7c 7c 20 69 43 6f 6e 73 3e 3d  ons<0 || iCons>=
3940: 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
3950: 72 61 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  raint ){.       
3960: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
3970: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
3980: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 62 61          pTab->ba
3990: 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  se.zErrMsg = sql
39a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e  ite3_mprintf("un
39b0: 65 78 70 65 63 74 65 64 3a 20 25 64 22 2c 20 69  expected: %d", i
39c0: 43 6f 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20  Cons);.         
39d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
39e0: 20 20 20 20 20 20 20 20 69 6e 74 20 62 4f 6d 69          int bOmi
39f0: 74 20 3d 20 28 7a 43 6d 64 5b 30 5d 3d 3d 27 6f  t = (zCmd[0]=='o
3a00: 27 20 7c 7c 20 7a 43 6d 64 5b 30 5d 3d 3d 27 4f  ' || zCmd[0]=='O
3a10: 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ');.            
3a20: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
3a30: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 43 6f  straintUsage[iCo
3a40: 6e 73 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  ns].argvIndex = 
3a50: 69 41 72 67 76 2b 2b 3b 0a 20 20 20 20 20 20 20  iArgv++;.       
3a60: 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d         pIdxInfo-
3a70: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
3a80: 65 5b 69 43 6f 6e 73 5d 2e 6f 6d 69 74 20 3d 20  e[iCons].omit = 
3a90: 62 4f 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 20  bOmit;.         
3aa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
3ab0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
3ac0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
3ad0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
3ae0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 62 61 73         pTab->bas
3af0: 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  e.zErrMsg = sqli
3b00: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 75 6e 65  te3_mprintf("une
3b10: 78 70 65 63 74 65 64 3a 20 25 73 22 2c 20 7a 43  xpected: %s", zC
3b20: 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  md);.        }. 
3b30: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
3b40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 61 62  QLITE_OK && pTab
3b50: 2d 3e 62 61 73 65 2e 7a 45 72 72 4d 73 67 3d 3d  ->base.zErrMsg==
3b60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
3b70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
3b80: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  = Tcl_GetStringR
3b90: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
3ba0: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 62           pTab->b
3bb0: 61 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71  ase.zErrMsg = sq
3bc0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
3bd0: 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  s", zErr);.     
3be0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3bf0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
3c00: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
3c10: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f  virtual table mo
3c20: 64 75 6c 65 20 74 68 61 74 20 70 72 6f 76 69 64  dule that provid
3c30: 65 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63 63  es read-only acc
3c40: 65 73 73 20 74 6f 20 61 0a 2a 2a 20 54 63 6c 20  ess to a.** Tcl 
3c50: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
3c60: 6e 61 6d 65 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  namespace..*/.st
3c70: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64  atic sqlite3_mod
3c80: 75 6c 65 20 74 63 6c 4d 6f 64 75 6c 65 20 3d 20  ule tclModule = 
3c90: 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  {.  0,          
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3cb0: 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
3cc0: 74 63 6c 43 6f 6e 6e 65 63 74 2c 0a 20 20 74 63  tclConnect,.  tc
3cd0: 6c 43 6f 6e 6e 65 63 74 2c 0a 20 20 74 63 6c 42  lConnect,.  tclB
3ce0: 65 73 74 49 6e 64 65 78 2c 0a 20 20 74 63 6c 44  estIndex,.  tclD
3cf0: 69 73 63 6f 6e 6e 65 63 74 2c 20 0a 20 20 74 63  isconnect, .  tc
3d00: 6c 44 69 73 63 6f 6e 6e 65 63 74 2c 0a 20 20 74  lDisconnect,.  t
3d10: 63 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  clOpen,         
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3d30: 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63  xOpen - open a c
3d40: 75 72 73 6f 72 20 2a 2f 0a 20 20 74 63 6c 43 6c  ursor */.  tclCl
3d50: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
3d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
3d70: 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72  se - close a cur
3d80: 73 6f 72 20 2a 2f 0a 20 20 74 63 6c 46 69 6c 74  sor */.  tclFilt
3d90: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
3da0: 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
3db0: 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
3dc0: 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
3dd0: 2f 0a 20 20 74 63 6c 4e 65 78 74 2c 20 20 20 20  /.  tclNext,    
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76    /* xNext - adv
3e00: 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  ance a cursor */
3e10: 0a 20 20 74 63 6c 45 6f 66 2c 20 20 20 20 20 20  .  tclEof,      
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e30: 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b   /* xEof - check
3e40: 20 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e   for end of scan
3e50: 20 2a 2f 0a 20 20 74 63 6c 43 6f 6c 75 6d 6e 2c   */.  tclColumn,
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e70: 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d      /* xColumn -
3e80: 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
3e90: 74 63 6c 52 6f 77 69 64 2c 20 20 20 20 20 20 20  tclRowid,       
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3eb0: 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64   xRowid - read d
3ec0: 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ata */.  0,     
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65        /* xUpdate
3ef0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f10: 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a     /* xBegin */.
3f20: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f40: 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20  * xSync */.  0, 
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
3f70: 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20  mmit */.  0,    
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62         /* xRollb
3fa0: 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ack */.  0,     
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65        /* xFindMe
3fd0: 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20  thod */.  0,    
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d         /* xRenam
4000: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 44  e */.};../*.** D
4010: 65 63 6f 64 65 20 61 20 70 6f 69 6e 74 65 72 20  ecode a pointer 
4020: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 20 6f 62  to an sqlite3 ob
4030: 6a 65 63 74 2e 0a 2a 2f 0a 65 78 74 65 72 6e 20  ject..*/.extern 
4040: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
4050: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
4060: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
4070: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
4080: 70 44 62 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  pDb);../*.** Reg
4090: 69 73 74 65 72 20 74 68 65 20 65 63 68 6f 20 76  ister the echo v
40a0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 6d 6f 64  irtual table mod
40b0: 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ule..*/.static i
40c0: 6e 74 20 72 65 67 69 73 74 65 72 5f 74 63 6c 5f  nt register_tcl_
40d0: 6d 6f 64 75 6c 65 28 0a 20 20 43 6c 69 65 6e 74  module(.  Client
40e0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
40f0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
4100: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
4110: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
4120: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4130: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
4140: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
4150: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
4160: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
4170: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
4180: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4190: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
41a0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
41b0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
41c0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
41d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
41e0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
41f0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
4200: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
4210: 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20  , objv, "DB");. 
4220: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4230: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
4240: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
4250: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
4260: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
4270: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4280: 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ROR;.#ifndef SQL
4290: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
42a0: 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 5f  TABLE.  sqlite3_
42b0: 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62  create_module(db
42c0: 2c 20 22 74 63 6c 22 2c 20 26 74 63 6c 4d 6f 64  , "tcl", &tclMod
42d0: 75 6c 65 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74  ule, (void *)int
42e0: 65 72 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  erp);.#endif.  r
42f0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
4300: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
4310: 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64  Register command
4320: 73 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69  s with the TCL i
4330: 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69  nterpreter..*/.i
4340: 6e 74 20 53 71 6c 69 74 65 74 65 73 74 74 63 6c  nt Sqlitetesttcl
4350: 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
4360: 20 2a 69 6e 74 65 72 70 29 7b 0a 23 69 66 6e 64   *interp){.#ifnd
4370: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
4380: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 74  IRTUALTABLE.  st
4390: 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20  atic struct {.  
43a0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
43b0: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50       Tcl_ObjCmdP
43c0: 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20  roc *xProc;.    
43d0: 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
43e0: 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d  a;.  } aObjCmd[]
43f0: 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 72 65 67   = {.     { "reg
4400: 69 73 74 65 72 5f 74 63 6c 5f 6d 6f 64 75 6c 65  ister_tcl_module
4410: 22 2c 20 20 20 72 65 67 69 73 74 65 72 5f 74 63  ",   register_tc
4420: 6c 5f 6d 6f 64 75 6c 65 2c 20 30 20 7d 2c 0a 20  l_module, 0 },. 
4430: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   };.  int i;.  f
4440: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4450: 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66  (aObjCmd)/sizeof
4460: 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b  (aObjCmd[0]); i+
4470: 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  +){.    Tcl_Crea
4480: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
4490: 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  erp, aObjCmd[i].
44a0: 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
44b0: 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63  aObjCmd[i].xProc
44c0: 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69  , aObjCmd[i].cli
44d0: 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d  entData, 0);.  }
44e0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
44f0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a                  TCL_OK;.}.