/ Hex Artifact Content
Login

Artifact c81c7d8cf36711ab37675ad7376084ae2a359cb6:


0000: 23 20 32 30 31 36 20 4a 75 6c 79 20 32 39 0a 23  # 2016 July 29.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 23 20 54 68 69 73 20 66 69 6c 65  ****.# This file
0170: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72   implements regr
0180: 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72  ession tests for
0190: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
01a0: 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66    The.# focus of
01b0: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 73 79   this file is sy
01c0: 6e 74 61 78 20 65 72 72 6f 72 73 20 69 6e 76 6f  ntax errors invo
01d0: 6c 76 69 6e 67 20 72 6f 77 2d 76 61 6c 75 65 73  lving row-values
01e0: 20 61 6e 64 0a 23 20 76 69 72 74 75 61 6c 20 74   and.# virtual t
01f0: 61 62 6c 65 73 2e 0a 23 0a 0a 73 65 74 20 74 65  ables..#..set te
0200: 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e  stdir [file dirn
0210: 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72  ame $argv0].sour
0220: 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73 74  ce $testdir/test
0230: 65 72 2e 74 63 6c 0a 73 65 74 20 3a 3a 74 65 73  er.tcl.set ::tes
0240: 74 70 72 65 66 69 78 20 72 6f 77 76 61 6c 75 65  tprefix rowvalue
0250: 35 0a 0a 69 66 63 61 70 61 62 6c 65 20 21 76 74  5..ifcapable !vt
0260: 61 62 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  ab {.  finish_te
0270: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70  st.  return.}..p
0280: 72 6f 63 20 76 74 61 62 5f 63 6f 6d 6d 61 6e 64  roc vtab_command
0290: 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b   {method args} {
02a0: 0a 20 20 73 77 69 74 63 68 20 2d 2d 20 24 6d 65  .  switch -- $me
02b0: 74 68 6f 64 20 7b 0a 20 20 20 20 78 43 6f 6e 6e  thod {.    xConn
02c0: 65 63 74 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ect {.      retu
02d0: 72 6e 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  rn "CREATE TABLE
02e0: 20 74 31 28 61 2c 20 62 2c 20 63 2c 20 64 2c 20   t1(a, b, c, d, 
02f0: 65 78 70 72 29 22 0a 20 20 20 20 7d 0a 0a 20 20  expr)".    }..  
0300: 20 20 78 42 65 73 74 49 6e 64 65 78 20 7b 0a 20    xBestIndex {. 
0310: 20 20 20 20 20 73 65 74 20 43 4f 4c 28 30 29 20       set COL(0) 
0320: 61 0a 20 20 20 20 20 20 73 65 74 20 43 4f 4c 28  a.      set COL(
0330: 31 29 20 62 0a 20 20 20 20 20 20 73 65 74 20 43  1) b.      set C
0340: 4f 4c 28 32 29 20 63 0a 20 20 20 20 20 20 73 65  OL(2) c.      se
0350: 74 20 43 4f 4c 28 33 29 20 64 0a 20 20 20 20 20  t COL(3) d.     
0360: 20 73 65 74 20 43 4f 4c 28 34 29 20 65 78 70 72   set COL(4) expr
0370: 0a 0a 20 20 20 20 20 20 73 65 74 20 4f 50 28 65  ..      set OP(e
0380: 71 29 20 3d 0a 20 20 20 20 20 20 73 65 74 20 4f  q) =.      set O
0390: 50 28 6e 65 29 20 21 3d 0a 20 20 20 20 20 20 73  P(ne) !=.      s
03a0: 65 74 20 4f 50 28 67 74 29 20 3e 0a 20 20 20 20  et OP(gt) >.    
03b0: 20 20 73 65 74 20 4f 50 28 6c 65 29 20 3c 3d 0a    set OP(le) <=.
03c0: 20 20 20 20 20 20 73 65 74 20 4f 50 28 6c 74 29        set OP(lt)
03d0: 20 3c 0a 20 20 20 20 20 20 73 65 74 20 4f 50 28   <.      set OP(
03e0: 67 65 29 20 3e 3d 0a 20 20 20 20 20 20 73 65 74  ge) >=.      set
03f0: 20 4f 50 28 6d 61 74 63 68 29 20 4d 41 54 43 48   OP(match) MATCH
0400: 0a 20 20 20 20 20 20 73 65 74 20 4f 50 28 6c 69  .      set OP(li
0410: 6b 65 29 20 4c 49 4b 45 0a 20 20 20 20 20 20 73  ke) LIKE.      s
0420: 65 74 20 4f 50 28 67 6c 6f 62 29 20 47 4c 4f 42  et OP(glob) GLOB
0430: 0a 20 20 20 20 20 20 73 65 74 20 4f 50 28 72 65  .      set OP(re
0440: 67 65 78 70 29 20 52 45 47 45 58 50 0a 0a 20 20  gexp) REGEXP..  
0450: 20 20 20 20 73 65 74 20 63 6c 69 73 74 20 5b 6c      set clist [l
0460: 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 0a 20  index $args 0]. 
0470: 20 20 20 20 20 73 65 74 20 72 65 74 20 5b 6c 69       set ret [li
0480: 73 74 5d 0a 20 20 20 20 20 20 73 65 74 20 65 6c  st].      set el
0490: 69 73 74 20 5b 6c 69 73 74 5d 0a 20 20 20 20 20  ist [list].     
04a0: 20 73 65 74 20 69 20 30 0a 20 20 20 20 20 20 66   set i 0.      f
04b0: 6f 72 65 61 63 68 20 63 20 24 63 6c 69 73 74 20  oreach c $clist 
04c0: 7b 0a 20 20 20 20 20 20 20 20 61 72 72 61 79 20  {.        array 
04d0: 73 65 74 20 43 20 24 63 0a 20 20 20 20 20 20 20  set C $c.       
04e0: 20 69 66 20 7b 24 43 28 75 73 61 62 6c 65 29 7d   if {$C(usable)}
04f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70   {.          lap
0500: 70 65 6e 64 20 72 65 74 20 6f 6d 69 74 20 24 69  pend ret omit $i
0510: 0a 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65  .          lappe
0520: 6e 64 20 65 6c 69 73 74 20 22 24 43 4f 4c 28 24  nd elist "$COL($
0530: 43 28 63 6f 6c 75 6d 6e 29 29 20 24 4f 50 28 24  C(column)) $OP($
0540: 43 28 6f 70 29 29 20 25 24 69 25 22 0a 20 20 20  C(op)) %$i%".   
0550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
0560: 6e 63 72 20 69 0a 20 20 20 20 20 20 7d 0a 0a 20  ncr i.      }.. 
0570: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74       lappend ret
0580: 20 69 64 78 73 74 72 20 5b 6a 6f 69 6e 20 24 65   idxstr [join $e
0590: 6c 69 73 74 20 22 20 41 4e 44 20 22 5d 0a 20 20  list " AND "].  
05a0: 20 20 20 20 23 70 75 74 73 20 22 78 42 65 73 74      #puts "xBest
05b0: 49 6e 64 65 78 3a 20 24 72 65 74 22 0a 20 20 20  Index: $ret".   
05c0: 20 20 20 72 65 74 75 72 6e 20 24 72 65 74 0a 20     return $ret. 
05d0: 20 20 20 7d 0a 0a 20 20 20 20 78 46 69 6c 74 65     }..    xFilte
05e0: 72 20 7b 0a 20 20 20 20 20 20 66 6f 72 65 61 63  r {.      foreac
05f0: 68 20 7b 69 64 78 6e 75 6d 20 69 64 78 73 74 72  h {idxnum idxstr
0600: 20 61 72 67 6c 69 73 74 7d 20 24 61 72 67 73 20   arglist} $args 
0610: 7b 7d 0a 20 20 20 20 20 20 73 65 74 20 69 20 30  {}.      set i 0
0620: 0a 20 20 20 20 20 20 73 65 74 20 65 65 20 24 69  .      set ee $i
0630: 64 78 73 74 72 0a 20 20 20 20 20 20 66 6f 72 65  dxstr.      fore
0640: 61 63 68 20 61 20 24 61 72 67 6c 69 73 74 20 7b  ach a $arglist {
0650: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
0660: 72 69 6e 67 20 69 73 20 64 6f 75 62 6c 65 20 24  ring is double $
0670: 61 5d 3d 3d 30 7d 20 7b 0a 20 20 20 20 20 20 20  a]==0} {.       
0680: 20 20 20 73 65 74 20 61 20 22 27 5b 73 74 72 69     set a "'[stri
0690: 6e 67 20 6d 61 70 20 7b 27 20 27 27 7d 20 24 61  ng map {' ''} $a
06a0: 5d 27 22 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]'".        }.  
06b0: 20 20 20 20 20 20 73 65 74 20 65 65 20 5b 73 74        set ee [st
06c0: 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 22  ring map [list "
06d0: 25 24 69 25 22 20 24 61 5d 20 24 65 65 5d 0a 20  %$i%" $a] $ee]. 
06e0: 20 20 20 20 20 20 20 69 6e 63 72 20 69 0a 20 20         incr i.  
06f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 20      }.      set 
0700: 65 65 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  ee [string map [
0710: 6c 69 73 74 20 22 27 22 20 22 27 27 22 5d 20 24  list "'" "''"] $
0720: 65 65 5d 0a 0a 20 20 20 20 20 20 73 65 74 20 72  ee]..      set r
0730: 65 74 20 5b 6c 69 73 74 20 73 71 6c 20 22 53 45  et [list sql "SE
0740: 4c 45 43 54 20 31 2c 20 27 61 27 2c 20 27 62 27  LECT 1, 'a', 'b'
0750: 2c 20 27 63 27 2c 20 27 64 27 2c 20 27 24 65 65  , 'c', 'd', '$ee
0760: 27 22 5d 0a 20 20 20 20 20 20 23 70 75 74 73 20  '"].      #puts 
0770: 22 78 46 69 6c 74 65 72 3a 20 24 72 65 74 22 0a  "xFilter: $ret".
0780: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65        return $re
0790: 74 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  t.    }.  }..  r
07a0: 65 74 75 72 6e 20 7b 7d 0a 7d 0a 0a 72 65 67 69  eturn {}.}..regi
07b0: 73 74 65 72 5f 74 63 6c 5f 6d 6f 64 75 6c 65 20  ster_tcl_module 
07c0: 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  db.do_execsql_te
07d0: 73 74 20 31 2e 30 20 7b 0a 20 20 43 52 45 41 54  st 1.0 {.  CREAT
07e0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
07f0: 78 31 20 55 53 49 4e 47 20 74 63 6c 28 76 74 61  x1 USING tcl(vta
0800: 62 5f 63 6f 6d 6d 61 6e 64 29 3b 0a 7d 20 7b 7d  b_command);.} {}
0810: 0a 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 77  ...foreach {tn w
0820: 68 65 72 65 20 72 65 73 7d 20 7b 0a 20 20 31 20  here res} {.  1 
0830: 22 31 22 20 20 20 20 20 20 20 20 20 20 20 20 20  "1"             
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 7b 7b 7d 7d 0a 20 20 32 20 22 61 3d 31 22 20   {{}}.  2 "a=1" 
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 20 20 20 20 20 7b 7b 61 20 3d             {{a =
0880: 20 31 7d 7d 0a 20 20 33 20 22 61 3d 31 20 41 4e   1}}.  3 "a=1 AN
0890: 44 20 34 20 3d 20 62 22 20 20 20 20 20 20 20 20  D 4 = b"        
08a0: 20 20 20 20 20 20 20 20 20 20 7b 7b 61 20 3d 20            {{a = 
08b0: 31 20 41 4e 44 20 62 20 3d 20 34 7d 7d 0a 20 20  1 AND b = 4}}.  
08c0: 34 20 22 63 3e 27 68 65 6c 6c 6f 27 22 20 20 20  4 "c>'hello'"   
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 7b 7b 63 20 3e 20 27 68 65 6c 6c 6f 27     {{c > 'hello'
08f0: 7d 7d 0a 20 20 35 20 22 63 3c 3d 27 68 65 6c 27  }}.  5 "c<='hel'
0900: 27 6c 6f 27 22 20 20 20 20 20 20 20 20 20 20 20  'lo'"           
0910: 20 20 20 20 20 20 20 20 7b 7b 63 20 3c 3d 20 27          {{c <= '
0920: 68 65 6c 27 27 6c 6f 27 7d 7d 0a 20 20 36 20 22  hel''lo'}}.  6 "
0930: 28 61 2c 20 62 29 20 3d 20 28 53 45 4c 45 43 54  (a, b) = (SELECT
0940: 20 39 2c 20 31 30 29 22 20 20 20 20 20 20 20 20   9, 10)"        
0950: 7b 7b 61 20 3d 20 39 20 41 4e 44 20 62 20 3d 20  {{a = 9 AND b = 
0960: 31 30 7d 7d 0a 20 20 37 20 22 28 2b 61 2c 20 62  10}}.  7 "(+a, b
0970: 29 20 3d 20 28 53 45 4c 45 43 54 20 27 61 27 2c  ) = (SELECT 'a',
0980: 20 27 62 27 29 22 20 20 20 20 7b 7b 62 20 3d 20   'b')"    {{b = 
0990: 27 62 27 7d 7d 0a 20 20 38 20 22 28 61 2c 20 2b  'b'}}.  8 "(a, +
09a0: 62 29 20 3d 20 28 53 45 4c 45 43 54 20 27 61 27  b) = (SELECT 'a'
09b0: 2c 20 27 62 27 29 22 20 20 20 20 7b 7b 61 20 3d  , 'b')"    {{a =
09c0: 20 27 61 27 7d 7d 0a 20 20 31 31 20 22 28 2b 61   'a'}}.  11 "(+a
09d0: 2c 20 62 29 20 49 4e 20 28 53 45 4c 45 43 54 20  , b) IN (SELECT 
09e0: 27 61 27 2c 20 27 62 27 29 22 20 20 7b 7b 62 20  'a', 'b')"  {{b 
09f0: 3d 20 27 62 27 7d 7d 0a 20 20 31 32 20 22 28 61  = 'b'}}.  12 "(a
0a00: 2c 20 2b 62 29 20 49 4e 20 28 53 45 4c 45 43 54  , +b) IN (SELECT
0a10: 20 27 61 27 2c 20 27 62 27 29 22 20 20 7b 7b 61   'a', 'b')"  {{a
0a20: 20 3d 20 27 61 27 7d 7d 0a 0a 20 20 31 33 20 22   = 'a'}}..  13 "
0a30: 28 61 2c 20 62 29 20 3c 20 28 27 64 27 2c 20 27  (a, b) < ('d', '
0a40: 65 27 29 22 20 20 20 20 20 20 20 20 20 20 20 7b  e')"           {
0a50: 7b 61 20 3c 3d 20 27 64 27 7d 7d 0a 20 20 31 34  {a <= 'd'}}.  14
0a60: 20 22 28 61 2c 20 62 29 20 3c 20 28 27 61 27 2c   "(a, b) < ('a',
0a70: 20 27 63 27 29 22 20 20 20 20 20 20 20 20 20 20   'c')"          
0a80: 20 7b 7b 61 20 3c 3d 20 27 61 27 7d 7d 0a 20 20   {{a <= 'a'}}.  
0a90: 31 35 20 22 28 61 2c 20 62 29 20 3c 3d 20 28 27  15 "(a, b) <= ('
0aa0: 61 27 2c 20 27 62 27 29 22 20 20 20 20 20 20 20  a', 'b')"       
0ab0: 20 20 20 7b 7b 61 20 3c 3d 20 27 61 27 7d 7d 0a     {{a <= 'a'}}.
0ac0: 20 20 31 36 20 22 28 61 2c 20 62 29 20 3c 20 28    16 "(a, b) < (
0ad0: 27 61 27 2c 20 27 62 27 29 22 20 20 20 20 20 20  'a', 'b')"      
0ae0: 20 20 20 20 20 7b 7d 0a 7d 20 7b 0a 20 20 64 6f       {}.} {.  do
0af0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0b00: 24 74 6e 20 22 53 45 4c 45 43 54 20 65 78 70 72  $tn "SELECT expr
0b10: 20 46 52 4f 4d 20 78 31 20 57 48 45 52 45 20 24   FROM x1 WHERE $
0b20: 77 68 65 72 65 22 20 24 72 65 73 0a 7d 0a 0a 66  where" $res.}..f
0b30: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.