/ Hex Artifact Content
Login

Artifact d93ccded2409c66637dc1649a02f169e041b63d8:


0000: 23 20 32 30 31 30 20 4a 75 6c 79 20 31 36 0a 23  # 2010 July 16.#
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 0a 23 20 54 68 69 73 20 66 69  ****.#.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65  le implements te
0180: 73 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  sts to verify th
0190: 61 74 20 74 68 65 20 22 74 65 73 74 61 62 6c 65  at the "testable
01a0: 20 73 74 61 74 65 6d 65 6e 74 73 22 20 69 6e 20   statements" in 
01b0: 0a 23 20 74 68 65 20 6c 61 6e 67 5f 65 78 70 72  .# the lang_expr
01c0: 2e 68 74 6d 6c 20 64 6f 63 75 6d 65 6e 74 20 61  .html document a
01d0: 72 65 20 63 6f 72 72 65 63 74 2e 0a 23 0a 0a 73  re correct..#..s
01e0: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
01f0: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
0200: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0210: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72  /tester.tcl.sour
0220: 63 65 20 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c  ce $testdir/mall
0230: 6f 63 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 0a  oc_common.tcl...
0240: 70 72 6f 63 20 64 6f 5f 65 78 70 72 5f 74 65 73  proc do_expr_tes
0250: 74 20 7b 74 6e 20 65 78 70 72 20 74 79 70 65 20  t {tn expr type 
0260: 76 61 6c 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76  value} {.  uplev
0270: 65 6c 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  el do_execsql_te
0280: 73 74 20 24 74 6e 20 5b 6c 69 73 74 20 22 53 45  st $tn [list "SE
0290: 4c 45 43 54 20 74 79 70 65 6f 66 28 24 65 78 70  LECT typeof($exp
02a0: 72 29 2c 20 24 65 78 70 72 22 5d 20 5b 0a 20 20  r), $expr"] [.  
02b0: 20 20 6c 69 73 74 20 5b 6c 69 73 74 20 24 74 79    list [list $ty
02c0: 70 65 20 24 76 61 6c 75 65 5d 0a 20 20 5d 0a 7d  pe $value].  ].}
02d0: 0a 0a 70 72 6f 63 20 64 6f 5f 71 65 78 70 72 5f  ..proc do_qexpr_
02e0: 74 65 73 74 20 7b 74 6e 20 65 78 70 72 20 76 61  test {tn expr va
02f0: 6c 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c  lue} {.  uplevel
0300: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
0310: 20 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c 45   $tn [list "SELE
0320: 43 54 20 71 75 6f 74 65 28 24 65 78 70 72 29 22  CT quote($expr)"
0330: 5d 20 5b 6c 69 73 74 20 24 76 61 6c 75 65 5d 0a  ] [list $value].
0340: 7d 0a 0a 23 20 53 65 74 20 75 70 20 74 68 72 65  }..# Set up thre
0350: 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  e global variabl
0360: 65 73 3a 0a 23 0a 23 20 20 20 3a 3a 6f 70 6e 61  es:.#.#   ::opna
0370: 6d 65 20 20 20 20 20 20 20 20 20 41 6e 20 61 72  me         An ar
0380: 72 61 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d  ray mapping from
0390: 20 53 51 4c 20 6f 70 65 72 61 74 6f 72 20 74 6f   SQL operator to
03a0: 20 61 6e 20 65 61 73 79 20 74 6f 20 70 61 72 73   an easy to pars
03b0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
03c0: 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 54 68 65         name. The
03d0: 20 6e 61 6d 65 73 20 61 72 65 20 75 73 65 64 20   names are used 
03e0: 61 73 20 70 61 72 74 20 6f 66 20 74 65 73 74 20  as part of test 
03f0: 63 61 73 65 20 6e 61 6d 65 73 2e 0a 23 0a 23 20  case names..#.# 
0400: 20 20 3a 3a 6f 70 70 72 65 63 20 20 20 20 20 20    ::opprec      
0410: 20 20 20 41 6e 20 61 72 72 61 79 20 6d 61 70 70     An array mapp
0420: 69 6e 67 20 66 72 6f 6d 20 53 51 4c 20 6f 70 65  ing from SQL ope
0430: 72 61 74 6f 72 20 74 6f 20 61 20 6e 75 6d 65 72  rator to a numer
0440: 69 63 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ic.#            
0450: 20 20 20 20 20 20 20 20 70 72 65 63 65 64 65 6e          preceden
0460: 63 65 20 76 61 6c 75 65 2e 20 4f 70 65 72 61 74  ce value. Operat
0470: 6f 72 73 20 74 68 61 74 20 67 72 6f 75 70 20 6d  ors that group m
0480: 6f 72 65 20 74 69 67 68 74 6c 79 0a 23 20 20 20  ore tightly.#   
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 68 61 76 65 20 6c 6f 77 65 72 20 6e 75 6d 65   have lower nume
04b0: 72 69 63 20 70 72 65 63 65 64 65 6e 63 65 73 2e  ric precedences.
04c0: 0a 23 0a 23 20 20 20 3a 3a 6f 70 6c 69 73 74 20  .#.#   ::oplist 
04d0: 20 20 20 20 20 20 20 20 41 20 6c 69 73 74 20 6f          A list o
04e0: 66 20 61 6c 6c 20 53 51 4c 20 6f 70 65 72 61 74  f all SQL operat
04f0: 6f 72 73 20 73 75 70 70 6f 72 74 65 64 20 62 79  ors supported by
0500: 20 53 51 4c 69 74 65 2e 0a 23 0a 66 6f 72 65 61   SQLite..#.forea
0510: 63 68 20 7b 6f 70 20 6f 70 6e 7d 20 7b 0a 20 20  ch {op opn} {.  
0520: 20 20 20 20 7c 7c 20 20 20 63 61 74 20 20 20 20      ||   cat    
0530: 20 2a 20 20 20 6d 75 6c 20 20 20 20 20 20 20 2f   *   mul       /
0540: 20 20 64 69 76 20 20 20 20 20 20 20 25 20 20 20    div       %   
0550: 20 20 6d 6f 64 20 20 20 20 20 20 20 2b 20 20 20    mod       +   
0560: 20 20 20 61 64 64 0a 20 20 20 20 20 20 2d 20 20     add.      -  
0570: 20 20 73 75 62 20 20 20 20 20 3c 3c 20 20 6c 73    sub     <<  ls
0580: 68 69 66 74 20 20 20 20 3e 3e 20 72 73 68 69 66  hift    >> rshif
0590: 74 20 20 20 20 26 20 20 20 20 20 62 69 74 61 6e  t    &     bitan
05a0: 64 20 20 20 20 7c 20 20 20 20 20 20 62 69 74 6f  d    |      bito
05b0: 72 0a 20 20 20 20 20 20 3c 20 20 20 20 6c 65 73  r.      <    les
05c0: 73 20 20 20 20 3c 3d 20 20 6c 65 73 73 65 71 20  s    <=  lesseq 
05d0: 20 20 20 3e 20 20 6d 6f 72 65 20 20 20 20 20 20     >  more      
05e0: 3e 3d 20 20 20 20 6d 6f 72 65 65 71 20 20 20 20  >=    moreeq    
05f0: 3d 20 20 20 20 20 20 65 71 31 0a 20 20 20 20 20  =      eq1.     
0600: 20 3d 3d 20 20 20 65 71 32 20 20 20 20 20 3c 3e   ==   eq2     <>
0610: 20 20 6e 65 31 20 20 20 20 20 20 20 21 3d 20 6e    ne1       != n
0620: 65 32 20 20 20 20 20 20 20 49 53 20 20 20 20 69  e2       IS    i
0630: 73 20 20 20 20 20 20 20 20 4c 49 4b 45 20 20 20  s        LIKE   
0640: 6c 69 6b 65 0a 20 20 20 20 20 20 47 4c 4f 42 20  like.      GLOB 
0650: 67 6c 6f 62 20 20 20 20 41 4e 44 20 61 6e 64 20  glob    AND and 
0660: 20 20 20 20 20 20 4f 52 20 6f 72 20 20 20 20 20        OR or     
0670: 20 20 20 4d 41 54 43 48 20 6d 61 74 63 68 20 20     MATCH match  
0680: 20 20 20 52 45 47 45 58 50 20 72 65 67 65 78 70     REGEXP regexp
0690: 0a 20 20 20 20 20 20 7b 49 53 20 4e 4f 54 7d 20  .      {IS NOT} 
06a0: 69 73 6e 74 0a 7d 20 7b 0a 20 20 73 65 74 20 3a  isnt.} {.  set :
06b0: 3a 6f 70 6e 61 6d 65 28 24 6f 70 29 20 24 6f 70  :opname($op) $op
06c0: 6e 0a 7d 0a 73 65 74 20 6f 70 6c 69 73 74 20 5b  n.}.set oplist [
06d0: 6c 69 73 74 5d 0a 66 6f 72 65 61 63 68 20 7b 70  list].foreach {p
06e0: 72 65 63 20 6f 70 6c 7d 20 7b 0a 20 20 31 20 20  rec opl} {.  1  
06f0: 20 7c 7c 0a 20 20 32 20 20 20 7b 2a 20 2f 20 25   ||.  2   {* / %
0700: 7d 0a 20 20 33 20 20 20 7b 2b 20 2d 7d 0a 20 20  }.  3   {+ -}.  
0710: 34 20 20 20 7b 3c 3c 20 3e 3e 20 26 20 7c 7d 0a  4   {<< >> & |}.
0720: 20 20 35 20 20 20 7b 3c 20 3c 3d 20 3e 20 3e 3d    5   {< <= > >=
0730: 7d 0a 20 20 36 20 20 20 7b 3d 20 3d 3d 20 21 3d  }.  6   {= == !=
0740: 20 3c 3e 20 49 53 20 7b 49 53 20 4e 4f 54 7d 20   <> IS {IS NOT} 
0750: 4c 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48 20  LIKE GLOB MATCH 
0760: 52 45 47 45 58 50 7d 0a 20 20 37 20 20 20 41 4e  REGEXP}.  7   AN
0770: 44 0a 20 20 38 20 20 20 4f 52 0a 7d 20 7b 0a 20  D.  8   OR.} {. 
0780: 20 66 6f 72 65 61 63 68 20 6f 70 20 24 6f 70 6c   foreach op $opl
0790: 20 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6f 70   { .    set ::op
07a0: 70 72 65 63 28 24 6f 70 29 20 24 70 72 65 63 20  prec($op) $prec 
07b0: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 6f 70 6c  .    lappend opl
07c0: 69 73 74 20 24 6f 70 0a 20 20 7d 0a 7d 0a 0a 0a  ist $op.  }.}...
07d0: 23 20 48 6f 6f 6b 20 69 6e 20 64 65 66 69 6e 69  # Hook in defini
07e0: 74 69 6f 6e 73 20 6f 66 20 4d 41 54 43 48 20 61  tions of MATCH a
07f0: 6e 64 20 52 45 47 45 58 2e 20 54 68 65 20 66 6f  nd REGEX. The fo
0800: 6c 6c 6f 77 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  llowing implemen
0810: 74 61 74 69 6f 6e 73 0a 23 20 63 61 75 73 65 20  tations.# cause 
0820: 4d 41 54 43 48 20 61 6e 64 20 52 45 47 45 58 20  MATCH and REGEX 
0830: 74 6f 20 62 65 68 61 76 65 20 73 69 6d 69 6c 61  to behave simila
0840: 72 6c 79 20 74 6f 20 74 68 65 20 3d 3d 20 6f 70  rly to the == op
0850: 65 72 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 6d  erator..#.proc m
0860: 61 74 63 68 66 75 6e 63 20 7b 61 20 62 7d 20 7b  atchfunc {a b} {
0870: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
0880: 61 3d 3d 24 62 7d 5d 20 7d 0a 70 72 6f 63 20 72  a==$b}] }.proc r
0890: 65 67 65 78 66 75 6e 63 20 7b 61 20 62 7d 20 7b  egexfunc {a b} {
08a0: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24   return [expr {$
08b0: 61 3d 3d 24 62 7d 5d 20 7d 0a 64 62 20 66 75 6e  a==$b}] }.db fun
08c0: 63 20 6d 61 74 63 68 20 20 2d 61 72 67 63 6f 75  c match  -argcou
08d0: 6e 74 20 32 20 6d 61 74 63 68 66 75 6e 63 0a 64  nt 2 matchfunc.d
08e0: 62 20 66 75 6e 63 20 72 65 67 65 78 70 20 2d 61  b func regexp -a
08f0: 72 67 63 6f 75 6e 74 20 32 20 72 65 67 65 78 66  rgcount 2 regexf
0900: 75 6e 63 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  unc..#----------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0950: 23 20 54 65 73 74 20 63 61 73 65 73 20 65 5f 65  # Test cases e_e
0960: 78 70 72 2d 31 2e 2a 20 61 74 74 65 6d 70 74 20  xpr-1.* attempt 
0970: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61  to verify that a
0980: 6c 6c 20 62 69 6e 61 72 79 20 6f 70 65 72 61 74  ll binary operat
0990: 6f 72 73 20 6c 69 73 74 65 64 0a 23 20 69 6e 20  ors listed.# in 
09a0: 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  the documentatio
09b0: 6e 20 65 78 69 73 74 20 61 6e 64 20 74 68 61 74  n exist and that
09c0: 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 72   the relative pr
09d0: 65 63 65 64 65 6e 63 65 73 20 6f 66 20 74 68 65  ecedences of the
09e0: 0a 23 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  .# operators are
09f0: 20 61 6c 73 6f 20 61 73 20 74 68 65 20 64 6f 63   also as the doc
0a00: 75 6d 65 6e 74 61 74 69 6f 6e 20 73 75 67 67 65  umentation sugge
0a10: 73 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  sts..#.# EVIDENC
0a20: 45 2d 4f 46 3a 20 52 2d 31 35 35 31 34 2d 36 35  E-OF: R-15514-65
0a30: 31 36 33 20 53 51 4c 69 74 65 20 75 6e 64 65 72  163 SQLite under
0a40: 73 74 61 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f  stands the follo
0a50: 77 69 6e 67 20 62 69 6e 61 72 79 0a 23 20 6f 70  wing binary.# op
0a60: 65 72 61 74 6f 72 73 2c 20 69 6e 20 6f 72 64 65  erators, in orde
0a70: 72 20 66 72 6f 6d 20 68 69 67 68 65 73 74 20 74  r from highest t
0a80: 6f 20 6c 6f 77 65 73 74 20 70 72 65 63 65 64 65  o lowest precede
0a90: 6e 63 65 3a 20 7c 7c 20 2a 20 2f 20 25 20 2b 20  nce: || * / % + 
0aa0: 2d 0a 23 20 3c 3c 20 3e 3e 20 26 20 7c 20 3c 20  -.# << >> & | < 
0ab0: 3c 3d 20 3e 20 3e 3d 20 3d 20 3d 3d 20 21 3d 20  <= > >= = == != 
0ac0: 3c 3e 20 49 53 20 49 53 0a 23 20 4e 4f 54 20 49  <> IS IS.# NOT I
0ad0: 4e 20 4c 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43  N LIKE GLOB MATC
0ae0: 48 20 52 45 47 45 58 50 20 41 4e 44 20 4f 52 0a  H REGEXP AND OR.
0af0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
0b00: 20 52 2d 33 38 37 35 39 2d 33 38 37 38 39 20 4f   R-38759-38789 O
0b10: 70 65 72 61 74 6f 72 73 20 49 53 20 61 6e 64 20  perators IS and 
0b20: 49 53 20 4e 4f 54 20 68 61 76 65 20 74 68 65 20  IS NOT have the 
0b30: 73 61 6d 65 0a 23 20 70 72 65 63 65 64 65 6e 63  same.# precedenc
0b40: 65 20 61 73 20 3d 2e 0a 23 0a 0a 75 6e 73 65 74  e as =..#..unset
0b50: 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 75 6e 74   -nocomplain unt
0b60: 65 73 74 65 64 0a 66 6f 72 65 61 63 68 20 6f 70  ested.foreach op
0b70: 31 20 24 6f 70 6c 69 73 74 20 7b 0a 20 20 66 6f  1 $oplist {.  fo
0b80: 72 65 61 63 68 20 6f 70 32 20 24 6f 70 6c 69 73  reach op2 $oplis
0b90: 74 20 7b 0a 20 20 20 20 73 65 74 20 75 6e 74 65  t {.    set unte
0ba0: 73 74 65 64 28 24 6f 70 31 2c 24 6f 70 32 29 20  sted($op1,$op2) 
0bb0: 31 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 74  1.    foreach {t
0bc0: 6e 20 41 20 42 20 43 7d 20 7b 0a 20 20 20 20 20  n A B C} {.     
0bd0: 20 20 31 20 20 20 20 20 32 32 20 20 20 34 35 20    1     22   45 
0be0: 20 20 20 36 36 0a 20 20 20 20 20 20 20 32 20 20     66.       2  
0bf0: 20 20 20 20 30 20 20 20 20 30 20 20 20 20 20 30      0    0     0
0c00: 0a 20 20 20 20 20 20 20 33 20 20 20 20 20 20 30  .       3      0
0c10: 20 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20      0     1.    
0c20: 20 20 20 34 20 20 20 20 20 20 30 20 20 20 20 31     4      0    1
0c30: 20 20 20 20 20 30 0a 20 20 20 20 20 20 20 35 20       0.       5 
0c40: 20 20 20 20 20 30 20 20 20 20 31 20 20 20 20 20       0    1     
0c50: 31 0a 20 20 20 20 20 20 20 36 20 20 20 20 20 20  1.       6      
0c60: 31 20 20 20 20 30 20 20 20 20 20 30 0a 20 20 20  1    0     0.   
0c70: 20 20 20 20 37 20 20 20 20 20 20 31 20 20 20 20      7      1    
0c80: 30 20 20 20 20 20 31 0a 20 20 20 20 20 20 20 38  0     1.       8
0c90: 20 20 20 20 20 20 31 20 20 20 20 31 20 20 20 20        1    1    
0ca0: 20 30 0a 20 20 20 20 20 20 20 39 20 20 20 20 20   0.       9     
0cb0: 20 31 20 20 20 20 31 20 20 20 20 20 31 0a 20 20   1    1     1.  
0cc0: 20 20 20 20 31 30 20 20 20 20 20 20 35 20 20 20      10      5   
0cd0: 20 36 20 20 20 20 20 31 0a 20 20 20 20 20 20 31   6     1.      1
0ce0: 31 20 20 20 20 20 20 31 20 20 20 20 35 20 20 20  1      1    5   
0cf0: 20 20 36 0a 20 20 20 20 20 20 31 32 20 20 20 20    6.      12    
0d00: 20 20 31 20 20 20 20 35 20 20 20 20 20 35 0a 20    1    5     5. 
0d10: 20 20 20 20 20 31 33 20 20 20 20 20 20 35 20 20       13      5  
0d20: 20 20 35 20 20 20 20 20 31 0a 0a 20 20 20 20 20    5     1..     
0d30: 20 31 34 20 20 20 20 20 20 35 20 20 20 20 32 20   14      5    2 
0d40: 20 20 20 20 31 0a 20 20 20 20 20 20 31 35 20 20      1.      15  
0d50: 20 20 20 20 31 20 20 20 20 34 20 20 20 20 20 31      1    4     1
0d60: 0a 20 20 20 20 20 20 31 36 20 20 20 20 20 2d 31  .      16     -1
0d70: 20 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20      0     1.    
0d80: 20 20 31 37 20 20 20 20 20 20 30 20 20 20 20 31    17      0    1
0d90: 20 20 20 20 2d 31 0a 0a 20 20 20 20 7d 20 7b 0a      -1..    } {.
0da0: 20 20 20 20 20 20 73 65 74 20 74 65 73 74 6e 61        set testna
0db0: 6d 65 20 22 65 5f 65 78 70 72 2d 31 2e 24 6f 70  me "e_expr-1.$op
0dc0: 6e 61 6d 65 28 24 6f 70 31 29 2e 24 6f 70 6e 61  name($op1).$opna
0dd0: 6d 65 28 24 6f 70 32 29 2e 24 74 6e 22 0a 0a 20  me($op2).$tn".. 
0de0: 20 20 20 20 20 23 20 49 66 20 24 6f 70 32 20 67       # If $op2 g
0df0: 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74  roups more tight
0e00: 6c 79 20 74 68 61 6e 20 24 6f 70 31 2c 20 74 68  ly than $op1, th
0e10: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  en the result.  
0e20: 20 20 20 20 23 20 6f 66 20 65 78 65 63 75 74 69      # of executi
0e30: 6e 67 20 24 73 71 6c 31 20 77 68 6f 75 6c 64 20  ng $sql1 whould 
0e40: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 65  be the same as e
0e50: 78 65 63 75 74 69 6e 67 20 24 73 71 6c 33 2e 0a  xecuting $sql3..
0e60: 20 20 20 20 20 20 23 20 49 66 20 24 6f 70 31 20        # If $op1 
0e70: 67 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68  groups more tigh
0e80: 74 6c 79 2c 20 6f 72 20 69 66 20 24 6f 70 31 20  tly, or if $op1 
0e90: 61 6e 64 20 24 6f 70 32 20 68 61 76 65 20 0a 20  and $op2 have . 
0ea0: 20 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20       # the same 
0eb0: 70 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 6e  precedence, then
0ec0: 20 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c 31   executing $sql1
0ed0: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20   should return. 
0ee0: 20 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20       # the same 
0ef0: 76 61 6c 75 65 20 61 73 20 24 73 71 6c 32 2e 0a  value as $sql2..
0f00: 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 73 65        #.      se
0f10: 74 20 73 71 6c 31 20 22 53 45 4c 45 43 54 20 24  t sql1 "SELECT $
0f20: 41 20 24 6f 70 31 20 24 42 20 24 6f 70 32 20 24  A $op1 $B $op2 $
0f30: 43 22 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c  C".      set sql
0f40: 32 20 22 53 45 4c 45 43 54 20 28 24 41 20 24 6f  2 "SELECT ($A $o
0f50: 70 31 20 24 42 29 20 24 6f 70 32 20 24 43 22 0a  p1 $B) $op2 $C".
0f60: 20 20 20 20 20 20 73 65 74 20 73 71 6c 33 20 22        set sql3 "
0f70: 53 45 4c 45 43 54 20 24 41 20 24 6f 70 31 20 28  SELECT $A $op1 (
0f80: 24 42 20 24 6f 70 32 20 24 43 29 22 0a 0a 20 20  $B $op2 $C)"..  
0f90: 20 20 20 20 73 65 74 20 61 32 20 5b 64 62 20 6f      set a2 [db o
0fa0: 6e 65 20 24 73 71 6c 32 5d 0a 20 20 20 20 20 20  ne $sql2].      
0fb0: 73 65 74 20 61 33 20 5b 64 62 20 6f 6e 65 20 24  set a3 [db one $
0fc0: 73 71 6c 33 5d 0a 0a 20 20 20 20 20 20 64 6f 5f  sql3]..      do_
0fd0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 65  execsql_test $te
0fe0: 73 74 6e 61 6d 65 20 24 73 71 6c 31 20 5b 6c 69  stname $sql1 [li
0ff0: 73 74 20 5b 0a 20 20 20 20 20 20 20 20 69 66 20  st [.        if 
1000: 7b 24 6f 70 70 72 65 63 28 24 6f 70 32 29 20 3c  {$opprec($op2) <
1010: 20 24 6f 70 70 72 65 63 28 24 6f 70 31 29 7d 20   $opprec($op1)} 
1020: 7b 73 65 74 20 61 33 7d 20 7b 73 65 74 20 61 32  {set a3} {set a2
1030: 7d 0a 20 20 20 20 20 20 5d 5d 0a 20 20 20 20 20  }.      ]].     
1040: 20 69 66 20 7b 24 61 32 20 21 3d 20 24 61 33 7d   if {$a2 != $a3}
1050: 20 7b 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70   { unset -nocomp
1060: 6c 61 69 6e 20 75 6e 74 65 73 74 65 64 28 24 6f  lain untested($o
1070: 70 31 2c 24 6f 70 32 29 20 7d 0a 20 20 20 20 7d  p1,$op2) }.    }
1080: 0a 20 20 7d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20  .  }.}..foreach 
1090: 6f 70 20 7b 2a 20 41 4e 44 20 4f 52 20 2b 20 7c  op {* AND OR + |
10a0: 7c 20 26 20 7c 7d 20 7b 20 75 6e 73 65 74 20 75  | & |} { unset u
10b0: 6e 74 65 73 74 65 64 28 24 6f 70 2c 24 6f 70 29  ntested($op,$op)
10c0: 20 7d 0a 75 6e 73 65 74 20 75 6e 74 65 73 74 65   }.unset unteste
10d0: 64 28 2b 2c 2d 29 20 20 3b 23 20 20 20 20 20 20  d(+,-)  ;#      
10e0: 20 53 69 6e 63 65 20 20 20 20 28 61 2b 62 29 2d   Since    (a+b)-
10f0: 63 20 3d 3d 20 61 2b 28 62 2d 63 29 0a 75 6e 73  c == a+(b-c).uns
1100: 65 74 20 75 6e 74 65 73 74 65 64 28 2a 2c 3c 3c  et untested(*,<<
1110: 29 20 3b 23 20 20 20 20 20 20 20 53 69 6e 63 65  ) ;#       Since
1120: 20 20 20 20 28 61 2a 62 29 3c 3c 63 20 3d 3d 20      (a*b)<<c == 
1130: 61 2a 28 62 3c 3c 63 29 0a 0a 64 6f 5f 74 65 73  a*(b<<c)..do_tes
1140: 74 20 65 5f 65 78 70 72 2d 31 2e 31 20 7b 20 61  t e_expr-1.1 { a
1150: 72 72 61 79 20 6e 61 6d 65 73 20 75 6e 74 65 73  rray names untes
1160: 74 65 64 20 7d 20 7b 7d 0a 0a 23 20 41 74 20 6f  ted } {}..# At o
1170: 6e 65 20 70 6f 69 6e 74 2c 20 74 65 73 74 20 31  ne point, test 1
1180: 2e 32 2e 32 20 77 61 73 20 66 61 69 6c 69 6e 67  .2.2 was failing
1190: 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 74 68 65  . Instead of the
11a0: 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 2c   correct result,
11b0: 20 69 74 0a 23 20 77 61 73 20 72 65 74 75 72 6e   it.# was return
11c0: 69 6e 67 20 7b 31 20 31 20 30 7d 2e 20 54 68 69  ing {1 1 0}. Thi
11d0: 73 20 77 6f 75 6c 64 20 73 65 65 6d 20 74 6f 20  s would seem to 
11e0: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 4c 49  indicate that LI
11f0: 4b 45 20 68 61 73 20 74 68 65 0a 23 20 73 61 6d  KE has the.# sam
1200: 65 20 70 72 65 63 65 64 65 6e 63 65 20 61 73 20  e precedence as 
1210: 27 3c 27 2e 20 57 68 69 63 68 20 69 73 20 69 6e  '<'. Which is in
1220: 63 6f 72 72 65 63 74 2e 20 49 74 20 68 61 73 20  correct. It has 
1230: 6c 6f 77 65 72 20 70 72 65 63 65 64 65 6e 63 65  lower precedence
1240: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
1250: 65 73 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 31  est e_expr-1.2.1
1260: 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 30 20 3c   { .  SELECT 0 <
1270: 20 32 20 4c 49 4b 45 20 31 2c 20 20 20 28 30 20   2 LIKE 1,   (0 
1280: 3c 20 32 29 20 4c 49 4b 45 20 31 2c 20 20 20 30  < 2) LIKE 1,   0
1290: 20 3c 20 28 32 20 4c 49 4b 45 20 31 29 0a 7d 20   < (2 LIKE 1).} 
12a0: 7b 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73  {1 1 0}.do_execs
12b0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
12c0: 2e 32 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54  .2.2 { .  SELECT
12d0: 20 30 20 4c 49 4b 45 20 30 20 3c 20 32 2c 20 20   0 LIKE 0 < 2,  
12e0: 20 28 30 20 4c 49 4b 45 20 30 29 20 3c 20 32 2c   (0 LIKE 0) < 2,
12f0: 20 20 20 30 20 4c 49 4b 45 20 28 30 20 3c 20 32     0 LIKE (0 < 2
1300: 29 0a 7d 20 7b 30 20 31 20 30 7d 0a 0a 23 20 53  ).} {0 1 0}..# S
1310: 68 6f 77 69 6e 67 20 74 68 61 74 20 4c 49 4b 45  howing that LIKE
1320: 20 61 6e 64 20 3d 3d 20 68 61 76 65 20 74 68 65   and == have the
1330: 20 73 61 6d 65 20 70 72 65 63 65 64 65 6e 63 65   same precedence
1340: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1350: 73 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 33 20  st e_expr-1.2.3 
1360: 7b 20 0a 20 20 53 45 4c 45 43 54 20 32 20 4c 49  { .  SELECT 2 LI
1370: 4b 45 20 32 20 3d 3d 20 31 2c 20 20 20 28 32 20  KE 2 == 1,   (2 
1380: 4c 49 4b 45 20 32 29 20 3d 3d 20 31 2c 20 20 20  LIKE 2) == 1,   
1390: 20 32 20 4c 49 4b 45 20 28 32 20 3d 3d 20 31 29   2 LIKE (2 == 1)
13a0: 0a 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65 78  .} {1 1 0}.do_ex
13b0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
13c0: 72 2d 31 2e 32 2e 34 20 7b 20 0a 20 20 53 45 4c  r-1.2.4 { .  SEL
13d0: 45 43 54 20 32 20 3d 3d 20 32 20 4c 49 4b 45 20  ECT 2 == 2 LIKE 
13e0: 31 2c 20 20 20 28 32 20 3d 3d 20 32 29 20 4c 49  1,   (2 == 2) LI
13f0: 4b 45 20 31 2c 20 20 20 20 32 20 3d 3d 20 28 32  KE 1,    2 == (2
1400: 20 4c 49 4b 45 20 31 29 0a 7d 20 7b 31 20 31 20   LIKE 1).} {1 1 
1410: 30 7d 0a 0a 23 20 53 68 6f 77 69 6e 67 20 74 68  0}..# Showing th
1420: 61 74 20 3c 20 67 72 6f 75 70 73 20 6d 6f 72 65  at < groups more
1430: 20 74 69 67 68 74 6c 79 20 74 68 61 6e 20 3d 3d   tightly than ==
1440: 20 28 3c 20 68 61 73 20 68 69 67 68 65 72 20 70   (< has higher p
1450: 72 65 63 65 64 65 6e 63 65 29 2e 20 0a 23 0a 64  recedence). .#.d
1460: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
1470: 5f 65 78 70 72 2d 31 2e 32 2e 35 20 7b 20 0a 20  _expr-1.2.5 { . 
1480: 20 53 45 4c 45 43 54 20 30 20 3c 20 32 20 3d 3d   SELECT 0 < 2 ==
1490: 20 31 2c 20 20 20 28 30 20 3c 20 32 29 20 3d 3d   1,   (0 < 2) ==
14a0: 20 31 2c 20 20 20 30 20 3c 20 28 32 20 3d 3d 20   1,   0 < (2 == 
14b0: 31 29 0a 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f  1).} {1 1 0}.do_
14c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
14d0: 78 70 72 2d 31 2e 36 20 7b 20 0a 20 20 53 45 4c  xpr-1.6 { .  SEL
14e0: 45 43 54 20 30 20 3d 3d 20 30 20 3c 20 32 2c 20  ECT 0 == 0 < 2, 
14f0: 20 20 28 30 20 3d 3d 20 30 29 20 3c 20 32 2c 20    (0 == 0) < 2, 
1500: 20 20 30 20 3d 3d 20 28 30 20 3c 20 32 29 0a 7d    0 == (0 < 2).}
1510: 20 7b 30 20 31 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d   {0 1 0}..#-----
1520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61  ----.# Check tha
1570: 74 20 74 68 65 20 66 6f 75 72 20 75 6e 61 72 79  t the four unary
1580: 20 70 72 65 66 69 78 20 6f 70 65 72 61 74 6f 72   prefix operator
1590: 73 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74  s mentioned in t
15a0: 68 65 20 0a 23 20 64 6f 63 75 6d 65 6e 74 61 74  he .# documentat
15b0: 69 6f 6e 20 65 78 69 73 74 2e 0a 23 0a 23 20 45  ion exist..#.# E
15c0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33  VIDENCE-OF: R-13
15d0: 39 35 38 2d 35 33 34 31 39 20 53 75 70 70 6f 72  958-53419 Suppor
15e0: 74 65 64 20 75 6e 61 72 79 20 70 72 65 66 69 78  ted unary prefix
15f0: 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 74   operators are t
1600: 68 65 73 65 3a 0a 23 20 2d 20 2b 20 7e 20 4e 4f  hese:.# - + ~ NO
1610: 54 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  T.#.do_execsql_t
1620: 65 73 74 20 65 5f 65 78 70 72 2d 32 2e 31 20 7b  est e_expr-2.1 {
1630: 20 53 45 4c 45 43 54 20 2d 20 20 20 31 30 20 20   SELECT -   10  
1640: 20 7d 20 7b 2d 31 30 7d 0a 64 6f 5f 65 78 65 63   } {-10}.do_exec
1650: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
1660: 32 2e 32 20 7b 20 53 45 4c 45 43 54 20 2b 20 20  2.2 { SELECT +  
1670: 20 31 30 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f   10   } {10}.do_
1680: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
1690: 78 70 72 2d 32 2e 33 20 7b 20 53 45 4c 45 43 54  xpr-2.3 { SELECT
16a0: 20 7e 20 20 20 31 30 20 20 20 7d 20 7b 2d 31 31   ~   10   } {-11
16b0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
16c0: 74 20 65 5f 65 78 70 72 2d 32 2e 34 20 7b 20 53  t e_expr-2.4 { S
16d0: 45 4c 45 43 54 20 4e 4f 54 20 31 30 20 20 20 7d  ELECT NOT 10   }
16e0: 20 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   {0}..#---------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 0a 23 20 54 65 73 74 73 20 66 6f 72 20 74 68 65  .# Tests for the
1740: 20 74 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 20   two statements 
1750: 6d 61 64 65 20 72 65 67 61 72 64 69 6e 67 20 74  made regarding t
1760: 68 65 20 75 6e 61 72 79 20 2b 20 6f 70 65 72 61  he unary + opera
1770: 74 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  tor..#.# EVIDENC
1780: 45 2d 4f 46 3a 20 52 2d 35 33 36 37 30 2d 30 33  E-OF: R-53670-03
1790: 33 37 33 20 54 68 65 20 75 6e 61 72 79 20 6f 70  373 The unary op
17a0: 65 72 61 74 6f 72 20 2b 20 69 73 20 61 20 6e 6f  erator + is a no
17b0: 2d 6f 70 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  -op..#.# EVIDENC
17c0: 45 2d 4f 46 3a 20 52 2d 31 39 34 38 30 2d 33 30  E-OF: R-19480-30
17d0: 39 36 38 20 49 74 20 63 61 6e 20 62 65 20 61 70  968 It can be ap
17e0: 70 6c 69 65 64 20 74 6f 20 73 74 72 69 6e 67 73  plied to strings
17f0: 2c 20 6e 75 6d 62 65 72 73 2c 0a 23 20 62 6c 6f  , numbers,.# blo
1800: 62 73 20 6f 72 20 4e 55 4c 4c 20 61 6e 64 20 69  bs or NULL and i
1810: 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
1820: 20 61 20 72 65 73 75 6c 74 20 77 69 74 68 20 74   a result with t
1830: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
1840: 0a 23 20 74 68 65 20 6f 70 65 72 61 6e 64 2e 0a  .# the operand..
1850: 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6c 69  #.foreach {tn li
1860: 74 65 72 61 6c 20 74 79 70 65 7d 20 7b 0a 20 20  teral type} {.  
1870: 31 20 20 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c  1     'helloworl
1880: 64 27 20 20 20 74 65 78 74 0a 20 20 32 20 20 20  d'   text.  2   
1890: 20 20 34 35 20 20 20 20 20 20 20 20 20 20 20 20    45            
18a0: 20 69 6e 74 65 67 65 72 0a 20 20 33 20 20 20 20   integer.  3    
18b0: 20 34 35 2e 32 20 20 20 20 20 20 20 20 20 20 20   45.2           
18c0: 72 65 61 6c 0a 20 20 34 20 20 20 20 20 34 35 2e  real.  4     45.
18d0: 30 20 20 20 20 20 20 20 20 20 20 20 72 65 61 6c  0           real
18e0: 0a 20 20 35 20 20 20 20 20 58 27 41 42 43 44 45  .  5     X'ABCDE
18f0: 46 27 20 20 20 20 20 20 62 6c 6f 62 0a 20 20 36  F'      blob.  6
1900: 20 20 20 20 20 4e 55 4c 4c 20 20 20 20 20 20 20       NULL       
1910: 20 20 20 20 6e 75 6c 6c 0a 7d 20 7b 0a 20 20 73      null.} {.  s
1920: 65 74 20 73 71 6c 20 22 20 53 45 4c 45 43 54 20  et sql " SELECT 
1930: 71 75 6f 74 65 28 20 2b 20 24 6c 69 74 65 72 61  quote( + $litera
1940: 6c 20 29 2c 20 74 79 70 65 6f 66 28 20 2b 20 24  l ), typeof( + $
1950: 6c 69 74 65 72 61 6c 29 20 22 0a 20 20 64 6f 5f  literal) ".  do_
1960: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
1970: 78 70 72 2d 33 2e 24 74 6e 20 24 73 71 6c 20 5b  xpr-3.$tn $sql [
1980: 6c 69 73 74 20 24 6c 69 74 65 72 61 6c 20 24 74  list $literal $t
1990: 79 70 65 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  ype].}..#-------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19e0: 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20  --.# Check that 
19f0: 62 6f 74 68 20 3d 20 61 6e 64 20 3d 3d 20 61 72  both = and == ar
1a00: 65 20 62 6f 74 68 20 61 63 63 65 70 74 61 62 6c  e both acceptabl
1a10: 65 20 61 73 20 74 68 65 20 22 65 71 75 61 6c 73  e as the "equals
1a20: 22 20 6f 70 65 72 61 74 6f 72 2e 0a 23 20 53 69  " operator..# Si
1a30: 6d 69 6c 61 72 6c 79 2c 20 65 69 74 68 65 72 20  milarly, either 
1a40: 21 3d 20 6f 72 20 3c 3e 20 77 6f 72 6b 20 61 73  != or <> work as
1a50: 20 74 68 65 20 6e 6f 74 2d 65 71 75 61 6c 73 20   the not-equals 
1a60: 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 23 20 45 56  operator..#.# EV
1a70: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36  IDENCE-OF: R-036
1a80: 37 39 2d 36 30 36 33 39 20 45 71 75 61 6c 73 20  79-60639 Equals 
1a90: 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 3d 20  can be either = 
1aa0: 6f 72 20 3d 3d 2e 0a 23 0a 23 20 45 56 49 44 45  or ==..#.# EVIDE
1ab0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 30 38 32 2d  NCE-OF: R-30082-
1ac0: 33 38 39 39 36 20 54 68 65 20 6e 6f 6e 2d 65 71  38996 The non-eq
1ad0: 75 61 6c 73 20 6f 70 65 72 61 74 6f 72 20 63 61  uals operator ca
1ae0: 6e 20 62 65 20 65 69 74 68 65 72 20 21 3d 20 6f  n be either != o
1af0: 72 0a 23 20 3c 3e 2e 0a 23 0a 66 6f 72 65 61 63  r.# <>..#.foreac
1b00: 68 20 7b 74 6e 20 6c 69 74 65 72 61 6c 20 64 69  h {tn literal di
1b10: 66 66 65 72 65 6e 74 7d 20 7b 0a 20 20 31 20 20  fferent} {.  1  
1b20: 20 27 68 65 6c 6c 6f 77 6f 72 6c 64 27 20 20 27   'helloworld'  '
1b30: 31 32 33 34 35 27 0a 20 20 32 20 20 20 32 32 20  12345'.  2   22 
1b40: 20 20 20 20 20 20 20 20 20 20 20 32 33 0a 20 20             23.  
1b50: 33 20 20 20 27 78 79 7a 27 20 20 20 20 20 20 20  3   'xyz'       
1b60: 20 20 58 27 37 38 37 39 37 41 27 0a 20 20 34 20    X'78797A'.  4 
1b70: 20 20 58 27 37 38 37 39 37 41 30 30 27 20 20 20    X'78797A00'   
1b80: 27 78 79 7a 27 0a 7d 20 7b 0a 20 20 64 6f 5f 65  'xyz'.} {.  do_e
1b90: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
1ba0: 70 72 2d 34 2e 24 74 6e 20 22 0a 20 20 20 20 53  pr-4.$tn ".    S
1bb0: 45 4c 45 43 54 20 24 6c 69 74 65 72 61 6c 20 20  ELECT $literal  
1bc0: 3d 20 24 6c 69 74 65 72 61 6c 2c 20 20 20 24 6c  = $literal,   $l
1bd0: 69 74 65 72 61 6c 20 3d 3d 20 24 6c 69 74 65 72  iteral == $liter
1be0: 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24  al,.           $
1bf0: 6c 69 74 65 72 61 6c 20 20 3d 20 24 64 69 66 66  literal  = $diff
1c00: 65 72 65 6e 74 2c 20 24 6c 69 74 65 72 61 6c 20  erent, $literal 
1c10: 3d 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 0a 20  == $different,. 
1c20: 20 20 20 20 20 20 20 20 20 20 24 6c 69 74 65 72            $liter
1c30: 61 6c 20 20 3d 20 4e 55 4c 4c 2c 20 20 20 20 20  al  = NULL,     
1c40: 20 20 24 6c 69 74 65 72 61 6c 20 3d 3d 20 4e 55    $literal == NU
1c50: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24  LL,.           $
1c60: 6c 69 74 65 72 61 6c 20 21 3d 20 24 6c 69 74 65  literal != $lite
1c70: 72 61 6c 2c 20 20 20 24 6c 69 74 65 72 61 6c 20  ral,   $literal 
1c80: 3c 3e 20 24 6c 69 74 65 72 61 6c 2c 0a 20 20 20  <> $literal,.   
1c90: 20 20 20 20 20 20 20 20 24 6c 69 74 65 72 61 6c          $literal
1ca0: 20 21 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 20   != $different, 
1cb0: 24 6c 69 74 65 72 61 6c 20 3c 3e 20 24 64 69 66  $literal <> $dif
1cc0: 66 65 72 65 6e 74 2c 0a 20 20 20 20 20 20 20 20  ferent,.        
1cd0: 20 20 20 24 6c 69 74 65 72 61 6c 20 21 3d 20 4e     $literal != N
1ce0: 55 4c 4c 2c 20 20 20 20 20 20 20 24 6c 69 74 65  ULL,       $lite
1cf0: 72 61 6c 20 21 3d 20 4e 55 4c 4c 0a 0a 20 20 22  ral != NULL..  "
1d00: 20 7b 31 20 31 20 30 20 30 20 7b 7d 20 7b 7d 20   {1 1 0 0 {} {} 
1d10: 30 20 30 20 31 20 31 20 7b 7d 20 7b 7d 7d 0a 7d  0 0 1 1 {} {}}.}
1d20: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
1d70: 65 73 74 20 74 68 65 20 7c 7c 20 6f 70 65 72 61  est the || opera
1d80: 74 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  tor..#.# EVIDENC
1d90: 45 2d 4f 46 3a 20 52 2d 34 34 34 30 39 2d 36 32  E-OF: R-44409-62
1da0: 36 34 31 20 54 68 65 20 7c 7c 20 6f 70 65 72 61  641 The || opera
1db0: 74 6f 72 20 69 73 20 22 63 6f 6e 63 61 74 65 6e  tor is "concaten
1dc0: 61 74 65 22 20 2d 20 69 74 20 6a 6f 69 6e 73 0a  ate" - it joins.
1dd0: 23 20 74 6f 67 65 74 68 65 72 20 74 68 65 20 74  # together the t
1de0: 77 6f 20 73 74 72 69 6e 67 73 20 6f 66 20 69 74  wo strings of it
1df0: 73 20 6f 70 65 72 61 6e 64 73 2e 0a 23 0a 66 6f  s operands..#.fo
1e00: 72 65 61 63 68 20 7b 74 6e 20 61 20 62 7d 20 7b  reach {tn a b} {
1e10: 0a 20 20 31 20 20 20 27 68 65 6c 6c 6f 77 6f 72  .  1   'hellowor
1e20: 6c 64 27 20 20 27 31 32 33 34 35 27 0a 20 20 32  ld'  '12345'.  2
1e30: 20 20 20 32 32 20 20 20 20 20 20 20 20 20 20 20     22           
1e40: 20 32 33 0a 7d 20 7b 0a 20 20 73 65 74 20 61 73   23.} {.  set as
1e50: 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54   [db one "SELECT
1e60: 20 24 61 22 5d 0a 20 20 73 65 74 20 62 73 20 5b   $a"].  set bs [
1e70: 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 24  db one "SELECT $
1e80: 62 22 5d 0a 20 20 0a 20 20 64 6f 5f 65 78 65 63  b"].  .  do_exec
1e90: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
1ea0: 35 2e 24 74 6e 20 22 53 45 4c 45 43 54 20 24 61  5.$tn "SELECT $a
1eb0: 20 7c 7c 20 24 62 22 20 5b 6c 69 73 74 20 22 24   || $b" [list "$
1ec0: 7b 61 73 7d 24 7b 62 73 7d 22 5d 0a 7d 0a 0a 23  {as}${bs}"].}..#
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
1f20: 20 74 68 65 20 25 20 6f 70 65 72 61 74 6f 72 2e   the % operator.
1f30: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
1f40: 3a 20 52 2d 30 38 39 31 34 2d 36 33 37 39 30 20  : R-08914-63790 
1f50: 54 68 65 20 6f 70 65 72 61 74 6f 72 20 25 20 6f  The operator % o
1f60: 75 74 70 75 74 73 20 74 68 65 20 76 61 6c 75 65  utputs the value
1f70: 20 6f 66 20 69 74 73 0a 23 20 6c 65 66 74 20 6f   of its.# left o
1f80: 70 65 72 61 6e 64 20 6d 6f 64 75 6c 6f 20 69 74  perand modulo it
1f90: 73 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  s right operand.
1fa0: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1fb0: 73 74 20 65 5f 65 78 70 72 2d 36 2e 31 20 7b 53  st e_expr-6.1 {S
1fc0: 45 4c 45 43 54 20 20 37 32 25 35 7d 20 20 7b 32  ELECT  72%5}  {2
1fd0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
1fe0: 74 20 65 5f 65 78 70 72 2d 36 2e 32 20 7b 53 45  t e_expr-6.2 {SE
1ff0: 4c 45 43 54 20 20 37 32 25 2d 35 7d 20 7b 32 7d  LECT  72%-5} {2}
2000: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2010: 20 65 5f 65 78 70 72 2d 36 2e 33 20 7b 53 45 4c   e_expr-6.3 {SEL
2020: 45 43 54 20 2d 37 32 25 2d 35 7d 20 7b 2d 32 7d  ECT -72%-5} {-2}
2030: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2040: 20 65 5f 65 78 70 72 2d 36 2e 34 20 7b 53 45 4c   e_expr-6.4 {SEL
2050: 45 43 54 20 2d 37 32 25 35 7d 20 20 7b 2d 32 7d  ECT -72%5}  {-2}
2060: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
20b0: 65 73 74 20 74 68 61 74 20 74 68 65 20 72 65 73  est that the res
20c0: 75 6c 74 73 20 6f 66 20 61 6c 6c 20 62 69 6e 61  ults of all bina
20d0: 72 79 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65  ry operators are
20e0: 20 65 69 74 68 65 72 20 6e 75 6d 65 72 69 63 20   either numeric 
20f0: 6f 72 20 0a 23 20 4e 55 4c 4c 2c 20 65 78 63 65  or .# NULL, exce
2100: 70 74 20 66 6f 72 20 74 68 65 20 7c 7c 20 6f 70  pt for the || op
2110: 65 72 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61  erator, which ma
2120: 79 20 65 76 61 6c 75 61 74 65 20 74 6f 20 65 69  y evaluate to ei
2130: 74 68 65 72 20 61 20 74 65 78 74 0a 23 20 76 61  ther a text.# va
2140: 6c 75 65 20 6f 72 20 4e 55 4c 4c 2e 0a 23 0a 23  lue or NULL..#.#
2150: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2160: 32 30 36 36 35 2d 31 37 37 39 32 20 54 68 65 20  20665-17792 The 
2170: 72 65 73 75 6c 74 20 6f 66 20 61 6e 79 20 62 69  result of any bi
2180: 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73  nary operator is
2190: 20 65 69 74 68 65 72 0a 23 20 61 20 6e 75 6d 65   either.# a nume
21a0: 72 69 63 20 76 61 6c 75 65 20 6f 72 20 4e 55 4c  ric value or NUL
21b0: 4c 2c 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  L, except for th
21c0: 65 20 7c 7c 20 63 6f 6e 63 61 74 65 6e 61 74 69  e || concatenati
21d0: 6f 6e 20 6f 70 65 72 61 74 6f 72 0a 23 20 77 68  on operator.# wh
21e0: 69 63 68 20 61 6c 77 61 79 73 20 65 76 61 6c 75  ich always evalu
21f0: 61 74 65 73 20 74 6f 20 65 69 74 68 65 72 20 4e  ates to either N
2200: 55 4c 4c 20 6f 72 20 61 20 74 65 78 74 20 76 61  ULL or a text va
2210: 6c 75 65 2e 0a 23 0a 73 65 74 20 6c 69 74 65 72  lue..#.set liter
2220: 61 6c 73 20 7b 0a 20 20 31 20 27 61 62 63 27 20  als {.  1 'abc' 
2230: 20 20 20 20 20 20 20 32 20 27 68 65 78 61 64 65         2 'hexade
2240: 63 69 6d 61 6c 27 20 20 20 20 20 20 20 33 20 27  cimal'       3 '
2250: 27 0a 20 20 34 20 31 32 33 20 20 20 20 20 20 20  '.  4 123       
2260: 20 20 20 35 20 2d 31 32 33 20 20 20 20 20 20 20     5 -123       
2270: 20 20 20 20 20 20 20 20 20 36 20 30 0a 20 20 37           6 0.  7
2280: 20 31 32 33 2e 34 20 20 20 20 20 20 20 20 38 20   123.4        8 
2290: 30 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20  0.0             
22a0: 20 20 20 20 39 20 2d 31 32 33 2e 34 0a 20 31 30      9 -123.4. 10
22b0: 20 58 27 41 42 43 44 45 46 27 20 20 20 31 31 20   X'ABCDEF'   11 
22c0: 58 27 27 20 20 20 20 20 20 20 20 20 20 20 20 20  X''             
22d0: 20 20 20 31 32 20 58 27 30 30 30 30 27 0a 20 31     12 X'0000'. 1
22e0: 33 20 20 20 20 20 4e 55 4c 4c 0a 7d 0a 66 6f 72  3     NULL.}.for
22f0: 65 61 63 68 20 6f 70 20 24 6f 70 6c 69 73 74 20  each op $oplist 
2300: 7b 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 31 20  {.  foreach {n1 
2310: 72 68 73 7d 20 24 6c 69 74 65 72 61 6c 73 20 7b  rhs} $literals {
2320: 20 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 32 20   .  foreach {n2 
2330: 6c 68 73 7d 20 24 6c 69 74 65 72 61 6c 73 20 7b  lhs} $literals {
2340: 0a 0a 20 20 20 20 73 65 74 20 74 20 5b 64 62 20  ..    set t [db 
2350: 6f 6e 65 20 22 20 53 45 4c 45 43 54 20 74 79 70  one " SELECT typ
2360: 65 6f 66 28 24 6c 68 73 20 24 6f 70 20 24 72 68  eof($lhs $op $rh
2370: 73 29 20 22 5d 0a 20 20 20 20 64 6f 5f 74 65 73  s) "].    do_tes
2380: 74 20 65 5f 65 78 70 72 2d 37 2e 24 6f 70 6e 61  t e_expr-7.$opna
2390: 6d 65 28 24 6f 70 29 2e 24 6e 31 2e 24 6e 32 20  me($op).$n1.$n2 
23a0: 7b 0a 20 20 20 20 20 20 65 78 70 72 20 7b 0a 20  {.      expr {. 
23b0: 20 20 20 20 20 20 20 20 20 20 28 24 6f 70 3d 3d            ($op==
23c0: 22 7c 7c 22 20 26 26 20 28 24 74 20 3d 3d 20 22  "||" && ($t == "
23d0: 74 65 78 74 22 20 7c 7c 20 24 74 20 3d 3d 20 22  text" || $t == "
23e0: 6e 75 6c 6c 22 29 29 0a 20 20 20 20 20 20 20 20  null")).        
23f0: 7c 7c 20 28 24 6f 70 21 3d 22 7c 7c 22 20 26 26  || ($op!="||" &&
2400: 20 28 24 74 20 3d 3d 20 22 69 6e 74 65 67 65 72   ($t == "integer
2410: 22 20 7c 7c 20 24 74 20 3d 3d 20 22 72 65 61 6c  " || $t == "real
2420: 22 20 7c 7c 20 24 74 20 3d 3d 20 22 6e 75 6c 6c  " || $t == "null
2430: 22 29 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ")).      }.    
2440: 7d 20 31 0a 0a 20 20 7d 7d 0a 7d 0a 0a 23 2d 2d  } 1..  }}.}..#--
2450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2490: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
24a0: 68 65 20 49 53 20 61 6e 64 20 49 53 20 4e 4f 54  he IS and IS NOT
24b0: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 23 0a 23 20   operators..#.# 
24c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
24d0: 34 37 33 31 2d 34 35 37 37 33 20 54 68 65 20 49  4731-45773 The I
24e0: 53 20 61 6e 64 20 49 53 20 4e 4f 54 20 6f 70 65  S and IS NOT ope
24f0: 72 61 74 6f 72 73 20 77 6f 72 6b 20 6c 69 6b 65  rators work like
2500: 20 3d 20 61 6e 64 0a 23 20 21 3d 20 65 78 63 65   = and.# != exce
2510: 70 74 20 77 68 65 6e 20 6f 6e 65 20 6f 72 20 62  pt when one or b
2520: 6f 74 68 20 6f 66 20 74 68 65 20 6f 70 65 72 61  oth of the opera
2530: 6e 64 73 20 61 72 65 20 4e 55 4c 4c 2e 0a 23 0a  nds are NULL..#.
2540: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
2550: 2d 30 36 33 32 35 2d 31 35 33 31 35 20 49 6e 20  -06325-15315 In 
2560: 74 68 69 73 20 63 61 73 65 2c 20 69 66 20 62 6f  this case, if bo
2570: 74 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20  th operands are 
2580: 4e 55 4c 4c 2c 0a 23 20 74 68 65 6e 20 74 68 65  NULL,.# then the
2590: 20 49 53 20 6f 70 65 72 61 74 6f 72 20 65 76 61   IS operator eva
25a0: 6c 75 61 74 65 73 20 74 6f 20 31 20 28 74 72 75  luates to 1 (tru
25b0: 65 29 20 61 6e 64 20 74 68 65 20 49 53 20 4e 4f  e) and the IS NO
25c0: 54 20 6f 70 65 72 61 74 6f 72 0a 23 20 65 76 61  T operator.# eva
25d0: 6c 75 61 74 65 73 20 74 6f 20 30 20 28 66 61 6c  luates to 0 (fal
25e0: 73 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  se)..#.# EVIDENC
25f0: 45 2d 4f 46 3a 20 52 2d 31 39 38 31 32 2d 33 36  E-OF: R-19812-36
2600: 37 37 39 20 49 66 20 6f 6e 65 20 6f 70 65 72 61  779 If one opera
2610: 6e 64 20 69 73 20 4e 55 4c 4c 20 61 6e 64 20 74  nd is NULL and t
2620: 68 65 20 6f 74 68 65 72 20 69 73 0a 23 20 6e 6f  he other is.# no
2630: 74 2c 20 74 68 65 6e 20 74 68 65 20 49 53 20 6f  t, then the IS o
2640: 70 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65  perator evaluate
2650: 73 20 74 6f 20 30 20 28 66 61 6c 73 65 29 20 61  s to 0 (false) a
2660: 6e 64 20 74 68 65 20 49 53 20 4e 4f 54 0a 23 20  nd the IS NOT.# 
2670: 6f 70 65 72 61 74 6f 72 20 69 73 20 31 20 28 74  operator is 1 (t
2680: 72 75 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e  rue)..#.# EVIDEN
2690: 43 45 2d 4f 46 3a 20 52 2d 36 31 39 37 35 2d 31  CE-OF: R-61975-1
26a0: 33 34 31 30 20 49 74 20 69 73 20 6e 6f 74 20 70  3410 It is not p
26b0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 49  ossible for an I
26c0: 53 20 6f 72 20 49 53 20 4e 4f 54 0a 23 20 65 78  S or IS NOT.# ex
26d0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 65 76 61 6c  pression to eval
26e0: 75 61 74 65 20 74 6f 20 4e 55 4c 4c 2e 0a 23 0a  uate to NULL..#.
26f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2700: 65 5f 65 78 70 72 2d 38 2e 31 2e 31 20 20 7b 20  e_expr-8.1.1  { 
2710: 53 45 4c 45 43 54 20 4e 55 4c 4c 20 49 53 20 20  SELECT NULL IS  
2720: 20 20 20 4e 55 4c 4c 20 7d 20 7b 31 7d 0a 64 6f     NULL } {1}.do
2730: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
2740: 65 78 70 72 2d 38 2e 31 2e 32 20 20 7b 20 53 45  expr-8.1.2  { SE
2750: 4c 45 43 54 20 27 61 62 27 20 49 53 20 20 20 20  LECT 'ab' IS    
2760: 20 4e 55 4c 4c 20 7d 20 7b 30 7d 0a 64 6f 5f 65   NULL } {0}.do_e
2770: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
2780: 70 72 2d 38 2e 31 2e 33 20 20 7b 20 53 45 4c 45  pr-8.1.3  { SELE
2790: 43 54 20 4e 55 4c 4c 20 49 53 20 20 20 20 20 27  CT NULL IS     '
27a0: 61 62 27 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65  ab' } {0}.do_exe
27b0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
27c0: 2d 38 2e 31 2e 34 20 20 7b 20 53 45 4c 45 43 54  -8.1.4  { SELECT
27d0: 20 27 61 62 27 20 49 53 20 20 20 20 20 27 61 62   'ab' IS     'ab
27e0: 27 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73  ' } {1}.do_execs
27f0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38  ql_test e_expr-8
2800: 2e 31 2e 35 20 20 7b 20 53 45 4c 45 43 54 20 4e  .1.5  { SELECT N
2810: 55 4c 4c 20 3d 3d 20 20 20 20 20 4e 55 4c 4c 20  ULL ==     NULL 
2820: 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  } {{}}.do_execsq
2830: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
2840: 31 2e 36 20 20 7b 20 53 45 4c 45 43 54 20 27 61  1.6  { SELECT 'a
2850: 62 27 20 3d 3d 20 20 20 20 20 4e 55 4c 4c 20 7d  b' ==     NULL }
2860: 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {{}}.do_execsql
2870: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31  _test e_expr-8.1
2880: 2e 37 20 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c  .7  { SELECT NUL
2890: 4c 20 3d 3d 20 20 20 20 20 27 61 62 27 20 7d 20  L ==     'ab' } 
28a0: 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {{}}.do_execsql_
28b0: 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e  test e_expr-8.1.
28c0: 38 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27  8  { SELECT 'ab'
28d0: 20 3d 3d 20 20 20 20 20 27 61 62 27 20 7d 20 7b   ==     'ab' } {
28e0: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
28f0: 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 39 20  st e_expr-8.1.9 
2900: 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 49   { SELECT NULL I
2910: 53 20 4e 4f 54 20 4e 55 4c 4c 20 7d 20 7b 30 7d  S NOT NULL } {0}
2920: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2930: 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31 30 20 7b   e_expr-8.1.10 {
2940: 20 53 45 4c 45 43 54 20 27 61 62 27 20 49 53 20   SELECT 'ab' IS 
2950: 4e 4f 54 20 4e 55 4c 4c 20 7d 20 7b 31 7d 0a 64  NOT NULL } {1}.d
2960: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
2970: 5f 65 78 70 72 2d 38 2e 31 2e 31 31 20 7b 20 53  _expr-8.1.11 { S
2980: 45 4c 45 43 54 20 4e 55 4c 4c 20 49 53 20 4e 4f  ELECT NULL IS NO
2990: 54 20 27 61 62 27 20 7d 20 7b 31 7d 0a 64 6f 5f  T 'ab' } {1}.do_
29a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
29b0: 78 70 72 2d 38 2e 31 2e 31 32 20 7b 20 53 45 4c  xpr-8.1.12 { SEL
29c0: 45 43 54 20 27 61 62 27 20 49 53 20 4e 4f 54 20  ECT 'ab' IS NOT 
29d0: 27 61 62 27 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78  'ab' } {0}.do_ex
29e0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
29f0: 72 2d 38 2e 31 2e 31 33 20 7b 20 53 45 4c 45 43  r-8.1.13 { SELEC
2a00: 54 20 4e 55 4c 4c 20 21 3d 20 20 20 20 20 4e 55  T NULL !=     NU
2a10: 4c 4c 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65  LL } {{}}.do_exe
2a20: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
2a30: 2d 38 2e 31 2e 31 34 20 7b 20 53 45 4c 45 43 54  -8.1.14 { SELECT
2a40: 20 27 61 62 27 20 21 3d 20 20 20 20 20 4e 55 4c   'ab' !=     NUL
2a50: 4c 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63  L } {{}}.do_exec
2a60: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
2a70: 38 2e 31 2e 31 35 20 7b 20 53 45 4c 45 43 54 20  8.1.15 { SELECT 
2a80: 4e 55 4c 4c 20 21 3d 20 20 20 20 20 27 61 62 27  NULL !=     'ab'
2a90: 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73   } {{}}.do_execs
2aa0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38  ql_test e_expr-8
2ab0: 2e 31 2e 31 36 20 7b 20 53 45 4c 45 43 54 20 27  .1.16 { SELECT '
2ac0: 61 62 27 20 21 3d 20 20 20 20 20 27 61 62 27 20  ab' !=     'ab' 
2ad0: 7d 20 7b 30 7d 0a 0a 66 6f 72 65 61 63 68 20 7b  } {0}..foreach {
2ae0: 6e 31 20 72 68 73 7d 20 24 6c 69 74 65 72 61 6c  n1 rhs} $literal
2af0: 73 20 7b 20 0a 20 20 66 6f 72 65 61 63 68 20 7b  s { .  foreach {
2b00: 6e 32 20 6c 68 73 7d 20 24 6c 69 74 65 72 61 6c  n2 lhs} $literal
2b10: 73 20 7b 0a 20 20 20 20 69 66 20 7b 24 72 68 73  s {.    if {$rhs
2b20: 21 3d 22 4e 55 4c 4c 22 20 26 26 20 24 6c 68 73  !="NULL" && $lhs
2b30: 21 3d 22 4e 55 4c 4c 22 7d 20 7b 0a 20 20 20 20  !="NULL"} {.    
2b40: 20 20 73 65 74 20 65 71 20 5b 65 78 65 63 73 71    set eq [execsq
2b50: 6c 20 22 53 45 4c 45 43 54 20 24 6c 68 73 20 3d  l "SELECT $lhs =
2b60: 20 24 72 68 73 2c 20 24 6c 68 73 20 21 3d 20 24   $rhs, $lhs != $
2b70: 72 68 73 22 5d 0a 20 20 20 20 7d 20 65 6c 73 65  rhs"].    } else
2b80: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 65 71 20   {.      set eq 
2b90: 5b 6c 69 73 74 20 5b 65 78 70 72 20 7b 24 6c 68  [list [expr {$lh
2ba0: 73 3d 3d 22 4e 55 4c 4c 22 20 26 26 20 24 72 68  s=="NULL" && $rh
2bb0: 73 3d 3d 22 4e 55 4c 4c 22 7d 5d 20 5c 0a 20 20  s=="NULL"}] \.  
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 5b 65 78 70 72 20 7b 24 6c 68 73 21 3d 22 4e   [expr {$lhs!="N
2be0: 55 4c 4c 22 20 7c 7c 20 24 72 68 73 21 3d 22 4e  ULL" || $rhs!="N
2bf0: 55 4c 4c 22 7d 5d 0a 20 20 20 20 20 20 5d 0a 20  ULL"}].      ]. 
2c00: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 74 65 73     }.    set tes
2c10: 74 20 65 5f 65 78 70 72 2d 38 2e 32 2e 24 6e 31  t e_expr-8.2.$n1
2c20: 2e 24 6e 32 0a 20 20 20 20 64 6f 5f 65 78 65 63  .$n2.    do_exec
2c30: 73 71 6c 5f 74 65 73 74 20 24 74 65 73 74 2e 31  sql_test $test.1
2c40: 20 22 53 45 4c 45 43 54 20 24 6c 68 73 20 49 53   "SELECT $lhs IS
2c50: 20 24 72 68 73 2c 20 24 6c 68 73 20 49 53 20 4e   $rhs, $lhs IS N
2c60: 4f 54 20 24 72 68 73 22 20 24 65 71 0a 20 20 20  OT $rhs" $eq.   
2c70: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
2c80: 20 24 74 65 73 74 2e 32 20 22 0a 20 20 20 20 20   $test.2 ".     
2c90: 20 53 45 4c 45 43 54 20 28 24 6c 68 73 20 49 53   SELECT ($lhs IS
2ca0: 20 24 72 68 73 29 20 49 53 20 4e 55 4c 4c 2c 20   $rhs) IS NULL, 
2cb0: 28 24 6c 68 73 20 49 53 20 4e 4f 54 20 24 72 68  ($lhs IS NOT $rh
2cc0: 73 29 20 49 53 20 4e 55 4c 4c 0a 20 20 20 20 22  s) IS NULL.    "
2cd0: 20 7b 30 20 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d   {0 0}.  }.}..#-
2ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d20: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 75 6e 20 73  --------.# Run s
2d30: 6f 6d 65 20 74 65 73 74 73 20 6f 6e 20 74 68 65  ome tests on the
2d40: 20 43 4f 4c 4c 41 54 45 20 22 75 6e 61 72 79 20   COLLATE "unary 
2d50: 70 6f 73 74 66 69 78 20 6f 70 65 72 61 74 6f 72  postfix operator
2d60: 22 2e 0a 23 0a 23 20 54 68 69 73 20 63 6f 6c 6c  "..#.# This coll
2d70: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72  ation sequence r
2d80: 65 76 65 72 73 65 73 20 62 6f 74 68 20 61 72 67  everses both arg
2d90: 75 6d 65 6e 74 73 20 62 65 66 6f 72 65 20 75 73  uments before us
2da0: 69 6e 67 20 0a 23 20 5b 73 74 72 69 6e 67 20 63  ing .# [string c
2db0: 6f 6d 70 61 72 65 5d 20 74 6f 20 63 6f 6d 70 61  ompare] to compa
2dc0: 72 65 20 74 68 65 6d 2e 20 46 6f 72 20 65 78 61  re them. For exa
2dd0: 6d 70 6c 65 2c 20 77 68 65 6e 20 63 6f 6d 70 61  mple, when compa
2de0: 72 69 6e 67 20 74 68 65 0a 23 20 73 74 72 69 6e  ring the.# strin
2df0: 67 73 20 27 6f 6e 65 27 20 61 6e 64 20 27 66 6f  gs 'one' and 'fo
2e00: 75 72 27 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ur', return the 
2e10: 72 65 73 75 6c 74 20 6f 66 3a 0a 23 20 20 20 0a  result of:.#   .
2e20: 23 20 20 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  #   string compa
2e30: 72 65 20 65 6e 6f 20 72 75 6f 66 0a 23 0a 70 72  re eno ruof.#.pr
2e40: 6f 63 20 72 65 76 65 72 73 65 5f 73 74 72 20 7b  oc reverse_str {
2e50: 7a 53 74 72 7d 20 7b 0a 20 20 73 65 74 20 6f 75  zStr} {.  set ou
2e60: 74 20 22 22 0a 20 20 66 6f 72 65 61 63 68 20 63  t "".  foreach c
2e70: 20 5b 73 70 6c 69 74 20 24 7a 53 74 72 20 7b 7d   [split $zStr {}
2e80: 5d 20 7b 20 73 65 74 20 6f 75 74 20 22 24 7b 63  ] { set out "${c
2e90: 7d 24 7b 6f 75 74 7d 22 20 7d 0a 20 20 73 65 74  }${out}" }.  set
2ea0: 20 6f 75 74 0a 7d 0a 70 72 6f 63 20 72 65 76 65   out.}.proc reve
2eb0: 72 73 65 5f 63 6f 6c 6c 61 74 65 20 7b 7a 4c 65  rse_collate {zLe
2ec0: 66 74 20 7a 52 69 67 68 74 7d 20 7b 0a 20 20 73  ft zRight} {.  s
2ed0: 74 72 69 6e 67 20 63 6f 6d 70 61 72 65 20 5b 72  tring compare [r
2ee0: 65 76 65 72 73 65 5f 73 74 72 20 24 7a 4c 65 66  everse_str $zLef
2ef0: 74 5d 20 5b 72 65 76 65 72 73 65 5f 73 74 72 20  t] [reverse_str 
2f00: 24 7a 52 69 67 68 74 5d 0a 7d 0a 64 62 20 63 6f  $zRight].}.db co
2f10: 6c 6c 61 74 65 20 72 65 76 65 72 73 65 20 72 65  llate reverse re
2f20: 76 65 72 73 65 5f 63 6f 6c 6c 61 74 65 0a 0a 23  verse_collate..#
2f30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2f40: 35 39 35 37 37 2d 33 33 34 37 31 20 54 68 65 20  59577-33471 The 
2f50: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
2f60: 20 69 73 20 61 20 75 6e 61 72 79 20 70 6f 73 74   is a unary post
2f70: 66 69 78 0a 23 20 6f 70 65 72 61 74 6f 72 20 74  fix.# operator t
2f80: 68 61 74 20 61 73 73 69 67 6e 73 20 61 20 63 6f  hat assigns a co
2f90: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2fa0: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
2fb0: 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  n..#.# EVIDENCE-
2fc0: 4f 46 3a 20 52 2d 32 33 34 34 31 2d 32 32 35 34  OF: R-23441-2254
2fd0: 31 20 54 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70  1 The COLLATE op
2fe0: 65 72 61 74 6f 72 20 68 61 73 20 61 20 68 69 67  erator has a hig
2ff0: 68 65 72 0a 23 20 70 72 65 63 65 64 65 6e 63 65  her.# precedence
3000: 20 28 62 69 6e 64 73 20 6d 6f 72 65 20 74 69 67   (binds more tig
3010: 68 74 6c 79 29 20 74 68 61 6e 20 61 6e 79 20 70  htly) than any p
3020: 72 65 66 69 78 20 75 6e 61 72 79 20 6f 70 65 72  refix unary oper
3030: 61 74 6f 72 20 6f 72 20 61 6e 79 0a 23 20 62 69  ator or any.# bi
3040: 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 2e 0a 23  nary operator..#
3050: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3060: 20 65 5f 65 78 70 72 2d 39 2e 31 20 7b 20 53 45   e_expr-9.1 { SE
3070: 4c 45 43 54 20 20 27 61 62 63 64 27 20 3c 20 27  LECT  'abcd' < '
3080: 62 62 62 62 27 20 20 20 20 43 4f 4c 4c 41 54 45  bbbb'    COLLATE
3090: 20 72 65 76 65 72 73 65 20 7d 20 30 0a 64 6f 5f   reverse } 0.do_
30a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
30b0: 78 70 72 2d 39 2e 32 20 7b 20 53 45 4c 45 43 54  xpr-9.2 { SELECT
30c0: 20 28 27 61 62 63 64 27 20 3c 20 27 62 62 62 62   ('abcd' < 'bbbb
30d0: 27 29 20 20 20 43 4f 4c 4c 41 54 45 20 72 65 76  ')   COLLATE rev
30e0: 65 72 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  erse } 1.do_exec
30f0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3100: 39 2e 33 20 7b 20 53 45 4c 45 43 54 20 20 27 61  9.3 { SELECT  'a
3110: 62 63 64 27 20 3c 3d 20 27 62 62 62 62 27 20 20  bcd' <= 'bbbb'  
3120: 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65   COLLATE reverse
3130: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
3140: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 34 20  test e_expr-9.4 
3150: 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63 64 27  { SELECT ('abcd'
3160: 20 3c 3d 20 27 62 62 62 62 27 29 20 20 43 4f 4c   <= 'bbbb')  COL
3170: 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d 20 31  LATE reverse } 1
3180: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
3190: 74 20 65 5f 65 78 70 72 2d 39 2e 35 20 7b 20 53  t e_expr-9.5 { S
31a0: 45 4c 45 43 54 20 20 27 61 62 63 64 27 20 3e 20  ELECT  'abcd' > 
31b0: 27 62 62 62 62 27 20 20 20 20 43 4f 4c 4c 41 54  'bbbb'    COLLAT
31c0: 45 20 72 65 76 65 72 73 65 20 7d 20 31 0a 64 6f  E reverse } 1.do
31d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
31e0: 65 78 70 72 2d 39 2e 36 20 7b 20 53 45 4c 45 43  expr-9.6 { SELEC
31f0: 54 20 28 27 61 62 63 64 27 20 3e 20 27 62 62 62  T ('abcd' > 'bbb
3200: 62 27 29 20 20 20 43 4f 4c 4c 41 54 45 20 72 65  b')   COLLATE re
3210: 76 65 72 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65  verse } 0.do_exe
3220: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3230: 2d 39 2e 37 20 7b 20 53 45 4c 45 43 54 20 20 27  -9.7 { SELECT  '
3240: 61 62 63 64 27 20 3e 3d 20 27 62 62 62 62 27 20  abcd' >= 'bbbb' 
3250: 20 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73    COLLATE revers
3260: 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  e } 1.do_execsql
3270: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 38  _test e_expr-9.8
3280: 20 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63 64   { SELECT ('abcd
3290: 27 20 3e 3d 20 27 62 62 62 62 27 29 20 20 43 4f  ' >= 'bbbb')  CO
32a0: 4c 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d 20  LLATE reverse } 
32b0: 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0..do_execsql_te
32c0: 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 30 20 7b  st e_expr-9.10 {
32d0: 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27 20   SELECT  'abcd' 
32e0: 3d 20 20 27 41 42 43 44 27 20 20 43 4f 4c 4c 41  =  'ABCD'  COLLA
32f0: 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64 6f  TE nocase } 1.do
3300: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3310: 65 78 70 72 2d 39 2e 31 31 20 7b 20 53 45 4c 45  expr-9.11 { SELE
3320: 43 54 20 28 27 61 62 63 64 27 20 3d 20 20 27 41  CT ('abcd' =  'A
3330: 42 43 44 27 29 20 43 4f 4c 4c 41 54 45 20 6e 6f  BCD') COLLATE no
3340: 63 61 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63  case } 0.do_exec
3350: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3360: 39 2e 31 32 20 7b 20 53 45 4c 45 43 54 20 20 27  9.12 { SELECT  '
3370: 61 62 63 64 27 20 3d 3d 20 27 41 42 43 44 27 20  abcd' == 'ABCD' 
3380: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
3390: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
33a0: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 33 20  est e_expr-9.13 
33b0: 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63 64 27  { SELECT ('abcd'
33c0: 20 3d 3d 20 27 41 42 43 44 27 29 20 43 4f 4c 4c   == 'ABCD') COLL
33d0: 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64  ATE nocase } 0.d
33e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
33f0: 5f 65 78 70 72 2d 39 2e 31 34 20 7b 20 53 45 4c  _expr-9.14 { SEL
3400: 45 43 54 20 20 27 61 62 63 64 27 20 49 53 20 27  ECT  'abcd' IS '
3410: 41 42 43 44 27 20 20 43 4f 4c 4c 41 54 45 20 6e  ABCD'  COLLATE n
3420: 6f 63 61 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65  ocase } 1.do_exe
3430: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3440: 2d 39 2e 31 35 20 7b 20 53 45 4c 45 43 54 20 28  -9.15 { SELECT (
3450: 27 61 62 63 64 27 20 49 53 20 27 41 42 43 44 27  'abcd' IS 'ABCD'
3460: 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ) COLLATE nocase
3470: 20 7d 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   } 0..do_execsql
3480: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31  _test e_expr-9.1
3490: 36 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63  6 { SELECT  'abc
34a0: 64 27 20 21 3d 20 27 41 42 43 44 27 20 20 20 20  d' != 'ABCD'    
34b0: 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65    COLLATE nocase
34c0: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
34d0: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 37  test e_expr-9.17
34e0: 20 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63 64   { SELECT ('abcd
34f0: 27 20 21 3d 20 27 41 42 43 44 27 29 20 20 20 20  ' != 'ABCD')    
3500: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
3510: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
3520: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 38 20  est e_expr-9.18 
3530: 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27  { SELECT  'abcd'
3540: 20 3c 3e 20 27 41 42 43 44 27 20 20 20 20 20 20   <> 'ABCD'      
3550: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d  COLLATE nocase }
3560: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
3570: 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 39 20 7b  st e_expr-9.19 {
3580: 20 53 45 4c 45 43 54 20 28 27 61 62 63 64 27 20   SELECT ('abcd' 
3590: 3c 3e 20 27 41 42 43 44 27 29 20 20 20 20 20 43  <> 'ABCD')     C
35a0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20  OLLATE nocase } 
35b0: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
35c0: 74 20 65 5f 65 78 70 72 2d 39 2e 32 30 20 7b 20  t e_expr-9.20 { 
35d0: 53 45 4c 45 43 54 20 20 27 61 62 63 64 27 20 49  SELECT  'abcd' I
35e0: 53 20 4e 4f 54 20 27 41 42 43 44 27 20 20 43 4f  S NOT 'ABCD'  CO
35f0: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 30  LLATE nocase } 0
3600: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3610: 20 65 5f 65 78 70 72 2d 39 2e 32 31 20 7b 20 53   e_expr-9.21 { S
3620: 45 4c 45 43 54 20 28 27 61 62 63 64 27 20 49 53  ELECT ('abcd' IS
3630: 20 4e 4f 54 20 27 41 42 43 44 27 29 20 43 4f 4c   NOT 'ABCD') COL
3640: 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a  LATE nocase } 1.
3650: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3660: 20 65 5f 65 78 70 72 2d 39 2e 32 32 20 7b 20 0a   e_expr-9.22 { .
3670: 20 20 53 45 4c 45 43 54 20 27 62 62 62 27 20 42    SELECT 'bbb' B
3680: 45 54 57 45 45 4e 20 27 41 41 41 27 20 41 4e 44  ETWEEN 'AAA' AND
3690: 20 27 43 43 43 27 20 43 4f 4c 4c 41 54 45 20 6e   'CCC' COLLATE n
36a0: 6f 63 61 73 65 20 0a 7d 20 31 0a 64 6f 5f 65 78  ocase .} 1.do_ex
36b0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
36c0: 72 2d 39 2e 32 33 20 7b 20 0a 20 20 53 45 4c 45  r-9.23 { .  SELE
36d0: 43 54 20 28 27 62 62 62 27 20 42 45 54 57 45 45  CT ('bbb' BETWEE
36e0: 4e 20 27 41 41 41 27 20 41 4e 44 20 27 43 43 43  N 'AAA' AND 'CCC
36f0: 27 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  ') COLLATE nocas
3700: 65 20 0a 7d 20 30 0a 0a 23 20 45 56 49 44 45 4e  e .} 0..# EVIDEN
3710: 43 45 2d 4f 46 3a 20 52 2d 35 38 37 33 31 2d 32  CE-OF: R-58731-2
3720: 35 34 33 39 20 54 68 65 20 63 6f 6c 6c 61 74 69  5439 The collati
3730: 6e 67 20 73 65 71 75 65 6e 63 65 20 73 65 74 20  ng sequence set 
3740: 62 79 20 74 68 65 20 43 4f 4c 4c 41 54 45 0a 23  by the COLLATE.#
3750: 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 72 69   operator overri
3760: 64 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  des the collatin
3770: 67 20 73 65 71 75 65 6e 63 65 20 64 65 74 65 72  g sequence deter
3780: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 43 4f 4c  mined by the COL
3790: 4c 41 54 45 0a 23 20 63 6c 61 75 73 65 20 69 6e  LATE.# clause in
37a0: 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20   a table column 
37b0: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 23 0a 64 6f  definition..#.do
37c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
37d0: 65 78 70 72 2d 39 2e 32 34 20 7b 20 0a 20 20 43  expr-9.24 { .  C
37e0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 34 28  REATE TABLE t24(
37f0: 61 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45  a COLLATE NOCASE
3800: 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , b);.  INSERT I
3810: 4e 54 4f 20 74 32 34 20 56 41 4c 55 45 53 28 27  NTO t24 VALUES('
3820: 61 61 61 27 2c 20 31 29 3b 0a 20 20 49 4e 53 45  aaa', 1);.  INSE
3830: 52 54 20 49 4e 54 4f 20 74 32 34 20 56 41 4c 55  RT INTO t24 VALU
3840: 45 53 28 27 62 62 62 27 2c 20 32 29 3b 0a 20 20  ES('bbb', 2);.  
3850: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 34 20  INSERT INTO t24 
3860: 56 41 4c 55 45 53 28 27 63 63 63 27 2c 20 33 29  VALUES('ccc', 3)
3870: 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71  ;.} {}.do_execsq
3880: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e  l_test e_expr-9.
3890: 32 35 20 7b 20 53 45 4c 45 43 54 20 27 42 42 42  25 { SELECT 'BBB
38a0: 27 20 3d 20 61 20 46 52 4f 4d 20 74 32 34 20 7d  ' = a FROM t24 }
38b0: 20 7b 30 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63   {0 1 0}.do_exec
38c0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
38d0: 39 2e 32 35 20 7b 20 53 45 4c 45 43 54 20 61 20  9.25 { SELECT a 
38e0: 3d 20 27 42 42 42 27 20 46 52 4f 4d 20 74 32 34  = 'BBB' FROM t24
38f0: 20 7d 20 7b 30 20 31 20 30 7d 0a 64 6f 5f 65 78   } {0 1 0}.do_ex
3900: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3910: 72 2d 39 2e 32 35 20 7b 20 53 45 4c 45 43 54 20  r-9.25 { SELECT 
3920: 27 42 42 42 27 20 3d 20 61 20 43 4f 4c 4c 41 54  'BBB' = a COLLAT
3930: 45 20 62 69 6e 61 72 79 20 46 52 4f 4d 20 74 32  E binary FROM t2
3940: 34 20 7d 20 7b 30 20 30 20 30 7d 0a 64 6f 5f 65  4 } {0 0 0}.do_e
3950: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
3960: 70 72 2d 39 2e 32 35 20 7b 20 53 45 4c 45 43 54  pr-9.25 { SELECT
3970: 20 61 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72   a COLLATE binar
3980: 79 20 3d 20 27 42 42 42 27 20 46 52 4f 4d 20 74  y = 'BBB' FROM t
3990: 32 34 20 7d 20 7b 30 20 30 20 30 7d 0a 0a 23 2d  24 } {0 0 0}..#-
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
39f0: 73 74 61 74 65 6d 65 6e 74 73 20 72 65 6c 61 74  statements relat
3a00: 65 64 20 74 6f 20 6c 69 74 65 72 61 6c 20 76 61  ed to literal va
3a10: 6c 75 65 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e  lues..#.# EVIDEN
3a20: 43 45 2d 4f 46 3a 20 52 2d 33 31 35 33 36 2d 33  CE-OF: R-31536-3
3a30: 32 30 30 38 20 4c 69 74 65 72 61 6c 20 76 61 6c  2008 Literal val
3a40: 75 65 73 20 6d 61 79 20 62 65 20 69 6e 74 65 67  ues may be integ
3a50: 65 72 73 2c 20 66 6c 6f 61 74 69 6e 67 0a 23 20  ers, floating.# 
3a60: 70 6f 69 6e 74 20 6e 75 6d 62 65 72 73 2c 20 73  point numbers, s
3a70: 74 72 69 6e 67 73 2c 20 42 4c 4f 42 73 2c 20 6f  trings, BLOBs, o
3a80: 72 20 4e 55 4c 4c 73 2e 0a 23 0a 64 6f 5f 65 78  r NULLs..#.do_ex
3a90: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3aa0: 72 2d 31 30 2e 31 2e 31 20 7b 20 53 45 4c 45 43  r-10.1.1 { SELEC
3ab0: 54 20 74 79 70 65 6f 66 28 35 29 20 20 20 20 20  T typeof(5)     
3ac0: 20 20 7d 20 7b 69 6e 74 65 67 65 72 7d 0a 64 6f    } {integer}.do
3ad0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3ae0: 65 78 70 72 2d 31 30 2e 31 2e 32 20 7b 20 53 45  expr-10.1.2 { SE
3af0: 4c 45 43 54 20 74 79 70 65 6f 66 28 35 2e 31 29  LECT typeof(5.1)
3b00: 20 20 20 20 20 7d 20 7b 72 65 61 6c 7d 0a 64 6f       } {real}.do
3b10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3b20: 65 78 70 72 2d 31 30 2e 31 2e 33 20 7b 20 53 45  expr-10.1.3 { SE
3b30: 4c 45 43 54 20 74 79 70 65 6f 66 28 27 35 2e 31  LECT typeof('5.1
3b40: 27 29 20 20 20 7d 20 7b 74 65 78 74 7d 0a 64 6f  ')   } {text}.do
3b50: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3b60: 65 78 70 72 2d 31 30 2e 31 2e 34 20 7b 20 53 45  expr-10.1.4 { SE
3b70: 4c 45 43 54 20 74 79 70 65 6f 66 28 58 27 41 42  LECT typeof(X'AB
3b80: 43 44 27 29 20 7d 20 7b 62 6c 6f 62 7d 0a 64 6f  CD') } {blob}.do
3b90: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3ba0: 65 78 70 72 2d 31 30 2e 31 2e 35 20 7b 20 53 45  expr-10.1.5 { SE
3bb0: 4c 45 43 54 20 74 79 70 65 6f 66 28 4e 55 4c 4c  LECT typeof(NULL
3bc0: 29 20 20 20 20 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23  )    } {null}..#
3bd0: 20 22 53 63 69 65 6e 74 69 66 69 63 20 6e 6f 74   "Scientific not
3be0: 61 74 69 6f 6e 20 69 73 20 73 75 70 70 6f 72 74  ation is support
3bf0: 65 64 20 66 6f 72 20 70 6f 69 6e 74 20 6c 69 74  ed for point lit
3c00: 65 72 61 6c 20 76 61 6c 75 65 73 2e 22 0a 23 0a  eral values.".#.
3c10: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3c20: 65 5f 65 78 70 72 2d 31 30 2e 32 2e 31 20 7b 20  e_expr-10.2.1 { 
3c30: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 33 2e  SELECT typeof(3.
3c40: 34 65 2d 30 32 29 20 20 20 20 7d 20 7b 72 65 61  4e-02)    } {rea
3c50: 6c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  l}.do_execsql_te
3c60: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 32 2e 32  st e_expr-10.2.2
3c70: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3c80: 28 33 65 2b 35 29 20 20 20 20 20 20 20 7d 20 7b  (3e+5)       } {
3c90: 72 65 61 6c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  real}.do_execsql
3ca0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e  _test e_expr-10.
3cb0: 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 33 2e 34  2.3 { SELECT 3.4
3cc0: 65 2d 30 32 20 20 20 20 20 20 20 20 20 20 20 20  e-02            
3cd0: 7d 20 7b 30 2e 30 33 34 7d 0a 64 6f 5f 65 78 65  } {0.034}.do_exe
3ce0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3cf0: 2d 31 30 2e 32 2e 34 20 7b 20 53 45 4c 45 43 54  -10.2.4 { SELECT
3d00: 20 33 65 2b 34 20 20 20 20 20 20 20 20 20 20 20   3e+4           
3d10: 20 20 20 20 7d 20 7b 33 30 30 30 30 2e 30 7d 0a      } {30000.0}.
3d20: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
3d30: 52 2d 33 35 32 32 39 2d 31 37 38 33 30 20 41 20  R-35229-17830 A 
3d40: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  string constant 
3d50: 69 73 20 66 6f 72 6d 65 64 20 62 79 20 65 6e 63  is formed by enc
3d60: 6c 6f 73 69 6e 67 0a 23 20 74 68 65 20 73 74 72  losing.# the str
3d70: 69 6e 67 20 69 6e 20 73 69 6e 67 6c 65 20 71 75  ing in single qu
3d80: 6f 74 65 73 20 28 27 29 2e 0a 23 0a 23 20 45 56  otes (')..#.# EV
3d90: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 31  IDENCE-OF: R-071
3da0: 30 30 2d 30 36 36 30 36 20 41 20 73 69 6e 67 6c  00-06606 A singl
3db0: 65 20 71 75 6f 74 65 20 77 69 74 68 69 6e 20 74  e quote within t
3dc0: 68 65 20 73 74 72 69 6e 67 20 63 61 6e 20 62 65  he string can be
3dd0: 0a 23 20 65 6e 63 6f 64 65 64 20 62 79 20 70 75  .# encoded by pu
3de0: 74 74 69 6e 67 20 74 77 6f 20 73 69 6e 67 6c 65  tting two single
3df0: 20 71 75 6f 74 65 73 20 69 6e 20 61 20 72 6f 77   quotes in a row
3e00: 20 2d 20 61 73 20 69 6e 20 50 61 73 63 61 6c 2e   - as in Pascal.
3e10: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
3e20: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 33 2e 31  st e_expr-10.3.1
3e30: 20 7b 20 53 45 4c 45 43 54 20 27 69 73 20 6e 6f   { SELECT 'is no
3e40: 74 27 20 7d 20 20 20 20 20 20 20 20 20 7b 7b 69  t' }         {{i
3e50: 73 20 6e 6f 74 7d 7d 0a 64 6f 5f 65 78 65 63 73  s not}}.do_execs
3e60: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
3e70: 30 2e 33 2e 32 20 7b 20 53 45 4c 45 43 54 20 74  0.3.2 { SELECT t
3e80: 79 70 65 6f 66 28 27 69 73 20 6e 6f 74 27 29 20  ypeof('is not') 
3e90: 7d 20 7b 74 65 78 74 7d 0a 64 6f 5f 65 78 65 63  } {text}.do_exec
3ea0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3eb0: 31 30 2e 33 2e 33 20 7b 20 53 45 4c 45 43 54 20  10.3.3 { SELECT 
3ec0: 27 69 73 6e 27 27 74 27 20 7d 20 20 20 20 20 20  'isn''t' }      
3ed0: 20 20 20 7b 69 73 6e 27 74 7d 0a 64 6f 5f 65 78     {isn't}.do_ex
3ee0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3ef0: 72 2d 31 30 2e 33 2e 34 20 7b 20 53 45 4c 45 43  r-10.3.4 { SELEC
3f00: 54 20 74 79 70 65 6f 66 28 27 69 73 6e 27 27 74  T typeof('isn''t
3f10: 27 29 20 7d 20 7b 74 65 78 74 7d 0a 0a 23 20 45  ') } {text}..# E
3f20: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39  VIDENCE-OF: R-09
3f30: 35 39 33 2d 30 33 33 32 31 20 42 4c 4f 42 20 6c  593-03321 BLOB l
3f40: 69 74 65 72 61 6c 73 20 61 72 65 20 73 74 72 69  iterals are stri
3f50: 6e 67 20 6c 69 74 65 72 61 6c 73 0a 23 20 63 6f  ng literals.# co
3f60: 6e 74 61 69 6e 69 6e 67 20 68 65 78 61 64 65 63  ntaining hexadec
3f70: 69 6d 61 6c 20 64 61 74 61 20 61 6e 64 20 70 72  imal data and pr
3f80: 65 63 65 64 65 64 20 62 79 20 61 20 73 69 6e 67  eceded by a sing
3f90: 6c 65 20 22 78 22 20 6f 72 20 22 58 22 0a 23 20  le "x" or "X".# 
3fa0: 63 68 61 72 61 63 74 65 72 2e 0a 23 0a 23 20 45  character..#.# E
3fb0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39  VIDENCE-OF: R-39
3fc0: 33 34 34 2d 35 39 37 38 37 20 46 6f 72 20 65 78  344-59787 For ex
3fd0: 61 6d 70 6c 65 3a 20 58 27 35 33 35 31 34 43 36  ample: X'53514C6
3fe0: 39 37 34 36 35 27 0a 23 0a 64 6f 5f 65 78 65 63  97465'.#.do_exec
3ff0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
4000: 31 30 2e 34 2e 31 20 7b 20 53 45 4c 45 43 54 20  10.4.1 { SELECT 
4010: 74 79 70 65 6f 66 28 58 27 30 31 32 33 34 35 36  typeof(X'0123456
4020: 37 38 39 41 42 43 44 45 46 27 29 20 7d 20 62 6c  789ABCDEF') } bl
4030: 6f 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  ob.do_execsql_te
4040: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e 32  st e_expr-10.4.2
4050: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
4060: 28 78 27 30 31 32 33 34 35 36 37 38 39 41 42 43  (x'0123456789ABC
4070: 44 45 46 27 29 20 7d 20 62 6c 6f 62 0a 64 6f 5f  DEF') } blob.do_
4080: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
4090: 78 70 72 2d 31 30 2e 34 2e 33 20 7b 20 53 45 4c  xpr-10.4.3 { SEL
40a0: 45 43 54 20 74 79 70 65 6f 66 28 58 27 30 31 32  ECT typeof(X'012
40b0: 33 34 35 36 37 38 39 61 62 63 64 65 66 27 29 20  3456789abcdef') 
40c0: 7d 20 62 6c 6f 62 0a 64 6f 5f 65 78 65 63 73 71  } blob.do_execsq
40d0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30  l_test e_expr-10
40e0: 2e 34 2e 34 20 7b 20 53 45 4c 45 43 54 20 74 79  .4.4 { SELECT ty
40f0: 70 65 6f 66 28 78 27 30 31 32 33 34 35 36 37 38  peof(x'012345678
4100: 39 61 62 63 64 65 66 27 29 20 7d 20 62 6c 6f 62  9abcdef') } blob
4110: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
4120: 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e 35 20 7b   e_expr-10.4.5 {
4130: 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 58   SELECT typeof(X
4140: 27 35 33 35 31 34 43 36 39 37 34 36 35 27 29 20  '53514C697465') 
4150: 20 20 20 20 7d 20 62 6c 6f 62 0a 0a 23 20 45 56      } blob..# EV
4160: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 39  IDENCE-OF: R-239
4170: 31 34 2d 35 31 34 37 36 20 41 20 6c 69 74 65 72  14-51476 A liter
4180: 61 6c 20 76 61 6c 75 65 20 63 61 6e 20 61 6c 73  al value can als
4190: 6f 20 62 65 20 74 68 65 20 74 6f 6b 65 6e 0a 23  o be the token.#
41a0: 20 22 4e 55 4c 4c 22 2e 0a 23 0a 64 6f 5f 65 78   "NULL"..#.do_ex
41b0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
41c0: 72 2d 31 30 2e 35 2e 31 20 7b 20 53 45 4c 45 43  r-10.5.1 { SELEC
41d0: 54 20 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 7d  T NULL         }
41e0: 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {{}}.do_execsql
41f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e  _test e_expr-10.
4200: 35 2e 32 20 7b 20 53 45 4c 45 43 54 20 74 79 70  5.2 { SELECT typ
4210: 65 6f 66 28 4e 55 4c 4c 29 20 7d 20 7b 6e 75 6c  eof(NULL) } {nul
4220: 6c 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  l}..#-----------
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
4270: 20 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74 73   Test statements
4280: 20 72 65 6c 61 74 65 64 20 74 6f 20 62 6f 75 6e   related to boun
4290: 64 20 70 61 72 61 6d 65 74 65 72 73 0a 23 0a 0a  d parameters.#..
42a0: 70 72 6f 63 20 70 61 72 61 6d 65 74 65 72 5f 74  proc parameter_t
42b0: 65 73 74 20 7b 74 6e 20 73 71 6c 20 70 61 72 61  est {tn sql para
42c0: 6d 73 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 73  ms result} {.  s
42d0: 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65 33  et stmt [sqlite3
42e0: 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20 24  _prepare_v2 db $
42f0: 73 71 6c 20 2d 31 5d 0a 0a 20 20 66 6f 72 65 61  sql -1]..  forea
4300: 63 68 20 7b 6e 75 6d 62 65 72 20 6e 61 6d 65 7d  ch {number name}
4310: 20 24 70 61 72 61 6d 73 20 7b 0a 20 20 20 20 73   $params {.    s
4320: 65 74 20 6e 6d 20 5b 73 71 6c 69 74 65 33 5f 62  et nm [sqlite3_b
4330: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
4340: 6d 65 20 24 73 74 6d 74 20 24 6e 75 6d 62 65 72  me $stmt $number
4350: 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74  ].    do_test $t
4360: 6e 2e 6e 61 6d 65 2e 24 6e 75 6d 62 65 72 20 5b  n.name.$number [
4370: 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 6e 6d 5d  list set {} $nm]
4380: 20 24 6e 61 6d 65 0a 20 20 20 20 73 71 6c 69 74   $name.    sqlit
4390: 65 33 5f 62 69 6e 64 5f 69 6e 74 20 24 73 74 6d  e3_bind_int $stm
43a0: 74 20 24 6e 75 6d 62 65 72 20 5b 65 78 70 72 20  t $number [expr 
43b0: 2d 31 20 2a 20 24 6e 75 6d 62 65 72 5d 0a 20 20  -1 * $number].  
43c0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  }..  sqlite3_ste
43d0: 70 20 24 73 74 6d 74 0a 0a 20 20 73 65 74 20 72  p $stmt..  set r
43e0: 65 73 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 20  es [list].  for 
43f0: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
4400: 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  [sqlite3_column_
4410: 63 6f 75 6e 74 20 24 73 74 6d 74 5d 7d 20 7b 69  count $stmt]} {i
4420: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61 70  ncr i} {.    lap
4430: 70 65 6e 64 20 72 65 73 20 5b 73 71 6c 69 74 65  pend res [sqlite
4440: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 73  3_column_text $s
4450: 74 6d 74 20 24 69 5d 0a 20 20 7d 0a 0a 20 20 73  tmt $i].  }..  s
4460: 65 74 20 72 63 20 5b 73 71 6c 69 74 65 33 5f 66  et rc [sqlite3_f
4470: 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 5d 0a 20  inalize $stmt]. 
4480: 20 64 6f 5f 74 65 73 74 20 24 74 6e 2e 72 63 20   do_test $tn.rc 
4490: 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72 63  [list set {} $rc
44a0: 5d 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 64 6f  ] SQLITE_OK.  do
44b0: 5f 74 65 73 74 20 24 74 6e 2e 72 65 73 20 5b 6c  _test $tn.res [l
44c0: 69 73 74 20 73 65 74 20 7b 7d 20 24 72 65 73 5d  ist set {} $res]
44d0: 20 24 72 65 73 75 6c 74 0a 7d 0a 0a 23 20 45 56   $result.}..# EV
44e0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 35  IDENCE-OF: R-335
44f0: 30 39 2d 33 39 34 35 38 20 41 20 71 75 65 73 74  09-39458 A quest
4500: 69 6f 6e 20 6d 61 72 6b 20 66 6f 6c 6c 6f 77 65  ion mark followe
4510: 64 20 62 79 20 61 20 6e 75 6d 62 65 72 20 4e 4e  d by a number NN
4520: 4e 0a 23 20 68 6f 6c 64 73 20 61 20 73 70 6f 74  N.# holds a spot
4530: 20 66 6f 72 20 74 68 65 20 4e 4e 4e 2d 74 68 20   for the NNN-th 
4540: 70 61 72 61 6d 65 74 65 72 2e 20 4e 4e 4e 20 6d  parameter. NNN m
4550: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31  ust be between 1
4560: 20 61 6e 64 0a 23 20 53 51 4c 49 54 45 5f 4d 41   and.# SQLITE_MA
4570: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
4580: 52 2e 0a 23 0a 73 65 74 20 6d 76 6e 20 24 53 51  R..#.set mvn $SQ
4590: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
45a0: 45 5f 4e 55 4d 42 45 52 0a 70 61 72 61 6d 65 74  E_NUMBER.paramet
45b0: 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  er_test e_expr-1
45c0: 31 2e 31 20 22 0a 20 20 53 45 4c 45 43 54 20 3f  1.1 ".  SELECT ?
45d0: 31 2c 20 3f 31 32 33 2c 20 3f 24 53 51 4c 49 54  1, ?123, ?$SQLIT
45e0: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
45f0: 55 4d 42 45 52 2c 20 3f 31 32 33 2c 20 3f 34 0a  UMBER, ?123, ?4.
4600: 22 20 20 20 22 31 20 3f 31 20 20 31 32 33 20 3f  "   "1 ?1  123 ?
4610: 31 32 33 20 24 6d 76 6e 20 3f 24 6d 76 6e 20 34  123 $mvn ?$mvn 4
4620: 20 3f 34 22 20 20 20 22 2d 31 20 2d 31 32 33 20   ?4"   "-1 -123 
4630: 2d 24 6d 76 6e 20 2d 31 32 33 20 2d 34 22 0a 0a  -$mvn -123 -4"..
4640: 73 65 74 20 65 72 72 6d 73 67 20 22 76 61 72 69  set errmsg "vari
4650: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
4660: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
4670: 6e 64 20 3f 24 53 51 4c 49 54 45 5f 4d 41 58 5f  nd ?$SQLITE_MAX_
4680: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22  VARIABLE_NUMBER"
4690: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 70 61 72  .foreach {tn par
46a0: 61 6d 5f 6e 75 6d 62 65 72 7d 20 5b 6c 69 73 74  am_number} [list
46b0: 20 5c 0a 20 20 32 20 20 30 20 20 20 20 20 20 20   \.  2  0       
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
46e0: 20 33 20 20 5b 65 78 70 72 20 24 53 51 4c 49 54   3  [expr $SQLIT
46f0: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
4700: 55 4d 42 45 52 2b 31 5d 20 5c 0a 20 20 34 20 20  UMBER+1] \.  4  
4710: 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41  [expr $SQLITE_MA
4720: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
4730: 52 2b 32 5d 20 5c 0a 20 20 35 20 20 31 32 33 34  R+2] \.  5  1234
4740: 35 36 37 38 39 30 33 34 35 36 37 38 39 30 33 34  5678903456789034
4750: 35 36 37 38 39 30 32 33 34 35 36 37 38 39 30 20  567890234567890 
4760: 20 5c 0a 20 20 36 20 20 32 31 34 37 34 38 33 36   \.  6  21474836
4770: 34 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20  48              
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
4790: 20 37 20 20 32 31 34 37 34 38 33 36 34 39 20 20   7  2147483649  
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47b0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 38 20 20           \.  8  
47c0: 34 32 39 34 39 36 37 32 39 36 20 20 20 20 20 20  4294967296      
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 20 20 5c 0a 20 20 39 20 20 34 32 39 34       \.  9  4294
47f0: 39 36 37 32 39 37 20 20 20 20 20 20 20 20 20 20  967297          
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4810: 20 5c 0a 20 20 31 30 20 39 32 32 33 33 37 32 30   \.  10 92233720
4820: 33 36 38 35 34 37 37 35 38 30 38 20 20 20 20 20  36854775808     
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
4840: 20 31 31 20 39 32 32 33 33 37 32 30 33 36 38 35   11 922337203685
4850: 34 37 37 35 38 30 39 20 20 20 20 20 20 20 20 20  4775809         
4860: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 31 32 20           \.  12 
4870: 31 38 34 34 36 37 34 34 30 37 33 37 30 39 35 35  1844674407370955
4880: 31 36 31 36 20 20 20 20 20 20 20 20 20 20 20 20  1616            
4890: 20 20 20 20 20 5c 0a 20 20 31 33 20 31 38 34 34       \.  13 1844
48a0: 36 37 34 34 30 37 33 37 30 39 35 35 31 36 31 37  6744073709551617
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48c0: 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 63 61 74 63   \.] {.  do_catc
48d0: 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  hsql_test e_expr
48e0: 2d 31 31 2e 31 2e 24 74 6e 20 22 53 45 4c 45 43  -11.1.$tn "SELEC
48f0: 54 20 3f 24 70 61 72 61 6d 5f 6e 75 6d 62 65 72  T ?$param_number
4900: 22 20 5b 6c 69 73 74 20 31 20 24 65 72 72 6d 73  " [list 1 $errms
4910: 67 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  g].}..# EVIDENCE
4920: 2d 4f 46 3a 20 52 2d 33 33 36 37 30 2d 33 36 30  -OF: R-33670-360
4930: 39 37 20 41 20 71 75 65 73 74 69 6f 6e 20 6d 61  97 A question ma
4940: 72 6b 20 74 68 61 74 20 69 73 20 6e 6f 74 20 66  rk that is not f
4950: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 0a 23 20 6e  ollowed by a.# n
4960: 75 6d 62 65 72 20 63 72 65 61 74 65 73 20 61 20  umber creates a 
4970: 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 61  parameter with a
4980: 20 6e 75 6d 62 65 72 20 6f 6e 65 20 67 72 65 61   number one grea
4990: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ter than the lar
49a0: 67 65 73 74 0a 23 20 70 61 72 61 6d 65 74 65 72  gest.# parameter
49b0: 20 6e 75 6d 62 65 72 20 61 6c 72 65 61 64 79 20   number already 
49c0: 61 73 73 69 67 6e 65 64 2e 0a 23 0a 23 20 45 56  assigned..#.# EV
49d0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32 39  IDENCE-OF: R-429
49e0: 33 38 2d 30 37 30 33 30 20 49 66 20 74 68 69 73  38-07030 If this
49f0: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 72 61 6d   means the param
4a00: 65 74 65 72 20 6e 75 6d 62 65 72 20 69 73 0a 23  eter number is.#
4a10: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51   greater than SQ
4a20: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
4a30: 45 5f 4e 55 4d 42 45 52 2c 20 69 74 20 69 73 20  E_NUMBER, it is 
4a40: 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 70 61 72 61  an error..#.para
4a50: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
4a60: 72 2d 31 31 2e 32 2e 31 20 22 53 45 4c 45 43 54  r-11.2.1 "SELECT
4a70: 20 3f 22 20 20 20 20 20 20 20 20 20 20 7b 31 20   ?"          {1 
4a80: 7b 7d 7d 20 20 20 20 20 20 20 2d 31 0a 70 61 72  {}}       -1.par
4a90: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
4aa0: 70 72 2d 31 31 2e 32 2e 32 20 22 53 45 4c 45 43  pr-11.2.2 "SELEC
4ab0: 54 20 3f 2c 20 3f 22 20 20 20 20 20 20 20 7b 31  T ?, ?"       {1
4ac0: 20 7b 7d 20 32 20 7b 7d 7d 20 20 7b 2d 31 20 2d   {} 2 {}}  {-1 -
4ad0: 32 7d 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  2}.parameter_tes
4ae0: 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 33 20  t e_expr-11.2.3 
4af0: 22 53 45 4c 45 43 54 20 3f 35 2c 20 3f 22 20 20  "SELECT ?5, ?"  
4b00: 20 20 20 20 7b 35 20 3f 35 20 36 20 7b 7d 7d 20      {5 ?5 6 {}} 
4b10: 20 7b 2d 35 20 2d 36 7d 0a 70 61 72 61 6d 65 74   {-5 -6}.paramet
4b20: 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  er_test e_expr-1
4b30: 31 2e 32 2e 34 20 22 53 45 4c 45 43 54 20 3f 2c  1.2.4 "SELECT ?,
4b40: 20 3f 35 22 20 20 20 20 20 20 7b 31 20 7b 7d 20   ?5"      {1 {} 
4b50: 35 20 3f 35 7d 20 20 7b 2d 31 20 2d 35 7d 0a 70  5 ?5}  {-1 -5}.p
4b60: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
4b70: 65 78 70 72 2d 31 31 2e 32 2e 35 20 22 53 45 4c  expr-11.2.5 "SEL
4b80: 45 43 54 20 3f 2c 20 3f 34 35 36 2c 20 3f 22 20  ECT ?, ?456, ?" 
4b90: 7b 0a 20 20 31 20 7b 7d 20 34 35 36 20 3f 34 35  {.  1 {} 456 ?45
4ba0: 36 20 34 35 37 20 7b 7d 0a 7d 20 20 7b 2d 31 20  6 457 {}.}  {-1 
4bb0: 2d 34 35 36 20 2d 34 35 37 7d 0a 70 61 72 61 6d  -456 -457}.param
4bc0: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
4bd0: 2d 31 31 2e 32 2e 35 20 22 53 45 4c 45 43 54 20  -11.2.5 "SELECT 
4be0: 3f 2c 20 3f 34 35 36 2c 20 3f 34 2c 20 3f 22 20  ?, ?456, ?4, ?" 
4bf0: 7b 0a 20 20 31 20 7b 7d 20 34 35 36 20 3f 34 35  {.  1 {} 456 ?45
4c00: 36 20 34 20 3f 34 20 34 35 37 20 7b 7d 0a 7d 20  6 4 ?4 457 {}.} 
4c10: 20 7b 2d 31 20 2d 34 35 36 20 2d 34 20 2d 34 35   {-1 -456 -4 -45
4c20: 37 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  7}.foreach {tn s
4c30: 71 6c 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20  ql} [list       
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 5c 0a 20 20 31 20 20 22 53 45 4c 45      \.  1  "SELE
4c60: 43 54 20 3f 24 6d 76 6e 2c 20 3f 22 20 20 20 20  CT ?$mvn, ?"    
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 20 5c 0a 20 20 32 20 20 22 53         \.  2  "S
4c90: 45 4c 45 43 54 20 3f 5b 65 78 70 72 20 24 6d 76  ELECT ?[expr $mv
4ca0: 6e 2d 35 5d 2c 20 3f 2c 20 3f 2c 20 3f 2c 20 3f  n-5], ?, ?, ?, ?
4cb0: 2c 20 3f 2c 20 3f 22 20 20 20 5c 0a 20 20 33 20  , ?, ?"   \.  3 
4cc0: 20 22 53 45 4c 45 43 54 20 3f 5b 65 78 70 72 20   "SELECT ?[expr 
4cd0: 24 6d 76 6e 5d 2c 20 3f 35 2c 20 3f 36 2c 20 3f  $mvn], ?5, ?6, ?
4ce0: 22 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 5d  "            \.]
4cf0: 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c   {.  do_catchsql
4d00: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
4d10: 33 2e 24 74 6e 20 24 73 71 6c 20 5b 6c 69 73 74  3.$tn $sql [list
4d20: 20 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 53 51 4c   1 {too many SQL
4d30: 20 76 61 72 69 61 62 6c 65 73 7d 5d 0a 7d 0a 0a   variables}].}..
4d40: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
4d50: 2d 31 31 36 32 30 2d 32 32 37 34 33 20 41 20 63  -11620-22743 A c
4d60: 6f 6c 6f 6e 20 66 6f 6c 6c 6f 77 65 64 20 62 79  olon followed by
4d70: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6e   an identifier n
4d80: 61 6d 65 0a 23 20 68 6f 6c 64 73 20 61 20 73 70  ame.# holds a sp
4d90: 6f 74 20 66 6f 72 20 61 20 6e 61 6d 65 64 20 70  ot for a named p
4da0: 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 74 68  arameter with th
4db0: 65 20 6e 61 6d 65 20 3a 41 41 41 41 2e 0a 23 0a  e name :AAAA..#.
4dc0: 23 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e  # Identifiers in
4dd0: 20 53 51 4c 69 74 65 20 63 6f 6e 73 69 73 74 20   SQLite consist 
4de0: 6f 66 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 2c  of alphanumeric,
4df0: 20 27 5f 27 20 61 6e 64 20 27 24 27 20 63 68 61   '_' and '$' cha
4e00: 72 61 63 74 65 72 73 2c 0a 23 20 61 6e 64 20 61  racters,.# and a
4e10: 6e 79 20 55 54 46 20 63 68 61 72 61 63 74 65 72  ny UTF character
4e20: 73 20 77 69 74 68 20 63 6f 64 65 70 6f 69 6e 74  s with codepoint
4e30: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 31 32  s larger than 12
4e40: 37 20 28 6e 6f 6e 2d 41 53 43 49 49 20 0a 23 20  7 (non-ASCII .# 
4e50: 63 68 61 72 61 63 74 65 72 73 29 2e 0a 23 0a 70  characters)..#.p
4e60: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
4e70: 65 78 70 72 2d 31 31 2e 32 2e 31 20 7b 53 45 4c  expr-11.2.1 {SEL
4e80: 45 43 54 20 3a 41 41 41 41 7d 20 20 20 20 20 20  ECT :AAAA}      
4e90: 20 20 20 7b 31 20 3a 41 41 41 41 7d 20 20 20 20     {1 :AAAA}    
4ea0: 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f     -1.parameter_
4eb0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32  test e_expr-11.2
4ec0: 2e 32 20 7b 53 45 4c 45 43 54 20 3a 31 32 33 7d  .2 {SELECT :123}
4ed0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 3a 31 32            {1 :12
4ee0: 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72  3}        -1.par
4ef0: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
4f00: 70 72 2d 31 31 2e 32 2e 33 20 7b 53 45 4c 45 43  pr-11.2.3 {SELEC
4f10: 54 20 3a 5f 5f 7d 20 20 20 20 20 20 20 20 20 20  T :__}          
4f20: 20 7b 31 20 3a 5f 5f 7d 20 20 20 20 20 20 20 20   {1 :__}        
4f30: 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65   -1.parameter_te
4f40: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 34  st e_expr-11.2.4
4f50: 20 7b 53 45 4c 45 43 54 20 3a 5f 24 5f 7d 20 20   {SELECT :_$_}  
4f60: 20 20 20 20 20 20 20 20 7b 31 20 3a 5f 24 5f 7d          {1 :_$_}
4f70: 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d          -1.param
4f80: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
4f90: 2d 31 31 2e 32 2e 35 20 22 0a 20 20 53 45 4c 45  -11.2.5 ".  SELE
4fa0: 43 54 20 3a 5c 75 30 65 34 30 5c 75 30 65 32 64  CT :\u0e40\u0e2d
4fb0: 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75 30 65  \u0e28\u0e02\u0e
4fc0: 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75  39\u0e40\u0e2d\u
4fd0: 30 65 32 35 0a 22 20 22 31 20 3a 5c 75 30 65 34  0e25." "1 :\u0e4
4fe0: 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75 30  0\u0e2d\u0e28\u0
4ff0: 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30 5c  e02\u0e39\u0e40\
5000: 75 30 65 32 64 5c 75 30 65 32 35 22 20 2d 31 0a  u0e2d\u0e25" -1.
5010: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
5020: 5f 65 78 70 72 2d 31 31 2e 32 2e 36 20 22 53 45  _expr-11.2.6 "SE
5030: 4c 45 43 54 20 3a 5c 75 30 30 38 30 22 20 22 31  LECT :\u0080" "1
5040: 20 3a 5c 75 30 30 38 30 22 20 2d 31 0a 0a 23 20   :\u0080" -1..# 
5050: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
5060: 39 37 38 33 2d 36 31 32 37 39 20 41 6e 20 22 61  9783-61279 An "a
5070: 74 22 20 73 69 67 6e 20 77 6f 72 6b 73 20 65 78  t" sign works ex
5080: 61 63 74 6c 79 20 6c 69 6b 65 20 61 20 63 6f 6c  actly like a col
5090: 6f 6e 2c 0a 23 20 65 78 63 65 70 74 20 74 68 61  on,.# except tha
50a0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
50b0: 65 20 70 61 72 61 6d 65 74 65 72 20 63 72 65 61  e parameter crea
50c0: 74 65 64 20 69 73 20 40 41 41 41 41 2e 0a 23 0a  ted is @AAAA..#.
50d0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
50e0: 5f 65 78 70 72 2d 31 31 2e 33 2e 31 20 7b 53 45  _expr-11.3.1 {SE
50f0: 4c 45 43 54 20 40 41 41 41 41 7d 20 20 20 20 20  LECT @AAAA}     
5100: 20 20 20 20 7b 31 20 40 41 41 41 41 7d 20 20 20      {1 @AAAA}   
5110: 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72      -1.parameter
5120: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5130: 33 2e 32 20 7b 53 45 4c 45 43 54 20 40 31 32 33  3.2 {SELECT @123
5140: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 40 31  }          {1 @1
5150: 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61  23}        -1.pa
5160: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
5170: 78 70 72 2d 31 31 2e 33 2e 33 20 7b 53 45 4c 45  xpr-11.3.3 {SELE
5180: 43 54 20 40 5f 5f 7d 20 20 20 20 20 20 20 20 20  CT @__}         
5190: 20 20 7b 31 20 40 5f 5f 7d 20 20 20 20 20 20 20    {1 @__}       
51a0: 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74    -1.parameter_t
51b0: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e  est e_expr-11.3.
51c0: 34 20 7b 53 45 4c 45 43 54 20 40 5f 24 5f 7d 20  4 {SELECT @_$_} 
51d0: 20 20 20 20 20 20 20 20 20 7b 31 20 40 5f 24 5f           {1 @_$_
51e0: 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61  }        -1.para
51f0: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
5200: 72 2d 31 31 2e 33 2e 35 20 22 0a 20 20 53 45 4c  r-11.3.5 ".  SEL
5210: 45 43 54 20 40 5c 75 30 65 34 30 5c 75 30 65 32  ECT @\u0e40\u0e2
5220: 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75 30  d\u0e28\u0e02\u0
5230: 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64 5c  e39\u0e40\u0e2d\
5240: 75 30 65 32 35 0a 22 20 22 31 20 40 5c 75 30 65  u0e25." "1 @\u0e
5250: 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75  40\u0e2d\u0e28\u
5260: 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30  0e02\u0e39\u0e40
5270: 5c 75 30 65 32 64 5c 75 30 65 32 35 22 20 2d 31  \u0e2d\u0e25" -1
5280: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5290: 65 5f 65 78 70 72 2d 31 31 2e 33 2e 36 20 22 53  e_expr-11.3.6 "S
52a0: 45 4c 45 43 54 20 40 5c 75 30 30 38 30 22 20 22  ELECT @\u0080" "
52b0: 31 20 40 5c 75 30 30 38 30 22 20 2d 31 0a 0a 23  1 @\u0080" -1..#
52c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
52d0: 36 32 36 31 30 2d 35 31 33 32 39 20 41 20 64 6f  62610-51329 A do
52e0: 6c 6c 61 72 2d 73 69 67 6e 20 66 6f 6c 6c 6f 77  llar-sign follow
52f0: 65 64 20 62 79 20 61 6e 20 69 64 65 6e 74 69 66  ed by an identif
5300: 69 65 72 0a 23 20 6e 61 6d 65 20 61 6c 73 6f 20  ier.# name also 
5310: 68 6f 6c 64 73 20 61 20 73 70 6f 74 20 66 6f 72  holds a spot for
5320: 20 61 20 6e 61 6d 65 64 20 70 61 72 61 6d 65 74   a named paramet
5330: 65 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  er with the name
5340: 20 24 41 41 41 41 2e 0a 23 0a 23 20 45 56 49 44   $AAAA..#.# EVID
5350: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 30 32 35  ENCE-OF: R-55025
5360: 2d 32 31 30 34 32 20 54 68 65 20 69 64 65 6e 74  -21042 The ident
5370: 69 66 69 65 72 20 6e 61 6d 65 20 69 6e 20 74 68  ifier name in th
5380: 69 73 20 63 61 73 65 20 63 61 6e 0a 23 20 69 6e  is case can.# in
5390: 63 6c 75 64 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  clude one or mor
53a0: 65 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66  e occurrences of
53b0: 20 22 3a 3a 22 20 61 6e 64 20 61 20 73 75 66 66   "::" and a suff
53c0: 69 78 20 65 6e 63 6c 6f 73 65 64 20 69 6e 0a 23  ix enclosed in.#
53d0: 20 22 28 2e 2e 2e 29 22 20 63 6f 6e 74 61 69 6e   "(...)" contain
53e0: 69 6e 67 20 61 6e 79 20 74 65 78 74 20 61 74 20  ing any text at 
53f0: 61 6c 6c 2e 0a 23 0a 23 20 4e 6f 74 65 3a 20 4c  all..#.# Note: L
5400: 6f 6f 6b 73 20 6c 69 6b 65 20 61 6e 20 69 64 65  ooks like an ide
5410: 6e 74 69 66 69 65 72 20 63 61 6e 6e 6f 74 20 63  ntifier cannot c
5420: 6f 6e 73 69 73 74 20 65 6e 74 69 72 65 6c 79 20  onsist entirely 
5430: 6f 66 20 22 3a 3a 22 20 0a 23 20 63 68 61 72 61  of "::" .# chara
5440: 63 74 65 72 73 20 6f 72 20 6a 75 73 74 20 61 20  cters or just a 
5450: 73 75 66 66 69 78 2e 20 41 6c 73 6f 2c 20 74 68  suffix. Also, th
5460: 65 20 6f 74 68 65 72 20 6e 61 6d 65 64 20 76 61  e other named va
5470: 72 69 61 62 6c 65 20 63 68 61 72 61 63 74 65 72  riable character
5480: 73 0a 23 20 28 3a 20 61 6e 64 20 40 29 20 77 6f  s.# (: and @) wo
5490: 72 6b 20 74 68 65 20 73 61 6d 65 20 77 61 79 20  rk the same way 
54a0: 69 6e 74 65 72 6e 61 6c 6c 79 2e 20 57 68 79 20  internally. Why 
54b0: 6e 6f 74 20 6a 75 73 74 20 64 6f 63 75 6d 65 6e  not just documen
54c0: 74 20 69 74 20 74 68 61 74 20 77 61 79 3f 0a 23  t it that way?.#
54d0: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
54e0: 65 5f 65 78 70 72 2d 31 31 2e 34 2e 31 20 7b 53  e_expr-11.4.1 {S
54f0: 45 4c 45 43 54 20 24 41 41 41 41 7d 20 20 20 20  ELECT $AAAA}    
5500: 20 20 20 20 20 7b 31 20 24 41 41 41 41 7d 20 20       {1 $AAAA}  
5510: 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65       -1.paramete
5520: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
5530: 2e 34 2e 32 20 7b 53 45 4c 45 43 54 20 24 31 32  .4.2 {SELECT $12
5540: 33 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 24  3}          {1 $
5550: 31 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70  123}        -1.p
5560: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
5570: 65 78 70 72 2d 31 31 2e 34 2e 33 20 7b 53 45 4c  expr-11.4.3 {SEL
5580: 45 43 54 20 24 5f 5f 7d 20 20 20 20 20 20 20 20  ECT $__}        
5590: 20 20 20 7b 31 20 24 5f 5f 7d 20 20 20 20 20 20     {1 $__}      
55a0: 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f     -1.parameter_
55b0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34  test e_expr-11.4
55c0: 2e 34 20 7b 53 45 4c 45 43 54 20 24 5f 24 5f 7d  .4 {SELECT $_$_}
55d0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 24 5f 24            {1 $_$
55e0: 5f 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72  _}        -1.par
55f0: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
5600: 70 72 2d 31 31 2e 34 2e 35 20 22 0a 20 20 53 45  pr-11.4.5 ".  SE
5610: 4c 45 43 54 20 5c 24 5c 75 30 65 34 30 5c 75 30  LECT \$\u0e40\u0
5620: 65 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c  e2d\u0e28\u0e02\
5630: 75 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32  u0e39\u0e40\u0e2
5640: 64 5c 75 30 65 32 35 0a 22 20 22 31 20 5c 24 5c  d\u0e25." "1 \$\
5650: 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32  u0e40\u0e2d\u0e2
5660: 38 5c 75 30 65 30 32 5c 75 30 65 33 39 5c 75 30  8\u0e02\u0e39\u0
5670: 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 35 22  e40\u0e2d\u0e25"
5680: 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65   -1.parameter_te
5690: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e 36  st e_expr-11.4.6
56a0: 20 22 53 45 4c 45 43 54 20 5c 24 5c 75 30 30 38   "SELECT \$\u008
56b0: 30 22 20 22 31 20 5c 24 5c 75 30 30 38 30 22 20  0" "1 \$\u0080" 
56c0: 2d 31 0a 0a 70 61 72 61 6d 65 74 65 72 5f 74 65  -1..parameter_te
56d0: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 35 2e 31  st e_expr-11.5.1
56e0: 20 7b 53 45 4c 45 43 54 20 24 3a 3a 3a 3a 61 28   {SELECT $::::a(
56f0: 2b 2b 2d 2d 2b 2b 29 7d 20 7b 31 20 24 3a 3a 3a  ++--++)} {1 $:::
5700: 3a 61 28 2b 2b 2d 2d 2b 2b 29 7d 20 2d 31 0a 70  :a(++--++)} -1.p
5710: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
5720: 65 78 70 72 2d 31 31 2e 35 2e 32 20 7b 53 45 4c  expr-11.5.2 {SEL
5730: 45 43 54 20 24 3a 3a 61 28 29 7d 20 7b 31 20 24  ECT $::a()} {1 $
5740: 3a 3a 61 28 29 7d 20 2d 31 0a 70 61 72 61 6d 65  ::a()} -1.parame
5750: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
5760: 31 31 2e 35 2e 33 20 7b 53 45 4c 45 43 54 20 24  11.5.3 {SELECT $
5770: 3a 3a 31 28 3a 3a 23 24 29 7d 20 7b 31 20 24 3a  ::1(::#$)} {1 $:
5780: 3a 31 28 3a 3a 23 24 29 7d 20 2d 31 0a 20 0a 23  :1(::#$)} -1. .#
5790: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
57a0: 31 31 33 37 30 2d 30 34 35 32 30 20 4e 61 6d 65  11370-04520 Name
57b0: 64 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  d parameters are
57c0: 20 61 6c 73 6f 20 6e 75 6d 62 65 72 65 64 2e 20   also numbered. 
57d0: 54 68 65 0a 23 20 6e 75 6d 62 65 72 20 61 73 73  The.# number ass
57e0: 69 67 6e 65 64 20 69 73 20 6f 6e 65 20 67 72 65  igned is one gre
57f0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  ater than the la
5800: 72 67 65 73 74 20 70 61 72 61 6d 65 74 65 72 20  rgest parameter 
5810: 6e 75 6d 62 65 72 0a 23 20 61 6c 72 65 61 64 79  number.# already
5820: 20 61 73 73 69 67 6e 65 64 2e 0a 23 0a 23 20 45   assigned..#.# E
5830: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32  VIDENCE-OF: R-42
5840: 36 32 30 2d 32 32 31 38 34 20 49 66 20 74 68 69  620-22184 If thi
5850: 73 20 6d 65 61 6e 73 20 74 68 65 20 70 61 72 61  s means the para
5860: 6d 65 74 65 72 20 77 6f 75 6c 64 20 62 65 0a 23  meter would be.#
5870: 20 61 73 73 69 67 6e 65 64 20 61 20 6e 75 6d 62   assigned a numb
5880: 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
5890: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
58a0: 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 69 74 20 69  BLE_NUMBER, it i
58b0: 73 20 61 6e 0a 23 20 65 72 72 6f 72 2e 0a 23 0a  s an.# error..#.
58c0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
58d0: 5f 65 78 70 72 2d 31 31 2e 36 2e 31 20 22 53 45  _expr-11.6.1 "SE
58e0: 4c 45 43 54 20 3f 2c 20 40 61 62 63 22 20 20 20  LECT ?, @abc"   
58f0: 20 7b 31 20 7b 7d 20 32 20 40 61 62 63 7d 20 7b   {1 {} 2 @abc} {
5900: 2d 31 20 2d 32 7d 0a 70 61 72 61 6d 65 74 65 72  -1 -2}.parameter
5910: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5920: 36 2e 32 20 22 53 45 4c 45 43 54 20 3f 31 32 33  6.2 "SELECT ?123
5930: 2c 20 3a 61 31 22 20 20 7b 31 32 33 20 3f 31 32  , :a1"  {123 ?12
5940: 33 20 31 32 34 20 3a 61 31 7d 20 7b 2d 31 32 33  3 124 :a1} {-123
5950: 20 2d 31 32 34 7d 0a 70 61 72 61 6d 65 74 65 72   -124}.parameter
5960: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5970: 36 2e 33 20 7b 53 45 4c 45 43 54 20 24 61 2c 20  6.3 {SELECT $a, 
5980: 3f 38 2c 20 3f 2c 20 24 62 2c 20 3f 32 2c 20 24  ?8, ?, $b, ?2, $
5990: 63 7d 20 7b 0a 20 20 31 20 24 61 20 38 20 3f 38  c} {.  1 $a 8 ?8
59a0: 20 39 20 7b 7d 20 31 30 20 24 62 20 32 20 3f 32   9 {} 10 $b 2 ?2
59b0: 20 31 31 20 24 63 0a 7d 20 7b 2d 31 20 2d 38 20   11 $c.} {-1 -8 
59c0: 2d 39 20 2d 31 30 20 2d 32 20 2d 31 31 7d 0a 66  -9 -10 -2 -11}.f
59d0: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20  oreach {tn sql} 
59e0: 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  [list           
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 5c 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 3f  \.  1  "SELECT ?
5a10: 24 6d 76 6e 2c 20 5c 24 3a 3a 61 22 20 20 20 20  $mvn, \$::a"    
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 20 5c 0a 20 20 32 20 20 22 53 45 4c 45 43     \.  2  "SELEC
5a40: 54 20 3f 24 6d 76 6e 2c 20 3f 34 2c 20 40 61 31  T ?$mvn, ?4, @a1
5a50: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5a60: 20 20 20 20 20 20 5c 0a 20 20 33 20 20 22 53 45        \.  3  "SE
5a70: 4c 45 43 54 20 3f 5b 65 78 70 72 20 24 6d 76 6e  LECT ?[expr $mvn
5a80: 2d 32 5d 2c 20 3a 62 61 67 2c 20 40 31 32 33 2c  -2], :bag, @123,
5a90: 20 5c 24 78 22 20 20 20 20 5c 0a 5d 20 7b 0a 20   \$x"    \.] {. 
5aa0: 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73   do_catchsql_tes
5ab0: 74 20 65 5f 65 78 70 72 2d 31 31 2e 37 2e 24 74  t e_expr-11.7.$t
5ac0: 6e 20 24 73 71 6c 20 5b 6c 69 73 74 20 31 20 7b  n $sql [list 1 {
5ad0: 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72  too many SQL var
5ae0: 69 61 62 6c 65 73 7d 5d 0a 7d 0a 0a 23 20 45 56  iables}].}..# EV
5af0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 30  IDENCE-OF: R-140
5b00: 36 38 2d 34 39 36 37 31 20 50 61 72 61 6d 65 74  68-49671 Paramet
5b10: 65 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ers that are not
5b20: 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65 73   assigned values
5b30: 0a 23 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  .# using sqlite3
5b40: 5f 62 69 6e 64 28 29 20 61 72 65 20 74 72 65 61  _bind() are trea
5b50: 74 65 64 20 61 73 20 4e 55 4c 4c 2e 0a 23 0a 64  ted as NULL..#.d
5b60: 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  o_test e_expr-11
5b70: 2e 37 2e 31 20 7b 0a 20 20 73 65 74 20 73 74 6d  .7.1 {.  set stm
5b80: 74 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  t [sqlite3_prepa
5b90: 72 65 5f 76 32 20 64 62 20 7b 20 53 45 4c 45 43  re_v2 db { SELEC
5ba0: 54 20 3f 2c 20 3a 61 2c 20 40 62 2c 20 24 64 20  T ?, :a, @b, $d 
5bb0: 7d 20 2d 31 5d 0a 20 20 73 71 6c 69 74 65 33 5f  } -1].  sqlite3_
5bc0: 73 74 65 70 20 24 73 74 6d 74 0a 0a 20 20 6c 69  step $stmt..  li
5bd0: 73 74 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75  st [sqlite3_colu
5be0: 6d 6e 5f 74 79 70 65 20 24 73 74 6d 74 20 30 5d  mn_type $stmt 0]
5bf0: 20 5c 0a 20 20 20 20 20 20 20 5b 73 71 6c 69 74   \.       [sqlit
5c00: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24  e3_column_type $
5c10: 73 74 6d 74 20 31 5d 20 5c 0a 20 20 20 20 20 20  stmt 1] \.      
5c20: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   [sqlite3_column
5c30: 5f 74 79 70 65 20 24 73 74 6d 74 20 32 5d 20 5c  _type $stmt 2] \
5c40: 0a 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  .       [sqlite3
5c50: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24 73 74  _column_type $st
5c60: 6d 74 20 33 5d 20 0a 7d 20 7b 4e 55 4c 4c 20 4e  mt 3] .} {NULL N
5c70: 55 4c 4c 20 4e 55 4c 4c 20 4e 55 4c 4c 7d 0a 64  ULL NULL NULL}.d
5c80: 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  o_test e_expr-11
5c90: 2e 37 2e 31 20 7b 20 73 71 6c 69 74 65 33 5f 66  .7.1 { sqlite3_f
5ca0: 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 20 7d 20  inalize $stmt } 
5cb0: 53 51 4c 49 54 45 5f 4f 4b 0a 0a 23 2d 2d 2d 2d  SQLITE_OK..#----
5cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d00: 2d 2d 2d 2d 2d 0a 23 20 22 54 65 73 74 22 20 74  -----.# "Test" t
5d10: 68 65 20 73 79 6e 74 61 78 20 64 69 61 67 72 61  he syntax diagra
5d20: 6d 73 20 69 6e 20 6c 61 6e 67 5f 65 78 70 72 2e  ms in lang_expr.
5d30: 68 74 6d 6c 2e 0a 23 0a 23 20 45 56 49 44 45 4e  html..#.# EVIDEN
5d40: 43 45 2d 4f 46 3a 20 52 2d 36 32 30 36 37 2d 34  CE-OF: R-62067-4
5d50: 33 38 38 34 20 2d 2d 20 73 79 6e 74 61 78 20 64  3884 -- syntax d
5d60: 69 61 67 72 61 6d 20 73 69 67 6e 65 64 2d 6e 75  iagram signed-nu
5d70: 6d 62 65 72 0a 23 0a 64 6f 5f 65 78 65 63 73 71  mber.#.do_execsq
5d80: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  l_test e_expr-12
5d90: 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 30 2c  .1.1 { SELECT 0,
5da0: 20 2b 30 2c 20 2d 30 20 7d 20 7b 30 20 30 20 30   +0, -0 } {0 0 0
5db0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
5dc0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 31 2e 32 20  t e_expr-12.1.2 
5dd0: 7b 20 53 45 4c 45 43 54 20 31 2c 20 2b 31 2c 20  { SELECT 1, +1, 
5de0: 2d 31 20 7d 20 7b 31 20 31 20 2d 31 7d 0a 64 6f  -1 } {1 1 -1}.do
5df0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
5e00: 65 78 70 72 2d 31 32 2e 31 2e 33 20 7b 20 53 45  expr-12.1.3 { SE
5e10: 4c 45 43 54 20 32 2c 20 2b 32 2c 20 2d 32 20 7d  LECT 2, +2, -2 }
5e20: 20 7b 32 20 32 20 2d 32 7d 0a 64 6f 5f 65 78 65   {2 2 -2}.do_exe
5e30: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
5e40: 2d 31 32 2e 31 2e 34 20 7b 20 0a 20 20 53 45 4c  -12.1.4 { .  SEL
5e50: 45 43 54 20 31 2e 34 2c 20 2b 31 2e 34 2c 20 2d  ECT 1.4, +1.4, -
5e60: 31 2e 34 20 0a 7d 20 7b 31 2e 34 20 31 2e 34 20  1.4 .} {1.4 1.4 
5e70: 2d 31 2e 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  -1.4}.do_execsql
5e80: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
5e90: 31 2e 35 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  1.5 { .  SELECT 
5ea0: 31 2e 35 65 2b 35 2c 20 2b 31 2e 35 65 2b 35 2c  1.5e+5, +1.5e+5,
5eb0: 20 2d 31 2e 35 65 2b 35 20 0a 7d 20 7b 31 35 30   -1.5e+5 .} {150
5ec0: 30 30 30 2e 30 20 31 35 30 30 30 30 2e 30 20 2d  000.0 150000.0 -
5ed0: 31 35 30 30 30 30 2e 30 7d 0a 64 6f 5f 65 78 65  150000.0}.do_exe
5ee0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
5ef0: 2d 31 32 2e 31 2e 36 20 7b 20 0a 20 20 53 45 4c  -12.1.6 { .  SEL
5f00: 45 43 54 20 30 2e 30 30 30 31 2c 20 2b 30 2e 30  ECT 0.0001, +0.0
5f10: 30 30 31 2c 20 2d 30 2e 30 30 30 31 20 0a 7d 20  001, -0.0001 .} 
5f20: 7b 30 2e 30 30 30 31 20 30 2e 30 30 30 31 20 2d  {0.0001 0.0001 -
5f30: 30 2e 30 30 30 31 7d 0a 0a 23 20 45 56 49 44 45  0.0001}..# EVIDE
5f40: 4e 43 45 2d 4f 46 3a 20 52 2d 32 31 32 35 38 2d  NCE-OF: R-21258-
5f50: 32 35 34 38 39 20 2d 2d 20 73 79 6e 74 61 78 20  25489 -- syntax 
5f60: 64 69 61 67 72 61 6d 20 6c 69 74 65 72 61 6c 2d  diagram literal-
5f70: 76 61 6c 75 65 0a 23 0a 73 65 74 20 73 71 6c 69  value.#.set sqli
5f80: 74 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  te_current_time 
5f90: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
5fa0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 31 20  t e_expr-12.2.1 
5fb0: 7b 53 45 4c 45 43 54 20 31 32 33 7d 20 20 20 20  {SELECT 123}    
5fc0: 20 20 20 20 20 20 20 20 20 20 20 7b 31 32 33 7d             {123}
5fd0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
5fe0: 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 32 20 7b   e_expr-12.2.2 {
5ff0: 53 45 4c 45 43 54 20 31 32 33 2e 34 65 30 35 7d  SELECT 123.4e05}
6000: 20 20 20 20 20 20 20 20 20 20 7b 31 32 33 34 30            {12340
6010: 30 30 30 2e 30 7d 0a 64 6f 5f 65 78 65 63 73 71  000.0}.do_execsq
6020: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  l_test e_expr-12
6030: 2e 32 2e 33 20 7b 53 45 4c 45 43 54 20 27 61 62  .2.3 {SELECT 'ab
6040: 63 64 65 27 7d 20 20 20 20 20 20 20 20 20 20 20  cde'}           
6050: 7b 61 62 63 64 65 7d 0a 64 6f 5f 65 78 65 63 73  {abcde}.do_execs
6060: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
6070: 32 2e 32 2e 34 20 7b 53 45 4c 45 43 54 20 58 27  2.2.4 {SELECT X'
6080: 34 31 34 32 34 33 27 7d 20 20 20 20 20 20 20 20  414243'}        
6090: 20 7b 41 42 43 7d 0a 64 6f 5f 65 78 65 63 73 71   {ABC}.do_execsq
60a0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  l_test e_expr-12
60b0: 2e 32 2e 35 20 7b 53 45 4c 45 43 54 20 4e 55 4c  .2.5 {SELECT NUL
60c0: 4c 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L}              
60d0: 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {{}}.do_execsql_
60e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32  test e_expr-12.2
60f0: 2e 36 20 7b 53 45 4c 45 43 54 20 43 55 52 52 45  .6 {SELECT CURRE
6100: 4e 54 5f 54 49 4d 45 7d 20 20 20 20 20 20 7b 30  NT_TIME}      {0
6110: 30 3a 30 30 3a 30 31 7d 0a 64 6f 5f 65 78 65 63  0:00:01}.do_exec
6120: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
6130: 31 32 2e 32 2e 37 20 7b 53 45 4c 45 43 54 20 43  12.2.7 {SELECT C
6140: 55 52 52 45 4e 54 5f 44 41 54 45 7d 20 20 20 20  URRENT_DATE}    
6150: 20 20 7b 31 39 37 30 2d 30 31 2d 30 31 7d 0a 64    {1970-01-01}.d
6160: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
6170: 5f 65 78 70 72 2d 31 32 2e 32 2e 38 20 7b 53 45  _expr-12.2.8 {SE
6180: 4c 45 43 54 20 43 55 52 52 45 4e 54 5f 54 49 4d  LECT CURRENT_TIM
6190: 45 53 54 41 4d 50 7d 20 7b 7b 31 39 37 30 2d 30  ESTAMP} {{1970-0
61a0: 31 2d 30 31 20 30 30 3a 30 30 3a 30 31 7d 7d 0a  1-01 00:00:01}}.
61b0: 73 65 74 20 73 71 6c 69 74 65 5f 63 75 72 72 65  set sqlite_curre
61c0: 6e 74 5f 74 69 6d 65 20 30 0a 0a 23 20 45 56 49  nt_time 0..# EVI
61d0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 35 39  DENCE-OF: R-5759
61e0: 38 2d 35 39 33 33 32 20 2d 2d 20 73 79 6e 74 61  8-59332 -- synta
61f0: 78 20 64 69 61 67 72 61 6d 20 65 78 70 72 0a 23  x diagram expr.#
6200: 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
6210: 74 2e 64 62 32 0a 65 78 65 63 73 71 6c 20 7b 0a  t.db2.execsql {.
6220: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
6230: 62 32 27 20 41 53 20 64 62 6e 61 6d 65 3b 0a 20  b2' AS dbname;. 
6240: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 62   CREATE TABLE db
6250: 6e 61 6d 65 2e 74 62 6c 6e 61 6d 65 28 63 6e 61  name.tblname(cna
6260: 6d 65 29 3b 0a 7d 0a 0a 70 72 6f 63 20 67 6c 6f  me);.}..proc glo
6270: 62 20 7b 61 72 67 73 7d 20 7b 72 65 74 75 72 6e  b {args} {return
6280: 20 31 7d 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20   1}.db function 
6290: 67 6c 6f 62 20 67 6c 6f 62 0a 64 62 20 66 75 6e  glob glob.db fun
62a0: 63 74 69 6f 6e 20 6d 61 74 63 68 20 67 6c 6f 62  ction match glob
62b0: 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20 72 65 67  .db function reg
62c0: 65 78 70 20 67 6c 6f 62 0a 0a 66 6f 72 65 61 63  exp glob..foreac
62d0: 68 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20  h {tn expr} {.  
62e0: 31 20 31 32 33 0a 20 20 32 20 31 32 33 2e 34 65  1 123.  2 123.4e
62f0: 30 35 0a 20 20 33 20 27 61 62 63 64 65 27 0a 20  05.  3 'abcde'. 
6300: 20 34 20 58 27 34 31 34 32 34 33 27 0a 20 20 35   4 X'414243'.  5
6310: 20 4e 55 4c 4c 0a 20 20 36 20 43 55 52 52 45 4e   NULL.  6 CURREN
6320: 54 5f 54 49 4d 45 0a 20 20 37 20 43 55 52 52 45  T_TIME.  7 CURRE
6330: 4e 54 5f 44 41 54 45 0a 20 20 38 20 43 55 52 52  NT_DATE.  8 CURR
6340: 45 4e 54 5f 54 49 4d 45 53 54 41 4d 50 0a 0a 20  ENT_TIMESTAMP.. 
6350: 20 39 20 3f 0a 20 31 30 20 3f 31 32 33 0a 20 31   9 ?. 10 ?123. 1
6360: 31 20 40 68 65 6c 6c 6f 0a 20 31 32 20 3a 77 6f  1 @hello. 12 :wo
6370: 72 6c 64 0a 20 31 33 20 24 74 63 6c 0a 20 31 34  rld. 13 $tcl. 14
6380: 20 24 74 63 6c 28 61 72 72 61 79 29 0a 20 20 0a   $tcl(array).  .
6390: 20 20 31 35 20 63 6e 61 6d 65 0a 20 20 31 36 20    15 cname.  16 
63a0: 74 62 6c 6e 61 6d 65 2e 63 6e 61 6d 65 0a 20 20  tblname.cname.  
63b0: 31 37 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61 6d  17 dbname.tblnam
63c0: 65 2e 63 6e 61 6d 65 0a 0a 20 20 31 38 20 22 2b  e.cname..  18 "+
63d0: 20 45 58 50 52 22 0a 20 20 31 39 20 22 2d 20 45   EXPR".  19 "- E
63e0: 58 50 52 22 0a 20 20 32 30 20 22 4e 4f 54 20 45  XPR".  20 "NOT E
63f0: 58 50 52 22 0a 20 20 32 31 20 22 7e 20 45 58 50  XPR".  21 "~ EXP
6400: 52 22 0a 0a 20 20 32 32 20 22 45 58 50 52 31 20  R"..  22 "EXPR1 
6410: 7c 7c 20 45 58 50 52 32 22 0a 20 20 32 33 20 22  || EXPR2".  23 "
6420: 45 58 50 52 31 20 2a 20 45 58 50 52 32 22 0a 20  EXPR1 * EXPR2". 
6430: 20 32 34 20 22 45 58 50 52 31 20 2f 20 45 58 50   24 "EXPR1 / EXP
6440: 52 32 22 0a 20 20 32 35 20 22 45 58 50 52 31 20  R2".  25 "EXPR1 
6450: 25 20 45 58 50 52 32 22 0a 20 20 32 36 20 22 45  % EXPR2".  26 "E
6460: 58 50 52 31 20 2b 20 45 58 50 52 32 22 0a 20 20  XPR1 + EXPR2".  
6470: 32 37 20 22 45 58 50 52 31 20 2d 20 45 58 50 52  27 "EXPR1 - EXPR
6480: 32 22 0a 20 20 32 38 20 22 45 58 50 52 31 20 3c  2".  28 "EXPR1 <
6490: 3c 20 45 58 50 52 32 22 0a 20 20 32 39 20 22 45  < EXPR2".  29 "E
64a0: 58 50 52 31 20 3e 3e 20 45 58 50 52 32 22 0a 20  XPR1 >> EXPR2". 
64b0: 20 33 30 20 22 45 58 50 52 31 20 26 20 45 58 50   30 "EXPR1 & EXP
64c0: 52 32 22 0a 20 20 33 31 20 22 45 58 50 52 31 20  R2".  31 "EXPR1 
64d0: 7c 20 45 58 50 52 32 22 0a 20 20 33 32 20 22 45  | EXPR2".  32 "E
64e0: 58 50 52 31 20 3c 20 45 58 50 52 32 22 0a 20 20  XPR1 < EXPR2".  
64f0: 33 33 20 22 45 58 50 52 31 20 3c 3d 20 45 58 50  33 "EXPR1 <= EXP
6500: 52 32 22 0a 20 20 33 34 20 22 45 58 50 52 31 20  R2".  34 "EXPR1 
6510: 3e 20 45 58 50 52 32 22 0a 20 20 33 35 20 22 45  > EXPR2".  35 "E
6520: 58 50 52 31 20 3e 3d 20 45 58 50 52 32 22 0a 20  XPR1 >= EXPR2". 
6530: 20 33 36 20 22 45 58 50 52 31 20 3d 20 45 58 50   36 "EXPR1 = EXP
6540: 52 32 22 0a 20 20 33 37 20 22 45 58 50 52 31 20  R2".  37 "EXPR1 
6550: 3d 3d 20 45 58 50 52 32 22 0a 20 20 33 38 20 22  == EXPR2".  38 "
6560: 45 58 50 52 31 20 21 3d 20 45 58 50 52 32 22 0a  EXPR1 != EXPR2".
6570: 20 20 33 39 20 22 45 58 50 52 31 20 3c 3e 20 45    39 "EXPR1 <> E
6580: 58 50 52 32 22 0a 20 20 34 30 20 22 45 58 50 52  XPR2".  40 "EXPR
6590: 31 20 49 53 20 45 58 50 52 32 22 0a 20 20 34 31  1 IS EXPR2".  41
65a0: 20 22 45 58 50 52 31 20 49 53 20 4e 4f 54 20 45   "EXPR1 IS NOT E
65b0: 58 50 52 32 22 0a 20 20 34 32 20 22 45 58 50 52  XPR2".  42 "EXPR
65c0: 31 20 41 4e 44 20 45 58 50 52 32 22 0a 20 20 34  1 AND EXPR2".  4
65d0: 33 20 22 45 58 50 52 31 20 4f 52 20 45 58 50 52  3 "EXPR1 OR EXPR
65e0: 32 22 0a 20 0a 20 20 34 34 20 22 63 6f 75 6e 74  2". .  44 "count
65f0: 28 2a 29 22 0a 20 20 34 35 20 22 63 6f 75 6e 74  (*)".  45 "count
6600: 28 44 49 53 54 49 4e 43 54 20 45 58 50 52 29 22  (DISTINCT EXPR)"
6610: 0a 20 20 34 36 20 22 73 75 62 73 74 72 28 45 58  .  46 "substr(EX
6620: 50 52 2c 20 31 30 2c 20 32 30 29 22 0a 20 20 34  PR, 10, 20)".  4
6630: 37 20 22 63 68 61 6e 67 65 73 28 29 22 0a 20 0a  7 "changes()". .
6640: 20 20 34 38 20 22 28 20 45 58 50 52 20 29 22 0a    48 "( EXPR )".
6650: 20 0a 20 20 34 39 20 22 43 41 53 54 20 28 20 45   .  49 "CAST ( E
6660: 58 50 52 20 41 53 20 69 6e 74 65 67 65 72 20 29  XPR AS integer )
6670: 22 0a 20 20 35 30 20 22 43 41 53 54 20 28 20 45  ".  50 "CAST ( E
6680: 58 50 52 20 41 53 20 27 61 62 63 64 27 20 29 22  XPR AS 'abcd' )"
6690: 0a 20 20 35 31 20 22 43 41 53 54 20 28 20 45 58  .  51 "CAST ( EX
66a0: 50 52 20 41 53 20 27 61 62 24 20 24 63 64 27 20  PR AS 'ab$ $cd' 
66b0: 29 22 0a 20 0a 20 20 35 32 20 22 45 58 50 52 20  )". .  52 "EXPR 
66c0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a  COLLATE nocase".
66d0: 20 20 35 33 20 22 45 58 50 52 20 43 4f 4c 4c 41    53 "EXPR COLLA
66e0: 54 45 20 62 69 6e 61 72 79 22 0a 20 0a 20 20 35  TE binary". .  5
66f0: 34 20 22 45 58 50 52 31 20 4c 49 4b 45 20 45 58  4 "EXPR1 LIKE EX
6700: 50 52 32 22 0a 20 20 35 35 20 22 45 58 50 52 31  PR2".  55 "EXPR1
6710: 20 4c 49 4b 45 20 45 58 50 52 32 20 45 53 43 41   LIKE EXPR2 ESCA
6720: 50 45 20 45 58 50 52 22 0a 20 20 35 36 20 22 45  PE EXPR".  56 "E
6730: 58 50 52 31 20 47 4c 4f 42 20 45 58 50 52 32 22  XPR1 GLOB EXPR2"
6740: 0a 20 20 35 37 20 22 45 58 50 52 31 20 47 4c 4f  .  57 "EXPR1 GLO
6750: 42 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45  B EXPR2 ESCAPE E
6760: 58 50 52 22 0a 20 20 35 38 20 22 45 58 50 52 31  XPR".  58 "EXPR1
6770: 20 52 45 47 45 58 50 20 45 58 50 52 32 22 0a 20   REGEXP EXPR2". 
6780: 20 35 39 20 22 45 58 50 52 31 20 52 45 47 45 58   59 "EXPR1 REGEX
6790: 50 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45  P EXPR2 ESCAPE E
67a0: 58 50 52 22 0a 20 20 36 30 20 22 45 58 50 52 31  XPR".  60 "EXPR1
67b0: 20 4d 41 54 43 48 20 45 58 50 52 32 22 0a 20 20   MATCH EXPR2".  
67c0: 36 31 20 22 45 58 50 52 31 20 4d 41 54 43 48 20  61 "EXPR1 MATCH 
67d0: 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50  EXPR2 ESCAPE EXP
67e0: 52 22 0a 20 20 36 32 20 22 45 58 50 52 31 20 4e  R".  62 "EXPR1 N
67f0: 4f 54 20 4c 49 4b 45 20 45 58 50 52 32 22 0a 20  OT LIKE EXPR2". 
6800: 20 36 33 20 22 45 58 50 52 31 20 4e 4f 54 20 4c   63 "EXPR1 NOT L
6810: 49 4b 45 20 45 58 50 52 32 20 45 53 43 41 50 45  IKE EXPR2 ESCAPE
6820: 20 45 58 50 52 22 0a 20 20 36 34 20 22 45 58 50   EXPR".  64 "EXP
6830: 52 31 20 4e 4f 54 20 47 4c 4f 42 20 45 58 50 52  R1 NOT GLOB EXPR
6840: 32 22 0a 20 20 36 35 20 22 45 58 50 52 31 20 4e  2".  65 "EXPR1 N
6850: 4f 54 20 47 4c 4f 42 20 45 58 50 52 32 20 45 53  OT GLOB EXPR2 ES
6860: 43 41 50 45 20 45 58 50 52 22 0a 20 20 36 36 20  CAPE EXPR".  66 
6870: 22 45 58 50 52 31 20 4e 4f 54 20 52 45 47 45 58  "EXPR1 NOT REGEX
6880: 50 20 45 58 50 52 32 22 0a 20 20 36 37 20 22 45  P EXPR2".  67 "E
6890: 58 50 52 31 20 4e 4f 54 20 52 45 47 45 58 50 20  XPR1 NOT REGEXP 
68a0: 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50  EXPR2 ESCAPE EXP
68b0: 52 22 0a 20 20 36 38 20 22 45 58 50 52 31 20 4e  R".  68 "EXPR1 N
68c0: 4f 54 20 4d 41 54 43 48 20 45 58 50 52 32 22 0a  OT MATCH EXPR2".
68d0: 20 20 36 39 20 22 45 58 50 52 31 20 4e 4f 54 20    69 "EXPR1 NOT 
68e0: 4d 41 54 43 48 20 45 58 50 52 32 20 45 53 43 41  MATCH EXPR2 ESCA
68f0: 50 45 20 45 58 50 52 22 0a 20 0a 20 20 37 30 20  PE EXPR". .  70 
6900: 22 45 58 50 52 20 49 53 4e 55 4c 4c 22 0a 20 20  "EXPR ISNULL".  
6910: 37 31 20 22 45 58 50 52 20 4e 4f 54 4e 55 4c 4c  71 "EXPR NOTNULL
6920: 22 0a 20 20 37 32 20 22 45 58 50 52 20 4e 4f 54  ".  72 "EXPR NOT
6930: 20 4e 55 4c 4c 22 0a 20 0a 20 20 37 33 20 22 45   NULL". .  73 "E
6940: 58 50 52 31 20 49 53 20 45 58 50 52 32 22 0a 20  XPR1 IS EXPR2". 
6950: 20 37 34 20 22 45 58 50 52 31 20 49 53 20 4e 4f   74 "EXPR1 IS NO
6960: 54 20 45 58 50 52 32 22 0a 0a 20 20 37 35 20 22  T EXPR2"..  75 "
6970: 45 58 50 52 20 4e 4f 54 20 42 45 54 57 45 45 4e  EXPR NOT BETWEEN
6980: 20 45 58 50 52 31 20 41 4e 44 20 45 58 50 52 32   EXPR1 AND EXPR2
6990: 22 0a 20 20 37 36 20 22 45 58 50 52 20 42 45 54  ".  76 "EXPR BET
69a0: 57 45 45 4e 20 45 58 50 52 31 20 41 4e 44 20 45  WEEN EXPR1 AND E
69b0: 58 50 52 32 22 0a 0a 20 20 37 37 20 22 45 58 50  XPR2"..  77 "EXP
69c0: 52 20 4e 4f 54 20 49 4e 20 28 53 45 4c 45 43 54  R NOT IN (SELECT
69d0: 20 63 6e 61 6d 65 20 46 52 4f 4d 20 74 62 6c 6e   cname FROM tbln
69e0: 61 6d 65 29 22 0a 20 20 37 38 20 22 45 58 50 52  ame)".  78 "EXPR
69f0: 20 4e 4f 54 20 49 4e 20 28 31 29 22 0a 20 20 37   NOT IN (1)".  7
6a00: 39 20 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 28  9 "EXPR NOT IN (
6a10: 31 2c 20 32 2c 20 33 29 22 0a 20 20 38 30 20 22  1, 2, 3)".  80 "
6a20: 45 58 50 52 20 4e 4f 54 20 49 4e 20 74 62 6c 6e  EXPR NOT IN tbln
6a30: 61 6d 65 22 0a 20 20 38 31 20 22 45 58 50 52 20  ame".  81 "EXPR 
6a40: 4e 4f 54 20 49 4e 20 64 62 6e 61 6d 65 2e 74 62  NOT IN dbname.tb
6a50: 6c 6e 61 6d 65 22 0a 20 20 38 32 20 22 45 58 50  lname".  82 "EXP
6a60: 52 20 49 4e 20 28 53 45 4c 45 43 54 20 63 6e 61  R IN (SELECT cna
6a70: 6d 65 20 46 52 4f 4d 20 74 62 6c 6e 61 6d 65 29  me FROM tblname)
6a80: 22 0a 20 20 38 33 20 22 45 58 50 52 20 49 4e 20  ".  83 "EXPR IN 
6a90: 28 31 29 22 0a 20 20 38 34 20 22 45 58 50 52 20  (1)".  84 "EXPR 
6aa0: 49 4e 20 28 31 2c 20 32 2c 20 33 29 22 0a 20 20  IN (1, 2, 3)".  
6ab0: 38 35 20 22 45 58 50 52 20 49 4e 20 74 62 6c 6e  85 "EXPR IN tbln
6ac0: 61 6d 65 22 0a 20 20 38 36 20 22 45 58 50 52 20  ame".  86 "EXPR 
6ad0: 49 4e 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61 6d  IN dbname.tblnam
6ae0: 65 22 0a 0a 20 20 38 37 20 22 45 58 49 53 54 53  e"..  87 "EXISTS
6af0: 20 28 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46   (SELECT cname F
6b00: 52 4f 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 20 20  ROM tblname)".  
6b10: 38 38 20 22 4e 4f 54 20 45 58 49 53 54 53 20 28  88 "NOT EXISTS (
6b20: 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46 52 4f  SELECT cname FRO
6b30: 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 0a 20 20 38  M tblname)"..  8
6b40: 39 20 22 43 41 53 45 20 45 58 50 52 20 57 48 45  9 "CASE EXPR WHE
6b50: 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50  N EXPR1 THEN EXP
6b60: 52 32 20 45 4c 53 45 20 45 58 50 52 20 45 4e 44  R2 ELSE EXPR END
6b70: 22 0a 20 20 39 30 20 22 43 41 53 45 20 45 58 50  ".  90 "CASE EXP
6b80: 52 20 57 48 45 4e 20 45 58 50 52 31 20 54 48 45  R WHEN EXPR1 THE
6b90: 4e 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20 39  N EXPR2 END".  9
6ba0: 31 20 22 43 41 53 45 20 45 58 50 52 20 57 48 45  1 "CASE EXPR WHE
6bb0: 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50  N EXPR1 THEN EXP
6bc0: 52 32 20 57 48 45 4e 20 45 58 50 52 20 54 48 45  R2 WHEN EXPR THE
6bd0: 4e 20 45 58 50 52 31 20 45 4c 53 45 20 45 58 50  N EXPR1 ELSE EXP
6be0: 52 32 20 45 4e 44 22 0a 20 20 39 32 20 22 43 41  R2 END".  92 "CA
6bf0: 53 45 20 45 58 50 52 20 57 48 45 4e 20 45 58 50  SE EXPR WHEN EXP
6c00: 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 57 48  R1 THEN EXPR2 WH
6c10: 45 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58 50  EN EXPR THEN EXP
6c20: 52 31 20 45 4e 44 22 0a 20 20 39 33 20 22 43 41  R1 END".  93 "CA
6c30: 53 45 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  SE WHEN EXPR1 TH
6c40: 45 4e 20 45 58 50 52 32 20 45 4c 53 45 20 45 58  EN EXPR2 ELSE EX
6c50: 50 52 20 45 4e 44 22 0a 20 20 39 34 20 22 43 41  PR END".  94 "CA
6c60: 53 45 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  SE WHEN EXPR1 TH
6c70: 45 4e 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20  EN EXPR2 END".  
6c80: 39 35 20 22 43 41 53 45 20 57 48 45 4e 20 45 58  95 "CASE WHEN EX
6c90: 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 57  PR1 THEN EXPR2 W
6ca0: 48 45 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58  HEN EXPR THEN EX
6cb0: 50 52 31 20 45 4c 53 45 20 45 58 50 52 32 20 45  PR1 ELSE EXPR2 E
6cc0: 4e 44 22 0a 20 20 39 36 20 22 43 41 53 45 20 57  ND".  96 "CASE W
6cd0: 48 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45  HEN EXPR1 THEN E
6ce0: 58 50 52 32 20 57 48 45 4e 20 45 58 50 52 20 54  XPR2 WHEN EXPR T
6cf0: 48 45 4e 20 45 58 50 52 31 20 45 4e 44 22 0a 7d  HEN EXPR1 END".}
6d00: 20 7b 0a 0a 20 20 23 20 49 66 20 74 68 65 20 65   {..  # If the e
6d10: 78 70 72 65 73 73 69 6f 6e 20 73 74 72 69 6e 67  xpression string
6d20: 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 63 6f   being parsed co
6d30: 6e 74 61 69 6e 73 20 22 45 58 50 52 32 22 2c 20  ntains "EXPR2", 
6d40: 74 68 65 6e 20 72 65 70 6c 61 63 65 0a 20 20 23  then replace.  #
6d50: 20 73 74 72 69 6e 67 20 22 45 58 50 52 31 22 20   string "EXPR1" 
6d60: 61 6e 64 20 22 45 58 50 52 32 22 20 77 69 74 68  and "EXPR2" with
6d70: 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 20 65   arbitrary SQL e
6d80: 78 70 72 65 73 73 69 6f 6e 73 2e 20 49 66 20 69  xpressions. If i
6d90: 74 20 0a 20 20 23 20 63 6f 6e 74 61 69 6e 73 20  t .  # contains 
6da0: 22 45 58 50 52 22 2c 20 74 68 65 6e 20 72 65 70  "EXPR", then rep
6db0: 6c 61 63 65 20 45 58 50 52 20 77 69 74 68 20 61  lace EXPR with a
6dc0: 6e 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 20  n arbitrary SQL 
6dd0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 23 20  expression..  # 
6de0: 0a 20 20 73 65 74 20 65 6c 69 73 74 20 5b 6c 69  .  set elist [li
6df0: 73 74 20 24 65 78 70 72 5d 0a 20 20 69 66 20 7b  st $expr].  if {
6e00: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 45  [string match *E
6e10: 58 50 52 32 2a 20 24 65 78 70 72 5d 7d 20 7b 0a  XPR2* $expr]} {.
6e20: 20 20 20 20 73 65 74 20 65 6c 69 73 74 20 5b 6c      set elist [l
6e30: 69 73 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68  ist].    foreach
6e40: 20 7b 65 31 20 65 32 7d 20 7b 20 63 6e 61 6d 65   {e1 e2} { cname
6e50: 20 22 33 34 2b 32 32 22 20 7d 20 7b 0a 20 20 20   "34+22" } {.   
6e60: 20 20 20 6c 61 70 70 65 6e 64 20 65 6c 69 73 74     lappend elist
6e70: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
6e80: 73 74 20 45 58 50 52 31 20 24 65 31 20 45 58 50  st EXPR1 $e1 EXP
6e90: 52 32 20 24 65 32 5d 20 24 65 78 70 72 5d 0a 20  R2 $e2] $expr]. 
6ea0: 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 20 7b     }.  } .  if {
6eb0: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 45  [string match *E
6ec0: 58 50 52 2a 20 24 65 78 70 72 5d 7d 20 7b 0a 20  XPR* $expr]} {. 
6ed0: 20 20 20 73 65 74 20 65 6c 69 73 74 32 20 5b 6c     set elist2 [l
6ee0: 69 73 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68  ist].    foreach
6ef0: 20 65 6c 20 24 65 6c 69 73 74 20 7b 0a 20 20 20   el $elist {.   
6f00: 20 20 20 66 6f 72 65 61 63 68 20 65 20 7b 20 63     foreach e { c
6f10: 6e 61 6d 65 20 22 33 34 2b 32 32 22 20 7d 20 7b  name "34+22" } {
6f20: 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
6f30: 20 65 6c 69 73 74 32 20 5b 73 74 72 69 6e 67 20   elist2 [string 
6f40: 6d 61 70 20 5b 6c 69 73 74 20 45 58 50 52 20 24  map [list EXPR $
6f50: 65 5d 20 24 65 6c 5d 0a 20 20 20 20 20 20 7d 0a  e] $el].      }.
6f60: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 65 6c      }.    set el
6f70: 69 73 74 20 24 65 6c 69 73 74 32 0a 20 20 7d 0a  ist $elist2.  }.
6f80: 0a 20 20 73 65 74 20 78 20 30 0a 20 20 66 6f 72  .  set x 0.  for
6f90: 65 61 63 68 20 65 20 24 65 6c 69 73 74 20 7b 0a  each e $elist {.
6fa0: 20 20 20 20 69 6e 63 72 20 78 0a 20 20 20 20 64      incr x.    d
6fb0: 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  o_test e_expr-12
6fc0: 2e 33 2e 24 74 6e 2e 24 78 20 7b 20 0a 20 20 20  .3.$tn.$x { .   
6fd0: 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68     set rc [catch
6fe0: 20 7b 20 65 78 65 63 73 71 6c 20 22 53 45 4c 45   { execsql "SELE
6ff0: 43 54 20 24 65 20 46 52 4f 4d 20 74 62 6c 6e 61  CT $e FROM tblna
7000: 6d 65 22 20 7d 20 6d 73 67 5d 0a 20 20 20 20 7d  me" } msg].    }
7010: 20 7b 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56   {0}.  }.}..# EV
7020: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 34  IDENCE-OF: R-494
7030: 36 32 2d 35 36 30 37 39 20 2d 2d 20 73 79 6e 74  62-56079 -- synt
7040: 61 78 20 64 69 61 67 72 61 6d 20 72 61 69 73 65  ax diagram raise
7050: 2d 66 75 6e 63 74 69 6f 6e 0a 23 0a 66 6f 72 65  -function.#.fore
7060: 61 63 68 20 7b 74 6e 20 72 61 69 73 65 65 78 70  ach {tn raiseexp
7070: 72 7d 20 7b 0a 20 20 31 20 22 52 41 49 53 45 28  r} {.  1 "RAISE(
7080: 49 47 4e 4f 52 45 29 22 0a 20 20 32 20 22 52 41  IGNORE)".  2 "RA
7090: 49 53 45 28 52 4f 4c 4c 42 41 43 4b 2c 20 27 65  ISE(ROLLBACK, 'e
70a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 27 29 22 0a  rror message')".
70b0: 20 20 33 20 22 52 41 49 53 45 28 41 42 4f 52 54    3 "RAISE(ABORT
70c0: 2c 20 27 65 72 72 6f 72 20 6d 65 73 73 61 67 65  , 'error message
70d0: 27 29 22 0a 20 20 34 20 22 52 41 49 53 45 28 46  ')".  4 "RAISE(F
70e0: 41 49 4c 2c 20 27 65 72 72 6f 72 20 6d 65 73 73  AIL, 'error mess
70f0: 61 67 65 27 29 22 0a 7d 20 7b 0a 20 20 64 6f 5f  age')".} {.  do_
7100: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7110: 78 70 72 2d 31 32 2e 34 2e 24 74 6e 20 22 0a 20  xpr-12.4.$tn ". 
7120: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
7130: 52 20 64 62 6e 61 6d 65 2e 74 72 24 74 6e 20 42  R dbname.tr$tn B
7140: 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20  EFORE DELETE ON 
7150: 74 62 6c 6e 61 6d 65 20 42 45 47 49 4e 0a 20 20  tblname BEGIN.  
7160: 20 20 20 20 53 45 4c 45 43 54 20 24 72 61 69 73      SELECT $rais
7170: 65 65 78 70 72 20 3b 0a 20 20 20 20 45 4e 44 3b  eexpr ;.    END;
7180: 0a 20 20 22 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  .  " {}.}..#----
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71d0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65  -----.# Test the
71e0: 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65 6c 61   statements rela
71f0: 74 65 64 20 74 6f 20 74 68 65 20 42 45 54 57 45  ted to the BETWE
7200: 45 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 23  EN operator..#.#
7210: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
7220: 34 30 30 37 39 2d 35 34 35 30 33 20 54 68 65 20  40079-54503 The 
7230: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
7240: 20 69 73 20 6c 6f 67 69 63 61 6c 6c 79 0a 23 20   is logically.# 
7250: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 20  equivalent to a 
7260: 70 61 69 72 20 6f 66 20 63 6f 6d 70 61 72 69 73  pair of comparis
7270: 6f 6e 73 2e 20 22 78 20 42 45 54 57 45 45 4e 20  ons. "x BETWEEN 
7280: 79 20 41 4e 44 20 7a 22 20 69 73 20 65 71 75 69  y AND z" is equi
7290: 76 61 6c 65 6e 74 0a 23 20 74 6f 20 22 78 3e 3d  valent.# to "x>=
72a0: 79 20 41 4e 44 20 78 3c 3d 7a 22 20 65 78 63 65  y AND x<=z" exce
72b0: 70 74 20 74 68 61 74 20 77 69 74 68 20 42 45 54  pt that with BET
72c0: 57 45 45 4e 2c 20 74 68 65 20 78 20 65 78 70 72  WEEN, the x expr
72d0: 65 73 73 69 6f 6e 20 69 73 0a 23 20 6f 6e 6c 79  ession is.# only
72e0: 20 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 2e   evaluated once.
72f0: 0a 23 0a 64 62 20 66 75 6e 63 20 78 20 78 0a 70  .#.db func x x.p
7300: 72 6f 63 20 78 20 7b 7d 20 7b 20 69 6e 63 72 20  roc x {} { incr 
7310: 3a 3a 78 63 6f 75 6e 74 20 3b 20 72 65 74 75 72  ::xcount ; retur
7320: 6e 20 5b 65 78 70 72 20 24 3a 3a 78 5d 20 7d 0a  n [expr $::x] }.
7330: 66 6f 72 65 61 63 68 20 7b 74 6e 20 78 20 65 78  foreach {tn x ex
7340: 70 72 20 72 65 73 20 6e 45 76 61 6c 7d 20 7b 0a  pr res nEval} {.
7350: 20 20 31 20 20 31 30 20 20 22 78 28 29 20 3e 3d    1  10  "x() >=
7360: 20 35 20 41 4e 44 20 78 28 29 20 3c 3d 20 31 35   5 AND x() <= 15
7370: 22 20 20 31 20 20 32 0a 20 20 32 20 20 31 30 20  "  1  2.  2  10 
7380: 20 22 78 28 29 20 42 45 54 57 45 45 4e 20 35 20   "x() BETWEEN 5 
7390: 41 4e 44 20 31 35 22 20 20 20 20 31 20 20 31 0a  AND 15"    1  1.
73a0: 0a 20 20 33 20 20 20 35 20 20 22 78 28 29 20 3e  .  3   5  "x() >
73b0: 3d 20 35 20 41 4e 44 20 78 28 29 20 3c 3d 20 35  = 5 AND x() <= 5
73c0: 22 20 20 20 31 20 20 32 0a 20 20 34 20 20 20 35  "   1  2.  4   5
73d0: 20 20 22 78 28 29 20 42 45 54 57 45 45 4e 20 35    "x() BETWEEN 5
73e0: 20 41 4e 44 20 35 22 20 20 20 20 20 31 20 20 31   AND 5"     1  1
73f0: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65  .} {.  do_test e
7400: 5f 65 78 70 72 2d 31 33 2e 31 2e 24 74 6e 20 7b  _expr-13.1.$tn {
7410: 0a 20 20 20 20 73 65 74 20 3a 3a 78 63 6f 75 6e  .    set ::xcoun
7420: 74 20 30 0a 20 20 20 20 73 65 74 20 61 20 5b 65  t 0.    set a [e
7430: 78 65 63 73 71 6c 20 22 53 45 4c 45 43 54 20 24  xecsql "SELECT $
7440: 65 78 70 72 22 5d 0a 20 20 20 20 6c 69 73 74 20  expr"].    list 
7450: 24 3a 3a 78 63 6f 75 6e 74 20 24 61 0a 20 20 7d  $::xcount $a.  }
7460: 20 5b 6c 69 73 74 20 24 6e 45 76 61 6c 20 24 72   [list $nEval $r
7470: 65 73 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  es].}..# EVIDENC
7480: 45 2d 4f 46 3a 20 52 2d 30 35 31 35 35 2d 33 34  E-OF: R-05155-34
7490: 34 35 34 20 54 68 65 20 70 72 65 63 65 64 65 6e  454 The preceden
74a0: 63 65 20 6f 66 20 74 68 65 20 42 45 54 57 45 45  ce of the BETWEE
74b0: 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 0a 23 20  N operator is.# 
74c0: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
74d0: 70 72 65 63 65 64 65 6e 63 65 20 61 73 20 6f 70  precedence as op
74e0: 65 72 61 74 6f 72 73 20 3d 3d 20 61 6e 64 20 21  erators == and !
74f0: 3d 20 61 6e 64 20 4c 49 4b 45 20 61 6e 64 20 67  = and LIKE and g
7500: 72 6f 75 70 73 0a 23 20 6c 65 66 74 20 74 6f 20  roups.# left to 
7510: 72 69 67 68 74 2e 0a 23 20 0a 23 20 54 68 65 72  right..# .# Ther
7520: 65 66 6f 72 65 2c 20 42 45 54 57 45 45 4e 20 67  efore, BETWEEN g
7530: 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74  roups more tight
7540: 6c 79 20 74 68 61 6e 20 6f 70 65 72 61 74 6f 72  ly than operator
7550: 20 22 41 4e 44 22 2c 20 62 75 74 20 6c 65 73 73   "AND", but less
7560: 0a 23 20 73 6f 20 74 68 61 6e 20 22 3c 22 2e 0a  .# so than "<"..
7570: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
7580: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 20  t e_expr-13.2.1 
7590: 20 7b 20 53 45 4c 45 43 54 20 31 20 3d 3d 20 31   { SELECT 1 == 1
75a0: 30 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20  0 BETWEEN 0 AND 
75b0: 32 20 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63  2   }  1.do_exec
75c0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
75d0: 31 33 2e 32 2e 32 20 20 7b 20 53 45 4c 45 43 54  13.2.2  { SELECT
75e0: 20 28 31 20 3d 3d 20 31 30 29 20 42 45 54 57 45   (1 == 10) BETWE
75f0: 45 4e 20 30 20 41 4e 44 20 32 20 7d 20 20 31 0a  EN 0 AND 2 }  1.
7600: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7610: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 33 20 20 7b  e_expr-13.2.3  {
7620: 20 53 45 4c 45 43 54 20 31 20 3d 3d 20 28 31 30   SELECT 1 == (10
7630: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
7640: 29 20 7d 20 20 30 0a 64 6f 5f 65 78 65 63 73 71  ) }  0.do_execsq
7650: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7660: 2e 32 2e 34 20 20 7b 20 53 45 4c 45 43 54 20 20  .2.4  { SELECT  
7670: 36 20 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20  6 BETWEEN 4 AND 
7680: 38 20 3d 3d 20 31 20 7d 20 20 20 20 31 0a 64 6f  8 == 1 }    1.do
7690: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
76a0: 65 78 70 72 2d 31 33 2e 32 2e 35 20 20 7b 20 53  expr-13.2.5  { S
76b0: 45 4c 45 43 54 20 28 36 20 42 45 54 57 45 45 4e  ELECT (6 BETWEEN
76c0: 20 34 20 41 4e 44 20 38 29 20 3d 3d 20 31 20 7d   4 AND 8) == 1 }
76d0: 20 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f     1.do_execsql_
76e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
76f0: 2e 36 20 20 7b 20 53 45 4c 45 43 54 20 20 36 20  .6  { SELECT  6 
7700: 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20 28 38  BETWEEN 4 AND (8
7710: 20 3d 3d 20 31 29 20 7d 20 20 30 0a 0a 64 6f 5f   == 1) }  0..do_
7720: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7730: 78 70 72 2d 31 33 2e 32 2e 37 20 20 7b 20 53 45  xpr-13.2.7  { SE
7740: 4c 45 43 54 20 20 35 20 42 45 54 57 45 45 4e 20  LECT  5 BETWEEN 
7750: 30 20 41 4e 44 20 30 20 20 21 3d 20 31 20 7d 20  0 AND 0  != 1 } 
7760: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
7770: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
7780: 38 20 20 7b 20 53 45 4c 45 43 54 20 28 35 20 42  8  { SELECT (5 B
7790: 45 54 57 45 45 4e 20 30 20 41 4e 44 20 30 29 20  ETWEEN 0 AND 0) 
77a0: 21 3d 20 31 20 7d 20 20 20 31 0a 64 6f 5f 65 78  != 1 }   1.do_ex
77b0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
77c0: 72 2d 31 33 2e 32 2e 39 20 20 7b 20 53 45 4c 45  r-13.2.9  { SELE
77d0: 43 54 20 20 35 20 42 45 54 57 45 45 4e 20 30 20  CT  5 BETWEEN 0 
77e0: 41 4e 44 20 28 30 20 21 3d 20 31 29 20 7d 20 20  AND (0 != 1) }  
77f0: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
7800: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 30  t e_expr-13.2.10
7810: 20 7b 20 53 45 4c 45 43 54 20 20 31 20 21 3d 20   { SELECT  1 != 
7820: 30 20 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44  0  BETWEEN 0 AND
7830: 20 32 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63   2  }  1.do_exec
7840: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
7850: 31 33 2e 32 2e 31 31 20 7b 20 53 45 4c 45 43 54  13.2.11 { SELECT
7860: 20 28 31 20 21 3d 20 30 29 20 42 45 54 57 45 45   (1 != 0) BETWEE
7870: 4e 20 30 20 41 4e 44 20 32 20 20 7d 20 20 31 0a  N 0 AND 2  }  1.
7880: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7890: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 32 20 7b  e_expr-13.2.12 {
78a0: 20 53 45 4c 45 43 54 20 20 31 20 21 3d 20 28 30   SELECT  1 != (0
78b0: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
78c0: 29 20 7d 20 20 30 0a 0a 64 6f 5f 65 78 65 63 73  ) }  0..do_execs
78d0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
78e0: 33 2e 32 2e 31 33 20 7b 20 53 45 4c 45 43 54 20  3.2.13 { SELECT 
78f0: 31 20 4c 49 4b 45 20 31 30 20 42 45 54 57 45 45  1 LIKE 10 BETWEE
7900: 4e 20 30 20 41 4e 44 20 32 20 20 20 7d 20 20 31  N 0 AND 2   }  1
7910: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7920: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 34 20   e_expr-13.2.14 
7930: 7b 20 53 45 4c 45 43 54 20 28 31 20 4c 49 4b 45  { SELECT (1 LIKE
7940: 20 31 30 29 20 42 45 54 57 45 45 4e 20 30 20 41   10) BETWEEN 0 A
7950: 4e 44 20 32 20 7d 20 20 31 0a 64 6f 5f 65 78 65  ND 2 }  1.do_exe
7960: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7970: 2d 31 33 2e 32 2e 31 35 20 7b 20 53 45 4c 45 43  -13.2.15 { SELEC
7980: 54 20 31 20 4c 49 4b 45 20 28 31 30 20 42 45 54  T 1 LIKE (10 BET
7990: 57 45 45 4e 20 30 20 41 4e 44 20 32 29 20 7d 20  WEEN 0 AND 2) } 
79a0: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
79b0: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31  st e_expr-13.2.1
79c0: 36 20 7b 20 53 45 4c 45 43 54 20 20 36 20 42 45  6 { SELECT  6 BE
79d0: 54 57 45 45 4e 20 34 20 41 4e 44 20 38 20 4c 49  TWEEN 4 AND 8 LI
79e0: 4b 45 20 31 20 20 20 7d 20 20 31 0a 64 6f 5f 65  KE 1   }  1.do_e
79f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7a00: 70 72 2d 31 33 2e 32 2e 31 37 20 7b 20 53 45 4c  pr-13.2.17 { SEL
7a10: 45 43 54 20 28 36 20 42 45 54 57 45 45 4e 20 34  ECT (6 BETWEEN 4
7a20: 20 41 4e 44 20 38 29 20 4c 49 4b 45 20 31 20 20   AND 8) LIKE 1  
7a30: 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  }  1.do_execsql_
7a40: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7a50: 2e 31 38 20 7b 20 53 45 4c 45 43 54 20 20 36 20  .18 { SELECT  6 
7a60: 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20 28 38  BETWEEN 4 AND (8
7a70: 20 4c 49 4b 45 20 31 29 20 7d 20 20 30 0a 0a 64   LIKE 1) }  0..d
7a80: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7a90: 5f 65 78 70 72 2d 31 33 2e 32 2e 31 39 20 7b 20  _expr-13.2.19 { 
7aa0: 53 45 4c 45 43 54 20 30 20 41 4e 44 20 30 20 42  SELECT 0 AND 0 B
7ab0: 45 54 57 45 45 4e 20 30 20 41 4e 44 20 31 20 20  ETWEEN 0 AND 1  
7ac0: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
7ad0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7ae0: 2e 32 30 20 7b 20 53 45 4c 45 43 54 20 30 20 41  .20 { SELECT 0 A
7af0: 4e 44 20 28 30 20 42 45 54 57 45 45 4e 20 30 20  ND (0 BETWEEN 0 
7b00: 41 4e 44 20 31 29 20 7d 20 30 0a 64 6f 5f 65 78  AND 1) } 0.do_ex
7b10: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7b20: 72 2d 31 33 2e 32 2e 32 31 20 7b 20 53 45 4c 45  r-13.2.21 { SELE
7b30: 43 54 20 28 30 20 41 4e 44 20 30 29 20 42 45 54  CT (0 AND 0) BET
7b40: 57 45 45 4e 20 30 20 41 4e 44 20 31 20 7d 20 31  WEEN 0 AND 1 } 1
7b50: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7b60: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 32 20   e_expr-13.2.22 
7b70: 7b 20 53 45 4c 45 43 54 20 30 20 42 45 54 57 45  { SELECT 0 BETWE
7b80: 45 4e 20 2d 31 20 41 4e 44 20 31 20 41 4e 44 20  EN -1 AND 1 AND 
7b90: 30 20 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  0   } 0.do_execs
7ba0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7bb0: 33 2e 32 2e 32 33 20 7b 20 53 45 4c 45 43 54 20  3.2.23 { SELECT 
7bc0: 28 30 20 42 45 54 57 45 45 4e 20 2d 31 20 41 4e  (0 BETWEEN -1 AN
7bd0: 44 20 31 29 20 41 4e 44 20 30 20 7d 20 30 0a 64  D 1) AND 0 } 0.d
7be0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7bf0: 5f 65 78 70 72 2d 31 33 2e 32 2e 32 34 20 7b 20  _expr-13.2.24 { 
7c00: 53 45 4c 45 43 54 20 30 20 42 45 54 57 45 45 4e  SELECT 0 BETWEEN
7c10: 20 2d 31 20 41 4e 44 20 28 31 20 41 4e 44 20 30   -1 AND (1 AND 0
7c20: 29 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71  ) } 1..do_execsq
7c30: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7c40: 2e 32 2e 32 35 20 7b 20 53 45 4c 45 43 54 20 32  .2.25 { SELECT 2
7c50: 20 3c 20 33 20 42 45 54 57 45 45 4e 20 30 20 41   < 3 BETWEEN 0 A
7c60: 4e 44 20 31 20 20 20 7d 20 31 0a 64 6f 5f 65 78  ND 1   } 1.do_ex
7c70: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7c80: 72 2d 31 33 2e 32 2e 32 36 20 7b 20 53 45 4c 45  r-13.2.26 { SELE
7c90: 43 54 20 28 32 20 3c 20 33 29 20 42 45 54 57 45  CT (2 < 3) BETWE
7ca0: 45 4e 20 30 20 41 4e 44 20 31 20 7d 20 31 0a 64  EN 0 AND 1 } 1.d
7cb0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7cc0: 5f 65 78 70 72 2d 31 33 2e 32 2e 32 37 20 7b 20  _expr-13.2.27 { 
7cd0: 53 45 4c 45 43 54 20 32 20 3c 20 28 33 20 42 45  SELECT 2 < (3 BE
7ce0: 54 57 45 45 4e 20 30 20 41 4e 44 20 31 29 20 7d  TWEEN 0 AND 1) }
7cf0: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
7d00: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32  st e_expr-13.2.2
7d10: 38 20 7b 20 53 45 4c 45 43 54 20 32 20 42 45 54  8 { SELECT 2 BET
7d20: 57 45 45 4e 20 31 20 41 4e 44 20 32 20 3c 20 33  WEEN 1 AND 2 < 3
7d30: 20 20 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73      } 0.do_execs
7d40: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7d50: 33 2e 32 2e 32 39 20 7b 20 53 45 4c 45 43 54 20  3.2.29 { SELECT 
7d60: 32 20 42 45 54 57 45 45 4e 20 31 20 41 4e 44 20  2 BETWEEN 1 AND 
7d70: 28 32 20 3c 20 33 29 20 20 7d 20 30 0a 64 6f 5f  (2 < 3)  } 0.do_
7d80: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7d90: 78 70 72 2d 31 33 2e 32 2e 33 30 20 7b 20 53 45  xpr-13.2.30 { SE
7da0: 4c 45 43 54 20 28 32 20 42 45 54 57 45 45 4e 20  LECT (2 BETWEEN 
7db0: 31 20 41 4e 44 20 32 29 20 3c 20 33 20 20 7d 20  1 AND 2) < 3  } 
7dc0: 31 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  1..#------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
7e10: 54 65 73 74 20 74 68 65 20 73 74 61 74 65 6d 65  Test the stateme
7e20: 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  nts related to t
7e30: 68 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  he LIKE and GLOB
7e40: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 23 0a 23 20   operators..#.# 
7e50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
7e60: 36 35 38 34 2d 36 30 31 38 39 20 54 68 65 20 4c  6584-60189 The L
7e70: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 64 6f 65  IKE operator doe
7e80: 73 20 61 20 70 61 74 74 65 72 6e 20 6d 61 74 63  s a pattern matc
7e90: 68 69 6e 67 0a 23 20 63 6f 6d 70 61 72 69 73 6f  hing.# compariso
7ea0: 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  n..#.# EVIDENCE-
7eb0: 4f 46 3a 20 52 2d 31 31 32 39 35 2d 30 34 36 35  OF: R-11295-0465
7ec0: 37 20 54 68 65 20 6f 70 65 72 61 6e 64 20 74 6f  7 The operand to
7ed0: 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
7ee0: 65 20 4c 49 4b 45 0a 23 20 6f 70 65 72 61 74 6f  e LIKE.# operato
7ef0: 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  r contains the p
7f00: 61 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20 6c  attern and the l
7f10: 65 66 74 20 68 61 6e 64 20 6f 70 65 72 61 6e 64  eft hand operand
7f20: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 23 20   contains the.# 
7f30: 73 74 72 69 6e 67 20 74 6f 20 6d 61 74 63 68 20  string to match 
7f40: 61 67 61 69 6e 73 74 20 74 68 65 20 70 61 74 74  against the patt
7f50: 65 72 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ern..#.do_execsq
7f60: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
7f70: 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61  .1.1 { SELECT 'a
7f80: 62 63 25 27 20 4c 49 4b 45 20 27 61 62 63 64 65  bc%' LIKE 'abcde
7f90: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
7fa0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
7fb0: 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.2 { SELECT 'ab
7fc0: 63 64 65 27 20 4c 49 4b 45 20 27 61 62 63 25 27  cde' LIKE 'abc%'
7fd0: 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43 45   } 1..# EVIDENCE
7fe0: 2d 4f 46 3a 20 52 2d 35 35 34 30 36 2d 33 38 35  -OF: R-55406-385
7ff0: 32 34 20 41 20 70 65 72 63 65 6e 74 20 73 79 6d  24 A percent sym
8000: 62 6f 6c 20 28 22 25 22 29 20 69 6e 20 74 68 65  bol ("%") in the
8010: 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 0a 23 20   LIKE pattern.# 
8020: 6d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  matches any sequ
8030: 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20  ence of zero or 
8040: 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 20  more characters 
8050: 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 23  in the string..#
8060: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8070: 20 65 5f 65 78 70 72 2d 31 34 2e 32 2e 31 20 7b   e_expr-14.2.1 {
8080: 20 53 45 4c 45 43 54 20 27 61 62 64 65 27 20 20   SELECT 'abde'  
8090: 20 20 4c 49 4b 45 20 27 61 62 25 64 65 27 20 7d    LIKE 'ab%de' }
80a0: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
80b0: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 32 2e 32  st e_expr-14.2.2
80c0: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 58 64 65   { SELECT 'abXde
80d0: 27 20 20 20 4c 49 4b 45 20 27 61 62 25 64 65 27  '   LIKE 'ab%de'
80e0: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
80f0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 32  test e_expr-14.2
8100: 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62 41  .3 { SELECT 'abA
8110: 42 43 64 65 27 20 4c 49 4b 45 20 27 61 62 25 64  BCde' LIKE 'ab%d
8120: 65 27 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e  e' } 1..# EVIDEN
8130: 43 45 2d 4f 46 3a 20 52 2d 33 30 34 33 33 2d 32  CE-OF: R-30433-2
8140: 35 34 34 33 20 41 6e 20 75 6e 64 65 72 73 63 6f  5443 An undersco
8150: 72 65 20 28 22 5f 22 29 20 69 6e 20 74 68 65 20  re ("_") in the 
8160: 4c 49 4b 45 20 70 61 74 74 65 72 6e 0a 23 20 6d  LIKE pattern.# m
8170: 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c  atches any singl
8180: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74  e character in t
8190: 68 65 20 73 74 72 69 6e 67 2e 0a 23 0a 64 6f 5f  he string..#.do_
81a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
81b0: 78 70 72 2d 31 34 2e 33 2e 31 20 7b 20 53 45 4c  xpr-14.3.1 { SEL
81c0: 45 43 54 20 27 61 62 64 65 27 20 20 20 20 4c 49  ECT 'abde'    LI
81d0: 4b 45 20 27 61 62 5f 64 65 27 20 7d 20 30 0a 64  KE 'ab_de' } 0.d
81e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
81f0: 5f 65 78 70 72 2d 31 34 2e 33 2e 32 20 7b 20 53  _expr-14.3.2 { S
8200: 45 4c 45 43 54 20 27 61 62 58 64 65 27 20 20 20  ELECT 'abXde'   
8210: 4c 49 4b 45 20 27 61 62 5f 64 65 27 20 7d 20 31  LIKE 'ab_de' } 1
8220: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8230: 20 65 5f 65 78 70 72 2d 31 34 2e 33 2e 33 20 7b   e_expr-14.3.3 {
8240: 20 53 45 4c 45 43 54 20 27 61 62 41 42 43 64 65   SELECT 'abABCde
8250: 27 20 4c 49 4b 45 20 27 61 62 5f 64 65 27 20 7d  ' LIKE 'ab_de' }
8260: 20 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f   0..# EVIDENCE-O
8270: 46 3a 20 52 2d 35 39 30 30 37 2d 32 30 34 35 34  F: R-59007-20454
8280: 20 41 6e 79 20 6f 74 68 65 72 20 63 68 61 72 61   Any other chara
8290: 63 74 65 72 20 6d 61 74 63 68 65 73 20 69 74 73  cter matches its
82a0: 65 6c 66 20 6f 72 20 69 74 73 0a 23 20 6c 6f 77  elf or its.# low
82b0: 65 72 2f 75 70 70 65 72 20 63 61 73 65 20 65 71  er/upper case eq
82c0: 75 69 76 61 6c 65 6e 74 20 28 69 2e 65 2e 20 63  uivalent (i.e. c
82d0: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
82e0: 6d 61 74 63 68 69 6e 67 29 2e 0a 23 0a 64 6f 5f  matching)..#.do_
82f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8300: 78 70 72 2d 31 34 2e 34 2e 31 20 7b 20 53 45 4c  xpr-14.4.1 { SEL
8310: 45 43 54 20 27 61 62 63 27 20 4c 49 4b 45 20 27  ECT 'abc' LIKE '
8320: 61 42 63 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63  aBc' } 1.do_exec
8330: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
8340: 31 34 2e 34 2e 32 20 7b 20 53 45 4c 45 43 54 20  14.4.2 { SELECT 
8350: 27 61 42 63 27 20 4c 49 4b 45 20 27 61 42 63 27  'aBc' LIKE 'aBc'
8360: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
8370: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 34  test e_expr-14.4
8380: 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 63 27  .3 { SELECT 'ac'
8390: 20 20 4c 49 4b 45 20 27 61 42 63 27 20 7d 20 30    LIKE 'aBc' } 0
83a0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
83b0: 20 52 2d 32 33 36 34 38 2d 35 38 35 32 37 20 53   R-23648-58527 S
83c0: 51 4c 69 74 65 20 6f 6e 6c 79 20 75 6e 64 65 72  QLite only under
83d0: 73 74 61 6e 64 73 20 75 70 70 65 72 2f 6c 6f 77  stands upper/low
83e0: 65 72 20 63 61 73 65 0a 23 20 66 6f 72 20 41 53  er case.# for AS
83f0: 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20 62  CII characters b
8400: 79 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45  y default..#.# E
8410: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34  VIDENCE-OF: R-04
8420: 35 33 32 2d 31 31 35 32 37 20 54 68 65 20 4c 49  532-11527 The LI
8430: 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63  KE operator is c
8440: 61 73 65 20 73 65 6e 73 69 74 69 76 65 20 62 79  ase sensitive by
8450: 0a 23 20 64 65 66 61 75 6c 74 20 66 6f 72 20 75  .# default for u
8460: 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72  nicode character
8470: 73 20 74 68 61 74 20 61 72 65 20 62 65 79 6f 6e  s that are beyon
8480: 64 20 74 68 65 20 41 53 43 49 49 20 72 61 6e 67  d the ASCII rang
8490: 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  e..#.# EVIDENCE-
84a0: 4f 46 3a 20 52 2d 34 34 33 38 31 2d 31 31 36 36  OF: R-44381-1166
84b0: 39 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  9 the expression
84c0: 0a 23 20 27 61 27 26 6e 62 73 70 3b 4c 49 4b 45  .# 'a'&nbsp;LIKE
84d0: 26 6e 62 73 70 3b 27 41 27 20 69 73 20 54 52 55  &nbsp;'A' is TRU
84e0: 45 20 62 75 74 0a 23 20 27 26 61 65 6c 69 67 3b  E but.# '&aelig;
84f0: 27 26 6e 62 73 70 3b 4c 49 4b 45 26 6e 62 73 70  '&nbsp;LIKE&nbsp
8500: 3b 27 26 41 45 6c 69 67 3b 27 20 69 73 20 46 41  ;'&AElig;' is FA
8510: 4c 53 45 2e 0a 23 0a 23 20 20 20 54 68 65 20 72  LSE..#.#   The r
8520: 65 73 74 72 69 63 74 69 6f 6e 20 74 6f 20 41 53  estriction to AS
8530: 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20 64  CII characters d
8540: 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79 20 69 66  oes not apply if
8550: 20 74 68 65 20 49 43 55 0a 23 20 20 20 6c 69 62   the ICU.#   lib
8560: 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64  rary is compiled
8570: 20 69 6e 2e 20 57 68 65 6e 20 49 43 55 20 69 73   in. When ICU is
8580: 20 65 6e 61 62 6c 65 64 20 53 51 4c 69 74 65 20   enabled SQLite 
8590: 64 6f 65 73 20 6e 6f 74 20 61 63 74 0a 23 20 20  does not act.#  
85a0: 20 61 73 20 69 74 20 64 6f 65 73 20 22 62 79 20   as it does "by 
85b0: 64 65 66 61 75 6c 74 22 2e 0a 23 0a 64 6f 5f 65  default"..#.do_e
85c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
85d0: 70 72 2d 31 34 2e 35 2e 31 20 7b 20 53 45 4c 45  pr-14.5.1 { SELE
85e0: 43 54 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20  CT 'A' LIKE 'a' 
85f0: 20 20 20 20 20 20 20 20 7d 20 31 0a 69 66 63 61          } 1.ifca
8600: 70 61 62 6c 65 20 21 69 63 75 20 7b 0a 20 20 64  pable !icu {.  d
8610: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8620: 5f 65 78 70 72 2d 31 34 2e 35 2e 32 20 22 53 45  _expr-14.5.2 "SE
8630: 4c 45 43 54 20 27 5c 75 30 30 63 36 27 20 4c 49  LECT '\u00c6' LI
8640: 4b 45 20 27 5c 75 30 30 65 36 27 22 20 30 0a 7d  KE '\u00e6'" 0.}
8650: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
8660: 20 52 2d 35 36 36 38 33 2d 31 33 37 33 31 20 49   R-56683-13731 I
8670: 66 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 45  f the optional E
8680: 53 43 41 50 45 20 63 6c 61 75 73 65 20 69 73 20  SCAPE clause is 
8690: 70 72 65 73 65 6e 74 2c 0a 23 20 74 68 65 6e 20  present,.# then 
86a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66  the expression f
86b0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 45 53 43  ollowing the ESC
86c0: 41 50 45 20 6b 65 79 77 6f 72 64 20 6d 75 73 74  APE keyword must
86d0: 20 65 76 61 6c 75 61 74 65 20 74 6f 20 61 0a 23   evaluate to a.#
86e0: 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69   string consisti
86f0: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63  ng of a single c
8700: 68 61 72 61 63 74 65 72 2e 0a 23 0a 64 6f 5f 63  haracter..#.do_c
8710: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65  atchsql_test e_e
8720: 78 70 72 2d 31 34 2e 36 2e 31 20 7b 20 0a 20 20  xpr-14.6.1 { .  
8730: 53 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20  SELECT 'A' LIKE 
8740: 27 61 27 20 45 53 43 41 50 45 20 27 31 32 27 20  'a' ESCAPE '12' 
8750: 0a 7d 20 7b 31 20 7b 45 53 43 41 50 45 20 65 78  .} {1 {ESCAPE ex
8760: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
8770: 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63   a single charac
8780: 74 65 72 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71  ter}}.do_catchsq
8790: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
87a0: 2e 36 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54  .6.2 { .  SELECT
87b0: 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53   'A' LIKE 'a' ES
87c0: 43 41 50 45 20 27 27 20 0a 7d 20 7b 31 20 7b 45  CAPE '' .} {1 {E
87d0: 53 43 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e  SCAPE expression
87e0: 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c   must be a singl
87f0: 65 20 63 68 61 72 61 63 74 65 72 7d 7d 0a 64 6f  e character}}.do
8800: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
8810: 5f 65 78 70 72 2d 31 34 2e 36 2e 33 20 7b 20 53  _expr-14.6.3 { S
8820: 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20 27  ELECT 'A' LIKE '
8830: 61 27 20 45 53 43 41 50 45 20 27 78 27 20 7d 20  a' ESCAPE 'x' } 
8840: 20 20 20 7b 30 20 31 7d 0a 64 6f 5f 63 61 74 63     {0 1}.do_catc
8850: 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  hsql_test e_expr
8860: 2d 31 34 2e 36 2e 34 20 22 53 45 4c 45 43 54 20  -14.6.4 "SELECT 
8870: 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53 43  'A' LIKE 'a' ESC
8880: 41 50 45 20 27 5c 75 30 30 65 36 27 22 20 7b 30  APE '\u00e6'" {0
8890: 20 31 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   1}..# EVIDENCE-
88a0: 4f 46 3a 20 52 2d 30 32 30 34 35 2d 32 33 37 36  OF: R-02045-2376
88b0: 32 20 54 68 69 73 20 63 68 61 72 61 63 74 65 72  2 This character
88c0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 69 6e 20   may be used in 
88d0: 74 68 65 20 4c 49 4b 45 0a 23 20 70 61 74 74 65  the LIKE.# patte
88e0: 72 6e 20 74 6f 20 69 6e 63 6c 75 64 65 20 6c 69  rn to include li
88f0: 74 65 72 61 6c 20 70 65 72 63 65 6e 74 20 6f 72  teral percent or
8900: 20 75 6e 64 65 72 73 63 6f 72 65 20 63 68 61 72   underscore char
8910: 61 63 74 65 72 73 2e 0a 23 0a 23 20 45 56 49 44  acters..#.# EVID
8920: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 33 34 35  ENCE-OF: R-13345
8930: 2d 33 31 38 33 30 20 54 68 65 20 65 73 63 61 70  -31830 The escap
8940: 65 20 63 68 61 72 61 63 74 65 72 20 66 6f 6c 6c  e character foll
8950: 6f 77 65 64 20 62 79 20 61 20 70 65 72 63 65 6e  owed by a percen
8960: 74 0a 23 20 73 79 6d 62 6f 6c 20 28 25 29 2c 20  t.# symbol (%), 
8970: 75 6e 64 65 72 73 63 6f 72 65 20 28 5f 29 2c 20  underscore (_), 
8980: 6f 72 20 61 20 73 65 63 6f 6e 64 20 69 6e 73 74  or a second inst
8990: 61 6e 63 65 20 6f 66 20 74 68 65 20 65 73 63 61  ance of the esca
89a0: 70 65 0a 23 20 63 68 61 72 61 63 74 65 72 20 69  pe.# character i
89b0: 74 73 65 6c 66 20 6d 61 74 63 68 65 73 20 61 20  tself matches a 
89c0: 6c 69 74 65 72 61 6c 20 70 65 72 63 65 6e 74 20  literal percent 
89d0: 73 79 6d 62 6f 6c 2c 20 75 6e 64 65 72 73 63 6f  symbol, undersco
89e0: 72 65 2c 20 6f 72 20 61 0a 23 20 73 69 6e 67 6c  re, or a.# singl
89f0: 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74  e escape charact
8a00: 65 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  er, respectively
8a10: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
8a20: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e  est e_expr-14.7.
8a30: 31 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  1  { SELECT 'abc
8a40: 25 27 20 20 4c 49 4b 45 20 27 61 62 63 58 25 27  %'  LIKE 'abcX%'
8a50: 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 31 0a   ESCAPE 'X' } 1.
8a60: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8a70: 65 5f 65 78 70 72 2d 31 34 2e 37 2e 32 20 20 7b  e_expr-14.7.2  {
8a80: 20 53 45 4c 45 43 54 20 27 61 62 63 35 27 20 20   SELECT 'abc5'  
8a90: 4c 49 4b 45 20 27 61 62 63 58 25 27 20 45 53 43  LIKE 'abcX%' ESC
8aa0: 41 50 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65  APE 'X' } 0.do_e
8ab0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8ac0: 70 72 2d 31 34 2e 37 2e 33 20 20 7b 20 53 45 4c  pr-14.7.3  { SEL
8ad0: 45 43 54 20 27 61 62 63 27 20 20 20 4c 49 4b 45  ECT 'abc'   LIKE
8ae0: 20 27 61 62 63 58 25 27 20 45 53 43 41 50 45 20   'abcX%' ESCAPE 
8af0: 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  'X' } 0.do_execs
8b00: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8b10: 34 2e 37 2e 34 20 20 7b 20 53 45 4c 45 43 54 20  4.7.4  { SELECT 
8b20: 27 61 62 63 58 25 27 20 4c 49 4b 45 20 27 61 62  'abcX%' LIKE 'ab
8b30: 63 58 25 27 20 45 53 43 41 50 45 20 27 58 27 20  cX%' ESCAPE 'X' 
8b40: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
8b50: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e  est e_expr-14.7.
8b60: 35 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  5  { SELECT 'abc
8b70: 25 25 27 20 4c 49 4b 45 20 27 61 62 63 58 25 27  %%' LIKE 'abcX%'
8b80: 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a   ESCAPE 'X' } 0.
8b90: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8ba0: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 36 20 20   e_expr-14.7.6  
8bb0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 5f 27 20  { SELECT 'abc_' 
8bc0: 20 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53   LIKE 'abcX_' ES
8bd0: 43 41 50 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f  CAPE 'X' } 1.do_
8be0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8bf0: 78 70 72 2d 31 34 2e 37 2e 37 20 20 7b 20 53 45  xpr-14.7.7  { SE
8c00: 4c 45 43 54 20 27 61 62 63 35 27 20 20 4c 49 4b  LECT 'abc5'  LIK
8c10: 45 20 27 61 62 63 58 5f 27 20 45 53 43 41 50 45  E 'abcX_' ESCAPE
8c20: 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63   'X' } 0.do_exec
8c30: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
8c40: 31 34 2e 37 2e 38 20 20 7b 20 53 45 4c 45 43 54  14.7.8  { SELECT
8c50: 20 27 61 62 63 27 20 20 20 4c 49 4b 45 20 27 61   'abc'   LIKE 'a
8c60: 62 63 58 5f 27 20 45 53 43 41 50 45 20 27 58 27  bcX_' ESCAPE 'X'
8c70: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
8c80: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37  test e_expr-14.7
8c90: 2e 39 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .9  { SELECT 'ab
8ca0: 63 58 5f 27 20 4c 49 4b 45 20 27 61 62 63 58 5f  cX_' LIKE 'abcX_
8cb0: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30  ' ESCAPE 'X' } 0
8cc0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8cd0: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 30 20   e_expr-14.7.10 
8ce0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 5f 5f 27  { SELECT 'abc__'
8cf0: 20 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53   LIKE 'abcX_' ES
8d00: 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 64 6f  CAPE 'X' } 0..do
8d10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8d20: 65 78 70 72 2d 31 34 2e 37 2e 31 31 20 7b 20 53  expr-14.7.11 { S
8d30: 45 4c 45 43 54 20 27 61 62 63 58 27 20 20 4c 49  ELECT 'abcX'  LI
8d40: 4b 45 20 27 61 62 63 58 58 27 20 45 53 43 41 50  KE 'abcXX' ESCAP
8d50: 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f 65 78 65  E 'X' } 1.do_exe
8d60: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
8d70: 2d 31 34 2e 37 2e 31 32 20 7b 20 53 45 4c 45 43  -14.7.12 { SELEC
8d80: 54 20 27 61 62 63 35 27 20 20 4c 49 4b 45 20 27  T 'abc5'  LIKE '
8d90: 61 62 63 58 58 27 20 45 53 43 41 50 45 20 27 58  abcXX' ESCAPE 'X
8da0: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
8db0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
8dc0: 37 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 27 61  7.13 { SELECT 'a
8dd0: 62 63 27 20 20 20 4c 49 4b 45 20 27 61 62 63 58  bc'   LIKE 'abcX
8de0: 58 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20  X' ESCAPE 'X' } 
8df0: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
8e00: 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 34  t e_expr-14.7.14
8e10: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 58 58   { SELECT 'abcXX
8e20: 27 20 4c 49 4b 45 20 27 61 62 63 58 58 27 20 45  ' LIKE 'abcXX' E
8e30: 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 23  SCAPE 'X' } 0..#
8e40: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
8e50: 35 31 33 35 39 2d 31 37 34 39 36 20 54 68 65 20  51359-17496 The 
8e60: 69 6e 66 69 78 20 4c 49 4b 45 20 6f 70 65 72 61  infix LIKE opera
8e70: 74 6f 72 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  tor is implement
8e80: 65 64 20 62 79 0a 23 20 63 61 6c 6c 69 6e 67 20  ed by.# calling 
8e90: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d  the application-
8ea0: 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63  defined SQL func
8eb0: 74 69 6f 6e 73 20 6c 69 6b 65 28 59 2c 58 29 20  tions like(Y,X) 
8ec0: 6f 72 20 6c 69 6b 65 28 59 2c 58 2c 5a 29 2e 0a  or like(Y,X,Z)..
8ed0: 23 0a 70 72 6f 63 20 6c 69 6b 65 66 75 6e 63 20  #.proc likefunc 
8ee0: 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20  {args} {.  eval 
8ef0: 6c 61 70 70 65 6e 64 20 3a 3a 6c 69 6b 65 61 72  lappend ::likear
8f00: 67 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72  gs $args.  retur
8f10: 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 6c 69  n 1.}.db func li
8f20: 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 6c  ke -argcount 2 l
8f30: 69 6b 65 66 75 6e 63 0a 64 62 20 66 75 6e 63 20  ikefunc.db func 
8f40: 6c 69 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 33  like -argcount 3
8f50: 20 6c 69 6b 65 66 75 6e 63 0a 73 65 74 20 3a 3a   likefunc.set ::
8f60: 6c 69 6b 65 61 72 67 73 20 5b 6c 69 73 74 5d 0a  likeargs [list].
8f70: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8f80: 65 5f 65 78 70 72 2d 31 35 2e 31 2e 31 20 7b 20  e_expr-15.1.1 { 
8f90: 53 45 4c 45 43 54 20 27 61 62 63 27 20 4c 49 4b  SELECT 'abc' LIK
8fa0: 45 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74  E 'def' } 1.do_t
8fb0: 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78  est         e_ex
8fc0: 70 72 2d 31 35 2e 31 2e 32 20 7b 20 73 65 74 20  pr-15.1.2 { set 
8fd0: 6c 69 6b 65 61 72 67 73 20 7d 20 7b 64 65 66 20  likeargs } {def 
8fe0: 61 62 63 7d 0a 73 65 74 20 3a 3a 6c 69 6b 65 61  abc}.set ::likea
8ff0: 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  rgs [list].do_ex
9000: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
9010: 72 2d 31 35 2e 31 2e 33 20 7b 20 53 45 4c 45 43  r-15.1.3 { SELEC
9020: 54 20 27 61 62 63 27 20 4c 49 4b 45 20 27 64 65  T 'abc' LIKE 'de
9030: 66 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20  f' ESCAPE 'X' } 
9040: 31 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  1.do_test       
9050: 20 20 65 5f 65 78 70 72 2d 31 35 2e 31 2e 34 20    e_expr-15.1.4 
9060: 7b 20 73 65 74 20 6c 69 6b 65 61 72 67 73 20 7d  { set likeargs }
9070: 20 7b 64 65 66 20 61 62 63 20 58 7d 0a 64 62 20   {def abc X}.db 
9080: 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62  close.sqlite3 db
9090: 20 74 65 73 74 2e 64 62 0a 0a 23 20 45 56 49 44   test.db..# EVID
90a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 38 36 38  ENCE-OF: R-22868
90b0: 2d 32 35 38 38 30 20 54 68 65 20 4c 49 4b 45 20  -25880 The LIKE 
90c0: 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65 20  operator can be 
90d0: 6d 61 64 65 20 63 61 73 65 0a 23 20 73 65 6e 73  made case.# sens
90e0: 69 74 69 76 65 20 75 73 69 6e 67 20 74 68 65 20  itive using the 
90f0: 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c  case_sensitive_l
9100: 69 6b 65 20 70 72 61 67 6d 61 2e 0a 23 0a 64 6f  ike pragma..#.do
9110: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9120: 65 78 70 72 2d 31 36 2e 31 2e 31 20 7b 20 53 45  expr-16.1.1 { SE
9130: 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4c 49  LECT 'abcxyz' LI
9140: 4b 45 20 27 41 42 43 25 27 20 7d 20 31 0a 64 6f  KE 'ABC%' } 1.do
9150: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9160: 65 78 70 72 2d 31 36 2e 31 2e 32 20 7b 20 50 52  expr-16.1.2 { PR
9170: 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74  AGMA case_sensit
9180: 69 76 65 5f 6c 69 6b 65 20 3d 20 31 20 7d 20 7b  ive_like = 1 } {
9190: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
91a0: 74 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 33 20  t e_expr-16.1.3 
91b0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
91c0: 27 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20  ' LIKE 'ABC%' } 
91d0: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
91e0: 74 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 34 20  t e_expr-16.1.4 
91f0: 7b 20 53 45 4c 45 43 54 20 27 41 42 43 78 79 7a  { SELECT 'ABCxyz
9200: 27 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20  ' LIKE 'ABC%' } 
9210: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
9220: 74 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 35 20  t e_expr-16.1.5 
9230: 7b 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65  { PRAGMA case_se
9240: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 20 3d 20 30  nsitive_like = 0
9250: 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   } {}.do_execsql
9260: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e  _test e_expr-16.
9270: 31 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.6 { SELECT 'ab
9280: 63 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25  cxyz' LIKE 'ABC%
9290: 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 1.do_execsql
92a0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e  _test e_expr-16.
92b0: 31 2e 37 20 7b 20 53 45 4c 45 43 54 20 27 41 42  1.7 { SELECT 'AB
92c0: 43 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25  Cxyz' LIKE 'ABC%
92d0: 27 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43  ' } 1..# EVIDENC
92e0: 45 2d 4f 46 3a 20 52 2d 35 32 30 38 37 2d 31 32  E-OF: R-52087-12
92f0: 30 34 33 20 54 68 65 20 47 4c 4f 42 20 6f 70 65  043 The GLOB ope
9300: 72 61 74 6f 72 20 69 73 20 73 69 6d 69 6c 61 72  rator is similar
9310: 20 74 6f 20 4c 49 4b 45 20 62 75 74 0a 23 20 75   to LIKE but.# u
9320: 73 65 73 20 74 68 65 20 55 6e 69 78 20 66 69 6c  ses the Unix fil
9330: 65 20 67 6c 6f 62 62 69 6e 67 20 73 79 6e 74 61  e globbing synta
9340: 78 20 66 6f 72 20 69 74 73 20 77 69 6c 64 63 61  x for its wildca
9350: 72 64 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  rds..#.# EVIDENC
9360: 45 2d 4f 46 3a 20 52 2d 30 39 38 31 33 2d 31 37  E-OF: R-09813-17
9370: 32 37 39 20 41 6c 73 6f 2c 20 47 4c 4f 42 20 69  279 Also, GLOB i
9380: 73 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65  s case sensitive
9390: 2c 20 75 6e 6c 69 6b 65 20 4c 49 4b 45 2e 0a 23  , unlike LIKE..#
93a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
93b0: 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 31 20 7b   e_expr-17.1.1 {
93c0: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
93d0: 20 47 4c 4f 42 20 27 61 62 63 25 27 20 7d 20 30   GLOB 'abc%' } 0
93e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
93f0: 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 32 20 7b   e_expr-17.1.2 {
9400: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
9410: 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20 31   GLOB 'abc*' } 1
9420: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9430: 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 33 20 7b   e_expr-17.1.3 {
9440: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
9450: 20 47 4c 4f 42 20 27 61 62 63 5f 5f 5f 27 20 7d   GLOB 'abc___' }
9460: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
9470: 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 34  st e_expr-17.1.4
9480: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79   { SELECT 'abcxy
9490: 7a 27 20 47 4c 4f 42 20 27 61 62 63 3f 3f 3f 27  z' GLOB 'abc???'
94a0: 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   } 1..do_execsql
94b0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
94c0: 31 2e 35 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.5 { SELECT 'ab
94d0: 63 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 2a  cxyz' GLOB 'abc*
94e0: 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 1.do_execsql
94f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9500: 31 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 41 42  1.6 { SELECT 'AB
9510: 43 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 2a  Cxyz' GLOB 'abc*
9520: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
9530: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9540: 31 2e 37 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.7 { SELECT 'ab
9550: 63 78 79 7a 27 20 47 4c 4f 42 20 27 41 42 43 2a  cxyz' GLOB 'ABC*
9560: 27 20 7d 20 30 0a 0a 23 20 45 56 49 44 45 4e 43  ' } 0..# EVIDENC
9570: 45 2d 4f 46 3a 20 52 2d 33 39 36 31 36 2d 32 30  E-OF: R-39616-20
9580: 35 35 35 20 42 6f 74 68 20 47 4c 4f 42 20 61 6e  555 Both GLOB an
9590: 64 20 4c 49 4b 45 20 6d 61 79 20 62 65 20 70 72  d LIKE may be pr
95a0: 65 63 65 64 65 64 20 62 79 20 74 68 65 0a 23 20  eceded by the.# 
95b0: 4e 4f 54 20 6b 65 79 77 6f 72 64 20 74 6f 20 69  NOT keyword to i
95c0: 6e 76 65 72 74 20 74 68 65 20 73 65 6e 73 65 20  nvert the sense 
95d0: 6f 66 20 74 68 65 20 74 65 73 74 2e 0a 23 0a 64  of the test..#.d
95e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
95f0: 5f 65 78 70 72 2d 31 37 2e 32 2e 31 20 7b 20 53  _expr-17.2.1 { S
9600: 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e  ELECT 'abcxyz' N
9610: 4f 54 20 47 4c 4f 42 20 27 41 42 43 2a 27 20 7d  OT GLOB 'ABC*' }
9620: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
9630: 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 32  st e_expr-17.2.2
9640: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79   { SELECT 'abcxy
9650: 7a 27 20 4e 4f 54 20 47 4c 4f 42 20 27 61 62 63  z' NOT GLOB 'abc
9660: 2a 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71  *' } 0.do_execsq
9670: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37  l_test e_expr-17
9680: 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61  .2.3 { SELECT 'a
9690: 62 63 78 79 7a 27 20 4e 4f 54 20 4c 49 4b 45 20  bcxyz' NOT LIKE 
96a0: 27 41 42 43 25 27 20 7d 20 30 0a 64 6f 5f 65 78  'ABC%' } 0.do_ex
96b0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
96c0: 72 2d 31 37 2e 32 2e 34 20 7b 20 53 45 4c 45 43  r-17.2.4 { SELEC
96d0: 54 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 4c  T 'abcxyz' NOT L
96e0: 49 4b 45 20 27 61 62 63 25 27 20 7d 20 30 0a 64  IKE 'abc%' } 0.d
96f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
9700: 5f 65 78 70 72 2d 31 37 2e 32 2e 35 20 7b 20 53  _expr-17.2.5 { S
9710: 45 4c 45 43 54 20 27 61 62 64 78 79 7a 27 20 4e  ELECT 'abdxyz' N
9720: 4f 54 20 4c 49 4b 45 20 27 61 62 63 25 27 20 7d  OT LIKE 'abc%' }
9730: 20 31 0a 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65   1..db nullvalue
9740: 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c   null.do_execsql
9750: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9760: 32 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.6 { SELECT 'ab
9770: 63 78 79 7a 27 20 4e 4f 54 20 47 4c 4f 42 20 4e  cxyz' NOT GLOB N
9780: 55 4c 4c 20 7d 20 6e 75 6c 6c 0a 64 6f 5f 65 78  ULL } null.do_ex
9790: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
97a0: 72 2d 31 37 2e 32 2e 37 20 7b 20 53 45 4c 45 43  r-17.2.7 { SELEC
97b0: 54 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 4c  T 'abcxyz' NOT L
97c0: 49 4b 45 20 4e 55 4c 4c 20 7d 20 6e 75 6c 6c 0a  IKE NULL } null.
97d0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
97e0: 65 5f 65 78 70 72 2d 31 37 2e 32 2e 38 20 7b 20  e_expr-17.2.8 { 
97f0: 53 45 4c 45 43 54 20 4e 55 4c 4c 20 4e 4f 54 20  SELECT NULL NOT 
9800: 47 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20 6e 75  GLOB 'abc*' } nu
9810: 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  ll.do_execsql_te
9820: 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 39  st e_expr-17.2.9
9830: 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 4e   { SELECT NULL N
9840: 4f 54 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d  OT LIKE 'ABC%' }
9850: 20 6e 75 6c 6c 0a 64 62 20 6e 75 6c 6c 76 61 6c   null.db nullval
9860: 75 65 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43  ue {}..# EVIDENC
9870: 45 2d 4f 46 3a 20 52 2d 33 39 34 31 34 2d 33 35  E-OF: R-39414-35
9880: 34 38 39 20 54 68 65 20 69 6e 66 69 78 20 47 4c  489 The infix GL
9890: 4f 42 20 6f 70 65 72 61 74 6f 72 20 69 73 20 69  OB operator is i
98a0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 23 20  mplemented by.# 
98b0: 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63  calling the func
98c0: 74 69 6f 6e 20 67 6c 6f 62 28 59 2c 58 29 20 61  tion glob(Y,X) a
98d0: 6e 64 20 63 61 6e 20 62 65 20 6d 6f 64 69 66 69  nd can be modifi
98e0: 65 64 20 62 79 20 6f 76 65 72 72 69 64 69 6e 67  ed by overriding
98f0: 20 74 68 61 74 0a 23 20 66 75 6e 63 74 69 6f 6e   that.# function
9900: 2e 0a 70 72 6f 63 20 67 6c 6f 62 66 75 6e 63 20  ..proc globfunc 
9910: 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20  {args} {.  eval 
9920: 6c 61 70 70 65 6e 64 20 3a 3a 67 6c 6f 62 61 72  lappend ::globar
9930: 67 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72  gs $args.  retur
9940: 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 67 6c  n 1.}.db func gl
9950: 6f 62 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 67  ob -argcount 2 g
9960: 6c 6f 62 66 75 6e 63 0a 73 65 74 20 3a 3a 67 6c  lobfunc.set ::gl
9970: 6f 62 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f  obargs [list].do
9980: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9990: 65 78 70 72 2d 31 37 2e 33 2e 31 20 7b 20 53 45  expr-17.3.1 { SE
99a0: 4c 45 43 54 20 27 61 62 63 27 20 47 4c 4f 42 20  LECT 'abc' GLOB 
99b0: 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73  'def' } 1.do_tes
99c0: 74 20 20 20 20 20 20 20 20 20 65 5f 65 78 70 72  t         e_expr
99d0: 2d 31 37 2e 33 2e 32 20 7b 20 73 65 74 20 67 6c  -17.3.2 { set gl
99e0: 6f 62 61 72 67 73 20 7d 20 7b 64 65 66 20 61 62  obargs } {def ab
99f0: 63 7d 0a 73 65 74 20 3a 3a 67 6c 6f 62 61 72 67  c}.set ::globarg
9a00: 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63  s [list].do_exec
9a10: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
9a20: 31 37 2e 33 2e 33 20 7b 20 53 45 4c 45 43 54 20  17.3.3 { SELECT 
9a30: 27 58 27 20 4e 4f 54 20 47 4c 4f 42 20 27 59 27  'X' NOT GLOB 'Y'
9a40: 20 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20 20 20   } 0.do_test    
9a50: 20 20 20 20 20 65 5f 65 78 70 72 2d 31 37 2e 33       e_expr-17.3
9a60: 2e 34 20 7b 20 73 65 74 20 67 6c 6f 62 61 72 67  .4 { set globarg
9a70: 73 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69 74 65  s } {Y X}.sqlite
9a80: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 23 20  3 db test.db..# 
9a90: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
9aa0: 31 36 35 30 2d 32 30 38 37 32 20 4e 6f 20 72 65  1650-20872 No re
9ab0: 67 65 78 70 28 29 20 75 73 65 72 20 66 75 6e 63  gexp() user func
9ac0: 74 69 6f 6e 20 69 73 20 64 65 66 69 6e 65 64 20  tion is defined 
9ad0: 62 79 0a 23 20 64 65 66 61 75 6c 74 20 61 6e 64  by.# default and
9ae0: 20 73 6f 20 75 73 65 20 6f 66 20 74 68 65 20 52   so use of the R
9af0: 45 47 45 58 50 20 6f 70 65 72 61 74 6f 72 20 77  EGEXP operator w
9b00: 69 6c 6c 20 6e 6f 72 6d 61 6c 6c 79 20 72 65 73  ill normally res
9b10: 75 6c 74 20 69 6e 20 61 6e 0a 23 20 65 72 72 6f  ult in an.# erro
9b20: 72 20 6d 65 73 73 61 67 65 2e 0a 23 0a 23 20 20  r message..#.#  
9b30: 20 54 68 65 72 65 20 69 73 20 61 20 72 65 67 65   There is a rege
9b40: 78 70 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 49  xp function if I
9b50: 43 55 20 69 73 20 65 6e 61 62 6c 65 64 20 74 68  CU is enabled th
9b60: 6f 75 67 68 2e 0a 23 0a 69 66 63 61 70 61 62 6c  ough..#.ifcapabl
9b70: 65 20 21 69 63 75 20 7b 0a 20 20 64 6f 5f 63 61  e !icu {.  do_ca
9b80: 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  tchsql_test e_ex
9b90: 70 72 2d 31 38 2e 31 2e 31 20 7b 20 0a 20 20 20  pr-18.1.1 { .   
9ba0: 20 53 45 4c 45 43 54 20 72 65 67 65 78 70 28 27   SELECT regexp('
9bb0: 61 62 63 27 2c 20 27 64 65 66 27 29 20 0a 20 20  abc', 'def') .  
9bc0: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 66 75  } {1 {no such fu
9bd0: 6e 63 74 69 6f 6e 3a 20 72 65 67 65 78 70 7d 7d  nction: regexp}}
9be0: 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  .  do_catchsql_t
9bf0: 65 73 74 20 65 5f 65 78 70 72 2d 31 38 2e 31 2e  est e_expr-18.1.
9c00: 32 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20  2 { .    SELECT 
9c10: 27 61 62 63 27 20 52 45 47 45 58 50 20 27 64 65  'abc' REGEXP 'de
9c20: 66 27 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75  f'.  } {1 {no su
9c30: 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 52 45 47  ch function: REG
9c40: 45 58 50 7d 7d 0a 7d 0a 0a 23 20 45 56 49 44 45  EXP}}.}..# EVIDE
9c50: 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 36 39 33 2d  NCE-OF: R-33693-
9c60: 35 30 31 38 30 20 54 68 65 20 52 45 47 45 58 50  50180 The REGEXP
9c70: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 73   operator is a s
9c80: 70 65 63 69 61 6c 20 73 79 6e 74 61 78 20 66 6f  pecial syntax fo
9c90: 72 0a 23 20 74 68 65 20 72 65 67 65 78 70 28 29  r.# the regexp()
9ca0: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a   user function..
9cb0: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
9cc0: 20 52 2d 35 37 32 38 39 2d 31 33 35 37 38 20 49   R-57289-13578 I
9cd0: 66 20 61 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d  f a application-
9ce0: 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63  defined SQL func
9cf0: 74 69 6f 6e 20 6e 61 6d 65 64 0a 23 20 22 72 65  tion named.# "re
9d00: 67 65 78 70 22 20 69 73 20 61 64 64 65 64 20 61  gexp" is added a
9d10: 74 20 72 75 6e 2d 74 69 6d 65 2c 20 74 68 61 74  t run-time, that
9d20: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 62   function will b
9d30: 65 20 63 61 6c 6c 65 64 20 69 6e 20 6f 72 64 65  e called in orde
9d40: 72 0a 23 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  r.# to implement
9d50: 20 74 68 65 20 52 45 47 45 58 50 20 6f 70 65 72   the REGEXP oper
9d60: 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 72 65 67  ator..#.proc reg
9d70: 65 78 70 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b  expfunc {args} {
9d80: 0a 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20  .  eval lappend 
9d90: 3a 3a 72 65 67 65 78 70 61 72 67 73 20 24 61 72  ::regexpargs $ar
9da0: 67 73 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a  gs.  return 1.}.
9db0: 64 62 20 66 75 6e 63 20 72 65 67 65 78 70 20 2d  db func regexp -
9dc0: 61 72 67 63 6f 75 6e 74 20 32 20 72 65 67 65 78  argcount 2 regex
9dd0: 70 66 75 6e 63 0a 73 65 74 20 3a 3a 72 65 67 65  pfunc.set ::rege
9de0: 78 70 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f  xpargs [list].do
9df0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9e00: 65 78 70 72 2d 31 38 2e 32 2e 31 20 7b 20 53 45  expr-18.2.1 { SE
9e10: 4c 45 43 54 20 27 61 62 63 27 20 52 45 47 45 58  LECT 'abc' REGEX
9e20: 50 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74  P 'def' } 1.do_t
9e30: 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78  est         e_ex
9e40: 70 72 2d 31 38 2e 32 2e 32 20 7b 20 73 65 74 20  pr-18.2.2 { set 
9e50: 72 65 67 65 78 70 61 72 67 73 20 7d 20 7b 64 65  regexpargs } {de
9e60: 66 20 61 62 63 7d 0a 73 65 74 20 3a 3a 72 65 67  f abc}.set ::reg
9e70: 65 78 70 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64  expargs [list].d
9e80: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
9e90: 5f 65 78 70 72 2d 31 38 2e 32 2e 33 20 7b 20 53  _expr-18.2.3 { S
9ea0: 45 4c 45 43 54 20 27 58 27 20 4e 4f 54 20 52 45  ELECT 'X' NOT RE
9eb0: 47 45 58 50 20 27 59 27 20 7d 20 30 0a 64 6f 5f  GEXP 'Y' } 0.do_
9ec0: 74 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65  test         e_e
9ed0: 78 70 72 2d 31 38 2e 32 2e 34 20 7b 20 73 65 74  xpr-18.2.4 { set
9ee0: 20 72 65 67 65 78 70 61 72 67 73 20 7d 20 7b 59   regexpargs } {Y
9ef0: 20 58 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74   X}.sqlite3 db t
9f00: 65 73 74 2e 64 62 0a 0a 23 20 45 56 49 44 45 4e  est.db..# EVIDEN
9f10: 43 45 2d 4f 46 3a 20 52 2d 34 32 30 33 37 2d 33  CE-OF: R-42037-3
9f20: 37 38 32 36 20 54 68 65 20 64 65 66 61 75 6c 74  7826 The default
9f30: 20 6d 61 74 63 68 28 29 20 66 75 6e 63 74 69 6f   match() functio
9f40: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
9f50: 0a 23 20 72 61 69 73 65 73 20 61 6e 20 65 78 63  .# raises an exc
9f60: 65 70 74 69 6f 6e 20 61 6e 64 20 69 73 20 6e 6f  eption and is no
9f70: 74 20 72 65 61 6c 6c 79 20 75 73 65 66 75 6c 20  t really useful 
9f80: 66 6f 72 20 61 6e 79 74 68 69 6e 67 2e 0a 23 0a  for anything..#.
9f90: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
9fa0: 20 65 5f 65 78 70 72 2d 31 39 2e 31 2e 31 20 7b   e_expr-19.1.1 {
9fb0: 20 0a 20 20 53 45 4c 45 43 54 20 27 61 62 63 27   .  SELECT 'abc'
9fc0: 20 4d 41 54 43 48 20 27 64 65 66 27 20 0a 7d 20   MATCH 'def' .} 
9fd0: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73  {1 {unable to us
9fe0: 65 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48  e function MATCH
9ff0: 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
a000: 64 20 63 6f 6e 74 65 78 74 7d 7d 0a 64 6f 5f 63  d context}}.do_c
a010: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65  atchsql_test e_e
a020: 78 70 72 2d 31 39 2e 31 2e 32 20 7b 20 0a 20 20  xpr-19.1.2 { .  
a030: 53 45 4c 45 43 54 20 6d 61 74 63 68 28 27 61 62  SELECT match('ab
a040: 63 27 2c 20 27 64 65 66 27 29 0a 7d 20 7b 31 20  c', 'def').} {1 
a050: 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66  {unable to use f
a060: 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e  unction MATCH in
a070: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
a080: 6f 6e 74 65 78 74 7d 7d 0a 0a 23 20 45 56 49 44  ontext}}..# EVID
a090: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 39 31 36  ENCE-OF: R-37916
a0a0: 2d 34 37 34 30 37 20 54 68 65 20 4d 41 54 43 48  -47407 The MATCH
a0b0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 73   operator is a s
a0c0: 70 65 63 69 61 6c 20 73 79 6e 74 61 78 20 66 6f  pecial syntax fo
a0d0: 72 0a 23 20 74 68 65 20 6d 61 74 63 68 28 29 20  r.# the match() 
a0e0: 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69  application-defi
a0f0: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a  ned function..#.
a100: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
a110: 2d 30 36 30 32 31 2d 30 39 33 37 33 20 42 75 74  -06021-09373 But
a120: 20 65 78 74 65 6e 73 69 6f 6e 73 20 63 61 6e 20   extensions can 
a130: 6f 76 65 72 72 69 64 65 20 74 68 65 20 6d 61 74  override the mat
a140: 63 68 28 29 0a 23 20 66 75 6e 63 74 69 6f 6e 20  ch().# function 
a150: 77 69 74 68 20 6d 6f 72 65 20 68 65 6c 70 66 75  with more helpfu
a160: 6c 20 6c 6f 67 69 63 2e 0a 23 0a 70 72 6f 63 20  l logic..#.proc 
a170: 6d 61 74 63 68 66 75 6e 63 20 7b 61 72 67 73 7d  matchfunc {args}
a180: 20 7b 0a 20 20 65 76 61 6c 20 6c 61 70 70 65 6e   {.  eval lappen
a190: 64 20 3a 3a 6d 61 74 63 68 61 72 67 73 20 24 61  d ::matchargs $a
a1a0: 72 67 73 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d  rgs.  return 1.}
a1b0: 0a 64 62 20 66 75 6e 63 20 6d 61 74 63 68 20 2d  .db func match -
a1c0: 61 72 67 63 6f 75 6e 74 20 32 20 6d 61 74 63 68  argcount 2 match
a1d0: 66 75 6e 63 0a 73 65 74 20 3a 3a 6d 61 74 63 68  func.set ::match
a1e0: 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65  args [list].do_e
a1f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
a200: 70 72 2d 31 39 2e 32 2e 31 20 7b 20 53 45 4c 45  pr-19.2.1 { SELE
a210: 43 54 20 27 61 62 63 27 20 4d 41 54 43 48 20 27  CT 'abc' MATCH '
a220: 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73 74  def' } 1.do_test
a230: 20 20 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d           e_expr-
a240: 31 39 2e 32 2e 32 20 7b 20 73 65 74 20 6d 61 74  19.2.2 { set mat
a250: 63 68 61 72 67 73 20 7d 20 7b 64 65 66 20 61 62  chargs } {def ab
a260: 63 7d 0a 73 65 74 20 3a 3a 6d 61 74 63 68 61 72  c}.set ::matchar
a270: 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65  gs [list].do_exe
a280: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
a290: 2d 31 39 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54  -19.2.3 { SELECT
a2a0: 20 27 58 27 20 4e 4f 54 20 4d 41 54 43 48 20 27   'X' NOT MATCH '
a2b0: 59 27 20 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20  Y' } 0.do_test  
a2c0: 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31 39         e_expr-19
a2d0: 2e 32 2e 34 20 7b 20 73 65 74 20 6d 61 74 63 68  .2.4 { set match
a2e0: 61 72 67 73 20 7d 20 7b 59 20 58 7d 0a 73 71 6c  args } {Y X}.sql
a2f0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
a300: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
a310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
a350: 73 74 20 63 61 73 65 73 20 66 6f 72 20 74 68 65  st cases for the
a360: 20 74 65 73 74 61 62 6c 65 20 73 74 61 74 65 6d   testable statem
a370: 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20  ents related to 
a380: 74 68 65 20 43 41 53 45 20 65 78 70 72 65 73 73  the CASE express
a390: 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ion..#.# EVIDENC
a3a0: 45 2d 4f 46 3a 20 52 2d 31 35 31 39 39 2d 36 31  E-OF: R-15199-61
a3b0: 33 38 39 20 54 68 65 72 65 20 61 72 65 20 74 77  389 There are tw
a3c0: 6f 20 62 61 73 69 63 20 66 6f 72 6d 73 20 6f 66  o basic forms of
a3d0: 20 74 68 65 20 43 41 53 45 0a 23 20 65 78 70 72   the CASE.# expr
a3e0: 65 73 73 69 6f 6e 3a 20 74 68 6f 73 65 20 77 69  ession: those wi
a3f0: 74 68 20 61 20 62 61 73 65 20 65 78 70 72 65 73  th a base expres
a400: 73 69 6f 6e 20 61 6e 64 20 74 68 6f 73 65 20 77  sion and those w
a410: 69 74 68 6f 75 74 2e 0a 23 0a 64 6f 5f 65 78 65  ithout..#.do_exe
a420: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
a430: 2d 32 30 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  -20.1 {.  SELECT
a440: 20 43 41 53 45 20 57 48 45 4e 20 31 20 54 48 45   CASE WHEN 1 THE
a450: 4e 20 27 74 72 75 65 27 20 57 48 45 4e 20 30 20  N 'true' WHEN 0 
a460: 54 48 45 4e 20 27 66 61 6c 73 65 27 20 45 4c 53  THEN 'false' ELS
a470: 45 20 27 65 6c 73 65 27 20 45 4e 44 3b 0a 7d 20  E 'else' END;.} 
a480: 7b 74 72 75 65 7d 0a 64 6f 5f 65 78 65 63 73 71  {true}.do_execsq
a490: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 30  l_test e_expr-20
a4a0: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .2 {.  SELECT CA
a4b0: 53 45 20 30 20 57 48 45 4e 20 31 20 54 48 45 4e  SE 0 WHEN 1 THEN
a4c0: 20 27 74 72 75 65 27 20 57 48 45 4e 20 30 20 54   'true' WHEN 0 T
a4d0: 48 45 4e 20 27 66 61 6c 73 65 27 20 45 4c 53 45  HEN 'false' ELSE
a4e0: 20 27 65 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b   'else' END;.} {
a4f0: 66 61 6c 73 65 7d 0a 0a 70 72 6f 63 20 76 61 72  false}..proc var
a500: 20 7b 6e 6d 7d 20 7b 0a 20 20 6c 61 70 70 65 6e   {nm} {.  lappen
a510: 64 20 3a 3a 76 61 72 6c 69 73 74 20 24 6e 6d 0a  d ::varlist $nm.
a520: 20 20 72 65 74 75 72 6e 20 5b 73 65 74 20 22 3a    return [set ":
a530: 3a 24 6e 6d 22 5d 0a 7d 0a 64 62 20 66 75 6e 63  :$nm"].}.db func
a540: 20 76 61 72 20 76 61 72 0a 0a 23 20 45 56 49 44   var var..# EVID
a550: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 36 33 38  ENCE-OF: R-30638
a560: 2d 35 39 39 35 34 20 49 6e 20 61 20 43 41 53 45  -59954 In a CASE
a570: 20 77 69 74 68 6f 75 74 20 61 20 62 61 73 65 20   without a base 
a580: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 61 63 68  expression, each
a590: 0a 23 20 57 48 45 4e 20 65 78 70 72 65 73 73 69  .# WHEN expressi
a5a0: 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  on is evaluated 
a5b0: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 74  and the result t
a5c0: 72 65 61 74 65 64 20 61 73 20 61 20 62 6f 6f 6c  reated as a bool
a5d0: 65 61 6e 2c 0a 23 20 73 74 61 72 74 69 6e 67 20  ean,.# starting 
a5e0: 77 69 74 68 20 74 68 65 20 6c 65 66 74 6d 6f 73  with the leftmos
a5f0: 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
a600: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 0a 23   to the right..#
a610: 0a 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d  .foreach {a b c}
a620: 20 7b 30 20 30 20 30 7d 20 62 72 65 61 6b 0a 73   {0 0 0} break.s
a630: 65 74 20 76 61 72 6c 69 73 74 20 5b 6c 69 73 74  et varlist [list
a640: 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ].do_execsql_tes
a650: 74 20 65 5f 65 78 70 72 2d 32 31 2e 31 2e 31 20  t e_expr-21.1.1 
a660: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
a670: 57 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48  WHEN var('a') TH
a680: 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20  EN 'A' .        
a690: 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27        WHEN var('
a6a0: 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20  b') THEN 'B' .  
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e              WHEN
a6c0: 20 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27   var('c') THEN '
a6d0: 43 27 20 45 4e 44 0a 7d 20 7b 7b 7d 7d 0a 64 6f  C' END.} {{}}.do
a6e0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e  _test e_expr-21.
a6f0: 31 2e 32 20 7b 20 73 65 74 20 76 61 72 6c 69 73  1.2 { set varlis
a700: 74 20 7d 20 7b 61 20 62 20 63 7d 0a 73 65 74 20  t } {a b c}.set 
a710: 76 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 64  varlist [list].d
a720: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
a730: 5f 65 78 70 72 2d 32 31 2e 31 2e 33 20 7b 0a 20  _expr-21.1.3 {. 
a740: 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
a750: 4e 20 76 61 72 28 27 63 27 29 20 54 48 45 4e 20  N var('c') THEN 
a760: 27 43 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'C' .           
a770: 20 20 20 57 48 45 4e 20 76 61 72 28 27 62 27 29     WHEN var('b')
a780: 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20   THEN 'B' .     
a790: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
a7a0: 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20  r('a') THEN 'A' 
a7b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
a7c0: 4c 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a  LSE 'no result'.
a7d0: 20 20 45 4e 44 0a 7d 20 7b 7b 6e 6f 20 72 65 73    END.} {{no res
a7e0: 75 6c 74 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  ult}}.do_test e_
a7f0: 65 78 70 72 2d 32 31 2e 31 2e 34 20 7b 20 73 65  expr-21.1.4 { se
a800: 74 20 76 61 72 6c 69 73 74 20 7d 20 7b 63 20 62  t varlist } {c b
a810: 20 61 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   a}..# EVIDENCE-
a820: 4f 46 3a 20 52 2d 33 39 30 30 39 2d 32 35 35 39  OF: R-39009-2559
a830: 36 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  6 The result of 
a840: 74 68 65 20 43 41 53 45 20 65 78 70 72 65 73 73  the CASE express
a850: 69 6f 6e 20 69 73 20 74 68 65 0a 23 20 65 76 61  ion is the.# eva
a860: 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 54  luation of the T
a870: 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  HEN expression t
a880: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
a890: 74 6f 20 74 68 65 20 66 69 72 73 74 20 57 48 45  to the first WHE
a8a0: 4e 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20 74  N.# expression t
a8b0: 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f  hat evaluates to
a8c0: 20 74 72 75 65 2e 0a 23 0a 66 6f 72 65 61 63 68   true..#.foreach
a8d0: 20 7b 61 20 62 20 63 7d 20 7b 30 20 31 20 30 7d   {a b c} {0 1 0}
a8e0: 20 62 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71   break.do_execsq
a8f0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31  l_test e_expr-21
a900: 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  .2.1 {.  SELECT 
a910: 43 41 53 45 20 57 48 45 4e 20 76 61 72 28 27 61  CASE WHEN var('a
a920: 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20  ') THEN 'A' .   
a930: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
a940: 76 61 72 28 27 62 27 29 20 54 48 45 4e 20 27 42  var('b') THEN 'B
a950: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
a960: 20 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54   WHEN var('c') T
a970: 48 45 4e 20 27 43 27 20 0a 20 20 20 20 20 20 20  HEN 'C' .       
a980: 20 20 20 20 20 20 20 45 4c 53 45 20 27 6e 6f 20         ELSE 'no 
a990: 72 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20  result'.  END.} 
a9a0: 7b 42 7d 0a 66 6f 72 65 61 63 68 20 7b 61 20 62  {B}.foreach {a b
a9b0: 20 63 7d 20 7b 30 20 31 20 31 7d 20 62 72 65 61   c} {0 1 1} brea
a9c0: 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  k.do_execsql_tes
a9d0: 74 20 65 5f 65 78 70 72 2d 32 31 2e 32 2e 32 20  t e_expr-21.2.2 
a9e0: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
a9f0: 57 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48  WHEN var('a') TH
aa00: 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20  EN 'A' .        
aa10: 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27        WHEN var('
aa20: 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20  b') THEN 'B' .  
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e              WHEN
aa40: 20 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27   var('c') THEN '
aa50: 43 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C'.             
aa60: 20 45 4c 53 45 20 27 6e 6f 20 72 65 73 75 6c 74   ELSE 'no result
aa70: 27 0a 20 20 45 4e 44 0a 7d 20 7b 42 7d 0a 66 6f  '.  END.} {B}.fo
aa80: 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30  reach {a b c} {0
aa90: 20 30 20 31 7d 20 62 72 65 61 6b 0a 64 6f 5f 65   0 1} break.do_e
aaa0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
aab0: 70 72 2d 32 31 2e 32 2e 33 20 7b 0a 20 20 53 45  pr-21.2.3 {.  SE
aac0: 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76  LECT CASE WHEN v
aad0: 61 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27  ar('a') THEN 'A'
aae0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
aaf0: 57 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48  WHEN var('b') TH
ab00: 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20  EN 'B' .        
ab10: 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27        WHEN var('
ab20: 63 27 29 20 54 48 45 4e 20 27 43 27 0a 20 20 20  c') THEN 'C'.   
ab30: 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20             ELSE 
ab40: 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20 45 4e  'no result'.  EN
ab50: 44 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56 49 44 45  D.} {C}..# EVIDE
ab60: 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 32 32 37 2d  NCE-OF: R-24227-
ab70: 30 34 38 30 37 20 4f 72 2c 20 69 66 20 6e 6f 6e  04807 Or, if non
ab80: 65 20 6f 66 20 74 68 65 20 57 48 45 4e 20 65 78  e of the WHEN ex
ab90: 70 72 65 73 73 69 6f 6e 73 0a 23 20 65 76 61 6c  pressions.# eval
aba0: 75 61 74 65 20 74 6f 20 74 72 75 65 2c 20 74 68  uate to true, th
abb0: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 61 6c  e result of eval
abc0: 75 61 74 69 6e 67 20 74 68 65 20 45 4c 53 45 20  uating the ELSE 
abd0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 0a 23  expression, if.#
abe0: 20 61 6e 79 2e 0a 23 0a 66 6f 72 65 61 63 68 20   any..#.foreach 
abf0: 7b 61 20 62 20 63 7d 20 7b 30 20 30 20 30 7d 20  {a b c} {0 0 0} 
ac00: 62 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c  break.do_execsql
ac10: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e  _test e_expr-21.
ac20: 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  3.1 {.  SELECT C
ac30: 41 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27  ASE WHEN var('a'
ac40: 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20  ) THEN 'A' .    
ac50: 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76            WHEN v
ac60: 61 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27  ar('b') THEN 'B'
ac70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
ac80: 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48  WHEN var('c') TH
ac90: 45 4e 20 27 43 27 0a 20 20 20 20 20 20 20 20 20  EN 'C'.         
aca0: 20 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72 65       ELSE 'no re
acb0: 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 7b  sult'.  END.} {{
acc0: 6e 6f 20 72 65 73 75 6c 74 7d 7d 0a 0a 23 20 45  no result}}..# E
acd0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
ace0: 31 36 38 2d 30 37 35 37 39 20 49 66 20 74 68 65  168-07579 If the
acf0: 72 65 20 69 73 20 6e 6f 20 45 4c 53 45 20 65 78  re is no ELSE ex
ad00: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6e 6f 6e  pression and non
ad10: 65 20 6f 66 0a 23 20 74 68 65 20 57 48 45 4e 20  e of.# the WHEN 
ad20: 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20  expressions are 
ad30: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  true, then the o
ad40: 76 65 72 61 6c 6c 20 72 65 73 75 6c 74 20 69 73  verall result is
ad50: 20 4e 55 4c 4c 2e 0a 23 0a 64 62 20 6e 75 6c 6c   NULL..#.db null
ad60: 76 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f 65 78  value null.do_ex
ad70: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
ad80: 72 2d 32 31 2e 33 2e 32 20 7b 0a 20 20 53 45 4c  r-21.3.2 {.  SEL
ad90: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61  ECT CASE WHEN va
ada0: 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20  r('a') THEN 'A' 
adb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
adc0: 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45  HEN var('b') THE
add0: 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20  N 'B' .         
ade0: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63       WHEN var('c
adf0: 27 29 20 54 48 45 4e 20 27 43 27 0a 20 20 45 4e  ') THEN 'C'.  EN
ae00: 44 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 62 20 6e 75  D.} {null}.db nu
ae10: 6c 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23 20 45 56  llvalue {}..# EV
ae20: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 39  IDENCE-OF: R-139
ae30: 34 33 2d 31 33 35 39 32 20 41 20 4e 55 4c 4c 20  43-13592 A NULL 
ae40: 72 65 73 75 6c 74 20 69 73 20 63 6f 6e 73 69 64  result is consid
ae50: 65 72 65 64 20 75 6e 74 72 75 65 20 77 68 65 6e  ered untrue when
ae60: 0a 23 20 65 76 61 6c 75 61 74 69 6e 67 20 57 48  .# evaluating WH
ae70: 45 4e 20 74 65 72 6d 73 2e 0a 23 0a 64 6f 5f 65  EN terms..#.do_e
ae80: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
ae90: 70 72 2d 32 31 2e 34 2e 31 20 7b 0a 20 20 53 45  pr-21.4.1 {.  SE
aea0: 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 4e  LECT CASE WHEN N
aeb0: 55 4c 4c 20 54 48 45 4e 20 27 41 27 20 57 48 45  ULL THEN 'A' WHE
aec0: 4e 20 31 20 54 48 45 4e 20 27 42 27 20 45 4e 44  N 1 THEN 'B' END
aed0: 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71  .} {B}.do_execsq
aee0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31  l_test e_expr-21
aef0: 2e 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .4.2 {.  SELECT 
af00: 43 41 53 45 20 57 48 45 4e 20 30 20 54 48 45 4e  CASE WHEN 0 THEN
af10: 20 27 41 27 20 57 48 45 4e 20 4e 55 4c 4c 20 54   'A' WHEN NULL T
af20: 48 45 4e 20 27 42 27 20 45 4c 53 45 20 27 43 27  HEN 'B' ELSE 'C'
af30: 20 45 4e 44 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56   END.} {C}..# EV
af40: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 38 36  IDENCE-OF: R-386
af50: 32 30 2d 31 39 34 39 39 20 49 6e 20 61 20 43 41  20-19499 In a CA
af60: 53 45 20 77 69 74 68 20 61 20 62 61 73 65 20 65  SE with a base e
af70: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 62  xpression, the b
af80: 61 73 65 0a 23 20 65 78 70 72 65 73 73 69 6f 6e  ase.# expression
af90: 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 6a 75   is evaluated ju
afa0: 73 74 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20  st once and the 
afb0: 72 65 73 75 6c 74 20 69 73 20 63 6f 6d 70 61 72  result is compar
afc0: 65 64 20 61 67 61 69 6e 73 74 0a 23 20 74 68 65  ed against.# the
afd0: 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 65   evaluation of e
afe0: 61 63 68 20 57 48 45 4e 20 65 78 70 72 65 73 73  ach WHEN express
aff0: 69 6f 6e 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ion from left to
b000: 20 72 69 67 68 74 2e 0a 23 0a 23 20 4e 6f 74 65   right..#.# Note
b010: 3a 20 54 68 69 73 20 74 65 73 74 20 63 61 73 65  : This test case
b020: 20 74 65 73 74 73 20 74 68 65 20 22 65 76 61 6c   tests the "eval
b030: 75 61 74 65 64 20 6a 75 73 74 20 6f 6e 63 65 22  uated just once"
b040: 20 70 61 72 74 20 6f 66 20 74 68 65 20 61 62 6f   part of the abo
b050: 76 65 0a 23 20 73 74 61 74 65 6d 65 6e 74 2e 20  ve.# statement. 
b060: 54 65 73 74 73 20 61 73 73 6f 63 69 61 74 65 64  Tests associated
b070: 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 74   with the next t
b080: 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 74 65  wo statements te
b090: 73 74 20 74 68 61 74 20 74 68 65 0a 23 20 63 6f  st that the.# co
b0a0: 6d 70 61 72 69 73 6f 6e 73 20 74 61 6b 65 20 70  mparisons take p
b0b0: 6c 61 63 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20  lace..#.foreach 
b0c0: 7b 61 20 62 20 63 7d 20 5b 6c 69 73 74 20 5b 65  {a b c} [list [e
b0d0: 78 70 72 20 33 5d 20 5b 65 78 70 72 20 34 5d 20  xpr 3] [expr 4] 
b0e0: 5b 65 78 70 72 20 35 5d 5d 20 62 72 65 61 6b 0a  [expr 5]] break.
b0f0: 73 65 74 20 3a 3a 76 61 72 6c 69 73 74 20 5b 6c  set ::varlist [l
b100: 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ist].do_execsql_
b110: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 31  test e_expr-22.1
b120: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .1 {.  SELECT CA
b130: 53 45 20 76 61 72 28 27 61 27 29 20 57 48 45 4e  SE var('a') WHEN
b140: 20 31 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e   1 THEN 'A' WHEN
b150: 20 32 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e   2 THEN 'B' WHEN
b160: 20 33 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a   3 THEN 'C' END.
b170: 7d 20 7b 43 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  } {C}.do_test e_
b180: 65 78 70 72 2d 32 32 2e 31 2e 32 20 7b 20 73 65  expr-22.1.2 { se
b190: 74 20 3a 3a 76 61 72 6c 69 73 74 20 7d 20 7b 61  t ::varlist } {a
b1a0: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
b1b0: 3a 20 52 2d 30 37 36 36 37 2d 34 39 35 33 37 20  : R-07667-49537 
b1c0: 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  The result of th
b1d0: 65 20 43 41 53 45 20 65 78 70 72 65 73 73 69 6f  e CASE expressio
b1e0: 6e 20 69 73 20 74 68 65 0a 23 20 65 76 61 6c 75  n is the.# evalu
b1f0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 48 45  ation of the THE
b200: 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  N expression tha
b210: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
b220: 20 74 68 65 20 66 69 72 73 74 20 57 48 45 4e 0a   the first WHEN.
b230: 23 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72  # expression for
b240: 20 77 68 69 63 68 20 74 68 65 20 63 6f 6d 70 61   which the compa
b250: 72 69 73 6f 6e 20 69 73 20 74 72 75 65 2e 0a 23  rison is true..#
b260: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
b270: 20 65 5f 65 78 70 72 2d 32 32 2e 32 2e 31 20 7b   e_expr-22.2.1 {
b280: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 32  .  SELECT CASE 2
b290: 33 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27 41  3 WHEN 1 THEN 'A
b2a0: 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27  ' WHEN 23 THEN '
b2b0: 42 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20  B' WHEN 23 THEN 
b2c0: 27 43 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f  'C' END.} {B}.do
b2d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
b2e0: 65 78 70 72 2d 32 32 2e 32 2e 32 20 7b 0a 20 20  expr-22.2.2 {.  
b2f0: 53 45 4c 45 43 54 20 43 41 53 45 20 31 20 57 48  SELECT CASE 1 WH
b300: 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57 48  EN 1 THEN 'A' WH
b310: 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20 57  EN 23 THEN 'B' W
b320: 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27 20  HEN 23 THEN 'C' 
b330: 45 4e 44 0a 7d 20 7b 41 7d 0a 0a 23 20 45 56 49  END.} {A}..# EVI
b340: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 35 34  DENCE-OF: R-4754
b350: 33 2d 33 32 31 34 35 20 4f 72 2c 20 69 66 20 6e  3-32145 Or, if n
b360: 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 4e 20  one of the WHEN 
b370: 65 78 70 72 65 73 73 69 6f 6e 73 0a 23 20 65 76  expressions.# ev
b380: 61 6c 75 61 74 65 20 74 6f 20 61 20 76 61 6c 75  aluate to a valu
b390: 65 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 62  e equal to the b
b3a0: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ase expression, 
b3b0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 23 20  the result of.# 
b3c0: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 45  evaluating the E
b3d0: 4c 53 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  LSE expression, 
b3e0: 69 66 20 61 6e 79 2e 0a 23 0a 64 6f 5f 65 78 65  if any..#.do_exe
b3f0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
b400: 2d 32 32 2e 33 2e 31 20 7b 0a 20 20 53 45 4c 45  -22.3.1 {.  SELE
b410: 43 54 20 43 41 53 45 20 32 34 20 57 48 45 4e 20  CT CASE 24 WHEN 
b420: 31 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20  1 THEN 'A' WHEN 
b430: 32 33 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e  23 THEN 'B' WHEN
b440: 20 32 33 20 54 48 45 4e 20 27 43 27 20 45 4c 53   23 THEN 'C' ELS
b450: 45 20 27 44 27 20 45 4e 44 0a 7d 20 7b 44 7d 0a  E 'D' END.} {D}.
b460: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
b470: 52 2d 35 34 37 32 31 2d 34 38 35 35 37 20 49 66  R-54721-48557 If
b480: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 45 4c 53   there is no ELS
b490: 45 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  E expression and
b4a0: 20 6e 6f 6e 65 20 6f 66 0a 23 20 74 68 65 20 57   none of.# the W
b4b0: 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  HEN expressions 
b4c0: 70 72 6f 64 75 63 65 20 61 20 72 65 73 75 6c 74  produce a result
b4d0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 62 61   equal to the ba
b4e0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 0a 23  se expression,.#
b4f0: 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 72 65 73   the overall res
b500: 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 23 0a 64  ult is NULL..#.d
b510: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
b520: 5f 65 78 70 72 2d 32 32 2e 34 2e 31 20 7b 0a 20  _expr-22.4.1 {. 
b530: 20 53 45 4c 45 43 54 20 43 41 53 45 20 32 34 20   SELECT CASE 24 
b540: 57 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20  WHEN 1 THEN 'A' 
b550: 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27  WHEN 23 THEN 'B'
b560: 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43   WHEN 23 THEN 'C
b570: 27 20 45 4e 44 0a 7d 20 7b 7b 7d 7d 0a 64 62 20  ' END.} {{}}.db 
b580: 6e 75 6c 6c 76 61 6c 75 65 20 6e 75 6c 6c 0a 64  nullvalue null.d
b590: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
b5a0: 5f 65 78 70 72 2d 32 32 2e 34 2e 32 20 7b 0a 20  _expr-22.4.2 {. 
b5b0: 20 53 45 4c 45 43 54 20 43 41 53 45 20 32 34 20   SELECT CASE 24 
b5c0: 57 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20  WHEN 1 THEN 'A' 
b5d0: 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27  WHEN 23 THEN 'B'
b5e0: 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43   WHEN 23 THEN 'C
b5f0: 27 20 45 4e 44 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64  ' END.} {null}.d
b600: 62 20 6e 75 6c 6c 76 61 6c 75 65 20 7b 7d 0a 0a  b nullvalue {}..
b610: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
b620: 2d 31 31 34 37 39 2d 36 32 37 37 34 20 57 68 65  -11479-62774 Whe
b630: 6e 20 63 6f 6d 70 61 72 69 6e 67 20 61 20 62 61  n comparing a ba
b640: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67  se expression ag
b650: 61 69 6e 73 74 20 61 0a 23 20 57 48 45 4e 20 65  ainst a.# WHEN e
b660: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 73  xpression, the s
b670: 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ame collating se
b680: 71 75 65 6e 63 65 2c 20 61 66 66 69 6e 69 74 79  quence, affinity
b690: 2c 20 61 6e 64 0a 23 20 4e 55 4c 4c 2d 68 61 6e  , and.# NULL-han
b6a0: 64 6c 69 6e 67 20 72 75 6c 65 73 20 61 70 70 6c  dling rules appl
b6b0: 79 20 61 73 20 69 66 20 74 68 65 20 62 61 73 65  y as if the base
b6c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
b6d0: 57 48 45 4e 0a 23 20 65 78 70 72 65 73 73 69 6f  WHEN.# expressio
b6e0: 6e 20 61 72 65 20 72 65 73 70 65 63 74 69 76 65  n are respective
b6f0: 6c 79 20 74 68 65 20 6c 65 66 74 2d 20 61 6e 64  ly the left- and
b700: 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72   right-hand oper
b710: 61 6e 64 73 20 6f 66 20 61 6e 20 3d 0a 23 20 6f  ands of an =.# o
b720: 70 65 72 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20  perator..#.proc 
b730: 72 65 76 20 7b 73 74 72 7d 20 7b 0a 20 20 73 65  rev {str} {.  se
b740: 74 20 72 65 74 20 22 22 0a 20 20 73 65 74 20 63  t ret "".  set c
b750: 68 61 72 73 20 5b 73 70 6c 69 74 20 24 73 74 72  hars [split $str
b760: 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 5b  ].  for {set i [
b770: 65 78 70 72 20 5b 6c 6c 65 6e 67 74 68 20 24 63  expr [llength $c
b780: 68 61 72 73 5d 2d 31 5d 7d 20 7b 24 69 3e 3d 30  hars]-1]} {$i>=0
b790: 7d 20 7b 69 6e 63 72 20 69 20 2d 31 7d 20 7b 0a  } {incr i -1} {.
b7a0: 20 20 20 20 61 70 70 65 6e 64 20 72 65 74 20 5b      append ret [
b7b0: 6c 69 6e 64 65 78 20 24 63 68 61 72 73 20 24 69  lindex $chars $i
b7c0: 5d 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 74 0a  ].  }.  set ret.
b7d0: 7d 0a 70 72 6f 63 20 72 65 76 65 72 73 65 20 7b  }.proc reverse {
b7e0: 6c 68 73 20 72 68 73 7d 20 7b 0a 20 20 73 74 72  lhs rhs} {.  str
b7f0: 69 6e 67 20 63 6f 6d 70 61 72 65 20 5b 72 65 76  ing compare [rev
b800: 20 24 6c 68 73 5d 20 5b 72 65 66 20 24 72 68 73   $lhs] [ref $rhs
b810: 5d 0a 7d 0a 64 62 20 63 6f 6c 6c 61 74 65 20 72  ].}.db collate r
b820: 65 76 65 72 73 65 20 72 65 76 65 72 73 65 0a 64  everse reverse.d
b830: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
b840: 5f 65 78 70 72 2d 32 33 2e 31 2e 31 20 7b 0a 20  _expr-23.1.1 {. 
b850: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
b860: 28 0a 20 20 20 20 61 20 54 45 58 54 20 20 20 20  (.    a TEXT    
b870: 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c   COLLATE NOCASE,
b880: 0a 20 20 20 20 62 20 20 20 20 20 20 20 20 20 20  .    b          
b890: 43 4f 4c 4c 41 54 45 20 52 45 56 45 52 53 45 2c  COLLATE REVERSE,
b8a0: 0a 20 20 20 20 63 20 49 4e 54 45 47 45 52 2c 0a  .    c INTEGER,.
b8b0: 20 20 20 20 64 20 42 4c 4f 42 0a 20 20 29 3b 0a      d BLOB.  );.
b8c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
b8d0: 20 56 41 4c 55 45 53 28 27 61 62 63 27 2c 20 27   VALUES('abc', '
b8e0: 63 62 61 27 2c 20 35 35 2c 20 33 34 2e 35 29 3b  cba', 55, 34.5);
b8f0: 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  .} {}.do_execsql
b900: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e  _test e_expr-23.
b910: 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.2 {.  SELECT C
b920: 41 53 45 20 61 20 57 48 45 4e 20 27 78 79 7a 27  ASE a WHEN 'xyz'
b930: 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 27   THEN 'A' WHEN '
b940: 41 62 43 27 20 54 48 45 4e 20 27 42 27 20 45 4e  AbC' THEN 'B' EN
b950: 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a  D FROM t1.} {B}.
b960: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
b970: 65 5f 65 78 70 72 2d 32 33 2e 31 2e 33 20 7b 0a  e_expr-23.1.3 {.
b980: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 27 41    SELECT CASE 'A
b990: 62 43 27 20 57 48 45 4e 20 27 61 62 63 27 20 54  bC' WHEN 'abc' T
b9a0: 48 45 4e 20 27 41 27 20 57 48 45 4e 20 61 20 54  HEN 'A' WHEN a T
b9b0: 48 45 4e 20 27 42 27 20 45 4e 44 20 46 52 4f 4d  HEN 'B' END FROM
b9c0: 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65   t1.} {B}.do_exe
b9d0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
b9e0: 2d 32 33 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45  -23.1.4 {.  SELE
b9f0: 43 54 20 43 41 53 45 20 61 20 57 48 45 4e 20 62  CT CASE a WHEN b
ba00: 20 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27   THEN 'A' ELSE '
ba10: 42 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d  B' END FROM t1.}
ba20: 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {B}.do_execsql_
ba30: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31  test e_expr-23.1
ba40: 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .5 {.  SELECT CA
ba50: 53 45 20 62 20 57 48 45 4e 20 61 20 54 48 45 4e  SE b WHEN a THEN
ba60: 20 27 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e   'A' ELSE 'B' EN
ba70: 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 41 7d 0a  D FROM t1.} {A}.
ba80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
ba90: 65 5f 65 78 70 72 2d 32 33 2e 31 2e 36 20 7b 0a  e_expr-23.1.6 {.
baa0: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 35 35    SELECT CASE 55
bab0: 20 57 48 45 4e 20 27 35 35 27 20 54 48 45 4e 20   WHEN '55' THEN 
bac0: 27 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44  'A' ELSE 'B' END
bad0: 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71  .} {B}.do_execsq
bae0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33  l_test e_expr-23
baf0: 2e 31 2e 37 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.7 {.  SELECT 
bb00: 43 41 53 45 20 63 20 57 48 45 4e 20 27 35 35 27  CASE c WHEN '55'
bb10: 20 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27   THEN 'A' ELSE '
bb20: 42 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d  B' END FROM t1.}
bb30: 20 7b 41 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {A}.do_execsql_
bb40: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31  test e_expr-23.1
bb50: 2e 38 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .8 {.  SELECT CA
bb60: 53 45 20 27 33 34 2e 35 27 20 57 48 45 4e 20 64  SE '34.5' WHEN d
bb70: 20 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27   THEN 'A' ELSE '
bb80: 42 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d  B' END FROM t1.}
bb90: 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {B}.do_execsql_
bba0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31  test e_expr-23.1
bbb0: 2e 39 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .9 {.  SELECT CA
bbc0: 53 45 20 4e 55 4c 4c 20 57 48 45 4e 20 4e 55 4c  SE NULL WHEN NUL
bbd0: 4c 20 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20  L THEN 'A' ELSE 
bbe0: 27 42 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 0a 23  'B' END.} {B}..#
bbf0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
bc00: 33 37 33 30 34 2d 33 39 34 30 35 20 49 66 20 74  37304-39405 If t
bc10: 68 65 20 62 61 73 65 20 65 78 70 72 65 73 73 69  he base expressi
bc20: 6f 6e 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  on is NULL then 
bc30: 74 68 65 0a 23 20 72 65 73 75 6c 74 20 6f 66 20  the.# result of 
bc40: 74 68 65 20 43 41 53 45 20 69 73 20 61 6c 77 61  the CASE is alwa
bc50: 79 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ys the result of
bc60: 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
bc70: 45 4c 53 45 0a 23 20 65 78 70 72 65 73 73 69 6f  ELSE.# expressio
bc80: 6e 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20  n if it exists, 
bc90: 6f 72 20 4e 55 4c 4c 20 69 66 20 69 74 20 64 6f  or NULL if it do
bca0: 65 73 20 6e 6f 74 2e 0a 23 0a 64 6f 5f 65 78 65  es not..#.do_exe
bcb0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
bcc0: 2d 32 34 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45  -24.1.1 {.  SELE
bcd0: 43 54 20 43 41 53 45 20 4e 55 4c 4c 20 57 48 45  CT CASE NULL WHE
bce0: 4e 20 27 61 62 63 27 20 54 48 45 4e 20 27 41 27  N 'abc' THEN 'A'
bcf0: 20 57 48 45 4e 20 27 64 65 66 27 20 54 48 45 4e   WHEN 'def' THEN
bd00: 20 27 42 27 20 45 4e 44 3b 0a 7d 20 7b 7b 7d 7d   'B' END;.} {{}}
bd10: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
bd20: 20 65 5f 65 78 70 72 2d 32 34 2e 31 2e 32 20 7b   e_expr-24.1.2 {
bd30: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 4e  .  SELECT CASE N
bd40: 55 4c 4c 20 57 48 45 4e 20 27 61 62 63 27 20 54  ULL WHEN 'abc' T
bd50: 48 45 4e 20 27 41 27 20 57 48 45 4e 20 27 64 65  HEN 'A' WHEN 'de
bd60: 66 27 20 54 48 45 4e 20 27 42 27 20 45 4c 53 45  f' THEN 'B' ELSE
bd70: 20 27 43 27 20 45 4e 44 3b 0a 7d 20 7b 43 7d 0a   'C' END;.} {C}.
bd80: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
bd90: 52 2d 35 36 32 38 30 2d 31 37 33 36 39 20 42 6f  R-56280-17369 Bo
bda0: 74 68 20 66 6f 72 6d 73 20 6f 66 20 74 68 65 20  th forms of the 
bdb0: 43 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20  CASE expression 
bdc0: 75 73 65 20 6c 61 7a 79 2c 0a 23 20 6f 72 20 73  use lazy,.# or s
bdd0: 68 6f 72 74 2d 63 69 72 63 75 69 74 2c 20 65 76  hort-circuit, ev
bde0: 61 6c 75 61 74 69 6f 6e 2e 0a 23 0a 73 65 74 20  aluation..#.set 
bdf0: 76 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 66  varlist [list].f
be00: 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b  oreach {a b c} {
be10: 30 20 31 20 30 7d 20 62 72 65 61 6b 0a 64 6f 5f  0 1 0} break.do_
be20: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
be30: 78 70 72 2d 32 35 2e 31 2e 31 20 7b 0a 20 20 53  xpr-25.1.1 {.  S
be40: 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20  ELECT CASE WHEN 
be50: 76 61 72 28 27 61 27 29 20 54 48 45 4e 20 27 41  var('a') THEN 'A
be60: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
be70: 20 57 48 45 4e 20 76 61 72 28 27 62 27 29 20 54   WHEN var('b') T
be80: 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20  HEN 'B' .       
be90: 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28         WHEN var(
bea0: 27 63 27 29 20 54 48 45 4e 20 27 43 27 20 0a 20  'c') THEN 'C' . 
beb0: 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f 74 65   END.} {B}.do_te
bec0: 73 74 20 65 5f 65 78 70 72 2d 32 35 2e 31 2e 32  st e_expr-25.1.2
bed0: 20 7b 20 73 65 74 20 3a 3a 76 61 72 6c 69 73 74   { set ::varlist
bee0: 20 7d 20 7b 61 20 62 7d 0a 73 65 74 20 76 61 72   } {a b}.set var
bef0: 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65  list [list].do_e
bf00: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
bf10: 70 72 2d 32 35 2e 31 2e 33 20 7b 0a 20 20 53 45  pr-25.1.3 {.  SE
bf20: 4c 45 43 54 20 43 41 53 45 20 27 30 27 20 57 48  LECT CASE '0' WH
bf30: 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e  EN var('a') THEN
bf40: 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20   'A' .          
bf50: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
bf60: 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a  ('b') THEN 'B' .
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 57 48 45 4e 20 76 61 72 28 27 63 27 29 20    WHEN var('c') 
bf90: 54 48 45 4e 20 27 43 27 20 0a 20 20 45 4e 44 0a  THEN 'C' .  END.
bfa0: 7d 20 7b 41 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  } {A}.do_test e_
bfb0: 65 78 70 72 2d 32 35 2e 31 2e 34 20 7b 20 73 65  expr-25.1.4 { se
bfc0: 74 20 3a 3a 76 61 72 6c 69 73 74 20 7d 20 7b 61  t ::varlist } {a
bfd0: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
bfe0: 3a 20 52 2d 33 34 37 37 33 2d 36 32 32 35 33 20  : R-34773-62253 
bff0: 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65  The only differe
c000: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  nce between the 
c010: 66 6f 6c 6c 6f 77 69 6e 67 0a 23 20 74 77 6f 20  following.# two 
c020: 43 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 73  CASE expressions
c030: 20 69 73 20 74 68 61 74 20 74 68 65 20 78 20 65   is that the x e
c040: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
c050: 6c 75 61 74 65 64 20 65 78 61 63 74 6c 79 0a 23  luated exactly.#
c060: 20 6f 6e 63 65 20 69 6e 20 74 68 65 20 66 69 72   once in the fir
c070: 73 74 20 65 78 61 6d 70 6c 65 20 62 75 74 20 6d  st example but m
c080: 69 67 68 74 20 62 65 20 65 76 61 6c 75 61 74 65  ight be evaluate
c090: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
c0a0: 20 69 6e 20 74 68 65 0a 23 20 73 65 63 6f 6e 64   in the.# second
c0b0: 3a 20 43 41 53 45 20 78 20 57 48 45 4e 20 77 31  : CASE x WHEN w1
c0c0: 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 77 32   THEN r1 WHEN w2
c0d0: 20 54 48 45 4e 20 72 32 20 45 4c 53 45 20 72 33   THEN r2 ELSE r3
c0e0: 20 45 4e 44 20 43 41 53 45 20 57 48 45 4e 0a 23   END CASE WHEN.#
c0f0: 20 78 3d 77 31 20 54 48 45 4e 20 72 31 20 57 48   x=w1 THEN r1 WH
c100: 45 4e 20 78 3d 77 32 20 54 48 45 4e 20 72 32 20  EN x=w2 THEN r2 
c110: 45 4c 53 45 20 72 33 20 45 4e 44 0a 23 0a 70 72  ELSE r3 END.#.pr
c120: 6f 63 20 63 65 76 61 6c 20 7b 78 7d 20 7b 0a 20  oc ceval {x} {. 
c130: 20 69 6e 63 72 20 3a 3a 65 76 61 6c 63 6f 75 6e   incr ::evalcoun
c140: 74 0a 20 20 72 65 74 75 72 6e 20 24 78 0a 7d 0a  t.  return $x.}.
c150: 64 62 20 66 75 6e 63 20 63 65 76 61 6c 20 63 65  db func ceval ce
c160: 76 61 6c 0a 73 65 74 20 3a 3a 65 76 61 6c 63 6f  val.set ::evalco
c170: 75 6e 74 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71  unt 0..do_execsq
c180: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36  l_test e_expr-26
c190: 2e 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  .1.1 {.  CREATE 
c1a0: 54 41 42 4c 45 20 74 32 28 78 2c 20 77 31 2c 20  TABLE t2(x, w1, 
c1b0: 72 31 2c 20 77 32 2c 20 72 32 2c 20 72 33 29 3b  r1, w2, r2, r3);
c1c0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
c1d0: 32 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 27  2 VALUES(1, 1, '
c1e0: 52 31 27 2c 20 32 2c 20 27 52 32 27 2c 20 27 52  R1', 2, 'R2', 'R
c1f0: 33 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  3');.  INSERT IN
c200: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20  TO t2 VALUES(2, 
c210: 31 2c 20 27 52 31 27 2c 20 32 2c 20 27 52 32 27  1, 'R1', 2, 'R2'
c220: 2c 20 27 52 33 27 29 3b 0a 20 20 49 4e 53 45 52  , 'R3');.  INSER
c230: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
c240: 28 33 2c 20 31 2c 20 27 52 31 27 2c 20 32 2c 20  (3, 1, 'R1', 2, 
c250: 27 52 32 27 2c 20 27 52 33 27 29 3b 0a 7d 20 7b  'R2', 'R3');.} {
c260: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
c270: 74 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 32 20  t e_expr-26.1.2 
c280: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
c290: 78 20 57 48 45 4e 20 77 31 20 54 48 45 4e 20 72  x WHEN w1 THEN r
c2a0: 31 20 57 48 45 4e 20 77 32 20 54 48 45 4e 20 72  1 WHEN w2 THEN r
c2b0: 32 20 45 4c 53 45 20 72 33 20 45 4e 44 20 46 52  2 ELSE r3 END FR
c2c0: 4f 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32 20 52  OM t2.} {R1 R2 R
c2d0: 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  3}.do_execsql_te
c2e0: 73 74 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 33  st e_expr-26.1.3
c2f0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
c300: 20 57 48 45 4e 20 78 3d 77 31 20 54 48 45 4e 20   WHEN x=w1 THEN 
c310: 72 31 20 57 48 45 4e 20 78 3d 77 32 20 54 48 45  r1 WHEN x=w2 THE
c320: 4e 20 72 32 20 45 4c 53 45 20 72 33 20 45 4e 44  N r2 ELSE r3 END
c330: 20 46 52 4f 4d 20 74 32 0a 7d 20 7b 52 31 20 52   FROM t2.} {R1 R
c340: 32 20 52 33 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  2 R3}..do_execsq
c350: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36  l_test e_expr-26
c360: 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.4 {.  SELECT 
c370: 43 41 53 45 20 63 65 76 61 6c 28 78 29 20 57 48  CASE ceval(x) WH
c380: 45 4e 20 77 31 20 54 48 45 4e 20 72 31 20 57 48  EN w1 THEN r1 WH
c390: 45 4e 20 77 32 20 54 48 45 4e 20 72 32 20 45 4c  EN w2 THEN r2 EL
c3a0: 53 45 20 72 33 20 45 4e 44 20 46 52 4f 4d 20 74  SE r3 END FROM t
c3b0: 32 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d 0a 64  2.} {R1 R2 R3}.d
c3c0: 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36  o_test e_expr-26
c3d0: 2e 31 2e 35 20 7b 20 73 65 74 20 3a 3a 65 76 61  .1.5 { set ::eva
c3e0: 6c 63 6f 75 6e 74 20 7d 20 7b 33 7d 0a 73 65 74  lcount } {3}.set
c3f0: 20 3a 3a 65 76 61 6c 63 6f 75 6e 74 20 30 0a 64   ::evalcount 0.d
c400: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
c410: 5f 65 78 70 72 2d 32 36 2e 31 2e 36 20 7b 0a 20  _expr-26.1.6 {. 
c420: 20 53 45 4c 45 43 54 20 43 41 53 45 20 0a 20 20   SELECT CASE .  
c430: 20 20 57 48 45 4e 20 63 65 76 61 6c 28 78 29 3d    WHEN ceval(x)=
c440: 77 31 20 54 48 45 4e 20 72 31 20 0a 20 20 20 20  w1 THEN r1 .    
c450: 57 48 45 4e 20 63 65 76 61 6c 28 78 29 3d 77 32  WHEN ceval(x)=w2
c460: 20 54 48 45 4e 20 72 32 20 0a 20 20 20 20 45 4c   THEN r2 .    EL
c470: 53 45 20 72 33 20 45 4e 44 20 0a 20 20 46 52 4f  SE r3 END .  FRO
c480: 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32 20 52 33  M t2.} {R1 R2 R3
c490: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72  }.do_test e_expr
c4a0: 2d 32 36 2e 31 2e 36 20 7b 20 73 65 74 20 3a 3a  -26.1.6 { set ::
c4b0: 65 76 61 6c 63 6f 75 6e 74 20 7d 20 7b 35 7d 0a  evalcount } {5}.
c4c0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
c4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
c510: 65 73 74 20 73 74 61 74 65 6d 65 6e 74 73 20 72  est statements r
c520: 65 6c 61 74 65 64 20 74 6f 20 43 41 53 54 20 65  elated to CAST e
c530: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 23 0a 23 20  xpressions..#.# 
c540: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
c550: 35 30 37 39 2d 33 31 37 35 38 20 41 70 70 6c 69  5079-31758 Appli
c560: 63 61 74 69 6f 6e 20 6f 66 20 61 20 43 41 53 54  cation of a CAST
c570: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 23   expression is.#
c580: 20 64 69 66 66 65 72 65 6e 74 20 74 6f 20 61 70   different to ap
c590: 70 6c 69 63 61 74 69 6f 6e 20 6f 66 20 61 20 63  plication of a c
c5a0: 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 2c 20  olumn affinity, 
c5b0: 61 73 20 77 69 74 68 20 61 20 43 41 53 54 0a 23  as with a CAST.#
c5c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 65 20   expression the 
c5d0: 73 74 6f 72 61 67 65 20 63 6c 61 73 73 20 63 6f  storage class co
c5e0: 6e 76 65 72 73 69 6f 6e 20 69 73 20 66 6f 72 63  nversion is forc
c5f0: 65 64 20 65 76 65 6e 20 69 66 20 69 74 20 69 73  ed even if it is
c600: 20 6c 6f 73 73 79 0a 23 20 61 6e 64 20 69 72 72   lossy.# and irr
c610: 72 65 76 65 72 73 69 62 6c 65 2e 0a 23 0a 64 6f  reversible..#.do
c620: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
c630: 65 78 70 72 2d 32 37 2e 31 2e 31 20 7b 0a 20 20  expr-27.1.1 {.  
c640: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
c650: 61 20 54 45 58 54 2c 20 62 20 52 45 41 4c 2c 20  a TEXT, b REAL, 
c660: 63 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 49 4e  c INTEGER);.  IN
c670: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
c680: 55 45 53 28 58 27 35 35 35 36 35 35 27 2c 20 27  UES(X'555655', '
c690: 31 2e 32 33 61 62 63 27 2c 20 34 2e 35 29 3b 0a  1.23abc', 4.5);.
c6a0: 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28    SELECT typeof(
c6b0: 61 29 2c 20 61 2c 20 74 79 70 65 6f 66 28 62 29  a), a, typeof(b)
c6c0: 2c 20 62 2c 20 74 79 70 65 6f 66 28 63 29 2c 20  , b, typeof(c), 
c6d0: 63 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 62 6c  c FROM t3;.} {bl
c6e0: 6f 62 20 55 56 55 20 74 65 78 74 20 31 2e 32 33  ob UVU text 1.23
c6f0: 61 62 63 20 72 65 61 6c 20 34 2e 35 7d 0a 64 6f  abc real 4.5}.do
c700: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
c710: 65 78 70 72 2d 32 37 2e 31 2e 32 20 7b 0a 20 20  expr-27.1.2 {.  
c720: 53 45 4c 45 43 54 20 0a 20 20 20 20 74 79 70 65  SELECT .    type
c730: 6f 66 28 43 41 53 54 28 58 27 35 35 35 36 35 35  of(CAST(X'555655
c740: 27 20 61 73 20 54 45 58 54 29 29 2c 20 43 41 53  ' as TEXT)), CAS
c750: 54 28 58 27 35 35 35 36 35 35 27 20 61 73 20 54  T(X'555655' as T
c760: 45 58 54 29 2c 0a 20 20 20 20 74 79 70 65 6f 66  EXT),.    typeof
c770: 28 43 41 53 54 28 27 31 2e 32 33 61 62 63 27 20  (CAST('1.23abc' 
c780: 61 73 20 52 45 41 4c 29 29 2c 20 43 41 53 54 28  as REAL)), CAST(
c790: 27 31 2e 32 33 61 62 63 27 20 61 73 20 52 45 41  '1.23abc' as REA
c7a0: 4c 29 2c 0a 20 20 20 20 74 79 70 65 6f 66 28 43  L),.    typeof(C
c7b0: 41 53 54 28 34 2e 35 20 61 73 20 49 4e 54 45 47  AST(4.5 as INTEG
c7c0: 45 52 29 29 2c 20 43 41 53 54 28 34 2e 35 20 61  ER)), CAST(4.5 a
c7d0: 73 20 49 4e 54 45 47 45 52 29 0a 7d 20 7b 74 65  s INTEGER).} {te
c7e0: 78 74 20 55 56 55 20 72 65 61 6c 20 31 2e 32 33  xt UVU real 1.23
c7f0: 20 69 6e 74 65 67 65 72 20 34 7d 0a 0a 23 20 45   integer 4}..# E
c800: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37  VIDENCE-OF: R-27
c810: 32 32 35 2d 36 35 30 35 30 20 49 66 20 74 68 65  225-65050 If the
c820: 20 76 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e   value of <expr>
c830: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 0a 23   is NULL, then.#
c840: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
c850: 68 65 20 43 41 53 54 20 65 78 70 72 65 73 73 69  he CAST expressi
c860: 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  on is also NULL.
c870: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
c880: 65 5f 65 78 70 72 2d 32 37 2e 32 2e 31 20 7b 20  e_expr-27.2.1 { 
c890: 43 41 53 54 28 4e 55 4c 4c 20 41 53 20 69 6e 74  CAST(NULL AS int
c8a0: 65 67 65 72 29 20 7d 20 6e 75 6c 6c 20 7b 7d 0a  eger) } null {}.
c8b0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
c8c0: 78 70 72 2d 32 37 2e 32 2e 32 20 7b 20 43 41 53  xpr-27.2.2 { CAS
c8d0: 54 28 4e 55 4c 4c 20 41 53 20 74 65 78 74 29 20  T(NULL AS text) 
c8e0: 7d 20 20 20 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f  }    null {}.do_
c8f0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
c900: 2d 32 37 2e 32 2e 33 20 7b 20 43 41 53 54 28 4e  -27.2.3 { CAST(N
c910: 55 4c 4c 20 41 53 20 62 6c 6f 62 29 20 7d 20 20  ULL AS blob) }  
c920: 20 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65 78 70    null {}.do_exp
c930: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
c940: 2e 32 2e 34 20 7b 20 43 41 53 54 28 4e 55 4c 4c  .2.4 { CAST(NULL
c950: 20 41 53 20 6e 75 6d 62 65 72 29 20 7d 20 20 6e   AS number) }  n
c960: 75 6c 6c 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e  ull {}..# EVIDEN
c970: 43 45 2d 4f 46 3a 20 52 2d 33 31 30 37 36 2d 32  CE-OF: R-31076-2
c980: 33 35 37 35 20 43 61 73 74 69 6e 67 20 61 20 76  3575 Casting a v
c990: 61 6c 75 65 20 74 6f 20 61 20 3c 74 79 70 65 2d  alue to a <type-
c9a0: 6e 61 6d 65 3e 20 77 69 74 68 0a 23 20 6e 6f 20  name> with.# no 
c9b0: 61 66 66 69 6e 69 74 79 20 63 61 75 73 65 73 20  affinity causes 
c9c0: 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
c9d0: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
c9e0: 20 42 4c 4f 42 2e 0a 23 0a 64 6f 5f 65 78 70 72   BLOB..#.do_expr
c9f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
ca00: 33 2e 31 20 7b 20 43 41 53 54 28 27 61 62 63 27  3.1 { CAST('abc'
ca10: 20 41 53 20 62 6c 6f 62 29 20 20 20 20 20 20 20   AS blob)       
ca20: 7d 20 62 6c 6f 62 20 61 62 63 0a 64 6f 5f 65 78  } blob abc.do_ex
ca30: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
ca40: 37 2e 33 2e 32 20 7b 20 43 41 53 54 28 27 64 65  7.3.2 { CAST('de
ca50: 66 27 20 41 53 20 73 68 6f 62 62 6c 6f 62 5f 78  f' AS shobblob_x
ca60: 29 20 7d 20 62 6c 6f 62 20 64 65 66 0a 64 6f 5f  ) } blob def.do_
ca70: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
ca80: 2d 32 37 2e 33 2e 33 20 7b 20 43 41 53 54 28 27  -27.3.3 { CAST('
ca90: 67 68 69 27 20 41 53 20 61 62 62 4c 4f 62 31 30  ghi' AS abbLOb10
caa0: 29 20 20 20 7d 20 62 6c 6f 62 20 67 68 69 0a 0a  )   } blob ghi..
cab0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
cac0: 2d 32 32 39 35 36 2d 33 37 37 35 34 20 43 61 73  -22956-37754 Cas
cad0: 74 69 6e 67 20 74 6f 20 61 20 42 4c 4f 42 20 63  ting to a BLOB c
cae0: 6f 6e 73 69 73 74 73 20 6f 66 20 66 69 72 73 74  onsists of first
caf0: 20 63 61 73 74 69 6e 67 0a 23 20 74 68 65 20 76   casting.# the v
cb00: 61 6c 75 65 20 74 6f 20 54 45 58 54 20 69 6e 20  alue to TEXT in 
cb10: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
cb20: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
cb30: 6e 65 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 23 20  nection, then.# 
cb40: 69 6e 74 65 72 70 72 65 74 69 6e 67 20 74 68 65  interpreting the
cb50: 20 72 65 73 75 6c 74 69 6e 67 20 62 79 74 65 20   resulting byte 
cb60: 73 65 71 75 65 6e 63 65 20 61 73 20 61 20 42 4c  sequence as a BL
cb70: 4f 42 20 69 6e 73 74 65 61 64 20 6f 66 20 61 73  OB instead of as
cb80: 20 54 45 58 54 2e 0a 23 0a 64 6f 5f 71 65 78 70   TEXT..#.do_qexp
cb90: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
cba0: 2e 34 2e 31 20 7b 20 43 41 53 54 28 27 67 68 69  .4.1 { CAST('ghi
cbb0: 27 20 41 53 20 62 6c 6f 62 29 20 7d 20 58 27 36  ' AS blob) } X'6
cbc0: 37 36 38 36 39 27 0a 64 6f 5f 71 65 78 70 72 5f  76869'.do_qexpr_
cbd0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34  test e_expr-27.4
cbe0: 2e 32 20 7b 20 43 41 53 54 28 34 35 36 20 41 53  .2 { CAST(456 AS
cbf0: 20 62 6c 6f 62 29 20 7d 20 20 20 58 27 33 34 33   blob) }   X'343
cc00: 35 33 36 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65  536'.do_qexpr_te
cc10: 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 33  st e_expr-27.4.3
cc20: 20 7b 20 43 41 53 54 28 31 2e 37 38 20 41 53 20   { CAST(1.78 AS 
cc30: 62 6c 6f 62 29 20 7d 20 20 58 27 33 31 32 45 33  blob) }  X'312E3
cc40: 37 33 38 27 0a 72 65 6e 61 6d 65 20 64 62 20 64  738'.rename db d
cc50: 62 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d  b2.sqlite3 db :m
cc60: 65 6d 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c 65  emory:.ifcapable
cc70: 20 7b 75 74 66 31 36 7d 20 7b 0a 64 62 20 65 76   {utf16} {.db ev
cc80: 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f  al { PRAGMA enco
cc90: 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65  ding = 'utf-16le
cca0: 27 20 7d 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73  ' }.do_qexpr_tes
ccb0: 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 34 20  t e_expr-27.4.4 
ccc0: 7b 20 43 41 53 54 28 27 67 68 69 27 20 41 53 20  { CAST('ghi' AS 
ccd0: 62 6c 6f 62 29 20 7d 20 58 27 36 37 30 30 36 38  blob) } X'670068
cce0: 30 30 36 39 30 30 27 0a 64 6f 5f 71 65 78 70 72  006900'.do_qexpr
ccf0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
cd00: 34 2e 35 20 7b 20 43 41 53 54 28 34 35 36 20 41  4.5 { CAST(456 A
cd10: 53 20 62 6c 6f 62 29 20 7d 20 20 20 58 27 33 34  S blob) }   X'34
cd20: 30 30 33 35 30 30 33 36 30 30 27 0a 64 6f 5f 71  0035003600'.do_q
cd30: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
cd40: 2d 32 37 2e 34 2e 36 20 7b 20 43 41 53 54 28 31  -27.4.6 { CAST(1
cd50: 2e 37 38 20 41 53 20 62 6c 6f 62 29 20 7d 20 20  .78 AS blob) }  
cd60: 58 27 33 31 30 30 32 45 30 30 33 37 30 30 33 38  X'31002E00370038
cd70: 30 30 27 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 73  00'.}.db close.s
cd80: 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72  qlite3 db :memor
cd90: 79 3a 0a 64 62 20 65 76 61 6c 20 7b 20 50 52 41  y:.db eval { PRA
cda0: 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27  GMA encoding = '
cdb0: 75 74 66 2d 31 36 62 65 27 20 7d 0a 69 66 63 61  utf-16be' }.ifca
cdc0: 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a  pable {utf16} {.
cdd0: 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f  do_qexpr_test e_
cde0: 65 78 70 72 2d 32 37 2e 34 2e 37 20 7b 20 43 41  expr-27.4.7 { CA
cdf0: 53 54 28 27 67 68 69 27 20 41 53 20 62 6c 6f 62  ST('ghi' AS blob
ce00: 29 20 7d 20 58 27 30 30 36 37 30 30 36 38 30 30  ) } X'0067006800
ce10: 36 39 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73  69'.do_qexpr_tes
ce20: 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 38 20  t e_expr-27.4.8 
ce30: 7b 20 43 41 53 54 28 34 35 36 20 41 53 20 62 6c  { CAST(456 AS bl
ce40: 6f 62 29 20 7d 20 20 20 58 27 30 30 33 34 30 30  ob) }   X'003400
ce50: 33 35 30 30 33 36 27 0a 64 6f 5f 71 65 78 70 72  350036'.do_qexpr
ce60: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
ce70: 34 2e 39 20 7b 20 43 41 53 54 28 31 2e 37 38 20  4.9 { CAST(1.78 
ce80: 41 53 20 62 6c 6f 62 29 20 7d 20 20 58 27 30 30  AS blob) }  X'00
ce90: 33 31 30 30 32 45 30 30 33 37 30 30 33 38 27 0a  31002E00370038'.
cea0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61 6d  }.db close.renam
ceb0: 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49 44  e db2 db..# EVID
cec0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 32 30 37  ENCE-OF: R-04207
ced0: 2d 33 37 39 38 31 20 54 6f 20 63 61 73 74 20 61  -37981 To cast a
cee0: 20 42 4c 4f 42 20 76 61 6c 75 65 20 74 6f 20 54   BLOB value to T
cef0: 45 58 54 2c 20 74 68 65 20 73 65 71 75 65 6e 63  EXT, the sequenc
cf00: 65 0a 23 20 6f 66 20 62 79 74 65 73 20 74 68 61  e.# of bytes tha
cf10: 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 42 4c  t make up the BL
cf20: 4f 42 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  OB is interprete
cf30: 64 20 61 73 20 74 65 78 74 20 65 6e 63 6f 64 65  d as text encode
cf40: 64 20 75 73 69 6e 67 0a 23 20 74 68 65 20 64 61  d using.# the da
cf50: 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 2e  tabase encoding.
cf60: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
cf70: 65 5f 65 78 70 72 2d 32 38 2e 31 2e 31 20 7b 20  e_expr-28.1.1 { 
cf80: 43 41 53 54 20 28 58 27 36 37 36 38 36 39 27 20  CAST (X'676869' 
cf90: 41 53 20 74 65 78 74 29 20 7d 20 74 65 78 74 20  AS text) } text 
cfa0: 67 68 69 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ghi.do_expr_test
cfb0: 20 65 5f 65 78 70 72 2d 32 38 2e 31 2e 32 20 7b   e_expr-28.1.2 {
cfc0: 20 43 41 53 54 20 28 58 27 36 37 30 30 36 38 30   CAST (X'6700680
cfd0: 30 36 39 30 30 27 20 41 53 20 74 65 78 74 29 20  06900' AS text) 
cfe0: 7d 20 74 65 78 74 20 67 0a 72 65 6e 61 6d 65 20  } text g.rename 
cff0: 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33 20 64  db db2.sqlite3 d
d000: 62 20 3a 6d 65 6d 6f 72 79 3a 0a 64 62 20 65 76  b :memory:.db ev
d010: 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f  al { PRAGMA enco
d020: 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65  ding = 'utf-16le
d030: 27 20 7d 0a 69 66 63 61 70 61 62 6c 65 20 7b 75  ' }.ifcapable {u
d040: 74 66 31 36 7d 20 7b 0a 64 6f 5f 65 78 70 72 5f  tf16} {.do_expr_
d050: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 31  test e_expr-28.1
d060: 2e 33 20 7b 20 43 41 53 54 20 28 58 27 36 37 36  .3 { CAST (X'676
d070: 38 36 39 27 20 41 53 20 74 65 78 74 29 20 3d 3d  869' AS text) ==
d080: 20 27 67 68 69 27 20 7d 20 69 6e 74 65 67 65 72   'ghi' } integer
d090: 20 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20   0.do_expr_test 
d0a0: 65 5f 65 78 70 72 2d 32 38 2e 31 2e 34 20 7b 20  e_expr-28.1.4 { 
d0b0: 43 41 53 54 20 28 58 27 36 37 30 30 36 38 30 30  CAST (X'67006800
d0c0: 36 39 30 30 27 20 41 53 20 74 65 78 74 29 20 7d  6900' AS text) }
d0d0: 20 74 65 78 74 20 67 68 69 0a 7d 0a 64 62 20 63   text ghi.}.db c
d0e0: 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62 32 20  lose.rename db2 
d0f0: 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  db..# EVIDENCE-O
d100: 46 3a 20 52 2d 32 32 32 33 35 2d 34 37 30 30 36  F: R-22235-47006
d110: 20 43 61 73 74 69 6e 67 20 61 6e 20 49 4e 54 45   Casting an INTE
d120: 47 45 52 20 6f 72 20 52 45 41 4c 20 76 61 6c 75  GER or REAL valu
d130: 65 20 69 6e 74 6f 20 54 45 58 54 0a 23 20 72 65  e into TEXT.# re
d140: 6e 64 65 72 73 20 74 68 65 20 76 61 6c 75 65 20  nders the value 
d150: 61 73 20 69 66 20 76 69 61 20 73 71 6c 69 74 65  as if via sqlite
d160: 33 5f 73 6e 70 72 69 6e 74 66 28 29 20 65 78 63  3_snprintf() exc
d170: 65 70 74 20 74 68 61 74 20 74 68 65 0a 23 20 72  ept that the.# r
d180: 65 73 75 6c 74 69 6e 67 20 54 45 58 54 20 75 73  esulting TEXT us
d190: 65 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  es the encoding 
d1a0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
d1b0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23 0a 64 6f  connection..#.do
d1c0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d1d0: 72 2d 32 38 2e 32 2e 31 20 7b 20 43 41 53 54 20  r-28.2.1 { CAST 
d1e0: 28 31 20 41 53 20 74 65 78 74 29 20 20 20 7d 20  (1 AS text)   } 
d1f0: 20 20 20 20 74 65 78 74 20 31 0a 64 6f 5f 65 78      text 1.do_ex
d200: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d210: 38 2e 32 2e 32 20 7b 20 43 41 53 54 20 28 34 35  8.2.2 { CAST (45
d220: 20 41 53 20 74 65 78 74 29 20 20 7d 20 20 20 20   AS text)  }    
d230: 20 74 65 78 74 20 34 35 0a 64 6f 5f 65 78 70 72   text 45.do_expr
d240: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e  _test e_expr-28.
d250: 32 2e 33 20 7b 20 43 41 53 54 20 28 2d 34 35 20  2.3 { CAST (-45 
d260: 41 53 20 74 65 78 74 29 20 7d 20 20 20 20 20 74  AS text) }     t
d270: 65 78 74 20 2d 34 35 0a 64 6f 5f 65 78 70 72 5f  ext -45.do_expr_
d280: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32  test e_expr-28.2
d290: 2e 34 20 7b 20 43 41 53 54 20 28 38 2e 38 20 41  .4 { CAST (8.8 A
d2a0: 53 20 74 65 78 74 29 20 20 20 20 7d 20 20 74 65  S text)    }  te
d2b0: 78 74 20 38 2e 38 0a 64 6f 5f 65 78 70 72 5f 74  xt 8.8.do_expr_t
d2c0: 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e  est e_expr-28.2.
d2d0: 35 20 7b 20 43 41 53 54 20 28 32 2e 33 65 2b 35  5 { CAST (2.3e+5
d2e0: 20 41 53 20 74 65 78 74 29 20 7d 20 20 74 65 78   AS text) }  tex
d2f0: 74 20 32 33 30 30 30 30 2e 30 0a 64 6f 5f 65 78  t 230000.0.do_ex
d300: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d310: 38 2e 32 2e 36 20 7b 20 43 41 53 54 20 28 2d 32  8.2.6 { CAST (-2
d320: 2e 33 65 2d 35 20 41 53 20 74 65 78 74 29 20 7d  .3e-5 AS text) }
d330: 20 74 65 78 74 20 2d 32 2e 33 65 2d 30 35 0a 64   text -2.3e-05.d
d340: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d350: 70 72 2d 32 38 2e 32 2e 37 20 7b 20 43 41 53 54  pr-28.2.7 { CAST
d360: 20 28 30 2e 30 20 41 53 20 74 65 78 74 29 20 7d   (0.0 AS text) }
d370: 20 20 20 20 20 74 65 78 74 20 30 2e 30 0a 64 6f       text 0.0.do
d380: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d390: 72 2d 32 38 2e 32 2e 37 20 7b 20 43 41 53 54 20  r-28.2.7 { CAST 
d3a0: 28 30 20 41 53 20 74 65 78 74 29 20 7d 20 20 20  (0 AS text) }   
d3b0: 20 20 20 20 74 65 78 74 20 30 0a 0a 23 20 45 56      text 0..# EV
d3c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 33  IDENCE-OF: R-263
d3d0: 34 36 2d 33 36 34 34 33 20 57 68 65 6e 20 63 61  46-36443 When ca
d3e0: 73 74 69 6e 67 20 61 20 42 4c 4f 42 20 76 61 6c  sting a BLOB val
d3f0: 75 65 20 74 6f 20 61 20 52 45 41 4c 2c 20 74 68  ue to a REAL, th
d400: 65 0a 23 20 76 61 6c 75 65 20 69 73 20 66 69 72  e.# value is fir
d410: 73 74 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  st converted to 
d420: 54 45 58 54 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  TEXT..#.do_expr_
d430: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31  test e_expr-29.1
d440: 2e 31 20 7b 20 43 41 53 54 20 28 58 27 33 31 32  .1 { CAST (X'312
d450: 45 33 32 33 33 27 20 41 53 20 52 45 41 4c 29 20  E3233' AS REAL) 
d460: 7d 20 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65  } real 1.23.do_e
d470: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
d480: 32 39 2e 31 2e 32 20 7b 20 43 41 53 54 20 28 58  29.1.2 { CAST (X
d490: 27 33 32 33 33 33 30 32 45 33 30 27 20 41 53 20  '3233302E30' AS 
d4a0: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 32 33 30  REAL) } real 230
d4b0: 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .0.do_expr_test 
d4c0: 65 5f 65 78 70 72 2d 32 39 2e 31 2e 33 20 7b 20  e_expr-29.1.3 { 
d4d0: 43 41 53 54 20 28 58 27 32 44 33 39 32 45 33 38  CAST (X'2D392E38
d4e0: 33 37 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  37' AS REAL) } r
d4f0: 65 61 6c 20 2d 39 2e 38 37 0a 64 6f 5f 65 78 70  eal -9.87.do_exp
d500: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
d510: 2e 31 2e 34 20 7b 20 43 41 53 54 20 28 58 27 33  .1.4 { CAST (X'3
d520: 30 32 45 33 30 33 30 33 30 33 31 27 20 41 53 20  02E30303031' AS 
d530: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 30 2e 30  REAL) } real 0.0
d540: 30 30 31 0a 72 65 6e 61 6d 65 20 64 62 20 64 62  001.rename db db
d550: 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65  2.sqlite3 db :me
d560: 6d 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c 65 20  mory:.ifcapable 
d570: 7b 75 74 66 31 36 7d 20 7b 0a 64 62 20 65 76 61  {utf16} {.db eva
d580: 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  l { PRAGMA encod
d590: 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65 27  ing = 'utf-16le'
d5a0: 20 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20   }.do_expr_test 
d5b0: 65 5f 65 78 70 72 2d 32 39 2e 31 2e 35 20 7b 20  e_expr-29.1.5 { 
d5c0: 0a 20 20 20 20 43 41 53 54 20 28 58 27 33 31 30  .    CAST (X'310
d5d0: 30 32 45 30 30 33 32 30 30 33 33 30 30 27 20 41  02E0032003300' A
d5e0: 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 31  S REAL) } real 1
d5f0: 2e 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  .23.do_expr_test
d600: 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e 36 20 7b   e_expr-29.1.6 {
d610: 20 0a 20 20 20 20 43 41 53 54 20 28 58 27 33 32   .    CAST (X'32
d620: 30 30 33 33 30 30 33 30 30 30 32 45 30 30 33 30  00330030002E0030
d630: 30 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  00' AS REAL) } r
d640: 65 61 6c 20 32 33 30 2e 30 0a 64 6f 5f 65 78 70  eal 230.0.do_exp
d650: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
d660: 2e 31 2e 37 20 7b 20 0a 20 20 20 20 43 41 53 54  .1.7 { .    CAST
d670: 20 28 58 27 32 44 30 30 33 39 30 30 32 45 30 30   (X'2D0039002E00
d680: 33 38 30 30 33 37 30 30 27 20 41 53 20 52 45 41  38003700' AS REA
d690: 4c 29 20 7d 20 72 65 61 6c 20 2d 39 2e 38 37 0a  L) } real -9.87.
d6a0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d6b0: 78 70 72 2d 32 39 2e 31 2e 38 20 7b 20 0a 20 20  xpr-29.1.8 { .  
d6c0: 20 20 43 41 53 54 20 28 58 27 33 30 30 30 32 45    CAST (X'30002E
d6d0: 30 30 33 30 30 30 33 30 30 30 33 30 30 30 33 31  0030003000300031
d6e0: 30 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  00' AS REAL) } r
d6f0: 65 61 6c 20 30 2e 30 30 30 31 0a 7d 0a 64 62 20  eal 0.0001.}.db 
d700: 63 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62 32  close.rename db2
d710: 20 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   db..# EVIDENCE-
d720: 4f 46 3a 20 52 2d 35 34 38 39 38 2d 33 34 35 35  OF: R-54898-3455
d730: 34 20 57 68 65 6e 20 63 61 73 74 69 6e 67 20 61  4 When casting a
d740: 20 54 45 58 54 20 76 61 6c 75 65 20 74 6f 20 52   TEXT value to R
d750: 45 41 4c 2c 20 74 68 65 0a 23 20 6c 6f 6e 67 65  EAL, the.# longe
d760: 73 74 20 70 6f 73 73 69 62 6c 65 20 70 72 65 66  st possible pref
d770: 69 78 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ix of the value 
d780: 74 68 61 74 20 63 61 6e 20 62 65 20 69 6e 74 65  that can be inte
d790: 72 70 72 65 74 65 64 20 61 73 20 61 20 72 65 61  rpreted as a rea
d7a0: 6c 0a 23 20 6e 75 6d 62 65 72 20 69 73 20 65 78  l.# number is ex
d7b0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
d7c0: 20 54 45 58 54 20 76 61 6c 75 65 20 61 6e 64 20   TEXT value and 
d7d0: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69 67  the remainder ig
d7e0: 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 70 72  nored..#.do_expr
d7f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d800: 32 2e 31 20 7b 20 43 41 53 54 28 27 31 2e 32 33  2.1 { CAST('1.23
d810: 61 62 63 64 27 20 41 53 20 52 45 41 4c 29 20 7d  abcd' AS REAL) }
d820: 20 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65 78   real 1.23.do_ex
d830: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d840: 39 2e 32 2e 32 20 7b 20 43 41 53 54 28 27 31 2e  9.2.2 { CAST('1.
d850: 34 35 2e 32 33 61 62 63 64 27 20 41 53 20 52 45  45.23abcd' AS RE
d860: 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 34 35 0a  AL) } real 1.45.
d870: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d880: 78 70 72 2d 32 39 2e 32 2e 33 20 7b 20 43 41 53  xpr-29.2.3 { CAS
d890: 54 28 27 2d 32 2e 31 32 65 2d 30 31 41 42 43 27  T('-2.12e-01ABC'
d8a0: 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c   AS REAL) } real
d8b0: 20 2d 30 2e 32 31 32 0a 64 6f 5f 65 78 70 72 5f   -0.212.do_expr_
d8c0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 32  test e_expr-29.2
d8d0: 2e 34 20 7b 20 43 41 53 54 28 27 31 20 32 20 33  .4 { CAST('1 2 3
d8e0: 20 34 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72   4' AS REAL) } r
d8f0: 65 61 6c 20 31 2e 30 0a 0a 23 20 45 56 49 44 45  eal 1.0..# EVIDE
d900: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 33 32 31 2d  NCE-OF: R-11321-
d910: 34 37 34 32 37 20 41 6e 79 20 6c 65 61 64 69 6e  47427 Any leadin
d920: 67 20 73 70 61 63 65 73 20 69 6e 20 74 68 65 20  g spaces in the 
d930: 54 45 58 54 20 76 61 6c 75 65 20 61 72 65 0a 23  TEXT value are.#
d940: 20 69 67 6e 6f 72 65 64 20 77 68 65 6e 20 63 6f   ignored when co
d950: 6e 76 65 72 67 69 6e 67 20 66 72 6f 6d 20 54 45  nverging from TE
d960: 58 54 20 74 6f 20 52 45 41 4c 2e 0a 23 0a 64 6f  XT to REAL..#.do
d970: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d980: 72 2d 32 39 2e 33 2e 31 20 7b 20 43 41 53 54 28  r-29.3.1 { CAST(
d990: 27 20 31 2e 32 33 61 62 63 64 27 20 41 53 20 52  ' 1.23abcd' AS R
d9a0: 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32 33  EAL) } real 1.23
d9b0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d9c0: 65 78 70 72 2d 32 39 2e 33 2e 32 20 7b 20 43 41  expr-29.3.2 { CA
d9d0: 53 54 28 27 20 20 20 20 31 2e 34 35 2e 32 33 61  ST('    1.45.23a
d9e0: 62 63 64 27 20 41 53 20 52 45 41 4c 29 20 7d 20  bcd' AS REAL) } 
d9f0: 72 65 61 6c 20 31 2e 34 35 0a 64 6f 5f 65 78 70  real 1.45.do_exp
da00: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
da10: 2e 33 2e 33 20 7b 20 43 41 53 54 28 27 20 20 20  .3.3 { CAST('   
da20: 2d 32 2e 31 32 65 2d 30 31 41 42 43 27 20 41 53  -2.12e-01ABC' AS
da30: 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 2d 30   REAL) } real -0
da40: 2e 32 31 32 0a 64 6f 5f 65 78 70 72 5f 74 65 73  .212.do_expr_tes
da50: 74 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e 34 20  t e_expr-29.3.4 
da60: 7b 20 43 41 53 54 28 27 20 31 20 32 20 33 20 34  { CAST(' 1 2 3 4
da70: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
da80: 6c 20 31 2e 30 0a 0a 23 20 45 56 49 44 45 4e 43  l 1.0..# EVIDENC
da90: 45 2d 4f 46 3a 20 52 2d 32 32 36 36 32 2d 32 38  E-OF: R-22662-28
daa0: 32 31 38 20 49 66 20 74 68 65 72 65 20 69 73 20  218 If there is 
dab0: 6e 6f 20 70 72 65 66 69 78 20 74 68 61 74 20 63  no prefix that c
dac0: 61 6e 20 62 65 0a 23 20 69 6e 74 65 72 70 72 65  an be.# interpre
dad0: 74 65 64 20 61 73 20 61 20 72 65 61 6c 20 6e 75  ted as a real nu
dae0: 6d 62 65 72 2c 20 74 68 65 20 72 65 73 75 6c 74  mber, the result
daf0: 20 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69   of the conversi
db00: 6f 6e 20 69 73 20 30 2e 30 2e 0a 23 0a 64 6f 5f  on is 0.0..#.do_
db10: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
db20: 2d 32 39 2e 34 2e 31 20 7b 20 43 41 53 54 28 27  -29.4.1 { CAST('
db30: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
db40: 6c 20 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65  l 0.0.do_expr_te
db50: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 34 2e 32  st e_expr-29.4.2
db60: 20 7b 20 43 41 53 54 28 27 6e 6f 74 20 61 20 6e   { CAST('not a n
db70: 75 6d 62 65 72 27 20 41 53 20 52 45 41 4c 29 20  umber' AS REAL) 
db80: 7d 20 72 65 61 6c 20 30 2e 30 0a 64 6f 5f 65 78  } real 0.0.do_ex
db90: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
dba0: 39 2e 34 2e 33 20 7b 20 43 41 53 54 28 27 58 58  9.4.3 { CAST('XX
dbb0: 49 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  I' AS REAL) } re
dbc0: 61 6c 20 30 2e 30 0a 0a 23 20 45 56 49 44 45 4e  al 0.0..# EVIDEN
dbd0: 43 45 2d 4f 46 3a 20 52 2d 32 31 38 32 39 2d 31  CE-OF: R-21829-1
dbe0: 34 35 36 33 20 57 68 65 6e 20 63 61 73 74 69 6e  4563 When castin
dbf0: 67 20 61 20 42 4c 4f 42 20 76 61 6c 75 65 20 74  g a BLOB value t
dc00: 6f 20 49 4e 54 45 47 45 52 2c 20 74 68 65 0a 23  o INTEGER, the.#
dc10: 20 76 61 6c 75 65 20 69 73 20 66 69 72 73 74 20   value is first 
dc20: 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 54 45 58  converted to TEX
dc30: 54 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73  T..#.do_expr_tes
dc40: 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 31 20  t e_expr-30.1.1 
dc50: 7b 20 43 41 53 54 28 58 27 33 31 33 32 33 33 27  { CAST(X'313233'
dc60: 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69   AS INTEGER) } i
dc70: 6e 74 65 67 65 72 20 31 32 33 0a 64 6f 5f 65 78  nteger 123.do_ex
dc80: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
dc90: 30 2e 31 2e 32 20 7b 20 43 41 53 54 28 58 27 32  0.1.2 { CAST(X'2
dca0: 44 33 36 33 37 33 38 27 20 41 53 20 49 4e 54 45  D363738' AS INTE
dcb0: 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 2d  GER) } integer -
dcc0: 36 37 38 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  678.do_expr_test
dcd0: 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 33 20 7b   e_expr-30.1.3 {
dce0: 20 0a 20 20 43 41 53 54 28 58 27 33 31 33 30 33   .  CAST(X'31303
dcf0: 30 33 30 33 30 33 30 33 30 27 20 41 53 20 49 4e  030303030' AS IN
dd00: 54 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67 65  TEGER) .} intege
dd10: 72 20 31 30 30 30 30 30 30 0a 64 6f 5f 65 78 70  r 1000000.do_exp
dd20: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
dd30: 2e 31 2e 34 20 7b 20 0a 20 20 43 41 53 54 28 58  .1.4 { .  CAST(X
dd40: 27 32 44 33 31 33 31 33 32 33 35 33 38 33 39 33  '2D3131323538393
dd50: 39 33 39 33 30 33 36 33 38 33 34 33 32 33 36 33  9393036383432363
dd60: 32 33 34 27 20 41 53 20 49 4e 54 45 47 45 52 29  234' AS INTEGER)
dd70: 20 0a 7d 20 69 6e 74 65 67 65 72 20 2d 31 31 32   .} integer -112
dd80: 35 38 39 39 39 30 36 38 34 32 36 32 34 0a 0a 72  5899906842624..r
dd90: 65 6e 61 6d 65 20 64 62 20 64 62 32 0a 73 71 6c  ename db db2.sql
dda0: 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a  ite3 db :memory:
ddb0: 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66 31  .ifcapable {utf1
ddc0: 36 7d 20 7b 0a 65 78 65 63 73 71 6c 20 7b 20 50  6} {.execsql { P
ddd0: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d  RAGMA encoding =
dde0: 20 27 75 74 66 2d 31 36 62 65 27 20 7d 0a 64 6f   'utf-16be' }.do
ddf0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
de00: 72 2d 33 30 2e 31 2e 35 20 7b 20 43 41 53 54 28  r-30.1.5 { CAST(
de10: 58 27 30 30 33 31 30 30 33 32 30 30 33 33 27 20  X'003100320033' 
de20: 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e  AS INTEGER) } in
de30: 74 65 67 65 72 20 31 32 33 0a 64 6f 5f 65 78 70  teger 123.do_exp
de40: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
de50: 2e 31 2e 36 20 7b 20 43 41 53 54 28 58 27 30 30  .1.6 { CAST(X'00
de60: 32 44 30 30 33 36 30 30 33 37 30 30 33 38 27 20  2D003600370038' 
de70: 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e  AS INTEGER) } in
de80: 74 65 67 65 72 20 2d 36 37 38 0a 64 6f 5f 65 78  teger -678.do_ex
de90: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
dea0: 30 2e 31 2e 37 20 7b 20 0a 20 20 43 41 53 54 28  0.1.7 { .  CAST(
deb0: 58 27 30 30 33 31 30 30 33 30 30 30 33 30 30 30  X'00310030003000
dec0: 33 30 30 30 33 30 30 30 33 30 30 30 33 30 27 20  30003000300030' 
ded0: 41 53 20 49 4e 54 45 47 45 52 29 20 0a 7d 20 69  AS INTEGER) .} i
dee0: 6e 74 65 67 65 72 20 31 30 30 30 30 30 30 0a 64  nteger 1000000.d
def0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
df00: 70 72 2d 33 30 2e 31 2e 38 20 7b 20 0a 20 20 43  pr-30.1.8 { .  C
df10: 41 53 54 28 58 27 30 30 32 44 30 30 33 31 30 30  AST(X'002D003100
df20: 33 31 30 30 33 32 30 30 33 35 30 30 33 38 30 30  3100320035003800
df30: 33 39 30 30 33 39 30 30 33 39 30 30 33 30 30 30  3900390039003000
df40: 33 36 30 30 33 38 30 30 33 34 30 30 33 32 30 30  3600380034003200
df50: 33 36 30 30 33 32 30 30 33 34 27 20 41 53 20 49  3600320034' AS I
df60: 4e 54 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67  NTEGER) .} integ
df70: 65 72 20 2d 31 31 32 35 38 39 39 39 30 36 38 34  er -112589990684
df80: 32 36 32 34 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a  2624.}.db close.
df90: 72 65 6e 61 6d 65 20 64 62 32 20 64 62 0a 0a 23  rename db2 db..#
dfa0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
dfb0: 34 37 36 31 32 2d 34 35 38 34 32 20 57 68 65 6e  47612-45842 When
dfc0: 20 63 61 73 74 69 6e 67 20 61 20 54 45 58 54 20   casting a TEXT 
dfd0: 76 61 6c 75 65 20 74 6f 20 49 4e 54 45 47 45 52  value to INTEGER
dfe0: 2c 20 74 68 65 0a 23 20 6c 6f 6e 67 65 73 74 20  , the.# longest 
dff0: 70 6f 73 73 69 62 6c 65 20 70 72 65 66 69 78 20  possible prefix 
e000: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  of the value tha
e010: 74 20 63 61 6e 20 62 65 20 69 6e 74 65 72 70 72  t can be interpr
e020: 65 74 65 64 20 61 73 20 61 6e 0a 23 20 69 6e 74  eted as an.# int
e030: 65 67 65 72 20 6e 75 6d 62 65 72 20 69 73 20 65  eger number is e
e040: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
e050: 65 20 54 45 58 54 20 76 61 6c 75 65 20 61 6e 64  e TEXT value and
e060: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 0a 23   the remainder.#
e070: 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65   ignored..#.do_e
e080: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
e090: 33 30 2e 32 2e 31 20 7b 20 43 41 53 54 28 27 31  30.2.1 { CAST('1
e0a0: 32 33 61 62 63 64 27 20 41 53 20 49 4e 54 29 20  23abcd' AS INT) 
e0b0: 7d 20 69 6e 74 65 67 65 72 20 31 32 33 0a 64 6f  } integer 123.do
e0c0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e0d0: 72 2d 33 30 2e 32 2e 32 20 7b 20 43 41 53 54 28  r-30.2.2 { CAST(
e0e0: 27 31 34 35 32 33 61 62 63 64 27 20 41 53 20 49  '14523abcd' AS I
e0f0: 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31 34  NT) } integer 14
e100: 35 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  523.do_expr_test
e110: 20 65 5f 65 78 70 72 2d 33 30 2e 32 2e 33 20 7b   e_expr-30.2.3 {
e120: 20 43 41 53 54 28 27 2d 32 2e 31 32 65 2d 30 31   CAST('-2.12e-01
e130: 41 42 43 27 20 41 53 20 49 4e 54 29 20 7d 20 69  ABC' AS INT) } i
e140: 6e 74 65 67 65 72 20 2d 32 0a 64 6f 5f 65 78 70  nteger -2.do_exp
e150: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
e160: 2e 32 2e 34 20 7b 20 43 41 53 54 28 27 31 20 32  .2.4 { CAST('1 2
e170: 20 33 20 34 27 20 41 53 20 49 4e 54 29 20 7d 20   3 4' AS INT) } 
e180: 69 6e 74 65 67 65 72 20 31 0a 0a 23 20 45 56 49  integer 1..# EVI
e190: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 34 30  DENCE-OF: R-3440
e1a0: 30 2d 33 33 37 37 32 20 41 6e 79 20 6c 65 61 64  0-33772 Any lead
e1b0: 69 6e 67 20 73 70 61 63 65 73 20 69 6e 20 74 68  ing spaces in th
e1c0: 65 20 54 45 58 54 20 76 61 6c 75 65 20 77 68 65  e TEXT value whe
e1d0: 6e 0a 23 20 63 6f 6e 76 65 72 74 69 6e 67 20 66  n.# converting f
e1e0: 72 6f 6d 20 54 45 58 54 20 74 6f 20 49 4e 54 45  rom TEXT to INTE
e1f0: 47 45 52 20 61 72 65 20 69 67 6e 6f 72 65 64 2e  GER are ignored.
e200: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
e210: 65 5f 65 78 70 72 2d 33 30 2e 33 2e 31 20 7b 20  e_expr-30.3.1 { 
e220: 43 41 53 54 28 27 20 20 20 31 32 33 61 62 63 64  CAST('   123abcd
e230: 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65  ' AS INT) } inte
e240: 67 65 72 20 31 32 33 0a 64 6f 5f 65 78 70 72 5f  ger 123.do_expr_
e250: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 33  test e_expr-30.3
e260: 2e 32 20 7b 20 43 41 53 54 28 27 20 20 31 34 35  .2 { CAST('  145
e270: 32 33 61 62 63 64 27 20 41 53 20 49 4e 54 29 20  23abcd' AS INT) 
e280: 7d 20 69 6e 74 65 67 65 72 20 31 34 35 32 33 0a  } integer 14523.
e290: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e2a0: 78 70 72 2d 33 30 2e 33 2e 33 20 7b 20 43 41 53  xpr-30.3.3 { CAS
e2b0: 54 28 27 20 2d 32 2e 31 32 65 2d 30 31 41 42 43  T(' -2.12e-01ABC
e2c0: 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65  ' AS INT) } inte
e2d0: 67 65 72 20 2d 32 0a 64 6f 5f 65 78 70 72 5f 74  ger -2.do_expr_t
e2e0: 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 33 2e  est e_expr-30.3.
e2f0: 34 20 7b 20 43 41 53 54 28 27 20 20 20 20 20 31  4 { CAST('     1
e300: 20 32 20 33 20 34 27 20 41 53 20 49 4e 54 29 20   2 3 4' AS INT) 
e310: 7d 20 69 6e 74 65 67 65 72 20 31 0a 0a 23 20 45  } integer 1..# E
e320: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
e330: 31 36 34 2d 34 34 32 37 36 20 49 66 20 74 68 65  164-44276 If the
e340: 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20  re is no prefix 
e350: 74 68 61 74 20 63 61 6e 20 62 65 0a 23 20 69 6e  that can be.# in
e360: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
e370: 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 2c 20  integer number, 
e380: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
e390: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20  e conversion is 
e3a0: 30 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73  0..#.do_expr_tes
e3b0: 74 20 65 5f 65 78 70 72 2d 33 30 2e 34 2e 31 20  t e_expr-30.4.1 
e3c0: 7b 20 43 41 53 54 28 27 27 20 41 53 20 49 4e 54  { CAST('' AS INT
e3d0: 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20  EGER) } integer 
e3e0: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
e3f0: 5f 65 78 70 72 2d 33 30 2e 34 2e 32 20 7b 20 43  _expr-30.4.2 { C
e400: 41 53 54 28 27 6e 6f 74 20 61 20 6e 75 6d 62 65  AST('not a numbe
e410: 72 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d  r' AS INTEGER) }
e420: 20 69 6e 74 65 67 65 72 20 30 0a 64 6f 5f 65 78   integer 0.do_ex
e430: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e440: 30 2e 34 2e 33 20 7b 20 43 41 53 54 28 27 58 58  0.4.3 { CAST('XX
e450: 49 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d  I' AS INTEGER) }
e460: 20 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45 56   integer 0..# EV
e470: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 30 37  IDENCE-OF: R-007
e480: 34 31 2d 33 38 37 37 36 20 41 20 63 61 73 74 20  41-38776 A cast 
e490: 6f 66 20 61 20 52 45 41 4c 20 76 61 6c 75 65 20  of a REAL value 
e4a0: 69 6e 74 6f 20 61 6e 20 49 4e 54 45 47 45 52 20  into an INTEGER 
e4b0: 77 69 6c 6c 0a 23 20 74 72 75 6e 63 61 74 65 20  will.# truncate 
e4c0: 74 68 65 20 66 72 61 63 74 69 6f 6e 61 6c 20 70  the fractional p
e4d0: 61 72 74 20 6f 66 20 74 68 65 20 52 45 41 4c 2e  art of the REAL.
e4e0: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
e4f0: 65 5f 65 78 70 72 2d 33 31 2e 31 2e 31 20 7b 20  e_expr-31.1.1 { 
e500: 43 41 53 54 28 33 2e 31 34 31 35 39 20 41 53 20  CAST(3.14159 AS 
e510: 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67  INTEGER) } integ
e520: 65 72 20 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73  er 3.do_expr_tes
e530: 74 20 65 5f 65 78 70 72 2d 33 31 2e 31 2e 32 20  t e_expr-31.1.2 
e540: 7b 20 43 41 53 54 28 31 2e 39 39 39 39 39 20 41  { CAST(1.99999 A
e550: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e560: 65 67 65 72 20 31 0a 64 6f 5f 65 78 70 72 5f 74  eger 1.do_expr_t
e570: 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 31 2e  est e_expr-31.1.
e580: 33 20 7b 20 43 41 53 54 28 2d 31 2e 39 39 39 39  3 { CAST(-1.9999
e590: 39 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20  9 AS INTEGER) } 
e5a0: 69 6e 74 65 67 65 72 20 2d 31 0a 64 6f 5f 65 78  integer -1.do_ex
e5b0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e5c0: 31 2e 31 2e 34 20 7b 20 43 41 53 54 28 2d 30 2e  1.1.4 { CAST(-0.
e5d0: 39 39 39 39 39 20 41 53 20 49 4e 54 45 47 45 52  99999 AS INTEGER
e5e0: 29 20 7d 20 69 6e 74 65 67 65 72 20 30 0a 0a 23  ) } integer 0..#
e5f0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
e600: 34 39 35 30 33 2d 32 38 31 30 35 20 49 66 20 61  49503-28105 If a
e610: 20 52 45 41 4c 20 69 73 20 74 6f 6f 20 6c 61 72   REAL is too lar
e620: 67 65 20 74 6f 20 62 65 20 72 65 70 72 65 73 65  ge to be represe
e630: 6e 74 65 64 20 61 73 0a 23 20 61 6e 20 49 4e 54  nted as.# an INT
e640: 45 47 45 52 20 74 68 65 6e 20 74 68 65 20 72 65  EGER then the re
e650: 73 75 6c 74 20 6f 66 20 74 68 65 20 63 61 73 74  sult of the cast
e660: 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20   is the largest 
e670: 6e 65 67 61 74 69 76 65 0a 23 20 69 6e 74 65 67  negative.# integ
e680: 65 72 3a 20 2d 39 32 32 33 33 37 32 30 33 36 38  er: -92233720368
e690: 35 34 37 37 35 38 30 38 2e 0a 23 0a 64 6f 5f 65  54775808..#.do_e
e6a0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
e6b0: 33 31 2e 32 2e 31 20 7b 20 43 41 53 54 28 32 65  31.2.1 { CAST(2e
e6c0: 2b 35 30 20 41 53 20 49 4e 54 29 20 7d 20 69 6e  +50 AS INT) } in
e6d0: 74 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33  teger -922337203
e6e0: 36 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78  6854775808.do_ex
e6f0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e700: 31 2e 32 2e 32 20 7b 20 43 41 53 54 28 2d 32 65  1.2.2 { CAST(-2e
e710: 2b 35 30 20 41 53 20 49 4e 54 29 20 7d 20 69 6e  +50 AS INT) } in
e720: 74 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33  teger -922337203
e730: 36 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78  6854775808.do_ex
e740: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e750: 31 2e 32 2e 33 20 7b 20 0a 20 20 43 41 53 54 28  1.2.3 { .  CAST(
e760: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
e770: 35 38 30 39 2e 30 20 41 53 20 49 4e 54 29 0a 7d  5809.0 AS INT).}
e780: 20 69 6e 74 65 67 65 72 20 2d 39 32 32 33 33 37   integer -922337
e790: 32 30 33 36 38 35 34 37 37 35 38 30 38 0a 64 6f  2036854775808.do
e7a0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e7b0: 72 2d 33 31 2e 32 2e 34 20 7b 20 0a 20 20 43 41  r-31.2.4 { .  CA
e7c0: 53 54 28 39 32 32 33 33 37 32 30 33 36 38 35 34  ST(9223372036854
e7d0: 37 37 35 38 30 39 2e 30 20 41 53 20 49 4e 54 29  775809.0 AS INT)
e7e0: 0a 7d 20 69 6e 74 65 67 65 72 20 2d 39 32 32 33  .} integer -9223
e7f0: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 0a  372036854775808.
e800: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
e810: 20 52 2d 30 39 32 39 35 2d 36 31 33 33 37 20 43   R-09295-61337 C
e820: 61 73 74 69 6e 67 20 61 20 54 45 58 54 20 6f 72  asting a TEXT or
e830: 20 42 4c 4f 42 20 76 61 6c 75 65 20 69 6e 74 6f   BLOB value into
e840: 20 4e 55 4d 45 52 49 43 0a 23 20 66 69 72 73 74   NUMERIC.# first
e850: 20 64 6f 65 73 20 61 20 66 6f 72 63 65 64 20 63   does a forced c
e860: 6f 6e 76 65 72 73 69 6f 6e 20 69 6e 74 6f 20 52  onversion into R
e870: 45 41 4c 20 62 75 74 20 74 68 65 6e 20 66 75 72  EAL but then fur
e880: 74 68 65 72 20 63 6f 6e 76 65 72 74 73 20 74 68  ther converts th
e890: 65 0a 23 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  e.# result into 
e8a0: 49 4e 54 45 47 45 52 20 69 66 20 61 6e 64 20 6f  INTEGER if and o
e8b0: 6e 6c 79 20 69 66 20 74 68 65 20 63 6f 6e 76 65  nly if the conve
e8c0: 72 73 69 6f 6e 20 66 72 6f 6d 20 52 45 41 4c 20  rsion from REAL 
e8d0: 74 6f 20 49 4e 54 45 47 45 52 0a 23 20 69 73 20  to INTEGER.# is 
e8e0: 6c 6f 73 73 6c 65 73 73 20 61 6e 64 20 72 65 76  lossless and rev
e8f0: 65 72 73 69 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78  ersible..#.do_ex
e900: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e910: 32 2e 31 2e 31 20 7b 20 43 41 53 54 28 27 34 35  2.1.1 { CAST('45
e920: 27 20 20 20 41 53 20 4e 55 4d 45 52 49 43 29 20  '   AS NUMERIC) 
e930: 20 7d 20 69 6e 74 65 67 65 72 20 34 35 0a 64 6f   } integer 45.do
e940: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e950: 72 2d 33 32 2e 31 2e 32 20 7b 20 43 41 53 54 28  r-32.1.2 { CAST(
e960: 27 34 35 2e 30 27 20 41 53 20 4e 55 4d 45 52 49  '45.0' AS NUMERI
e970: 43 29 20 20 7d 20 69 6e 74 65 67 65 72 20 34 35  C)  } integer 45
e980: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e990: 65 78 70 72 2d 33 32 2e 31 2e 33 20 7b 20 43 41  expr-32.1.3 { CA
e9a0: 53 54 28 27 34 35 2e 32 27 20 41 53 20 4e 55 4d  ST('45.2' AS NUM
e9b0: 45 52 49 43 29 20 20 7d 20 72 65 61 6c 20 34 35  ERIC)  } real 45
e9c0: 2e 32 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .2.do_expr_test 
e9d0: 65 5f 65 78 70 72 2d 33 32 2e 31 2e 34 20 7b 20  e_expr-32.1.4 { 
e9e0: 43 41 53 54 28 27 31 31 61 62 63 27 20 41 53 20  CAST('11abc' AS 
e9f0: 4e 55 4d 45 52 49 43 29 20 7d 20 69 6e 74 65 67  NUMERIC) } integ
ea00: 65 72 20 31 31 0a 64 6f 5f 65 78 70 72 5f 74 65  er 11.do_expr_te
ea10: 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e 35  st e_expr-32.1.5
ea20: 20 7b 20 43 41 53 54 28 27 31 31 2e 31 61 62 63   { CAST('11.1abc
ea30: 27 20 41 53 20 4e 55 4d 45 52 49 43 29 20 7d 20  ' AS NUMERIC) } 
ea40: 72 65 61 6c 20 31 31 2e 31 0a 0a 23 20 45 56 49  real 11.1..# EVI
ea50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 33 34  DENCE-OF: R-3034
ea60: 37 2d 31 38 37 30 32 20 43 61 73 74 69 6e 67 20  7-18702 Casting 
ea70: 61 20 52 45 41 4c 20 6f 72 20 49 4e 54 45 47 45  a REAL or INTEGE
ea80: 52 20 76 61 6c 75 65 20 74 6f 20 4e 55 4d 45 52  R value to NUMER
ea90: 49 43 0a 23 20 69 73 20 61 20 6e 6f 2d 6f 70 2c  IC.# is a no-op,
eaa0: 20 65 76 65 6e 20 69 66 20 61 20 72 65 61 6c 20   even if a real 
eab0: 76 61 6c 75 65 20 63 6f 75 6c 64 20 62 65 20 6c  value could be l
eac0: 6f 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72  osslessly conver
ead0: 74 65 64 20 74 6f 20 61 6e 0a 23 20 69 6e 74 65  ted to an.# inte
eae0: 67 65 72 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74  ger..#.do_expr_t
eaf0: 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e  est e_expr-32.2.
eb00: 31 20 7b 20 43 41 53 54 28 31 33 2e 30 20 41 53  1 { CAST(13.0 AS
eb10: 20 4e 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c   NUMERIC) } real
eb20: 20 31 33 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65   13.0.do_expr_te
eb30: 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 32  st e_expr-32.2.2
eb40: 20 7b 20 43 41 53 54 28 31 33 2e 35 20 41 53 20   { CAST(13.5 AS 
eb50: 4e 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c 20  NUMERIC) } real 
eb60: 31 33 2e 35 0a 0a 64 6f 5f 65 78 70 72 5f 74 65  13.5..do_expr_te
eb70: 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 33  st e_expr-32.2.3
eb80: 20 7b 20 0a 20 20 43 41 53 54 28 2d 39 32 32 33   { .  CAST(-9223
eb90: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 20  372036854775808 
eba0: 41 53 20 4e 55 4d 45 52 49 43 29 0a 7d 20 69 6e  AS NUMERIC).} in
ebb0: 74 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33  teger -922337203
ebc0: 36 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78  6854775808.do_ex
ebd0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
ebe0: 32 2e 32 2e 34 20 7b 20 0a 20 20 43 41 53 54 28  2.2.4 { .  CAST(
ebf0: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
ec00: 38 30 37 20 41 53 20 4e 55 4d 45 52 49 43 29 0a  807 AS NUMERIC).
ec10: 7d 20 69 6e 74 65 67 65 72 20 39 32 32 33 33 37  } integer 922337
ec20: 32 30 33 36 38 35 34 37 37 35 38 30 37 0a 0a 23  2036854775807..#
ec30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ec40: 36 34 35 35 30 2d 32 39 31 39 31 20 4e 6f 74 65  64550-29191 Note
ec50: 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
ec60: 20 66 72 6f 6d 20 63 61 73 74 69 6e 67 20 61 6e   from casting an
ec70: 79 0a 23 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c  y.# non-BLOB val
ec80: 75 65 20 69 6e 74 6f 20 61 20 42 4c 4f 42 20 61  ue into a BLOB a
ec90: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 66 72  nd the result fr
eca0: 6f 6d 20 63 61 73 74 69 6e 67 20 61 6e 79 20 42  om casting any B
ecb0: 4c 4f 42 20 76 61 6c 75 65 0a 23 20 69 6e 74 6f  LOB value.# into
ecc0: 20 61 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75   a non-BLOB valu
ecd0: 65 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  e may be differe
ece0: 6e 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  nt depending on 
ecf0: 77 68 65 74 68 65 72 20 74 68 65 0a 23 20 64 61  whether the.# da
ed00: 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20  tabase encoding 
ed10: 69 73 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36  is UTF-8, UTF-16
ed20: 62 65 2c 20 6f 72 20 55 54 46 2d 31 36 6c 65 2e  be, or UTF-16le.
ed30: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74  .#.ifcapable {ut
ed40: 66 31 36 7d 20 7b 0a 73 71 6c 69 74 65 33 20 64  f16} {.sqlite3 d
ed50: 62 31 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62  b1 :memory: ; db
ed60: 31 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  1 eval { PRAGMA 
ed70: 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d  encoding = 'utf-
ed80: 38 27 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 32  8' }.sqlite3 db2
ed90: 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 32 20   :memory: ; db2 
eda0: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e  eval { PRAGMA en
edb0: 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36  coding = 'utf-16
edc0: 6c 65 27 20 7d 0a 73 71 6c 69 74 65 33 20 64 62  le' }.sqlite3 db
edd0: 33 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 33  3 :memory: ; db3
ede0: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65   eval { PRAGMA e
edf0: 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31  ncoding = 'utf-1
ee00: 36 62 65 27 20 7d 0a 66 6f 72 65 61 63 68 20 7b  6be' }.foreach {
ee10: 74 6e 20 63 61 73 74 65 78 70 72 20 64 69 66 66  tn castexpr diff
ee20: 65 72 73 7d 20 7b 0a 20 20 31 20 7b 20 43 41 53  ers} {.  1 { CAS
ee30: 54 28 31 32 33 20 41 53 20 42 4c 4f 42 29 20 20  T(123 AS BLOB)  
ee40: 20 20 7d 20 31 0a 20 20 32 20 7b 20 43 41 53 54    } 1.  2 { CAST
ee50: 28 27 27 20 41 53 20 42 4c 4f 42 29 20 20 20 20  ('' AS BLOB)    
ee60: 20 7d 20 30 0a 20 20 33 20 7b 20 43 41 53 54 28   } 0.  3 { CAST(
ee70: 27 61 62 63 64 27 20 41 53 20 42 4c 4f 42 29 20  'abcd' AS BLOB) 
ee80: 7d 20 31 0a 0a 20 20 34 20 7b 20 43 41 53 54 28  } 1..  4 { CAST(
ee90: 58 27 61 62 63 64 27 20 41 53 20 54 45 58 54 29  X'abcd' AS TEXT)
eea0: 20 7d 20 31 0a 20 20 35 20 7b 20 43 41 53 54 28   } 1.  5 { CAST(
eeb0: 58 27 27 20 41 53 20 54 45 58 54 29 20 20 20 20  X'' AS TEXT)    
eec0: 20 7d 20 30 0a 7d 20 7b 0a 20 20 73 65 74 20 72   } 0.} {.  set r
eed0: 31 20 5b 64 62 31 20 65 76 61 6c 20 22 53 45 4c  1 [db1 eval "SEL
eee0: 45 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74  ECT typeof($cast
eef0: 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61  expr), quote($ca
ef00: 73 74 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20  stexpr)"].  set 
ef10: 72 32 20 5b 64 62 32 20 65 76 61 6c 20 22 53 45  r2 [db2 eval "SE
ef20: 4c 45 43 54 20 74 79 70 65 6f 66 28 24 63 61 73  LECT typeof($cas
ef30: 74 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63  texpr), quote($c
ef40: 61 73 74 65 78 70 72 29 22 5d 0a 20 20 73 65 74  astexpr)"].  set
ef50: 20 72 33 20 5b 64 62 33 20 65 76 61 6c 20 22 53   r3 [db3 eval "S
ef60: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 24 63 61  ELECT typeof($ca
ef70: 73 74 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24  stexpr), quote($
ef80: 63 61 73 74 65 78 70 72 29 22 5d 0a 0a 20 20 69  castexpr)"]..  i
ef90: 66 20 7b 24 64 69 66 66 65 72 73 7d 20 7b 0a 20  f {$differs} {. 
efa0: 20 20 20 73 65 74 20 72 65 73 20 5b 65 78 70 72     set res [expr
efb0: 20 7b 24 72 31 21 3d 24 72 32 20 26 26 20 24 72   {$r1!=$r2 && $r
efc0: 32 21 3d 24 72 33 7d 5d 0a 20 20 7d 20 65 6c 73  2!=$r3}].  } els
efd0: 65 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20  e {.    set res 
efe0: 5b 65 78 70 72 20 7b 24 72 31 3d 3d 24 72 32 20  [expr {$r1==$r2 
eff0: 26 26 20 24 72 32 3d 3d 24 72 33 7d 5d 0a 20 20  && $r2==$r3}].  
f000: 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 65  }..  do_test e_e
f010: 78 70 72 2d 33 33 2e 31 2e 24 74 6e 20 7b 73 65  xpr-33.1.$tn {se
f020: 74 20 72 65 73 7d 20 31 0a 7d 0a 64 62 31 20 63  t res} 1.}.db1 c
f030: 6c 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 64  lose.db2 close.d
f040: 62 33 20 63 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d  b3 close.}..#---
f050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f090: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74  ------.# Test st
f0a0: 61 74 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64  atements related
f0b0: 20 74 6f 20 74 68 65 20 45 58 49 53 54 53 20 61   to the EXISTS a
f0c0: 6e 64 20 4e 4f 54 20 45 58 49 53 54 53 20 6f 70  nd NOT EXISTS op
f0d0: 65 72 61 74 6f 72 73 2e 0a 23 0a 63 61 74 63 68  erators..#.catch
f0e0: 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 66 6f   { db close }.fo
f0f0: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
f100: 62 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  b.sqlite3 db tes
f110: 74 2e 64 62 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  t.db..do_execsql
f120: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34 2e  _test e_expr-34.
f130: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  1 {.  CREATE TAB
f140: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 49  LE t1(a, b);.  I
f150: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
f160: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e  LUES(1, 2);.  IN
f170: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
f180: 55 45 53 28 4e 55 4c 4c 2c 20 32 29 3b 0a 20 20  UES(NULL, 2);.  
f190: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
f1a0: 41 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 29 3b 0a  ALUES(1, NULL);.
f1b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
f1c0: 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55   VALUES(NULL, NU
f1d0: 4c 4c 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49  LL);.} {}..# EVI
f1e0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 35 38  DENCE-OF: R-2558
f1f0: 38 2d 32 37 31 38 31 20 54 68 65 20 45 58 49 53  8-27181 The EXIS
f200: 54 53 20 6f 70 65 72 61 74 6f 72 20 61 6c 77 61  TS operator alwa
f210: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
f220: 6f 6e 65 0a 23 20 6f 66 20 74 68 65 20 69 6e 74  one.# of the int
f230: 65 67 65 72 20 76 61 6c 75 65 73 20 30 20 61 6e  eger values 0 an
f240: 64 20 31 2e 0a 23 0a 23 20 54 68 69 73 20 73 74  d 1..#.# This st
f250: 61 74 65 6d 65 6e 74 20 69 73 20 6e 6f 74 20 74  atement is not t
f260: 65 73 74 65 64 20 62 79 20 69 74 73 65 6c 66 2e  ested by itself.
f270: 20 49 6e 73 74 65 61 64 2c 20 61 6c 6c 20 65 5f   Instead, all e_
f280: 65 78 70 72 2d 33 34 2e 2a 20 74 65 73 74 73 20  expr-34.* tests 
f290: 0a 23 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  .# following thi
f2a0: 73 20 70 6f 69 6e 74 20 65 78 70 6c 69 63 69 74  s point explicit
f2b0: 6c 79 20 74 65 73 74 20 74 68 61 74 20 73 70 65  ly test that spe
f2c0: 63 69 66 69 63 20 69 6e 76 6f 63 61 74 69 6f 6e  cific invocation
f2d0: 73 20 6f 66 20 45 58 49 53 54 53 0a 23 20 72 65  s of EXISTS.# re
f2e0: 74 75 72 6e 20 65 69 74 68 65 72 20 69 6e 74 65  turn either inte
f2f0: 67 65 72 20 30 20 6f 72 20 69 6e 74 65 67 65 72  ger 0 or integer
f300: 20 31 2e 0a 23 0a 0a 23 20 45 56 49 44 45 4e 43   1..#..# EVIDENC
f310: 45 2d 4f 46 3a 20 52 2d 35 38 35 35 33 2d 36 33  E-OF: R-58553-63
f320: 37 34 30 20 49 66 20 65 78 65 63 75 74 69 6e 67  740 If executing
f330: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
f340: 65 6d 65 6e 74 20 73 70 65 63 69 66 69 65 64 0a  ement specified.
f350: 23 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 68  # as the right-h
f360: 61 6e 64 20 6f 70 65 72 61 6e 64 20 6f 66 20 74  and operand of t
f370: 68 65 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  he EXISTS operat
f380: 6f 72 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20  or would return 
f390: 6f 6e 65 20 6f 72 0a 23 20 6d 6f 72 65 20 72 6f  one or.# more ro
f3a0: 77 73 2c 20 74 68 65 6e 20 74 68 65 20 45 58 49  ws, then the EXI
f3b0: 53 54 53 20 6f 70 65 72 61 74 6f 72 20 65 76 61  STS operator eva
f3c0: 6c 75 61 74 65 73 20 74 6f 20 31 2e 0a 23 0a 66  luates to 1..#.f
f3d0: 6f 72 65 61 63 68 20 7b 74 6e 20 65 78 70 72 7d  oreach {tn expr}
f3e0: 20 7b 0a 20 20 20 20 31 20 7b 20 45 58 49 53 54   {.    1 { EXIST
f3f0: 53 20 28 20 53 45 4c 45 43 54 20 61 20 46 52 4f  S ( SELECT a FRO
f400: 4d 20 74 31 20 29 20 7d 0a 20 20 20 20 32 20 7b  M t1 ) }.    2 {
f410: 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54   EXISTS ( SELECT
f420: 20 62 20 46 52 4f 4d 20 74 31 20 29 20 7d 0a 20   b FROM t1 ) }. 
f430: 20 20 20 33 20 7b 20 45 58 49 53 54 53 20 28 20     3 { EXISTS ( 
f440: 53 45 4c 45 43 54 20 32 34 20 29 20 7d 0a 20 20  SELECT 24 ) }.  
f450: 20 20 34 20 7b 20 45 58 49 53 54 53 20 28 20 53    4 { EXISTS ( S
f460: 45 4c 45 43 54 20 4e 55 4c 4c 20 29 20 7d 0a 20  ELECT NULL ) }. 
f470: 20 20 20 35 20 7b 20 45 58 49 53 54 53 20 28 20     5 { EXISTS ( 
f480: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
f490: 20 57 48 45 52 45 20 61 20 49 53 20 4e 55 4c 4c   WHERE a IS NULL
f4a0: 20 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78   ) }.} {.  do_ex
f4b0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
f4c0: 34 2e 32 2e 24 74 6e 20 24 65 78 70 72 20 69 6e  4.2.$tn $expr in
f4d0: 74 65 67 65 72 20 31 0a 7d 0a 0a 23 20 45 56 49  teger 1.}..# EVI
f4e0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 36 37  DENCE-OF: R-1967
f4f0: 33 2d 34 30 39 37 32 20 49 66 20 65 78 65 63 75  3-40972 If execu
f500: 74 69 6e 67 20 74 68 65 20 53 45 4c 45 43 54 20  ting the SELECT 
f510: 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f 0a  would return no.
f520: 23 20 72 6f 77 73 20 61 74 20 61 6c 6c 2c 20 74  # rows at all, t
f530: 68 65 6e 20 74 68 65 20 45 58 49 53 54 53 20 6f  hen the EXISTS o
f540: 70 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65  perator evaluate
f550: 73 20 74 6f 20 30 2e 0a 23 0a 66 6f 72 65 61 63  s to 0..#.foreac
f560: 68 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20  h {tn expr} {.  
f570: 20 20 31 20 7b 20 45 58 49 53 54 53 20 28 20 53    1 { EXISTS ( S
f580: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
f590: 57 48 45 52 45 20 30 29 20 7d 0a 20 20 20 20 32  WHERE 0) }.    2
f5a0: 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45   { EXISTS ( SELE
f5b0: 43 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  CT b FROM t1 WHE
f5c0: 52 45 20 61 20 3d 20 35 29 20 7d 0a 20 20 20 20  RE a = 5) }.    
f5d0: 33 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c  3 { EXISTS ( SEL
f5e0: 45 43 54 20 32 34 20 57 48 45 52 45 20 30 29 20  ECT 24 WHERE 0) 
f5f0: 7d 0a 20 20 20 20 34 20 7b 20 45 58 49 53 54 53  }.    4 { EXISTS
f600: 20 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 57   ( SELECT NULL W
f610: 48 45 52 45 20 31 3d 32 29 20 7d 0a 7d 20 7b 0a  HERE 1=2) }.} {.
f620: 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65    do_expr_test e
f630: 5f 65 78 70 72 2d 33 34 2e 33 2e 24 74 6e 20 24  _expr-34.3.$tn $
f640: 65 78 70 72 20 69 6e 74 65 67 65 72 20 30 0a 7d  expr integer 0.}
f650: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
f660: 20 52 2d 33 35 31 30 39 2d 34 39 31 33 39 20 54   R-35109-49139 T
f670: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
f680: 75 6d 6e 73 20 69 6e 20 65 61 63 68 20 72 6f 77  umns in each row
f690: 20 72 65 74 75 72 6e 65 64 0a 23 20 62 79 20 74   returned.# by t
f6a0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
f6b0: 65 6e 74 20 28 69 66 20 61 6e 79 29 20 61 6e 64  ent (if any) and
f6c0: 20 74 68 65 20 73 70 65 63 69 66 69 63 20 76 61   the specific va
f6d0: 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 68 61  lues returned ha
f6e0: 76 65 0a 23 20 6e 6f 20 65 66 66 65 63 74 20 6f  ve.# no effect o
f6f0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  n the results of
f700: 20 74 68 65 20 45 58 49 53 54 53 20 6f 70 65 72   the EXISTS oper
f710: 61 74 6f 72 2e 0a 23 0a 66 6f 72 65 61 63 68 20  ator..#.foreach 
f720: 7b 74 6e 20 65 78 70 72 20 72 65 73 7d 20 7b 0a  {tn expr res} {.
f730: 20 20 20 20 31 20 7b 20 45 58 49 53 54 53 20 28      1 { EXISTS (
f740: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
f750: 31 20 29 20 7d 20 20 20 20 20 20 20 20 20 20 20  1 ) }           
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
f770: 0a 20 20 20 20 32 20 7b 20 45 58 49 53 54 53 20  .    2 { EXISTS 
f780: 28 20 53 45 4c 45 43 54 20 2a 2c 20 2a 2c 20 2a  ( SELECT *, *, *
f790: 20 46 52 4f 4d 20 74 31 20 29 20 7d 20 20 20 20   FROM t1 ) }    
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 31 0a 20 20 20 20 33 20 7b 20 45 58 49 53 54 53  1.    3 { EXISTS
f7c0: 20 28 20 53 45 4c 45 43 54 20 32 34 2c 20 32 35   ( SELECT 24, 25
f7d0: 20 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20   ) }            
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 31 0a 20 20 20 20 34 20 7b 20 45 58 49 53 54   1.    4 { EXIST
f800: 53 20 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c  S ( SELECT NULL,
f810: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 29 20 7d 20   NULL, NULL ) } 
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f830: 20 20 31 0a 20 20 20 20 35 20 7b 20 45 58 49 53    1.    5 { EXIS
f840: 54 53 20 28 20 53 45 4c 45 43 54 20 61 2c 62 2c  TS ( SELECT a,b,
f850: 61 7c 7c 62 20 46 52 4f 4d 20 74 31 20 57 48 45  a||b FROM t1 WHE
f860: 52 45 20 61 20 49 53 20 4e 55 4c 4c 20 29 20 7d  RE a IS NULL ) }
f870: 20 20 20 31 0a 0a 20 20 20 20 36 20 7b 20 45 58     1..    6 { EX
f880: 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 61 2c  ISTS ( SELECT a,
f890: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
f8a0: 20 30 29 20 7d 20 20 20 20 20 20 20 20 20 20 20   0) }           
f8b0: 20 20 20 20 20 30 0a 20 20 20 20 37 20 7b 20 45       0.    7 { E
f8c0: 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 62  XISTS ( SELECT b
f8d0: 2c 20 62 2c 20 61 20 46 52 4f 4d 20 74 31 20 57  , b, a FROM t1 W
f8e0: 48 45 52 45 20 61 20 3d 20 35 29 20 7d 20 20 20  HERE a = 5) }   
f8f0: 20 20 20 20 20 20 30 0a 20 20 20 20 38 20 7b 20        0.    8 { 
f900: 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
f910: 32 34 2c 20 34 36 2c 20 38 39 20 57 48 45 52 45  24, 46, 89 WHERE
f920: 20 30 29 20 7d 20 20 20 20 20 20 20 20 20 20 20   0) }           
f930: 20 20 20 20 20 20 20 30 0a 20 20 20 20 39 20 7b         0.    9 {
f940: 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54   EXISTS ( SELECT
f950: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 57 48 45 52   NULL, NULL WHER
f960: 45 20 31 3d 32 29 20 7d 20 20 20 20 20 20 20 20  E 1=2) }        
f970: 20 20 20 20 20 20 20 20 30 0a 7d 20 7b 0a 20 20          0.} {.  
f980: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
f990: 78 70 72 2d 33 34 2e 34 2e 24 74 6e 20 24 65 78  xpr-34.4.$tn $ex
f9a0: 70 72 20 69 6e 74 65 67 65 72 20 24 72 65 73 0a  pr integer $res.
f9b0: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
f9c0: 3a 20 52 2d 31 30 36 34 35 2d 31 32 34 33 39 20  : R-10645-12439 
f9d0: 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 72  In particular, r
f9e0: 6f 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4e  ows containing N
f9f0: 55 4c 4c 20 76 61 6c 75 65 73 0a 23 20 61 72 65  ULL values.# are
fa00: 20 6e 6f 74 20 68 61 6e 64 6c 65 64 20 61 6e 79   not handled any
fa10: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
fa20: 6d 20 72 6f 77 73 20 77 69 74 68 6f 75 74 20 4e  m rows without N
fa30: 55 4c 4c 20 76 61 6c 75 65 73 2e 0a 23 0a 66 6f  ULL values..#.fo
fa40: 72 65 61 63 68 20 7b 74 6e 20 65 31 20 65 32 7d  reach {tn e1 e2}
fa50: 20 7b 0a 20 20 31 20 7b 20 45 58 49 53 54 53 20   {.  1 { EXISTS 
fa60: 28 53 45 4c 45 43 54 20 27 6e 6f 74 20 6e 75 6c  (SELECT 'not nul
fa70: 6c 27 29 20 7d 20 20 20 20 7b 20 45 58 49 53 54  l') }    { EXIST
fa80: 53 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20  S (SELECT NULL) 
fa90: 7d 0a 20 20 32 20 7b 20 45 58 49 53 54 53 20 28  }.  2 { EXISTS (
faa0: 53 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d  SELECT NULL FROM
fab0: 20 74 31 29 20 7d 20 20 7b 20 45 58 49 53 54 53   t1) }  { EXISTS
fac0: 20 28 53 45 4c 45 43 54 20 27 62 72 65 61 64 27   (SELECT 'bread'
fad0: 20 46 52 4f 4d 20 74 31 29 20 7d 0a 7d 20 7b 0a   FROM t1) }.} {.
fae0: 20 20 73 65 74 20 72 65 73 20 5b 64 62 20 6f 6e    set res [db on
faf0: 65 20 22 53 45 4c 45 43 54 20 24 65 31 22 5d 0a  e "SELECT $e1"].
fb00: 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65    do_expr_test e
fb10: 5f 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d  _expr-34.5.${tn}
fb20: 61 20 24 65 31 20 69 6e 74 65 67 65 72 20 24 72  a $e1 integer $r
fb30: 65 73 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73  es.  do_expr_tes
fb40: 74 20 65 5f 65 78 70 72 2d 33 34 2e 35 2e 24 7b  t e_expr-34.5.${
fb50: 74 6e 7d 62 20 24 65 32 20 69 6e 74 65 67 65 72  tn}b $e2 integer
fb60: 20 24 72 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d   $res.}..#------
fb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbb0: 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65  ---.# Test state
fbc0: 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f  ments related to
fbd0: 20 73 63 61 6c 61 72 20 73 75 62 2d 71 75 65 72   scalar sub-quer
fbe0: 69 65 73 2e 0a 23 0a 0a 63 61 74 63 68 20 7b 20  ies..#..catch { 
fbf0: 64 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65  db close }.force
fc00: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 73  delete test.db.s
fc10: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
fc20: 62 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72  b.do_test e_expr
fc30: 2d 33 35 2e 30 20 7b 0a 20 20 65 78 65 63 73 71  -35.0 {.  execsq
fc40: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
fc50: 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20  ABLE t2(a, b);. 
fc60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
fc70: 32 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20  2 VALUES('one', 
fc80: 27 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45  'two');.    INSE
fc90: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
fca0: 53 28 27 74 68 72 65 65 27 2c 20 4e 55 4c 4c 29  S('three', NULL)
fcb0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
fcc0: 4f 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20 35  O t2 VALUES(4, 5
fcd0: 2e 30 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23  .0);.  }.} {}..#
fce0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fcf0: 30 30 39 38 30 2d 33 39 32 35 36 20 41 20 53 45  00980-39256 A SE
fd00: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 65  LECT statement e
fd10: 6e 63 6c 6f 73 65 64 20 69 6e 20 70 61 72 65 6e  nclosed in paren
fd20: 74 68 65 73 65 73 0a 23 20 6d 61 79 20 61 70 70  theses.# may app
fd30: 65 61 72 20 61 73 20 61 20 73 63 61 6c 61 72 20  ear as a scalar 
fd40: 71 75 61 6e 74 69 74 79 2e 0a 23 0a 23 20 45 56  quantity..#.# EV
fd50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 32  IDENCE-OF: R-562
fd60: 39 34 2d 30 33 39 36 36 20 41 6c 6c 20 74 79 70  94-03966 All typ
fd70: 65 73 20 6f 66 20 53 45 4c 45 43 54 20 73 74 61  es of SELECT sta
fd80: 74 65 6d 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  tement, includin
fd90: 67 0a 23 20 61 67 67 72 65 67 61 74 65 20 61 6e  g.# aggregate an
fda0: 64 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  d compound SELEC
fdb0: 54 20 71 75 65 72 69 65 73 20 28 71 75 65 72 69  T queries (queri
fdc0: 65 73 20 77 69 74 68 20 6b 65 79 77 6f 72 64 73  es with keywords
fdd0: 20 6c 69 6b 65 0a 23 20 55 4e 49 4f 4e 20 6f 72   like.# UNION or
fde0: 20 45 58 43 45 50 54 29 20 61 72 65 20 61 6c 6c   EXCEPT) are all
fdf0: 6f 77 65 64 20 61 73 20 73 63 61 6c 61 72 20 73  owed as scalar s
fe00: 75 62 71 75 65 72 69 65 73 2e 0a 23 0a 64 6f 5f  ubqueries..#.do_
fe10: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
fe20: 2d 33 35 2e 31 2e 31 20 7b 20 28 53 45 4c 45 43  -35.1.1 { (SELEC
fe30: 54 20 33 35 29 20 20 20 7d 20 69 6e 74 65 67 65  T 35)   } intege
fe40: 72 20 33 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73  r 35.do_expr_tes
fe50: 74 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e 32 20  t e_expr-35.1.2 
fe60: 7b 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20  { (SELECT NULL) 
fe70: 7d 20 6e 75 6c 6c 20 7b 7d 0a 0a 64 6f 5f 65 78  } null {}..do_ex
fe80: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
fe90: 35 2e 31 2e 33 20 7b 20 28 53 45 4c 45 43 54 20  5.1.3 { (SELECT 
fea0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
feb0: 29 20 7d 20 69 6e 74 65 67 65 72 20 33 0a 64 6f  ) } integer 3.do
fec0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
fed0: 72 2d 33 35 2e 31 2e 34 20 7b 20 28 53 45 4c 45  r-35.1.4 { (SELE
fee0: 43 54 20 34 20 46 52 4f 4d 20 74 32 29 20 7d 20  CT 4 FROM t2) } 
fef0: 69 6e 74 65 67 65 72 20 34 0a 0a 64 6f 5f 65 78  integer 4..do_ex
ff00: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
ff10: 35 2e 31 2e 35 20 7b 20 0a 20 20 28 53 45 4c 45  5.1.5 { .  (SELE
ff20: 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
ff30: 4f 4e 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52  ON SELECT a+1 FR
ff40: 4f 4d 20 74 32 29 0a 7d 20 6e 75 6c 6c 20 7b 7d  OM t2).} null {}
ff50: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
ff60: 65 78 70 72 2d 33 35 2e 31 2e 36 20 7b 20 0a 20  expr-35.1.6 { . 
ff70: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
ff80: 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
ff90: 43 4f 41 4c 45 53 43 45 28 62 2c 20 35 35 29 20  COALESCE(b, 55) 
ffa0: 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
ffb0: 20 31 29 0a 7d 20 69 6e 74 65 67 65 72 20 34 0a   1).} integer 4.
ffc0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
ffd0: 52 2d 34 36 38 39 39 2d 35 33 37 36 35 20 41 20  R-46899-53765 A 
ffe0: 53 45 4c 45 43 54 20 75 73 65 64 20 61 73 20 61  SELECT used as a
fff0: 20 73 63 61 6c 61 72 20 71 75 61 6e 74 69 74 79   scalar quantity
10000 20 6d 75 73 74 0a 23 20 72 65 74 75 72 6e 20 61   must.# return a
10010 20 72 65 73 75 6c 74 20 73 65 74 20 77 69 74 68   result set with
10020 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
10030 2e 0a 23 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ..#.# The follow
10040 69 6e 67 20 62 6c 6f 63 6b 20 74 65 73 74 73 20  ing block tests 
10050 74 68 61 74 20 65 72 72 6f 72 73 20 61 72 65 20  that errors are 
10060 72 65 74 75 72 6e 65 64 20 69 6e 20 61 20 62 75  returned in a bu
10070 6e 63 68 20 6f 66 20 63 61 73 65 73 0a 23 20 77  nch of cases.# w
10080 68 65 72 65 20 61 20 73 75 62 71 75 65 72 79 20  here a subquery 
10090 72 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61  returns more tha
100a0 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 0a 23 0a  n one column..#.
100b0 73 65 74 20 4d 20 7b 6f 6e 6c 79 20 61 20 73 69  set M {only a si
100c0 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f  ngle result allo
100d0 77 65 64 20 66 6f 72 20 61 20 53 45 4c 45 43 54  wed for a SELECT
100e0 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
100f0 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 7d 0a   an expression}.
10100 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d  foreach {tn sql}
10110 20 7b 0a 20 20 31 20 20 20 20 20 7b 20 53 45 4c   {.  1     { SEL
10120 45 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46 52  ECT (SELECT * FR
10130 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
10140 43 54 20 61 2b 31 2c 20 62 2b 31 20 46 52 4f 4d  CT a+1, b+1 FROM
10150 20 74 32 29 20 7d 0a 20 20 32 20 20 20 20 20 7b   t2) }.  2     {
10160 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
10170 2a 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  * FROM t2 UNION 
10180 53 45 4c 45 43 54 20 61 2b 31 2c 20 62 2b 31 20  SELECT a+1, b+1 
10190 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
101a0 20 31 29 20 7d 0a 20 20 33 20 20 20 20 20 7b 20   1) }.  3     { 
101b0 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 31  SELECT (SELECT 1
101c0 2c 20 32 29 20 7d 0a 20 20 34 20 20 20 20 20 7b  , 2) }.  4     {
101d0 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
101e0 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
101f0 29 20 7d 0a 20 20 35 20 20 20 20 20 7b 20 53 45  ) }.  5     { SE
10200 4c 45 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46  LECT (SELECT * F
10210 52 4f 4d 20 74 32 29 20 7d 0a 20 20 36 20 20 20  ROM t2) }.  6   
10220 20 20 7b 20 53 45 4c 45 43 54 20 28 53 45 4c 45    { SELECT (SELE
10230 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT * FROM (SELEC
10240 54 20 31 2c 20 32 2c 20 33 29 29 20 7d 0a 7d 20  T 1, 2, 3)) }.} 
10250 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f  {.  do_catchsql_
10260 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 32  test e_expr-35.2
10270 2e 24 74 6e 20 24 73 71 6c 20 5b 6c 69 73 74 20  .$tn $sql [list 
10280 31 20 24 4d 5d 0a 7d 0a 0a 23 20 45 56 49 44 45  1 $M].}..# EVIDE
10290 4e 43 45 2d 4f 46 3a 20 52 2d 33 35 37 36 34 2d  NCE-OF: R-35764-
102a0 32 38 30 34 31 20 54 68 65 20 72 65 73 75 6c 74  28041 The result
102b0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
102c0 6f 6e 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a  on is the value.
102d0 23 20 6f 66 20 74 68 65 20 6f 6e 6c 79 20 63 6f  # of the only co
102e0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 66 69 72 73  lumn in the firs
102f0 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62  t row returned b
10300 79 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  y the SELECT sta
10310 74 65 6d 65 6e 74 2e 0a 23 0a 23 20 45 56 49 44  tement..#.# EVID
10320 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 38 39 38  ENCE-OF: R-41898
10330 2d 30 36 36 38 36 20 49 66 20 74 68 65 20 53 45  -06686 If the SE
10340 4c 45 43 54 20 79 69 65 6c 64 73 20 6d 6f 72 65  LECT yields more
10350 20 74 68 61 6e 20 6f 6e 65 20 72 65 73 75 6c 74   than one result
10360 0a 23 20 72 6f 77 2c 20 61 6c 6c 20 72 6f 77 73  .# row, all rows
10370 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
10380 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 23 0a   are ignored..#.
10390 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
103a0 65 5f 65 78 70 72 2d 33 36 2e 33 2e 31 20 7b 0a  e_expr-36.3.1 {.
103b0 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
103c0 34 28 78 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52  4(x, y);.  INSER
103d0 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53  T INTO t4 VALUES
103e0 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e  (1, 'one');.  IN
103f0 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
10400 55 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20  UES(2, 'two');. 
10410 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
10420 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65  VALUES(3, 'three
10430 27 29 3b 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63  ');.} {}..foreac
10440 68 20 7b 74 6e 20 65 78 70 72 20 72 65 73 74 79  h {tn expr resty
10450 70 65 20 72 65 73 76 61 6c 7d 20 7b 0a 20 20 20  pe resval} {.   
10460 20 32 20 20 7b 20 28 20 53 45 4c 45 43 54 20 78   2  { ( SELECT x
10470 20 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20 42   FROM t4 ORDER B
10480 59 20 78 20 29 20 20 20 20 20 20 7d 20 20 20 20  Y x )      }    
10490 20 20 20 20 69 6e 74 65 67 65 72 20 31 0a 20 20      integer 1.  
104a0 20 20 33 20 20 7b 20 28 20 53 45 4c 45 43 54 20    3  { ( SELECT 
104b0 78 20 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20  x FROM t4 ORDER 
104c0 42 59 20 79 20 29 20 20 20 20 20 20 7d 20 20 20  BY y )      }   
104d0 20 20 20 20 20 69 6e 74 65 67 65 72 20 31 0a 20       integer 1. 
104e0 20 20 20 34 20 20 7b 20 28 20 53 45 4c 45 43 54     4  { ( SELECT
104f0 20 78 20 46 52 4f 4d 20 74 34 20 4f 52 44 45 52   x FROM t4 ORDER
10500 20 42 59 20 78 20 44 45 53 43 20 29 20 7d 20 20   BY x DESC ) }  
10510 20 20 20 20 20 20 69 6e 74 65 67 65 72 20 33 0a        integer 3.
10520 20 20 20 20 35 20 20 7b 20 28 20 53 45 4c 45 43      5  { ( SELEC
10530 54 20 78 20 46 52 4f 4d 20 74 34 20 4f 52 44 45  T x FROM t4 ORDE
10540 52 20 42 59 20 79 20 44 45 53 43 20 29 20 7d 20  R BY y DESC ) } 
10550 20 20 20 20 20 20 20 69 6e 74 65 67 65 72 20 32         integer 2
10560 0a 20 20 20 20 36 20 20 7b 20 28 20 53 45 4c 45  .    6  { ( SELE
10570 43 54 20 79 20 46 52 4f 4d 20 74 34 20 4f 52 44  CT y FROM t4 ORD
10580 45 52 20 42 59 20 79 20 44 45 53 43 20 29 20 7d  ER BY y DESC ) }
10590 20 20 20 20 20 20 20 20 74 65 78 74 20 20 20 20          text    
105a0 74 77 6f 0a 0a 20 20 20 20 37 20 20 7b 20 28 20  two..    7  { ( 
105b0 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52  SELECT sum(x) FR
105c0 4f 4d 20 74 34 20 29 20 20 20 20 20 20 20 20 20  OM t4 )         
105d0 20 20 7d 20 20 20 20 20 20 20 20 20 69 6e 74 65    }         inte
105e0 67 65 72 20 36 0a 20 20 20 20 38 20 20 7b 20 28  ger 6.    8  { (
105f0 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f   SELECT group_co
10600 6e 63 61 74 28 79 2c 27 27 29 20 46 52 4f 4d 20  ncat(y,'') FROM 
10610 74 34 20 29 20 7d 20 20 20 20 20 20 20 74 65 78  t4 ) }       tex
10620 74 20 20 20 20 6f 6e 65 74 77 6f 74 68 72 65 65  t    onetwothree
10630 0a 20 20 20 20 39 20 20 7b 20 28 20 53 45 4c 45  .    9  { ( SELE
10640 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 74  CT max(x) FROM t
10650 34 20 57 48 45 52 45 20 79 20 4c 49 4b 45 20 27  4 WHERE y LIKE '
10660 5f 5f 5f 27 29 20 7d 20 69 6e 74 65 67 65 72 20  ___') } integer 
10670 32 20 0a 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70  2 ..} {.  do_exp
10680 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 36  r_test e_expr-36
10690 2e 33 2e 24 74 6e 20 24 65 78 70 72 20 24 72 65  .3.$tn $expr $re
106a0 73 74 79 70 65 20 24 72 65 73 76 61 6c 0a 7d 0a  stype $resval.}.
106b0 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
106c0 52 2d 32 35 34 39 32 2d 34 31 35 37 32 20 49 66  R-25492-41572 If
106d0 20 74 68 65 20 53 45 4c 45 43 54 20 79 69 65 6c   the SELECT yiel
106e0 64 73 20 6e 6f 20 72 6f 77 73 2c 20 74 68 65 6e  ds no rows, then
106f0 20 74 68 65 0a 23 20 76 61 6c 75 65 20 6f 66 20   the.# value of 
10700 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
10710 73 20 4e 55 4c 4c 2e 0a 23 0a 66 6f 72 65 61 63  s NULL..#.foreac
10720 68 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20  h {tn expr} {.  
10730 20 20 31 20 20 7b 20 28 20 53 45 4c 45 43 54 20    1  { ( SELECT 
10740 78 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20  x FROM t4 WHERE 
10750 78 3e 33 20 4f 52 44 45 52 20 42 59 20 78 20 29  x>3 ORDER BY x )
10760 20 20 20 20 20 20 7d 0a 20 20 20 20 32 20 20 7b        }.    2  {
10770 20 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d   ( SELECT x FROM
10780 20 74 34 20 57 48 45 52 45 20 79 3c 27 6f 6e 65   t4 WHERE y<'one
10790 27 20 4f 52 44 45 52 20 42 59 20 79 20 29 20 20  ' ORDER BY y )  
107a0 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70 72 5f  }.} {.  do_expr_
107b0 74 65 73 74 20 65 5f 65 78 70 72 2d 33 36 2e 34  test e_expr-36.4
107c0 2e 24 74 6e 20 24 65 78 70 72 20 6e 75 6c 6c 20  .$tn $expr null 
107d0 7b 7d 0a 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65  {}.}...finish_te
107e0 73 74 0a                                         st.