/ Hex Artifact Content
Login

Artifact 78809f11026f18a93fcfd798d9479cba37e1201c830260bf1edc674b2fa9b857:


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 66 20 64 65 66 69 6e  Int.h".#if defin
0d60: 65 64 28 49 4e 43 4c 55 44 45 5f 53 51 4c 49 54  ed(INCLUDE_SQLIT
0d70: 45 5f 54 43 4c 5f 48 29 0a 23 20 20 69 6e 63 6c  E_TCL_H).#  incl
0d80: 75 64 65 20 22 73 71 6c 69 74 65 5f 74 63 6c 2e  ude "sqlite_tcl.
0d90: 68 22 0a 23 65 6c 73 65 0a 23 20 20 69 6e 63 6c  h".#else.#  incl
0da0: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 65 6e 64  ude "tcl.h".#end
0db0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
0dc0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
0dd0: 41 42 4c 45 0a 0a 74 79 70 65 64 65 66 20 73 74  ABLE..typedef st
0de0: 72 75 63 74 20 74 63 6c 5f 76 74 61 62 20 74 63  ruct tcl_vtab tc
0df0: 6c 5f 76 74 61 62 3b 0a 74 79 70 65 64 65 66 20  l_vtab;.typedef 
0e00: 73 74 72 75 63 74 20 74 63 6c 5f 63 75 72 73 6f  struct tcl_curso
0e10: 72 20 74 63 6c 5f 63 75 72 73 6f 72 3b 0a 0a 2f  r tcl_cursor;../
0e20: 2a 20 0a 2a 2a 20 41 20 66 73 20 76 69 72 74 75  * .** A fs virtu
0e30: 61 6c 2d 74 61 62 6c 65 20 6f 62 6a 65 63 74 20  al-table object 
0e40: 0a 2a 2f 0a 73 74 72 75 63 74 20 74 63 6c 5f 76  .*/.struct tcl_v
0e50: 74 61 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  tab {.  sqlite3_
0e60: 76 74 61 62 20 62 61 73 65 3b 0a 20 20 54 63 6c  vtab base;.  Tcl
0e70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
0e80: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 64  .  Tcl_Obj *pCmd
0e90: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
0ea0: 0a 7d 3b 0a 0a 2f 2a 20 41 20 74 63 6c 20 63 75  .};../* A tcl cu
0eb0: 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73  rsor object */.s
0ec0: 74 72 75 63 74 20 74 63 6c 5f 63 75 72 73 6f 72  truct tcl_cursor
0ed0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61   {.  sqlite3_vta
0ee0: 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 0a 20  b_cursor base;. 
0ef0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0f00: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
0f10: 20 2f 2a 20 52 65 61 64 20 64 61 74 61 20 66 72   /* Read data fr
0f20: 6f 6d 20 68 65 72 65 20 2a 2f 0a 7d 3b 0a 0a 2f  om here */.};../
0f30: 2a 0a 2a 2a 20 44 65 71 75 6f 74 65 20 73 74 72  *.** Dequote str
0f40: 69 6e 67 20 7a 20 69 6e 20 70 6c 61 63 65 2e 0a  ing z in place..
0f50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
0f60: 63 6c 44 65 71 75 6f 74 65 28 63 68 61 72 20 2a  clDequote(char *
0f70: 7a 29 7b 0a 20 20 63 68 61 72 20 71 20 3d 20 7a  z){.  char q = z
0f80: 5b 30 5d 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 73  [0];..  /* Set s
0f90: 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 71 20  tack variable q 
0fa0: 74 6f 20 74 68 65 20 63 6c 6f 73 65 2d 71 75 6f  to the close-quo
0fb0: 74 65 20 63 68 61 72 61 63 74 65 72 20 2a 2f 0a  te character */.
0fc0: 20 20 69 66 28 20 71 3d 3d 27 5b 27 20 7c 7c 20    if( q=='[' || 
0fd0: 71 3d 3d 27 5c 27 27 20 7c 7c 20 71 3d 3d 27 22  q=='\'' || q=='"
0fe0: 27 20 7c 7c 20 71 3d 3d 27 60 27 20 29 7b 0a 20  ' || q=='`' ){. 
0ff0: 20 20 20 69 6e 74 20 69 49 6e 20 3d 20 31 3b 0a     int iIn = 1;.
1000: 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30      int iOut = 0
1010: 3b 0a 20 20 20 20 69 66 28 20 71 3d 3d 27 5b 27  ;.    if( q=='['
1020: 20 29 20 71 20 3d 20 27 5d 27 3b 20 20 0a 0a 20   ) q = ']';  .. 
1030: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
1040: 28 7a 5b 69 49 6e 5d 29 20 29 7b 0a 20 20 20 20  (z[iIn]) ){.    
1050: 20 20 69 66 28 20 7a 5b 69 49 6e 5d 3d 3d 71 20    if( z[iIn]==q 
1060: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
1070: 5b 69 49 6e 2b 31 5d 21 3d 71 20 29 7b 0a 20 20  [iIn+1]!=q ){.  
1080: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61          /* Chara
1090: 63 74 65 72 20 69 49 6e 20 77 61 73 20 74 68 65  cter iIn was the
10a0: 20 63 6c 6f 73 65 20 71 75 6f 74 65 2e 20 2a 2f   close quote. */
10b0: 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b  .          iIn++
10c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
10d0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
10e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
10f0: 68 61 72 61 63 74 65 72 20 69 49 6e 20 61 6e 64  haracter iIn and
1100: 20 69 49 6e 2b 31 20 66 6f 72 6d 20 61 6e 20 65   iIn+1 form an e
1110: 73 63 61 70 65 64 20 71 75 6f 74 65 20 63 68 61  scaped quote cha
1120: 72 61 63 74 65 72 2e 20 53 6b 69 70 0a 20 20 20  racter. Skip.   
1130: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e         ** the in
1140: 70 75 74 20 63 75 72 73 6f 72 20 70 61 73 74 20  put cursor past 
1150: 62 6f 74 68 20 61 6e 64 20 63 6f 70 79 20 61 20  both and copy a 
1160: 73 69 6e 67 6c 65 20 71 75 6f 74 65 20 63 68 61  single quote cha
1170: 72 61 63 74 65 72 20 0a 20 20 20 20 20 20 20 20  racter .        
1180: 20 20 2a 2a 20 74 6f 20 74 68 65 20 6f 75 74 70    ** to the outp
1190: 75 74 20 62 75 66 66 65 72 2e 20 2a 2f 0a 20 20  ut buffer. */.  
11a0: 20 20 20 20 20 20 20 20 69 49 6e 20 2b 3d 20 32          iIn += 2
11b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 69 4f  ;.          z[iO
11c0: 75 74 2b 2b 5d 20 3d 20 71 3b 0a 20 20 20 20 20  ut++] = q;.     
11d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
11e0: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 69 4f 75 74  {.        z[iOut
11f0: 2b 2b 5d 20 3d 20 7a 5b 69 49 6e 2b 2b 5d 3b 0a  ++] = z[iIn++];.
1200: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1210: 20 20 20 7a 5b 69 4f 75 74 5d 20 3d 20 27 5c 30     z[iOut] = '\0
1220: 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ';.  }.}../*.** 
1230: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1240: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
1250: 69 6f 6e 20 6f 66 20 62 6f 74 68 20 74 68 65 20  ion of both the 
1260: 78 43 6f 6e 6e 65 63 74 20 61 6e 64 20 78 43 72  xConnect and xCr
1270: 65 61 74 65 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  eate.** methods 
1280: 6f 66 20 74 68 65 20 66 73 20 76 69 72 74 75 61  of the fs virtua
1290: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  l table..**.** T
12a0: 68 65 20 61 72 67 76 5b 5d 20 61 72 72 61 79 20  he argv[] array 
12b0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 6f 6c  contains the fol
12c0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
12d0: 61 72 67 76 5b 30 5d 20 20 20 2d 3e 20 6d 6f 64  argv[0]   -> mod
12e0: 75 6c 65 20 6e 61 6d 65 20 20 28 22 66 73 22 29  ule name  ("fs")
12f0: 0a 2a 2a 20 20 20 61 72 67 76 5b 31 5d 20 20 20  .**   argv[1]   
1300: 2d 3e 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  -> database name
1310: 0a 2a 2a 20 20 20 61 72 67 76 5b 32 5d 20 20 20  .**   argv[2]   
1320: 2d 3e 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a  -> table name.**
1330: 20 20 20 61 72 67 76 5b 2e 2e 2e 5d 20 2d 3e 20     argv[...] -> 
1340: 6f 74 68 65 72 20 6d 6f 64 75 6c 65 20 61 72 67  other module arg
1350: 75 6d 65 6e 74 20 66 69 65 6c 64 73 2e 0a 2a 2f  ument fields..*/
1360: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 43  .static int tclC
1370: 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74 65  onnect(.  sqlite
1380: 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70  3 *db,.  void *p
1390: 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Aux,.  int argc,
13a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e   const char *con
13b0: 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69 74  st*argv,.  sqlit
13c0: 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61 62  e3_vtab **ppVtab
13d0: 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
13e0: 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
13f0: 20 2a 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f   *interp = (Tcl_
1400: 49 6e 74 65 72 70 2a 29 70 41 75 78 3b 0a 20 20  Interp*)pAux;.  
1410: 74 63 6c 5f 76 74 61 62 20 2a 70 54 61 62 20 3d  tcl_vtab *pTab =
1420: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6d 64   0;.  char *zCmd
1430: 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   = 0;.  Tcl_Obj 
1440: 2a 70 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20  *pScript = 0;.  
1450: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1460: 4f 4b 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  OK;..  if( argc!
1470: 3d 34 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  =4 ){.    *pzErr
1480: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1490: 74 66 28 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72  tf("wrong number
14a0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 29 3b   of arguments");
14b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
14d0: 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f   zCmd = sqlite3_
14e0: 6d 61 6c 6c 6f 63 36 34 28 73 74 72 6c 65 6e 28  malloc64(strlen(
14f0: 61 72 67 76 5b 33 5d 29 2b 31 29 3b 0a 20 20 70  argv[3])+1);.  p
1500: 54 61 62 20 3d 20 28 74 63 6c 5f 76 74 61 62 2a  Tab = (tcl_vtab*
1510: 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36  )sqlite3_malloc6
1520: 34 28 73 69 7a 65 6f 66 28 74 63 6c 5f 76 74 61  4(sizeof(tcl_vta
1530: 62 29 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 20  b));.  if( zCmd 
1540: 26 26 20 70 54 61 62 20 29 7b 0a 20 20 20 20 6d  && pTab ){.    m
1550: 65 6d 63 70 79 28 7a 43 6d 64 2c 20 61 72 67 76  emcpy(zCmd, argv
1560: 5b 33 5d 2c 20 73 74 72 6c 65 6e 28 61 72 67 76  [3], strlen(argv
1570: 5b 33 5d 29 2b 31 29 3b 0a 20 20 20 20 74 63 6c  [3])+1);.    tcl
1580: 44 65 71 75 6f 74 65 28 7a 43 6d 64 29 3b 0a 20  Dequote(zCmd);. 
1590: 20 20 20 6d 65 6d 73 65 74 28 70 54 61 62 2c 20     memset(pTab, 
15a0: 30 2c 20 73 69 7a 65 6f 66 28 74 63 6c 5f 76 74  0, sizeof(tcl_vt
15b0: 61 62 29 29 3b 0a 0a 20 20 20 20 70 54 61 62 2d  ab));..    pTab-
15c0: 3e 70 43 6d 64 20 3d 20 54 63 6c 5f 4e 65 77 53  >pCmd = Tcl_NewS
15d0: 74 72 69 6e 67 4f 62 6a 28 7a 43 6d 64 2c 20 2d  tringObj(zCmd, -
15e0: 31 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 6e  1);.    pTab->in
15f0: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
1600: 20 20 20 70 54 61 62 2d 3e 64 62 20 3d 20 64 62     pTab->db = db
1610: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
1620: 66 43 6f 75 6e 74 28 70 54 61 62 2d 3e 70 43 6d  fCount(pTab->pCm
1630: 64 29 3b 0a 0a 20 20 20 20 70 53 63 72 69 70 74  d);..    pScript
1640: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
1650: 4f 62 6a 28 70 54 61 62 2d 3e 70 43 6d 64 29 3b  Obj(pTab->pCmd);
1660: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
1670: 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a  Count(pScript);.
1680: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1690: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
16a0: 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 54 63  erp, pScript, Tc
16b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
16c0: 78 43 6f 6e 6e 65 63 74 22 2c 20 2d 31 29 29 3b  xConnect", -1));
16d0: 0a 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 45  ..    rc = Tcl_E
16e0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
16f0: 20 70 53 63 72 69 70 74 2c 20 54 43 4c 5f 45 56   pScript, TCL_EV
1700: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20  AL_GLOBAL);.    
1710: 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29  if( rc!=TCL_OK )
1720: 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d  {.      *pzErr =
1730: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1740: 28 22 25 73 22 2c 20 54 63 6c 5f 47 65 74 53 74  ("%s", Tcl_GetSt
1750: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
1760: 70 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  p));.      rc = 
1770: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1790: 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  c = sqlite3_decl
17a0: 61 72 65 5f 76 74 61 62 28 64 62 2c 20 54 63 6c  are_vtab(db, Tcl
17b0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
17c0: 28 69 6e 74 65 72 70 29 29 3b 0a 20 20 20 20 7d  (interp));.    }
17d0: 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ..    if( rc!=SQ
17e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
1800: 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  ab);.      pTab 
1810: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
1820: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
1830: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
1840: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1850: 43 6d 64 29 3b 0a 20 20 2a 70 70 56 74 61 62 20  Cmd);.  *ppVtab 
1860: 3d 20 26 70 54 61 62 2d 3e 62 61 73 65 3b 0a 20  = &pTab->base;. 
1870: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1880: 2a 20 54 68 65 20 78 44 69 73 63 6f 6e 6e 65 63  * The xDisconnec
1890: 74 20 61 6e 64 20 78 44 65 73 74 72 6f 79 20 6d  t and xDestroy m
18a0: 65 74 68 6f 64 73 20 61 72 65 20 61 6c 73 6f 20  ethods are also 
18b0: 74 68 65 20 73 61 6d 65 20 2a 2f 0a 73 74 61 74  the same */.stat
18c0: 69 63 20 69 6e 74 20 74 63 6c 44 69 73 63 6f 6e  ic int tclDiscon
18d0: 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61  nect(sqlite3_vta
18e0: 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 74 63 6c  b *pVtab){.  tcl
18f0: 5f 76 74 61 62 20 2a 70 54 61 62 20 3d 20 28 74  _vtab *pTab = (t
1900: 63 6c 5f 76 74 61 62 2a 29 70 56 74 61 62 3b 0a  cl_vtab*)pVtab;.
1910: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
1920: 6e 74 28 70 54 61 62 2d 3e 70 43 6d 64 29 3b 0a  nt(pTab->pCmd);.
1930: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1940: 54 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Tab);.  return S
1950: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1960: 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 74 63  ** Open a new tc
1970: 6c 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61  l cursor..*/.sta
1980: 74 69 63 20 69 6e 74 20 74 63 6c 4f 70 65 6e 28  tic int tclOpen(
1990: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
19a0: 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 76 74 61  Tab, sqlite3_vta
19b0: 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72  b_cursor **ppCur
19c0: 73 6f 72 29 7b 0a 20 20 74 63 6c 5f 63 75 72 73  sor){.  tcl_curs
19d0: 6f 72 20 2a 70 43 75 72 3b 0a 20 20 70 43 75 72  or *pCur;.  pCur
19e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
19f0: 63 28 73 69 7a 65 6f 66 28 74 63 6c 5f 63 75 72  c(sizeof(tcl_cur
1a00: 73 6f 72 29 29 3b 0a 20 20 69 66 28 20 70 43 75  sor));.  if( pCu
1a10: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
1a20: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
1a30: 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20 73 69  mset(pCur, 0, si
1a40: 7a 65 6f 66 28 74 63 6c 5f 63 75 72 73 6f 72 29  zeof(tcl_cursor)
1a50: 29 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d  );.  *ppCursor =
1a60: 20 26 70 43 75 72 2d 3e 62 61 73 65 3b 0a 20 20   &pCur->base;.  
1a70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1a90: 20 61 20 74 63 6c 20 63 75 72 73 6f 72 2e 0a 2a   a tcl cursor..*
1aa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c  /.static int tcl
1ab0: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74  Close(sqlite3_vt
1ac0: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
1ad0: 0a 20 20 74 63 6c 5f 63 75 72 73 6f 72 20 2a 70  .  tcl_cursor *p
1ae0: 43 75 72 20 3d 20 28 74 63 6c 5f 63 75 72 73 6f  Cur = (tcl_curso
1af0: 72 20 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 70  r *)cur;.  if( p
1b00: 43 75 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Cur ){.    sqlit
1b10: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 43 75 72  e3_finalize(pCur
1b20: 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  ->pStmt);.    sq
1b30: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
1b40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1b50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  QLITE_OK;.}..sta
1b60: 74 69 63 20 69 6e 74 20 74 63 6c 4e 65 78 74 28  tic int tclNext(
1b70: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
1b80: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
1b90: 29 7b 0a 20 20 74 63 6c 5f 63 75 72 73 6f 72 20  ){.  tcl_cursor 
1ba0: 2a 70 43 73 72 20 3d 20 28 74 63 6c 5f 63 75 72  *pCsr = (tcl_cur
1bb0: 73 6f 72 2a 29 70 56 74 61 62 43 75 72 73 6f 72  sor*)pVtabCursor
1bc0: 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 70 53  ;.  if( pCsr->pS
1bd0: 74 6d 74 20 29 7b 0a 20 20 20 20 74 63 6c 5f 76  tmt ){.    tcl_v
1be0: 74 61 62 20 2a 70 54 61 62 20 3d 20 28 74 63 6c  tab *pTab = (tcl
1bf0: 5f 76 74 61 62 2a 29 28 70 56 74 61 62 43 75 72  _vtab*)(pVtabCur
1c00: 73 6f 72 2d 3e 70 56 74 61 62 29 3b 0a 20 20 20  sor->pVtab);.   
1c10: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1c20: 33 5f 73 74 65 70 28 70 43 73 72 2d 3e 70 53 74  3_step(pCsr->pSt
1c30: 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  mt);.    if( rc!
1c40: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1c50: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1c60: 2a 7a 45 72 72 3b 0a 20 20 20 20 20 20 72 63 20  *zErr;.      rc 
1c70: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
1c80: 7a 65 28 70 43 73 72 2d 3e 70 53 74 6d 74 29 3b  ze(pCsr->pStmt);
1c90: 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 70 53 74  .      pCsr->pSt
1ca0: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  mt = 0;.      if
1cb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cc0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
1cd0: 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
1ce0: 28 70 54 61 62 2d 3e 64 62 29 3b 0a 20 20 20 20  (pTab->db);.    
1cf0: 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a      pTab->base.z
1d00: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
1d10: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
1d20: 45 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Err);.      }.  
1d30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1d40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
1d50: 74 61 74 69 63 20 69 6e 74 20 74 63 6c 46 69 6c  tatic int tclFil
1d60: 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ter(.  sqlite3_v
1d70: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61  tab_cursor *pVta
1d80: 62 43 75 72 73 6f 72 2c 20 0a 20 20 69 6e 74 20  bCursor, .  int 
1d90: 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68  idxNum, const ch
1da0: 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e  ar *idxStr,.  in
1db0: 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
1dc0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
1dd0: 20 20 74 63 6c 5f 63 75 72 73 6f 72 20 2a 70 43    tcl_cursor *pC
1de0: 73 72 20 3d 20 28 74 63 6c 5f 63 75 72 73 6f 72  sr = (tcl_cursor
1df0: 2a 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  *)pVtabCursor;. 
1e00: 20 74 63 6c 5f 76 74 61 62 20 2a 70 54 61 62 20   tcl_vtab *pTab 
1e10: 3d 20 28 74 63 6c 5f 76 74 61 62 2a 29 28 70 56  = (tcl_vtab*)(pV
1e20: 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
1e30: 29 3b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  );.  Tcl_Interp 
1e40: 2a 69 6e 74 65 72 70 20 3d 20 70 54 61 62 2d 3e  *interp = pTab->
1e50: 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
1e60: 6a 20 2a 70 53 63 72 69 70 74 3b 0a 20 20 54 63  j *pScript;.  Tc
1e70: 6c 5f 4f 62 6a 20 2a 70 41 72 67 3b 0a 20 20 69  l_Obj *pArg;.  i
1e80: 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 72 63 3b  nt ii;.  int rc;
1e90: 0a 0a 20 20 70 53 63 72 69 70 74 20 3d 20 54 63  ..  pScript = Tc
1ea0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70  l_DuplicateObj(p
1eb0: 54 61 62 2d 3e 70 43 6d 64 29 3b 0a 20 20 54 63  Tab->pCmd);.  Tc
1ec0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
1ed0: 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c  Script);.  Tcl_L
1ee0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1ef0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 53 63 72  ent(interp, pScr
1f00: 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  ipt, Tcl_NewStri
1f10: 6e 67 4f 62 6a 28 22 78 46 69 6c 74 65 72 22 2c  ngObj("xFilter",
1f20: 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
1f30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1f40: 74 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  t(interp, pScrip
1f50: 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
1f60: 28 69 64 78 4e 75 6d 29 29 3b 0a 20 20 69 66 28  (idxNum));.  if(
1f70: 20 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20 54   idxStr ){.    T
1f80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1f90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1fa0: 70 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77  pScript, Tcl_New
1fb0: 53 74 72 69 6e 67 4f 62 6a 28 69 64 78 53 74 72  StringObj(idxStr
1fc0: 2c 20 2d 31 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  , -1));.  }else{
1fd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1fe0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1ff0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 54  terp, pScript, T
2000: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2010: 22 22 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 0a 20  "", -1));.  }.. 
2020: 20 70 41 72 67 20 3d 20 54 63 6c 5f 4e 65 77 4f   pArg = Tcl_NewO
2030: 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  bj();.  Tcl_Incr
2040: 52 65 66 43 6f 75 6e 74 28 70 41 72 67 29 3b 0a  RefCount(pArg);.
2050: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 61    for(ii=0; ii<a
2060: 72 67 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  rgc; ii++){.    
2070: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
2080: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2090: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
20a0: 78 74 28 61 72 67 76 5b 69 69 5d 29 3b 0a 20 20  xt(argv[ii]);.  
20b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61 6c 3b    Tcl_Obj *pVal;
20c0: 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 3d 3d 30  .    if( zVal==0
20d0: 20 29 7b 0a 20 20 20 20 20 20 70 56 61 6c 20 3d   ){.      pVal =
20e0: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
20f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2100: 70 56 61 6c 20 3d 20 54 63 6c 5f 4e 65 77 53 74  pVal = Tcl_NewSt
2110: 72 69 6e 67 4f 62 6a 28 7a 56 61 6c 2c 20 2d 31  ringObj(zVal, -1
2120: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
2130: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2140: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 41  ement(interp, pA
2150: 72 67 2c 20 70 56 61 6c 29 3b 0a 20 20 7d 0a 20  rg, pVal);.  }. 
2160: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2170: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2180: 2c 20 70 53 63 72 69 70 74 2c 20 70 41 72 67 29  , pScript, pArg)
2190: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
21a0: 6f 75 6e 74 28 70 41 72 67 29 3b 0a 0a 20 20 72  ount(pArg);..  r
21b0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
21c0: 78 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  x(interp, pScrip
21d0: 74 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  t, TCL_EVAL_GLOB
21e0: 41 4c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  AL);.  if( rc!=T
21f0: 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  CL_OK ){.    con
2200: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
2210: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
2220: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
2230: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2240: 4f 52 3b 0a 20 20 20 20 70 54 61 62 2d 3e 62 61  OR;.    pTab->ba
2250: 73 65 2e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  se.zErrMsg = sql
2260: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
2270: 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 65 6c 73  ", zErr);.  }els
2280: 65 7b 0a 20 20 20 20 2f 2a 20 41 6e 61 6c 79 7a  e{.    /* Analyz
2290: 65 20 74 68 65 20 73 63 72 69 70 74 73 20 72 65  e the scripts re
22a0: 74 75 72 6e 20 76 61 6c 75 65 2e 20 54 68 65 20  turn value. The 
22b0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 73 68 6f  return value sho
22c0: 75 6c 64 20 62 65 20 61 20 74 63 6c 20 0a 20 20  uld be a tcl .  
22d0: 20 20 2a 2a 20 6c 69 73 74 20 6f 62 6a 65 63 74    ** list object
22e0: 20 77 69 74 68 20 61 6e 20 65 76 65 6e 20 6e 75   with an even nu
22f0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
2300: 2e 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  . The first elem
2310: 65 6e 74 20 6f 66 20 65 61 63 68 0a 20 20 20 20  ent of each.    
2320: 2a 2a 20 70 61 69 72 20 6d 75 73 74 20 62 65 20  ** pair must be 
2330: 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 20 0a  one of:.    ** .
2340: 20 20 20 20 2a 2a 20 20 20 22 73 71 6c 22 20 20      **   "sql"  
2350: 20 20 20 20 20 20 20 20 28 53 51 4c 20 73 74 61          (SQL sta
2360: 74 65 6d 65 6e 74 20 74 6f 20 72 65 74 75 72 6e  tement to return
2370: 20 64 61 74 61 29 0a 20 20 20 20 2a 2f 0a 20 20   data).    */.  
2380: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 20    Tcl_Obj *pRes 
2390: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
23a0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
23b0: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 45 6c 65 6d  Tcl_Obj **apElem
23c0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 45   = 0;.    int nE
23d0: 6c 65 6d 3b 0a 20 20 20 20 72 63 20 3d 20 54 63  lem;.    rc = Tc
23e0: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
23f0: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 70 52 65  ents(interp, pRe
2400: 73 2c 20 26 6e 45 6c 65 6d 2c 20 26 61 70 45 6c  s, &nElem, &apEl
2410: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  em);.    if( rc!
2420: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
2430: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
2440: 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  r = Tcl_GetStrin
2450: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  gResult(interp);
2460: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2470: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
2480: 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d  pTab->base.zErrM
2490: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
24a0: 69 6e 74 66 28 22 25 73 22 2c 20 7a 45 72 72 29  intf("%s", zErr)
24b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24c0: 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
24d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
24e0: 3c 6e 45 6c 65 6d 3b 20 69 69 2b 3d 32 29 7b 0a  <nElem; ii+=2){.
24f0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2500: 61 72 20 2a 7a 43 6d 64 20 3d 20 54 63 6c 5f 47  ar *zCmd = Tcl_G
2510: 65 74 53 74 72 69 6e 67 28 61 70 45 6c 65 6d 5b  etString(apElem[
2520: 69 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 54 63  ii]);.        Tc
2530: 6c 5f 4f 62 6a 20 2a 70 20 3d 20 61 70 45 6c 65  l_Obj *p = apEle
2540: 6d 5b 69 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20  m[ii+1];.       
2550: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
2560: 69 63 6d 70 28 22 73 71 6c 22 2c 20 7a 43 6d 64  icmp("sql", zCmd
2570: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2580: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2590: 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
25a0: 6e 67 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ng(p);.         
25b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
25c0: 65 70 61 72 65 5f 76 32 28 70 54 61 62 2d 3e 64  epare_v2(pTab->d
25d0: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 43  b, zSql, -1, &pC
25e0: 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a 20  sr->pStmt, 0);. 
25f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2600: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2610: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
2620: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c  char *zErr = sql
2630: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 54 61 62  ite3_errmsg(pTab
2640: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  ->db);.         
2650: 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45     pTab->base.zE
2660: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
2670: 6d 70 72 69 6e 74 66 28 22 75 6e 65 78 70 65 63  mprintf("unexpec
2680: 74 65 64 3a 20 25 73 22 2c 20 7a 45 72 72 29 3b  ted: %s", zErr);
2690: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26b0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
26d0: 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45     pTab->base.zE
26e0: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
26f0: 6d 70 72 69 6e 74 66 28 22 75 6e 65 78 70 65 63  mprintf("unexpec
2700: 74 65 64 3a 20 25 73 22 2c 20 7a 43 6d 64 29 3b  ted: %s", zCmd);
2710: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2720: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2730: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2740: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 63  K ){.    rc = tc
2750: 6c 4e 65 78 74 28 70 56 74 61 62 43 75 72 73 6f  lNext(pVtabCurso
2760: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
2770: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
2780: 6e 74 20 74 63 6c 43 6f 6c 75 6d 6e 28 0a 20 20  nt tclColumn(.  
2790: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
27a0: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
27b0: 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  , .  sqlite3_con
27c0: 74 65 78 74 20 2a 63 74 78 2c 20 0a 20 20 69 6e  text *ctx, .  in
27d0: 74 20 69 0a 29 7b 0a 20 20 74 63 6c 5f 63 75 72  t i.){.  tcl_cur
27e0: 73 6f 72 20 2a 70 43 73 72 20 3d 20 28 74 63 6c  sor *pCsr = (tcl
27f0: 5f 63 75 72 73 6f 72 2a 29 70 56 74 61 62 43 75  _cursor*)pVtabCu
2800: 72 73 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f  rsor;.  sqlite3_
2810: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
2820: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
2830: 5f 76 61 6c 75 65 28 70 43 73 72 2d 3e 70 53 74  _value(pCsr->pSt
2840: 6d 74 2c 20 69 2b 31 29 29 3b 0a 20 20 72 65 74  mt, i+1));.  ret
2850: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2860: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c  ..static int tcl
2870: 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74  Rowid(sqlite3_vt
2880: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
2890: 43 75 72 73 6f 72 2c 20 73 71 6c 69 74 65 5f 69  Cursor, sqlite_i
28a0: 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20  nt64 *pRowid){. 
28b0: 20 74 63 6c 5f 63 75 72 73 6f 72 20 2a 70 43 73   tcl_cursor *pCs
28c0: 72 20 3d 20 28 74 63 6c 5f 63 75 72 73 6f 72 2a  r = (tcl_cursor*
28d0: 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
28e0: 2a 70 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  *pRowid = sqlite
28f0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
2900: 43 73 72 2d 3e 70 53 74 6d 74 2c 20 30 29 3b 0a  Csr->pStmt, 0);.
2910: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2920: 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
2930: 74 20 74 63 6c 45 6f 66 28 73 71 6c 69 74 65 33  t tclEof(sqlite3
2940: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
2950: 74 61 62 43 75 72 73 6f 72 29 7b 0a 20 20 74 63  tabCursor){.  tc
2960: 6c 5f 63 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  l_cursor *pCsr =
2970: 20 28 74 63 6c 5f 63 75 72 73 6f 72 2a 29 70 56   (tcl_cursor*)pV
2980: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 72 65 74  tabCursor;.  ret
2990: 75 72 6e 20 28 70 43 73 72 2d 3e 70 53 74 6d 74  urn (pCsr->pStmt
29a0: 3d 3d 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ==0);.}..static 
29b0: 69 6e 74 20 74 63 6c 42 65 73 74 49 6e 64 65 78  int tclBestIndex
29c0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74  (sqlite3_vtab *t
29d0: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
29e0: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
29f0: 29 7b 0a 20 20 74 63 6c 5f 76 74 61 62 20 2a 70  ){.  tcl_vtab *p
2a00: 54 61 62 20 3d 20 28 74 63 6c 5f 76 74 61 62 2a  Tab = (tcl_vtab*
2a10: 29 74 61 62 3b 0a 20 20 54 63 6c 5f 49 6e 74 65  )tab;.  Tcl_Inte
2a20: 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 70 54 61  rp *interp = pTa
2a30: 62 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  b->interp;.  Tcl
2a40: 5f 4f 62 6a 20 2a 70 41 72 67 3b 0a 20 20 54 63  _Obj *pArg;.  Tc
2a50: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 3b 0a  l_Obj *pScript;.
2a60: 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
2a70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a80: 0a 20 20 70 53 63 72 69 70 74 20 3d 20 54 63 6c  .  pScript = Tcl
2a90: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 54  _DuplicateObj(pT
2aa0: 61 62 2d 3e 70 43 6d 64 29 3b 0a 20 20 54 63 6c  ab->pCmd);.  Tcl
2ab0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53  _IncrRefCount(pS
2ac0: 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69  cript);.  Tcl_Li
2ad0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2ae0: 6e 74 28 69 6e 74 65 72 70 2c 20 70 53 63 72 69  nt(interp, pScri
2af0: 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pt, Tcl_NewStrin
2b00: 67 4f 62 6a 28 22 78 42 65 73 74 49 6e 64 65 78  gObj("xBestIndex
2b10: 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 70 41 72 67  ", -1));..  pArg
2b20: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
2b30: 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
2b40: 75 6e 74 28 70 41 72 67 29 3b 0a 20 20 66 6f 72  unt(pArg);.  for
2b50: 28 69 69 3d 30 3b 20 69 69 3c 70 49 64 78 49 6e  (ii=0; ii<pIdxIn
2b60: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->nConstraint;
2b70: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75   ii++){.    stru
2b80: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
2b90: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6e 73  _constraint cons
2ba0: 74 20 2a 70 43 6f 6e 73 20 3d 20 26 70 49 64 78  t *pCons = &pIdx
2bb0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
2bc0: 74 5b 69 69 5d 3b 0a 20 20 20 20 54 63 6c 5f 4f  t[ii];.    Tcl_O
2bd0: 62 6a 20 2a 70 45 6c 65 6d 20 3d 20 54 63 6c 5f  bj *pElem = Tcl_
2be0: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 63 6f  NewObj();.    co
2bf0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20  nst char *zOp = 
2c00: 22 3f 22 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e  "?";..    Tcl_In
2c10: 63 72 52 65 66 43 6f 75 6e 74 28 70 45 6c 65 6d  crRefCount(pElem
2c20: 29 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20  );..    switch( 
2c30: 70 43 6f 6e 73 2d 3e 6f 70 20 29 7b 0a 20 20 20  pCons->op ){.   
2c40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
2c50: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
2c60: 45 51 3a 0a 20 20 20 20 20 20 20 20 7a 4f 70 20  EQ:.        zOp 
2c70: 3d 20 22 65 71 22 3b 20 62 72 65 61 6b 3b 0a 20  = "eq"; break;. 
2c80: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
2c90: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
2ca0: 54 5f 47 54 3a 0a 20 20 20 20 20 20 20 20 7a 4f  T_GT:.        zO
2cb0: 70 20 3d 20 22 67 74 22 3b 20 62 72 65 61 6b 3b  p = "gt"; break;
2cc0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
2cd0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
2ce0: 49 4e 54 5f 4c 45 3a 0a 20 20 20 20 20 20 20 20  INT_LE:.        
2cf0: 7a 4f 70 20 3d 20 22 6c 65 22 3b 20 62 72 65 61  zOp = "le"; brea
2d00: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
2d10: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
2d20: 52 41 49 4e 54 5f 4c 54 3a 0a 20 20 20 20 20 20  RAINT_LT:.      
2d30: 20 20 7a 4f 70 20 3d 20 22 6c 74 22 3b 20 62 72    zOp = "lt"; br
2d40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
2d50: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
2d60: 53 54 52 41 49 4e 54 5f 47 45 3a 0a 20 20 20 20  STRAINT_GE:.    
2d70: 20 20 20 20 7a 4f 70 20 3d 20 22 67 65 22 3b 20      zOp = "ge"; 
2d80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
2d90: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
2da0: 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 3a  ONSTRAINT_MATCH:
2db0: 0a 20 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  .        zOp = "
2dc0: 6d 61 74 63 68 22 3b 20 62 72 65 61 6b 3b 0a 20  match"; break;. 
2dd0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
2de0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
2df0: 54 5f 4c 49 4b 45 3a 0a 20 20 20 20 20 20 20 20  T_LIKE:.        
2e00: 7a 4f 70 20 3d 20 22 6c 69 6b 65 22 3b 20 62 72  zOp = "like"; br
2e10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
2e20: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
2e30: 53 54 52 41 49 4e 54 5f 47 4c 4f 42 3a 0a 20 20  STRAINT_GLOB:.  
2e40: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 67 6c 6f        zOp = "glo
2e50: 62 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  b"; break;.     
2e60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44   case SQLITE_IND
2e70: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 45  EX_CONSTRAINT_RE
2e80: 47 45 58 50 3a 0a 20 20 20 20 20 20 20 20 7a 4f  GEXP:.        zO
2e90: 70 20 3d 20 22 72 65 67 65 78 70 22 3b 20 62 72  p = "regexp"; br
2ea0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
2eb0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
2ec0: 53 54 52 41 49 4e 54 5f 4e 45 3a 0a 20 20 20 20  STRAINT_NE:.    
2ed0: 20 20 20 20 7a 4f 70 20 3d 20 22 6e 65 22 3b 20      zOp = "ne"; 
2ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
2ef0: 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  e SQLITE_INDEX_C
2f00: 4f 4e 53 54 52 41 49 4e 54 5f 49 53 4e 4f 54 3a  ONSTRAINT_ISNOT:
2f10: 0a 20 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  .        zOp = "
2f20: 69 73 6e 6f 74 22 3b 20 62 72 65 61 6b 3b 0a 20  isnot"; break;. 
2f30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
2f40: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
2f50: 54 5f 49 53 4e 4f 54 4e 55 4c 4c 3a 0a 20 20 20  T_ISNOTNULL:.   
2f60: 20 20 20 20 20 7a 4f 70 20 3d 20 22 69 73 6e 6f       zOp = "isno
2f70: 74 6e 75 6c 6c 22 3b 20 62 72 65 61 6b 3b 0a 20  tnull"; break;. 
2f80: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
2f90: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
2fa0: 54 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 20 20  T_ISNULL:.      
2fb0: 20 20 7a 4f 70 20 3d 20 22 69 73 6e 75 6c 6c 22    zOp = "isnull"
2fc0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
2fd0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  ase SQLITE_INDEX
2fe0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 3a 0a  _CONSTRAINT_IS:.
2ff0: 20 20 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 69          zOp = "i
3000: 73 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  s"; break;.    }
3010: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
3020: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
3030: 2c 20 70 45 6c 65 6d 2c 20 54 63 6c 5f 4e 65 77  , pElem, Tcl_New
3040: 53 74 72 69 6e 67 4f 62 6a 28 22 6f 70 22 2c 20  StringObj("op", 
3050: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
3060: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3070: 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c  nt(0, pElem, Tcl
3080: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4f  _NewStringObj(zO
3090: 70 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  p, -1));.    Tcl
30a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
30b0: 65 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20  ement(0, pElem, 
30c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
30d0: 28 22 63 6f 6c 75 6d 6e 22 2c 20 2d 31 29 29 3b  ("column", -1));
30e0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
30f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
3100: 20 70 45 6c 65 6d 2c 20 54 63 6c 5f 4e 65 77 49   pElem, Tcl_NewI
3110: 6e 74 4f 62 6a 28 70 43 6f 6e 73 2d 3e 69 43 6f  ntObj(pCons->iCo
3120: 6c 75 6d 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f  lumn));.    Tcl_
3130: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3140: 6d 65 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54  ment(0, pElem, T
3150: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3160: 22 75 73 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a  "usable", -1));.
3170: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3180: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
3190: 70 45 6c 65 6d 2c 20 54 63 6c 5f 4e 65 77 49 6e  pElem, Tcl_NewIn
31a0: 74 4f 62 6a 28 70 43 6f 6e 73 2d 3e 75 73 61 62  tObj(pCons->usab
31b0: 6c 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c  le));..    Tcl_L
31c0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
31d0: 65 6e 74 28 30 2c 20 70 41 72 67 2c 20 70 45 6c  ent(0, pArg, pEl
31e0: 65 6d 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  em);.    Tcl_Dec
31f0: 72 52 65 66 43 6f 75 6e 74 28 70 45 6c 65 6d 29  rRefCount(pElem)
3200: 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 4c 69 73  ;.  }..  Tcl_Lis
3210: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3220: 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20 70 41  t(0, pScript, pA
3230: 72 67 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  rg);.  Tcl_DecrR
3240: 65 66 43 6f 75 6e 74 28 70 41 72 67 29 3b 0a 0a  efCount(pArg);..
3250: 20 20 70 41 72 67 20 3d 20 54 63 6c 5f 4e 65 77    pArg = Tcl_New
3260: 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  Obj();.  Tcl_Inc
3270: 72 52 65 66 43 6f 75 6e 74 28 70 41 72 67 29 3b  rRefCount(pArg);
3280: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
3290: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
32a0: 42 79 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  By; ii++){.    s
32b0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
32c0: 64 65 78 5f 6f 72 64 65 72 62 79 20 63 6f 6e 73  dex_orderby cons
32d0: 74 20 2a 70 4f 72 64 65 72 20 3d 20 26 70 49 64  t *pOrder = &pId
32e0: 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 5b  xInfo->aOrderBy[
32f0: 69 69 5d 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ii];.    Tcl_Obj
3300: 20 2a 70 45 6c 65 6d 20 3d 20 54 63 6c 5f 4e 65   *pElem = Tcl_Ne
3310: 77 4f 62 6a 28 29 3b 0a 20 20 20 20 54 63 6c 5f  wObj();.    Tcl_
3320: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 45 6c  IncrRefCount(pEl
3330: 65 6d 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69  em);..    Tcl_Li
3340: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3350: 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c  nt(0, pElem, Tcl
3360: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
3370: 6f 6c 75 6d 6e 22 2c 20 2d 31 29 29 3b 0a 20 20  olumn", -1));.  
3380: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3390: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45  endElement(0, pE
33a0: 6c 65 6d 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  lem, Tcl_NewIntO
33b0: 62 6a 28 70 4f 72 64 65 72 2d 3e 69 43 6f 6c 75  bj(pOrder->iColu
33c0: 6d 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  mn));.    Tcl_Li
33d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
33e0: 6e 74 28 30 2c 20 70 45 6c 65 6d 2c 20 54 63 6c  nt(0, pElem, Tcl
33f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 64  _NewStringObj("d
3400: 65 73 63 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  esc", -1));.    
3410: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3420: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 45 6c 65  dElement(0, pEle
3430: 6d 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  m, Tcl_NewIntObj
3440: 28 70 4f 72 64 65 72 2d 3e 64 65 73 63 29 29 3b  (pOrder->desc));
3450: 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
3460: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
3470: 2c 20 70 41 72 67 2c 20 70 45 6c 65 6d 29 3b 0a  , pArg, pElem);.
3480: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3490: 6f 75 6e 74 28 70 45 6c 65 6d 29 3b 0a 20 20 7d  ount(pElem);.  }
34a0: 0a 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ..  Tcl_ListObjA
34b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
34c0: 70 53 63 72 69 70 74 2c 20 70 41 72 67 29 3b 0a  pScript, pArg);.
34d0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
34e0: 6e 74 28 70 41 72 67 29 3b 0a 0a 20 20 54 63 6c  nt(pArg);..  Tcl
34f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3500: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
3510: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
3520: 4f 62 6a 28 70 49 64 78 49 6e 66 6f 2d 3e 63 6f  Obj(pIdxInfo->co
3530: 6c 55 73 65 64 29 29 3b 0a 0a 20 20 72 63 20 3d  lUsed));..  rc =
3540: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
3550: 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20  nterp, pScript, 
3560: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
3570: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
3580: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
3590: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
35a0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
35b0: 72 20 2a 7a 45 72 72 20 3d 20 54 63 6c 5f 47 65  r *zErr = Tcl_Ge
35c0: 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
35d0: 74 65 72 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  terp);.    rc = 
35e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
35f0: 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72    pTab->base.zEr
3600: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
3610: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 45 72  printf("%s", zEr
3620: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
3630: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20   /* Analyze the 
3640: 73 63 72 69 70 74 73 20 72 65 74 75 72 6e 20 76  scripts return v
3650: 61 6c 75 65 2e 20 54 68 65 20 72 65 74 75 72 6e  alue. The return
3660: 20 76 61 6c 75 65 20 73 68 6f 75 6c 64 20 62 65   value should be
3670: 20 61 20 74 63 6c 20 0a 20 20 20 20 2a 2a 20 6c   a tcl .    ** l
3680: 69 73 74 20 6f 62 6a 65 63 74 20 77 69 74 68 20  ist object with 
3690: 61 6e 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f  an even number o
36a0: 66 20 65 6c 65 6d 65 6e 74 73 2e 20 54 68 65 20  f elements. The 
36b0: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
36c0: 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 70 61 69   each.    ** pai
36d0: 72 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  r must be one of
36e0: 3a 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  :.    ** .    **
36f0: 20 20 20 22 6f 72 64 65 72 62 79 22 20 20 20 20     "orderby"    
3700: 20 20 20 20 20 20 28 76 61 6c 75 65 20 6f 66 20        (value of 
3710: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
3720: 66 6c 61 67 29 0a 20 20 20 20 2a 2a 20 20 20 22  flag).    **   "
3730: 63 6f 73 74 22 20 20 20 20 20 20 20 20 20 20 20  cost"           
3740: 20 20 28 76 61 6c 75 65 20 6f 66 20 65 73 74 69    (value of esti
3750: 6d 61 74 65 64 43 6f 73 74 20 66 69 65 6c 64 29  matedCost field)
3760: 0a 20 20 20 20 2a 2a 20 20 20 22 72 6f 77 73 22  .    **   "rows"
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 61               (va
3780: 6c 75 65 20 6f 66 20 65 73 74 69 6d 61 74 65 64  lue of estimated
3790: 52 6f 77 73 20 66 69 65 6c 64 29 0a 20 20 20 20  Rows field).    
37a0: 2a 2a 20 20 20 22 75 73 65 22 20 20 20 20 20 20  **   "use"      
37b0: 20 20 20 20 20 20 20 20 28 69 6e 64 65 78 20 6f          (index o
37c0: 66 20 75 73 65 64 20 63 6f 6e 73 74 72 61 69 6e  f used constrain
37d0: 74 20 69 6e 20 61 43 6f 6e 73 74 72 61 69 6e 74  t in aConstraint
37e0: 5b 5d 29 0a 20 20 20 20 2a 2a 20 20 20 22 69 64  []).    **   "id
37f0: 78 6e 75 6d 22 20 20 20 20 20 20 20 20 20 20 20  xnum"           
3800: 28 76 61 6c 75 65 20 6f 66 20 69 64 78 4e 75 6d  (value of idxNum
3810: 20 66 69 65 6c 64 29 0a 20 20 20 20 2a 2a 20 20   field).    **  
3820: 20 22 69 64 78 73 74 72 22 20 20 20 20 20 20 20   "idxstr"       
3830: 20 20 20 20 28 76 61 6c 75 65 20 6f 66 20 69 64      (value of id
3840: 78 53 74 72 20 66 69 65 6c 64 29 0a 20 20 20 20  xStr field).    
3850: 2a 2a 20 20 20 22 6f 6d 69 74 22 20 20 20 20 20  **   "omit"     
3860: 20 20 20 20 20 20 20 20 28 69 6e 64 65 78 20 6f          (index o
3870: 66 20 6f 6d 69 74 74 65 64 20 63 6f 6e 73 74 72  f omitted constr
3880: 61 69 6e 74 20 69 6e 20 61 43 6f 6e 73 74 72 61  aint in aConstra
3890: 69 6e 74 5b 5d 29 0a 20 20 20 20 2a 2f 0a 20 20  int[]).    */.  
38a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 20    Tcl_Obj *pRes 
38b0: 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  = Tcl_GetObjResu
38c0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
38d0: 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 45 6c 65 6d  Tcl_Obj **apElem
38e0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 45   = 0;.    int nE
38f0: 6c 65 6d 3b 0a 20 20 20 20 72 63 20 3d 20 54 63  lem;.    rc = Tc
3900: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
3910: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 70 52 65  ents(interp, pRe
3920: 73 2c 20 26 6e 45 6c 65 6d 2c 20 26 61 70 45 6c  s, &nElem, &apEl
3930: 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  em);.    if( rc!
3940: 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =TCL_OK ){.     
3950: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
3960: 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  r = Tcl_GetStrin
3970: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  gResult(interp);
3980: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
3990: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
39a0: 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72 72 4d  pTab->base.zErrM
39b0: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
39c0: 69 6e 74 66 28 22 25 73 22 2c 20 7a 45 72 72 29  intf("%s", zErr)
39d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
39e0: 20 20 20 69 6e 74 20 69 41 72 67 76 20 3d 20 31     int iArgv = 1
39f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
3a00: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
3a10: 26 26 20 69 69 3c 6e 45 6c 65 6d 3b 20 69 69 2b  && ii<nElem; ii+
3a20: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  =2){.        con
3a30: 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 20 3d 20  st char *zCmd = 
3a40: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 61 70  Tcl_GetString(ap
3a50: 45 6c 65 6d 5b 69 69 5d 29 3b 0a 20 20 20 20 20  Elem[ii]);.     
3a60: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 20 3d 20     Tcl_Obj *p = 
3a70: 61 70 45 6c 65 6d 5b 69 69 2b 31 5d 3b 0a 20 20  apElem[ii+1];.  
3a80: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3a90: 33 5f 73 74 72 69 63 6d 70 28 22 63 6f 73 74 22  3_stricmp("cost"
3aa0: 2c 20 7a 43 6d 64 29 3d 3d 30 20 29 7b 0a 20 20  , zCmd)==0 ){.  
3ab0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 54 63 6c          rc = Tcl
3ac0: 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
3ad0: 6a 28 69 6e 74 65 72 70 2c 20 70 2c 20 26 70 49  j(interp, p, &pI
3ae0: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
3af0: 64 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  dCost);.        
3b00: 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  }else.        if
3b10: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
3b20: 70 28 22 6f 72 64 65 72 62 79 22 2c 20 7a 43 6d  p("orderby", zCm
3b30: 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  d)==0 ){.       
3b40: 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49     rc = Tcl_GetI
3b50: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
3b60: 2c 20 70 2c 20 26 70 49 64 78 49 6e 66 6f 2d 3e  , p, &pIdxInfo->
3b70: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 29  orderByConsumed)
3b80: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
3b90: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
3ba0: 74 65 33 5f 73 74 72 69 63 6d 70 28 22 69 64 78  te3_stricmp("idx
3bb0: 6e 75 6d 22 2c 20 7a 43 6d 64 29 3d 3d 30 20 29  num", zCmd)==0 )
3bc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
3bd0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
3be0: 62 6a 28 69 6e 74 65 72 70 2c 20 70 2c 20 26 70  bj(interp, p, &p
3bf0: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 29  IdxInfo->idxNum)
3c00: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
3c10: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
3c20: 74 65 33 5f 73 74 72 69 63 6d 70 28 22 69 64 78  te3_stricmp("idx
3c30: 73 74 72 22 2c 20 7a 43 6d 64 29 3d 3d 30 20 29  str", zCmd)==0 )
3c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
3c50: 74 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66  te3_free(pIdxInf
3c60: 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  o->idxStr);.    
3c70: 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
3c80: 69 64 78 53 74 72 20 3d 20 73 71 6c 69 74 65 33  idxStr = sqlite3
3c90: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 54  _mprintf("%s", T
3ca0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 29 29  cl_GetString(p))
3cb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
3cc0: 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
3cd0: 49 64 78 53 74 72 20 3d 20 31 3b 0a 20 20 20 20  IdxStr = 1;.    
3ce0: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
3cf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
3d00: 72 69 63 6d 70 28 22 72 6f 77 73 22 2c 20 7a 43  ricmp("rows", zC
3d10: 6d 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  md)==0 ){.      
3d20: 20 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20      Tcl_WideInt 
3d30: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  x = 0;.         
3d40: 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 57 69 64   rc = Tcl_GetWid
3d50: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
3d60: 72 70 2c 20 70 2c 20 26 78 29 3b 0a 20 20 20 20  rp, p, &x);.    
3d70: 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
3d80: 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20  estimatedRows = 
3d90: 28 74 52 6f 77 63 6e 74 29 78 3b 0a 20 20 20 20  (tRowcnt)x;.    
3da0: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
3db0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
3dc0: 72 69 63 6d 70 28 22 75 73 65 22 2c 20 7a 43 6d  ricmp("use", zCm
3dd0: 64 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  d)==0 .         
3de0: 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  || sqlite3_stric
3df0: 6d 70 28 22 6f 6d 69 74 22 2c 20 7a 43 6d 64 29  mp("omit", zCmd)
3e00: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  ==0 .        ){.
3e10: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
3e20: 6f 6e 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ons;.          r
3e30: 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  c = Tcl_GetIntFr
3e40: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 2c  omObj(interp, p,
3e50: 20 26 69 43 6f 6e 73 29 3b 0a 20 20 20 20 20 20   &iCons);.      
3e60: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
3e70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
3e80: 20 20 20 20 20 69 66 28 20 69 43 6f 6e 73 3c 30       if( iCons<0
3e90: 20 7c 7c 20 69 43 6f 6e 73 3e 3d 70 49 64 78 49   || iCons>=pIdxI
3ea0: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
3eb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3ec0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3ed0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ROR;.           
3ee0: 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45     pTab->base.zE
3ef0: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
3f00: 6d 70 72 69 6e 74 66 28 22 75 6e 65 78 70 65 63  mprintf("unexpec
3f10: 74 65 64 3a 20 25 64 22 2c 20 69 43 6f 6e 73 29  ted: %d", iCons)
3f20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
3f30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
3f40: 20 20 20 69 6e 74 20 62 4f 6d 69 74 20 3d 20 28     int bOmit = (
3f50: 7a 43 6d 64 5b 30 5d 3d 3d 27 6f 27 20 7c 7c 20  zCmd[0]=='o' || 
3f60: 7a 43 6d 64 5b 30 5d 3d 3d 27 4f 27 29 3b 0a 20  zCmd[0]=='O');. 
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
3f80: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
3f90: 6e 74 55 73 61 67 65 5b 69 43 6f 6e 73 5d 2e 61  ntUsage[iCons].a
3fa0: 72 67 76 49 6e 64 65 78 20 3d 20 69 41 72 67 76  rgvIndex = iArgv
3fb0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
3fc0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
3fd0: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 43 6f  straintUsage[iCo
3fe0: 6e 73 5d 2e 6f 6d 69 74 20 3d 20 62 4f 6d 69 74  ns].omit = bOmit
3ff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
4000: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4010: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4020: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4030: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
4040: 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a 45 72    pTab->base.zEr
4050: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
4060: 70 72 69 6e 74 66 28 22 75 6e 65 78 70 65 63 74  printf("unexpect
4070: 65 64 3a 20 25 73 22 2c 20 7a 43 6d 64 29 3b 0a  ed: %s", zCmd);.
4080: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4090: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
40a0: 5f 4f 4b 20 26 26 20 70 54 61 62 2d 3e 62 61 73  _OK && pTab->bas
40b0: 65 2e 7a 45 72 72 4d 73 67 3d 3d 30 20 29 7b 0a  e.zErrMsg==0 ){.
40c0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
40d0: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 54 63 6c  char *zErr = Tcl
40e0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
40f0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 20 20  (interp);.      
4100: 20 20 20 20 70 54 61 62 2d 3e 62 61 73 65 2e 7a      pTab->base.z
4110: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
4120: 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
4130: 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Err);.        }.
4140: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4150: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
4160: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 69 72 74 75  }../*.** A virtu
4170: 61 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 20  al table module 
4180: 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 72 65  that provides re
4190: 61 64 2d 6f 6e 6c 79 20 61 63 63 65 73 73 20 74  ad-only access t
41a0: 6f 20 61 0a 2a 2a 20 54 63 6c 20 67 6c 6f 62 61  o a.** Tcl globa
41b0: 6c 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 73  l variable names
41c0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
41d0: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 74  sqlite3_module t
41e0: 63 6c 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30  clModule = {.  0
41f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
4210: 72 73 69 6f 6e 20 2a 2f 0a 20 20 74 63 6c 43 6f  rsion */.  tclCo
4220: 6e 6e 65 63 74 2c 0a 20 20 74 63 6c 43 6f 6e 6e  nnect,.  tclConn
4230: 65 63 74 2c 0a 20 20 74 63 6c 42 65 73 74 49 6e  ect,.  tclBestIn
4240: 64 65 78 2c 0a 20 20 74 63 6c 44 69 73 63 6f 6e  dex,.  tclDiscon
4250: 6e 65 63 74 2c 20 0a 20 20 74 63 6c 44 69 73 63  nect, .  tclDisc
4260: 6f 6e 6e 65 63 74 2c 0a 20 20 74 63 6c 4f 70 65  onnect,.  tclOpe
4270: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
4280: 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
4290: 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72   - open a cursor
42a0: 20 2a 2f 0a 20 20 74 63 6c 43 6c 6f 73 65 2c 20   */.  tclClose, 
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20      /* xClose - 
42d0: 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a  close a cursor *
42e0: 2f 0a 20 20 74 63 6c 46 69 6c 74 65 72 2c 20 20  /.  tclFilter,  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63    /* xFilter - c
4310: 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f  onfigure scan co
4320: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 74  nstraints */.  t
4330: 63 6c 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20  clNext,         
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4350: 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20  xNext - advance 
4360: 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 74 63  a cursor */.  tc
4370: 6c 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  lEof,           
4380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
4390: 45 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f 72 20  Eof - check for 
43a0: 65 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20  end of scan */. 
43b0: 20 74 63 6c 43 6f 6c 75 6d 6e 2c 20 20 20 20 20   tclColumn,     
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43d0: 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64  * xColumn - read
43e0: 20 64 61 74 61 20 2a 2f 0a 20 20 74 63 6c 52 6f   data */.  tclRo
43f0: 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
4400: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77           /* xRow
4410: 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  id - read data *
4420: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20   /* xUpdate */. 
4450: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4470: 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20   xBegin */.  0, 
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
44a0: 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  nc */.  0,      
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20       /* xCommit 
44d0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a    /* xRollback *
4500: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20   /* xFindMethod 
4530: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a    /* xRename */.
4560: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  };../*.** Decode
4570: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
4580: 20 73 71 6c 69 74 65 33 20 6f 62 6a 65 63 74 2e   sqlite3 object.
4590: 0a 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67  .*/.extern int g
45a0: 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f  etDbPointer(Tcl_
45b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
45c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
45d0: 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29 3b  sqlite3 **ppDb);
45e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
45f0: 20 74 68 65 20 65 63 68 6f 20 76 69 72 74 75 61   the echo virtua
4600: 6c 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 0a  l table module..
4610: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
4620: 4c 49 54 45 5f 54 43 4c 41 50 49 20 72 65 67 69  LITE_TCLAPI regi
4630: 73 74 65 72 5f 74 63 6c 5f 6d 6f 64 75 6c 65 28  ster_tcl_module(
4640: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
4650: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
4660: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
4670: 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
4680: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
4690: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
46a0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
46b0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
46c0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
46d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
46f0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4700: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
4710: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
4720: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
4730: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
4740: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
4750: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
4760: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
4770: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
4780: 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75   "DB");.    retu
4790: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
47a0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
47b0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
47c0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
47d0: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
47e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 69  rn TCL_ERROR;.#i
47f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4800: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
4810: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
4820: 6d 6f 64 75 6c 65 28 64 62 2c 20 22 74 63 6c 22  module(db, "tcl"
4830: 2c 20 26 74 63 6c 4d 6f 64 75 6c 65 2c 20 28 76  , &tclModule, (v
4840: 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 23  oid *)interp);.#
4850: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
4860: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  CL_OK;.}..#endif
4870: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  .../*.** Registe
4880: 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20  r commands with 
4890: 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  the TCL interpre
48a0: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69  ter..*/.int Sqli
48b0: 74 65 74 65 73 74 74 63 6c 5f 49 6e 69 74 28 54  tetesttcl_Init(T
48c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
48d0: 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p){.#ifndef SQLI
48e0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
48f0: 41 42 4c 45 0a 20 20 73 74 61 74 69 63 20 73 74  ABLE.  static st
4900: 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
4910: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63   *zName;.     Tc
4920: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50  l_ObjCmdProc *xP
4930: 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a  roc;.     void *
4940: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20  clientData;.  } 
4950: 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20  aObjCmd[] = {.  
4960: 20 20 20 7b 20 22 72 65 67 69 73 74 65 72 5f 74     { "register_t
4970: 63 6c 5f 6d 6f 64 75 6c 65 22 2c 20 20 20 72 65  cl_module",   re
4980: 67 69 73 74 65 72 5f 74 63 6c 5f 6d 6f 64 75 6c  gister_tcl_modul
4990: 65 2c 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  e, 0 },.  };.  i
49a0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
49b0: 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d   i<sizeof(aObjCm
49c0: 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d  d)/sizeof(aObjCm
49d0: 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
49e0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
49f0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f  mmand(interp, aO
4a00: 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  bjCmd[i].zName, 
4a10: 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64  .        aObjCmd
4a20: 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43  [i].xProc, aObjC
4a30: 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61  md[i].clientData
4a40: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
4a50: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
4a60: 3b 0a 7d 0a                                      ;.}.