/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 164e87c1d7b40ceb47c57c3bffa384c81d009aa7:


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 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3be0: 32 36 39 32 31 2d 35 39 32 39 38 20 53 63 69 65  26921-59298 Scie
3bf0: 6e 74 69 66 69 63 20 6e 6f 74 61 74 69 6f 6e 20  ntific notation 
3c00: 69 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  is supported for
3c10: 0a 23 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  .# floating poin
3c20: 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73  t literal values
3c30: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
3c40: 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 32 2e  est e_expr-10.2.
3c50: 31 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f  1 { SELECT typeo
3c60: 66 28 33 2e 34 65 2d 30 32 29 20 20 20 20 7d 20  f(3.4e-02)    } 
3c70: 7b 72 65 61 6c 7d 0a 64 6f 5f 65 78 65 63 73 71  {real}.do_execsq
3c80: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30  l_test e_expr-10
3c90: 2e 32 2e 32 20 7b 20 53 45 4c 45 43 54 20 74 79  .2.2 { SELECT ty
3ca0: 70 65 6f 66 28 33 65 2b 35 29 20 20 20 20 20 20  peof(3e+5)      
3cb0: 20 7d 20 7b 72 65 61 6c 7d 0a 64 6f 5f 65 78 65   } {real}.do_exe
3cc0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3cd0: 2d 31 30 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54  -10.2.3 { SELECT
3ce0: 20 33 2e 34 65 2d 30 32 20 20 20 20 20 20 20 20   3.4e-02        
3cf0: 20 20 20 20 7d 20 7b 30 2e 30 33 34 7d 0a 64 6f      } {0.034}.do
3d00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3d10: 65 78 70 72 2d 31 30 2e 32 2e 34 20 7b 20 53 45  expr-10.2.4 { SE
3d20: 4c 45 43 54 20 33 65 2b 34 20 20 20 20 20 20 20  LECT 3e+4       
3d30: 20 20 20 20 20 20 20 20 7d 20 7b 33 30 30 30 30          } {30000
3d40: 2e 30 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  .0}..# EVIDENCE-
3d50: 4f 46 3a 20 52 2d 33 35 32 32 39 2d 31 37 38 33  OF: R-35229-1783
3d60: 30 20 41 20 73 74 72 69 6e 67 20 63 6f 6e 73 74  0 A string const
3d70: 61 6e 74 20 69 73 20 66 6f 72 6d 65 64 20 62 79  ant is formed by
3d80: 20 65 6e 63 6c 6f 73 69 6e 67 0a 23 20 74 68 65   enclosing.# the
3d90: 20 73 74 72 69 6e 67 20 69 6e 20 73 69 6e 67 6c   string in singl
3da0: 65 20 71 75 6f 74 65 73 20 28 27 29 2e 0a 23 0a  e quotes (')..#.
3db0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
3dc0: 2d 30 37 31 30 30 2d 30 36 36 30 36 20 41 20 73  -07100-06606 A s
3dd0: 69 6e 67 6c 65 20 71 75 6f 74 65 20 77 69 74 68  ingle quote with
3de0: 69 6e 20 74 68 65 20 73 74 72 69 6e 67 20 63 61  in the string ca
3df0: 6e 20 62 65 0a 23 20 65 6e 63 6f 64 65 64 20 62  n be.# encoded b
3e00: 79 20 70 75 74 74 69 6e 67 20 74 77 6f 20 73 69  y putting two si
3e10: 6e 67 6c 65 20 71 75 6f 74 65 73 20 69 6e 20 61  ngle quotes in a
3e20: 20 72 6f 77 20 2d 20 61 73 20 69 6e 20 50 61 73   row - as in Pas
3e30: 63 61 6c 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  cal..#.do_execsq
3e40: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30  l_test e_expr-10
3e50: 2e 33 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 69  .3.1 { SELECT 'i
3e60: 73 20 6e 6f 74 27 20 7d 20 20 20 20 20 20 20 20  s not' }        
3e70: 20 7b 7b 69 73 20 6e 6f 74 7d 7d 0a 64 6f 5f 65   {{is not}}.do_e
3e80: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
3e90: 70 72 2d 31 30 2e 33 2e 32 20 7b 20 53 45 4c 45  pr-10.3.2 { SELE
3ea0: 43 54 20 74 79 70 65 6f 66 28 27 69 73 20 6e 6f  CT typeof('is no
3eb0: 74 27 29 20 7d 20 7b 74 65 78 74 7d 0a 64 6f 5f  t') } {text}.do_
3ec0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3ed0: 78 70 72 2d 31 30 2e 33 2e 33 20 7b 20 53 45 4c  xpr-10.3.3 { SEL
3ee0: 45 43 54 20 27 69 73 6e 27 27 74 27 20 7d 20 20  ECT 'isn''t' }  
3ef0: 20 20 20 20 20 20 20 7b 69 73 6e 27 74 7d 0a 64         {isn't}.d
3f00: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
3f10: 5f 65 78 70 72 2d 31 30 2e 33 2e 34 20 7b 20 53  _expr-10.3.4 { S
3f20: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 27 69 73  ELECT typeof('is
3f30: 6e 27 27 74 27 29 20 7d 20 7b 74 65 78 74 7d 0a  n''t') } {text}.
3f40: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
3f50: 52 2d 30 39 35 39 33 2d 30 33 33 32 31 20 42 4c  R-09593-03321 BL
3f60: 4f 42 20 6c 69 74 65 72 61 6c 73 20 61 72 65 20  OB literals are 
3f70: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 0a  string literals.
3f80: 23 20 63 6f 6e 74 61 69 6e 69 6e 67 20 68 65 78  # containing hex
3f90: 61 64 65 63 69 6d 61 6c 20 64 61 74 61 20 61 6e  adecimal data an
3fa0: 64 20 70 72 65 63 65 64 65 64 20 62 79 20 61 20  d preceded by a 
3fb0: 73 69 6e 67 6c 65 20 22 78 22 20 6f 72 20 22 58  single "x" or "X
3fc0: 22 0a 23 20 63 68 61 72 61 63 74 65 72 2e 0a 23  ".# character..#
3fd0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
3fe0: 52 2d 33 39 33 34 34 2d 35 39 37 38 37 20 46 6f  R-39344-59787 Fo
3ff0: 72 20 65 78 61 6d 70 6c 65 3a 20 58 27 35 33 35  r example: X'535
4000: 31 34 43 36 39 37 34 36 35 27 0a 23 0a 64 6f 5f  14C697465'.#.do_
4010: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
4020: 78 70 72 2d 31 30 2e 34 2e 31 20 7b 20 53 45 4c  xpr-10.4.1 { SEL
4030: 45 43 54 20 74 79 70 65 6f 66 28 58 27 30 31 32  ECT typeof(X'012
4040: 33 34 35 36 37 38 39 41 42 43 44 45 46 27 29 20  3456789ABCDEF') 
4050: 7d 20 62 6c 6f 62 0a 64 6f 5f 65 78 65 63 73 71  } blob.do_execsq
4060: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30  l_test e_expr-10
4070: 2e 34 2e 32 20 7b 20 53 45 4c 45 43 54 20 74 79  .4.2 { SELECT ty
4080: 70 65 6f 66 28 78 27 30 31 32 33 34 35 36 37 38  peof(x'012345678
4090: 39 41 42 43 44 45 46 27 29 20 7d 20 62 6c 6f 62  9ABCDEF') } blob
40a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
40b0: 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e 33 20 7b   e_expr-10.4.3 {
40c0: 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 58   SELECT typeof(X
40d0: 27 30 31 32 33 34 35 36 37 38 39 61 62 63 64 65  '0123456789abcde
40e0: 66 27 29 20 7d 20 62 6c 6f 62 0a 64 6f 5f 65 78  f') } blob.do_ex
40f0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
4100: 72 2d 31 30 2e 34 2e 34 20 7b 20 53 45 4c 45 43  r-10.4.4 { SELEC
4110: 54 20 74 79 70 65 6f 66 28 78 27 30 31 32 33 34  T typeof(x'01234
4120: 35 36 37 38 39 61 62 63 64 65 66 27 29 20 7d 20  56789abcdef') } 
4130: 62 6c 6f 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  blob.do_execsql_
4140: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 34  test e_expr-10.4
4150: 2e 35 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65  .5 { SELECT type
4160: 6f 66 28 58 27 35 33 35 31 34 43 36 39 37 34 36  of(X'53514C69746
4170: 35 27 29 20 20 20 20 20 7d 20 62 6c 6f 62 0a 0a  5')     } blob..
4180: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
4190: 2d 32 33 39 31 34 2d 35 31 34 37 36 20 41 20 6c  -23914-51476 A l
41a0: 69 74 65 72 61 6c 20 76 61 6c 75 65 20 63 61 6e  iteral value can
41b0: 20 61 6c 73 6f 20 62 65 20 74 68 65 20 74 6f 6b   also be the tok
41c0: 65 6e 0a 23 20 22 4e 55 4c 4c 22 2e 0a 23 0a 64  en.# "NULL"..#.d
41d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
41e0: 5f 65 78 70 72 2d 31 30 2e 35 2e 31 20 7b 20 53  _expr-10.5.1 { S
41f0: 45 4c 45 43 54 20 4e 55 4c 4c 20 20 20 20 20 20  ELECT NULL      
4200: 20 20 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65     } {{}}.do_exe
4210: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
4220: 2d 31 30 2e 35 2e 32 20 7b 20 53 45 4c 45 43 54  -10.5.2 { SELECT
4230: 20 74 79 70 65 6f 66 28 4e 55 4c 4c 29 20 7d 20   typeof(NULL) } 
4240: 7b 6e 75 6c 6c 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  {null}..#-------
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 2d 2d  ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4290: 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65 6d  --.# Test statem
42a0: 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20  ents related to 
42b0: 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72 73  bound parameters
42c0: 0a 23 0a 0a 70 72 6f 63 20 70 61 72 61 6d 65 74  .#..proc paramet
42d0: 65 72 5f 74 65 73 74 20 7b 74 6e 20 73 71 6c 20  er_test {tn sql 
42e0: 70 61 72 61 6d 73 20 72 65 73 75 6c 74 7d 20 7b  params result} {
42f0: 0a 20 20 73 65 74 20 73 74 6d 74 20 5b 73 71 6c  .  set stmt [sql
4300: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
4310: 64 62 20 24 73 71 6c 20 2d 31 5d 0a 0a 20 20 66  db $sql -1]..  f
4320: 6f 72 65 61 63 68 20 7b 6e 75 6d 62 65 72 20 6e  oreach {number n
4330: 61 6d 65 7d 20 24 70 61 72 61 6d 73 20 7b 0a 20  ame} $params {. 
4340: 20 20 20 73 65 74 20 6e 6d 20 5b 73 71 6c 69 74     set nm [sqlit
4350: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
4360: 72 5f 6e 61 6d 65 20 24 73 74 6d 74 20 24 6e 75  r_name $stmt $nu
4370: 6d 62 65 72 5d 0a 20 20 20 20 64 6f 5f 74 65 73  mber].    do_tes
4380: 74 20 24 74 6e 2e 6e 61 6d 65 2e 24 6e 75 6d 62  t $tn.name.$numb
4390: 65 72 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20  er [list set {} 
43a0: 24 6e 6d 5d 20 24 6e 61 6d 65 0a 20 20 20 20 73  $nm] $name.    s
43b0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
43c0: 24 73 74 6d 74 20 24 6e 75 6d 62 65 72 20 5b 65  $stmt $number [e
43d0: 78 70 72 20 2d 31 20 2a 20 24 6e 75 6d 62 65 72  xpr -1 * $number
43e0: 5d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ].  }..  sqlite3
43f0: 5f 73 74 65 70 20 24 73 74 6d 74 0a 0a 20 20 73  _step $stmt..  s
4400: 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20  et res [list].  
4410: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
4420: 69 20 3c 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c  i < [sqlite3_col
4430: 75 6d 6e 5f 63 6f 75 6e 74 20 24 73 74 6d 74 5d  umn_count $stmt]
4440: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
4450: 20 6c 61 70 70 65 6e 64 20 72 65 73 20 5b 73 71   lappend res [sq
4460: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
4470: 74 20 24 73 74 6d 74 20 24 69 5d 0a 20 20 7d 0a  t $stmt $i].  }.
4480: 0a 20 20 73 65 74 20 72 63 20 5b 73 71 6c 69 74  .  set rc [sqlit
4490: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d  e3_finalize $stm
44a0: 74 5d 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 6e  t].  do_test $tn
44b0: 2e 72 63 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d  .rc [list set {}
44c0: 20 24 72 63 5d 20 53 51 4c 49 54 45 5f 4f 4b 0a   $rc] SQLITE_OK.
44d0: 20 20 64 6f 5f 74 65 73 74 20 24 74 6e 2e 72 65    do_test $tn.re
44e0: 73 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24  s [list set {} $
44f0: 72 65 73 5d 20 24 72 65 73 75 6c 74 0a 7d 0a 0a  res] $result.}..
4500: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
4510: 2d 33 33 35 30 39 2d 33 39 34 35 38 20 41 20 71  -33509-39458 A q
4520: 75 65 73 74 69 6f 6e 20 6d 61 72 6b 20 66 6f 6c  uestion mark fol
4530: 6c 6f 77 65 64 20 62 79 20 61 20 6e 75 6d 62 65  lowed by a numbe
4540: 72 20 4e 4e 4e 0a 23 20 68 6f 6c 64 73 20 61 20  r NNN.# holds a 
4550: 73 70 6f 74 20 66 6f 72 20 74 68 65 20 4e 4e 4e  spot for the NNN
4560: 2d 74 68 20 70 61 72 61 6d 65 74 65 72 2e 20 4e  -th parameter. N
4570: 4e 4e 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  NN must be betwe
4580: 65 6e 20 31 20 61 6e 64 0a 23 20 53 51 4c 49 54  en 1 and.# SQLIT
4590: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
45a0: 55 4d 42 45 52 2e 0a 23 0a 73 65 74 20 6d 76 6e  UMBER..#.set mvn
45b0: 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52   $SQLITE_MAX_VAR
45c0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 0a 70 61 72  IABLE_NUMBER.par
45d0: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
45e0: 70 72 2d 31 31 2e 31 20 22 0a 20 20 53 45 4c 45  pr-11.1 ".  SELE
45f0: 43 54 20 3f 31 2c 20 3f 31 32 33 2c 20 3f 24 53  CT ?1, ?123, ?$S
4600: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
4610: 4c 45 5f 4e 55 4d 42 45 52 2c 20 3f 31 32 33 2c  LE_NUMBER, ?123,
4620: 20 3f 34 0a 22 20 20 20 22 31 20 3f 31 20 20 31   ?4."   "1 ?1  1
4630: 32 33 20 3f 31 32 33 20 24 6d 76 6e 20 3f 24 6d  23 ?123 $mvn ?$m
4640: 76 6e 20 34 20 3f 34 22 20 20 20 22 2d 31 20 2d  vn 4 ?4"   "-1 -
4650: 31 32 33 20 2d 24 6d 76 6e 20 2d 31 32 33 20 2d  123 -$mvn -123 -
4660: 34 22 0a 0a 73 65 74 20 65 72 72 6d 73 67 20 22  4"..set errmsg "
4670: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
4680: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
4690: 3f 31 20 61 6e 64 20 3f 24 53 51 4c 49 54 45 5f  ?1 and ?$SQLITE_
46a0: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
46b0: 42 45 52 22 0a 66 6f 72 65 61 63 68 20 7b 74 6e  BER".foreach {tn
46c0: 20 70 61 72 61 6d 5f 6e 75 6d 62 65 72 7d 20 5b   param_number} [
46d0: 6c 69 73 74 20 5c 0a 20 20 32 20 20 30 20 20 20  list \.  2  0   
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 5c 0a 20 20 33 20 20 5b 65 78 70 72 20 24 53   \.  3  [expr $S
4710: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
4720: 4c 45 5f 4e 55 4d 42 45 52 2b 31 5d 20 5c 0a 20  LE_NUMBER+1] \. 
4730: 20 34 20 20 5b 65 78 70 72 20 24 53 51 4c 49 54   4  [expr $SQLIT
4740: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
4750: 55 4d 42 45 52 2b 32 5d 20 5c 0a 20 20 35 20 20  UMBER+2] \.  5  
4760: 31 32 33 34 35 36 37 38 39 30 33 34 35 36 37 38  1234567890345678
4770: 39 30 33 34 35 36 37 38 39 30 32 33 34 35 36 37  9034567890234567
4780: 38 39 30 20 20 5c 0a 20 20 36 20 20 32 31 34 37  890  \.  6  2147
4790: 34 38 33 36 34 38 20 20 20 20 20 20 20 20 20 20  483648          
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47b0: 20 5c 0a 20 20 37 20 20 32 31 34 37 34 38 33 36   \.  7  21474836
47c0: 34 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20  49              
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
47e0: 20 38 20 20 34 32 39 34 39 36 37 32 39 36 20 20   8  4294967296  
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 39 20 20           \.  9  
4810: 34 32 39 34 39 36 37 32 39 37 20 20 20 20 20 20  4294967297      
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4830: 20 20 20 20 20 5c 0a 20 20 31 30 20 39 32 32 33       \.  10 9223
4840: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 20  372036854775808 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 5c 0a 20 20 31 31 20 39 32 32 33 33 37 32 30   \.  11 92233720
4870: 33 36 38 35 34 37 37 35 38 30 39 20 20 20 20 20  36854775809     
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
4890: 20 31 32 20 31 38 34 34 36 37 34 34 30 37 33 37   12 184467440737
48a0: 30 39 35 35 31 36 31 36 20 20 20 20 20 20 20 20  09551616        
48b0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 31 33 20           \.  13 
48c0: 31 38 34 34 36 37 34 34 30 37 33 37 30 39 35 35  1844674407370955
48d0: 31 36 31 37 20 20 20 20 20 20 20 20 20 20 20 20  1617            
48e0: 20 20 20 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f       \.] {.  do_
48f0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f  catchsql_test e_
4900: 65 78 70 72 2d 31 31 2e 31 2e 24 74 6e 20 22 53  expr-11.1.$tn "S
4910: 45 4c 45 43 54 20 3f 24 70 61 72 61 6d 5f 6e 75  ELECT ?$param_nu
4920: 6d 62 65 72 22 20 5b 6c 69 73 74 20 31 20 24 65  mber" [list 1 $e
4930: 72 72 6d 73 67 5d 0a 7d 0a 0a 23 20 45 56 49 44  rrmsg].}..# EVID
4940: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 36 37 30  ENCE-OF: R-33670
4950: 2d 33 36 30 39 37 20 41 20 71 75 65 73 74 69 6f  -36097 A questio
4960: 6e 20 6d 61 72 6b 20 74 68 61 74 20 69 73 20 6e  n mark that is n
4970: 6f 74 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ot followed by a
4980: 0a 23 20 6e 75 6d 62 65 72 20 63 72 65 61 74 65  .# number create
4990: 73 20 61 20 70 61 72 61 6d 65 74 65 72 20 77 69  s a parameter wi
49a0: 74 68 20 61 20 6e 75 6d 62 65 72 20 6f 6e 65 20  th a number one 
49b0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
49c0: 20 6c 61 72 67 65 73 74 0a 23 20 70 61 72 61 6d   largest.# param
49d0: 65 74 65 72 20 6e 75 6d 62 65 72 20 61 6c 72 65  eter number alre
49e0: 61 64 79 20 61 73 73 69 67 6e 65 64 2e 0a 23 0a  ady assigned..#.
49f0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
4a00: 2d 34 32 39 33 38 2d 30 37 30 33 30 20 49 66 20  -42938-07030 If 
4a10: 74 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 70  this means the p
4a20: 61 72 61 6d 65 74 65 72 20 6e 75 6d 62 65 72 20  arameter number 
4a30: 69 73 0a 23 20 67 72 65 61 74 65 72 20 74 68 61  is.# greater tha
4a40: 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  n SQLITE_MAX_VAR
4a50: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 69 74  IABLE_NUMBER, it
4a60: 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a   is an error..#.
4a70: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
4a80: 5f 65 78 70 72 2d 31 31 2e 32 2e 31 20 22 53 45  _expr-11.2.1 "SE
4a90: 4c 45 43 54 20 3f 22 20 20 20 20 20 20 20 20 20  LECT ?"         
4aa0: 20 7b 31 20 7b 7d 7d 20 20 20 20 20 20 20 2d 31   {1 {}}       -1
4ab0: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
4ac0: 65 5f 65 78 70 72 2d 31 31 2e 32 2e 32 20 22 53  e_expr-11.2.2 "S
4ad0: 45 4c 45 43 54 20 3f 2c 20 3f 22 20 20 20 20 20  ELECT ?, ?"     
4ae0: 20 20 7b 31 20 7b 7d 20 32 20 7b 7d 7d 20 20 7b    {1 {} 2 {}}  {
4af0: 2d 31 20 2d 32 7d 0a 70 61 72 61 6d 65 74 65 72  -1 -2}.parameter
4b00: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
4b10: 32 2e 33 20 22 53 45 4c 45 43 54 20 3f 35 2c 20  2.3 "SELECT ?5, 
4b20: 3f 22 20 20 20 20 20 20 7b 35 20 3f 35 20 36 20  ?"      {5 ?5 6 
4b30: 7b 7d 7d 20 20 7b 2d 35 20 2d 36 7d 0a 70 61 72  {}}  {-5 -6}.par
4b40: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
4b50: 70 72 2d 31 31 2e 32 2e 34 20 22 53 45 4c 45 43  pr-11.2.4 "SELEC
4b60: 54 20 3f 2c 20 3f 35 22 20 20 20 20 20 20 7b 31  T ?, ?5"      {1
4b70: 20 7b 7d 20 35 20 3f 35 7d 20 20 7b 2d 31 20 2d   {} 5 ?5}  {-1 -
4b80: 35 7d 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  5}.parameter_tes
4b90: 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 35 20  t e_expr-11.2.5 
4ba0: 22 53 45 4c 45 43 54 20 3f 2c 20 3f 34 35 36 2c  "SELECT ?, ?456,
4bb0: 20 3f 22 20 7b 0a 20 20 31 20 7b 7d 20 34 35 36   ?" {.  1 {} 456
4bc0: 20 3f 34 35 36 20 34 35 37 20 7b 7d 0a 7d 20 20   ?456 457 {}.}  
4bd0: 7b 2d 31 20 2d 34 35 36 20 2d 34 35 37 7d 0a 70  {-1 -456 -457}.p
4be0: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
4bf0: 65 78 70 72 2d 31 31 2e 32 2e 35 20 22 53 45 4c  expr-11.2.5 "SEL
4c00: 45 43 54 20 3f 2c 20 3f 34 35 36 2c 20 3f 34 2c  ECT ?, ?456, ?4,
4c10: 20 3f 22 20 7b 0a 20 20 31 20 7b 7d 20 34 35 36   ?" {.  1 {} 456
4c20: 20 3f 34 35 36 20 34 20 3f 34 20 34 35 37 20 7b   ?456 4 ?4 457 {
4c30: 7d 0a 7d 20 20 7b 2d 31 20 2d 34 35 36 20 2d 34  }.}  {-1 -456 -4
4c40: 20 2d 34 35 37 7d 0a 66 6f 72 65 61 63 68 20 7b   -457}.foreach {
4c50: 74 6e 20 73 71 6c 7d 20 5b 6c 69 73 74 20 20 20  tn sql} [list   
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 20 20 20 20 20 5c 0a 20 20 31 20 20 22          \.  1  "
4c80: 53 45 4c 45 43 54 20 3f 24 6d 76 6e 2c 20 3f 22  SELECT ?$mvn, ?"
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 32             \.  2
4cb0: 20 20 22 53 45 4c 45 43 54 20 3f 5b 65 78 70 72    "SELECT ?[expr
4cc0: 20 24 6d 76 6e 2d 35 5d 2c 20 3f 2c 20 3f 2c 20   $mvn-5], ?, ?, 
4cd0: 3f 2c 20 3f 2c 20 3f 2c 20 3f 22 20 20 20 5c 0a  ?, ?, ?, ?"   \.
4ce0: 20 20 33 20 20 22 53 45 4c 45 43 54 20 3f 5b 65    3  "SELECT ?[e
4cf0: 78 70 72 20 24 6d 76 6e 5d 2c 20 3f 35 2c 20 3f  xpr $mvn], ?5, ?
4d00: 36 2c 20 3f 22 20 20 20 20 20 20 20 20 20 20 20  6, ?"           
4d10: 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 63 61 74 63   \.] {.  do_catc
4d20: 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  hsql_test e_expr
4d30: 2d 31 31 2e 33 2e 24 74 6e 20 24 73 71 6c 20 5b  -11.3.$tn $sql [
4d40: 6c 69 73 74 20 31 20 7b 74 6f 6f 20 6d 61 6e 79  list 1 {too many
4d50: 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 7d 5d   SQL variables}]
4d60: 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
4d70: 46 3a 20 52 2d 31 31 36 32 30 2d 32 32 37 34 33  F: R-11620-22743
4d80: 20 41 20 63 6f 6c 6f 6e 20 66 6f 6c 6c 6f 77 65   A colon followe
4d90: 64 20 62 79 20 61 6e 20 69 64 65 6e 74 69 66 69  d by an identifi
4da0: 65 72 20 6e 61 6d 65 0a 23 20 68 6f 6c 64 73 20  er name.# holds 
4db0: 61 20 73 70 6f 74 20 66 6f 72 20 61 20 6e 61 6d  a spot for a nam
4dc0: 65 64 20 70 61 72 61 6d 65 74 65 72 20 77 69 74  ed parameter wit
4dd0: 68 20 74 68 65 20 6e 61 6d 65 20 3a 41 41 41 41  h the name :AAAA
4de0: 2e 0a 23 0a 23 20 49 64 65 6e 74 69 66 69 65 72  ..#.# Identifier
4df0: 73 20 69 6e 20 53 51 4c 69 74 65 20 63 6f 6e 73  s in SQLite cons
4e00: 69 73 74 20 6f 66 20 61 6c 70 68 61 6e 75 6d 65  ist of alphanume
4e10: 72 69 63 2c 20 27 5f 27 20 61 6e 64 20 27 24 27  ric, '_' and '$'
4e20: 20 63 68 61 72 61 63 74 65 72 73 2c 0a 23 20 61   characters,.# a
4e30: 6e 64 20 61 6e 79 20 55 54 46 20 63 68 61 72 61  nd any UTF chara
4e40: 63 74 65 72 73 20 77 69 74 68 20 63 6f 64 65 70  cters with codep
4e50: 6f 69 6e 74 73 20 6c 61 72 67 65 72 20 74 68 61  oints larger tha
4e60: 6e 20 31 32 37 20 28 6e 6f 6e 2d 41 53 43 49 49  n 127 (non-ASCII
4e70: 20 0a 23 20 63 68 61 72 61 63 74 65 72 73 29 2e   .# characters).
4e80: 0a 23 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  .#.parameter_tes
4e90: 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 31 20  t e_expr-11.2.1 
4ea0: 7b 53 45 4c 45 43 54 20 3a 41 41 41 41 7d 20 20  {SELECT :AAAA}  
4eb0: 20 20 20 20 20 20 20 7b 31 20 3a 41 41 41 41 7d         {1 :AAAA}
4ec0: 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65         -1.parame
4ed0: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4ee0: 31 31 2e 32 2e 32 20 7b 53 45 4c 45 43 54 20 3a  11.2.2 {SELECT :
4ef0: 31 32 33 7d 20 20 20 20 20 20 20 20 20 20 7b 31  123}          {1
4f00: 20 3a 31 32 33 7d 20 20 20 20 20 20 20 20 2d 31   :123}        -1
4f10: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
4f20: 65 5f 65 78 70 72 2d 31 31 2e 32 2e 33 20 7b 53  e_expr-11.2.3 {S
4f30: 45 4c 45 43 54 20 3a 5f 5f 7d 20 20 20 20 20 20  ELECT :__}      
4f40: 20 20 20 20 20 7b 31 20 3a 5f 5f 7d 20 20 20 20       {1 :__}    
4f50: 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65       -1.paramete
4f60: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
4f70: 2e 32 2e 34 20 7b 53 45 4c 45 43 54 20 3a 5f 24  .2.4 {SELECT :_$
4f80: 5f 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 3a  _}          {1 :
4f90: 5f 24 5f 7d 20 20 20 20 20 20 20 20 2d 31 0a 70  _$_}        -1.p
4fa0: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
4fb0: 65 78 70 72 2d 31 31 2e 32 2e 35 20 22 0a 20 20  expr-11.2.5 ".  
4fc0: 53 45 4c 45 43 54 20 3a 5c 75 30 65 34 30 5c 75  SELECT :\u0e40\u
4fd0: 30 65 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32  0e2d\u0e28\u0e02
4fe0: 5c 75 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65  \u0e39\u0e40\u0e
4ff0: 32 64 5c 75 30 65 32 35 0a 22 20 22 31 20 3a 5c  2d\u0e25." "1 :\
5000: 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32  u0e40\u0e2d\u0e2
5010: 38 5c 75 30 65 30 32 5c 75 30 65 33 39 5c 75 30  8\u0e02\u0e39\u0
5020: 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 35 22  e40\u0e2d\u0e25"
5030: 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65   -1.parameter_te
5040: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 36  st e_expr-11.2.6
5050: 20 22 53 45 4c 45 43 54 20 3a 5c 75 30 30 38 30   "SELECT :\u0080
5060: 22 20 22 31 20 3a 5c 75 30 30 38 30 22 20 2d 31  " "1 :\u0080" -1
5070: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
5080: 20 52 2d 34 39 37 38 33 2d 36 31 32 37 39 20 41   R-49783-61279 A
5090: 6e 20 22 61 74 22 20 73 69 67 6e 20 77 6f 72 6b  n "at" sign work
50a0: 73 20 65 78 61 63 74 6c 79 20 6c 69 6b 65 20 61  s exactly like a
50b0: 20 63 6f 6c 6f 6e 2c 0a 23 20 65 78 63 65 70 74   colon,.# except
50c0: 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65 20 6f   that the name o
50d0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
50e0: 63 72 65 61 74 65 64 20 69 73 20 40 41 41 41 41  created is @AAAA
50f0: 2e 0a 23 0a 70 61 72 61 6d 65 74 65 72 5f 74 65  ..#.parameter_te
5100: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e 31  st e_expr-11.3.1
5110: 20 7b 53 45 4c 45 43 54 20 40 41 41 41 41 7d 20   {SELECT @AAAA} 
5120: 20 20 20 20 20 20 20 20 7b 31 20 40 41 41 41 41          {1 @AAAA
5130: 7d 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d  }       -1.param
5140: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
5150: 2d 31 31 2e 33 2e 32 20 7b 53 45 4c 45 43 54 20  -11.3.2 {SELECT 
5160: 40 31 32 33 7d 20 20 20 20 20 20 20 20 20 20 7b  @123}          {
5170: 31 20 40 31 32 33 7d 20 20 20 20 20 20 20 20 2d  1 @123}        -
5180: 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  1.parameter_test
5190: 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e 33 20 7b   e_expr-11.3.3 {
51a0: 53 45 4c 45 43 54 20 40 5f 5f 7d 20 20 20 20 20  SELECT @__}     
51b0: 20 20 20 20 20 20 7b 31 20 40 5f 5f 7d 20 20 20        {1 @__}   
51c0: 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74        -1.paramet
51d0: 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  er_test e_expr-1
51e0: 31 2e 33 2e 34 20 7b 53 45 4c 45 43 54 20 40 5f  1.3.4 {SELECT @_
51f0: 24 5f 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20  $_}          {1 
5200: 40 5f 24 5f 7d 20 20 20 20 20 20 20 20 2d 31 0a  @_$_}        -1.
5210: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
5220: 5f 65 78 70 72 2d 31 31 2e 33 2e 35 20 22 0a 20  _expr-11.3.5 ". 
5230: 20 53 45 4c 45 43 54 20 40 5c 75 30 65 34 30 5c   SELECT @\u0e40\
5240: 75 30 65 32 64 5c 75 30 65 32 38 5c 75 30 65 30  u0e2d\u0e28\u0e0
5250: 32 5c 75 30 65 33 39 5c 75 30 65 34 30 5c 75 30  2\u0e39\u0e40\u0
5260: 65 32 64 5c 75 30 65 32 35 0a 22 20 22 31 20 40  e2d\u0e25." "1 @
5270: 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65  \u0e40\u0e2d\u0e
5280: 32 38 5c 75 30 65 30 32 5c 75 30 65 33 39 5c 75  28\u0e02\u0e39\u
5290: 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 35  0e40\u0e2d\u0e25
52a0: 22 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74  " -1.parameter_t
52b0: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e  est e_expr-11.3.
52c0: 36 20 22 53 45 4c 45 43 54 20 40 5c 75 30 30 38  6 "SELECT @\u008
52d0: 30 22 20 22 31 20 40 5c 75 30 30 38 30 22 20 2d  0" "1 @\u0080" -
52e0: 31 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  1..# EVIDENCE-OF
52f0: 3a 20 52 2d 36 32 36 31 30 2d 35 31 33 32 39 20  : R-62610-51329 
5300: 41 20 64 6f 6c 6c 61 72 2d 73 69 67 6e 20 66 6f  A dollar-sign fo
5310: 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 69 64 65  llowed by an ide
5320: 6e 74 69 66 69 65 72 0a 23 20 6e 61 6d 65 20 61  ntifier.# name a
5330: 6c 73 6f 20 68 6f 6c 64 73 20 61 20 73 70 6f 74  lso holds a spot
5340: 20 66 6f 72 20 61 20 6e 61 6d 65 64 20 70 61 72   for a named par
5350: 61 6d 65 74 65 72 20 77 69 74 68 20 74 68 65 20  ameter with the 
5360: 6e 61 6d 65 20 24 41 41 41 41 2e 0a 23 0a 23 20  name $AAAA..#.# 
5370: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
5380: 35 30 32 35 2d 32 31 30 34 32 20 54 68 65 20 69  5025-21042 The i
5390: 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 20 69  dentifier name i
53a0: 6e 20 74 68 69 73 20 63 61 73 65 20 63 61 6e 0a  n this case can.
53b0: 23 20 69 6e 63 6c 75 64 65 20 6f 6e 65 20 6f 72  # include one or
53c0: 20 6d 6f 72 65 20 6f 63 63 75 72 72 65 6e 63 65   more occurrence
53d0: 73 20 6f 66 20 22 3a 3a 22 20 61 6e 64 20 61 20  s of "::" and a 
53e0: 73 75 66 66 69 78 20 65 6e 63 6c 6f 73 65 64 20  suffix enclosed 
53f0: 69 6e 0a 23 20 22 28 2e 2e 2e 29 22 20 63 6f 6e  in.# "(...)" con
5400: 74 61 69 6e 69 6e 67 20 61 6e 79 20 74 65 78 74  taining any text
5410: 20 61 74 20 61 6c 6c 2e 0a 23 0a 23 20 4e 6f 74   at all..#.# Not
5420: 65 3a 20 4c 6f 6f 6b 73 20 6c 69 6b 65 20 61 6e  e: Looks like an
5430: 20 69 64 65 6e 74 69 66 69 65 72 20 63 61 6e 6e   identifier cann
5440: 6f 74 20 63 6f 6e 73 69 73 74 20 65 6e 74 69 72  ot consist entir
5450: 65 6c 79 20 6f 66 20 22 3a 3a 22 20 0a 23 20 63  ely of "::" .# c
5460: 68 61 72 61 63 74 65 72 73 20 6f 72 20 6a 75 73  haracters or jus
5470: 74 20 61 20 73 75 66 66 69 78 2e 20 41 6c 73 6f  t a suffix. Also
5480: 2c 20 74 68 65 20 6f 74 68 65 72 20 6e 61 6d 65  , the other name
5490: 64 20 76 61 72 69 61 62 6c 65 20 63 68 61 72 61  d variable chara
54a0: 63 74 65 72 73 0a 23 20 28 3a 20 61 6e 64 20 40  cters.# (: and @
54b0: 29 20 77 6f 72 6b 20 74 68 65 20 73 61 6d 65 20  ) work the same 
54c0: 77 61 79 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 20  way internally. 
54d0: 57 68 79 20 6e 6f 74 20 6a 75 73 74 20 64 6f 63  Why not just doc
54e0: 75 6d 65 6e 74 20 69 74 20 74 68 61 74 20 77 61  ument it that wa
54f0: 79 3f 0a 23 0a 70 61 72 61 6d 65 74 65 72 5f 74  y?.#.parameter_t
5500: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e  est e_expr-11.4.
5510: 31 20 7b 53 45 4c 45 43 54 20 24 41 41 41 41 7d  1 {SELECT $AAAA}
5520: 20 20 20 20 20 20 20 20 20 7b 31 20 24 41 41 41           {1 $AAA
5530: 41 7d 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61  A}       -1.para
5540: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
5550: 72 2d 31 31 2e 34 2e 32 20 7b 53 45 4c 45 43 54  r-11.4.2 {SELECT
5560: 20 24 31 32 33 7d 20 20 20 20 20 20 20 20 20 20   $123}          
5570: 7b 31 20 24 31 32 33 7d 20 20 20 20 20 20 20 20  {1 $123}        
5580: 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  -1.parameter_tes
5590: 74 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e 33 20  t e_expr-11.4.3 
55a0: 7b 53 45 4c 45 43 54 20 24 5f 5f 7d 20 20 20 20  {SELECT $__}    
55b0: 20 20 20 20 20 20 20 7b 31 20 24 5f 5f 7d 20 20         {1 $__}  
55c0: 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65         -1.parame
55d0: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
55e0: 31 31 2e 34 2e 34 20 7b 53 45 4c 45 43 54 20 24  11.4.4 {SELECT $
55f0: 5f 24 5f 7d 20 20 20 20 20 20 20 20 20 20 7b 31  _$_}          {1
5600: 20 24 5f 24 5f 7d 20 20 20 20 20 20 20 20 2d 31   $_$_}        -1
5610: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5620: 65 5f 65 78 70 72 2d 31 31 2e 34 2e 35 20 22 0a  e_expr-11.4.5 ".
5630: 20 20 53 45 4c 45 43 54 20 5c 24 5c 75 30 65 34    SELECT \$\u0e4
5640: 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75 30  0\u0e2d\u0e28\u0
5650: 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30 5c  e02\u0e39\u0e40\
5660: 75 30 65 32 64 5c 75 30 65 32 35 0a 22 20 22 31  u0e2d\u0e25." "1
5670: 20 5c 24 5c 75 30 65 34 30 5c 75 30 65 32 64 5c   \$\u0e40\u0e2d\
5680: 75 30 65 32 38 5c 75 30 65 30 32 5c 75 30 65 33  u0e28\u0e02\u0e3
5690: 39 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30  9\u0e40\u0e2d\u0
56a0: 65 32 35 22 20 2d 31 0a 70 61 72 61 6d 65 74 65  e25" -1.paramete
56b0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
56c0: 2e 34 2e 36 20 22 53 45 4c 45 43 54 20 5c 24 5c  .4.6 "SELECT \$\
56d0: 75 30 30 38 30 22 20 22 31 20 5c 24 5c 75 30 30  u0080" "1 \$\u00
56e0: 38 30 22 20 2d 31 0a 0a 70 61 72 61 6d 65 74 65  80" -1..paramete
56f0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
5700: 2e 35 2e 31 20 7b 53 45 4c 45 43 54 20 24 3a 3a  .5.1 {SELECT $::
5710: 3a 3a 61 28 2b 2b 2d 2d 2b 2b 29 7d 20 7b 31 20  ::a(++--++)} {1 
5720: 24 3a 3a 3a 3a 61 28 2b 2b 2d 2d 2b 2b 29 7d 20  $::::a(++--++)} 
5730: 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  -1.parameter_tes
5740: 74 20 65 5f 65 78 70 72 2d 31 31 2e 35 2e 32 20  t e_expr-11.5.2 
5750: 7b 53 45 4c 45 43 54 20 24 3a 3a 61 28 29 7d 20  {SELECT $::a()} 
5760: 7b 31 20 24 3a 3a 61 28 29 7d 20 2d 31 0a 70 61  {1 $::a()} -1.pa
5770: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
5780: 78 70 72 2d 31 31 2e 35 2e 33 20 7b 53 45 4c 45  xpr-11.5.3 {SELE
5790: 43 54 20 24 3a 3a 31 28 3a 3a 23 24 29 7d 20 7b  CT $::1(::#$)} {
57a0: 31 20 24 3a 3a 31 28 3a 3a 23 24 29 7d 20 2d 31  1 $::1(::#$)} -1
57b0: 0a 20 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  . .# EVIDENCE-OF
57c0: 3a 20 52 2d 31 31 33 37 30 2d 30 34 35 32 30 20  : R-11370-04520 
57d0: 4e 61 6d 65 64 20 70 61 72 61 6d 65 74 65 72 73  Named parameters
57e0: 20 61 72 65 20 61 6c 73 6f 20 6e 75 6d 62 65 72   are also number
57f0: 65 64 2e 20 54 68 65 0a 23 20 6e 75 6d 62 65 72  ed. The.# number
5800: 20 61 73 73 69 67 6e 65 64 20 69 73 20 6f 6e 65   assigned is one
5810: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
5820: 65 20 6c 61 72 67 65 73 74 20 70 61 72 61 6d 65  e largest parame
5830: 74 65 72 20 6e 75 6d 62 65 72 0a 23 20 61 6c 72  ter number.# alr
5840: 65 61 64 79 20 61 73 73 69 67 6e 65 64 2e 0a 23  eady assigned..#
5850: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
5860: 52 2d 34 32 36 32 30 2d 32 32 31 38 34 20 49 66  R-42620-22184 If
5870: 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   this means the 
5880: 70 61 72 61 6d 65 74 65 72 20 77 6f 75 6c 64 20  parameter would 
5890: 62 65 0a 23 20 61 73 73 69 67 6e 65 64 20 61 20  be.# assigned a 
58a0: 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
58b0: 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  han SQLITE_MAX_V
58c0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20  ARIABLE_NUMBER, 
58d0: 69 74 20 69 73 20 61 6e 0a 23 20 65 72 72 6f 72  it is an.# error
58e0: 2e 0a 23 0a 70 61 72 61 6d 65 74 65 72 5f 74 65  ..#.parameter_te
58f0: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 36 2e 31  st e_expr-11.6.1
5900: 20 22 53 45 4c 45 43 54 20 3f 2c 20 40 61 62 63   "SELECT ?, @abc
5910: 22 20 20 20 20 7b 31 20 7b 7d 20 32 20 40 61 62  "    {1 {} 2 @ab
5920: 63 7d 20 7b 2d 31 20 2d 32 7d 0a 70 61 72 61 6d  c} {-1 -2}.param
5930: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
5940: 2d 31 31 2e 36 2e 32 20 22 53 45 4c 45 43 54 20  -11.6.2 "SELECT 
5950: 3f 31 32 33 2c 20 3a 61 31 22 20 20 7b 31 32 33  ?123, :a1"  {123
5960: 20 3f 31 32 33 20 31 32 34 20 3a 61 31 7d 20 7b   ?123 124 :a1} {
5970: 2d 31 32 33 20 2d 31 32 34 7d 0a 70 61 72 61 6d  -123 -124}.param
5980: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
5990: 2d 31 31 2e 36 2e 33 20 7b 53 45 4c 45 43 54 20  -11.6.3 {SELECT 
59a0: 24 61 2c 20 3f 38 2c 20 3f 2c 20 24 62 2c 20 3f  $a, ?8, ?, $b, ?
59b0: 32 2c 20 24 63 7d 20 7b 0a 20 20 31 20 24 61 20  2, $c} {.  1 $a 
59c0: 38 20 3f 38 20 39 20 7b 7d 20 31 30 20 24 62 20  8 ?8 9 {} 10 $b 
59d0: 32 20 3f 32 20 31 31 20 24 63 0a 7d 20 7b 2d 31  2 ?2 11 $c.} {-1
59e0: 20 2d 38 20 2d 39 20 2d 31 30 20 2d 32 20 2d 31   -8 -9 -10 -2 -1
59f0: 31 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  1}.foreach {tn s
5a00: 71 6c 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20  ql} [list       
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a20: 20 20 20 20 5c 0a 20 20 31 20 20 22 53 45 4c 45      \.  1  "SELE
5a30: 43 54 20 3f 24 6d 76 6e 2c 20 5c 24 3a 3a 61 22  CT ?$mvn, \$::a"
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 20 20 20 5c 0a 20 20 32 20 20 22 53         \.  2  "S
5a60: 45 4c 45 43 54 20 3f 24 6d 76 6e 2c 20 3f 34 2c  ELECT ?$mvn, ?4,
5a70: 20 40 61 31 22 20 20 20 20 20 20 20 20 20 20 20   @a1"           
5a80: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 33 20            \.  3 
5a90: 20 22 53 45 4c 45 43 54 20 3f 5b 65 78 70 72 20   "SELECT ?[expr 
5aa0: 24 6d 76 6e 2d 32 5d 2c 20 3a 62 61 67 2c 20 40  $mvn-2], :bag, @
5ab0: 31 32 33 2c 20 5c 24 78 22 20 20 20 20 5c 0a 5d  123, \$x"    \.]
5ac0: 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c   {.  do_catchsql
5ad0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5ae0: 37 2e 24 74 6e 20 24 73 71 6c 20 5b 6c 69 73 74  7.$tn $sql [list
5af0: 20 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 53 51 4c   1 {too many SQL
5b00: 20 76 61 72 69 61 62 6c 65 73 7d 5d 0a 7d 0a 0a   variables}].}..
5b10: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
5b20: 2d 31 34 30 36 38 2d 34 39 36 37 31 20 50 61 72  -14068-49671 Par
5b30: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 72 65  ameters that are
5b40: 20 6e 6f 74 20 61 73 73 69 67 6e 65 64 20 76 61   not assigned va
5b50: 6c 75 65 73 0a 23 20 75 73 69 6e 67 20 73 71 6c  lues.# using sql
5b60: 69 74 65 33 5f 62 69 6e 64 28 29 20 61 72 65 20  ite3_bind() are 
5b70: 74 72 65 61 74 65 64 20 61 73 20 4e 55 4c 4c 2e  treated as NULL.
5b80: 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70  .#.do_test e_exp
5b90: 72 2d 31 31 2e 37 2e 31 20 7b 0a 20 20 73 65 74  r-11.7.1 {.  set
5ba0: 20 73 74 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70   stmt [sqlite3_p
5bb0: 72 65 70 61 72 65 5f 76 32 20 64 62 20 7b 20 53  repare_v2 db { S
5bc0: 45 4c 45 43 54 20 3f 2c 20 3a 61 2c 20 40 62 2c  ELECT ?, :a, @b,
5bd0: 20 24 64 20 7d 20 2d 31 5d 0a 20 20 73 71 6c 69   $d } -1].  sqli
5be0: 74 65 33 5f 73 74 65 70 20 24 73 74 6d 74 0a 0a  te3_step $stmt..
5bf0: 20 20 6c 69 73 74 20 5b 73 71 6c 69 74 65 33 5f    list [sqlite3_
5c00: 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24 73 74 6d  column_type $stm
5c10: 74 20 30 5d 20 5c 0a 20 20 20 20 20 20 20 5b 73  t 0] \.       [s
5c20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
5c30: 70 65 20 24 73 74 6d 74 20 31 5d 20 5c 0a 20 20  pe $stmt 1] \.  
5c40: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 5f 63 6f       [sqlite3_co
5c50: 6c 75 6d 6e 5f 74 79 70 65 20 24 73 74 6d 74 20  lumn_type $stmt 
5c60: 32 5d 20 5c 0a 20 20 20 20 20 20 20 5b 73 71 6c  2] \.       [sql
5c70: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
5c80: 20 24 73 74 6d 74 20 33 5d 20 0a 7d 20 7b 4e 55   $stmt 3] .} {NU
5c90: 4c 4c 20 4e 55 4c 4c 20 4e 55 4c 4c 20 4e 55 4c  LL NULL NULL NUL
5ca0: 4c 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70  L}.do_test e_exp
5cb0: 72 2d 31 31 2e 37 2e 31 20 7b 20 73 71 6c 69 74  r-11.7.1 { sqlit
5cc0: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d  e3_finalize $stm
5cd0: 74 20 7d 20 53 51 4c 49 54 45 5f 4f 4b 0a 0a 23  t } SQLITE_OK..#
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 22 54 65 73  ---------.# "Tes
5d30: 74 22 20 74 68 65 20 73 79 6e 74 61 78 20 64 69  t" the syntax di
5d40: 61 67 72 61 6d 73 20 69 6e 20 6c 61 6e 67 5f 65  agrams in lang_e
5d50: 78 70 72 2e 68 74 6d 6c 2e 0a 23 0a 23 20 45 56  xpr.html..#.# EV
5d60: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 31  IDENCE-OF: R-041
5d70: 37 37 2d 32 30 36 38 38 20 2d 2d 20 73 79 6e 74  77-20688 -- synt
5d80: 61 78 20 64 69 61 67 72 61 6d 20 73 69 67 6e 65  ax diagram signe
5d90: 64 2d 6e 75 6d 62 65 72 0a 23 0a 64 6f 5f 65 78  d-number.#.do_ex
5da0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
5db0: 72 2d 31 32 2e 31 2e 31 20 7b 20 53 45 4c 45 43  r-12.1.1 { SELEC
5dc0: 54 20 30 2c 20 2b 30 2c 20 2d 30 20 7d 20 7b 30  T 0, +0, -0 } {0
5dd0: 20 30 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   0 0}.do_execsql
5de0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
5df0: 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 31 2c 20  1.2 { SELECT 1, 
5e00: 2b 31 2c 20 2d 31 20 7d 20 7b 31 20 31 20 2d 31  +1, -1 } {1 1 -1
5e10: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
5e20: 74 20 65 5f 65 78 70 72 2d 31 32 2e 31 2e 33 20  t e_expr-12.1.3 
5e30: 7b 20 53 45 4c 45 43 54 20 32 2c 20 2b 32 2c 20  { SELECT 2, +2, 
5e40: 2d 32 20 7d 20 7b 32 20 32 20 2d 32 7d 0a 64 6f  -2 } {2 2 -2}.do
5e50: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
5e60: 65 78 70 72 2d 31 32 2e 31 2e 34 20 7b 20 0a 20  expr-12.1.4 { . 
5e70: 20 53 45 4c 45 43 54 20 31 2e 34 2c 20 2b 31 2e   SELECT 1.4, +1.
5e80: 34 2c 20 2d 31 2e 34 20 0a 7d 20 7b 31 2e 34 20  4, -1.4 .} {1.4 
5e90: 31 2e 34 20 2d 31 2e 34 7d 0a 64 6f 5f 65 78 65  1.4 -1.4}.do_exe
5ea0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
5eb0: 2d 31 32 2e 31 2e 35 20 7b 20 0a 20 20 53 45 4c  -12.1.5 { .  SEL
5ec0: 45 43 54 20 31 2e 35 65 2b 35 2c 20 2b 31 2e 35  ECT 1.5e+5, +1.5
5ed0: 65 2b 35 2c 20 2d 31 2e 35 65 2b 35 20 0a 7d 20  e+5, -1.5e+5 .} 
5ee0: 7b 31 35 30 30 30 30 2e 30 20 31 35 30 30 30 30  {150000.0 150000
5ef0: 2e 30 20 2d 31 35 30 30 30 30 2e 30 7d 0a 64 6f  .0 -150000.0}.do
5f00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
5f10: 65 78 70 72 2d 31 32 2e 31 2e 36 20 7b 20 0a 20  expr-12.1.6 { . 
5f20: 20 53 45 4c 45 43 54 20 30 2e 30 30 30 31 2c 20   SELECT 0.0001, 
5f30: 2b 30 2e 30 30 30 31 2c 20 2d 30 2e 30 30 30 31  +0.0001, -0.0001
5f40: 20 0a 7d 20 7b 30 2e 30 30 30 31 20 30 2e 30 30   .} {0.0001 0.00
5f50: 30 31 20 2d 30 2e 30 30 30 31 7d 0a 0a 23 20 45  01 -0.0001}..# E
5f60: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30  VIDENCE-OF: R-30
5f70: 37 34 30 2d 32 36 37 32 33 20 2d 2d 20 73 79 6e  740-26723 -- syn
5f80: 74 61 78 20 64 69 61 67 72 61 6d 20 6c 69 74 65  tax diagram lite
5f90: 72 61 6c 2d 76 61 6c 75 65 0a 23 0a 73 65 74 20  ral-value.#.set 
5fa0: 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f 74  sqlite_current_t
5fb0: 69 6d 65 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  ime 1.do_execsql
5fc0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
5fd0: 32 2e 31 20 7b 53 45 4c 45 43 54 20 31 32 33 7d  2.1 {SELECT 123}
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
5ff0: 31 32 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  123}.do_execsql_
6000: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32  test e_expr-12.2
6010: 2e 32 20 7b 53 45 4c 45 43 54 20 31 32 33 2e 34  .2 {SELECT 123.4
6020: 65 30 35 7d 20 20 20 20 20 20 20 20 20 20 7b 31  e05}          {1
6030: 32 33 34 30 30 30 30 2e 30 7d 0a 64 6f 5f 65 78  2340000.0}.do_ex
6040: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
6050: 72 2d 31 32 2e 32 2e 33 20 7b 53 45 4c 45 43 54  r-12.2.3 {SELECT
6060: 20 27 61 62 63 64 65 27 7d 20 20 20 20 20 20 20   'abcde'}       
6070: 20 20 20 20 7b 61 62 63 64 65 7d 0a 64 6f 5f 65      {abcde}.do_e
6080: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
6090: 70 72 2d 31 32 2e 32 2e 34 20 7b 53 45 4c 45 43  pr-12.2.4 {SELEC
60a0: 54 20 58 27 34 31 34 32 34 33 27 7d 20 20 20 20  T X'414243'}    
60b0: 20 20 20 20 20 7b 41 42 43 7d 0a 64 6f 5f 65 78       {ABC}.do_ex
60c0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
60d0: 72 2d 31 32 2e 32 2e 35 20 7b 53 45 4c 45 43 54  r-12.2.5 {SELECT
60e0: 20 4e 55 4c 4c 7d 20 20 20 20 20 20 20 20 20 20   NULL}          
60f0: 20 20 20 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63      {{}}.do_exec
6100: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
6110: 31 32 2e 32 2e 36 20 7b 53 45 4c 45 43 54 20 43  12.2.6 {SELECT C
6120: 55 52 52 45 4e 54 5f 54 49 4d 45 7d 20 20 20 20  URRENT_TIME}    
6130: 20 20 7b 30 30 3a 30 30 3a 30 31 7d 0a 64 6f 5f    {00:00:01}.do_
6140: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
6150: 78 70 72 2d 31 32 2e 32 2e 37 20 7b 53 45 4c 45  xpr-12.2.7 {SELE
6160: 43 54 20 43 55 52 52 45 4e 54 5f 44 41 54 45 7d  CT CURRENT_DATE}
6170: 20 20 20 20 20 20 7b 31 39 37 30 2d 30 31 2d 30        {1970-01-0
6180: 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  1}.do_execsql_te
6190: 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 38  st e_expr-12.2.8
61a0: 20 7b 53 45 4c 45 43 54 20 43 55 52 52 45 4e 54   {SELECT CURRENT
61b0: 5f 54 49 4d 45 53 54 41 4d 50 7d 20 7b 7b 31 39  _TIMESTAMP} {{19
61c0: 37 30 2d 30 31 2d 30 31 20 30 30 3a 30 30 3a 30  70-01-01 00:00:0
61d0: 31 7d 7d 0a 73 65 74 20 73 71 6c 69 74 65 5f 63  1}}.set sqlite_c
61e0: 75 72 72 65 6e 74 5f 74 69 6d 65 20 30 0a 0a 23  urrent_time 0..#
61f0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
6200: 35 37 35 39 38 2d 35 39 33 33 32 20 2d 2d 20 73  57598-59332 -- s
6210: 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20 65 78  yntax diagram ex
6220: 70 72 0a 23 0a 66 69 6c 65 20 64 65 6c 65 74 65  pr.#.file delete
6230: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 32   -force test.db2
6240: 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 41 54 54  .execsql {.  ATT
6250: 41 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41  ACH 'test.db2' A
6260: 53 20 64 62 6e 61 6d 65 3b 0a 20 20 43 52 45 41  S dbname;.  CREA
6270: 54 45 20 54 41 42 4c 45 20 64 62 6e 61 6d 65 2e  TE TABLE dbname.
6280: 74 62 6c 6e 61 6d 65 28 63 6e 61 6d 65 29 3b 0a  tblname(cname);.
6290: 7d 0a 0a 70 72 6f 63 20 67 6c 6f 62 20 7b 61 72  }..proc glob {ar
62a0: 67 73 7d 20 7b 72 65 74 75 72 6e 20 31 7d 0a 64  gs} {return 1}.d
62b0: 62 20 66 75 6e 63 74 69 6f 6e 20 67 6c 6f 62 20  b function glob 
62c0: 67 6c 6f 62 0a 64 62 20 66 75 6e 63 74 69 6f 6e  glob.db function
62d0: 20 6d 61 74 63 68 20 67 6c 6f 62 0a 64 62 20 66   match glob.db f
62e0: 75 6e 63 74 69 6f 6e 20 72 65 67 65 78 70 20 67  unction regexp g
62f0: 6c 6f 62 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e  lob..foreach {tn
6300: 20 65 78 70 72 7d 20 7b 0a 20 20 31 20 31 32 33   expr} {.  1 123
6310: 0a 20 20 32 20 31 32 33 2e 34 65 30 35 0a 20 20  .  2 123.4e05.  
6320: 33 20 27 61 62 63 64 65 27 0a 20 20 34 20 58 27  3 'abcde'.  4 X'
6330: 34 31 34 32 34 33 27 0a 20 20 35 20 4e 55 4c 4c  414243'.  5 NULL
6340: 0a 20 20 36 20 43 55 52 52 45 4e 54 5f 54 49 4d  .  6 CURRENT_TIM
6350: 45 0a 20 20 37 20 43 55 52 52 45 4e 54 5f 44 41  E.  7 CURRENT_DA
6360: 54 45 0a 20 20 38 20 43 55 52 52 45 4e 54 5f 54  TE.  8 CURRENT_T
6370: 49 4d 45 53 54 41 4d 50 0a 0a 20 20 39 20 3f 0a  IMESTAMP..  9 ?.
6380: 20 31 30 20 3f 31 32 33 0a 20 31 31 20 40 68 65   10 ?123. 11 @he
6390: 6c 6c 6f 0a 20 31 32 20 3a 77 6f 72 6c 64 0a 20  llo. 12 :world. 
63a0: 31 33 20 24 74 63 6c 0a 20 31 34 20 24 74 63 6c  13 $tcl. 14 $tcl
63b0: 28 61 72 72 61 79 29 0a 20 20 0a 20 20 31 35 20  (array).  .  15 
63c0: 63 6e 61 6d 65 0a 20 20 31 36 20 74 62 6c 6e 61  cname.  16 tblna
63d0: 6d 65 2e 63 6e 61 6d 65 0a 20 20 31 37 20 64 62  me.cname.  17 db
63e0: 6e 61 6d 65 2e 74 62 6c 6e 61 6d 65 2e 63 6e 61  name.tblname.cna
63f0: 6d 65 0a 0a 20 20 31 38 20 22 2b 20 45 58 50 52  me..  18 "+ EXPR
6400: 22 0a 20 20 31 39 20 22 2d 20 45 58 50 52 22 0a  ".  19 "- EXPR".
6410: 20 20 32 30 20 22 4e 4f 54 20 45 58 50 52 22 0a    20 "NOT EXPR".
6420: 20 20 32 31 20 22 7e 20 45 58 50 52 22 0a 0a 20    21 "~ EXPR".. 
6430: 20 32 32 20 22 45 58 50 52 31 20 7c 7c 20 45 58   22 "EXPR1 || EX
6440: 50 52 32 22 0a 20 20 32 33 20 22 45 58 50 52 31  PR2".  23 "EXPR1
6450: 20 2a 20 45 58 50 52 32 22 0a 20 20 32 34 20 22   * EXPR2".  24 "
6460: 45 58 50 52 31 20 2f 20 45 58 50 52 32 22 0a 20  EXPR1 / EXPR2". 
6470: 20 32 35 20 22 45 58 50 52 31 20 25 20 45 58 50   25 "EXPR1 % EXP
6480: 52 32 22 0a 20 20 32 36 20 22 45 58 50 52 31 20  R2".  26 "EXPR1 
6490: 2b 20 45 58 50 52 32 22 0a 20 20 32 37 20 22 45  + EXPR2".  27 "E
64a0: 58 50 52 31 20 2d 20 45 58 50 52 32 22 0a 20 20  XPR1 - EXPR2".  
64b0: 32 38 20 22 45 58 50 52 31 20 3c 3c 20 45 58 50  28 "EXPR1 << EXP
64c0: 52 32 22 0a 20 20 32 39 20 22 45 58 50 52 31 20  R2".  29 "EXPR1 
64d0: 3e 3e 20 45 58 50 52 32 22 0a 20 20 33 30 20 22  >> EXPR2".  30 "
64e0: 45 58 50 52 31 20 26 20 45 58 50 52 32 22 0a 20  EXPR1 & EXPR2". 
64f0: 20 33 31 20 22 45 58 50 52 31 20 7c 20 45 58 50   31 "EXPR1 | EXP
6500: 52 32 22 0a 20 20 33 32 20 22 45 58 50 52 31 20  R2".  32 "EXPR1 
6510: 3c 20 45 58 50 52 32 22 0a 20 20 33 33 20 22 45  < EXPR2".  33 "E
6520: 58 50 52 31 20 3c 3d 20 45 58 50 52 32 22 0a 20  XPR1 <= EXPR2". 
6530: 20 33 34 20 22 45 58 50 52 31 20 3e 20 45 58 50   34 "EXPR1 > EXP
6540: 52 32 22 0a 20 20 33 35 20 22 45 58 50 52 31 20  R2".  35 "EXPR1 
6550: 3e 3d 20 45 58 50 52 32 22 0a 20 20 33 36 20 22  >= EXPR2".  36 "
6560: 45 58 50 52 31 20 3d 20 45 58 50 52 32 22 0a 20  EXPR1 = EXPR2". 
6570: 20 33 37 20 22 45 58 50 52 31 20 3d 3d 20 45 58   37 "EXPR1 == EX
6580: 50 52 32 22 0a 20 20 33 38 20 22 45 58 50 52 31  PR2".  38 "EXPR1
6590: 20 21 3d 20 45 58 50 52 32 22 0a 20 20 33 39 20   != EXPR2".  39 
65a0: 22 45 58 50 52 31 20 3c 3e 20 45 58 50 52 32 22  "EXPR1 <> EXPR2"
65b0: 0a 20 20 34 30 20 22 45 58 50 52 31 20 49 53 20  .  40 "EXPR1 IS 
65c0: 45 58 50 52 32 22 0a 20 20 34 31 20 22 45 58 50  EXPR2".  41 "EXP
65d0: 52 31 20 49 53 20 4e 4f 54 20 45 58 50 52 32 22  R1 IS NOT EXPR2"
65e0: 0a 20 20 34 32 20 22 45 58 50 52 31 20 41 4e 44  .  42 "EXPR1 AND
65f0: 20 45 58 50 52 32 22 0a 20 20 34 33 20 22 45 58   EXPR2".  43 "EX
6600: 50 52 31 20 4f 52 20 45 58 50 52 32 22 0a 20 0a  PR1 OR EXPR2". .
6610: 20 20 34 34 20 22 63 6f 75 6e 74 28 2a 29 22 0a    44 "count(*)".
6620: 20 20 34 35 20 22 63 6f 75 6e 74 28 44 49 53 54    45 "count(DIST
6630: 49 4e 43 54 20 45 58 50 52 29 22 0a 20 20 34 36  INCT EXPR)".  46
6640: 20 22 73 75 62 73 74 72 28 45 58 50 52 2c 20 31   "substr(EXPR, 1
6650: 30 2c 20 32 30 29 22 0a 20 20 34 37 20 22 63 68  0, 20)".  47 "ch
6660: 61 6e 67 65 73 28 29 22 0a 20 0a 20 20 34 38 20  anges()". .  48 
6670: 22 28 20 45 58 50 52 20 29 22 0a 20 0a 20 20 34  "( EXPR )". .  4
6680: 39 20 22 43 41 53 54 20 28 20 45 58 50 52 20 41  9 "CAST ( EXPR A
6690: 53 20 69 6e 74 65 67 65 72 20 29 22 0a 20 20 35  S integer )".  5
66a0: 30 20 22 43 41 53 54 20 28 20 45 58 50 52 20 41  0 "CAST ( EXPR A
66b0: 53 20 27 61 62 63 64 27 20 29 22 0a 20 20 35 31  S 'abcd' )".  51
66c0: 20 22 43 41 53 54 20 28 20 45 58 50 52 20 41 53   "CAST ( EXPR AS
66d0: 20 27 61 62 24 20 24 63 64 27 20 29 22 0a 20 0a   'ab$ $cd' )". .
66e0: 20 20 35 32 20 22 45 58 50 52 20 43 4f 4c 4c 41    52 "EXPR COLLA
66f0: 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 35 33 20  TE nocase".  53 
6700: 22 45 58 50 52 20 43 4f 4c 4c 41 54 45 20 62 69  "EXPR COLLATE bi
6710: 6e 61 72 79 22 0a 20 0a 20 20 35 34 20 22 45 58  nary". .  54 "EX
6720: 50 52 31 20 4c 49 4b 45 20 45 58 50 52 32 22 0a  PR1 LIKE EXPR2".
6730: 20 20 35 35 20 22 45 58 50 52 31 20 4c 49 4b 45    55 "EXPR1 LIKE
6740: 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58   EXPR2 ESCAPE EX
6750: 50 52 22 0a 20 20 35 36 20 22 45 58 50 52 31 20  PR".  56 "EXPR1 
6760: 47 4c 4f 42 20 45 58 50 52 32 22 0a 20 20 35 37  GLOB EXPR2".  57
6770: 20 22 45 58 50 52 31 20 47 4c 4f 42 20 45 58 50   "EXPR1 GLOB EXP
6780: 52 32 20 45 53 43 41 50 45 20 45 58 50 52 22 0a  R2 ESCAPE EXPR".
6790: 20 20 35 38 20 22 45 58 50 52 31 20 52 45 47 45    58 "EXPR1 REGE
67a0: 58 50 20 45 58 50 52 32 22 0a 20 20 35 39 20 22  XP EXPR2".  59 "
67b0: 45 58 50 52 31 20 52 45 47 45 58 50 20 45 58 50  EXPR1 REGEXP EXP
67c0: 52 32 20 45 53 43 41 50 45 20 45 58 50 52 22 0a  R2 ESCAPE EXPR".
67d0: 20 20 36 30 20 22 45 58 50 52 31 20 4d 41 54 43    60 "EXPR1 MATC
67e0: 48 20 45 58 50 52 32 22 0a 20 20 36 31 20 22 45  H EXPR2".  61 "E
67f0: 58 50 52 31 20 4d 41 54 43 48 20 45 58 50 52 32  XPR1 MATCH EXPR2
6800: 20 45 53 43 41 50 45 20 45 58 50 52 22 0a 20 20   ESCAPE EXPR".  
6810: 36 32 20 22 45 58 50 52 31 20 4e 4f 54 20 4c 49  62 "EXPR1 NOT LI
6820: 4b 45 20 45 58 50 52 32 22 0a 20 20 36 33 20 22  KE EXPR2".  63 "
6830: 45 58 50 52 31 20 4e 4f 54 20 4c 49 4b 45 20 45  EXPR1 NOT LIKE E
6840: 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50 52  XPR2 ESCAPE EXPR
6850: 22 0a 20 20 36 34 20 22 45 58 50 52 31 20 4e 4f  ".  64 "EXPR1 NO
6860: 54 20 47 4c 4f 42 20 45 58 50 52 32 22 0a 20 20  T GLOB EXPR2".  
6870: 36 35 20 22 45 58 50 52 31 20 4e 4f 54 20 47 4c  65 "EXPR1 NOT GL
6880: 4f 42 20 45 58 50 52 32 20 45 53 43 41 50 45 20  OB EXPR2 ESCAPE 
6890: 45 58 50 52 22 0a 20 20 36 36 20 22 45 58 50 52  EXPR".  66 "EXPR
68a0: 31 20 4e 4f 54 20 52 45 47 45 58 50 20 45 58 50  1 NOT REGEXP EXP
68b0: 52 32 22 0a 20 20 36 37 20 22 45 58 50 52 31 20  R2".  67 "EXPR1 
68c0: 4e 4f 54 20 52 45 47 45 58 50 20 45 58 50 52 32  NOT REGEXP EXPR2
68d0: 20 45 53 43 41 50 45 20 45 58 50 52 22 0a 20 20   ESCAPE EXPR".  
68e0: 36 38 20 22 45 58 50 52 31 20 4e 4f 54 20 4d 41  68 "EXPR1 NOT MA
68f0: 54 43 48 20 45 58 50 52 32 22 0a 20 20 36 39 20  TCH EXPR2".  69 
6900: 22 45 58 50 52 31 20 4e 4f 54 20 4d 41 54 43 48  "EXPR1 NOT MATCH
6910: 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58   EXPR2 ESCAPE EX
6920: 50 52 22 0a 20 0a 20 20 37 30 20 22 45 58 50 52  PR". .  70 "EXPR
6930: 20 49 53 4e 55 4c 4c 22 0a 20 20 37 31 20 22 45   ISNULL".  71 "E
6940: 58 50 52 20 4e 4f 54 4e 55 4c 4c 22 0a 20 20 37  XPR NOTNULL".  7
6950: 32 20 22 45 58 50 52 20 4e 4f 54 20 4e 55 4c 4c  2 "EXPR NOT NULL
6960: 22 0a 20 0a 20 20 37 33 20 22 45 58 50 52 31 20  ". .  73 "EXPR1 
6970: 49 53 20 45 58 50 52 32 22 0a 20 20 37 34 20 22  IS EXPR2".  74 "
6980: 45 58 50 52 31 20 49 53 20 4e 4f 54 20 45 58 50  EXPR1 IS NOT EXP
6990: 52 32 22 0a 0a 20 20 37 35 20 22 45 58 50 52 20  R2"..  75 "EXPR 
69a0: 4e 4f 54 20 42 45 54 57 45 45 4e 20 45 58 50 52  NOT BETWEEN EXPR
69b0: 31 20 41 4e 44 20 45 58 50 52 32 22 0a 20 20 37  1 AND EXPR2".  7
69c0: 36 20 22 45 58 50 52 20 42 45 54 57 45 45 4e 20  6 "EXPR BETWEEN 
69d0: 45 58 50 52 31 20 41 4e 44 20 45 58 50 52 32 22  EXPR1 AND EXPR2"
69e0: 0a 0a 20 20 37 37 20 22 45 58 50 52 20 4e 4f 54  ..  77 "EXPR NOT
69f0: 20 49 4e 20 28 53 45 4c 45 43 54 20 63 6e 61 6d   IN (SELECT cnam
6a00: 65 20 46 52 4f 4d 20 74 62 6c 6e 61 6d 65 29 22  e FROM tblname)"
6a10: 0a 20 20 37 38 20 22 45 58 50 52 20 4e 4f 54 20  .  78 "EXPR NOT 
6a20: 49 4e 20 28 31 29 22 0a 20 20 37 39 20 22 45 58  IN (1)".  79 "EX
6a30: 50 52 20 4e 4f 54 20 49 4e 20 28 31 2c 20 32 2c  PR NOT IN (1, 2,
6a40: 20 33 29 22 0a 20 20 38 30 20 22 45 58 50 52 20   3)".  80 "EXPR 
6a50: 4e 4f 54 20 49 4e 20 74 62 6c 6e 61 6d 65 22 0a  NOT IN tblname".
6a60: 20 20 38 31 20 22 45 58 50 52 20 4e 4f 54 20 49    81 "EXPR NOT I
6a70: 4e 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61 6d 65  N dbname.tblname
6a80: 22 0a 20 20 38 32 20 22 45 58 50 52 20 49 4e 20  ".  82 "EXPR IN 
6a90: 28 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46 52  (SELECT cname FR
6aa0: 4f 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 20 20 38  OM tblname)".  8
6ab0: 33 20 22 45 58 50 52 20 49 4e 20 28 31 29 22 0a  3 "EXPR IN (1)".
6ac0: 20 20 38 34 20 22 45 58 50 52 20 49 4e 20 28 31    84 "EXPR IN (1
6ad0: 2c 20 32 2c 20 33 29 22 0a 20 20 38 35 20 22 45  , 2, 3)".  85 "E
6ae0: 58 50 52 20 49 4e 20 74 62 6c 6e 61 6d 65 22 0a  XPR IN tblname".
6af0: 20 20 38 36 20 22 45 58 50 52 20 49 4e 20 64 62    86 "EXPR IN db
6b00: 6e 61 6d 65 2e 74 62 6c 6e 61 6d 65 22 0a 0a 20  name.tblname".. 
6b10: 20 38 37 20 22 45 58 49 53 54 53 20 28 53 45 4c   87 "EXISTS (SEL
6b20: 45 43 54 20 63 6e 61 6d 65 20 46 52 4f 4d 20 74  ECT cname FROM t
6b30: 62 6c 6e 61 6d 65 29 22 0a 20 20 38 38 20 22 4e  blname)".  88 "N
6b40: 4f 54 20 45 58 49 53 54 53 20 28 53 45 4c 45 43  OT EXISTS (SELEC
6b50: 54 20 63 6e 61 6d 65 20 46 52 4f 4d 20 74 62 6c  T cname FROM tbl
6b60: 6e 61 6d 65 29 22 0a 0a 20 20 38 39 20 22 43 41  name)"..  89 "CA
6b70: 53 45 20 45 58 50 52 20 57 48 45 4e 20 45 58 50  SE EXPR WHEN EXP
6b80: 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 45 4c  R1 THEN EXPR2 EL
6b90: 53 45 20 45 58 50 52 20 45 4e 44 22 0a 20 20 39  SE EXPR END".  9
6ba0: 30 20 22 43 41 53 45 20 45 58 50 52 20 57 48 45  0 "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 45 4e 44 22 0a 20 20 39 31 20 22 43 41  R2 END".  91 "CA
6bd0: 53 45 20 45 58 50 52 20 57 48 45 4e 20 45 58 50  SE EXPR WHEN EXP
6be0: 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 57 48  R1 THEN EXPR2 WH
6bf0: 45 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58 50  EN EXPR THEN EXP
6c00: 52 31 20 45 4c 53 45 20 45 58 50 52 32 20 45 4e  R1 ELSE EXPR2 EN
6c10: 44 22 0a 20 20 39 32 20 22 43 41 53 45 20 45 58  D".  92 "CASE EX
6c20: 50 52 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  PR WHEN EXPR1 TH
6c30: 45 4e 20 45 58 50 52 32 20 57 48 45 4e 20 45 58  EN EXPR2 WHEN EX
6c40: 50 52 20 54 48 45 4e 20 45 58 50 52 31 20 45 4e  PR THEN EXPR1 EN
6c50: 44 22 0a 20 20 39 33 20 22 43 41 53 45 20 57 48  D".  93 "CASE WH
6c60: 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58  EN EXPR1 THEN EX
6c70: 50 52 32 20 45 4c 53 45 20 45 58 50 52 20 45 4e  PR2 ELSE EXPR EN
6c80: 44 22 0a 20 20 39 34 20 22 43 41 53 45 20 57 48  D".  94 "CASE WH
6c90: 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58  EN EXPR1 THEN EX
6ca0: 50 52 32 20 45 4e 44 22 0a 20 20 39 35 20 22 43  PR2 END".  95 "C
6cb0: 41 53 45 20 57 48 45 4e 20 45 58 50 52 31 20 54  ASE WHEN EXPR1 T
6cc0: 48 45 4e 20 45 58 50 52 32 20 57 48 45 4e 20 45  HEN EXPR2 WHEN E
6cd0: 58 50 52 20 54 48 45 4e 20 45 58 50 52 31 20 45  XPR THEN EXPR1 E
6ce0: 4c 53 45 20 45 58 50 52 32 20 45 4e 44 22 0a 20  LSE EXPR2 END". 
6cf0: 20 39 36 20 22 43 41 53 45 20 57 48 45 4e 20 45   96 "CASE WHEN E
6d00: 58 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20  XPR1 THEN EXPR2 
6d10: 57 48 45 4e 20 45 58 50 52 20 54 48 45 4e 20 45  WHEN EXPR THEN E
6d20: 58 50 52 31 20 45 4e 44 22 0a 7d 20 7b 0a 0a 20  XPR1 END".} {.. 
6d30: 20 23 20 49 66 20 74 68 65 20 65 78 70 72 65 73   # If the expres
6d40: 73 69 6f 6e 20 73 74 72 69 6e 67 20 62 65 69 6e  sion string bein
6d50: 67 20 70 61 72 73 65 64 20 63 6f 6e 74 61 69 6e  g parsed contain
6d60: 73 20 22 45 58 50 52 32 22 2c 20 74 68 65 6e 20  s "EXPR2", then 
6d70: 72 65 70 6c 61 63 65 0a 20 20 23 20 73 74 72 69  replace.  # stri
6d80: 6e 67 20 22 45 58 50 52 31 22 20 61 6e 64 20 22  ng "EXPR1" and "
6d90: 45 58 50 52 32 22 20 77 69 74 68 20 61 72 62 69  EXPR2" with arbi
6da0: 74 72 61 72 79 20 53 51 4c 20 65 78 70 72 65 73  trary SQL expres
6db0: 73 69 6f 6e 73 2e 20 49 66 20 69 74 20 0a 20 20  sions. If it .  
6dc0: 23 20 63 6f 6e 74 61 69 6e 73 20 22 45 58 50 52  # contains "EXPR
6dd0: 22 2c 20 74 68 65 6e 20 72 65 70 6c 61 63 65 20  ", then replace 
6de0: 45 58 50 52 20 77 69 74 68 20 61 6e 20 61 72 62  EXPR with an arb
6df0: 69 74 72 61 72 79 20 53 51 4c 20 65 78 70 72 65  itrary SQL expre
6e00: 73 73 69 6f 6e 2e 0a 20 20 23 20 0a 20 20 73 65  ssion..  # .  se
6e10: 74 20 65 6c 69 73 74 20 5b 6c 69 73 74 20 24 65  t elist [list $e
6e20: 78 70 72 5d 0a 20 20 69 66 20 7b 5b 73 74 72 69  xpr].  if {[stri
6e30: 6e 67 20 6d 61 74 63 68 20 2a 45 58 50 52 32 2a  ng match *EXPR2*
6e40: 20 24 65 78 70 72 5d 7d 20 7b 0a 20 20 20 20 73   $expr]} {.    s
6e50: 65 74 20 65 6c 69 73 74 20 5b 6c 69 73 74 5d 0a  et elist [list].
6e60: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 65 31 20      foreach {e1 
6e70: 65 32 7d 20 7b 20 63 6e 61 6d 65 20 22 33 34 2b  e2} { cname "34+
6e80: 32 32 22 20 7d 20 7b 0a 20 20 20 20 20 20 6c 61  22" } {.      la
6e90: 70 70 65 6e 64 20 65 6c 69 73 74 20 5b 73 74 72  ppend elist [str
6ea0: 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 45 58  ing map [list EX
6eb0: 50 52 31 20 24 65 31 20 45 58 50 52 32 20 24 65  PR1 $e1 EXPR2 $e
6ec0: 32 5d 20 24 65 78 70 72 5d 0a 20 20 20 20 7d 0a  2] $expr].    }.
6ed0: 20 20 7d 20 0a 20 20 69 66 20 7b 5b 73 74 72 69    } .  if {[stri
6ee0: 6e 67 20 6d 61 74 63 68 20 2a 45 58 50 52 2a 20  ng match *EXPR* 
6ef0: 24 65 78 70 72 5d 7d 20 7b 0a 20 20 20 20 73 65  $expr]} {.    se
6f00: 74 20 65 6c 69 73 74 32 20 5b 6c 69 73 74 5d 0a  t elist2 [list].
6f10: 20 20 20 20 66 6f 72 65 61 63 68 20 65 6c 20 24      foreach el $
6f20: 65 6c 69 73 74 20 7b 0a 20 20 20 20 20 20 66 6f  elist {.      fo
6f30: 72 65 61 63 68 20 65 20 7b 20 63 6e 61 6d 65 20  reach e { cname 
6f40: 22 33 34 2b 32 32 22 20 7d 20 7b 0a 20 20 20 20  "34+22" } {.    
6f50: 20 20 20 20 6c 61 70 70 65 6e 64 20 65 6c 69 73      lappend elis
6f60: 74 32 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  t2 [string map [
6f70: 6c 69 73 74 20 45 58 50 52 20 24 65 5d 20 24 65  list EXPR $e] $e
6f80: 6c 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l].      }.    }
6f90: 0a 20 20 20 20 73 65 74 20 65 6c 69 73 74 20 24  .    set elist $
6fa0: 65 6c 69 73 74 32 0a 20 20 7d 0a 0a 20 20 73 65  elist2.  }..  se
6fb0: 74 20 78 20 30 0a 20 20 66 6f 72 65 61 63 68 20  t x 0.  foreach 
6fc0: 65 20 24 65 6c 69 73 74 20 7b 0a 20 20 20 20 69  e $elist {.    i
6fd0: 6e 63 72 20 78 0a 20 20 20 20 64 6f 5f 74 65 73  ncr x.    do_tes
6fe0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 33 2e 24 74  t e_expr-12.3.$t
6ff0: 6e 2e 24 78 20 7b 20 0a 20 20 20 20 20 20 73 65  n.$x { .      se
7000: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20 65 78  t rc [catch { ex
7010: 65 63 73 71 6c 20 22 53 45 4c 45 43 54 20 24 65  ecsql "SELECT $e
7020: 20 46 52 4f 4d 20 74 62 6c 6e 61 6d 65 22 20 7d   FROM tblname" }
7030: 20 6d 73 67 5d 0a 20 20 20 20 7d 20 7b 30 7d 0a   msg].    } {0}.
7040: 20 20 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43    }.}..# EVIDENC
7050: 45 2d 4f 46 3a 20 52 2d 34 39 34 36 32 2d 35 36  E-OF: R-49462-56
7060: 30 37 39 20 2d 2d 20 73 79 6e 74 61 78 20 64 69  079 -- syntax di
7070: 61 67 72 61 6d 20 72 61 69 73 65 2d 66 75 6e 63  agram raise-func
7080: 74 69 6f 6e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  tion.#.foreach {
7090: 74 6e 20 72 61 69 73 65 65 78 70 72 7d 20 7b 0a  tn raiseexpr} {.
70a0: 20 20 31 20 22 52 41 49 53 45 28 49 47 4e 4f 52    1 "RAISE(IGNOR
70b0: 45 29 22 0a 20 20 32 20 22 52 41 49 53 45 28 52  E)".  2 "RAISE(R
70c0: 4f 4c 4c 42 41 43 4b 2c 20 27 65 72 72 6f 72 20  OLLBACK, 'error 
70d0: 6d 65 73 73 61 67 65 27 29 22 0a 20 20 33 20 22  message')".  3 "
70e0: 52 41 49 53 45 28 41 42 4f 52 54 2c 20 27 65 72  RAISE(ABORT, 'er
70f0: 72 6f 72 20 6d 65 73 73 61 67 65 27 29 22 0a 20  ror message')". 
7100: 20 34 20 22 52 41 49 53 45 28 46 41 49 4c 2c 20   4 "RAISE(FAIL, 
7110: 27 65 72 72 6f 72 20 6d 65 73 73 61 67 65 27 29  'error message')
7120: 22 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73  ".} {.  do_execs
7130: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7140: 32 2e 34 2e 24 74 6e 20 22 0a 20 20 20 20 43 52  2.4.$tn ".    CR
7150: 45 41 54 45 20 54 52 49 47 47 45 52 20 64 62 6e  EATE TRIGGER dbn
7160: 61 6d 65 2e 74 72 24 74 6e 20 42 45 46 4f 52 45  ame.tr$tn BEFORE
7170: 20 44 45 4c 45 54 45 20 4f 4e 20 74 62 6c 6e 61   DELETE ON tblna
7180: 6d 65 20 42 45 47 49 4e 0a 20 20 20 20 20 20 53  me BEGIN.      S
7190: 45 4c 45 43 54 20 24 72 61 69 73 65 65 78 70 72  ELECT $raiseexpr
71a0: 20 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 22 20   ;.    END;.  " 
71b0: 7b 7d 0a 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7200: 0a 23 20 54 65 73 74 20 74 68 65 20 73 74 61 74  .# Test the stat
7210: 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74  ements related t
7220: 6f 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  o the BETWEEN op
7230: 65 72 61 74 6f 72 2e 0a 23 0a 23 20 45 56 49 44  erator..#.# EVID
7240: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 30 30 37 39  ENCE-OF: R-40079
7250: 2d 35 34 35 30 33 20 54 68 65 20 42 45 54 57 45  -54503 The BETWE
7260: 45 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6c  EN operator is l
7270: 6f 67 69 63 61 6c 6c 79 0a 23 20 65 71 75 69 76  ogically.# equiv
7280: 61 6c 65 6e 74 20 74 6f 20 61 20 70 61 69 72 20  alent to a pair 
7290: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 20  of comparisons. 
72a0: 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44  "x BETWEEN y AND
72b0: 20 7a 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   z" is equivalen
72c0: 74 0a 23 20 74 6f 20 22 78 3e 3d 79 20 41 4e 44  t.# to "x>=y AND
72d0: 20 78 3c 3d 7a 22 20 65 78 63 65 70 74 20 74 68   x<=z" except th
72e0: 61 74 20 77 69 74 68 20 42 45 54 57 45 45 4e 2c  at with BETWEEN,
72f0: 20 74 68 65 20 78 20 65 78 70 72 65 73 73 69 6f   the x expressio
7300: 6e 20 69 73 0a 23 20 6f 6e 6c 79 20 65 76 61 6c  n is.# only eval
7310: 75 61 74 65 64 20 6f 6e 63 65 2e 0a 23 0a 64 62  uated once..#.db
7320: 20 66 75 6e 63 20 78 20 78 0a 70 72 6f 63 20 78   func x x.proc x
7330: 20 7b 7d 20 7b 20 69 6e 63 72 20 3a 3a 78 63 6f   {} { incr ::xco
7340: 75 6e 74 20 3b 20 72 65 74 75 72 6e 20 5b 65 78  unt ; return [ex
7350: 70 72 20 24 3a 3a 78 5d 20 7d 0a 66 6f 72 65 61  pr $::x] }.forea
7360: 63 68 20 7b 74 6e 20 78 20 65 78 70 72 20 72 65  ch {tn x expr re
7370: 73 20 6e 45 76 61 6c 7d 20 7b 0a 20 20 31 20 20  s nEval} {.  1  
7380: 31 30 20 20 22 78 28 29 20 3e 3d 20 35 20 41 4e  10  "x() >= 5 AN
7390: 44 20 78 28 29 20 3c 3d 20 31 35 22 20 20 31 20  D x() <= 15"  1 
73a0: 20 32 0a 20 20 32 20 20 31 30 20 20 22 78 28 29   2.  2  10  "x()
73b0: 20 42 45 54 57 45 45 4e 20 35 20 41 4e 44 20 31   BETWEEN 5 AND 1
73c0: 35 22 20 20 20 20 31 20 20 31 0a 0a 20 20 33 20  5"    1  1..  3 
73d0: 20 20 35 20 20 22 78 28 29 20 3e 3d 20 35 20 41    5  "x() >= 5 A
73e0: 4e 44 20 78 28 29 20 3c 3d 20 35 22 20 20 20 31  ND x() <= 5"   1
73f0: 20 20 32 0a 20 20 34 20 20 20 35 20 20 22 78 28    2.  4   5  "x(
7400: 29 20 42 45 54 57 45 45 4e 20 35 20 41 4e 44 20  ) BETWEEN 5 AND 
7410: 35 22 20 20 20 20 20 31 20 20 31 0a 7d 20 7b 0a  5"     1  1.} {.
7420: 20 20 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72    do_test e_expr
7430: 2d 31 33 2e 31 2e 24 74 6e 20 7b 0a 20 20 20 20  -13.1.$tn {.    
7440: 73 65 74 20 3a 3a 78 63 6f 75 6e 74 20 30 0a 20  set ::xcount 0. 
7450: 20 20 20 73 65 74 20 61 20 5b 65 78 65 63 73 71     set a [execsq
7460: 6c 20 22 53 45 4c 45 43 54 20 24 65 78 70 72 22  l "SELECT $expr"
7470: 5d 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a 78 63  ].    list $::xc
7480: 6f 75 6e 74 20 24 61 0a 20 20 7d 20 5b 6c 69 73  ount $a.  } [lis
7490: 74 20 24 6e 45 76 61 6c 20 24 72 65 73 5d 0a 7d  t $nEval $res].}
74a0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
74b0: 20 52 2d 30 35 31 35 35 2d 33 34 34 35 34 20 54   R-05155-34454 T
74c0: 68 65 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66  he precedence of
74d0: 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65   the BETWEEN ope
74e0: 72 61 74 6f 72 20 69 73 0a 23 20 74 68 65 20 73  rator is.# the s
74f0: 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 63 65  ame as the prece
7500: 64 65 6e 63 65 20 61 73 20 6f 70 65 72 61 74 6f  dence as operato
7510: 72 73 20 3d 3d 20 61 6e 64 20 21 3d 20 61 6e 64  rs == and != and
7520: 20 4c 49 4b 45 20 61 6e 64 20 67 72 6f 75 70 73   LIKE and groups
7530: 0a 23 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  .# left to right
7540: 2e 0a 23 20 0a 23 20 54 68 65 72 65 66 6f 72 65  ..# .# Therefore
7550: 2c 20 42 45 54 57 45 45 4e 20 67 72 6f 75 70 73  , BETWEEN groups
7560: 20 6d 6f 72 65 20 74 69 67 68 74 6c 79 20 74 68   more tightly th
7570: 61 6e 20 6f 70 65 72 61 74 6f 72 20 22 41 4e 44  an operator "AND
7580: 22 2c 20 62 75 74 20 6c 65 73 73 0a 23 20 73 6f  ", but less.# so
7590: 20 74 68 61 6e 20 22 3c 22 2e 0a 23 0a 64 6f 5f   than "<"..#.do_
75a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
75b0: 78 70 72 2d 31 33 2e 32 2e 31 20 20 7b 20 53 45  xpr-13.2.1  { SE
75c0: 4c 45 43 54 20 31 20 3d 3d 20 31 30 20 42 45 54  LECT 1 == 10 BET
75d0: 57 45 45 4e 20 30 20 41 4e 44 20 32 20 20 20 7d  WEEN 0 AND 2   }
75e0: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
75f0: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
7600: 32 20 20 7b 20 53 45 4c 45 43 54 20 28 31 20 3d  2  { SELECT (1 =
7610: 3d 20 31 30 29 20 42 45 54 57 45 45 4e 20 30 20  = 10) BETWEEN 0 
7620: 41 4e 44 20 32 20 7d 20 20 31 0a 64 6f 5f 65 78  AND 2 }  1.do_ex
7630: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7640: 72 2d 31 33 2e 32 2e 33 20 20 7b 20 53 45 4c 45  r-13.2.3  { SELE
7650: 43 54 20 31 20 3d 3d 20 28 31 30 20 42 45 54 57  CT 1 == (10 BETW
7660: 45 45 4e 20 30 20 41 4e 44 20 32 29 20 7d 20 20  EEN 0 AND 2) }  
7670: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
7680: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 34 20  t e_expr-13.2.4 
7690: 20 7b 20 53 45 4c 45 43 54 20 20 36 20 42 45 54   { SELECT  6 BET
76a0: 57 45 45 4e 20 34 20 41 4e 44 20 38 20 3d 3d 20  WEEN 4 AND 8 == 
76b0: 31 20 7d 20 20 20 20 31 0a 64 6f 5f 65 78 65 63  1 }    1.do_exec
76c0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
76d0: 31 33 2e 32 2e 35 20 20 7b 20 53 45 4c 45 43 54  13.2.5  { SELECT
76e0: 20 28 36 20 42 45 54 57 45 45 4e 20 34 20 41 4e   (6 BETWEEN 4 AN
76f0: 44 20 38 29 20 3d 3d 20 31 20 7d 20 20 20 31 0a  D 8) == 1 }   1.
7700: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7710: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 36 20 20 7b  e_expr-13.2.6  {
7720: 20 53 45 4c 45 43 54 20 20 36 20 42 45 54 57 45   SELECT  6 BETWE
7730: 45 4e 20 34 20 41 4e 44 20 28 38 20 3d 3d 20 31  EN 4 AND (8 == 1
7740: 29 20 7d 20 20 30 0a 0a 64 6f 5f 65 78 65 63 73  ) }  0..do_execs
7750: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7760: 33 2e 32 2e 37 20 20 7b 20 53 45 4c 45 43 54 20  3.2.7  { SELECT 
7770: 20 35 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44   5 BETWEEN 0 AND
7780: 20 30 20 20 21 3d 20 31 20 7d 20 20 20 31 0a 64   0  != 1 }   1.d
7790: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
77a0: 5f 65 78 70 72 2d 31 33 2e 32 2e 38 20 20 7b 20  _expr-13.2.8  { 
77b0: 53 45 4c 45 43 54 20 28 35 20 42 45 54 57 45 45  SELECT (5 BETWEE
77c0: 4e 20 30 20 41 4e 44 20 30 29 20 21 3d 20 31 20  N 0 AND 0) != 1 
77d0: 7d 20 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  }   1.do_execsql
77e0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
77f0: 32 2e 39 20 20 7b 20 53 45 4c 45 43 54 20 20 35  2.9  { SELECT  5
7800: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 28   BETWEEN 0 AND (
7810: 30 20 21 3d 20 31 29 20 7d 20 20 30 0a 64 6f 5f  0 != 1) }  0.do_
7820: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7830: 78 70 72 2d 31 33 2e 32 2e 31 30 20 7b 20 53 45  xpr-13.2.10 { SE
7840: 4c 45 43 54 20 20 31 20 21 3d 20 30 20 20 42 45  LECT  1 != 0  BE
7850: 54 57 45 45 4e 20 30 20 41 4e 44 20 32 20 20 7d  TWEEN 0 AND 2  }
7860: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
7870: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
7880: 31 31 20 7b 20 53 45 4c 45 43 54 20 28 31 20 21  11 { SELECT (1 !
7890: 3d 20 30 29 20 42 45 54 57 45 45 4e 20 30 20 41  = 0) BETWEEN 0 A
78a0: 4e 44 20 32 20 20 7d 20 20 31 0a 64 6f 5f 65 78  ND 2  }  1.do_ex
78b0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
78c0: 72 2d 31 33 2e 32 2e 31 32 20 7b 20 53 45 4c 45  r-13.2.12 { SELE
78d0: 43 54 20 20 31 20 21 3d 20 28 30 20 42 45 54 57  CT  1 != (0 BETW
78e0: 45 45 4e 20 30 20 41 4e 44 20 32 29 20 7d 20 20  EEN 0 AND 2) }  
78f0: 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0..do_execsql_te
7900: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31  st e_expr-13.2.1
7910: 33 20 7b 20 53 45 4c 45 43 54 20 31 20 4c 49 4b  3 { SELECT 1 LIK
7920: 45 20 31 30 20 42 45 54 57 45 45 4e 20 30 20 41  E 10 BETWEEN 0 A
7930: 4e 44 20 32 20 20 20 7d 20 20 31 0a 64 6f 5f 65  ND 2   }  1.do_e
7940: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7950: 70 72 2d 31 33 2e 32 2e 31 34 20 7b 20 53 45 4c  pr-13.2.14 { SEL
7960: 45 43 54 20 28 31 20 4c 49 4b 45 20 31 30 29 20  ECT (1 LIKE 10) 
7970: 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32 20  BETWEEN 0 AND 2 
7980: 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  }  1.do_execsql_
7990: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
79a0: 2e 31 35 20 7b 20 53 45 4c 45 43 54 20 31 20 4c  .15 { SELECT 1 L
79b0: 49 4b 45 20 28 31 30 20 42 45 54 57 45 45 4e 20  IKE (10 BETWEEN 
79c0: 30 20 41 4e 44 20 32 29 20 7d 20 20 30 0a 64 6f  0 AND 2) }  0.do
79d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
79e0: 65 78 70 72 2d 31 33 2e 32 2e 31 36 20 7b 20 53  expr-13.2.16 { S
79f0: 45 4c 45 43 54 20 20 36 20 42 45 54 57 45 45 4e  ELECT  6 BETWEEN
7a00: 20 34 20 41 4e 44 20 38 20 4c 49 4b 45 20 31 20   4 AND 8 LIKE 1 
7a10: 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71    }  1.do_execsq
7a20: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7a30: 2e 32 2e 31 37 20 7b 20 53 45 4c 45 43 54 20 28  .2.17 { SELECT (
7a40: 36 20 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20  6 BETWEEN 4 AND 
7a50: 38 29 20 4c 49 4b 45 20 31 20 20 7d 20 20 31 0a  8) LIKE 1  }  1.
7a60: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7a70: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 38 20 7b  e_expr-13.2.18 {
7a80: 20 53 45 4c 45 43 54 20 20 36 20 42 45 54 57 45   SELECT  6 BETWE
7a90: 45 4e 20 34 20 41 4e 44 20 28 38 20 4c 49 4b 45  EN 4 AND (8 LIKE
7aa0: 20 31 29 20 7d 20 20 30 0a 0a 64 6f 5f 65 78 65   1) }  0..do_exe
7ab0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7ac0: 2d 31 33 2e 32 2e 31 39 20 7b 20 53 45 4c 45 43  -13.2.19 { SELEC
7ad0: 54 20 30 20 41 4e 44 20 30 20 42 45 54 57 45 45  T 0 AND 0 BETWEE
7ae0: 4e 20 30 20 41 4e 44 20 31 20 20 20 7d 20 30 0a  N 0 AND 1   } 0.
7af0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7b00: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 30 20 7b  e_expr-13.2.20 {
7b10: 20 53 45 4c 45 43 54 20 30 20 41 4e 44 20 28 30   SELECT 0 AND (0
7b20: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 31   BETWEEN 0 AND 1
7b30: 29 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ) } 0.do_execsql
7b40: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7b50: 32 2e 32 31 20 7b 20 53 45 4c 45 43 54 20 28 30  2.21 { SELECT (0
7b60: 20 41 4e 44 20 30 29 20 42 45 54 57 45 45 4e 20   AND 0) BETWEEN 
7b70: 30 20 41 4e 44 20 31 20 7d 20 31 0a 64 6f 5f 65  0 AND 1 } 1.do_e
7b80: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7b90: 70 72 2d 31 33 2e 32 2e 32 32 20 7b 20 53 45 4c  pr-13.2.22 { SEL
7ba0: 45 43 54 20 30 20 42 45 54 57 45 45 4e 20 2d 31  ECT 0 BETWEEN -1
7bb0: 20 41 4e 44 20 31 20 41 4e 44 20 30 20 20 20 7d   AND 1 AND 0   }
7bc0: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
7bd0: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32  st e_expr-13.2.2
7be0: 33 20 7b 20 53 45 4c 45 43 54 20 28 30 20 42 45  3 { SELECT (0 BE
7bf0: 54 57 45 45 4e 20 2d 31 20 41 4e 44 20 31 29 20  TWEEN -1 AND 1) 
7c00: 41 4e 44 20 30 20 7d 20 30 0a 64 6f 5f 65 78 65  AND 0 } 0.do_exe
7c10: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7c20: 2d 31 33 2e 32 2e 32 34 20 7b 20 53 45 4c 45 43  -13.2.24 { SELEC
7c30: 54 20 30 20 42 45 54 57 45 45 4e 20 2d 31 20 41  T 0 BETWEEN -1 A
7c40: 4e 44 20 28 31 20 41 4e 44 20 30 29 20 7d 20 31  ND (1 AND 0) } 1
7c50: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
7c60: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 35  t e_expr-13.2.25
7c70: 20 7b 20 53 45 4c 45 43 54 20 32 20 3c 20 33 20   { SELECT 2 < 3 
7c80: 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 31 20  BETWEEN 0 AND 1 
7c90: 20 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c    } 1.do_execsql
7ca0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7cb0: 32 2e 32 36 20 7b 20 53 45 4c 45 43 54 20 28 32  2.26 { SELECT (2
7cc0: 20 3c 20 33 29 20 42 45 54 57 45 45 4e 20 30 20   < 3) BETWEEN 0 
7cd0: 41 4e 44 20 31 20 7d 20 31 0a 64 6f 5f 65 78 65  AND 1 } 1.do_exe
7ce0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7cf0: 2d 31 33 2e 32 2e 32 37 20 7b 20 53 45 4c 45 43  -13.2.27 { SELEC
7d00: 54 20 32 20 3c 20 28 33 20 42 45 54 57 45 45 4e  T 2 < (3 BETWEEN
7d10: 20 30 20 41 4e 44 20 31 29 20 7d 20 30 0a 64 6f   0 AND 1) } 0.do
7d20: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7d30: 65 78 70 72 2d 31 33 2e 32 2e 32 38 20 7b 20 53  expr-13.2.28 { S
7d40: 45 4c 45 43 54 20 32 20 42 45 54 57 45 45 4e 20  ELECT 2 BETWEEN 
7d50: 31 20 41 4e 44 20 32 20 3c 20 33 20 20 20 20 7d  1 AND 2 < 3    }
7d60: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
7d70: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32  st e_expr-13.2.2
7d80: 39 20 7b 20 53 45 4c 45 43 54 20 32 20 42 45 54  9 { SELECT 2 BET
7d90: 57 45 45 4e 20 31 20 41 4e 44 20 28 32 20 3c 20  WEEN 1 AND (2 < 
7da0: 33 29 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  3)  } 0.do_execs
7db0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7dc0: 33 2e 32 2e 33 30 20 7b 20 53 45 4c 45 43 54 20  3.2.30 { SELECT 
7dd0: 28 32 20 42 45 54 57 45 45 4e 20 31 20 41 4e 44  (2 BETWEEN 1 AND
7de0: 20 32 29 20 3c 20 33 20 20 7d 20 31 0a 0a 23 2d   2) < 3  } 1..#-
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 2d 2d 2d  ----------------
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
7e40: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73 20 72  the statements r
7e50: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 4c 49  elated to the LI
7e60: 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72  KE and GLOB oper
7e70: 61 74 6f 72 73 2e 0a 23 0a 23 20 45 56 49 44 45  ators..#.# EVIDE
7e80: 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 38 34 2d  NCE-OF: R-16584-
7e90: 36 30 31 38 39 20 54 68 65 20 4c 49 4b 45 20 6f  60189 The LIKE o
7ea0: 70 65 72 61 74 6f 72 20 64 6f 65 73 20 61 20 70  perator does a p
7eb0: 61 74 74 65 72 6e 20 6d 61 74 63 68 69 6e 67 0a  attern matching.
7ec0: 23 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 23 0a  # comparison..#.
7ed0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
7ee0: 2d 31 31 32 39 35 2d 30 34 36 35 37 20 54 68 65  -11295-04657 The
7ef0: 20 6f 70 65 72 61 6e 64 20 74 6f 20 74 68 65 20   operand to the 
7f00: 72 69 67 68 74 20 6f 66 20 74 68 65 20 4c 49 4b  right of the LIK
7f10: 45 0a 23 20 6f 70 65 72 61 74 6f 72 20 63 6f 6e  E.# operator con
7f20: 74 61 69 6e 73 20 74 68 65 20 70 61 74 74 65 72  tains the patter
7f30: 6e 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 68  n and the left h
7f40: 61 6e 64 20 6f 70 65 72 61 6e 64 20 63 6f 6e 74  and operand cont
7f50: 61 69 6e 73 20 74 68 65 0a 23 20 73 74 72 69 6e  ains the.# strin
7f60: 67 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e  g to match again
7f70: 73 74 20 74 68 65 20 70 61 74 74 65 72 6e 2e 0a  st the pattern..
7f80: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
7f90: 74 20 65 5f 65 78 70 72 2d 31 34 2e 31 2e 31 20  t e_expr-14.1.1 
7fa0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 25 27 20  { SELECT 'abc%' 
7fb0: 4c 49 4b 45 20 27 61 62 63 64 65 27 20 7d 20 30  LIKE 'abcde' } 0
7fc0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7fd0: 20 65 5f 65 78 70 72 2d 31 34 2e 31 2e 32 20 7b   e_expr-14.1.2 {
7fe0: 20 53 45 4c 45 43 54 20 27 61 62 63 64 65 27 20   SELECT 'abcde' 
7ff0: 4c 49 4b 45 20 27 61 62 63 25 27 20 7d 20 31 0a  LIKE 'abc%' } 1.
8000: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
8010: 52 2d 35 35 34 30 36 2d 33 38 35 32 34 20 41 20  R-55406-38524 A 
8020: 70 65 72 63 65 6e 74 20 73 79 6d 62 6f 6c 20 28  percent symbol (
8030: 22 25 22 29 20 69 6e 20 74 68 65 20 4c 49 4b 45  "%") in the LIKE
8040: 20 70 61 74 74 65 72 6e 0a 23 20 6d 61 74 63 68   pattern.# match
8050: 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20  es any sequence 
8060: 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
8070: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
8080: 65 20 73 74 72 69 6e 67 2e 0a 23 0a 64 6f 5f 65  e string..#.do_e
8090: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
80a0: 70 72 2d 31 34 2e 32 2e 31 20 7b 20 53 45 4c 45  pr-14.2.1 { SELE
80b0: 43 54 20 27 61 62 64 65 27 20 20 20 20 4c 49 4b  CT 'abde'    LIK
80c0: 45 20 27 61 62 25 64 65 27 20 7d 20 31 0a 64 6f  E 'ab%de' } 1.do
80d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
80e0: 65 78 70 72 2d 31 34 2e 32 2e 32 20 7b 20 53 45  expr-14.2.2 { SE
80f0: 4c 45 43 54 20 27 61 62 58 64 65 27 20 20 20 4c  LECT 'abXde'   L
8100: 49 4b 45 20 27 61 62 25 64 65 27 20 7d 20 31 0a  IKE 'ab%de' } 1.
8110: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8120: 65 5f 65 78 70 72 2d 31 34 2e 32 2e 33 20 7b 20  e_expr-14.2.3 { 
8130: 53 45 4c 45 43 54 20 27 61 62 41 42 43 64 65 27  SELECT 'abABCde'
8140: 20 4c 49 4b 45 20 27 61 62 25 64 65 27 20 7d 20   LIKE 'ab%de' } 
8150: 31 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  1..# EVIDENCE-OF
8160: 3a 20 52 2d 33 30 34 33 33 2d 32 35 34 34 33 20  : R-30433-25443 
8170: 41 6e 20 75 6e 64 65 72 73 63 6f 72 65 20 28 22  An underscore ("
8180: 5f 22 29 20 69 6e 20 74 68 65 20 4c 49 4b 45 20  _") in the LIKE 
8190: 70 61 74 74 65 72 6e 0a 23 20 6d 61 74 63 68 65  pattern.# matche
81a0: 73 20 61 6e 79 20 73 69 6e 67 6c 65 20 63 68 61  s any single cha
81b0: 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 73 74  racter in the st
81c0: 72 69 6e 67 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ring..#.do_execs
81d0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
81e0: 34 2e 33 2e 31 20 7b 20 53 45 4c 45 43 54 20 27  4.3.1 { SELECT '
81f0: 61 62 64 65 27 20 20 20 20 4c 49 4b 45 20 27 61  abde'    LIKE 'a
8200: 62 5f 64 65 27 20 7d 20 30 0a 64 6f 5f 65 78 65  b_de' } 0.do_exe
8210: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
8220: 2d 31 34 2e 33 2e 32 20 7b 20 53 45 4c 45 43 54  -14.3.2 { SELECT
8230: 20 27 61 62 58 64 65 27 20 20 20 4c 49 4b 45 20   'abXde'   LIKE 
8240: 27 61 62 5f 64 65 27 20 7d 20 31 0a 64 6f 5f 65  'ab_de' } 1.do_e
8250: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8260: 70 72 2d 31 34 2e 33 2e 33 20 7b 20 53 45 4c 45  pr-14.3.3 { SELE
8270: 43 54 20 27 61 62 41 42 43 64 65 27 20 4c 49 4b  CT 'abABCde' LIK
8280: 45 20 27 61 62 5f 64 65 27 20 7d 20 30 0a 0a 23  E 'ab_de' } 0..#
8290: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
82a0: 35 39 30 30 37 2d 32 30 34 35 34 20 41 6e 79 20  59007-20454 Any 
82b0: 6f 74 68 65 72 20 63 68 61 72 61 63 74 65 72 20  other character 
82c0: 6d 61 74 63 68 65 73 20 69 74 73 65 6c 66 20 6f  matches itself o
82d0: 72 20 69 74 73 0a 23 20 6c 6f 77 65 72 2f 75 70  r its.# lower/up
82e0: 70 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c  per case equival
82f0: 65 6e 74 20 28 69 2e 65 2e 20 63 61 73 65 2d 69  ent (i.e. case-i
8300: 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 74 63 68  nsensitive match
8310: 69 6e 67 29 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ing)..#.do_execs
8320: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8330: 34 2e 34 2e 31 20 7b 20 53 45 4c 45 43 54 20 27  4.4.1 { SELECT '
8340: 61 62 63 27 20 4c 49 4b 45 20 27 61 42 63 27 20  abc' LIKE 'aBc' 
8350: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
8360: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 34 2e  est e_expr-14.4.
8370: 32 20 7b 20 53 45 4c 45 43 54 20 27 61 42 63 27  2 { SELECT 'aBc'
8380: 20 4c 49 4b 45 20 27 61 42 63 27 20 7d 20 31 0a   LIKE 'aBc' } 1.
8390: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
83a0: 65 5f 65 78 70 72 2d 31 34 2e 34 2e 33 20 7b 20  e_expr-14.4.3 { 
83b0: 53 45 4c 45 43 54 20 27 61 63 27 20 20 4c 49 4b  SELECT 'ac'  LIK
83c0: 45 20 27 61 42 63 27 20 7d 20 30 0a 0a 23 20 45  E 'aBc' } 0..# E
83d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33  VIDENCE-OF: R-23
83e0: 36 34 38 2d 35 38 35 32 37 20 53 51 4c 69 74 65  648-58527 SQLite
83f0: 20 6f 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e 64   only understand
8400: 73 20 75 70 70 65 72 2f 6c 6f 77 65 72 20 63 61  s upper/lower ca
8410: 73 65 0a 23 20 66 6f 72 20 41 53 43 49 49 20 63  se.# for ASCII c
8420: 68 61 72 61 63 74 65 72 73 20 62 79 20 64 65 66  haracters by def
8430: 61 75 6c 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ault..#.# EVIDEN
8440: 43 45 2d 4f 46 3a 20 52 2d 30 34 35 33 32 2d 31  CE-OF: R-04532-1
8450: 31 35 32 37 20 54 68 65 20 4c 49 4b 45 20 6f 70  1527 The LIKE op
8460: 65 72 61 74 6f 72 20 69 73 20 63 61 73 65 20 73  erator is case s
8470: 65 6e 73 69 74 69 76 65 20 62 79 0a 23 20 64 65  ensitive by.# de
8480: 66 61 75 6c 74 20 66 6f 72 20 75 6e 69 63 6f 64  fault for unicod
8490: 65 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  e characters tha
84a0: 74 20 61 72 65 20 62 65 79 6f 6e 64 20 74 68 65  t are beyond the
84b0: 20 41 53 43 49 49 20 72 61 6e 67 65 2e 0a 23 0a   ASCII range..#.
84c0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
84d0: 2d 34 34 33 38 31 2d 31 31 36 36 39 20 74 68 65  -44381-11669 the
84e0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 23 20 27 61   expression.# 'a
84f0: 27 26 6e 62 73 70 3b 4c 49 4b 45 26 6e 62 73 70  '&nbsp;LIKE&nbsp
8500: 3b 27 41 27 20 69 73 20 54 52 55 45 20 62 75 74  ;'A' is TRUE but
8510: 0a 23 20 27 26 61 65 6c 69 67 3b 27 26 6e 62 73  .# '&aelig;'&nbs
8520: 70 3b 4c 49 4b 45 26 6e 62 73 70 3b 27 26 41 45  p;LIKE&nbsp;'&AE
8530: 6c 69 67 3b 27 20 69 73 20 46 41 4c 53 45 2e 0a  lig;' is FALSE..
8540: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
8550: 74 20 65 5f 65 78 70 72 2d 31 34 2e 35 2e 31 20  t e_expr-14.5.1 
8560: 7b 20 53 45 4c 45 43 54 20 27 41 27 20 4c 49 4b  { SELECT 'A' LIK
8570: 45 20 27 61 27 20 20 20 20 20 20 20 20 20 7d 20  E 'a'         } 
8580: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
8590: 74 20 65 5f 65 78 70 72 2d 31 34 2e 35 2e 32 20  t e_expr-14.5.2 
85a0: 22 53 45 4c 45 43 54 20 27 5c 75 30 30 63 36 27  "SELECT '\u00c6'
85b0: 20 4c 49 4b 45 20 27 5c 75 30 30 65 36 27 22 20   LIKE '\u00e6'" 
85c0: 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  0..# EVIDENCE-OF
85d0: 3a 20 52 2d 35 36 36 38 33 2d 31 33 37 33 31 20  : R-56683-13731 
85e0: 49 66 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20  If the optional 
85f0: 45 53 43 41 50 45 20 63 6c 61 75 73 65 20 69 73  ESCAPE clause is
8600: 20 70 72 65 73 65 6e 74 2c 0a 23 20 74 68 65 6e   present,.# then
8610: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8620: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 45 53  following the ES
8630: 43 41 50 45 20 6b 65 79 77 6f 72 64 20 6d 75 73  CAPE keyword mus
8640: 74 20 65 76 61 6c 75 61 74 65 20 74 6f 20 61 0a  t evaluate to a.
8650: 23 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74  # string consist
8660: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
8670: 63 68 61 72 61 63 74 65 72 2e 0a 23 0a 64 6f 5f  character..#.do_
8680: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f  catchsql_test e_
8690: 65 78 70 72 2d 31 34 2e 36 2e 31 20 7b 20 0a 20  expr-14.6.1 { . 
86a0: 20 53 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45   SELECT 'A' LIKE
86b0: 20 27 61 27 20 45 53 43 41 50 45 20 27 31 32 27   'a' ESCAPE '12'
86c0: 20 0a 7d 20 7b 31 20 7b 45 53 43 41 50 45 20 65   .} {1 {ESCAPE e
86d0: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
86e0: 65 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61  e a single chara
86f0: 63 74 65 72 7d 7d 0a 64 6f 5f 63 61 74 63 68 73  cter}}.do_catchs
8700: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8710: 34 2e 36 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43  4.6.2 { .  SELEC
8720: 54 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45  T 'A' LIKE 'a' E
8730: 53 43 41 50 45 20 27 27 20 0a 7d 20 7b 31 20 7b  SCAPE '' .} {1 {
8740: 45 53 43 41 50 45 20 65 78 70 72 65 73 73 69 6f  ESCAPE expressio
8750: 6e 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67  n must be a sing
8760: 6c 65 20 63 68 61 72 61 63 74 65 72 7d 7d 0a 64  le character}}.d
8770: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
8780: 65 5f 65 78 70 72 2d 31 34 2e 36 2e 33 20 7b 20  e_expr-14.6.3 { 
8790: 53 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20  SELECT 'A' LIKE 
87a0: 27 61 27 20 45 53 43 41 50 45 20 27 78 27 20 7d  'a' ESCAPE 'x' }
87b0: 20 20 20 20 7b 30 20 31 7d 0a 64 6f 5f 63 61 74      {0 1}.do_cat
87c0: 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  chsql_test e_exp
87d0: 72 2d 31 34 2e 36 2e 34 20 22 53 45 4c 45 43 54  r-14.6.4 "SELECT
87e0: 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53   'A' LIKE 'a' ES
87f0: 43 41 50 45 20 27 5c 75 30 30 65 36 27 22 20 7b  CAPE '\u00e6'" {
8800: 30 20 31 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  0 1}..# EVIDENCE
8810: 2d 4f 46 3a 20 52 2d 30 32 30 34 35 2d 32 33 37  -OF: R-02045-237
8820: 36 32 20 54 68 69 73 20 63 68 61 72 61 63 74 65  62 This characte
8830: 72 20 6d 61 79 20 62 65 20 75 73 65 64 20 69 6e  r may be used in
8840: 20 74 68 65 20 4c 49 4b 45 0a 23 20 70 61 74 74   the LIKE.# patt
8850: 65 72 6e 20 74 6f 20 69 6e 63 6c 75 64 65 20 6c  ern to include l
8860: 69 74 65 72 61 6c 20 70 65 72 63 65 6e 74 20 6f  iteral percent o
8870: 72 20 75 6e 64 65 72 73 63 6f 72 65 20 63 68 61  r underscore cha
8880: 72 61 63 74 65 72 73 2e 0a 23 0a 23 20 45 56 49  racters..#.# EVI
8890: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 33 34  DENCE-OF: R-1334
88a0: 35 2d 33 31 38 33 30 20 54 68 65 20 65 73 63 61  5-31830 The esca
88b0: 70 65 20 63 68 61 72 61 63 74 65 72 20 66 6f 6c  pe character fol
88c0: 6c 6f 77 65 64 20 62 79 20 61 20 70 65 72 63 65  lowed by a perce
88d0: 6e 74 0a 23 20 73 79 6d 62 6f 6c 20 28 25 29 2c  nt.# symbol (%),
88e0: 20 75 6e 64 65 72 73 63 6f 72 65 20 28 5f 29 2c   underscore (_),
88f0: 20 6f 72 20 61 20 73 65 63 6f 6e 64 20 69 6e 73   or a second ins
8900: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 65 73 63  tance of the esc
8910: 61 70 65 0a 23 20 63 68 61 72 61 63 74 65 72 20  ape.# character 
8920: 69 74 73 65 6c 66 20 6d 61 74 63 68 65 73 20 61  itself matches a
8930: 20 6c 69 74 65 72 61 6c 20 70 65 72 63 65 6e 74   literal percent
8940: 20 73 79 6d 62 6f 6c 2c 20 75 6e 64 65 72 73 63   symbol, undersc
8950: 6f 72 65 2c 20 6f 72 20 61 0a 23 20 73 69 6e 67  ore, or a.# sing
8960: 6c 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63  le escape charac
8970: 74 65 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ter, respectivel
8980: 79 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  y..#.do_execsql_
8990: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37  test e_expr-14.7
89a0: 2e 31 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .1  { SELECT 'ab
89b0: 63 25 27 20 20 4c 49 4b 45 20 27 61 62 63 58 25  c%'  LIKE 'abcX%
89c0: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 31  ' ESCAPE 'X' } 1
89d0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
89e0: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 32 20 20   e_expr-14.7.2  
89f0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 35 27 20  { SELECT 'abc5' 
8a00: 20 4c 49 4b 45 20 27 61 62 63 58 25 27 20 45 53   LIKE 'abcX%' ES
8a10: 43 41 50 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f  CAPE 'X' } 0.do_
8a20: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8a30: 78 70 72 2d 31 34 2e 37 2e 33 20 20 7b 20 53 45  xpr-14.7.3  { SE
8a40: 4c 45 43 54 20 27 61 62 63 27 20 20 20 4c 49 4b  LECT 'abc'   LIK
8a50: 45 20 27 61 62 63 58 25 27 20 45 53 43 41 50 45  E 'abcX%' ESCAPE
8a60: 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63   'X' } 0.do_exec
8a70: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
8a80: 31 34 2e 37 2e 34 20 20 7b 20 53 45 4c 45 43 54  14.7.4  { SELECT
8a90: 20 27 61 62 63 58 25 27 20 4c 49 4b 45 20 27 61   'abcX%' LIKE 'a
8aa0: 62 63 58 25 27 20 45 53 43 41 50 45 20 27 58 27  bcX%' ESCAPE 'X'
8ab0: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
8ac0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37  test e_expr-14.7
8ad0: 2e 35 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .5  { SELECT 'ab
8ae0: 63 25 25 27 20 4c 49 4b 45 20 27 61 62 63 58 25  c%%' LIKE 'abcX%
8af0: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30  ' ESCAPE 'X' } 0
8b00: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
8b10: 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 36 20  t e_expr-14.7.6 
8b20: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 5f 27   { SELECT 'abc_'
8b30: 20 20 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45    LIKE 'abcX_' E
8b40: 53 43 41 50 45 20 27 58 27 20 7d 20 31 0a 64 6f  SCAPE 'X' } 1.do
8b50: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8b60: 65 78 70 72 2d 31 34 2e 37 2e 37 20 20 7b 20 53  expr-14.7.7  { S
8b70: 45 4c 45 43 54 20 27 61 62 63 35 27 20 20 4c 49  ELECT 'abc5'  LI
8b80: 4b 45 20 27 61 62 63 58 5f 27 20 45 53 43 41 50  KE 'abcX_' ESCAP
8b90: 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65  E 'X' } 0.do_exe
8ba0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
8bb0: 2d 31 34 2e 37 2e 38 20 20 7b 20 53 45 4c 45 43  -14.7.8  { SELEC
8bc0: 54 20 27 61 62 63 27 20 20 20 4c 49 4b 45 20 27  T 'abc'   LIKE '
8bd0: 61 62 63 58 5f 27 20 45 53 43 41 50 45 20 27 58  abcX_' ESCAPE 'X
8be0: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
8bf0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
8c00: 37 2e 39 20 20 7b 20 53 45 4c 45 43 54 20 27 61  7.9  { SELECT 'a
8c10: 62 63 58 5f 27 20 4c 49 4b 45 20 27 61 62 63 58  bcX_' LIKE 'abcX
8c20: 5f 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20  _' ESCAPE 'X' } 
8c30: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
8c40: 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 30  t e_expr-14.7.10
8c50: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 5f 5f   { SELECT 'abc__
8c60: 27 20 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45  ' LIKE 'abcX_' E
8c70: 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 64  SCAPE 'X' } 0..d
8c80: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8c90: 5f 65 78 70 72 2d 31 34 2e 37 2e 31 31 20 7b 20  _expr-14.7.11 { 
8ca0: 53 45 4c 45 43 54 20 27 61 62 63 58 27 20 20 4c  SELECT 'abcX'  L
8cb0: 49 4b 45 20 27 61 62 63 58 58 27 20 45 53 43 41  IKE 'abcXX' ESCA
8cc0: 50 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f 65 78  PE 'X' } 1.do_ex
8cd0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
8ce0: 72 2d 31 34 2e 37 2e 31 32 20 7b 20 53 45 4c 45  r-14.7.12 { SELE
8cf0: 43 54 20 27 61 62 63 35 27 20 20 4c 49 4b 45 20  CT 'abc5'  LIKE 
8d00: 27 61 62 63 58 58 27 20 45 53 43 41 50 45 20 27  'abcXX' ESCAPE '
8d10: 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71  X' } 0.do_execsq
8d20: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
8d30: 2e 37 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 27  .7.13 { SELECT '
8d40: 61 62 63 27 20 20 20 4c 49 4b 45 20 27 61 62 63  abc'   LIKE 'abc
8d50: 58 58 27 20 45 53 43 41 50 45 20 27 58 27 20 7d  XX' ESCAPE 'X' }
8d60: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
8d70: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31  st e_expr-14.7.1
8d80: 34 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 58  4 { SELECT 'abcX
8d90: 58 27 20 4c 49 4b 45 20 27 61 62 63 58 58 27 20  X' LIKE 'abcXX' 
8da0: 45 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a  ESCAPE 'X' } 0..
8db0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
8dc0: 2d 35 31 33 35 39 2d 31 37 34 39 36 20 54 68 65  -51359-17496 The
8dd0: 20 69 6e 66 69 78 20 4c 49 4b 45 20 6f 70 65 72   infix LIKE oper
8de0: 61 74 6f 72 20 69 73 20 69 6d 70 6c 65 6d 65 6e  ator is implemen
8df0: 74 65 64 20 62 79 0a 23 20 63 61 6c 6c 69 6e 67  ted by.# calling
8e00: 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
8e10: 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e  -defined SQL fun
8e20: 63 74 69 6f 6e 73 20 6c 69 6b 65 28 59 2c 58 29  ctions like(Y,X)
8e30: 20 6f 72 20 6c 69 6b 65 28 59 2c 58 2c 5a 29 2e   or like(Y,X,Z).
8e40: 0a 23 0a 70 72 6f 63 20 6c 69 6b 65 66 75 6e 63  .#.proc likefunc
8e50: 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c   {args} {.  eval
8e60: 20 6c 61 70 70 65 6e 64 20 3a 3a 6c 69 6b 65 61   lappend ::likea
8e70: 72 67 73 20 24 61 72 67 73 0a 20 20 72 65 74 75  rgs $args.  retu
8e80: 72 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 6c  rn 1.}.db func l
8e90: 69 6b 65 20 6c 69 6b 65 66 75 6e 63 0a 73 65 74  ike likefunc.set
8ea0: 20 3a 3a 6c 69 6b 65 61 72 67 73 20 5b 6c 69 73   ::likeargs [lis
8eb0: 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  t].do_execsql_te
8ec0: 73 74 20 65 5f 65 78 70 72 2d 31 35 2e 31 2e 31  st e_expr-15.1.1
8ed0: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 27 20   { SELECT 'abc' 
8ee0: 4c 49 4b 45 20 27 64 65 66 27 20 7d 20 31 0a 64  LIKE 'def' } 1.d
8ef0: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 65  o_test         e
8f00: 5f 65 78 70 72 2d 31 35 2e 31 2e 32 20 7b 20 73  _expr-15.1.2 { s
8f10: 65 74 20 6c 69 6b 65 61 72 67 73 20 7d 20 7b 64  et likeargs } {d
8f20: 65 66 20 61 62 63 7d 0a 73 65 74 20 3a 3a 6c 69  ef abc}.set ::li
8f30: 6b 65 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f  keargs [list].do
8f40: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8f50: 65 78 70 72 2d 31 35 2e 31 2e 33 20 7b 20 53 45  expr-15.1.3 { SE
8f60: 4c 45 43 54 20 27 61 62 63 27 20 4c 49 4b 45 20  LECT 'abc' LIKE 
8f70: 27 64 65 66 27 20 45 53 43 41 50 45 20 27 58 27  'def' ESCAPE 'X'
8f80: 20 7d 20 31 0a 64 6f 5f 74 65 73 74 20 20 20 20   } 1.do_test    
8f90: 20 20 20 20 20 65 5f 65 78 70 72 2d 31 35 2e 31       e_expr-15.1
8fa0: 2e 34 20 7b 20 73 65 74 20 6c 69 6b 65 61 72 67  .4 { set likearg
8fb0: 73 20 7d 20 7b 64 65 66 20 61 62 63 20 58 7d 0a  s } {def abc X}.
8fc0: 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33  db close.sqlite3
8fd0: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 23 20 45   db test.db..# E
8fe0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32  VIDENCE-OF: R-22
8ff0: 38 36 38 2d 32 35 38 38 30 20 54 68 65 20 4c 49  868-25880 The LI
9000: 4b 45 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20  KE operator can 
9010: 62 65 20 6d 61 64 65 20 63 61 73 65 0a 23 20 73  be made case.# s
9020: 65 6e 73 69 74 69 76 65 20 75 73 69 6e 67 20 74  ensitive using t
9030: 68 65 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76  he case_sensitiv
9040: 65 5f 6c 69 6b 65 20 70 72 61 67 6d 61 2e 0a 23  e_like pragma..#
9050: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9060: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 31 20 7b   e_expr-16.1.1 {
9070: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
9080: 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20 31   LIKE 'ABC%' } 1
9090: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
90a0: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 32 20 7b   e_expr-16.1.2 {
90b0: 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e   PRAGMA case_sen
90c0: 73 69 74 69 76 65 5f 6c 69 6b 65 20 3d 20 31 20  sitive_like = 1 
90d0: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
90e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
90f0: 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .3 { SELECT 'abc
9100: 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25 27  xyz' LIKE 'ABC%'
9110: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
9120: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
9130: 2e 34 20 7b 20 53 45 4c 45 43 54 20 27 41 42 43  .4 { SELECT 'ABC
9140: 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25 27  xyz' LIKE 'ABC%'
9150: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
9160: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
9170: 2e 35 20 7b 20 50 52 41 47 4d 41 20 63 61 73 65  .5 { PRAGMA case
9180: 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 20  _sensitive_like 
9190: 3d 20 30 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63  = 0 } {}.do_exec
91a0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
91b0: 31 36 2e 31 2e 36 20 7b 20 53 45 4c 45 43 54 20  16.1.6 { SELECT 
91c0: 27 61 62 63 78 79 7a 27 20 4c 49 4b 45 20 27 41  'abcxyz' LIKE 'A
91d0: 42 43 25 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63  BC%' } 1.do_exec
91e0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
91f0: 31 36 2e 31 2e 37 20 7b 20 53 45 4c 45 43 54 20  16.1.7 { SELECT 
9200: 27 41 42 43 78 79 7a 27 20 4c 49 4b 45 20 27 41  'ABCxyz' LIKE 'A
9210: 42 43 25 27 20 7d 20 31 0a 0a 23 20 45 56 49 44  BC%' } 1..# EVID
9220: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 30 38 37  ENCE-OF: R-52087
9230: 2d 31 32 30 34 33 20 54 68 65 20 47 4c 4f 42 20  -12043 The GLOB 
9240: 6f 70 65 72 61 74 6f 72 20 69 73 20 73 69 6d 69  operator is simi
9250: 6c 61 72 20 74 6f 20 4c 49 4b 45 20 62 75 74 0a  lar to LIKE but.
9260: 23 20 75 73 65 73 20 74 68 65 20 55 6e 69 78 20  # uses the Unix 
9270: 66 69 6c 65 20 67 6c 6f 62 62 69 6e 67 20 73 79  file globbing sy
9280: 6e 74 61 78 20 66 6f 72 20 69 74 73 20 77 69 6c  ntax for its wil
9290: 64 63 61 72 64 73 2e 0a 23 0a 23 20 45 56 49 44  dcards..#.# EVID
92a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39 38 31 33  ENCE-OF: R-09813
92b0: 2d 31 37 32 37 39 20 41 6c 73 6f 2c 20 47 4c 4f  -17279 Also, GLO
92c0: 42 20 69 73 20 63 61 73 65 20 73 65 6e 73 69 74  B is case sensit
92d0: 69 76 65 2c 20 75 6e 6c 69 6b 65 20 4c 49 4b 45  ive, unlike LIKE
92e0: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
92f0: 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e  est e_expr-17.1.
9300: 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78  1 { SELECT 'abcx
9310: 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 25 27 20  yz' GLOB 'abc%' 
9320: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
9330: 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e  est e_expr-17.1.
9340: 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78  2 { SELECT 'abcx
9350: 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 2a 27 20  yz' GLOB 'abc*' 
9360: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
9370: 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e  est e_expr-17.1.
9380: 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78  3 { SELECT 'abcx
9390: 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 5f 5f 5f  yz' GLOB 'abc___
93a0: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
93b0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
93c0: 31 2e 34 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.4 { SELECT 'ab
93d0: 63 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 3f  cxyz' GLOB 'abc?
93e0: 3f 3f 27 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63  ??' } 1..do_exec
93f0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
9400: 31 37 2e 31 2e 35 20 7b 20 53 45 4c 45 43 54 20  17.1.5 { SELECT 
9410: 27 61 62 63 78 79 7a 27 20 47 4c 4f 42 20 27 61  'abcxyz' GLOB 'a
9420: 62 63 2a 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63  bc*' } 1.do_exec
9430: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
9440: 31 37 2e 31 2e 36 20 7b 20 53 45 4c 45 43 54 20  17.1.6 { SELECT 
9450: 27 41 42 43 78 79 7a 27 20 47 4c 4f 42 20 27 61  'ABCxyz' GLOB 'a
9460: 62 63 2a 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63  bc*' } 0.do_exec
9470: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
9480: 31 37 2e 31 2e 37 20 7b 20 53 45 4c 45 43 54 20  17.1.7 { SELECT 
9490: 27 61 62 63 78 79 7a 27 20 47 4c 4f 42 20 27 41  'abcxyz' GLOB 'A
94a0: 42 43 2a 27 20 7d 20 30 0a 0a 23 20 45 56 49 44  BC*' } 0..# EVID
94b0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 36 31 36  ENCE-OF: R-39616
94c0: 2d 32 30 35 35 35 20 42 6f 74 68 20 47 4c 4f 42  -20555 Both GLOB
94d0: 20 61 6e 64 20 4c 49 4b 45 20 6d 61 79 20 62 65   and LIKE may be
94e0: 20 70 72 65 63 65 64 65 64 20 62 79 20 74 68 65   preceded by the
94f0: 0a 23 20 4e 4f 54 20 6b 65 79 77 6f 72 64 20 74  .# NOT keyword t
9500: 6f 20 69 6e 76 65 72 74 20 74 68 65 20 73 65 6e  o invert the sen
9510: 73 65 20 6f 66 20 74 68 65 20 74 65 73 74 2e 0a  se of the test..
9520: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
9530: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 31 20  t e_expr-17.2.1 
9540: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
9550: 27 20 4e 4f 54 20 47 4c 4f 42 20 27 41 42 43 2a  ' NOT GLOB 'ABC*
9560: 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 1.do_execsql
9570: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9580: 32 2e 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.2 { SELECT 'ab
9590: 63 78 79 7a 27 20 4e 4f 54 20 47 4c 4f 42 20 27  cxyz' NOT GLOB '
95a0: 61 62 63 2a 27 20 7d 20 30 0a 64 6f 5f 65 78 65  abc*' } 0.do_exe
95b0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
95c0: 2d 31 37 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54  -17.2.3 { SELECT
95d0: 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 4c 49   'abcxyz' NOT LI
95e0: 4b 45 20 27 41 42 43 25 27 20 7d 20 30 0a 64 6f  KE 'ABC%' } 0.do
95f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9600: 65 78 70 72 2d 31 37 2e 32 2e 34 20 7b 20 53 45  expr-17.2.4 { SE
9610: 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e 4f  LECT 'abcxyz' NO
9620: 54 20 4c 49 4b 45 20 27 61 62 63 25 27 20 7d 20  T LIKE 'abc%' } 
9630: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
9640: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 35 20  t e_expr-17.2.5 
9650: 7b 20 53 45 4c 45 43 54 20 27 61 62 64 78 79 7a  { SELECT 'abdxyz
9660: 27 20 4e 4f 54 20 4c 49 4b 45 20 27 61 62 63 25  ' NOT LIKE 'abc%
9670: 27 20 7d 20 31 0a 0a 64 62 20 6e 75 6c 6c 76 61  ' } 1..db nullva
9680: 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63  lue null.do_exec
9690: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
96a0: 31 37 2e 32 2e 36 20 7b 20 53 45 4c 45 43 54 20  17.2.6 { SELECT 
96b0: 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 47 4c 4f  'abcxyz' NOT GLO
96c0: 42 20 4e 55 4c 4c 20 7d 20 6e 75 6c 6c 0a 64 6f  B NULL } null.do
96d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
96e0: 65 78 70 72 2d 31 37 2e 32 2e 37 20 7b 20 53 45  expr-17.2.7 { SE
96f0: 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e 4f  LECT 'abcxyz' NO
9700: 54 20 4c 49 4b 45 20 4e 55 4c 4c 20 7d 20 6e 75  T LIKE NULL } nu
9710: 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  ll.do_execsql_te
9720: 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 38  st e_expr-17.2.8
9730: 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 4e   { SELECT NULL N
9740: 4f 54 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 7d  OT GLOB 'abc*' }
9750: 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c   null.do_execsql
9760: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9770: 32 2e 39 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c  2.9 { SELECT NUL
9780: 4c 20 4e 4f 54 20 4c 49 4b 45 20 27 41 42 43 25  L NOT LIKE 'ABC%
9790: 27 20 7d 20 6e 75 6c 6c 0a 64 62 20 6e 75 6c 6c  ' } null.db null
97a0: 76 61 6c 75 65 20 7b 7d 0a 0a 23 20 45 56 49 44  value {}..# EVID
97b0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 34 31 34  ENCE-OF: R-39414
97c0: 2d 33 35 34 38 39 20 54 68 65 20 69 6e 66 69 78  -35489 The infix
97d0: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 69   GLOB operator i
97e0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
97f0: 0a 23 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66  .# calling the f
9800: 75 6e 63 74 69 6f 6e 20 67 6c 6f 62 28 59 2c 58  unction glob(Y,X
9810: 29 20 61 6e 64 20 63 61 6e 20 62 65 20 6d 6f 64  ) and can be mod
9820: 69 66 69 65 64 20 62 79 20 6f 76 65 72 72 69 64  ified by overrid
9830: 69 6e 67 20 74 68 61 74 0a 23 20 66 75 6e 63 74  ing that.# funct
9840: 69 6f 6e 2e 0a 70 72 6f 63 20 67 6c 6f 62 66 75  ion..proc globfu
9850: 6e 63 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76  nc {args} {.  ev
9860: 61 6c 20 6c 61 70 70 65 6e 64 20 3a 3a 67 6c 6f  al lappend ::glo
9870: 62 61 72 67 73 20 24 61 72 67 73 0a 20 20 72 65  bargs $args.  re
9880: 74 75 72 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63  turn 1.}.db func
9890: 20 67 6c 6f 62 20 2d 61 72 67 63 6f 75 6e 74 20   glob -argcount 
98a0: 32 20 67 6c 6f 62 66 75 6e 63 0a 73 65 74 20 3a  2 globfunc.set :
98b0: 3a 67 6c 6f 62 61 72 67 73 20 5b 6c 69 73 74 5d  :globargs [list]
98c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
98d0: 20 65 5f 65 78 70 72 2d 31 37 2e 33 2e 31 20 7b   e_expr-17.3.1 {
98e0: 20 53 45 4c 45 43 54 20 27 61 62 63 27 20 47 4c   SELECT 'abc' GL
98f0: 4f 42 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f  OB 'def' } 1.do_
9900: 74 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65  test         e_e
9910: 78 70 72 2d 31 37 2e 33 2e 32 20 7b 20 73 65 74  xpr-17.3.2 { set
9920: 20 67 6c 6f 62 61 72 67 73 20 7d 20 7b 64 65 66   globargs } {def
9930: 20 61 62 63 7d 0a 73 65 74 20 3a 3a 67 6c 6f 62   abc}.set ::glob
9940: 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65  args [list].do_e
9950: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
9960: 70 72 2d 31 37 2e 33 2e 33 20 7b 20 53 45 4c 45  pr-17.3.3 { SELE
9970: 43 54 20 27 58 27 20 4e 4f 54 20 47 4c 4f 42 20  CT 'X' NOT GLOB 
9980: 27 59 27 20 7d 20 30 0a 64 6f 5f 74 65 73 74 20  'Y' } 0.do_test 
9990: 20 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31          e_expr-1
99a0: 37 2e 33 2e 34 20 7b 20 73 65 74 20 67 6c 6f 62  7.3.4 { set glob
99b0: 61 72 67 73 20 7d 20 7b 59 20 58 7d 0a 73 71 6c  args } {Y X}.sql
99c0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
99d0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
99e0: 52 2d 34 31 36 35 30 2d 32 30 38 37 32 20 4e 6f  R-41650-20872 No
99f0: 20 72 65 67 65 78 70 28 29 20 75 73 65 72 20 66   regexp() user f
9a00: 75 6e 63 74 69 6f 6e 20 69 73 20 64 65 66 69 6e  unction is defin
9a10: 65 64 20 62 79 0a 23 20 64 65 66 61 75 6c 74 20  ed by.# default 
9a20: 61 6e 64 20 73 6f 20 75 73 65 20 6f 66 20 74 68  and so use of th
9a30: 65 20 52 45 47 45 58 50 20 6f 70 65 72 61 74 6f  e REGEXP operato
9a40: 72 20 77 69 6c 6c 20 6e 6f 72 6d 61 6c 6c 79 20  r will normally 
9a50: 72 65 73 75 6c 74 20 69 6e 20 61 6e 0a 23 20 65  result in an.# e
9a60: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 23 0a  rror message..#.
9a70: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
9a80: 20 65 5f 65 78 70 72 2d 31 38 2e 31 2e 31 20 7b   e_expr-18.1.1 {
9a90: 20 0a 20 20 53 45 4c 45 43 54 20 72 65 67 65 78   .  SELECT regex
9aa0: 70 28 27 61 62 63 27 2c 20 27 64 65 66 27 29 20  p('abc', 'def') 
9ab0: 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 66  .} {1 {no such f
9ac0: 75 6e 63 74 69 6f 6e 3a 20 72 65 67 65 78 70 7d  unction: regexp}
9ad0: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  }.do_catchsql_te
9ae0: 73 74 20 65 5f 65 78 70 72 2d 31 38 2e 31 2e 32  st e_expr-18.1.2
9af0: 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 27 61 62   { .  SELECT 'ab
9b00: 63 27 20 52 45 47 45 58 50 20 27 64 65 66 27 0a  c' REGEXP 'def'.
9b10: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 66 75  } {1 {no such fu
9b20: 6e 63 74 69 6f 6e 3a 20 52 45 47 45 58 50 7d 7d  nction: REGEXP}}
9b30: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
9b40: 20 52 2d 33 33 36 39 33 2d 35 30 31 38 30 20 54   R-33693-50180 T
9b50: 68 65 20 52 45 47 45 58 50 20 6f 70 65 72 61 74  he REGEXP operat
9b60: 6f 72 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  or is a special 
9b70: 73 79 6e 74 61 78 20 66 6f 72 0a 23 20 74 68 65  syntax for.# the
9b80: 20 72 65 67 65 78 70 28 29 20 75 73 65 72 20 66   regexp() user f
9b90: 75 6e 63 74 69 6f 6e 2e 0a 23 0a 23 20 45 56 49  unction..#.# EVI
9ba0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 32 38  DENCE-OF: R-5728
9bb0: 39 2d 31 33 35 37 38 20 49 66 20 61 20 61 70 70  9-13578 If a app
9bc0: 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64  lication-defined
9bd0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6e 61   SQL function na
9be0: 6d 65 64 0a 23 20 22 72 65 67 65 78 70 22 20 69  med.# "regexp" i
9bf0: 73 20 61 64 64 65 64 20 61 74 20 72 75 6e 2d 74  s added at run-t
9c00: 69 6d 65 2c 20 74 68 61 74 20 66 75 6e 63 74 69  ime, that functi
9c10: 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  on will be calle
9c20: 64 20 69 6e 20 6f 72 64 65 72 0a 23 20 74 6f 20  d in order.# to 
9c30: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 52 45  implement the RE
9c40: 47 45 58 50 20 6f 70 65 72 61 74 6f 72 2e 0a 23  GEXP operator..#
9c50: 0a 70 72 6f 63 20 72 65 67 65 78 70 66 75 6e 63  .proc regexpfunc
9c60: 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c   {args} {.  eval
9c70: 20 6c 61 70 70 65 6e 64 20 3a 3a 72 65 67 65 78   lappend ::regex
9c80: 70 61 72 67 73 20 24 61 72 67 73 0a 20 20 72 65  pargs $args.  re
9c90: 74 75 72 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63  turn 1.}.db func
9ca0: 20 72 65 67 65 78 70 20 2d 61 72 67 63 6f 75 6e   regexp -argcoun
9cb0: 74 20 32 20 72 65 67 65 78 70 66 75 6e 63 0a 73  t 2 regexpfunc.s
9cc0: 65 74 20 3a 3a 72 65 67 65 78 70 61 72 67 73 20  et ::regexpargs 
9cd0: 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71  [list].do_execsq
9ce0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 38  l_test e_expr-18
9cf0: 2e 32 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61  .2.1 { SELECT 'a
9d00: 62 63 27 20 52 45 47 45 58 50 20 27 64 65 66 27  bc' REGEXP 'def'
9d10: 20 7d 20 31 0a 64 6f 5f 74 65 73 74 20 20 20 20   } 1.do_test    
9d20: 20 20 20 20 20 65 5f 65 78 70 72 2d 31 38 2e 32       e_expr-18.2
9d30: 2e 32 20 7b 20 73 65 74 20 72 65 67 65 78 70 61  .2 { set regexpa
9d40: 72 67 73 20 7d 20 7b 64 65 66 20 61 62 63 7d 0a  rgs } {def abc}.
9d50: 73 65 74 20 3a 3a 72 65 67 65 78 70 61 72 67 73  set ::regexpargs
9d60: 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73   [list].do_execs
9d70: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
9d80: 38 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 27  8.2.3 { SELECT '
9d90: 58 27 20 4e 4f 54 20 52 45 47 45 58 50 20 27 59  X' NOT REGEXP 'Y
9da0: 27 20 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20 20  ' } 0.do_test   
9db0: 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31 38 2e        e_expr-18.
9dc0: 32 2e 34 20 7b 20 73 65 74 20 72 65 67 65 78 70  2.4 { set regexp
9dd0: 61 72 67 73 20 7d 20 7b 59 20 58 7d 0a 73 71 6c  args } {Y X}.sql
9de0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
9df0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
9e00: 52 2d 34 32 30 33 37 2d 33 37 38 32 36 20 54 68  R-42037-37826 Th
9e10: 65 20 64 65 66 61 75 6c 74 20 6d 61 74 63 68 28  e default match(
9e20: 29 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65  ) function imple
9e30: 6d 65 6e 74 61 74 69 6f 6e 0a 23 20 72 61 69 73  mentation.# rais
9e40: 65 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  es an exception 
9e50: 61 6e 64 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  and is not reall
9e60: 79 20 75 73 65 66 75 6c 20 66 6f 72 20 61 6e 79  y useful for any
9e70: 74 68 69 6e 67 2e 0a 23 0a 64 6f 5f 63 61 74 63  thing..#.do_catc
9e80: 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  hsql_test e_expr
9e90: 2d 31 39 2e 31 2e 31 20 7b 20 0a 20 20 53 45 4c  -19.1.1 { .  SEL
9ea0: 45 43 54 20 27 61 62 63 27 20 4d 41 54 43 48 20  ECT 'abc' MATCH 
9eb0: 27 64 65 66 27 20 0a 7d 20 7b 31 20 7b 75 6e 61  'def' .} {1 {una
9ec0: 62 6c 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74  ble to use funct
9ed0: 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74 68 65  ion MATCH in the
9ee0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6e 74 65   requested conte
9ef0: 78 74 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  xt}}.do_catchsql
9f00: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 39 2e  _test e_expr-19.
9f10: 31 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  1.2 { .  SELECT 
9f20: 6d 61 74 63 68 28 27 61 62 63 27 2c 20 27 64 65  match('abc', 'de
9f30: 66 27 29 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65  f').} {1 {unable
9f40: 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e   to use function
9f50: 20 4d 41 54 43 48 20 69 6e 20 74 68 65 20 72 65   MATCH in the re
9f60: 71 75 65 73 74 65 64 20 63 6f 6e 74 65 78 74 7d  quested context}
9f70: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
9f80: 3a 20 52 2d 33 37 39 31 36 2d 34 37 34 30 37 20  : R-37916-47407 
9f90: 54 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  The MATCH operat
9fa0: 6f 72 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  or is a special 
9fb0: 73 79 6e 74 61 78 20 66 6f 72 0a 23 20 74 68 65  syntax for.# the
9fc0: 20 6d 61 74 63 68 28 29 20 61 70 70 6c 69 63 61   match() applica
9fd0: 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 66 75 6e  tion-defined fun
9fe0: 63 74 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45  ction..#.# EVIDE
9ff0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 30 32 31 2d  NCE-OF: R-06021-
a000: 30 39 33 37 33 20 42 75 74 20 65 78 74 65 6e 73  09373 But extens
a010: 69 6f 6e 73 20 63 61 6e 20 6f 76 65 72 72 69 64  ions can overrid
a020: 65 20 74 68 65 20 6d 61 74 63 68 28 29 0a 23 20  e the match().# 
a030: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 6f  function with mo
a040: 72 65 20 68 65 6c 70 66 75 6c 20 6c 6f 67 69 63  re helpful logic
a050: 2e 0a 23 0a 70 72 6f 63 20 6d 61 74 63 68 66 75  ..#.proc matchfu
a060: 6e 63 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76  nc {args} {.  ev
a070: 61 6c 20 6c 61 70 70 65 6e 64 20 3a 3a 6d 61 74  al lappend ::mat
a080: 63 68 61 72 67 73 20 24 61 72 67 73 0a 20 20 72  chargs $args.  r
a090: 65 74 75 72 6e 20 31 0a 7d 0a 64 62 20 66 75 6e  eturn 1.}.db fun
a0a0: 63 20 6d 61 74 63 68 20 2d 61 72 67 63 6f 75 6e  c match -argcoun
a0b0: 74 20 32 20 6d 61 74 63 68 66 75 6e 63 0a 73 65  t 2 matchfunc.se
a0c0: 74 20 3a 3a 6d 61 74 63 68 61 72 67 73 20 5b 6c  t ::matchargs [l
a0d0: 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ist].do_execsql_
a0e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 39 2e 32  test e_expr-19.2
a0f0: 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .1 { SELECT 'abc
a100: 27 20 4d 41 54 43 48 20 27 64 65 66 27 20 7d 20  ' MATCH 'def' } 
a110: 31 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  1.do_test       
a120: 20 20 65 5f 65 78 70 72 2d 31 39 2e 32 2e 32 20    e_expr-19.2.2 
a130: 7b 20 73 65 74 20 6d 61 74 63 68 61 72 67 73 20  { set matchargs 
a140: 7d 20 7b 64 65 66 20 61 62 63 7d 0a 73 65 74 20  } {def abc}.set 
a150: 3a 3a 6d 61 74 63 68 61 72 67 73 20 5b 6c 69 73  ::matchargs [lis
a160: 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  t].do_execsql_te
a170: 73 74 20 65 5f 65 78 70 72 2d 31 39 2e 32 2e 33  st e_expr-19.2.3
a180: 20 7b 20 53 45 4c 45 43 54 20 27 58 27 20 4e 4f   { SELECT 'X' NO
a190: 54 20 4d 41 54 43 48 20 27 59 27 20 7d 20 30 0a  T MATCH 'Y' } 0.
a1a0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
a1b0: 65 5f 65 78 70 72 2d 31 39 2e 32 2e 34 20 7b 20  e_expr-19.2.4 { 
a1c0: 73 65 74 20 6d 61 74 63 68 61 72 67 73 20 7d 20  set matchargs } 
a1d0: 7b 59 20 58 7d 0a 73 71 6c 69 74 65 33 20 64 62  {Y X}.sqlite3 db
a1e0: 20 74 65 73 74 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d   test.db..#-----
a1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a230: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65  ----.# Test case
a240: 73 20 66 6f 72 20 74 68 65 20 74 65 73 74 61 62  s for the testab
a250: 6c 65 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65  le statements re
a260: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 43 41 53  lated to the CAS
a270: 45 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23 0a  E expression..#.
a280: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
a290: 2d 31 35 31 39 39 2d 36 31 33 38 39 20 54 68 65  -15199-61389 The
a2a0: 72 65 20 61 72 65 20 74 77 6f 20 62 61 73 69 63  re are two basic
a2b0: 20 66 6f 72 6d 73 20 6f 66 20 74 68 65 20 43 41   forms of the CA
a2c0: 53 45 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 3a  SE.# expression:
a2d0: 20 74 68 6f 73 65 20 77 69 74 68 20 61 20 62 61   those with a ba
a2e0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  se expression an
a2f0: 64 20 74 68 6f 73 65 20 77 69 74 68 6f 75 74 2e  d those without.
a300: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
a310: 73 74 20 65 5f 65 78 70 72 2d 32 30 2e 31 20 7b  st e_expr-20.1 {
a320: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57  .  SELECT CASE W
a330: 48 45 4e 20 31 20 54 48 45 4e 20 27 74 72 75 65  HEN 1 THEN 'true
a340: 27 20 57 48 45 4e 20 30 20 54 48 45 4e 20 27 66  ' WHEN 0 THEN 'f
a350: 61 6c 73 65 27 20 45 4c 53 45 20 27 65 6c 73 65  alse' ELSE 'else
a360: 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a  ' END;.} {true}.
a370: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
a380: 65 5f 65 78 70 72 2d 32 30 2e 32 20 7b 0a 20 20  e_expr-20.2 {.  
a390: 53 45 4c 45 43 54 20 43 41 53 45 20 30 20 57 48  SELECT CASE 0 WH
a3a0: 45 4e 20 31 20 54 48 45 4e 20 27 74 72 75 65 27  EN 1 THEN 'true'
a3b0: 20 57 48 45 4e 20 30 20 54 48 45 4e 20 27 66 61   WHEN 0 THEN 'fa
a3c0: 6c 73 65 27 20 45 4c 53 45 20 27 65 6c 73 65 27  lse' ELSE 'else'
a3d0: 20 45 4e 44 3b 0a 7d 20 7b 66 61 6c 73 65 7d 0a   END;.} {false}.
a3e0: 0a 70 72 6f 63 20 76 61 72 20 7b 6e 6d 7d 20 7b  .proc var {nm} {
a3f0: 0a 20 20 6c 61 70 70 65 6e 64 20 3a 3a 76 61 72  .  lappend ::var
a400: 6c 69 73 74 20 24 6e 6d 0a 20 20 72 65 74 75 72  list $nm.  retur
a410: 6e 20 5b 73 65 74 20 22 3a 3a 24 6e 6d 22 5d 0a  n [set "::$nm"].
a420: 7d 0a 64 62 20 66 75 6e 63 20 76 61 72 20 76 61  }.db func var va
a430: 72 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  r..# EVIDENCE-OF
a440: 3a 20 52 2d 33 30 36 33 38 2d 35 39 39 35 34 20  : R-30638-59954 
a450: 49 6e 20 61 20 43 41 53 45 20 77 69 74 68 6f 75  In a CASE withou
a460: 74 20 61 20 62 61 73 65 20 65 78 70 72 65 73 73  t a base express
a470: 69 6f 6e 2c 20 65 61 63 68 0a 23 20 57 48 45 4e  ion, each.# WHEN
a480: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
a490: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74 68 65  valuated and the
a4a0: 20 72 65 73 75 6c 74 20 74 72 65 61 74 65 64 20   result treated 
a4b0: 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 0a 23 20  as a boolean,.# 
a4c0: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68  starting with th
a4d0: 65 20 6c 65 66 74 6d 6f 73 74 20 61 6e 64 20 63  e leftmost and c
a4e0: 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
a4f0: 20 72 69 67 68 74 2e 0a 23 0a 66 6f 72 65 61 63   right..#.foreac
a500: 68 20 7b 61 20 62 20 63 7d 20 7b 30 20 30 20 30  h {a b c} {0 0 0
a510: 7d 20 62 72 65 61 6b 0a 73 65 74 20 76 61 72 6c  } break.set varl
a520: 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  ist [list].do_ex
a530: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
a540: 72 2d 32 31 2e 31 2e 31 20 7b 0a 20 20 53 45 4c  r-21.1.1 {.  SEL
a550: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61  ECT CASE WHEN va
a560: 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20  r('a') THEN 'A' 
a570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
a580: 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45  HEN var('b') THE
a590: 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20  N 'B' .         
a5a0: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63       WHEN var('c
a5b0: 27 29 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a  ') THEN 'C' END.
a5c0: 7d 20 7b 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65  } {{}}.do_test e
a5d0: 5f 65 78 70 72 2d 32 31 2e 31 2e 32 20 7b 20 73  _expr-21.1.2 { s
a5e0: 65 74 20 76 61 72 6c 69 73 74 20 7d 20 7b 61 20  et varlist } {a 
a5f0: 62 20 63 7d 0a 73 65 74 20 76 61 72 6c 69 73 74  b c}.set varlist
a600: 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73   [list].do_execs
a610: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
a620: 31 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  1.1.3 {.  SELECT
a630: 20 43 41 53 45 20 57 48 45 4e 20 76 61 72 28 27   CASE WHEN var('
a640: 63 27 29 20 54 48 45 4e 20 27 43 27 20 0a 20 20  c') THEN 'C' .  
a650: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e              WHEN
a660: 20 76 61 72 28 27 62 27 29 20 54 48 45 4e 20 27   var('b') THEN '
a670: 42 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  B' .            
a680: 20 20 57 48 45 4e 20 76 61 72 28 27 61 27 29 20    WHEN var('a') 
a690: 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20  THEN 'A' .      
a6a0: 20 20 20 20 20 20 20 20 45 4c 53 45 20 27 6e 6f          ELSE 'no
a6b0: 20 72 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d   result'.  END.}
a6c0: 20 7b 7b 6e 6f 20 72 65 73 75 6c 74 7d 7d 0a 64   {{no result}}.d
a6d0: 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31  o_test e_expr-21
a6e0: 2e 31 2e 34 20 7b 20 73 65 74 20 76 61 72 6c 69  .1.4 { set varli
a6f0: 73 74 20 7d 20 7b 63 20 62 20 61 7d 0a 0a 23 20  st } {c b a}..# 
a700: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
a710: 39 30 30 39 2d 32 35 35 39 36 20 54 68 65 20 72  9009-25596 The r
a720: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 43 41 53  esult of the CAS
a730: 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  E expression is 
a740: 74 68 65 0a 23 20 65 76 61 6c 75 61 74 69 6f 6e  the.# evaluation
a750: 20 6f 66 20 74 68 65 20 54 48 45 4e 20 65 78 70   of the THEN exp
a760: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 72  ression that cor
a770: 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
a780: 66 69 72 73 74 20 57 48 45 4e 0a 23 20 65 78 70  first WHEN.# exp
a790: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61  ression that eva
a7a0: 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65 2e 0a  luates to true..
a7b0: 23 0a 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63  #.foreach {a b c
a7c0: 7d 20 7b 30 20 31 20 30 7d 20 62 72 65 61 6b 0a  } {0 1 0} break.
a7d0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
a7e0: 65 5f 65 78 70 72 2d 32 31 2e 32 2e 31 20 7b 0a  e_expr-21.2.1 {.
a7f0: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48    SELECT CASE WH
a800: 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e  EN var('a') THEN
a810: 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20   'A' .          
a820: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62 27      WHEN var('b'
a830: 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20  ) THEN 'B' .    
a840: 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76            WHEN v
a850: 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43 27  ar('c') THEN 'C'
a860: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
a870: 45 4c 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27  ELSE 'no result'
a880: 0a 20 20 45 4e 44 0a 7d 20 7b 42 7d 0a 66 6f 72  .  END.} {B}.for
a890: 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20  each {a b c} {0 
a8a0: 31 20 31 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78  1 1} break.do_ex
a8b0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
a8c0: 72 2d 32 31 2e 32 2e 32 20 7b 0a 20 20 53 45 4c  r-21.2.2 {.  SEL
a8d0: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61  ECT CASE WHEN va
a8e0: 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20  r('a') THEN 'A' 
a8f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
a900: 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45  HEN var('b') THE
a910: 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20  N 'B' .         
a920: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63       WHEN var('c
a930: 27 29 20 54 48 45 4e 20 27 43 27 0a 20 20 20 20  ') THEN 'C'.    
a940: 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 27            ELSE '
a950: 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20 45 4e 44  no result'.  END
a960: 0a 7d 20 7b 42 7d 0a 66 6f 72 65 61 63 68 20 7b  .} {B}.foreach {
a970: 61 20 62 20 63 7d 20 7b 30 20 30 20 31 7d 20 62  a b c} {0 0 1} b
a980: 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  reak.do_execsql_
a990: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 32  test e_expr-21.2
a9a0: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .3 {.  SELECT CA
a9b0: 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27 29  SE WHEN var('a')
a9c0: 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20   THEN 'A' .     
a9d0: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
a9e0: 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20  r('b') THEN 'B' 
a9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
aa00: 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45  HEN var('c') THE
aa10: 4e 20 27 43 27 0a 20 20 20 20 20 20 20 20 20 20  N 'C'.          
aa20: 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72 65 73      ELSE 'no res
aa30: 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 43 7d  ult'.  END.} {C}
aa40: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
aa50: 20 52 2d 32 34 32 32 37 2d 30 34 38 30 37 20 4f   R-24227-04807 O
aa60: 72 2c 20 69 66 20 6e 6f 6e 65 20 6f 66 20 74 68  r, if none of th
aa70: 65 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f  e WHEN expressio
aa80: 6e 73 0a 23 20 65 76 61 6c 75 61 74 65 20 74 6f  ns.# evaluate to
aa90: 20 74 72 75 65 2c 20 74 68 65 20 72 65 73 75 6c   true, the resul
aaa0: 74 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20  t of evaluating 
aab0: 74 68 65 20 45 4c 53 45 20 65 78 70 72 65 73 73  the ELSE express
aac0: 69 6f 6e 2c 20 69 66 0a 23 20 61 6e 79 2e 0a 23  ion, if.# any..#
aad0: 0a 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d  .foreach {a b c}
aae0: 20 7b 30 20 30 20 30 7d 20 62 72 65 61 6b 0a 64   {0 0 0} break.d
aaf0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
ab00: 5f 65 78 70 72 2d 32 31 2e 33 2e 31 20 7b 0a 20  _expr-21.3.1 {. 
ab10: 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
ab20: 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20  N var('a') THEN 
ab30: 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'A' .           
ab40: 20 20 20 57 48 45 4e 20 76 61 72 28 27 62 27 29     WHEN var('b')
ab50: 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20   THEN 'B' .     
ab60: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
ab70: 72 28 27 63 27 29 20 54 48 45 4e 20 27 43 27 0a  r('c') THEN 'C'.
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c                EL
ab90: 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20  SE 'no result'. 
aba0: 20 45 4e 44 0a 7d 20 7b 7b 6e 6f 20 72 65 73 75   END.} {{no resu
abb0: 6c 74 7d 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  lt}}..# EVIDENCE
abc0: 2d 4f 46 3a 20 52 2d 31 34 31 36 38 2d 30 37 35  -OF: R-14168-075
abd0: 37 39 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  79 If there is n
abe0: 6f 20 45 4c 53 45 20 65 78 70 72 65 73 73 69 6f  o ELSE expressio
abf0: 6e 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 0a 23 20  n and none of.# 
ac00: 74 68 65 20 57 48 45 4e 20 65 78 70 72 65 73 73  the WHEN express
ac10: 69 6f 6e 73 20 61 72 65 20 74 72 75 65 2c 20 74  ions are true, t
ac20: 68 65 6e 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  hen the overall 
ac30: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
ac40: 23 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 6e  #.db nullvalue n
ac50: 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ull.do_execsql_t
ac60: 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 33 2e  est e_expr-21.3.
ac70: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  2 {.  SELECT CAS
ac80: 45 20 57 48 45 4e 20 76 61 72 28 27 61 27 29 20  E WHEN var('a') 
ac90: 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20  THEN 'A' .      
aca0: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
acb0: 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a  ('b') THEN 'B' .
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
acd0: 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45 4e  EN var('c') THEN
ace0: 20 27 43 27 0a 20 20 45 4e 44 0a 7d 20 7b 6e 75   'C'.  END.} {nu
acf0: 6c 6c 7d 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65  ll}.db nullvalue
ad00: 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   {}..# EVIDENCE-
ad10: 4f 46 3a 20 52 2d 31 33 39 34 33 2d 31 33 35 39  OF: R-13943-1359
ad20: 32 20 41 20 4e 55 4c 4c 20 72 65 73 75 6c 74 20  2 A NULL result 
ad30: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 75 6e  is considered un
ad40: 74 72 75 65 20 77 68 65 6e 0a 23 20 65 76 61 6c  true when.# eval
ad50: 75 61 74 69 6e 67 20 57 48 45 4e 20 74 65 72 6d  uating WHEN term
ad60: 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  s..#.do_execsql_
ad70: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 34  test e_expr-21.4
ad80: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .1 {.  SELECT CA
ad90: 53 45 20 57 48 45 4e 20 4e 55 4c 4c 20 54 48 45  SE WHEN NULL THE
ada0: 4e 20 27 41 27 20 57 48 45 4e 20 31 20 54 48 45  N 'A' WHEN 1 THE
adb0: 4e 20 27 42 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a  N 'B' END.} {B}.
adc0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
add0: 65 5f 65 78 70 72 2d 32 31 2e 34 2e 32 20 7b 0a  e_expr-21.4.2 {.
ade0: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48    SELECT CASE WH
adf0: 45 4e 20 30 20 54 48 45 4e 20 27 41 27 20 57 48  EN 0 THEN 'A' WH
ae00: 45 4e 20 4e 55 4c 4c 20 54 48 45 4e 20 27 42 27  EN NULL THEN 'B'
ae10: 20 45 4c 53 45 20 27 43 27 20 45 4e 44 0a 7d 20   ELSE 'C' END.} 
ae20: 7b 43 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  {C}..# EVIDENCE-
ae30: 4f 46 3a 20 52 2d 33 38 36 32 30 2d 31 39 34 39  OF: R-38620-1949
ae40: 39 20 49 6e 20 61 20 43 41 53 45 20 77 69 74 68  9 In a CASE with
ae50: 20 61 20 62 61 73 65 20 65 78 70 72 65 73 73 69   a base expressi
ae60: 6f 6e 2c 20 74 68 65 20 62 61 73 65 0a 23 20 65  on, the base.# e
ae70: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
ae80: 6c 75 61 74 65 64 20 6a 75 73 74 20 6f 6e 63 65  luated just once
ae90: 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20   and the result 
aea0: 69 73 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69  is compared agai
aeb0: 6e 73 74 0a 23 20 74 68 65 20 65 76 61 6c 75 61  nst.# the evalua
aec0: 74 69 6f 6e 20 6f 66 20 65 61 63 68 20 57 48 45  tion of each WHE
aed0: 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  N expression fro
aee0: 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
aef0: 0a 23 0a 23 20 4e 6f 74 65 3a 20 54 68 69 73 20  .#.# Note: This 
af00: 74 65 73 74 20 63 61 73 65 20 74 65 73 74 73 20  test case tests 
af10: 74 68 65 20 22 65 76 61 6c 75 61 74 65 64 20 6a  the "evaluated j
af20: 75 73 74 20 6f 6e 63 65 22 20 70 61 72 74 20 6f  ust once" part o
af30: 66 20 74 68 65 20 61 62 6f 76 65 0a 23 20 73 74  f the above.# st
af40: 61 74 65 6d 65 6e 74 2e 20 54 65 73 74 73 20 61  atement. Tests a
af50: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
af60: 68 65 20 6e 65 78 74 20 74 77 6f 20 73 74 61 74  he next two stat
af70: 65 6d 65 6e 74 73 20 74 65 73 74 20 74 68 61 74  ements test that
af80: 20 74 68 65 0a 23 20 63 6f 6d 70 61 72 69 73 6f   the.# compariso
af90: 6e 73 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 23  ns take place..#
afa0: 0a 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d  .foreach {a b c}
afb0: 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 33 5d 20   [list [expr 3] 
afc0: 5b 65 78 70 72 20 34 5d 20 5b 65 78 70 72 20 35  [expr 4] [expr 5
afd0: 5d 5d 20 62 72 65 61 6b 0a 73 65 74 20 3a 3a 76  ]] break.set ::v
afe0: 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f  arlist [list].do
aff0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
b000: 65 78 70 72 2d 32 32 2e 31 2e 31 20 7b 0a 20 20  expr-22.1.1 {.  
b010: 53 45 4c 45 43 54 20 43 41 53 45 20 76 61 72 28  SELECT CASE var(
b020: 27 61 27 29 20 57 48 45 4e 20 31 20 54 48 45 4e  'a') WHEN 1 THEN
b030: 20 27 41 27 20 57 48 45 4e 20 32 20 54 48 45 4e   'A' WHEN 2 THEN
b040: 20 27 42 27 20 57 48 45 4e 20 33 20 54 48 45 4e   'B' WHEN 3 THEN
b050: 20 27 43 27 20 45 4e 44 0a 7d 20 7b 43 7d 0a 64   'C' END.} {C}.d
b060: 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32  o_test e_expr-22
b070: 2e 31 2e 32 20 7b 20 73 65 74 20 3a 3a 76 61 72  .1.2 { set ::var
b080: 6c 69 73 74 20 7d 20 7b 61 7d 0a 0a 23 20 45 56  list } {a}..# EV
b090: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 36  IDENCE-OF: R-076
b0a0: 36 37 2d 34 39 35 33 37 20 54 68 65 20 72 65 73  67-49537 The res
b0b0: 75 6c 74 20 6f 66 20 74 68 65 20 43 41 53 45 20  ult of the CASE 
b0c0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
b0d0: 65 0a 23 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  e.# evaluation o
b0e0: 66 20 74 68 65 20 54 48 45 4e 20 65 78 70 72 65  f the THEN expre
b0f0: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 72 72 65  ssion that corre
b100: 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 66 69  sponds to the fi
b110: 72 73 74 20 57 48 45 4e 0a 23 20 65 78 70 72 65  rst WHEN.# expre
b120: 73 73 69 6f 6e 20 66 6f 72 20 77 68 69 63 68 20  ssion for which 
b130: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
b140: 73 20 74 72 75 65 2e 0a 23 0a 64 6f 5f 65 78 65  s true..#.do_exe
b150: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
b160: 2d 32 32 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45  -22.2.1 {.  SELE
b170: 43 54 20 43 41 53 45 20 32 33 20 57 48 45 4e 20  CT CASE 23 WHEN 
b180: 31 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20  1 THEN 'A' WHEN 
b190: 32 33 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e  23 THEN 'B' WHEN
b1a0: 20 32 33 20 54 48 45 4e 20 27 43 27 20 45 4e 44   23 THEN 'C' END
b1b0: 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71  .} {B}.do_execsq
b1c0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32  l_test e_expr-22
b1d0: 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .2.2 {.  SELECT 
b1e0: 43 41 53 45 20 31 20 57 48 45 4e 20 31 20 54 48  CASE 1 WHEN 1 TH
b1f0: 45 4e 20 27 41 27 20 57 48 45 4e 20 32 33 20 54  EN 'A' WHEN 23 T
b200: 48 45 4e 20 27 42 27 20 57 48 45 4e 20 32 33 20  HEN 'B' WHEN 23 
b210: 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20 7b  THEN 'C' END.} {
b220: 41 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  A}..# EVIDENCE-O
b230: 46 3a 20 52 2d 34 37 35 34 33 2d 33 32 31 34 35  F: R-47543-32145
b240: 20 4f 72 2c 20 69 66 20 6e 6f 6e 65 20 6f 66 20   Or, if none of 
b250: 74 68 65 20 57 48 45 4e 20 65 78 70 72 65 73 73  the WHEN express
b260: 69 6f 6e 73 0a 23 20 65 76 61 6c 75 61 74 65 20  ions.# evaluate 
b270: 74 6f 20 61 20 76 61 6c 75 65 20 65 71 75 61 6c  to a value equal
b280: 20 74 6f 20 74 68 65 20 62 61 73 65 20 65 78 70   to the base exp
b290: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 72 65 73  ression, the res
b2a0: 75 6c 74 20 6f 66 0a 23 20 65 76 61 6c 75 61 74  ult of.# evaluat
b2b0: 69 6e 67 20 74 68 65 20 45 4c 53 45 20 65 78 70  ing the ELSE exp
b2c0: 72 65 73 73 69 6f 6e 2c 20 69 66 20 61 6e 79 2e  ression, if any.
b2d0: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
b2e0: 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 33 2e 31  st e_expr-22.3.1
b2f0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
b300: 20 32 34 20 57 48 45 4e 20 31 20 54 48 45 4e 20   24 WHEN 1 THEN 
b310: 27 41 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e  'A' WHEN 23 THEN
b320: 20 27 42 27 20 57 48 45 4e 20 32 33 20 54 48 45   'B' WHEN 23 THE
b330: 4e 20 27 43 27 20 45 4c 53 45 20 27 44 27 20 45  N 'C' ELSE 'D' E
b340: 4e 44 0a 7d 20 7b 44 7d 0a 0a 23 20 45 56 49 44  ND.} {D}..# EVID
b350: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 37 32 31  ENCE-OF: R-54721
b360: 2d 34 38 35 35 37 20 49 66 20 74 68 65 72 65 20  -48557 If there 
b370: 69 73 20 6e 6f 20 45 4c 53 45 20 65 78 70 72 65  is no ELSE expre
b380: 73 73 69 6f 6e 20 61 6e 64 20 6e 6f 6e 65 20 6f  ssion and none o
b390: 66 0a 23 20 74 68 65 20 57 48 45 4e 20 65 78 70  f.# the WHEN exp
b3a0: 72 65 73 73 69 6f 6e 73 20 70 72 6f 64 75 63 65  ressions produce
b3b0: 20 61 20 72 65 73 75 6c 74 20 65 71 75 61 6c 20   a result equal 
b3c0: 74 6f 20 74 68 65 20 62 61 73 65 20 65 78 70 72  to the base expr
b3d0: 65 73 73 69 6f 6e 2c 0a 23 20 74 68 65 20 6f 76  ession,.# the ov
b3e0: 65 72 61 6c 6c 20 72 65 73 75 6c 74 20 69 73 20  erall result is 
b3f0: 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  NULL..#.do_execs
b400: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
b410: 32 2e 34 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  2.4.1 {.  SELECT
b420: 20 43 41 53 45 20 32 34 20 57 48 45 4e 20 31 20   CASE 24 WHEN 1 
b430: 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32 33  THEN 'A' WHEN 23
b440: 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20 32   THEN 'B' WHEN 2
b450: 33 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d  3 THEN 'C' END.}
b460: 20 7b 7b 7d 7d 0a 64 62 20 6e 75 6c 6c 76 61 6c   {{}}.db nullval
b470: 75 65 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73  ue null.do_execs
b480: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
b490: 32 2e 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  2.4.2 {.  SELECT
b4a0: 20 43 41 53 45 20 32 34 20 57 48 45 4e 20 31 20   CASE 24 WHEN 1 
b4b0: 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32 33  THEN 'A' WHEN 23
b4c0: 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20 32   THEN 'B' WHEN 2
b4d0: 33 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d  3 THEN 'C' END.}
b4e0: 20 7b 6e 75 6c 6c 7d 0a 64 62 20 6e 75 6c 6c 76   {null}.db nullv
b4f0: 61 6c 75 65 20 7b 7d 0a 0a 23 20 45 56 49 44 45  alue {}..# EVIDE
b500: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 37 39 2d  NCE-OF: R-11479-
b510: 36 32 37 37 34 20 57 68 65 6e 20 63 6f 6d 70 61  62774 When compa
b520: 72 69 6e 67 20 61 20 62 61 73 65 20 65 78 70 72  ring a base expr
b530: 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61  ession against a
b540: 0a 23 20 57 48 45 4e 20 65 78 70 72 65 73 73 69  .# WHEN expressi
b550: 6f 6e 2c 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  on, the same col
b560: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c  lating sequence,
b570: 20 61 66 66 69 6e 69 74 79 2c 20 61 6e 64 0a 23   affinity, and.#
b580: 20 4e 55 4c 4c 2d 68 61 6e 64 6c 69 6e 67 20 72   NULL-handling r
b590: 75 6c 65 73 20 61 70 70 6c 79 20 61 73 20 69 66  ules apply as if
b5a0: 20 74 68 65 20 62 61 73 65 20 65 78 70 72 65 73   the base expres
b5b0: 73 69 6f 6e 20 61 6e 64 20 57 48 45 4e 0a 23 20  sion and WHEN.# 
b5c0: 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 72  expression are r
b5d0: 65 73 70 65 63 74 69 76 65 6c 79 20 74 68 65 20  espectively the 
b5e0: 6c 65 66 74 2d 20 61 6e 64 20 72 69 67 68 74 2d  left- and right-
b5f0: 68 61 6e 64 20 6f 70 65 72 61 6e 64 73 20 6f 66  hand operands of
b600: 20 61 6e 20 3d 0a 23 20 6f 70 65 72 61 74 6f 72   an =.# operator
b610: 2e 0a 23 0a 70 72 6f 63 20 72 65 76 20 7b 73 74  ..#.proc rev {st
b620: 72 7d 20 7b 0a 20 20 73 65 74 20 72 65 74 20 22  r} {.  set ret "
b630: 22 0a 20 20 73 65 74 20 63 68 61 72 73 20 5b 73  ".  set chars [s
b640: 70 6c 69 74 20 24 73 74 72 5d 0a 20 20 66 6f 72  plit $str].  for
b650: 20 7b 73 65 74 20 69 20 5b 65 78 70 72 20 5b 6c   {set i [expr [l
b660: 6c 65 6e 67 74 68 20 24 63 68 61 72 73 5d 2d 31  length $chars]-1
b670: 5d 7d 20 7b 24 69 3e 3d 30 7d 20 7b 69 6e 63 72  ]} {$i>=0} {incr
b680: 20 69 20 2d 31 7d 20 7b 0a 20 20 20 20 61 70 70   i -1} {.    app
b690: 65 6e 64 20 72 65 74 20 5b 6c 69 6e 64 65 78 20  end ret [lindex 
b6a0: 24 63 68 61 72 73 20 24 69 5d 0a 20 20 7d 0a 20  $chars $i].  }. 
b6b0: 20 73 65 74 20 72 65 74 0a 7d 0a 70 72 6f 63 20   set ret.}.proc 
b6c0: 72 65 76 65 72 73 65 20 7b 6c 68 73 20 72 68 73  reverse {lhs rhs
b6d0: 7d 20 7b 0a 20 20 73 74 72 69 6e 67 20 63 6f 6d  } {.  string com
b6e0: 70 61 72 65 20 5b 72 65 76 20 24 6c 68 73 5d 20  pare [rev $lhs] 
b6f0: 5b 72 65 66 20 24 72 68 73 5d 0a 7d 0a 64 62 20  [ref $rhs].}.db 
b700: 63 6f 6c 6c 61 74 65 20 72 65 76 65 72 73 65 20  collate reverse 
b710: 72 65 76 65 72 73 65 0a 64 6f 5f 65 78 65 63 73  reverse.do_execs
b720: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
b730: 33 2e 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  3.1.1 {.  CREATE
b740: 20 54 41 42 4c 45 20 74 31 28 0a 20 20 20 20 61   TABLE t1(.    a
b750: 20 54 45 58 54 20 20 20 20 20 43 4f 4c 4c 41 54   TEXT     COLLAT
b760: 45 20 4e 4f 43 41 53 45 2c 0a 20 20 20 20 62 20  E NOCASE,.    b 
b770: 20 20 20 20 20 20 20 20 20 43 4f 4c 4c 41 54 45           COLLATE
b780: 20 52 45 56 45 52 53 45 2c 0a 20 20 20 20 63 20   REVERSE,.    c 
b790: 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 64 20 42  INTEGER,.    d B
b7a0: 4c 4f 42 0a 20 20 29 3b 0a 20 20 49 4e 53 45 52  LOB.  );.  INSER
b7b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
b7c0: 28 27 61 62 63 27 2c 20 27 63 62 61 27 2c 20 35  ('abc', 'cba', 5
b7d0: 35 2c 20 33 34 2e 35 29 3b 0a 7d 20 7b 7d 0a 64  5, 34.5);.} {}.d
b7e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
b7f0: 5f 65 78 70 72 2d 32 33 2e 31 2e 32 20 7b 0a 20  _expr-23.1.2 {. 
b800: 20 53 45 4c 45 43 54 20 43 41 53 45 20 61 20 57   SELECT CASE a W
b810: 48 45 4e 20 27 78 79 7a 27 20 54 48 45 4e 20 27  HEN 'xyz' THEN '
b820: 41 27 20 57 48 45 4e 20 27 41 62 43 27 20 54 48  A' WHEN 'AbC' TH
b830: 45 4e 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20  EN 'B' END FROM 
b840: 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63  t1.} {B}.do_exec
b850: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
b860: 32 33 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43  23.1.3 {.  SELEC
b870: 54 20 43 41 53 45 20 27 41 62 43 27 20 57 48 45  T CASE 'AbC' WHE
b880: 4e 20 27 61 62 63 27 20 54 48 45 4e 20 27 41 27  N 'abc' THEN 'A'
b890: 20 57 48 45 4e 20 61 20 54 48 45 4e 20 27 42 27   WHEN a THEN 'B'
b8a0: 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b   END FROM t1.} {
b8b0: 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  B}.do_execsql_te
b8c0: 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 34  st e_expr-23.1.4
b8d0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
b8e0: 20 61 20 57 48 45 4e 20 62 20 54 48 45 4e 20 27   a WHEN b THEN '
b8f0: 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 20  A' ELSE 'B' END 
b900: 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f  FROM t1.} {B}.do
b910: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
b920: 65 78 70 72 2d 32 33 2e 31 2e 35 20 7b 0a 20 20  expr-23.1.5 {.  
b930: 53 45 4c 45 43 54 20 43 41 53 45 20 62 20 57 48  SELECT CASE b WH
b940: 45 4e 20 61 20 54 48 45 4e 20 27 41 27 20 45 4c  EN a THEN 'A' EL
b950: 53 45 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20  SE 'B' END FROM 
b960: 74 31 0a 7d 20 7b 41 7d 0a 64 6f 5f 65 78 65 63  t1.} {A}.do_exec
b970: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
b980: 32 33 2e 31 2e 36 20 7b 0a 20 20 53 45 4c 45 43  23.1.6 {.  SELEC
b990: 54 20 43 41 53 45 20 35 35 20 57 48 45 4e 20 27  T CASE 55 WHEN '
b9a0: 35 35 27 20 54 48 45 4e 20 27 41 27 20 45 4c 53  55' THEN 'A' ELS
b9b0: 45 20 27 42 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a  E 'B' END.} {B}.
b9c0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
b9d0: 65 5f 65 78 70 72 2d 32 33 2e 31 2e 37 20 7b 0a  e_expr-23.1.7 {.
b9e0: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 63 20    SELECT CASE c 
b9f0: 57 48 45 4e 20 27 35 35 27 20 54 48 45 4e 20 27  WHEN '55' THEN '
ba00: 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 20  A' ELSE 'B' END 
ba10: 46 52 4f 4d 20 74 31 0a 7d 20 7b 41 7d 0a 64 6f  FROM t1.} {A}.do
ba20: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
ba30: 65 78 70 72 2d 32 33 2e 31 2e 38 20 7b 0a 20 20  expr-23.1.8 {.  
ba40: 53 45 4c 45 43 54 20 43 41 53 45 20 27 33 34 2e  SELECT CASE '34.
ba50: 35 27 20 57 48 45 4e 20 64 20 54 48 45 4e 20 27  5' WHEN d THEN '
ba60: 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 20  A' ELSE 'B' END 
ba70: 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f  FROM t1.} {B}.do
ba80: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
ba90: 65 78 70 72 2d 32 33 2e 31 2e 39 20 7b 0a 20 20  expr-23.1.9 {.  
baa0: 53 45 4c 45 43 54 20 43 41 53 45 20 4e 55 4c 4c  SELECT CASE NULL
bab0: 20 57 48 45 4e 20 4e 55 4c 4c 20 54 48 45 4e 20   WHEN NULL 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 0a 23 20 45 56 49 44 45 4e  .} {B}..# EVIDEN
bae0: 43 45 2d 4f 46 3a 20 52 2d 33 37 33 30 34 2d 33  CE-OF: R-37304-3
baf0: 39 34 30 35 20 49 66 20 74 68 65 20 62 61 73 65  9405 If the base
bb00: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 4e   expression is N
bb10: 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 23 20 72  ULL then the.# r
bb20: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 43 41 53  esult of the CAS
bb30: 45 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  E is always the 
bb40: 72 65 73 75 6c 74 20 6f 66 20 65 76 61 6c 75 61  result of evalua
bb50: 74 69 6e 67 20 74 68 65 20 45 4c 53 45 0a 23 20  ting the ELSE.# 
bb60: 65 78 70 72 65 73 73 69 6f 6e 20 69 66 20 69 74  expression if it
bb70: 20 65 78 69 73 74 73 2c 20 6f 72 20 4e 55 4c 4c   exists, or NULL
bb80: 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
bb90: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
bba0: 73 74 20 65 5f 65 78 70 72 2d 32 34 2e 31 2e 31  st e_expr-24.1.1
bbb0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
bbc0: 20 4e 55 4c 4c 20 57 48 45 4e 20 27 61 62 63 27   NULL WHEN 'abc'
bbd0: 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 27   THEN 'A' WHEN '
bbe0: 64 65 66 27 20 54 48 45 4e 20 27 42 27 20 45 4e  def' THEN 'B' EN
bbf0: 44 3b 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65  D;.} {{}}.do_exe
bc00: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
bc10: 2d 32 34 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45  -24.1.2 {.  SELE
bc20: 43 54 20 43 41 53 45 20 4e 55 4c 4c 20 57 48 45  CT CASE NULL WHE
bc30: 4e 20 27 61 62 63 27 20 54 48 45 4e 20 27 41 27  N 'abc' THEN 'A'
bc40: 20 57 48 45 4e 20 27 64 65 66 27 20 54 48 45 4e   WHEN 'def' THEN
bc50: 20 27 42 27 20 45 4c 53 45 20 27 43 27 20 45 4e   'B' ELSE 'C' EN
bc60: 44 3b 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56 49 44  D;.} {C}..# EVID
bc70: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 32 38 30  ENCE-OF: R-56280
bc80: 2d 31 37 33 36 39 20 42 6f 74 68 20 66 6f 72 6d  -17369 Both form
bc90: 73 20 6f 66 20 74 68 65 20 43 41 53 45 20 65 78  s of the CASE ex
bca0: 70 72 65 73 73 69 6f 6e 20 75 73 65 20 6c 61 7a  pression use laz
bcb0: 79 2c 0a 23 20 6f 72 20 73 68 6f 72 74 2d 63 69  y,.# or short-ci
bcc0: 72 63 75 69 74 2c 20 65 76 61 6c 75 61 74 69 6f  rcuit, evaluatio
bcd0: 6e 2e 0a 23 0a 73 65 74 20 76 61 72 6c 69 73 74  n..#.set varlist
bce0: 20 5b 6c 69 73 74 5d 0a 66 6f 72 65 61 63 68 20   [list].foreach 
bcf0: 7b 61 20 62 20 63 7d 20 7b 30 20 31 20 30 7d 20  {a b c} {0 1 0} 
bd00: 62 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c  break.do_execsql
bd10: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 35 2e  _test e_expr-25.
bd20: 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.1 {.  SELECT C
bd30: 41 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27  ASE WHEN var('a'
bd40: 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20  ) THEN 'A' .    
bd50: 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76            WHEN v
bd60: 61 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27  ar('b') THEN 'B'
bd70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
bd80: 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48  WHEN var('c') TH
bd90: 45 4e 20 27 43 27 20 0a 20 20 45 4e 44 0a 7d 20  EN 'C' .  END.} 
bda0: 7b 42 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78  {B}.do_test e_ex
bdb0: 70 72 2d 32 35 2e 31 2e 32 20 7b 20 73 65 74 20  pr-25.1.2 { set 
bdc0: 3a 3a 76 61 72 6c 69 73 74 20 7d 20 7b 61 20 62  ::varlist } {a b
bdd0: 7d 0a 73 65 74 20 76 61 72 6c 69 73 74 20 5b 6c  }.set varlist [l
bde0: 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ist].do_execsql_
bdf0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 35 2e 31  test e_expr-25.1
be00: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .3 {.  SELECT CA
be10: 53 45 20 27 30 27 20 57 48 45 4e 20 76 61 72 28  SE '0' WHEN var(
be20: 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20  'a') THEN 'A' . 
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 57 48 45 4e 20 76 61 72 28 27 62 27 29 20 54   WHEN var('b') T
be50: 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20  HEN 'B' .       
be60: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
be70: 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43  var('c') THEN 'C
be80: 27 20 0a 20 20 45 4e 44 0a 7d 20 7b 41 7d 0a 64  ' .  END.} {A}.d
be90: 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 35  o_test e_expr-25
bea0: 2e 31 2e 34 20 7b 20 73 65 74 20 3a 3a 76 61 72  .1.4 { set ::var
beb0: 6c 69 73 74 20 7d 20 7b 61 7d 0a 0a 23 20 45 56  list } {a}..# EV
bec0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 37  IDENCE-OF: R-347
bed0: 37 33 2d 36 32 32 35 33 20 54 68 65 20 6f 6e 6c  73-62253 The onl
bee0: 79 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  y difference bet
bef0: 77 65 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ween the followi
bf00: 6e 67 0a 23 20 74 77 6f 20 43 41 53 45 20 65 78  ng.# two CASE ex
bf10: 70 72 65 73 73 69 6f 6e 73 20 69 73 20 74 68 61  pressions is tha
bf20: 74 20 74 68 65 20 78 20 65 78 70 72 65 73 73 69  t the x expressi
bf30: 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20  on is evaluated 
bf40: 65 78 61 63 74 6c 79 0a 23 20 6f 6e 63 65 20 69  exactly.# once i
bf50: 6e 20 74 68 65 20 66 69 72 73 74 20 65 78 61 6d  n the first exam
bf60: 70 6c 65 20 62 75 74 20 6d 69 67 68 74 20 62 65  ple but might be
bf70: 20 65 76 61 6c 75 61 74 65 64 20 6d 75 6c 74 69   evaluated multi
bf80: 70 6c 65 20 74 69 6d 65 73 20 69 6e 20 74 68 65  ple times in the
bf90: 0a 23 20 73 65 63 6f 6e 64 3a 20 43 41 53 45 20  .# second: CASE 
bfa0: 78 20 57 48 45 4e 20 77 31 20 54 48 45 4e 20 72  x WHEN w1 THEN r
bfb0: 31 20 57 48 45 4e 20 77 32 20 54 48 45 4e 20 72  1 WHEN w2 THEN r
bfc0: 32 20 45 4c 53 45 20 72 33 20 45 4e 44 20 43 41  2 ELSE r3 END CA
bfd0: 53 45 20 57 48 45 4e 0a 23 20 78 3d 77 31 20 54  SE WHEN.# x=w1 T
bfe0: 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 77 32  HEN r1 WHEN x=w2
bff0: 20 54 48 45 4e 20 72 32 20 45 4c 53 45 20 72 33   THEN r2 ELSE r3
c000: 20 45 4e 44 0a 23 0a 70 72 6f 63 20 63 65 76 61   END.#.proc ceva
c010: 6c 20 7b 78 7d 20 7b 0a 20 20 69 6e 63 72 20 3a  l {x} {.  incr :
c020: 3a 65 76 61 6c 63 6f 75 6e 74 0a 20 20 72 65 74  :evalcount.  ret
c030: 75 72 6e 20 24 78 0a 7d 0a 64 62 20 66 75 6e 63  urn $x.}.db func
c040: 20 63 65 76 61 6c 20 63 65 76 61 6c 0a 73 65 74   ceval ceval.set
c050: 20 3a 3a 65 76 61 6c 63 6f 75 6e 74 20 30 0a 0a   ::evalcount 0..
c060: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
c070: 65 5f 65 78 70 72 2d 32 36 2e 31 2e 31 20 7b 0a  e_expr-26.1.1 {.
c080: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
c090: 32 28 78 2c 20 77 31 2c 20 72 31 2c 20 77 32 2c  2(x, w1, r1, w2,
c0a0: 20 72 32 2c 20 72 33 29 3b 0a 20 20 49 4e 53 45   r2, r3);.  INSE
c0b0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
c0c0: 53 28 31 2c 20 31 2c 20 27 52 31 27 2c 20 32 2c  S(1, 1, 'R1', 2,
c0d0: 20 27 52 32 27 2c 20 27 52 33 27 29 3b 0a 20 20   'R2', 'R3');.  
c0e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
c0f0: 41 4c 55 45 53 28 32 2c 20 31 2c 20 27 52 31 27  ALUES(2, 1, 'R1'
c100: 2c 20 32 2c 20 27 52 32 27 2c 20 27 52 33 27 29  , 2, 'R2', 'R3')
c110: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
c120: 74 32 20 56 41 4c 55 45 53 28 33 2c 20 31 2c 20  t2 VALUES(3, 1, 
c130: 27 52 31 27 2c 20 32 2c 20 27 52 32 27 2c 20 27  'R1', 2, 'R2', '
c140: 52 33 27 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78  R3');.} {}.do_ex
c150: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
c160: 72 2d 32 36 2e 31 2e 32 20 7b 0a 20 20 53 45 4c  r-26.1.2 {.  SEL
c170: 45 43 54 20 43 41 53 45 20 78 20 57 48 45 4e 20  ECT CASE x WHEN 
c180: 77 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  w1 THEN r1 WHEN 
c190: 77 32 20 54 48 45 4e 20 72 32 20 45 4c 53 45 20  w2 THEN r2 ELSE 
c1a0: 72 33 20 45 4e 44 20 46 52 4f 4d 20 74 32 0a 7d  r3 END FROM t2.}
c1b0: 20 7b 52 31 20 52 32 20 52 33 7d 0a 64 6f 5f 65   {R1 R2 R3}.do_e
c1c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
c1d0: 70 72 2d 32 36 2e 31 2e 33 20 7b 0a 20 20 53 45  pr-26.1.3 {.  SE
c1e0: 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 78  LECT CASE WHEN x
c1f0: 3d 77 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =w1 THEN r1 WHEN
c200: 20 78 3d 77 32 20 54 48 45 4e 20 72 32 20 45 4c   x=w2 THEN r2 EL
c210: 53 45 20 72 33 20 45 4e 44 20 46 52 4f 4d 20 74  SE r3 END FROM t
c220: 32 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d 0a 0a  2.} {R1 R2 R3}..
c230: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
c240: 65 5f 65 78 70 72 2d 32 36 2e 31 2e 34 20 7b 0a  e_expr-26.1.4 {.
c250: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 63 65    SELECT CASE ce
c260: 76 61 6c 28 78 29 20 57 48 45 4e 20 77 31 20 54  val(x) WHEN w1 T
c270: 48 45 4e 20 72 31 20 57 48 45 4e 20 77 32 20 54  HEN r1 WHEN w2 T
c280: 48 45 4e 20 72 32 20 45 4c 53 45 20 72 33 20 45  HEN r2 ELSE r3 E
c290: 4e 44 20 46 52 4f 4d 20 74 32 0a 7d 20 7b 52 31  ND FROM t2.} {R1
c2a0: 20 52 32 20 52 33 7d 0a 64 6f 5f 74 65 73 74 20   R2 R3}.do_test 
c2b0: 65 5f 65 78 70 72 2d 32 36 2e 31 2e 35 20 7b 20  e_expr-26.1.5 { 
c2c0: 73 65 74 20 3a 3a 65 76 61 6c 63 6f 75 6e 74 20  set ::evalcount 
c2d0: 7d 20 7b 33 7d 0a 73 65 74 20 3a 3a 65 76 61 6c  } {3}.set ::eval
c2e0: 63 6f 75 6e 74 20 30 0a 64 6f 5f 65 78 65 63 73  count 0.do_execs
c2f0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
c300: 36 2e 31 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54  6.1.6 {.  SELECT
c310: 20 43 41 53 45 20 0a 20 20 20 20 57 48 45 4e 20   CASE .    WHEN 
c320: 63 65 76 61 6c 28 78 29 3d 77 31 20 54 48 45 4e  ceval(x)=w1 THEN
c330: 20 72 31 20 0a 20 20 20 20 57 48 45 4e 20 63 65   r1 .    WHEN ce
c340: 76 61 6c 28 78 29 3d 77 32 20 54 48 45 4e 20 72  val(x)=w2 THEN r
c350: 32 20 0a 20 20 20 20 45 4c 53 45 20 72 33 20 45  2 .    ELSE r3 E
c360: 4e 44 20 0a 20 20 46 52 4f 4d 20 74 32 0a 7d 20  ND .  FROM t2.} 
c370: 7b 52 31 20 52 32 20 52 33 7d 0a 64 6f 5f 74 65  {R1 R2 R3}.do_te
c380: 73 74 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 36  st e_expr-26.1.6
c390: 20 7b 20 73 65 74 20 3a 3a 65 76 61 6c 63 6f 75   { set ::evalcou
c3a0: 6e 74 20 7d 20 7b 35 7d 0a 0a 0a 23 2d 2d 2d 2d  nt } {5}...#----
c3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3f0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61  -----.# Test sta
c400: 74 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20  tements related 
c410: 74 6f 20 43 41 53 54 20 65 78 70 72 65 73 73 69  to CAST expressi
c420: 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ons..#.# EVIDENC
c430: 45 2d 4f 46 3a 20 52 2d 36 35 30 37 39 2d 33 31  E-OF: R-65079-31
c440: 37 35 38 20 41 70 70 6c 69 63 61 74 69 6f 6e 20  758 Application 
c450: 6f 66 20 61 20 43 41 53 54 20 65 78 70 72 65 73  of a CAST expres
c460: 73 69 6f 6e 20 69 73 0a 23 20 64 69 66 66 65 72  sion is.# differ
c470: 65 6e 74 20 74 6f 20 61 70 70 6c 69 63 61 74 69  ent to applicati
c480: 6f 6e 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 61  on of a column a
c490: 66 66 69 6e 69 74 79 2c 20 61 73 20 77 69 74 68  ffinity, as with
c4a0: 20 61 20 43 41 53 54 0a 23 20 65 78 70 72 65 73   a CAST.# expres
c4b0: 73 69 6f 6e 20 74 68 65 20 73 74 6f 72 61 67 65  sion the storage
c4c0: 20 63 6c 61 73 73 20 63 6f 6e 76 65 72 73 69 6f   class conversio
c4d0: 6e 20 69 73 20 66 6f 72 63 65 64 20 65 76 65 6e  n is forced even
c4e0: 20 69 66 20 69 74 20 69 73 20 6c 6f 73 73 79 0a   if it is lossy.
c4f0: 23 20 61 6e 64 20 69 72 72 72 65 76 65 72 73 69  # and irrreversi
c500: 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ble..#.do_execsq
c510: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  l_test e_expr-27
c520: 2e 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  .1.1 {.  CREATE 
c530: 54 41 42 4c 45 20 74 33 28 61 20 54 45 58 54 2c  TABLE t3(a TEXT,
c540: 20 62 20 52 45 41 4c 2c 20 63 20 49 4e 54 45 47   b REAL, c INTEG
c550: 45 52 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  ER);.  INSERT IN
c560: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 58 27 35  TO t3 VALUES(X'5
c570: 35 35 36 35 35 27 2c 20 27 31 2e 32 33 61 62 63  55655', '1.23abc
c580: 27 2c 20 34 2e 35 29 3b 0a 20 20 53 45 4c 45 43  ', 4.5);.  SELEC
c590: 54 20 74 79 70 65 6f 66 28 61 29 2c 20 61 2c 20  T typeof(a), a, 
c5a0: 74 79 70 65 6f 66 28 62 29 2c 20 62 2c 20 74 79  typeof(b), b, ty
c5b0: 70 65 6f 66 28 63 29 2c 20 63 20 46 52 4f 4d 20  peof(c), c FROM 
c5c0: 74 33 3b 0a 7d 20 7b 62 6c 6f 62 20 55 56 55 20  t3;.} {blob UVU 
c5d0: 74 65 78 74 20 31 2e 32 33 61 62 63 20 72 65 61  text 1.23abc rea
c5e0: 6c 20 34 2e 35 7d 0a 64 6f 5f 65 78 65 63 73 71  l 4.5}.do_execsq
c5f0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  l_test e_expr-27
c600: 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.2 {.  SELECT 
c610: 0a 20 20 20 20 74 79 70 65 6f 66 28 43 41 53 54  .    typeof(CAST
c620: 28 58 27 35 35 35 36 35 35 27 20 61 73 20 54 45  (X'555655' as TE
c630: 58 54 29 29 2c 20 43 41 53 54 28 58 27 35 35 35  XT)), CAST(X'555
c640: 36 35 35 27 20 61 73 20 54 45 58 54 29 2c 0a 20  655' as TEXT),. 
c650: 20 20 20 74 79 70 65 6f 66 28 43 41 53 54 28 27     typeof(CAST('
c660: 31 2e 32 33 61 62 63 27 20 61 73 20 52 45 41 4c  1.23abc' as REAL
c670: 29 29 2c 20 43 41 53 54 28 27 31 2e 32 33 61 62  )), CAST('1.23ab
c680: 63 27 20 61 73 20 52 45 41 4c 29 2c 0a 20 20 20  c' as REAL),.   
c690: 20 74 79 70 65 6f 66 28 43 41 53 54 28 34 2e 35   typeof(CAST(4.5
c6a0: 20 61 73 20 49 4e 54 45 47 45 52 29 29 2c 20 43   as INTEGER)), C
c6b0: 41 53 54 28 34 2e 35 20 61 73 20 49 4e 54 45 47  AST(4.5 as INTEG
c6c0: 45 52 29 0a 7d 20 7b 74 65 78 74 20 55 56 55 20  ER).} {text UVU 
c6d0: 72 65 61 6c 20 31 2e 32 33 20 69 6e 74 65 67 65  real 1.23 intege
c6e0: 72 20 34 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  r 4}..# EVIDENCE
c6f0: 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 36 35 30  -OF: R-27225-650
c700: 35 30 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  50 If the value 
c710: 6f 66 20 3c 65 78 70 72 3e 20 69 73 20 4e 55 4c  of <expr> is NUL
c720: 4c 2c 20 74 68 65 6e 0a 23 20 74 68 65 20 72 65  L, then.# the re
c730: 73 75 6c 74 20 6f 66 20 74 68 65 20 43 41 53 54  sult of the CAST
c740: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
c750: 6c 73 6f 20 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f 65  lso NULL..#.do_e
c760: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
c770: 32 37 2e 32 2e 31 20 7b 20 43 41 53 54 28 4e 55  27.2.1 { CAST(NU
c780: 4c 4c 20 41 53 20 69 6e 74 65 67 65 72 29 20 7d  LL AS integer) }
c790: 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72   null {}.do_expr
c7a0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
c7b0: 32 2e 32 20 7b 20 43 41 53 54 28 4e 55 4c 4c 20  2.2 { CAST(NULL 
c7c0: 41 53 20 74 65 78 74 29 20 7d 20 20 20 20 6e 75  AS text) }    nu
c7d0: 6c 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72 5f 74 65  ll {}.do_expr_te
c7e0: 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 32 2e 33  st e_expr-27.2.3
c7f0: 20 7b 20 43 41 53 54 28 4e 55 4c 4c 20 41 53 20   { CAST(NULL AS 
c800: 62 6c 6f 62 29 20 7d 20 20 20 20 6e 75 6c 6c 20  blob) }    null 
c810: 7b 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  {}.do_expr_test 
c820: 65 5f 65 78 70 72 2d 32 37 2e 32 2e 34 20 7b 20  e_expr-27.2.4 { 
c830: 43 41 53 54 28 4e 55 4c 4c 20 41 53 20 6e 75 6d  CAST(NULL AS num
c840: 62 65 72 29 20 7d 20 20 6e 75 6c 6c 20 7b 7d 0a  ber) }  null {}.
c850: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
c860: 52 2d 33 31 30 37 36 2d 32 33 35 37 35 20 43 61  R-31076-23575 Ca
c870: 73 74 69 6e 67 20 61 20 76 61 6c 75 65 20 74 6f  sting a value to
c880: 20 61 20 3c 74 79 70 65 2d 6e 61 6d 65 3e 20 77   a <type-name> w
c890: 69 74 68 0a 23 20 6e 6f 20 61 66 66 69 6e 69 74  ith.# no affinit
c8a0: 79 20 63 61 75 73 65 73 20 74 68 65 20 76 61 6c  y causes the val
c8b0: 75 65 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74  ue to be convert
c8c0: 65 64 20 69 6e 74 6f 20 61 20 42 4c 4f 42 2e 0a  ed into a BLOB..
c8d0: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
c8e0: 5f 65 78 70 72 2d 32 37 2e 33 2e 31 20 7b 20 43  _expr-27.3.1 { C
c8f0: 41 53 54 28 27 61 62 63 27 20 41 53 20 62 6c 6f  AST('abc' AS blo
c900: 62 29 20 20 20 20 20 20 20 7d 20 62 6c 6f 62 20  b)       } blob 
c910: 61 62 63 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  abc.do_expr_test
c920: 20 65 5f 65 78 70 72 2d 32 37 2e 33 2e 32 20 7b   e_expr-27.3.2 {
c930: 20 43 41 53 54 28 27 64 65 66 27 20 41 53 20 73   CAST('def' AS s
c940: 68 6f 62 62 6c 6f 62 5f 78 29 20 7d 20 62 6c 6f  hobblob_x) } blo
c950: 62 20 64 65 66 0a 64 6f 5f 65 78 70 72 5f 74 65  b def.do_expr_te
c960: 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 33 2e 33  st e_expr-27.3.3
c970: 20 7b 20 43 41 53 54 28 27 67 68 69 27 20 41 53   { CAST('ghi' AS
c980: 20 61 62 62 4c 4f 62 31 30 29 20 20 20 7d 20 62   abbLOb10)   } b
c990: 6c 6f 62 20 67 68 69 0a 0a 23 20 45 56 49 44 45  lob ghi..# EVIDE
c9a0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 39 35 36 2d  NCE-OF: R-22956-
c9b0: 33 37 37 35 34 20 43 61 73 74 69 6e 67 20 74 6f  37754 Casting to
c9c0: 20 61 20 42 4c 4f 42 20 63 6f 6e 73 69 73 74 73   a BLOB consists
c9d0: 20 6f 66 20 66 69 72 73 74 20 63 61 73 74 69 6e   of first castin
c9e0: 67 0a 23 20 74 68 65 20 76 61 6c 75 65 20 74 6f  g.# the value to
c9f0: 20 54 45 58 54 20 69 6e 20 74 68 65 20 65 6e 63   TEXT in the enc
ca00: 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  oding of the dat
ca10: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ca20: 2c 20 74 68 65 6e 0a 23 20 69 6e 74 65 72 70 72  , then.# interpr
ca30: 65 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  eting the result
ca40: 69 6e 67 20 62 79 74 65 20 73 65 71 75 65 6e 63  ing byte sequenc
ca50: 65 20 61 73 20 61 20 42 4c 4f 42 20 69 6e 73 74  e as a BLOB inst
ca60: 65 61 64 20 6f 66 20 61 73 20 54 45 58 54 2e 0a  ead of as TEXT..
ca70: 23 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20  #.do_qexpr_test 
ca80: 65 5f 65 78 70 72 2d 32 37 2e 34 2e 31 20 7b 20  e_expr-27.4.1 { 
ca90: 43 41 53 54 28 27 67 68 69 27 20 41 53 20 62 6c  CAST('ghi' AS bl
caa0: 6f 62 29 20 7d 20 58 27 36 37 36 38 36 39 27 0a  ob) } X'676869'.
cab0: 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f  do_qexpr_test e_
cac0: 65 78 70 72 2d 32 37 2e 34 2e 32 20 7b 20 43 41  expr-27.4.2 { CA
cad0: 53 54 28 34 35 36 20 41 53 20 62 6c 6f 62 29 20  ST(456 AS blob) 
cae0: 7d 20 20 20 58 27 33 34 33 35 33 36 27 0a 64 6f  }   X'343536'.do
caf0: 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  _qexpr_test e_ex
cb00: 70 72 2d 32 37 2e 34 2e 33 20 7b 20 43 41 53 54  pr-27.4.3 { CAST
cb10: 28 31 2e 37 38 20 41 53 20 62 6c 6f 62 29 20 7d  (1.78 AS blob) }
cb20: 20 20 58 27 33 31 32 45 33 37 33 38 27 0a 72 65    X'312E3738'.re
cb30: 6e 61 6d 65 20 64 62 20 64 62 32 0a 73 71 6c 69  name db db2.sqli
cb40: 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a  te3 db :memory:.
cb50: 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  db eval { PRAGMA
cb60: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66   encoding = 'utf
cb70: 2d 31 36 6c 65 27 20 7d 0a 64 6f 5f 71 65 78 70  -16le' }.do_qexp
cb80: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
cb90: 2e 34 2e 34 20 7b 20 43 41 53 54 28 27 67 68 69  .4.4 { CAST('ghi
cba0: 27 20 41 53 20 62 6c 6f 62 29 20 7d 20 58 27 36  ' AS blob) } X'6
cbb0: 37 30 30 36 38 30 30 36 39 30 30 27 0a 64 6f 5f  70068006900'.do_
cbc0: 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  qexpr_test e_exp
cbd0: 72 2d 32 37 2e 34 2e 35 20 7b 20 43 41 53 54 28  r-27.4.5 { CAST(
cbe0: 34 35 36 20 41 53 20 62 6c 6f 62 29 20 7d 20 20  456 AS blob) }  
cbf0: 20 58 27 33 34 30 30 33 35 30 30 33 36 30 30 27   X'340035003600'
cc00: 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65  .do_qexpr_test e
cc10: 5f 65 78 70 72 2d 32 37 2e 34 2e 36 20 7b 20 43  _expr-27.4.6 { C
cc20: 41 53 54 28 31 2e 37 38 20 41 53 20 62 6c 6f 62  AST(1.78 AS blob
cc30: 29 20 7d 20 20 58 27 33 31 30 30 32 45 30 30 33  ) }  X'31002E003
cc40: 37 30 30 33 38 30 30 27 0a 64 62 20 63 6c 6f 73  7003800'.db clos
cc50: 65 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65  e.sqlite3 db :me
cc60: 6d 6f 72 79 3a 0a 64 62 20 65 76 61 6c 20 7b 20  mory:.db eval { 
cc70: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20  PRAGMA encoding 
cc80: 3d 20 27 75 74 66 2d 31 36 62 65 27 20 7d 0a 64  = 'utf-16be' }.d
cc90: 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65  o_qexpr_test e_e
cca0: 78 70 72 2d 32 37 2e 34 2e 37 20 7b 20 43 41 53  xpr-27.4.7 { CAS
ccb0: 54 28 27 67 68 69 27 20 41 53 20 62 6c 6f 62 29  T('ghi' AS blob)
ccc0: 20 7d 20 58 27 30 30 36 37 30 30 36 38 30 30 36   } X'00670068006
ccd0: 39 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74  9'.do_qexpr_test
cce0: 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 38 20 7b   e_expr-27.4.8 {
ccf0: 20 43 41 53 54 28 34 35 36 20 41 53 20 62 6c 6f   CAST(456 AS blo
cd00: 62 29 20 7d 20 20 20 58 27 30 30 33 34 30 30 33  b) }   X'0034003
cd10: 35 30 30 33 36 27 0a 64 6f 5f 71 65 78 70 72 5f  50036'.do_qexpr_
cd20: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34  test e_expr-27.4
cd30: 2e 39 20 7b 20 43 41 53 54 28 31 2e 37 38 20 41  .9 { CAST(1.78 A
cd40: 53 20 62 6c 6f 62 29 20 7d 20 20 58 27 30 30 33  S blob) }  X'003
cd50: 31 30 30 32 45 30 30 33 37 30 30 33 38 27 0a 64  1002E00370038'.d
cd60: 62 20 63 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64  b close.rename d
cd70: 62 32 20 64 62 0a 0a 23 20 45 56 49 44 45 4e 43  b2 db..# EVIDENC
cd80: 45 2d 4f 46 3a 20 52 2d 30 34 32 30 37 2d 33 37  E-OF: R-04207-37
cd90: 39 38 31 20 54 6f 20 63 61 73 74 20 61 20 42 4c  981 To cast a BL
cda0: 4f 42 20 76 61 6c 75 65 20 74 6f 20 54 45 58 54  OB value to TEXT
cdb0: 2c 20 74 68 65 20 73 65 71 75 65 6e 63 65 0a 23  , the sequence.#
cdc0: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 6d   of bytes that m
cdd0: 61 6b 65 20 75 70 20 74 68 65 20 42 4c 4f 42 20  ake up the BLOB 
cde0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
cdf0: 73 20 74 65 78 74 20 65 6e 63 6f 64 65 64 20 75  s text encoded u
ce00: 73 69 6e 67 0a 23 20 74 68 65 20 64 61 74 61 62  sing.# the datab
ce10: 61 73 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 23 0a  ase encoding..#.
ce20: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
ce30: 78 70 72 2d 32 38 2e 31 2e 31 20 7b 20 43 41 53  xpr-28.1.1 { CAS
ce40: 54 20 28 58 27 36 37 36 38 36 39 27 20 41 53 20  T (X'676869' AS 
ce50: 74 65 78 74 29 20 7d 20 74 65 78 74 20 67 68 69  text) } text ghi
ce60: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
ce70: 65 78 70 72 2d 32 38 2e 31 2e 32 20 7b 20 43 41  expr-28.1.2 { CA
ce80: 53 54 20 28 58 27 36 37 30 30 36 38 30 30 36 39  ST (X'6700680069
ce90: 30 30 27 20 41 53 20 74 65 78 74 29 20 7d 20 74  00' AS text) } t
cea0: 65 78 74 20 67 0a 72 65 6e 61 6d 65 20 64 62 20  ext g.rename db 
ceb0: 64 62 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a  db2.sqlite3 db :
cec0: 6d 65 6d 6f 72 79 3a 0a 64 62 20 65 76 61 6c 20  memory:.db eval 
ced0: 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e  { PRAGMA encodin
cee0: 67 20 3d 20 27 75 74 66 2d 31 36 6c 65 27 20 7d  g = 'utf-16le' }
cef0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
cf00: 65 78 70 72 2d 32 38 2e 31 2e 33 20 7b 20 43 41  expr-28.1.3 { CA
cf10: 53 54 20 28 58 27 36 37 36 38 36 39 27 20 41 53  ST (X'676869' AS
cf20: 20 74 65 78 74 29 20 3d 3d 20 27 67 68 69 27 20   text) == 'ghi' 
cf30: 7d 20 69 6e 74 65 67 65 72 20 30 0a 64 6f 5f 65  } integer 0.do_e
cf40: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
cf50: 32 38 2e 31 2e 34 20 7b 20 43 41 53 54 20 28 58  28.1.4 { CAST (X
cf60: 27 36 37 30 30 36 38 30 30 36 39 30 30 27 20 41  '670068006900' A
cf70: 53 20 74 65 78 74 29 20 7d 20 74 65 78 74 20 67  S text) } text g
cf80: 68 69 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61  hi.db close.rena
cf90: 6d 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49  me db2 db..# EVI
cfa0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 32 33  DENCE-OF: R-2223
cfb0: 35 2d 34 37 30 30 36 20 43 61 73 74 69 6e 67 20  5-47006 Casting 
cfc0: 61 6e 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45  an INTEGER or RE
cfd0: 41 4c 20 76 61 6c 75 65 20 69 6e 74 6f 20 54 45  AL value into TE
cfe0: 58 54 0a 23 20 72 65 6e 64 65 72 73 20 74 68 65  XT.# renders the
cff0: 20 76 61 6c 75 65 20 61 73 20 69 66 20 76 69 61   value as if via
d000: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
d010: 66 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  f() except that 
d020: 74 68 65 0a 23 20 72 65 73 75 6c 74 69 6e 67 20  the.# resulting 
d030: 54 45 58 54 20 75 73 65 73 20 74 68 65 20 65 6e  TEXT uses the en
d040: 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 64 61  coding of the da
d050: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
d060: 6e 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73  n..#.do_expr_tes
d070: 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 31 20  t e_expr-28.2.1 
d080: 7b 20 43 41 53 54 20 28 31 20 41 53 20 74 65 78  { CAST (1 AS tex
d090: 74 29 20 20 20 7d 20 20 20 20 20 74 65 78 74 20  t)   }     text 
d0a0: 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  1.do_expr_test e
d0b0: 5f 65 78 70 72 2d 32 38 2e 32 2e 32 20 7b 20 43  _expr-28.2.2 { C
d0c0: 41 53 54 20 28 34 35 20 41 53 20 74 65 78 74 29  AST (45 AS text)
d0d0: 20 20 7d 20 20 20 20 20 74 65 78 74 20 34 35 0a    }     text 45.
d0e0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d0f0: 78 70 72 2d 32 38 2e 32 2e 33 20 7b 20 43 41 53  xpr-28.2.3 { CAS
d100: 54 20 28 2d 34 35 20 41 53 20 74 65 78 74 29 20  T (-45 AS text) 
d110: 7d 20 20 20 20 20 74 65 78 74 20 2d 34 35 0a 64  }     text -45.d
d120: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d130: 70 72 2d 32 38 2e 32 2e 34 20 7b 20 43 41 53 54  pr-28.2.4 { CAST
d140: 20 28 38 2e 38 20 41 53 20 74 65 78 74 29 20 20   (8.8 AS text)  
d150: 20 20 7d 20 20 74 65 78 74 20 38 2e 38 0a 64 6f    }  text 8.8.do
d160: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d170: 72 2d 32 38 2e 32 2e 35 20 7b 20 43 41 53 54 20  r-28.2.5 { CAST 
d180: 28 32 2e 33 65 2b 35 20 41 53 20 74 65 78 74 29  (2.3e+5 AS text)
d190: 20 7d 20 20 74 65 78 74 20 32 33 30 30 30 30 2e   }  text 230000.
d1a0: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
d1b0: 5f 65 78 70 72 2d 32 38 2e 32 2e 36 20 7b 20 43  _expr-28.2.6 { C
d1c0: 41 53 54 20 28 2d 32 2e 33 65 2d 35 20 41 53 20  AST (-2.3e-5 AS 
d1d0: 74 65 78 74 29 20 7d 20 74 65 78 74 20 2d 32 2e  text) } text -2.
d1e0: 33 65 2d 30 35 0a 64 6f 5f 65 78 70 72 5f 74 65  3e-05.do_expr_te
d1f0: 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 37  st e_expr-28.2.7
d200: 20 7b 20 43 41 53 54 20 28 30 2e 30 20 41 53 20   { CAST (0.0 AS 
d210: 74 65 78 74 29 20 7d 20 20 20 20 20 74 65 78 74  text) }     text
d220: 20 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73   0.0.do_expr_tes
d230: 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 37 20  t e_expr-28.2.7 
d240: 7b 20 43 41 53 54 20 28 30 20 41 53 20 74 65 78  { CAST (0 AS tex
d250: 74 29 20 7d 20 20 20 20 20 20 20 74 65 78 74 20  t) }       text 
d260: 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  0..# EVIDENCE-OF
d270: 3a 20 52 2d 32 36 33 34 36 2d 33 36 34 34 33 20  : R-26346-36443 
d280: 57 68 65 6e 20 63 61 73 74 69 6e 67 20 61 20 42  When casting a B
d290: 4c 4f 42 20 76 61 6c 75 65 20 74 6f 20 61 20 52  LOB value to a R
d2a0: 45 41 4c 2c 20 74 68 65 0a 23 20 76 61 6c 75 65  EAL, the.# value
d2b0: 20 69 73 20 66 69 72 73 74 20 63 6f 6e 76 65 72   is first conver
d2c0: 74 65 64 20 74 6f 20 54 45 58 54 2e 0a 23 0a 64  ted to TEXT..#.d
d2d0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d2e0: 70 72 2d 32 39 2e 31 2e 31 20 7b 20 43 41 53 54  pr-29.1.1 { CAST
d2f0: 20 28 58 27 33 31 32 45 33 32 33 33 27 20 41 53   (X'312E3233' AS
d300: 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e   REAL) } real 1.
d310: 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  23.do_expr_test 
d320: 65 5f 65 78 70 72 2d 32 39 2e 31 2e 32 20 7b 20  e_expr-29.1.2 { 
d330: 43 41 53 54 20 28 58 27 33 32 33 33 33 30 32 45  CAST (X'3233302E
d340: 33 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  30' AS REAL) } r
d350: 65 61 6c 20 32 33 30 2e 30 0a 64 6f 5f 65 78 70  eal 230.0.do_exp
d360: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
d370: 2e 31 2e 33 20 7b 20 43 41 53 54 20 28 58 27 32  .1.3 { CAST (X'2
d380: 44 33 39 32 45 33 38 33 37 27 20 41 53 20 52 45  D392E3837' AS RE
d390: 41 4c 29 20 7d 20 72 65 61 6c 20 2d 39 2e 38 37  AL) } real -9.87
d3a0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d3b0: 65 78 70 72 2d 32 39 2e 31 2e 34 20 7b 20 43 41  expr-29.1.4 { CA
d3c0: 53 54 20 28 58 27 33 30 32 45 33 30 33 30 33 30  ST (X'302E303030
d3d0: 33 31 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  31' AS REAL) } r
d3e0: 65 61 6c 20 30 2e 30 30 30 31 0a 72 65 6e 61 6d  eal 0.0001.renam
d3f0: 65 20 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33  e db db2.sqlite3
d400: 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 64 62 20   db :memory:.db 
d410: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e  eval { PRAGMA en
d420: 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36  coding = 'utf-16
d430: 6c 65 27 20 7d 0a 64 6f 5f 65 78 70 72 5f 74 65  le' }.do_expr_te
d440: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e 35  st e_expr-29.1.5
d450: 20 7b 20 0a 20 20 20 20 43 41 53 54 20 28 58 27   { .    CAST (X'
d460: 33 31 30 30 32 45 30 30 33 32 30 30 33 33 30 30  31002E0032003300
d470: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
d480: 6c 20 31 2e 32 33 0a 64 6f 5f 65 78 70 72 5f 74  l 1.23.do_expr_t
d490: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e  est e_expr-29.1.
d4a0: 36 20 7b 20 0a 20 20 20 20 43 41 53 54 20 28 58  6 { .    CAST (X
d4b0: 27 33 32 30 30 33 33 30 30 33 30 30 30 32 45 30  '3200330030002E0
d4c0: 30 33 30 30 30 27 20 41 53 20 52 45 41 4c 29 20  03000' AS REAL) 
d4d0: 7d 20 72 65 61 6c 20 32 33 30 2e 30 0a 64 6f 5f  } real 230.0.do_
d4e0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d4f0: 2d 32 39 2e 31 2e 37 20 7b 20 0a 20 20 20 20 43  -29.1.7 { .    C
d500: 41 53 54 20 28 58 27 32 44 30 30 33 39 30 30 32  AST (X'2D0039002
d510: 45 30 30 33 38 30 30 33 37 30 30 27 20 41 53 20  E0038003700' AS 
d520: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 2d 39 2e  REAL) } real -9.
d530: 38 37 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  87.do_expr_test 
d540: 65 5f 65 78 70 72 2d 32 39 2e 31 2e 38 20 7b 20  e_expr-29.1.8 { 
d550: 0a 20 20 20 20 43 41 53 54 20 28 58 27 33 30 30  .    CAST (X'300
d560: 30 32 45 30 30 33 30 30 30 33 30 30 30 33 30 30  02E0030003000300
d570: 30 33 31 30 30 27 20 41 53 20 52 45 41 4c 29 20  03100' AS REAL) 
d580: 7d 20 72 65 61 6c 20 30 2e 30 30 30 31 0a 64 62  } real 0.0001.db
d590: 20 63 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62   close.rename db
d5a0: 32 20 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45  2 db..# EVIDENCE
d5b0: 2d 4f 46 3a 20 52 2d 35 34 38 39 38 2d 33 34 35  -OF: R-54898-345
d5c0: 35 34 20 57 68 65 6e 20 63 61 73 74 69 6e 67 20  54 When casting 
d5d0: 61 20 54 45 58 54 20 76 61 6c 75 65 20 74 6f 20  a TEXT value to 
d5e0: 52 45 41 4c 2c 20 74 68 65 0a 23 20 6c 6f 6e 67  REAL, the.# long
d5f0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 72 65  est possible pre
d600: 66 69 78 20 6f 66 20 74 68 65 20 76 61 6c 75 65  fix of the value
d610: 20 74 68 61 74 20 63 61 6e 20 62 65 20 69 6e 74   that can be int
d620: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 72 65  erpreted as a re
d630: 61 6c 0a 23 20 6e 75 6d 62 65 72 20 69 73 20 65  al.# number is e
d640: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
d650: 65 20 54 45 58 54 20 76 61 6c 75 65 20 61 6e 64  e TEXT value and
d660: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69   the remainder i
d670: 67 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 70  gnored..#.do_exp
d680: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
d690: 2e 32 2e 31 20 7b 20 43 41 53 54 28 27 31 2e 32  .2.1 { CAST('1.2
d6a0: 33 61 62 63 64 27 20 41 53 20 52 45 41 4c 29 20  3abcd' AS REAL) 
d6b0: 7d 20 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65  } real 1.23.do_e
d6c0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
d6d0: 32 39 2e 32 2e 32 20 7b 20 43 41 53 54 28 27 31  29.2.2 { CAST('1
d6e0: 2e 34 35 2e 32 33 61 62 63 64 27 20 41 53 20 52  .45.23abcd' AS R
d6f0: 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 34 35  EAL) } real 1.45
d700: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d710: 65 78 70 72 2d 32 39 2e 32 2e 33 20 7b 20 43 41  expr-29.2.3 { CA
d720: 53 54 28 27 2d 32 2e 31 32 65 2d 30 31 41 42 43  ST('-2.12e-01ABC
d730: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
d740: 6c 20 2d 30 2e 32 31 32 0a 64 6f 5f 65 78 70 72  l -0.212.do_expr
d750: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d760: 32 2e 34 20 7b 20 43 41 53 54 28 27 31 20 32 20  2.4 { CAST('1 2 
d770: 33 20 34 27 20 41 53 20 52 45 41 4c 29 20 7d 20  3 4' AS REAL) } 
d780: 72 65 61 6c 20 31 2e 30 0a 0a 23 20 45 56 49 44  real 1.0..# EVID
d790: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 33 32 31  ENCE-OF: R-11321
d7a0: 2d 34 37 34 32 37 20 41 6e 79 20 6c 65 61 64 69  -47427 Any leadi
d7b0: 6e 67 20 73 70 61 63 65 73 20 69 6e 20 74 68 65  ng spaces in the
d7c0: 20 54 45 58 54 20 76 61 6c 75 65 20 61 72 65 0a   TEXT value are.
d7d0: 23 20 69 67 6e 6f 72 65 64 20 77 68 65 6e 20 63  # ignored when c
d7e0: 6f 6e 76 65 72 67 69 6e 67 20 66 72 6f 6d 20 54  onverging from T
d7f0: 45 58 54 20 74 6f 20 52 45 41 4c 2e 0a 23 0a 64  EXT to REAL..#.d
d800: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d810: 70 72 2d 32 39 2e 33 2e 31 20 7b 20 43 41 53 54  pr-29.3.1 { CAST
d820: 28 27 20 31 2e 32 33 61 62 63 64 27 20 41 53 20  (' 1.23abcd' AS 
d830: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32  REAL) } real 1.2
d840: 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  3.do_expr_test e
d850: 5f 65 78 70 72 2d 32 39 2e 33 2e 32 20 7b 20 43  _expr-29.3.2 { C
d860: 41 53 54 28 27 20 20 20 20 31 2e 34 35 2e 32 33  AST('    1.45.23
d870: 61 62 63 64 27 20 41 53 20 52 45 41 4c 29 20 7d  abcd' AS REAL) }
d880: 20 72 65 61 6c 20 31 2e 34 35 0a 64 6f 5f 65 78   real 1.45.do_ex
d890: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d8a0: 39 2e 33 2e 33 20 7b 20 43 41 53 54 28 27 20 20  9.3.3 { CAST('  
d8b0: 20 2d 32 2e 31 32 65 2d 30 31 41 42 43 27 20 41   -2.12e-01ABC' A
d8c0: 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 2d  S REAL) } real -
d8d0: 30 2e 32 31 32 0a 64 6f 5f 65 78 70 72 5f 74 65  0.212.do_expr_te
d8e0: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e 34  st e_expr-29.3.4
d8f0: 20 7b 20 43 41 53 54 28 27 20 31 20 32 20 33 20   { CAST(' 1 2 3 
d900: 34 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  4' AS REAL) } re
d910: 61 6c 20 31 2e 30 0a 0a 23 20 45 56 49 44 45 4e  al 1.0..# EVIDEN
d920: 43 45 2d 4f 46 3a 20 52 2d 32 32 36 36 32 2d 32  CE-OF: R-22662-2
d930: 38 32 31 38 20 49 66 20 74 68 65 72 65 20 69 73  8218 If there is
d940: 20 6e 6f 20 70 72 65 66 69 78 20 74 68 61 74 20   no prefix that 
d950: 63 61 6e 20 62 65 0a 23 20 69 6e 74 65 72 70 72  can be.# interpr
d960: 65 74 65 64 20 61 73 20 61 20 72 65 61 6c 20 6e  eted as a real n
d970: 75 6d 62 65 72 2c 20 74 68 65 20 72 65 73 75 6c  umber, the resul
d980: 74 20 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73  t of the convers
d990: 69 6f 6e 20 69 73 20 30 2e 30 2e 0a 23 0a 64 6f  ion is 0.0..#.do
d9a0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d9b0: 72 2d 32 39 2e 34 2e 31 20 7b 20 43 41 53 54 28  r-29.4.1 { CAST(
d9c0: 27 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  '' AS REAL) } re
d9d0: 61 6c 20 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74  al 0.0.do_expr_t
d9e0: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 34 2e  est e_expr-29.4.
d9f0: 32 20 7b 20 43 41 53 54 28 27 6e 6f 74 20 61 20  2 { CAST('not a 
da00: 6e 75 6d 62 65 72 27 20 41 53 20 52 45 41 4c 29  number' AS REAL)
da10: 20 7d 20 72 65 61 6c 20 30 2e 30 0a 64 6f 5f 65   } real 0.0.do_e
da20: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
da30: 32 39 2e 34 2e 33 20 7b 20 43 41 53 54 28 27 58  29.4.3 { CAST('X
da40: 58 49 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  XI' AS REAL) } r
da50: 65 61 6c 20 30 2e 30 0a 0a 23 20 45 56 49 44 45  eal 0.0..# EVIDE
da60: 4e 43 45 2d 4f 46 3a 20 52 2d 32 31 38 32 39 2d  NCE-OF: R-21829-
da70: 31 34 35 36 33 20 57 68 65 6e 20 63 61 73 74 69  14563 When casti
da80: 6e 67 20 61 20 42 4c 4f 42 20 76 61 6c 75 65 20  ng a BLOB value 
da90: 74 6f 20 49 4e 54 45 47 45 52 2c 20 74 68 65 0a  to INTEGER, the.
daa0: 23 20 76 61 6c 75 65 20 69 73 20 66 69 72 73 74  # value is first
dab0: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 54 45   converted to TE
dac0: 58 54 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65  XT..#.do_expr_te
dad0: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 31  st e_expr-30.1.1
dae0: 20 7b 20 43 41 53 54 28 58 27 33 31 33 32 33 33   { CAST(X'313233
daf0: 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20  ' AS INTEGER) } 
db00: 69 6e 74 65 67 65 72 20 31 32 33 0a 64 6f 5f 65  integer 123.do_e
db10: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
db20: 33 30 2e 31 2e 32 20 7b 20 43 41 53 54 28 58 27  30.1.2 { CAST(X'
db30: 32 44 33 36 33 37 33 38 27 20 41 53 20 49 4e 54  2D363738' AS INT
db40: 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20  EGER) } integer 
db50: 2d 36 37 38 0a 64 6f 5f 65 78 70 72 5f 74 65 73  -678.do_expr_tes
db60: 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 33 20  t e_expr-30.1.3 
db70: 7b 20 0a 20 20 43 41 53 54 28 58 27 33 31 33 30  { .  CAST(X'3130
db80: 33 30 33 30 33 30 33 30 33 30 27 20 41 53 20 49  3030303030' AS I
db90: 4e 54 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67  NTEGER) .} integ
dba0: 65 72 20 31 30 30 30 30 30 30 0a 64 6f 5f 65 78  er 1000000.do_ex
dbb0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
dbc0: 30 2e 31 2e 34 20 7b 20 0a 20 20 43 41 53 54 28  0.1.4 { .  CAST(
dbd0: 58 27 32 44 33 31 33 31 33 32 33 35 33 38 33 39  X'2D313132353839
dbe0: 33 39 33 39 33 30 33 36 33 38 33 34 33 32 33 36  3939303638343236
dbf0: 33 32 33 34 27 20 41 53 20 49 4e 54 45 47 45 52  3234' AS INTEGER
dc00: 29 20 0a 7d 20 69 6e 74 65 67 65 72 20 2d 31 31  ) .} integer -11
dc10: 32 35 38 39 39 39 30 36 38 34 32 36 32 34 0a 0a  25899906842624..
dc20: 72 65 6e 61 6d 65 20 64 62 20 64 62 32 0a 73 71  rename db db2.sq
dc30: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
dc40: 3a 0a 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47  :.execsql { PRAG
dc50: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75  MA encoding = 'u
dc60: 74 66 2d 31 36 62 65 27 20 7d 0a 64 6f 5f 65 78  tf-16be' }.do_ex
dc70: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
dc80: 30 2e 31 2e 35 20 7b 20 43 41 53 54 28 58 27 30  0.1.5 { CAST(X'0
dc90: 30 33 31 30 30 33 32 30 30 33 33 27 20 41 53 20  03100320033' AS 
dca0: 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67  INTEGER) } integ
dcb0: 65 72 20 31 32 33 0a 64 6f 5f 65 78 70 72 5f 74  er 123.do_expr_t
dcc0: 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e  est e_expr-30.1.
dcd0: 36 20 7b 20 43 41 53 54 28 58 27 30 30 32 44 30  6 { CAST(X'002D0
dce0: 30 33 36 30 30 33 37 30 30 33 38 27 20 41 53 20  03600370038' AS 
dcf0: 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67  INTEGER) } integ
dd00: 65 72 20 2d 36 37 38 0a 64 6f 5f 65 78 70 72 5f  er -678.do_expr_
dd10: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 31  test e_expr-30.1
dd20: 2e 37 20 7b 20 0a 20 20 43 41 53 54 28 58 27 30  .7 { .  CAST(X'0
dd30: 30 33 31 30 30 33 30 30 30 33 30 30 30 33 30 30  0310030003000300
dd40: 30 33 30 30 30 33 30 30 30 33 30 27 20 41 53 20  03000300030' AS 
dd50: 49 4e 54 45 47 45 52 29 20 0a 7d 20 69 6e 74 65  INTEGER) .} inte
dd60: 67 65 72 20 31 30 30 30 30 30 30 0a 64 6f 5f 65  ger 1000000.do_e
dd70: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
dd80: 33 30 2e 31 2e 38 20 7b 20 0a 20 20 43 41 53 54  30.1.8 { .  CAST
dd90: 28 58 27 30 30 32 44 30 30 33 31 30 30 33 31 30  (X'002D003100310
dda0: 30 33 32 30 30 33 35 30 30 33 38 30 30 33 39 30  0320035003800390
ddb0: 30 33 39 30 30 33 39 30 30 33 30 30 30 33 36 30  0390039003000360
ddc0: 30 33 38 30 30 33 34 30 30 33 32 30 30 33 36 30  0380034003200360
ddd0: 30 33 32 30 30 33 34 27 20 41 53 20 49 4e 54 45  0320034' AS INTE
dde0: 47 45 52 29 20 0a 7d 20 69 6e 74 65 67 65 72 20  GER) .} integer 
ddf0: 2d 31 31 32 35 38 39 39 39 30 36 38 34 32 36 32  -112589990684262
de00: 34 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61 6d  4.db close.renam
de10: 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49 44  e db2 db..# EVID
de20: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 31 32  ENCE-OF: R-47612
de30: 2d 34 35 38 34 32 20 57 68 65 6e 20 63 61 73 74  -45842 When cast
de40: 69 6e 67 20 61 20 54 45 58 54 20 76 61 6c 75 65  ing a TEXT value
de50: 20 74 6f 20 49 4e 54 45 47 45 52 2c 20 74 68 65   to INTEGER, the
de60: 0a 23 20 6c 6f 6e 67 65 73 74 20 70 6f 73 73 69  .# longest possi
de70: 62 6c 65 20 70 72 65 66 69 78 20 6f 66 20 74 68  ble prefix of th
de80: 65 20 76 61 6c 75 65 20 74 68 61 74 20 63 61 6e  e value that can
de90: 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20   be interpreted 
dea0: 61 73 20 61 6e 0a 23 20 69 6e 74 65 67 65 72 20  as an.# integer 
deb0: 6e 75 6d 62 65 72 20 69 73 20 65 78 74 72 61 63  number is extrac
dec0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 54 45 58  ted from the TEX
ded0: 54 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  T value and the 
dee0: 72 65 6d 61 69 6e 64 65 72 0a 23 20 69 67 6e 6f  remainder.# igno
def0: 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74  red..#.do_expr_t
df00: 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 32 2e  est e_expr-30.2.
df10: 31 20 7b 20 43 41 53 54 28 27 31 32 33 61 62 63  1 { CAST('123abc
df20: 64 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74  d' AS INT) } int
df30: 65 67 65 72 20 31 32 33 0a 64 6f 5f 65 78 70 72  eger 123.do_expr
df40: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
df50: 32 2e 32 20 7b 20 43 41 53 54 28 27 31 34 35 32  2.2 { CAST('1452
df60: 33 61 62 63 64 27 20 41 53 20 49 4e 54 29 20 7d  3abcd' AS INT) }
df70: 20 69 6e 74 65 67 65 72 20 31 34 35 32 33 0a 64   integer 14523.d
df80: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
df90: 70 72 2d 33 30 2e 32 2e 33 20 7b 20 43 41 53 54  pr-30.2.3 { CAST
dfa0: 28 27 2d 32 2e 31 32 65 2d 30 31 41 42 43 27 20  ('-2.12e-01ABC' 
dfb0: 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65  AS INT) } intege
dfc0: 72 20 2d 32 0a 64 6f 5f 65 78 70 72 5f 74 65 73  r -2.do_expr_tes
dfd0: 74 20 65 5f 65 78 70 72 2d 33 30 2e 32 2e 34 20  t e_expr-30.2.4 
dfe0: 7b 20 43 41 53 54 28 27 31 20 32 20 33 20 34 27  { CAST('1 2 3 4'
dff0: 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67   AS INT) } integ
e000: 65 72 20 31 0a 0a 23 20 45 56 49 44 45 4e 43 45  er 1..# EVIDENCE
e010: 2d 4f 46 3a 20 52 2d 33 34 34 30 30 2d 33 33 37  -OF: R-34400-337
e020: 37 32 20 41 6e 79 20 6c 65 61 64 69 6e 67 20 73  72 Any leading s
e030: 70 61 63 65 73 20 69 6e 20 74 68 65 20 54 45 58  paces in the TEX
e040: 54 20 76 61 6c 75 65 20 77 68 65 6e 0a 23 20 63  T value when.# c
e050: 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d 20 54  onverting from T
e060: 45 58 54 20 74 6f 20 49 4e 54 45 47 45 52 20 61  EXT to INTEGER a
e070: 72 65 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64 6f  re ignored..#.do
e080: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e090: 72 2d 33 30 2e 33 2e 31 20 7b 20 43 41 53 54 28  r-30.3.1 { CAST(
e0a0: 27 20 20 20 31 32 33 61 62 63 64 27 20 41 53 20  '   123abcd' AS 
e0b0: 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31  INT) } integer 1
e0c0: 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  23.do_expr_test 
e0d0: 65 5f 65 78 70 72 2d 33 30 2e 33 2e 32 20 7b 20  e_expr-30.3.2 { 
e0e0: 43 41 53 54 28 27 20 20 31 34 35 32 33 61 62 63  CAST('  14523abc
e0f0: 64 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74  d' AS INT) } int
e100: 65 67 65 72 20 31 34 35 32 33 0a 64 6f 5f 65 78  eger 14523.do_ex
e110: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e120: 30 2e 33 2e 33 20 7b 20 43 41 53 54 28 27 20 2d  0.3.3 { CAST(' -
e130: 32 2e 31 32 65 2d 30 31 41 42 43 27 20 41 53 20  2.12e-01ABC' AS 
e140: 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 2d  INT) } integer -
e150: 32 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  2.do_expr_test e
e160: 5f 65 78 70 72 2d 33 30 2e 33 2e 34 20 7b 20 43  _expr-30.3.4 { C
e170: 41 53 54 28 27 20 20 20 20 20 31 20 32 20 33 20  AST('     1 2 3 
e180: 34 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74  4' AS INT) } int
e190: 65 67 65 72 20 31 0a 0a 23 20 45 56 49 44 45 4e  eger 1..# EVIDEN
e1a0: 43 45 2d 4f 46 3a 20 52 2d 34 33 31 36 34 2d 34  CE-OF: R-43164-4
e1b0: 34 32 37 36 20 49 66 20 74 68 65 72 65 20 69 73  4276 If there is
e1c0: 20 6e 6f 20 70 72 65 66 69 78 20 74 68 61 74 20   no prefix that 
e1d0: 63 61 6e 20 62 65 0a 23 20 69 6e 74 65 72 70 72  can be.# interpr
e1e0: 65 74 65 64 20 61 73 20 61 6e 20 69 6e 74 65 67  eted as an integ
e1f0: 65 72 20 6e 75 6d 62 65 72 2c 20 74 68 65 20 72  er number, the r
e200: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6e  esult of the con
e210: 76 65 72 73 69 6f 6e 20 69 73 20 30 2e 0a 23 0a  version is 0..#.
e220: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e230: 78 70 72 2d 33 30 2e 34 2e 31 20 7b 20 43 41 53  xpr-30.4.1 { CAS
e240: 54 28 27 27 20 41 53 20 49 4e 54 45 47 45 52 29  T('' AS INTEGER)
e250: 20 7d 20 69 6e 74 65 67 65 72 20 30 0a 64 6f 5f   } integer 0.do_
e260: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e270: 2d 33 30 2e 34 2e 32 20 7b 20 43 41 53 54 28 27  -30.4.2 { CAST('
e280: 6e 6f 74 20 61 20 6e 75 6d 62 65 72 27 20 41 53  not a number' AS
e290: 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65   INTEGER) } inte
e2a0: 67 65 72 20 30 0a 64 6f 5f 65 78 70 72 5f 74 65  ger 0.do_expr_te
e2b0: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 34 2e 33  st e_expr-30.4.3
e2c0: 20 7b 20 43 41 53 54 28 27 58 58 49 27 20 41 53   { CAST('XXI' AS
e2d0: 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65   INTEGER) } inte
e2e0: 67 65 72 20 30 0a 0a 23 20 45 56 49 44 45 4e 43  ger 0..# EVIDENC
e2f0: 45 2d 4f 46 3a 20 52 2d 30 30 37 34 31 2d 33 38  E-OF: R-00741-38
e300: 37 37 36 20 41 20 63 61 73 74 20 6f 66 20 61 20  776 A cast of a 
e310: 52 45 41 4c 20 76 61 6c 75 65 20 69 6e 74 6f 20  REAL value into 
e320: 61 6e 20 49 4e 54 45 47 45 52 20 77 69 6c 6c 0a  an INTEGER will.
e330: 23 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  # truncate the f
e340: 72 61 63 74 69 6f 6e 61 6c 20 70 61 72 74 20 6f  ractional part o
e350: 66 20 74 68 65 20 52 45 41 4c 2e 0a 23 0a 64 6f  f the REAL..#.do
e360: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e370: 72 2d 33 31 2e 31 2e 31 20 7b 20 43 41 53 54 28  r-31.1.1 { CAST(
e380: 33 2e 31 34 31 35 39 20 41 53 20 49 4e 54 45 47  3.14159 AS INTEG
e390: 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 33 0a  ER) } integer 3.
e3a0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e3b0: 78 70 72 2d 33 31 2e 31 2e 32 20 7b 20 43 41 53  xpr-31.1.2 { CAS
e3c0: 54 28 31 2e 39 39 39 39 39 20 41 53 20 49 4e 54  T(1.99999 AS INT
e3d0: 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20  EGER) } integer 
e3e0: 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  1.do_expr_test e
e3f0: 5f 65 78 70 72 2d 33 31 2e 31 2e 33 20 7b 20 43  _expr-31.1.3 { C
e400: 41 53 54 28 2d 31 2e 39 39 39 39 39 20 41 53 20  AST(-1.99999 AS 
e410: 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67  INTEGER) } integ
e420: 65 72 20 2d 31 0a 64 6f 5f 65 78 70 72 5f 74 65  er -1.do_expr_te
e430: 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 31 2e 34  st e_expr-31.1.4
e440: 20 7b 20 43 41 53 54 28 2d 30 2e 39 39 39 39 39   { CAST(-0.99999
e450: 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69   AS INTEGER) } i
e460: 6e 74 65 67 65 72 20 30 0a 0a 23 20 45 56 49 44  nteger 0..# EVID
e470: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 31 32 36  ENCE-OF: R-06126
e480: 2d 33 36 30 32 31 20 49 66 20 61 6e 20 52 45 41  -36021 If an REA
e490: 4c 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  L is too large t
e4a0: 6f 20 62 65 20 72 65 70 72 65 73 65 6e 74 65 64  o be represented
e4b0: 0a 23 20 61 73 20 61 6e 20 49 4e 54 45 47 45 52  .# as an INTEGER
e4c0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
e4d0: 20 6f 66 20 74 68 65 20 63 61 73 74 20 69 73 20   of the cast is 
e4e0: 74 68 65 20 6c 61 72 67 65 73 74 20 6e 65 67 61  the largest nega
e4f0: 74 69 76 65 0a 23 20 69 6e 74 65 67 65 72 3a 20  tive.# integer: 
e500: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
e510: 35 38 30 38 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  5808..#.do_expr_
e520: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 32  test e_expr-31.2
e530: 2e 31 20 7b 20 43 41 53 54 28 32 65 2b 35 30 20  .1 { CAST(2e+50 
e540: 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65  AS INT) } intege
e550: 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  r -9223372036854
e560: 37 37 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74  775808.do_expr_t
e570: 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 32 2e  est e_expr-31.2.
e580: 32 20 7b 20 43 41 53 54 28 2d 32 65 2b 35 30 20  2 { CAST(-2e+50 
e590: 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65  AS INT) } intege
e5a0: 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  r -9223372036854
e5b0: 37 37 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74  775808.do_expr_t
e5c0: 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 32 2e  est e_expr-31.2.
e5d0: 33 20 7b 20 0a 20 20 43 41 53 54 28 2d 39 32 32  3 { .  CAST(-922
e5e0: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 39  3372036854775809
e5f0: 2e 30 20 41 53 20 49 4e 54 29 0a 7d 20 69 6e 74  .0 AS INT).} int
e600: 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33 36  eger -9223372036
e610: 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78 70  854775808.do_exp
e620: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31  r_test e_expr-31
e630: 2e 32 2e 34 20 7b 20 0a 20 20 43 41 53 54 28 39  .2.4 { .  CAST(9
e640: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
e650: 30 39 2e 30 20 41 53 20 49 4e 54 29 0a 7d 20 69  09.0 AS INT).} i
e660: 6e 74 65 67 65 72 20 2d 39 32 32 33 33 37 32 30  nteger -92233720
e670: 33 36 38 35 34 37 37 35 38 30 38 0a 0a 0a 23 20  36854775808...# 
e680: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
e690: 39 32 39 35 2d 36 31 33 33 37 20 43 61 73 74 69  9295-61337 Casti
e6a0: 6e 67 20 61 20 54 45 58 54 20 6f 72 20 42 4c 4f  ng a TEXT or BLO
e6b0: 42 20 76 61 6c 75 65 20 69 6e 74 6f 20 4e 55 4d  B value into NUM
e6c0: 45 52 49 43 0a 23 20 66 69 72 73 74 20 64 6f 65  ERIC.# first doe
e6d0: 73 20 61 20 66 6f 72 63 65 64 20 63 6f 6e 76 65  s a forced conve
e6e0: 72 73 69 6f 6e 20 69 6e 74 6f 20 52 45 41 4c 20  rsion into REAL 
e6f0: 62 75 74 20 74 68 65 6e 20 66 75 72 74 68 65 72  but then further
e700: 20 63 6f 6e 76 65 72 74 73 20 74 68 65 0a 23 20   converts the.# 
e710: 72 65 73 75 6c 74 20 69 6e 74 6f 20 49 4e 54 45  result into INTE
e720: 47 45 52 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  GER if and only 
e730: 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  if the conversio
e740: 6e 20 66 72 6f 6d 20 52 45 41 4c 20 74 6f 20 49  n from REAL to I
e750: 4e 54 45 47 45 52 0a 23 20 69 73 20 6c 6f 73 73  NTEGER.# is loss
e760: 6c 65 73 73 20 61 6e 64 20 72 65 76 65 72 73 69  less and reversi
e770: 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74  ble..#.do_expr_t
e780: 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e  est e_expr-32.1.
e790: 31 20 7b 20 43 41 53 54 28 27 34 35 27 20 20 20  1 { CAST('45'   
e7a0: 41 53 20 4e 55 4d 45 52 49 43 29 20 20 7d 20 69  AS NUMERIC)  } i
e7b0: 6e 74 65 67 65 72 20 34 35 0a 64 6f 5f 65 78 70  nteger 45.do_exp
e7c0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32  r_test e_expr-32
e7d0: 2e 31 2e 32 20 7b 20 43 41 53 54 28 27 34 35 2e  .1.2 { CAST('45.
e7e0: 30 27 20 41 53 20 4e 55 4d 45 52 49 43 29 20 20  0' AS NUMERIC)  
e7f0: 7d 20 69 6e 74 65 67 65 72 20 34 35 0a 64 6f 5f  } integer 45.do_
e800: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e810: 2d 33 32 2e 31 2e 33 20 7b 20 43 41 53 54 28 27  -32.1.3 { CAST('
e820: 34 35 2e 32 27 20 41 53 20 4e 55 4d 45 52 49 43  45.2' AS NUMERIC
e830: 29 20 20 7d 20 72 65 61 6c 20 34 35 2e 32 0a 64  )  } real 45.2.d
e840: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
e850: 70 72 2d 33 32 2e 31 2e 34 20 7b 20 43 41 53 54  pr-32.1.4 { CAST
e860: 28 27 31 31 61 62 63 27 20 41 53 20 4e 55 4d 45  ('11abc' AS NUME
e870: 52 49 43 29 20 7d 20 69 6e 74 65 67 65 72 20 31  RIC) } integer 1
e880: 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  1.do_expr_test e
e890: 5f 65 78 70 72 2d 33 32 2e 31 2e 35 20 7b 20 43  _expr-32.1.5 { C
e8a0: 41 53 54 28 27 31 31 2e 31 61 62 63 27 20 41 53  AST('11.1abc' AS
e8b0: 20 4e 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c   NUMERIC) } real
e8c0: 20 31 31 2e 31 0a 0a 23 20 45 56 49 44 45 4e 43   11.1..# EVIDENC
e8d0: 45 2d 4f 46 3a 20 52 2d 33 30 33 34 37 2d 31 38  E-OF: R-30347-18
e8e0: 37 30 32 20 43 61 73 74 69 6e 67 20 61 20 52 45  702 Casting a RE
e8f0: 41 4c 20 6f 72 20 49 4e 54 45 47 45 52 20 76 61  AL or INTEGER va
e900: 6c 75 65 20 74 6f 20 4e 55 4d 45 52 49 43 0a 23  lue to NUMERIC.#
e910: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 65 76 65   is a no-op, eve
e920: 6e 20 69 66 20 61 20 72 65 61 6c 20 76 61 6c 75  n if a real valu
e930: 65 20 63 6f 75 6c 64 20 62 65 20 6c 6f 73 73 6c  e could be lossl
e940: 65 73 73 6c 79 20 63 6f 6e 76 65 72 74 65 64 20  essly converted 
e950: 74 6f 20 61 6e 0a 23 20 69 6e 74 65 67 65 72 2e  to an.# integer.
e960: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
e970: 65 5f 65 78 70 72 2d 33 32 2e 32 2e 31 20 7b 20  e_expr-32.2.1 { 
e980: 43 41 53 54 28 31 33 2e 30 20 41 53 20 4e 55 4d  CAST(13.0 AS NUM
e990: 45 52 49 43 29 20 7d 20 72 65 61 6c 20 31 33 2e  ERIC) } real 13.
e9a0: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
e9b0: 5f 65 78 70 72 2d 33 32 2e 32 2e 32 20 7b 20 43  _expr-32.2.2 { C
e9c0: 41 53 54 28 31 33 2e 35 20 41 53 20 4e 55 4d 45  AST(13.5 AS NUME
e9d0: 52 49 43 29 20 7d 20 72 65 61 6c 20 31 33 2e 35  RIC) } real 13.5
e9e0: 0a 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  ..do_expr_test e
e9f0: 5f 65 78 70 72 2d 33 32 2e 32 2e 33 20 7b 20 0a  _expr-32.2.3 { .
ea00: 20 20 43 41 53 54 28 2d 39 32 32 33 33 37 32 30    CAST(-92233720
ea10: 33 36 38 35 34 37 37 35 38 30 38 20 41 53 20 4e  36854775808 AS N
ea20: 55 4d 45 52 49 43 29 0a 7d 20 69 6e 74 65 67 65  UMERIC).} intege
ea30: 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  r -9223372036854
ea40: 37 37 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74  775808.do_expr_t
ea50: 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e  est e_expr-32.2.
ea60: 34 20 7b 20 0a 20 20 43 41 53 54 28 39 32 32 33  4 { .  CAST(9223
ea70: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 20  372036854775807 
ea80: 41 53 20 4e 55 4d 45 52 49 43 29 0a 7d 20 69 6e  AS NUMERIC).} in
ea90: 74 65 67 65 72 20 39 32 32 33 33 37 32 30 33 36  teger 9223372036
eaa0: 38 35 34 37 37 35 38 30 37 0a 0a 23 20 45 56 49  854775807..# EVI
eab0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34 35 35  DENCE-OF: R-6455
eac0: 30 2d 32 39 31 39 31 20 4e 6f 74 65 20 74 68 61  0-29191 Note tha
ead0: 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f  t the result fro
eae0: 6d 20 63 61 73 74 69 6e 67 20 61 6e 79 0a 23 20  m casting any.# 
eaf0: 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65 20 69  non-BLOB value i
eb00: 6e 74 6f 20 61 20 42 4c 4f 42 20 61 6e 64 20 74  nto a BLOB and t
eb10: 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d 20 63  he result from c
eb20: 61 73 74 69 6e 67 20 61 6e 79 20 42 4c 4f 42 20  asting any BLOB 
eb30: 76 61 6c 75 65 0a 23 20 69 6e 74 6f 20 61 20 6e  value.# into a n
eb40: 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65 20 6d 61  on-BLOB value ma
eb50: 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 64  y be different d
eb60: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
eb70: 68 65 72 20 74 68 65 0a 23 20 64 61 74 61 62 61  her the.# databa
eb80: 73 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55  se encoding is U
eb90: 54 46 2d 38 2c 20 55 54 46 2d 31 36 62 65 2c 20  TF-8, UTF-16be, 
eba0: 6f 72 20 55 54 46 2d 31 36 6c 65 2e 0a 23 0a 73  or UTF-16le..#.s
ebb0: 71 6c 69 74 65 33 20 64 62 31 20 3a 6d 65 6d 6f  qlite3 db1 :memo
ebc0: 72 79 3a 20 3b 20 64 62 31 20 65 76 61 6c 20 7b  ry: ; db1 eval {
ebd0: 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67   PRAGMA encoding
ebe0: 20 3d 20 27 75 74 66 2d 38 27 20 7d 0a 73 71 6c   = 'utf-8' }.sql
ebf0: 69 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f 72 79  ite3 db2 :memory
ec00: 3a 20 3b 20 64 62 32 20 65 76 61 6c 20 7b 20 50  : ; db2 eval { P
ec10: 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d  RAGMA encoding =
ec20: 20 27 75 74 66 2d 31 36 6c 65 27 20 7d 0a 73 71   'utf-16le' }.sq
ec30: 6c 69 74 65 33 20 64 62 33 20 3a 6d 65 6d 6f 72  lite3 db3 :memor
ec40: 79 3a 20 3b 20 64 62 33 20 65 76 61 6c 20 7b 20  y: ; db3 eval { 
ec50: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20  PRAGMA encoding 
ec60: 3d 20 27 75 74 66 2d 31 36 62 65 27 20 7d 0a 66  = 'utf-16be' }.f
ec70: 6f 72 65 61 63 68 20 7b 74 6e 20 63 61 73 74 65  oreach {tn caste
ec80: 78 70 72 20 64 69 66 66 65 72 73 7d 20 7b 0a 20  xpr differs} {. 
ec90: 20 31 20 7b 20 43 41 53 54 28 31 32 33 20 41 53   1 { CAST(123 AS
eca0: 20 42 4c 4f 42 29 20 20 20 20 7d 20 31 0a 20 20   BLOB)    } 1.  
ecb0: 32 20 7b 20 43 41 53 54 28 27 27 20 41 53 20 42  2 { CAST('' AS B
ecc0: 4c 4f 42 29 20 20 20 20 20 7d 20 30 0a 20 20 33  LOB)     } 0.  3
ecd0: 20 7b 20 43 41 53 54 28 27 61 62 63 64 27 20 41   { CAST('abcd' A
ece0: 53 20 42 4c 4f 42 29 20 7d 20 31 0a 0a 20 20 34  S BLOB) } 1..  4
ecf0: 20 7b 20 43 41 53 54 28 58 27 61 62 63 64 27 20   { CAST(X'abcd' 
ed00: 41 53 20 54 45 58 54 29 20 7d 20 31 0a 20 20 35  AS TEXT) } 1.  5
ed10: 20 7b 20 43 41 53 54 28 58 27 27 20 41 53 20 54   { CAST(X'' AS T
ed20: 45 58 54 29 20 20 20 20 20 7d 20 30 0a 7d 20 7b  EXT)     } 0.} {
ed30: 0a 20 20 73 65 74 20 72 31 20 5b 64 62 31 20 65  .  set r1 [db1 e
ed40: 76 61 6c 20 22 53 45 4c 45 43 54 20 74 79 70 65  val "SELECT type
ed50: 6f 66 28 24 63 61 73 74 65 78 70 72 29 2c 20 71  of($castexpr), q
ed60: 75 6f 74 65 28 24 63 61 73 74 65 78 70 72 29 22  uote($castexpr)"
ed70: 5d 0a 20 20 73 65 74 20 72 32 20 5b 64 62 32 20  ].  set r2 [db2 
ed80: 65 76 61 6c 20 22 53 45 4c 45 43 54 20 74 79 70  eval "SELECT typ
ed90: 65 6f 66 28 24 63 61 73 74 65 78 70 72 29 2c 20  eof($castexpr), 
eda0: 71 75 6f 74 65 28 24 63 61 73 74 65 78 70 72 29  quote($castexpr)
edb0: 22 5d 0a 20 20 73 65 74 20 72 33 20 5b 64 62 33  "].  set r3 [db3
edc0: 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 74 79   eval "SELECT ty
edd0: 70 65 6f 66 28 24 63 61 73 74 65 78 70 72 29 2c  peof($castexpr),
ede0: 20 71 75 6f 74 65 28 24 63 61 73 74 65 78 70 72   quote($castexpr
edf0: 29 22 5d 0a 0a 20 20 69 66 20 7b 24 64 69 66 66  )"]..  if {$diff
ee00: 65 72 73 7d 20 7b 0a 20 20 20 20 73 65 74 20 72  ers} {.    set r
ee10: 65 73 20 5b 65 78 70 72 20 7b 24 72 31 21 3d 24  es [expr {$r1!=$
ee20: 72 32 20 26 26 20 24 72 32 21 3d 24 72 33 7d 5d  r2 && $r2!=$r3}]
ee30: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
ee40: 73 65 74 20 72 65 73 20 5b 65 78 70 72 20 7b 24  set res [expr {$
ee50: 72 31 3d 3d 24 72 32 20 26 26 20 24 72 32 3d 3d  r1==$r2 && $r2==
ee60: 24 72 33 7d 5d 0a 20 20 7d 0a 0a 20 20 64 6f 5f  $r3}].  }..  do_
ee70: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 33 2e 31  test e_expr-33.1
ee80: 2e 24 74 6e 20 7b 73 65 74 20 72 65 73 7d 20 31  .$tn {set res} 1
ee90: 0a 7d 0a 64 62 31 20 63 6c 6f 73 65 0a 64 62 32  .}.db1 close.db2
eea0: 20 63 6c 6f 73 65 0a 64 62 33 20 63 6c 6f 73 65   close.db3 close
eeb0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
eec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
ef00: 65 73 74 20 73 74 61 74 65 6d 65 6e 74 73 20 72  est statements r
ef10: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 45 58  elated to the EX
ef20: 49 53 54 53 20 61 6e 64 20 4e 4f 54 20 45 58 49  ISTS and NOT EXI
ef30: 53 54 53 20 6f 70 65 72 61 74 6f 72 73 2e 0a 23  STS operators..#
ef40: 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73  .catch { db clos
ef50: 65 20 7d 0a 66 69 6c 65 20 64 65 6c 65 74 65 20  e }.file delete 
ef60: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 0a 73  -force test.db.s
ef70: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
ef80: 62 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  b..do_execsql_te
ef90: 73 74 20 65 5f 65 78 70 72 2d 33 34 2e 31 20 7b  st e_expr-34.1 {
efa0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
efb0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45  t1(a, b);.  INSE
efc0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
efd0: 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52  S(1, 2);.  INSER
efe0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
eff0: 28 4e 55 4c 4c 2c 20 32 29 3b 0a 20 20 49 4e 53  (NULL, 2);.  INS
f000: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
f010: 45 53 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49  ES(1, NULL);.  I
f020: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
f030: 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  LUES(NULL, NULL)
f040: 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e  ;.} {}..# EVIDEN
f050: 43 45 2d 4f 46 3a 20 52 2d 32 35 35 38 38 2d 32  CE-OF: R-25588-2
f060: 37 31 38 31 20 54 68 65 20 45 58 49 53 54 53 20  7181 The EXISTS 
f070: 6f 70 65 72 61 74 6f 72 20 61 6c 77 61 79 73 20  operator always 
f080: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 6f 6e 65  evaluates to one
f090: 0a 23 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  .# of the intege
f0a0: 72 20 76 61 6c 75 65 73 20 30 20 61 6e 64 20 31  r values 0 and 1
f0b0: 2e 0a 23 0a 23 20 54 68 69 73 20 73 74 61 74 65  ..#.# This state
f0c0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 74 65 73 74  ment is not test
f0d0: 65 64 20 62 79 20 69 74 73 65 6c 66 2e 20 49 6e  ed by itself. In
f0e0: 73 74 65 61 64 2c 20 61 6c 6c 20 65 5f 65 78 70  stead, all e_exp
f0f0: 72 2d 33 34 2e 2a 20 74 65 73 74 73 20 0a 23 20  r-34.* tests .# 
f100: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 70  following this p
f110: 6f 69 6e 74 20 65 78 70 6c 69 63 69 74 6c 79 20  oint explicitly 
f120: 74 65 73 74 20 74 68 61 74 20 73 70 65 63 69 66  test that specif
f130: 69 63 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6f  ic invocations o
f140: 66 20 45 58 49 53 54 53 0a 23 20 72 65 74 75 72  f EXISTS.# retur
f150: 6e 20 65 69 74 68 65 72 20 69 6e 74 65 67 65 72  n either integer
f160: 20 30 20 6f 72 20 69 6e 74 65 67 65 72 20 31 2e   0 or integer 1.
f170: 0a 23 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .#..# EVIDENCE-O
f180: 46 3a 20 52 2d 35 38 35 35 33 2d 36 33 37 34 30  F: R-58553-63740
f190: 20 49 66 20 65 78 65 63 75 74 69 6e 67 20 74 68   If executing th
f1a0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
f1b0: 6e 74 20 73 70 65 63 69 66 69 65 64 0a 23 20 61  nt specified.# a
f1c0: 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  s the right-hand
f1d0: 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20   operand of the 
f1e0: 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20  EXISTS operator 
f1f0: 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 65  would return one
f200: 20 6f 72 0a 23 20 6d 6f 72 65 20 72 6f 77 73 2c   or.# more rows,
f210: 20 74 68 65 6e 20 74 68 65 20 45 58 49 53 54 53   then the EXISTS
f220: 20 6f 70 65 72 61 74 6f 72 20 65 76 61 6c 75 61   operator evalua
f230: 74 65 73 20 74 6f 20 31 2e 0a 23 0a 66 6f 72 65  tes to 1..#.fore
f240: 61 63 68 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a  ach {tn expr} {.
f250: 20 20 20 20 31 20 7b 20 45 58 49 53 54 53 20 28      1 { EXISTS (
f260: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
f270: 31 20 29 20 7d 0a 20 20 20 20 32 20 7b 20 45 58  1 ) }.    2 { EX
f280: 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 62 20  ISTS ( SELECT b 
f290: 46 52 4f 4d 20 74 31 20 29 20 7d 0a 20 20 20 20  FROM t1 ) }.    
f2a0: 33 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c  3 { EXISTS ( SEL
f2b0: 45 43 54 20 32 34 20 29 20 7d 0a 20 20 20 20 34  ECT 24 ) }.    4
f2c0: 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45   { EXISTS ( SELE
f2d0: 43 54 20 4e 55 4c 4c 20 29 20 7d 0a 20 20 20 20  CT NULL ) }.    
f2e0: 35 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c  5 { EXISTS ( SEL
f2f0: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48  ECT a FROM t1 WH
f300: 45 52 45 20 61 20 49 53 20 4e 55 4c 4c 20 29 20  ERE a IS NULL ) 
f310: 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70 72 5f  }.} {.  do_expr_
f320: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34 2e 32  test e_expr-34.2
f330: 2e 24 74 6e 20 24 65 78 70 72 20 69 6e 74 65 67  .$tn $expr integ
f340: 65 72 20 31 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  er 1.}..# EVIDEN
f350: 43 45 2d 4f 46 3a 20 52 2d 31 39 36 37 33 2d 34  CE-OF: R-19673-4
f360: 30 39 37 32 20 49 66 20 65 78 65 63 75 74 69 6e  0972 If executin
f370: 67 20 74 68 65 20 53 45 4c 45 43 54 20 77 6f 75  g the SELECT wou
f380: 6c 64 20 72 65 74 75 72 6e 20 6e 6f 0a 23 20 72  ld return no.# r
f390: 6f 77 73 20 61 74 20 61 6c 6c 2c 20 74 68 65 6e  ows at all, then
f3a0: 20 74 68 65 20 45 58 49 53 54 53 20 6f 70 65 72   the EXISTS oper
f3b0: 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73 20 74  ator evaluates t
f3c0: 6f 20 30 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  o 0..#.foreach {
f3d0: 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20 20 31  tn expr} {.    1
f3e0: 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45   { EXISTS ( SELE
f3f0: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  CT a FROM t1 WHE
f400: 52 45 20 30 29 20 7d 0a 20 20 20 20 32 20 7b 20  RE 0) }.    2 { 
f410: 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
f420: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
f430: 61 20 3d 20 35 29 20 7d 0a 20 20 20 20 33 20 7b  a = 5) }.    3 {
f440: 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54   EXISTS ( SELECT
f450: 20 32 34 20 57 48 45 52 45 20 30 29 20 7d 0a 20   24 WHERE 0) }. 
f460: 20 20 20 34 20 7b 20 45 58 49 53 54 53 20 28 20     4 { EXISTS ( 
f470: 53 45 4c 45 43 54 20 4e 55 4c 4c 20 57 48 45 52  SELECT NULL WHER
f480: 45 20 31 3d 32 29 20 7d 0a 7d 20 7b 0a 20 20 64  E 1=2) }.} {.  d
f490: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
f4a0: 70 72 2d 33 34 2e 33 2e 24 74 6e 20 24 65 78 70  pr-34.3.$tn $exp
f4b0: 72 20 69 6e 74 65 67 65 72 20 30 0a 7d 0a 0a 23  r integer 0.}..#
f4c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f4d0: 33 35 31 30 39 2d 34 39 31 33 39 20 54 68 65 20  35109-49139 The 
f4e0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
f4f0: 73 20 69 6e 20 65 61 63 68 20 72 6f 77 20 72 65  s in each row re
f500: 74 75 72 6e 65 64 0a 23 20 62 79 20 74 68 65 20  turned.# by the 
f510: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f520: 20 28 69 66 20 61 6e 79 29 20 61 6e 64 20 74 68   (if any) and th
f530: 65 20 73 70 65 63 69 66 69 63 20 76 61 6c 75 65  e specific value
f540: 73 20 72 65 74 75 72 6e 65 64 20 68 61 76 65 0a  s returned have.
f550: 23 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 74  # no effect on t
f560: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
f570: 65 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  e EXISTS operato
f580: 72 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  r..#.foreach {tn
f590: 20 65 78 70 72 20 72 65 73 7d 20 7b 0a 20 20 20   expr res} {.   
f5a0: 20 31 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   1 { EXISTS ( SE
f5b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 29  LECT * FROM t1 )
f5c0: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 20 20              1.  
f5e0: 20 20 32 20 7b 20 45 58 49 53 54 53 20 28 20 53    2 { EXISTS ( S
f5f0: 45 4c 45 43 54 20 2a 2c 20 2a 2c 20 2a 20 46 52  ELECT *, *, * FR
f600: 4f 4d 20 74 31 20 29 20 7d 20 20 20 20 20 20 20  OM t1 ) }       
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 20               1. 
f620: 20 20 20 33 20 7b 20 45 58 49 53 54 53 20 28 20     3 { EXISTS ( 
f630: 53 45 4c 45 43 54 20 32 34 2c 20 32 35 20 29 20  SELECT 24, 25 ) 
f640: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
f660: 20 20 20 20 34 20 7b 20 45 58 49 53 54 53 20 28      4 { EXISTS (
f670: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 4e 55   SELECT NULL, NU
f680: 4c 4c 2c 20 4e 55 4c 4c 20 29 20 7d 20 20 20 20  LL, NULL ) }    
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
f6a0: 0a 20 20 20 20 35 20 7b 20 45 58 49 53 54 53 20  .    5 { EXISTS 
f6b0: 28 20 53 45 4c 45 43 54 20 61 2c 62 2c 61 7c 7c  ( SELECT a,b,a||
f6c0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
f6d0: 61 20 49 53 20 4e 55 4c 4c 20 29 20 7d 20 20 20  a IS NULL ) }   
f6e0: 31 0a 0a 20 20 20 20 36 20 7b 20 45 58 49 53 54  1..    6 { EXIST
f6f0: 53 20 28 20 53 45 4c 45 43 54 20 61 2c 20 61 20  S ( SELECT a, a 
f700: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 30 29  FROM t1 WHERE 0)
f710: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
f720: 20 20 30 0a 20 20 20 20 37 20 7b 20 45 58 49 53    0.    7 { EXIS
f730: 54 53 20 28 20 53 45 4c 45 43 54 20 62 2c 20 62  TS ( SELECT b, b
f740: 2c 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  , a FROM t1 WHER
f750: 45 20 61 20 3d 20 35 29 20 7d 20 20 20 20 20 20  E a = 5) }      
f760: 20 20 20 30 0a 20 20 20 20 38 20 7b 20 45 58 49     0.    8 { EXI
f770: 53 54 53 20 28 20 53 45 4c 45 43 54 20 32 34 2c  STS ( SELECT 24,
f780: 20 34 36 2c 20 38 39 20 57 48 45 52 45 20 30 29   46, 89 WHERE 0)
f790: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
f7a0: 20 20 20 20 30 0a 20 20 20 20 39 20 7b 20 45 58      0.    9 { EX
f7b0: 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 4e 55  ISTS ( SELECT NU
f7c0: 4c 4c 2c 20 4e 55 4c 4c 20 57 48 45 52 45 20 31  LL, NULL WHERE 1
f7d0: 3d 32 29 20 7d 20 20 20 20 20 20 20 20 20 20 20  =2) }           
f7e0: 20 20 20 20 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f       0.} {.  do_
f7f0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
f800: 2d 33 34 2e 34 2e 24 74 6e 20 24 65 78 70 72 20  -34.4.$tn $expr 
f810: 69 6e 74 65 67 65 72 20 24 72 65 73 0a 7d 0a 0a  integer $res.}..
f820: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
f830: 2d 31 30 36 34 35 2d 31 32 34 33 39 20 49 6e 20  -10645-12439 In 
f840: 70 61 72 74 69 63 75 6c 61 72 2c 20 72 6f 77 73  particular, rows
f850: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55 4c 4c   containing NULL
f860: 20 76 61 6c 75 65 73 0a 23 20 61 72 65 20 6e 6f   values.# are no
f870: 74 20 68 61 6e 64 6c 65 64 20 61 6e 79 20 64 69  t handled any di
f880: 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 72  fferently from r
f890: 6f 77 73 20 77 69 74 68 6f 75 74 20 4e 55 4c 4c  ows without NULL
f8a0: 20 76 61 6c 75 65 73 2e 0a 23 0a 66 6f 72 65 61   values..#.forea
f8b0: 63 68 20 7b 74 6e 20 65 31 20 65 32 7d 20 7b 0a  ch {tn e1 e2} {.
f8c0: 20 20 31 20 7b 20 45 58 49 53 54 53 20 28 53 45    1 { EXISTS (SE
f8d0: 4c 45 43 54 20 27 6e 6f 74 20 6e 75 6c 6c 27 29  LECT 'not null')
f8e0: 20 7d 20 20 20 20 7b 20 45 58 49 53 54 53 20 28   }    { EXISTS (
f8f0: 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d 0a 20  SELECT NULL) }. 
f900: 20 32 20 7b 20 45 58 49 53 54 53 20 28 53 45 4c   2 { EXISTS (SEL
f910: 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31  ECT NULL FROM t1
f920: 29 20 7d 20 20 7b 20 45 58 49 53 54 53 20 28 53  ) }  { EXISTS (S
f930: 45 4c 45 43 54 20 27 62 72 65 61 64 27 20 46 52  ELECT 'bread' FR
f940: 4f 4d 20 74 31 29 20 7d 0a 7d 20 7b 0a 20 20 73  OM t1) }.} {.  s
f950: 65 74 20 72 65 73 20 5b 64 62 20 6f 6e 65 20 22  et res [db one "
f960: 53 45 4c 45 43 54 20 24 65 31 22 5d 0a 20 20 64  SELECT $e1"].  d
f970: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
f980: 70 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d 61 20 24  pr-34.5.${tn}a $
f990: 65 31 20 69 6e 74 65 67 65 72 20 24 72 65 73 0a  e1 integer $res.
f9a0: 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65    do_expr_test e
f9b0: 5f 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d  _expr-34.5.${tn}
f9c0: 62 20 24 65 32 20 69 6e 74 65 67 65 72 20 24 72  b $e2 integer $r
f9d0: 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  es.}..#---------
f9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa20: 0a 23 20 54 65 73 74 20 73 74 61 74 65 6d 65 6e  .# Test statemen
fa30: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 73 63  ts related to sc
fa40: 61 6c 61 72 20 73 75 62 2d 71 75 65 72 69 65 73  alar sub-queries
fa50: 2e 0a 23 0a 0a 63 61 74 63 68 20 7b 20 64 62 20  ..#..catch { db 
fa60: 63 6c 6f 73 65 20 7d 0a 66 69 6c 65 20 64 65 6c  close }.file del
fa70: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
fa80: 64 62 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  db.sqlite3 db te
fa90: 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 65 5f  st.db.do_test e_
faa0: 65 78 70 72 2d 33 35 2e 30 20 7b 0a 20 20 65 78  expr-35.0 {.  ex
fab0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
fac0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
fad0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
fae0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 6f 6e  TO t2 VALUES('on
faf0: 65 27 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20 20  e', 'two');.    
fb00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
fb10: 41 4c 55 45 53 28 27 74 68 72 65 65 27 2c 20 4e  ALUES('three', N
fb20: 55 4c 4c 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ULL);.    INSERT
fb30: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
fb40: 34 2c 20 35 2e 30 29 3b 0a 20 20 7d 0a 7d 20 7b  4, 5.0);.  }.} {
fb50: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
fb60: 3a 20 52 2d 30 30 39 38 30 2d 33 39 32 35 36 20  : R-00980-39256 
fb70: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
fb80: 6e 74 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 70  nt enclosed in p
fb90: 61 72 65 6e 74 68 65 73 65 73 0a 23 20 6d 61 79  arentheses.# may
fba0: 20 61 70 70 65 61 72 20 61 73 20 61 20 73 63 61   appear as a sca
fbb0: 6c 61 72 20 71 75 61 6e 74 69 74 79 2e 0a 23 0a  lar quantity..#.
fbc0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
fbd0: 2d 35 36 32 39 34 2d 30 33 39 36 36 20 41 6c 6c  -56294-03966 All
fbe0: 20 74 79 70 65 73 20 6f 66 20 53 45 4c 45 43 54   types of SELECT
fbf0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 69 6e 63 6c   statement, incl
fc00: 75 64 69 6e 67 0a 23 20 61 67 67 72 65 67 61 74  uding.# aggregat
fc10: 65 20 61 6e 64 20 63 6f 6d 70 6f 75 6e 64 20 53  e and compound S
fc20: 45 4c 45 43 54 20 71 75 65 72 69 65 73 20 28 71  ELECT queries (q
fc30: 75 65 72 69 65 73 20 77 69 74 68 20 6b 65 79 77  ueries with keyw
fc40: 6f 72 64 73 20 6c 69 6b 65 0a 23 20 55 4e 49 4f  ords like.# UNIO
fc50: 4e 20 6f 72 20 45 58 43 45 50 54 29 20 61 72 65  N or EXCEPT) are
fc60: 20 61 6c 6c 6f 77 65 64 20 61 73 20 73 63 61 6c   allowed as scal
fc70: 61 72 20 73 75 62 71 75 65 72 69 65 73 2e 0a 23  ar subqueries..#
fc80: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
fc90: 65 78 70 72 2d 33 35 2e 31 2e 31 20 7b 20 28 53  expr-35.1.1 { (S
fca0: 45 4c 45 43 54 20 33 35 29 20 20 20 7d 20 69 6e  ELECT 35)   } in
fcb0: 74 65 67 65 72 20 33 35 0a 64 6f 5f 65 78 70 72  teger 35.do_expr
fcc0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e  _test e_expr-35.
fcd0: 31 2e 32 20 7b 20 28 53 45 4c 45 43 54 20 4e 55  1.2 { (SELECT NU
fce0: 4c 4c 29 20 7d 20 6e 75 6c 6c 20 7b 7d 0a 0a 64  LL) } null {}..d
fcf0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
fd00: 70 72 2d 33 35 2e 31 2e 33 20 7b 20 28 53 45 4c  pr-35.1.3 { (SEL
fd10: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
fd20: 4d 20 74 32 29 20 7d 20 69 6e 74 65 67 65 72 20  M t2) } integer 
fd30: 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  3.do_expr_test e
fd40: 5f 65 78 70 72 2d 33 35 2e 31 2e 34 20 7b 20 28  _expr-35.1.4 { (
fd50: 53 45 4c 45 43 54 20 34 20 46 52 4f 4d 20 74 32  SELECT 4 FROM t2
fd60: 29 20 7d 20 69 6e 74 65 67 65 72 20 34 0a 0a 64  ) } integer 4..d
fd70: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
fd80: 70 72 2d 33 35 2e 31 2e 35 20 7b 20 0a 20 20 28  pr-35.1.5 { .  (
fd90: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
fda0: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61 2b   UNION SELECT a+
fdb0: 31 20 46 52 4f 4d 20 74 32 29 0a 7d 20 6e 75 6c  1 FROM t2).} nul
fdc0: 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73  l {}.do_expr_tes
fdd0: 74 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e 36 20  t e_expr-35.1.6 
fde0: 7b 20 0a 20 20 28 53 45 4c 45 43 54 20 61 20 46  { .  (SELECT a F
fdf0: 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c  ROM t2 UNION SEL
fe00: 45 43 54 20 43 4f 41 4c 45 53 43 45 28 62 2c 20  ECT COALESCE(b, 
fe10: 35 35 29 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  55) FROM t2 ORDE
fe20: 52 20 42 59 20 31 29 0a 7d 20 69 6e 74 65 67 65  R BY 1).} intege
fe30: 72 20 34 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  r 4..# EVIDENCE-
fe40: 4f 46 3a 20 52 2d 34 36 38 39 39 2d 35 33 37 36  OF: R-46899-5376
fe50: 35 20 41 20 53 45 4c 45 43 54 20 75 73 65 64 20  5 A SELECT used 
fe60: 61 73 20 61 20 73 63 61 6c 61 72 20 71 75 61 6e  as a scalar quan
fe70: 74 69 74 79 20 6d 75 73 74 0a 23 20 72 65 74 75  tity must.# retu
fe80: 72 6e 20 61 20 72 65 73 75 6c 74 20 73 65 74 20  rn a result set 
fe90: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 63 6f  with a single co
fea0: 6c 75 6d 6e 2e 0a 23 0a 23 20 54 68 65 20 66 6f  lumn..#.# The fo
feb0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 74 65  llowing block te
fec0: 73 74 73 20 74 68 61 74 20 65 72 72 6f 72 73 20  sts that errors 
fed0: 61 72 65 20 72 65 74 75 72 6e 65 64 20 69 6e 20  are returned in 
fee0: 61 20 62 75 6e 63 68 20 6f 66 20 63 61 73 65 73  a bunch of cases
fef0: 0a 23 20 77 68 65 72 65 20 61 20 73 75 62 71 75  .# where a subqu
ff00: 65 72 79 20 72 65 74 75 72 6e 73 20 6d 6f 72 65  ery returns more
ff10: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75 6d 6e   than one column
ff20: 2e 0a 23 0a 73 65 74 20 4d 20 7b 6f 6e 6c 79 20  ..#.set M {only 
ff30: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
ff40: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 20 53 45  allowed for a SE
ff50: 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72  LECT that is par
ff60: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
ff70: 6f 6e 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  on}.foreach {tn 
ff80: 73 71 6c 7d 20 7b 0a 20 20 31 20 20 20 20 20 7b  sql} {.  1     {
ff90: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
ffa0: 2a 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  * FROM t2 UNION 
ffb0: 53 45 4c 45 43 54 20 61 2b 31 2c 20 62 2b 31 20  SELECT a+1, b+1 
ffc0: 46 52 4f 4d 20 74 32 29 20 7d 0a 20 20 32 20 20  FROM t2) }.  2  
ffd0: 20 20 20 7b 20 53 45 4c 45 43 54 20 28 53 45 4c     { SELECT (SEL
ffe0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 55 4e  ECT * FROM t2 UN
fff0: 49 4f 4e 20 53 45 4c 45 43 54 20 61 2b 31 2c 20  ION SELECT a+1, 
10000 62 2b 31 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  b+1 FROM t2 ORDE
10010 52 20 42 59 20 31 29 20 7d 0a 20 20 33 20 20 20  R BY 1) }.  3   
10020 20 20 7b 20 53 45 4c 45 43 54 20 28 53 45 4c 45    { SELECT (SELE
10030 43 54 20 31 2c 20 32 29 20 7d 0a 20 20 34 20 20  CT 1, 2) }.  4  
10040 20 20 20 7b 20 53 45 4c 45 43 54 20 28 53 45 4c     { SELECT (SEL
10050 45 43 54 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  ECT NULL, NULL, 
10060 4e 55 4c 4c 29 20 7d 0a 20 20 35 20 20 20 20 20  NULL) }.  5     
10070 7b 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54  { SELECT (SELECT
10080 20 2a 20 46 52 4f 4d 20 74 32 29 20 7d 0a 20 20   * FROM t2) }.  
10090 36 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20 28  6     { SELECT (
100a0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
100b0 45 4c 45 43 54 20 31 2c 20 32 2c 20 33 29 29 20  ELECT 1, 2, 3)) 
100c0 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68  }.} {.  do_catch
100d0 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
100e0 33 35 2e 32 2e 24 74 6e 20 24 73 71 6c 20 5b 6c  35.2.$tn $sql [l
100f0 69 73 74 20 31 20 24 4d 5d 0a 7d 0a 0a 23 20 45  ist 1 $M].}..# E
10100 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 35  VIDENCE-OF: R-35
10110 37 36 34 2d 32 38 30 34 31 20 54 68 65 20 72 65  764-28041 The re
10120 73 75 6c 74 20 6f 66 20 74 68 65 20 65 78 70 72  sult of the expr
10130 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 76 61  ession is the va
10140 6c 75 65 0a 23 20 6f 66 20 74 68 65 20 6f 6e 6c  lue.# of the onl
10150 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  y column in the 
10160 66 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e  first row return
10170 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
10180 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 23 20   statement..#.# 
10190 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
101a0 31 38 39 38 2d 30 36 36 38 36 20 49 66 20 74 68  1898-06686 If th
101b0 65 20 53 45 4c 45 43 54 20 79 69 65 6c 64 73 20  e SELECT yields 
101c0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
101d0 73 75 6c 74 0a 23 20 72 6f 77 2c 20 61 6c 6c 20  sult.# row, all 
101e0 72 6f 77 73 20 61 66 74 65 72 20 74 68 65 20 66  rows after the f
101f0 69 72 73 74 20 61 72 65 20 69 67 6e 6f 72 65 64  irst are ignored
10200 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
10210 65 73 74 20 65 5f 65 78 70 72 2d 33 36 2e 33 2e  est e_expr-36.3.
10220 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  1 {.  CREATE TAB
10230 4c 45 20 74 34 28 78 2c 20 79 29 3b 0a 20 20 49  LE t4(x, y);.  I
10240 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
10250 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a  LUES(1, 'one');.
10260 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
10270 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27   VALUES(2, 'two'
10280 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
10290 20 74 34 20 56 41 4c 55 45 53 28 33 2c 20 27 74   t4 VALUES(3, 't
102a0 68 72 65 65 27 29 3b 0a 7d 20 7b 7d 0a 0a 66 6f  hree');.} {}..fo
102b0 72 65 61 63 68 20 7b 74 6e 20 65 78 70 72 20 72  reach {tn expr r
102c0 65 73 74 79 70 65 20 72 65 73 76 61 6c 7d 20 7b  estype resval} {
102d0 0a 20 20 20 20 32 20 20 7b 20 28 20 53 45 4c 45  .    2  { ( SELE
102e0 43 54 20 78 20 46 52 4f 4d 20 74 34 20 4f 52 44  CT x FROM t4 ORD
102f0 45 52 20 42 59 20 78 20 29 20 20 20 20 20 20 7d  ER BY x )      }
10300 20 20 20 20 20 20 20 20 69 6e 74 65 67 65 72 20          integer 
10310 31 0a 20 20 20 20 33 20 20 7b 20 28 20 53 45 4c  1.    3  { ( SEL
10320 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20 4f 52  ECT x FROM t4 OR
10330 44 45 52 20 42 59 20 79 20 29 20 20 20 20 20 20  DER BY y )      
10340 7d 20 20 20 20 20 20 20 20 69 6e 74 65 67 65 72  }        integer
10350 20 31 0a 20 20 20 20 34 20 20 7b 20 28 20 53 45   1.    4  { ( SE
10360 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20 4f  LECT x FROM t4 O
10370 52 44 45 52 20 42 59 20 78 20 44 45 53 43 20 29  RDER BY x DESC )
10380 20 7d 20 20 20 20 20 20 20 20 69 6e 74 65 67 65   }        intege
10390 72 20 33 0a 20 20 20 20 35 20 20 7b 20 28 20 53  r 3.    5  { ( S
103a0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20  ELECT x FROM t4 
103b0 4f 52 44 45 52 20 42 59 20 79 20 44 45 53 43 20  ORDER BY y DESC 
103c0 29 20 7d 20 20 20 20 20 20 20 20 69 6e 74 65 67  ) }        integ
103d0 65 72 20 32 0a 20 20 20 20 36 20 20 7b 20 28 20  er 2.    6  { ( 
103e0 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 34  SELECT y FROM t4
103f0 20 4f 52 44 45 52 20 42 59 20 79 20 44 45 53 43   ORDER BY y DESC
10400 20 29 20 7d 20 20 20 20 20 20 20 20 74 65 78 74   ) }        text
10410 20 20 20 20 74 77 6f 0a 0a 20 20 20 20 37 20 20      two..    7  
10420 7b 20 28 20 53 45 4c 45 43 54 20 73 75 6d 28 78  { ( SELECT sum(x
10430 29 20 46 52 4f 4d 20 74 34 20 29 20 20 20 20 20  ) FROM t4 )     
10440 20 20 20 20 20 20 7d 20 20 20 20 20 20 20 20 20        }         
10450 69 6e 74 65 67 65 72 20 36 0a 20 20 20 20 38 20  integer 6.    8 
10460 20 7b 20 28 20 53 45 4c 45 43 54 20 67 72 6f 75   { ( SELECT grou
10470 70 5f 63 6f 6e 63 61 74 28 79 2c 27 27 29 20 46  p_concat(y,'') F
10480 52 4f 4d 20 74 34 20 29 20 7d 20 20 20 20 20 20  ROM t4 ) }      
10490 20 74 65 78 74 20 20 20 20 6f 6e 65 74 77 6f 74   text    onetwot
104a0 68 72 65 65 0a 20 20 20 20 39 20 20 7b 20 28 20  hree.    9  { ( 
104b0 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
104c0 4f 4d 20 74 34 20 57 48 45 52 45 20 79 20 4c 49  OM t4 WHERE y LI
104d0 4b 45 20 27 5f 5f 5f 27 29 20 7d 20 69 6e 74 65  KE '___') } inte
104e0 67 65 72 20 32 20 0a 0a 7d 20 7b 0a 20 20 64 6f  ger 2 ..} {.  do
104f0 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
10500 72 2d 33 36 2e 33 2e 24 74 6e 20 24 65 78 70 72  r-36.3.$tn $expr
10510 20 24 72 65 73 74 79 70 65 20 24 72 65 73 76 61   $restype $resva
10520 6c 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  l.}..# EVIDENCE-
10530 4f 46 3a 20 52 2d 32 35 34 39 32 2d 34 31 35 37  OF: R-25492-4157
10540 32 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  2 If the SELECT 
10550 79 69 65 6c 64 73 20 6e 6f 20 72 6f 77 73 2c 20  yields no rows, 
10560 74 68 65 6e 20 74 68 65 0a 23 20 76 61 6c 75 65  then the.# value
10570 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
10580 6f 6e 20 69 73 20 4e 55 4c 4c 2e 0a 23 0a 66 6f  on is NULL..#.fo
10590 72 65 61 63 68 20 7b 74 6e 20 65 78 70 72 7d 20  reach {tn expr} 
105a0 7b 0a 20 20 20 20 31 20 20 7b 20 28 20 53 45 4c  {.    1  { ( SEL
105b0 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20 57 48  ECT x FROM t4 WH
105c0 45 52 45 20 78 3e 33 20 4f 52 44 45 52 20 42 59  ERE x>3 ORDER BY
105d0 20 78 20 29 20 20 20 20 20 20 7d 0a 20 20 20 20   x )      }.    
105e0 32 20 20 7b 20 28 20 53 45 4c 45 43 54 20 78 20  2  { ( SELECT x 
105f0 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 79 3c  FROM t4 WHERE y<
10600 27 6f 6e 65 27 20 4f 52 44 45 52 20 42 59 20 79  'one' ORDER BY y
10610 20 29 20 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 65   )  }.} {.  do_e
10620 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
10630 33 36 2e 34 2e 24 74 6e 20 24 65 78 70 72 20 6e  36.4.$tn $expr n
10640 75 6c 6c 20 7b 7d 0a 7d 0a 0a 0a 66 69 6e 69 73  ull {}.}...finis
10650 68 5f 74 65 73 74 0a 0a                          h_test..