/ Hex Artifact Content
Login

Artifact 67c1166131bb59f9e47c00118f7d432ca5491e6cae6ca3f87ca9db20103a78f9:


0000: 23 20 32 30 31 37 20 53 65 70 74 65 6d 62 65 72  # 2017 September
0010: 20 31 30 0a 23 0a 23 20 54 68 65 20 61 75 74 68   10.#.# The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67  place 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 23  is a blessing:.#
0080: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f  .#    May you do
0090: 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76   good and not ev
00a0: 69 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75  il..#    May you
00b0: 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73   find forgivenes
00c0: 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61  s for yourself a
00d0: 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72  nd forgive other
00e0: 73 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  s..#    May you 
00f0: 73 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65  share freely, ne
0100: 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20  ver taking more 
0110: 74 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23  than you give..#
0120: 0a 23 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 2a 2a 2a 2a 2a 0a 23 20 54 65 73 74  *********.# Test
0170: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
0180: 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20 49 6e  le interface. In
0190: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 65 20   particular the 
01a0: 78 42 65 73 74 49 6e 64 65 78 0a 23 20 6d 65 74  xBestIndex.# met
01b0: 68 6f 64 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74  hod..#..set test
01c0: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
01d0: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
01e0: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
01f0: 2e 74 63 6c 0a 73 65 74 20 74 65 73 74 70 72 65  .tcl.set testpre
0200: 66 69 78 20 62 65 73 74 69 6e 64 65 78 34 0a 0a  fix bestindex4..
0210: 69 66 63 61 70 61 62 6c 65 20 21 76 74 61 62 20  ifcapable !vtab 
0220: 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a  {.  finish_test.
0230: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 2d 2d 2d    return.}..#---
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0280: 2d 2d 2d 2d 2d 2d 0a 23 20 56 69 72 74 75 61 6c  ------.# Virtual
0290: 20 74 61 62 6c 65 20 63 61 6c 6c 62 61 63 6b 20   table callback 
02a0: 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61  for a virtual ta
02b0: 62 6c 65 20 6e 61 6d 65 64 20 24 74 62 6c 2e 0a  ble named $tbl..
02c0: 23 20 20 0a 70 72 6f 63 20 76 74 61 62 5f 63 6d  #  .proc vtab_cm
02d0: 64 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20  d {method args} 
02e0: 7b 0a 0a 20 20 73 65 74 20 62 69 6e 6f 70 73 28  {..  set binops(
02f0: 6e 65 29 20 20 20 20 21 3d 0a 20 20 73 65 74 20  ne)    !=.  set 
0300: 62 69 6e 6f 70 73 28 65 71 29 20 20 20 20 3d 0a  binops(eq)    =.
0310: 20 20 73 65 74 20 62 69 6e 6f 70 73 28 69 73 6e    set binops(isn
0320: 6f 74 29 20 22 49 53 20 4e 4f 54 22 0a 20 20 73  ot) "IS NOT".  s
0330: 65 74 20 62 69 6e 6f 70 73 28 69 73 29 20 20 20  et binops(is)   
0340: 20 22 49 53 22 0a 0a 20 20 73 65 74 20 75 6e 6f   "IS"..  set uno
0350: 70 73 28 69 73 6e 6f 74 6e 75 6c 6c 29 20 22 49  ps(isnotnull) "I
0360: 53 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 73 65  S NOT NULL".  se
0370: 74 20 75 6e 6f 70 73 28 69 73 6e 75 6c 6c 29 20  t unops(isnull) 
0380: 20 20 20 22 49 53 20 4e 55 4c 4c 22 0a 0a 20 20     "IS NULL"..  
0390: 73 65 74 20 63 6f 6c 73 28 30 29 20 61 0a 20 20  set cols(0) a.  
03a0: 73 65 74 20 63 6f 6c 73 28 31 29 20 62 0a 20 20  set cols(1) b.  
03b0: 73 65 74 20 63 6f 6c 73 28 32 29 20 63 0a 0a 20  set cols(2) c.. 
03c0: 20 73 77 69 74 63 68 20 2d 2d 20 24 6d 65 74 68   switch -- $meth
03d0: 6f 64 20 7b 0a 20 20 20 20 78 43 6f 6e 6e 65 63  od {.    xConnec
03e0: 74 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t {.      return
03f0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   "CREATE TABLE t
0400: 31 28 61 2c 20 62 2c 20 63 29 22 0a 20 20 20 20  1(a, b, c)".    
0410: 7d 0a 0a 20 20 20 20 78 42 65 73 74 49 6e 64 65  }..    xBestInde
0420: 78 20 7b 0a 20 20 20 20 20 20 66 6f 72 65 61 63  x {.      foreac
0430: 68 20 7b 63 6c 69 73 74 20 6f 72 64 65 72 62 79  h {clist orderby
0440: 20 6d 61 73 6b 7d 20 24 61 72 67 73 20 7b 7d 0a   mask} $args {}.
0450: 0a 20 20 20 20 20 20 73 65 74 20 63 6f 73 74 20  .      set cost 
0460: 31 30 30 30 30 30 30 2e 30 0a 20 20 20 20 20 20  1000000.0.      
0470: 73 65 74 20 72 65 74 20 5b 6c 69 73 74 5d 0a 20  set ret [list]. 
0480: 20 20 20 20 20 73 65 74 20 73 74 72 20 5b 6c 69       set str [li
0490: 73 74 5d 0a 0a 20 20 20 20 20 20 73 65 74 20 76  st]..      set v
04a0: 20 30 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65   0.      for {se
04b0: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 5b 6c 6c  t i 0} {$i < [ll
04c0: 65 6e 67 74 68 20 24 63 6c 69 73 74 5d 7d 20 7b  ength $clist]} {
04d0: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20  incr i} {.      
04e0: 20 20 61 72 72 61 79 20 75 6e 73 65 74 20 43 0a    array unset C.
04f0: 20 20 20 20 20 20 20 20 61 72 72 61 79 20 73 65          array se
0500: 74 20 43 20 5b 6c 69 6e 64 65 78 20 24 63 6c 69  t C [lindex $cli
0510: 73 74 20 24 69 5d 0a 20 20 20 20 20 20 20 20 69  st $i].        i
0520: 66 20 7b 24 43 28 75 73 61 62 6c 65 29 7d 20 7b  f {$C(usable)} {
0530: 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b  .          if {[
0540: 69 6e 66 6f 20 65 78 69 73 74 73 20 62 69 6e 6f  info exists bino
0550: 70 73 28 24 43 28 6f 70 29 29 5d 7d 20 7b 0a 20  ps($C(op))]} {. 
0560: 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
0570: 6e 64 20 72 65 74 20 6f 6d 69 74 20 24 69 0a 20  nd ret omit $i. 
0580: 20 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65             lappe
0590: 6e 64 20 73 74 72 20 22 24 63 6f 6c 73 28 24 43  nd str "$cols($C
05a0: 28 63 6f 6c 75 6d 6e 29 29 20 24 62 69 6e 6f 70  (column)) $binop
05b0: 73 28 24 43 28 6f 70 29 29 20 25 24 76 25 22 0a  s($C(op)) %$v%".
05c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 63 72              incr
05d0: 20 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   v.            s
05e0: 65 74 20 63 6f 73 74 20 5b 65 78 70 72 20 24 63  et cost [expr $c
05f0: 6f 73 74 20 2f 20 32 5d 0a 20 20 20 20 20 20 20  ost / 2].       
0600: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
0610: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
0620: 75 6e 6f 70 73 28 24 43 28 6f 70 29 29 5d 7d 20  unops($C(op))]} 
0630: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  {.            la
0640: 70 70 65 6e 64 20 72 65 74 20 6f 6d 69 74 20 24  ppend ret omit $
0650: 69 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 61  i.            la
0660: 70 70 65 6e 64 20 73 74 72 20 22 24 63 6f 6c 73  ppend str "$cols
0670: 28 24 43 28 63 6f 6c 75 6d 6e 29 29 20 24 75 6e  ($C(column)) $un
0680: 6f 70 73 28 24 43 28 6f 70 29 29 22 0a 20 20 20  ops($C(op))".   
0690: 20 20 20 20 20 20 20 20 20 69 6e 63 72 20 76 0a           incr v.
06a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
06b0: 63 6f 73 74 20 5b 65 78 70 72 20 24 63 6f 73 74  cost [expr $cost
06c0: 20 2f 20 32 5d 0a 20 20 20 20 20 20 20 20 20 20   / 2].          
06d0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
06e0: 20 20 7d 0a 0a 20 20 20 20 20 20 6c 61 70 70 65    }..      lappe
06f0: 6e 64 20 72 65 74 20 69 64 78 73 74 72 20 5b 6a  nd ret idxstr [j
0700: 6f 69 6e 20 24 73 74 72 20 22 20 41 4e 44 20 22  oin $str " AND "
0710: 5d 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20  ].      lappend 
0720: 72 65 74 20 63 6f 73 74 20 24 63 6f 73 74 0a 20  ret cost $cost. 
0730: 20 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 74       return $ret
0740: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 78 46 69 6c  .    }..    xFil
0750: 74 65 72 20 7b 0a 20 20 20 20 20 20 73 65 74 20  ter {.      set 
0760: 71 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20  q [lindex $args 
0770: 31 5d 0a 20 20 20 20 20 20 73 65 74 20 61 20 5b  1].      set a [
0780: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 32 5d 0a  lindex $args 2].
0790: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 76        for {set v
07a0: 20 30 7d 20 7b 24 76 20 3c 20 5b 6c 6c 65 6e 67   0} {$v < [lleng
07b0: 74 68 20 24 61 5d 7d 20 7b 69 6e 63 72 20 76 7d  th $a]} {incr v}
07c0: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 76   {.        set v
07d0: 61 6c 20 5b 6c 69 6e 64 65 78 20 24 61 20 24 76  al [lindex $a $v
07e0: 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20 71 20  ].        set q 
07f0: 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
0800: 74 20 25 24 76 25 20 27 24 76 61 6c 27 5d 20 24  t %$v% '$val'] $
0810: 71 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  q].      }.     
0820: 20 69 66 20 7b 24 71 3d 3d 22 22 7d 20 7b 20 73   if {$q==""} { s
0830: 65 74 20 71 20 31 20 7d 0a 20 20 20 20 20 20 6c  et q 1 }.      l
0840: 61 70 70 65 6e 64 20 3a 3a 78 46 69 6c 74 65 72  append ::xFilter
0850: 51 75 65 72 69 65 73 20 22 57 48 45 52 45 20 24  Queries "WHERE $
0860: 71 22 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  q".      return 
0870: 5b 6c 69 73 74 20 73 71 6c 20 22 53 45 4c 45 43  [list sql "SELEC
0880: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
0890: 74 31 78 20 57 48 45 52 45 20 24 71 22 5d 0a 20  t1x WHERE $q"]. 
08a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
08b0: 6e 20 22 22 0a 7d 0a 0a 70 72 6f 63 20 76 74 61  n "".}..proc vta
08c0: 62 5f 73 69 6d 70 6c 65 20 7b 6d 65 74 68 6f 64  b_simple {method
08d0: 20 61 72 67 73 7d 20 7b 0a 20 20 73 77 69 74 63   args} {.  switc
08e0: 68 20 2d 2d 20 24 6d 65 74 68 6f 64 20 7b 0a 20  h -- $method {. 
08f0: 20 20 20 78 43 6f 6e 6e 65 63 74 20 7b 0a 20 20     xConnect {.  
0900: 20 20 20 20 72 65 74 75 72 6e 20 22 43 52 45 41      return "CREA
0910: 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 22 0a  TE TABLE t2(x)".
0920: 20 20 20 20 7d 0a 20 20 20 20 78 42 65 73 74 49      }.    xBestI
0930: 6e 64 65 78 20 7b 0a 20 20 20 20 20 20 72 65 74  ndex {.      ret
0940: 75 72 6e 20 5b 6c 69 73 74 20 63 6f 73 74 20 39  urn [list cost 9
0950: 39 39 39 39 39 2e 30 5d 0a 20 20 20 20 7d 0a 20  99999.0].    }. 
0960: 20 20 20 78 46 69 6c 74 65 72 20 7b 0a 20 20 20     xFilter {.   
0970: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
0980: 73 71 6c 20 22 53 45 4c 45 43 54 20 72 6f 77 69  sql "SELECT rowi
0990: 64 2c 20 2a 20 46 52 4f 4d 20 74 32 78 22 5d 0a  d, * FROM t2x"].
09a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
09b0: 72 6e 20 22 22 0a 7d 0a 0a 72 65 67 69 73 74 65  rn "".}..registe
09c0: 72 5f 74 63 6c 5f 6d 6f 64 75 6c 65 20 64 62 0a  r_tcl_module db.
09d0: 0a 70 72 6f 63 20 64 6f 5f 76 74 61 62 5f 71 75  .proc do_vtab_qu
09e0: 65 72 79 5f 74 65 73 74 20 7b 74 6e 20 71 75 65  ery_test {tn que
09f0: 72 79 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 73  ry result} {.  s
0a00: 65 74 20 3a 3a 78 46 69 6c 74 65 72 51 75 65 72  et ::xFilterQuer
0a10: 69 65 73 20 5b 6c 69 73 74 5d 0a 20 20 75 70 6c  ies [list].  upl
0a20: 65 76 65 6c 20 5b 6c 69 73 74 0a 20 20 20 20 64  evel [list.    d
0a30: 6f 5f 74 65 73 74 20 24 74 6e 20 5b 73 74 72 69  o_test $tn [stri
0a40: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 25 51 55  ng map [list %QU
0a50: 45 52 59 25 20 24 71 75 65 72 79 5d 20 7b 0a 20  ERY% $query] {. 
0a60: 20 20 20 20 20 73 65 74 20 72 20 5b 65 78 65 63       set r [exec
0a70: 73 71 6c 20 7b 25 51 55 45 52 59 25 7d 5d 0a 20  sql {%QUERY%}]. 
0a80: 20 20 20 20 20 73 65 74 20 72 20 5b 63 6f 6e 63       set r [conc
0a90: 61 74 20 24 3a 3a 78 46 69 6c 74 65 72 51 75 65  at $::xFilterQue
0aa0: 72 69 65 73 20 24 72 5d 0a 20 20 20 20 20 20 73  ries $r].      s
0ab0: 65 74 20 72 0a 20 20 20 20 7d 5d 20 5b 6c 69 73  et r.    }] [lis
0ac0: 74 20 7b 2a 7d 24 72 65 73 75 6c 74 5d 0a 20 20  t {*}$result].  
0ad0: 5d 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ].}..do_execsql_
0ae0: 74 65 73 74 20 31 2e 30 20 7b 0a 20 20 43 52 45  test 1.0 {.  CRE
0af0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
0b00: 45 20 74 31 20 55 53 49 4e 47 20 74 63 6c 28 27  E t1 USING tcl('
0b10: 76 74 61 62 5f 63 6d 64 27 29 3b 0a 20 20 43 52  vtab_cmd');.  CR
0b20: 45 41 54 45 20 54 41 42 4c 45 20 74 31 78 28 61  EATE TABLE t1x(a
0b30: 20 49 4e 54 45 47 45 52 2c 20 62 20 54 45 58 54   INTEGER, b TEXT
0b40: 2c 20 63 20 52 45 41 4c 29 3b 0a 20 20 49 4e 53  , c REAL);.  INS
0b50: 45 52 54 20 49 4e 54 4f 20 74 31 78 20 56 41 4c  ERT INTO t1x VAL
0b60: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20  UES(1, 2, 3);.  
0b70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 78 20  INSERT INTO t1x 
0b80: 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b  VALUES(4, 5, 6);
0b90: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0ba0: 31 78 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20  1x VALUES(7, 8, 
0bb0: 39 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 56 49  9);..  CREATE VI
0bc0: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 32 20 55  RTUAL TABLE t2 U
0bd0: 53 49 4e 47 20 74 63 6c 28 27 76 74 61 62 5f 73  SING tcl('vtab_s
0be0: 69 6d 70 6c 65 27 29 3b 0a 20 20 43 52 45 41 54  imple');.  CREAT
0bf0: 45 20 54 41 42 4c 45 20 74 32 78 28 78 20 49 4e  E TABLE t2x(x IN
0c00: 54 45 47 45 52 29 3b 0a 20 20 49 4e 53 45 52 54  TEGER);.  INSERT
0c10: 20 49 4e 54 4f 20 74 32 78 20 56 41 4c 55 45 53   INTO t2x VALUES
0c20: 28 31 29 3b 0a 7d 0a 0a 64 6f 5f 76 74 61 62 5f  (1);.}..do_vtab_
0c30: 71 75 65 72 79 5f 74 65 73 74 20 31 2e 31 20 7b  query_test 1.1 {
0c40: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0c50: 31 20 57 48 45 52 45 20 61 21 3d 27 68 65 6c 6c  1 WHERE a!='hell
0c60: 6f 27 3b 20 7d 20 7b 0a 20 20 22 57 48 45 52 45  o'; } {.  "WHERE
0c70: 20 61 20 21 3d 20 27 68 65 6c 6c 6f 27 22 0a 20   a != 'hello'". 
0c80: 20 31 20 32 20 33 2e 30 20 34 20 35 20 36 2e 30   1 2 3.0 4 5 6.0
0c90: 20 37 20 38 20 39 2e 30 0a 7d 0a 0a 64 6f 5f 76   7 8 9.0.}..do_v
0ca0: 74 61 62 5f 71 75 65 72 79 5f 74 65 73 74 20 31  tab_query_test 1
0cb0: 2e 32 2e 31 20 7b 20 53 45 4c 45 43 54 20 2a 20  .2.1 { SELECT * 
0cc0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 21  FROM t1 WHERE b!
0cd0: 3d 38 20 7d 20 7b 0a 20 20 22 57 48 45 52 45 20  =8 } {.  "WHERE 
0ce0: 62 20 21 3d 20 27 38 27 22 0a 20 20 31 20 32 20  b != '8'".  1 2 
0cf0: 33 2e 30 20 34 20 35 20 36 2e 30 0a 7d 0a 64 6f  3.0 4 5 6.0.}.do
0d00: 5f 76 74 61 62 5f 71 75 65 72 79 5f 74 65 73 74  _vtab_query_test
0d10: 20 31 2e 32 2e 32 20 7b 20 53 45 4c 45 43 54 20   1.2.2 { SELECT 
0d20: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
0d30: 38 21 3d 62 20 7d 20 7b 0a 20 20 22 57 48 45 52  8!=b } {.  "WHER
0d40: 45 20 62 20 21 3d 20 27 38 27 22 0a 20 20 31 20  E b != '8'".  1 
0d50: 32 20 33 2e 30 20 34 20 35 20 36 2e 30 0a 7d 0a  2 3.0 4 5 6.0.}.
0d60: 0a 64 6f 5f 76 74 61 62 5f 71 75 65 72 79 5f 74  .do_vtab_query_t
0d70: 65 73 74 20 31 2e 33 20 7b 20 53 45 4c 45 43 54  est 1.3 { SELECT
0d80: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
0d90: 20 63 20 49 53 20 4e 4f 54 20 33 20 7d 20 7b 0a   c IS NOT 3 } {.
0da0: 20 20 22 57 48 45 52 45 20 63 20 49 53 20 4e 4f    "WHERE c IS NO
0db0: 54 20 27 33 27 22 0a 20 20 34 20 35 20 36 2e 30  T '3'".  4 5 6.0
0dc0: 20 37 20 38 20 39 2e 30 0a 7d 0a 64 6f 5f 76 74   7 8 9.0.}.do_vt
0dd0: 61 62 5f 71 75 65 72 79 5f 74 65 73 74 20 31 2e  ab_query_test 1.
0de0: 33 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  3.2 { SELECT * F
0df0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 33 20 49  ROM t1 WHERE 3 I
0e00: 53 20 4e 4f 54 20 63 20 7d 20 7b 0a 20 20 22 57  S NOT c } {.  "W
0e10: 48 45 52 45 20 63 20 49 53 20 4e 4f 54 20 27 33  HERE c IS NOT '3
0e20: 27 22 0a 20 20 34 20 35 20 36 2e 30 20 37 20 38  '".  4 5 6.0 7 8
0e30: 20 39 2e 30 0a 7d 0a 0a 64 6f 5f 76 74 61 62 5f   9.0.}..do_vtab_
0e40: 71 75 65 72 79 5f 74 65 73 74 20 31 2e 34 2e 31  query_test 1.4.1
0e50: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0e60: 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 78 20   t1, t2 WHERE x 
0e70: 21 3d 20 61 20 7d 20 7b 0a 20 20 22 57 48 45 52  != a } {.  "WHER
0e80: 45 20 61 20 21 3d 20 27 31 27 22 0a 20 20 34 20  E a != '1'".  4 
0e90: 35 20 36 2e 30 20 31 20 20 20 37 20 38 20 39 2e  5 6.0 1   7 8 9.
0ea0: 30 20 31 0a 7d 0a 64 6f 5f 76 74 61 62 5f 71 75  0 1.}.do_vtab_qu
0eb0: 65 72 79 5f 74 65 73 74 20 31 2e 34 2e 32 20 7b  ery_test 1.4.2 {
0ec0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0ed0: 31 2c 20 74 32 20 57 48 45 52 45 20 61 20 21 3d  1, t2 WHERE a !=
0ee0: 20 78 20 7d 20 7b 0a 20 20 22 57 48 45 52 45 20   x } {.  "WHERE 
0ef0: 61 20 21 3d 20 27 31 27 22 0a 20 20 34 20 35 20  a != '1'".  4 5 
0f00: 36 2e 30 20 31 20 20 20 37 20 38 20 39 2e 30 20  6.0 1   7 8 9.0 
0f10: 31 0a 7d 0a 0a 64 6f 5f 76 74 61 62 5f 71 75 65  1.}..do_vtab_que
0f20: 72 79 5f 74 65 73 74 20 31 2e 35 2e 31 20 7b 20  ry_test 1.5.1 { 
0f30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0f40: 20 57 48 45 52 45 20 61 20 49 53 20 4e 4f 54 20   WHERE a IS NOT 
0f50: 4e 55 4c 4c 20 7d 20 7b 0a 20 20 22 57 48 45 52  NULL } {.  "WHER
0f60: 45 20 61 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  E a IS NOT NULL"
0f70: 0a 20 20 31 20 32 20 33 2e 30 20 34 20 35 20 36  .  1 2 3.0 4 5 6
0f80: 2e 30 20 37 20 38 20 39 2e 30 0a 7d 0a 64 6f 5f  .0 7 8 9.0.}.do_
0f90: 76 74 61 62 5f 71 75 65 72 79 5f 74 65 73 74 20  vtab_query_test 
0fa0: 31 2e 35 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a  1.5.2 { SELECT *
0fb0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 4e   FROM t1 WHERE N
0fc0: 55 4c 4c 20 49 53 20 4e 4f 54 20 61 20 7d 20 7b  ULL IS NOT a } {
0fd0: 0a 20 20 22 57 48 45 52 45 20 61 20 49 53 20 4e  .  "WHERE a IS N
0fe0: 4f 54 20 27 27 22 0a 20 20 31 20 32 20 33 2e 30  OT ''".  1 2 3.0
0ff0: 20 34 20 35 20 36 2e 30 20 37 20 38 20 39 2e 30   4 5 6.0 7 8 9.0
1000: 0a 7d 0a 0a 64 6f 5f 76 74 61 62 5f 71 75 65 72  .}..do_vtab_quer
1010: 79 5f 74 65 73 74 20 31 2e 36 2e 31 20 7b 20 53  y_test 1.6.1 { S
1020: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1030: 57 48 45 52 45 20 61 20 49 53 20 4e 55 4c 4c 20  WHERE a IS NULL 
1040: 7d 20 7b 0a 20 20 22 57 48 45 52 45 20 61 20 49  } {.  "WHERE a I
1050: 53 20 4e 55 4c 4c 22 0a 7d 0a 0a 64 6f 5f 76 74  S NULL".}..do_vt
1060: 61 62 5f 71 75 65 72 79 5f 74 65 73 74 20 31 2e  ab_query_test 1.
1070: 36 2e 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  6.2 { SELECT * F
1080: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 4e 55 4c  ROM t1 WHERE NUL
1090: 4c 20 49 53 20 61 20 7d 20 7b 0a 20 20 22 57 48  L IS a } {.  "WH
10a0: 45 52 45 20 61 20 49 53 20 27 27 22 0a 7d 0a 0a  ERE a IS ''".}..
10b0: 64 6f 5f 76 74 61 62 5f 71 75 65 72 79 5f 74 65  do_vtab_query_te
10c0: 73 74 20 31 2e 37 2e 31 20 7b 20 53 45 4c 45 43  st 1.7.1 { SELEC
10d0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
10e0: 45 20 28 61 2c 20 62 29 20 49 53 20 28 31 2c 20  E (a, b) IS (1, 
10f0: 32 29 20 7d 20 7b 0a 20 20 22 57 48 45 52 45 20  2) } {.  "WHERE 
1100: 61 20 49 53 20 27 31 27 20 41 4e 44 20 62 20 49  a IS '1' AND b I
1110: 53 20 27 32 27 22 0a 20 20 31 20 32 20 33 2e 30  S '2'".  1 2 3.0
1120: 0a 7d 0a 64 6f 5f 76 74 61 62 5f 71 75 65 72 79  .}.do_vtab_query
1130: 5f 74 65 73 74 20 31 2e 37 2e 32 20 7b 20 53 45  _test 1.7.2 { SE
1140: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1150: 48 45 52 45 20 28 35 2c 20 34 29 20 49 53 20 28  HERE (5, 4) IS (
1160: 62 2c 20 61 29 20 7d 20 7b 0a 20 20 7b 57 48 45  b, a) } {.  {WHE
1170: 52 45 20 62 20 49 53 20 27 35 27 20 41 4e 44 20  RE b IS '5' AND 
1180: 61 20 49 53 20 27 34 27 7d 20 0a 20 20 34 20 35  a IS '4'} .  4 5
1190: 20 36 2e 30 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   6.0.}..#-------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 64  --------------.d
11e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
11f0: 2e 30 2e 30 20 7b 0a 20 20 44 45 4c 45 54 45 20  .0.0 {.  DELETE 
1200: 46 52 4f 4d 20 74 31 78 3b 0a 20 20 49 4e 53 45  FROM t1x;.  INSE
1210: 52 54 20 49 4e 54 4f 20 74 31 78 20 56 41 4c 55  RT INTO t1x VALU
1220: 45 53 28 27 61 27 2c 20 27 62 27 2c 20 27 63 27  ES('a', 'b', 'c'
1230: 29 3b 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  );.}.do_execsql_
1240: 74 65 73 74 20 32 2e 30 2e 31 20 7b 20 53 45 4c  test 2.0.1 { SEL
1250: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
1260: 7b 61 20 62 20 63 7d 0a 64 6f 5f 65 78 65 63 73  {a b c}.do_execs
1270: 71 6c 5f 74 65 73 74 20 32 2e 30 2e 32 20 7b 20  ql_test 2.0.2 { 
1280: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1290: 20 57 48 45 52 45 20 28 61 2c 20 62 29 20 21 3d   WHERE (a, b) !=
12a0: 20 28 27 61 27 2c 20 27 62 27 29 3b 20 7d 20 7b   ('a', 'b'); } {
12b0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
12c0: 73 74 20 32 2e 31 2e 30 20 7b 0a 20 20 44 45 4c  st 2.1.0 {.  DEL
12d0: 45 54 45 20 46 52 4f 4d 20 74 31 78 3b 0a 20 20  ETE FROM t1x;.  
12e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 78 20  INSERT INTO t1x 
12f0: 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29 3b  VALUES(7, 8, 9);
1300: 0a 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .}.do_execsql_te
1310: 73 74 20 32 2e 31 2e 31 20 7b 20 53 45 4c 45 43  st 2.1.1 { SELEC
1320: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 37  T * FROM t1 } {7
1330: 20 38 20 39 2e 30 7d 0a 64 6f 5f 65 78 65 63 73   8 9.0}.do_execs
1340: 71 6c 5f 74 65 73 74 20 32 2e 31 2e 32 20 7b 20  ql_test 2.1.2 { 
1350: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1360: 20 57 48 45 52 45 20 28 61 2c 20 62 29 20 21 3d   WHERE (a, b) !=
1370: 20 28 37 2c 20 27 38 27 29 20 7d 20 7b 7d 0a 64   (7, '8') } {}.d
1380: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
1390: 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54 20 2a 20  .1.3 { SELECT * 
13a0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 21  FROM t1 WHERE a!
13b0: 3d 37 20 4f 52 20 62 21 3d 27 38 27 20 7d 0a 64  =7 OR b!='8' }.d
13c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
13d0: 2e 31 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a 20  .1.4 { SELECT * 
13e0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 21  FROM t1 WHERE a!
13f0: 3d 37 20 4f 52 20 62 21 3d 27 38 27 20 7d 0a 0a  =7 OR b!='8' }..
1400: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1410: 20 32 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41 54   2.2.1 {.  CREAT
1420: 45 20 54 41 42 4c 45 20 74 33 28 61 20 49 4e 54  E TABLE t3(a INT
1430: 45 47 45 52 2c 20 62 20 54 45 58 54 29 3b 0a 20  EGER, b TEXT);. 
1440: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
1450: 56 41 4c 55 45 53 28 34 35 2c 20 34 36 29 3b 0a  VALUES(45, 46);.
1460: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
1470: 74 20 32 2e 32 2e 32 20 7b 20 53 45 4c 45 43 54  t 2.2.2 { SELECT
1480: 20 2a 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45   * FROM t3 WHERE
1490: 20 28 61 2c 20 62 29 20 21 3d 20 28 34 35 2c 20   (a, b) != (45, 
14a0: 34 36 29 3b 20 7d 0a 64 6f 5f 65 78 65 63 73 71  46); }.do_execsq
14b0: 6c 5f 74 65 73 74 20 32 2e 32 2e 33 20 7b 20 53  l_test 2.2.3 { S
14c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20  ELECT * FROM t3 
14d0: 57 48 45 52 45 20 28 61 2c 20 62 29 20 21 3d 20  WHERE (a, b) != 
14e0: 28 27 34 35 27 2c 20 27 34 36 27 29 3b 20 7d 0a  ('45', '46'); }.
14f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1500: 32 2e 32 2e 34 20 7b 20 53 45 4c 45 43 54 20 2a  2.2.4 { SELECT *
1510: 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 28   FROM t3 WHERE (
1520: 61 2c 20 62 29 20 3d 3d 20 28 34 35 2c 20 34 36  a, b) == (45, 46
1530: 29 3b 20 7d 20 7b 34 35 20 34 36 7d 0a 64 6f 5f  ); } {45 46}.do_
1540: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 32  execsql_test 2.2
1550: 2e 35 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  .5 { SELECT * FR
1560: 4f 4d 20 74 33 20 57 48 45 52 45 20 28 61 2c 20  OM t3 WHERE (a, 
1570: 62 29 20 3d 3d 20 28 27 34 35 27 2c 20 27 34 36  b) == ('45', '46
1580: 27 29 3b 20 7d 20 7b 34 35 20 34 36 7d 0a 0a 23  '); } {45 46}..#
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65  -----.# Test the
15e0: 20 21 3d 20 6f 70 65 72 61 74 6f 72 20 6f 6e 20   != operator on 
15f0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  a virtual table 
1600: 77 69 74 68 20 63 6f 6c 75 6d 6e 20 61 66 66 69  with column affi
1610: 6e 69 74 69 65 73 2e 0a 23 0a 70 72 6f 63 20 76  nities..#.proc v
1620: 74 61 62 5f 73 69 6d 70 6c 65 5f 69 6e 74 65 67  tab_simple_integ
1630: 65 72 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d  er {method args}
1640: 20 7b 0a 20 20 73 77 69 74 63 68 20 2d 2d 20 24   {.  switch -- $
1650: 6d 65 74 68 6f 64 20 7b 0a 20 20 20 20 78 43 6f  method {.    xCo
1660: 6e 6e 65 63 74 20 7b 0a 20 20 20 20 20 20 72 65  nnect {.      re
1670: 74 75 72 6e 20 22 43 52 45 41 54 45 20 54 41 42  turn "CREATE TAB
1680: 4c 45 20 74 34 28 78 20 49 4e 54 45 47 45 52 29  LE t4(x INTEGER)
1690: 22 0a 20 20 20 20 7d 0a 20 20 20 20 78 42 65 73  ".    }.    xBes
16a0: 74 49 6e 64 65 78 20 7b 0a 20 20 20 20 20 20 72  tIndex {.      r
16b0: 65 74 75 72 6e 20 5b 6c 69 73 74 20 63 6f 73 74  eturn [list cost
16c0: 20 39 39 39 39 39 39 2e 30 5d 0a 20 20 20 20 7d   999999.0].    }
16d0: 0a 20 20 20 20 78 46 69 6c 74 65 72 20 7b 0a 20  .    xFilter {. 
16e0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
16f0: 74 20 73 71 6c 20 22 53 45 4c 45 43 54 20 72 6f  t sql "SELECT ro
1700: 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74 34 78 22  wid, * FROM t4x"
1710: 5d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ].    }.  }.  re
1720: 74 75 72 6e 20 22 22 0a 7d 0a 0a 64 6f 5f 65 78  turn "".}..do_ex
1730: 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 30 20 7b  ecsql_test 3.0 {
1740: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
1750: 74 34 78 28 61 20 49 4e 54 45 47 45 52 29 3b 0a  t4x(a INTEGER);.
1760: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
1770: 78 20 56 41 4c 55 45 53 28 32 34 35 29 3b 0a 20  x VALUES(245);. 
1780: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
1790: 54 41 42 4c 45 20 74 34 20 55 53 49 4e 47 20 74  TABLE t4 USING t
17a0: 63 6c 28 27 76 74 61 62 5f 73 69 6d 70 6c 65 5f  cl('vtab_simple_
17b0: 69 6e 74 65 67 65 72 27 29 3b 0a 7d 0a 64 6f 5f  integer');.}.do_
17c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 31  execsql_test 3.1
17d0: 20 7b 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c   { SELECT rowid,
17e0: 20 2a 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45   * FROM t4 WHERE
17f0: 20 78 3d 32 34 35 3b 20 7d 20 7b 31 20 32 34 35   x=245; } {1 245
1800: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
1810: 74 20 33 2e 32 20 7b 20 53 45 4c 45 43 54 20 72  t 3.2 { SELECT r
1820: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74 34 20  owid, * FROM t4 
1830: 57 48 45 52 45 20 78 3d 27 32 34 35 27 3b 20 7d  WHERE x='245'; }
1840: 20 7b 31 20 32 34 35 7d 0a 64 6f 5f 65 78 65 63   {1 245}.do_exec
1850: 73 71 6c 5f 74 65 73 74 20 33 2e 33 20 7b 20 53  sql_test 3.3 { S
1860: 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46  ELECT rowid, * F
1870: 52 4f 4d 20 74 34 20 57 48 45 52 45 20 78 21 3d  ROM t4 WHERE x!=
1880: 32 34 35 3b 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65  245; } {}.do_exe
1890: 63 73 71 6c 5f 74 65 73 74 20 33 2e 34 20 7b 20  csql_test 3.4 { 
18a0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
18b0: 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 78 21  FROM t4 WHERE x!
18c0: 3d 27 32 34 35 27 3b 20 7d 20 7b 7d 0a 0a 64 6f  ='245'; } {}..do
18d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
18e0: 35 20 7b 20 53 45 4c 45 43 54 20 72 6f 77 69 64  5 { SELECT rowid
18f0: 2c 20 2a 20 46 52 4f 4d 20 74 34 20 57 48 45 52  , * FROM t4 WHER
1900: 45 20 72 6f 77 69 64 21 3d 31 20 4f 52 20 78 21  E rowid!=1 OR x!
1910: 3d 27 32 34 35 27 3b 20 7d 20 7b 7d 0a 0a 0a 66  ='245'; } {}...f
1920: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.