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

Artifact 5cc73445ccac0fa6e16ef05ccb42021c8bdd0c0e:


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 69  oc_common.tcl..i
0240: 66 63 61 70 61 62 6c 65 20 21 63 6f 6d 70 6f 75  fcapable !compou
0250: 6e 64 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  nd {.  finish_te
0260: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70  st.  return.}..p
0270: 72 6f 63 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  roc do_expr_test
0280: 20 7b 74 6e 20 65 78 70 72 20 74 79 70 65 20 76   {tn expr type v
0290: 61 6c 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65  alue} {.  upleve
02a0: 6c 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l do_execsql_tes
02b0: 74 20 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c  t $tn [list "SEL
02c0: 45 43 54 20 74 79 70 65 6f 66 28 24 65 78 70 72  ECT typeof($expr
02d0: 29 2c 20 24 65 78 70 72 22 5d 20 5b 0a 20 20 20  ), $expr"] [.   
02e0: 20 6c 69 73 74 20 5b 6c 69 73 74 20 24 74 79 70   list [list $typ
02f0: 65 20 24 76 61 6c 75 65 5d 0a 20 20 5d 0a 7d 0a  e $value].  ].}.
0300: 0a 70 72 6f 63 20 64 6f 5f 71 65 78 70 72 5f 74  .proc do_qexpr_t
0310: 65 73 74 20 7b 74 6e 20 65 78 70 72 20 76 61 6c  est {tn expr val
0320: 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20  ue} {.  uplevel 
0330: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0340: 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c 45 43  $tn [list "SELEC
0350: 54 20 71 75 6f 74 65 28 24 65 78 70 72 29 22 5d  T quote($expr)"]
0360: 20 5b 6c 69 73 74 20 24 76 61 6c 75 65 5d 0a 7d   [list $value].}
0370: 0a 0a 23 20 53 65 74 20 75 70 20 74 68 72 65 65  ..# Set up three
0380: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0390: 73 3a 0a 23 0a 23 20 20 20 3a 3a 6f 70 6e 61 6d  s:.#.#   ::opnam
03a0: 65 20 20 20 20 20 20 20 20 20 41 6e 20 61 72 72  e         An arr
03b0: 61 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20  ay mapping from 
03c0: 53 51 4c 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  SQL operator to 
03d0: 61 6e 20 65 61 73 79 20 74 6f 20 70 61 72 73 65  an easy to parse
03e0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
03f0: 20 20 20 20 20 20 6e 61 6d 65 2e 20 54 68 65 20        name. The 
0400: 6e 61 6d 65 73 20 61 72 65 20 75 73 65 64 20 61  names are used a
0410: 73 20 70 61 72 74 20 6f 66 20 74 65 73 74 20 63  s part of test c
0420: 61 73 65 20 6e 61 6d 65 73 2e 0a 23 0a 23 20 20  ase names..#.#  
0430: 20 3a 3a 6f 70 70 72 65 63 20 20 20 20 20 20 20   ::opprec       
0440: 20 20 41 6e 20 61 72 72 61 79 20 6d 61 70 70 69    An array mappi
0450: 6e 67 20 66 72 6f 6d 20 53 51 4c 20 6f 70 65 72  ng from SQL oper
0460: 61 74 6f 72 20 74 6f 20 61 20 6e 75 6d 65 72 69  ator to a numeri
0470: 63 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  c.#             
0480: 20 20 20 20 20 20 20 70 72 65 63 65 64 65 6e 63         precedenc
0490: 65 20 76 61 6c 75 65 2e 20 4f 70 65 72 61 74 6f  e value. Operato
04a0: 72 73 20 74 68 61 74 20 67 72 6f 75 70 20 6d 6f  rs that group mo
04b0: 72 65 20 74 69 67 68 74 6c 79 0a 23 20 20 20 20  re tightly.#    
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 68 61 76 65 20 6c 6f 77 65 72 20 6e 75 6d 65 72  have lower numer
04e0: 69 63 20 70 72 65 63 65 64 65 6e 63 65 73 2e 0a  ic precedences..
04f0: 23 0a 23 20 20 20 3a 3a 6f 70 6c 69 73 74 20 20  #.#   ::oplist  
0500: 20 20 20 20 20 20 20 41 20 6c 69 73 74 20 6f 66         A list of
0510: 20 61 6c 6c 20 53 51 4c 20 6f 70 65 72 61 74 6f   all SQL operato
0520: 72 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  rs supported by 
0530: 53 51 4c 69 74 65 2e 0a 23 0a 66 6f 72 65 61 63  SQLite..#.foreac
0540: 68 20 7b 6f 70 20 6f 70 6e 7d 20 7b 0a 20 20 20  h {op opn} {.   
0550: 20 20 20 7c 7c 20 20 20 63 61 74 20 20 20 20 20     ||   cat     
0560: 2a 20 20 20 6d 75 6c 20 20 20 20 20 20 20 2f 20  *   mul       / 
0570: 20 64 69 76 20 20 20 20 20 20 20 25 20 20 20 20   div       %    
0580: 20 6d 6f 64 20 20 20 20 20 20 20 2b 20 20 20 20   mod       +    
0590: 20 20 61 64 64 0a 20 20 20 20 20 20 2d 20 20 20    add.      -   
05a0: 20 73 75 62 20 20 20 20 20 3c 3c 20 20 6c 73 68   sub     <<  lsh
05b0: 69 66 74 20 20 20 20 3e 3e 20 72 73 68 69 66 74  ift    >> rshift
05c0: 20 20 20 20 26 20 20 20 20 20 62 69 74 61 6e 64      &     bitand
05d0: 20 20 20 20 7c 20 20 20 20 20 20 62 69 74 6f 72      |      bitor
05e0: 0a 20 20 20 20 20 20 3c 20 20 20 20 6c 65 73 73  .      <    less
05f0: 20 20 20 20 3c 3d 20 20 6c 65 73 73 65 71 20 20      <=  lesseq  
0600: 20 20 3e 20 20 6d 6f 72 65 20 20 20 20 20 20 3e    >  more      >
0610: 3d 20 20 20 20 6d 6f 72 65 65 71 20 20 20 20 3d  =    moreeq    =
0620: 20 20 20 20 20 20 65 71 31 0a 20 20 20 20 20 20        eq1.      
0630: 3d 3d 20 20 20 65 71 32 20 20 20 20 20 3c 3e 20  ==   eq2     <> 
0640: 20 6e 65 31 20 20 20 20 20 20 20 21 3d 20 6e 65   ne1       != ne
0650: 32 20 20 20 20 20 20 20 49 53 20 20 20 20 69 73  2       IS    is
0660: 20 20 20 20 20 20 20 20 4c 49 4b 45 20 20 20 6c          LIKE   l
0670: 69 6b 65 0a 20 20 20 20 20 20 47 4c 4f 42 20 67  ike.      GLOB g
0680: 6c 6f 62 20 20 20 20 41 4e 44 20 61 6e 64 20 20  lob    AND and  
0690: 20 20 20 20 20 4f 52 20 6f 72 20 20 20 20 20 20       OR or      
06a0: 20 20 4d 41 54 43 48 20 6d 61 74 63 68 20 20 20    MATCH match   
06b0: 20 20 52 45 47 45 58 50 20 72 65 67 65 78 70 0a    REGEXP regexp.
06c0: 20 20 20 20 20 20 7b 49 53 20 4e 4f 54 7d 20 69        {IS NOT} i
06d0: 73 6e 74 0a 7d 20 7b 0a 20 20 73 65 74 20 3a 3a  snt.} {.  set ::
06e0: 6f 70 6e 61 6d 65 28 24 6f 70 29 20 24 6f 70 6e  opname($op) $opn
06f0: 0a 7d 0a 73 65 74 20 6f 70 6c 69 73 74 20 5b 6c  .}.set oplist [l
0700: 69 73 74 5d 0a 66 6f 72 65 61 63 68 20 7b 70 72  ist].foreach {pr
0710: 65 63 20 6f 70 6c 7d 20 7b 0a 20 20 31 20 20 20  ec opl} {.  1   
0720: 7c 7c 0a 20 20 32 20 20 20 7b 2a 20 2f 20 25 7d  ||.  2   {* / %}
0730: 0a 20 20 33 20 20 20 7b 2b 20 2d 7d 0a 20 20 34  .  3   {+ -}.  4
0740: 20 20 20 7b 3c 3c 20 3e 3e 20 26 20 7c 7d 0a 20     {<< >> & |}. 
0750: 20 35 20 20 20 7b 3c 20 3c 3d 20 3e 20 3e 3d 7d   5   {< <= > >=}
0760: 0a 20 20 36 20 20 20 7b 3d 20 3d 3d 20 21 3d 20  .  6   {= == != 
0770: 3c 3e 20 49 53 20 7b 49 53 20 4e 4f 54 7d 20 4c  <> IS {IS NOT} L
0780: 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48 20 52  IKE GLOB MATCH R
0790: 45 47 45 58 50 7d 0a 20 20 37 20 20 20 41 4e 44  EGEXP}.  7   AND
07a0: 0a 20 20 38 20 20 20 4f 52 0a 7d 20 7b 0a 20 20  .  8   OR.} {.  
07b0: 66 6f 72 65 61 63 68 20 6f 70 20 24 6f 70 6c 20  foreach op $opl 
07c0: 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6f 70 70  { .    set ::opp
07d0: 72 65 63 28 24 6f 70 29 20 24 70 72 65 63 20 0a  rec($op) $prec .
07e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 6f 70 6c 69      lappend opli
07f0: 73 74 20 24 6f 70 0a 20 20 7d 0a 7d 0a 0a 0a 23  st $op.  }.}...#
0800: 20 48 6f 6f 6b 20 69 6e 20 64 65 66 69 6e 69 74   Hook in definit
0810: 69 6f 6e 73 20 6f 66 20 4d 41 54 43 48 20 61 6e  ions of MATCH an
0820: 64 20 52 45 47 45 58 2e 20 54 68 65 20 66 6f 6c  d REGEX. The fol
0830: 6c 6f 77 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  lowing implement
0840: 61 74 69 6f 6e 73 0a 23 20 63 61 75 73 65 20 4d  ations.# cause M
0850: 41 54 43 48 20 61 6e 64 20 52 45 47 45 58 20 74  ATCH and REGEX t
0860: 6f 20 62 65 68 61 76 65 20 73 69 6d 69 6c 61 72  o behave similar
0870: 6c 79 20 74 6f 20 74 68 65 20 3d 3d 20 6f 70 65  ly to the == ope
0880: 72 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 6d 61  rator..#.proc ma
0890: 74 63 68 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20  tchfunc {a b} { 
08a0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 61  return [expr {$a
08b0: 3d 3d 24 62 7d 5d 20 7d 0a 70 72 6f 63 20 72 65  ==$b}] }.proc re
08c0: 67 65 78 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20  gexfunc {a b} { 
08d0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 61  return [expr {$a
08e0: 3d 3d 24 62 7d 5d 20 7d 0a 64 62 20 66 75 6e 63  ==$b}] }.db func
08f0: 20 6d 61 74 63 68 20 20 2d 61 72 67 63 6f 75 6e   match  -argcoun
0900: 74 20 32 20 6d 61 74 63 68 66 75 6e 63 0a 64 62  t 2 matchfunc.db
0910: 20 66 75 6e 63 20 72 65 67 65 78 70 20 2d 61 72   func regexp -ar
0920: 67 63 6f 75 6e 74 20 32 20 72 65 67 65 78 66 75  gcount 2 regexfu
0930: 6e 63 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  nc..#-----------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0980: 20 54 65 73 74 20 63 61 73 65 73 20 65 5f 65 78   Test cases e_ex
0990: 70 72 2d 31 2e 2a 20 61 74 74 65 6d 70 74 20 74  pr-1.* attempt t
09a0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61 6c  o verify that al
09b0: 6c 20 62 69 6e 61 72 79 20 6f 70 65 72 61 74 6f  l binary operato
09c0: 72 73 20 6c 69 73 74 65 64 0a 23 20 69 6e 20 74  rs listed.# in t
09d0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
09e0: 20 65 78 69 73 74 20 61 6e 64 20 74 68 61 74 20   exist and that 
09f0: 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 72 65  the relative pre
0a00: 63 65 64 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  cedences of the.
0a10: 23 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  # operators are 
0a20: 61 6c 73 6f 20 61 73 20 74 68 65 20 64 6f 63 75  also as the docu
0a30: 6d 65 6e 74 61 74 69 6f 6e 20 73 75 67 67 65 73  mentation sugges
0a40: 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ts..#.# EVIDENCE
0a50: 2d 4f 46 3a 20 52 2d 31 35 35 31 34 2d 36 35 31  -OF: R-15514-651
0a60: 36 33 20 53 51 4c 69 74 65 20 75 6e 64 65 72 73  63 SQLite unders
0a70: 74 61 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f 77  tands the follow
0a80: 69 6e 67 20 62 69 6e 61 72 79 0a 23 20 6f 70 65  ing binary.# ope
0a90: 72 61 74 6f 72 73 2c 20 69 6e 20 6f 72 64 65 72  rators, in order
0aa0: 20 66 72 6f 6d 20 68 69 67 68 65 73 74 20 74 6f   from highest to
0ab0: 20 6c 6f 77 65 73 74 20 70 72 65 63 65 64 65 6e   lowest preceden
0ac0: 63 65 3a 20 7c 7c 20 2a 20 2f 20 25 20 2b 20 2d  ce: || * / % + -
0ad0: 0a 23 20 3c 3c 20 3e 3e 20 26 20 7c 20 3c 20 3c  .# << >> & | < <
0ae0: 3d 20 3e 20 3e 3d 20 3d 20 3d 3d 20 21 3d 20 3c  = > >= = == != <
0af0: 3e 20 49 53 20 49 53 0a 23 20 4e 4f 54 20 49 4e  > IS IS.# NOT IN
0b00: 20 4c 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48   LIKE GLOB MATCH
0b10: 20 52 45 47 45 58 50 20 41 4e 44 20 4f 52 0a 23   REGEXP AND OR.#
0b20: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
0b30: 52 2d 33 38 37 35 39 2d 33 38 37 38 39 20 4f 70  R-38759-38789 Op
0b40: 65 72 61 74 6f 72 73 20 49 53 20 61 6e 64 20 49  erators IS and I
0b50: 53 20 4e 4f 54 20 68 61 76 65 20 74 68 65 20 73  S NOT have the s
0b60: 61 6d 65 0a 23 20 70 72 65 63 65 64 65 6e 63 65  ame.# precedence
0b70: 20 61 73 20 3d 2e 0a 23 0a 0a 75 6e 73 65 74 20   as =..#..unset 
0b80: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 75 6e 74 65  -nocomplain unte
0b90: 73 74 65 64 0a 66 6f 72 65 61 63 68 20 6f 70 31  sted.foreach op1
0ba0: 20 24 6f 70 6c 69 73 74 20 7b 0a 20 20 66 6f 72   $oplist {.  for
0bb0: 65 61 63 68 20 6f 70 32 20 24 6f 70 6c 69 73 74  each op2 $oplist
0bc0: 20 7b 0a 20 20 20 20 73 65 74 20 75 6e 74 65 73   {.    set untes
0bd0: 74 65 64 28 24 6f 70 31 2c 24 6f 70 32 29 20 31  ted($op1,$op2) 1
0be0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 74 6e  .    foreach {tn
0bf0: 20 41 20 42 20 43 7d 20 7b 0a 20 20 20 20 20 20   A B C} {.      
0c00: 20 31 20 20 20 20 20 32 32 20 20 20 34 35 20 20   1     22   45  
0c10: 20 20 36 36 0a 20 20 20 20 20 20 20 32 20 20 20    66.       2   
0c20: 20 20 20 30 20 20 20 20 30 20 20 20 20 20 30 0a     0    0     0.
0c30: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 30 20         3      0 
0c40: 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20 20     0     1.     
0c50: 20 20 34 20 20 20 20 20 20 30 20 20 20 20 31 20    4      0    1 
0c60: 20 20 20 20 30 0a 20 20 20 20 20 20 20 35 20 20      0.       5  
0c70: 20 20 20 20 30 20 20 20 20 31 20 20 20 20 20 31      0    1     1
0c80: 0a 20 20 20 20 20 20 20 36 20 20 20 20 20 20 31  .       6      1
0c90: 20 20 20 20 30 20 20 20 20 20 30 0a 20 20 20 20      0     0.    
0ca0: 20 20 20 37 20 20 20 20 20 20 31 20 20 20 20 30     7      1    0
0cb0: 20 20 20 20 20 31 0a 20 20 20 20 20 20 20 38 20       1.       8 
0cc0: 20 20 20 20 20 31 20 20 20 20 31 20 20 20 20 20       1    1     
0cd0: 30 0a 20 20 20 20 20 20 20 39 20 20 20 20 20 20  0.       9      
0ce0: 31 20 20 20 20 31 20 20 20 20 20 31 0a 20 20 20  1    1     1.   
0cf0: 20 20 20 31 30 20 20 20 20 20 20 35 20 20 20 20     10      5    
0d00: 36 20 20 20 20 20 31 0a 20 20 20 20 20 20 31 31  6     1.      11
0d10: 20 20 20 20 20 20 31 20 20 20 20 35 20 20 20 20        1    5    
0d20: 20 36 0a 20 20 20 20 20 20 31 32 20 20 20 20 20   6.      12     
0d30: 20 31 20 20 20 20 35 20 20 20 20 20 35 0a 20 20   1    5     5.  
0d40: 20 20 20 20 31 33 20 20 20 20 20 20 35 20 20 20      13      5   
0d50: 20 35 20 20 20 20 20 31 0a 0a 20 20 20 20 20 20   5     1..      
0d60: 31 34 20 20 20 20 20 20 35 20 20 20 20 32 20 20  14      5    2  
0d70: 20 20 20 31 0a 20 20 20 20 20 20 31 35 20 20 20     1.      15   
0d80: 20 20 20 31 20 20 20 20 34 20 20 20 20 20 31 0a     1    4     1.
0d90: 20 20 20 20 20 20 31 36 20 20 20 20 20 2d 31 20        16     -1 
0da0: 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20 20     0     1.     
0db0: 20 31 37 20 20 20 20 20 20 30 20 20 20 20 31 20   17      0    1 
0dc0: 20 20 20 2d 31 0a 0a 20 20 20 20 7d 20 7b 0a 20     -1..    } {. 
0dd0: 20 20 20 20 20 73 65 74 20 74 65 73 74 6e 61 6d       set testnam
0de0: 65 20 22 65 5f 65 78 70 72 2d 31 2e 24 6f 70 6e  e "e_expr-1.$opn
0df0: 61 6d 65 28 24 6f 70 31 29 2e 24 6f 70 6e 61 6d  ame($op1).$opnam
0e00: 65 28 24 6f 70 32 29 2e 24 74 6e 22 0a 0a 20 20  e($op2).$tn"..  
0e10: 20 20 20 20 23 20 49 66 20 24 6f 70 32 20 67 72      # If $op2 gr
0e20: 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74 6c  oups more tightl
0e30: 79 20 74 68 61 6e 20 24 6f 70 31 2c 20 74 68 65  y than $op1, the
0e40: 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  n the result.   
0e50: 20 20 20 23 20 6f 66 20 65 78 65 63 75 74 69 6e     # of executin
0e60: 67 20 24 73 71 6c 31 20 77 68 6f 75 6c 64 20 62  g $sql1 whould b
0e70: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78  e the same as ex
0e80: 65 63 75 74 69 6e 67 20 24 73 71 6c 33 2e 0a 20  ecuting $sql3.. 
0e90: 20 20 20 20 20 23 20 49 66 20 24 6f 70 31 20 67       # If $op1 g
0ea0: 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74  roups more tight
0eb0: 6c 79 2c 20 6f 72 20 69 66 20 24 6f 70 31 20 61  ly, or if $op1 a
0ec0: 6e 64 20 24 6f 70 32 20 68 61 76 65 20 0a 20 20  nd $op2 have .  
0ed0: 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20 70      # the same p
0ee0: 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 6e 20  recedence, then 
0ef0: 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c 31 20  executing $sql1 
0f00: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20 20  should return.  
0f10: 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20 76      # the same v
0f20: 61 6c 75 65 20 61 73 20 24 73 71 6c 32 2e 0a 20  alue as $sql2.. 
0f30: 20 20 20 20 20 23 0a 20 20 20 20 20 20 73 65 74       #.      set
0f40: 20 73 71 6c 31 20 22 53 45 4c 45 43 54 20 24 41   sql1 "SELECT $A
0f50: 20 24 6f 70 31 20 24 42 20 24 6f 70 32 20 24 43   $op1 $B $op2 $C
0f60: 22 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 32  ".      set sql2
0f70: 20 22 53 45 4c 45 43 54 20 28 24 41 20 24 6f 70   "SELECT ($A $op
0f80: 31 20 24 42 29 20 24 6f 70 32 20 24 43 22 0a 20  1 $B) $op2 $C". 
0f90: 20 20 20 20 20 73 65 74 20 73 71 6c 33 20 22 53       set sql3 "S
0fa0: 45 4c 45 43 54 20 24 41 20 24 6f 70 31 20 28 24  ELECT $A $op1 ($
0fb0: 42 20 24 6f 70 32 20 24 43 29 22 0a 0a 20 20 20  B $op2 $C)"..   
0fc0: 20 20 20 73 65 74 20 61 32 20 5b 64 62 20 6f 6e     set a2 [db on
0fd0: 65 20 24 73 71 6c 32 5d 0a 20 20 20 20 20 20 73  e $sql2].      s
0fe0: 65 74 20 61 33 20 5b 64 62 20 6f 6e 65 20 24 73  et a3 [db one $s
0ff0: 71 6c 33 5d 0a 0a 20 20 20 20 20 20 64 6f 5f 65  ql3]..      do_e
1000: 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 65 73  xecsql_test $tes
1010: 74 6e 61 6d 65 20 24 73 71 6c 31 20 5b 6c 69 73  tname $sql1 [lis
1020: 74 20 5b 0a 20 20 20 20 20 20 20 20 69 66 20 7b  t [.        if {
1030: 24 6f 70 70 72 65 63 28 24 6f 70 32 29 20 3c 20  $opprec($op2) < 
1040: 24 6f 70 70 72 65 63 28 24 6f 70 31 29 7d 20 7b  $opprec($op1)} {
1050: 73 65 74 20 61 33 7d 20 7b 73 65 74 20 61 32 7d  set a3} {set a2}
1060: 0a 20 20 20 20 20 20 5d 5d 0a 20 20 20 20 20 20  .      ]].      
1070: 69 66 20 7b 24 61 32 20 21 3d 20 24 61 33 7d 20  if {$a2 != $a3} 
1080: 7b 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  { unset -nocompl
1090: 61 69 6e 20 75 6e 74 65 73 74 65 64 28 24 6f 70  ain untested($op
10a0: 31 2c 24 6f 70 32 29 20 7d 0a 20 20 20 20 7d 0a  1,$op2) }.    }.
10b0: 20 20 7d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 6f    }.}..foreach o
10c0: 70 20 7b 2a 20 41 4e 44 20 4f 52 20 2b 20 7c 7c  p {* AND OR + ||
10d0: 20 26 20 7c 7d 20 7b 20 75 6e 73 65 74 20 75 6e   & |} { unset un
10e0: 74 65 73 74 65 64 28 24 6f 70 2c 24 6f 70 29 20  tested($op,$op) 
10f0: 7d 0a 75 6e 73 65 74 20 75 6e 74 65 73 74 65 64  }.unset untested
1100: 28 2b 2c 2d 29 20 20 3b 23 20 20 20 20 20 20 20  (+,-)  ;#       
1110: 53 69 6e 63 65 20 20 20 20 28 61 2b 62 29 2d 63  Since    (a+b)-c
1120: 20 3d 3d 20 61 2b 28 62 2d 63 29 0a 75 6e 73 65   == a+(b-c).unse
1130: 74 20 75 6e 74 65 73 74 65 64 28 2a 2c 3c 3c 29  t untested(*,<<)
1140: 20 3b 23 20 20 20 20 20 20 20 53 69 6e 63 65 20   ;#       Since 
1150: 20 20 20 28 61 2a 62 29 3c 3c 63 20 3d 3d 20 61     (a*b)<<c == a
1160: 2a 28 62 3c 3c 63 29 0a 0a 64 6f 5f 74 65 73 74  *(b<<c)..do_test
1170: 20 65 5f 65 78 70 72 2d 31 2e 31 20 7b 20 61 72   e_expr-1.1 { ar
1180: 72 61 79 20 6e 61 6d 65 73 20 75 6e 74 65 73 74  ray names untest
1190: 65 64 20 7d 20 7b 7d 0a 0a 23 20 41 74 20 6f 6e  ed } {}..# At on
11a0: 65 20 70 6f 69 6e 74 2c 20 74 65 73 74 20 31 2e  e point, test 1.
11b0: 32 2e 32 20 77 61 73 20 66 61 69 6c 69 6e 67 2e  2.2 was failing.
11c0: 20 49 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   Instead of the 
11d0: 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 2c 20  correct result, 
11e0: 69 74 0a 23 20 77 61 73 20 72 65 74 75 72 6e 69  it.# was returni
11f0: 6e 67 20 7b 31 20 31 20 30 7d 2e 20 54 68 69 73  ng {1 1 0}. This
1200: 20 77 6f 75 6c 64 20 73 65 65 6d 20 74 6f 20 69   would seem to i
1210: 6e 64 69 63 61 74 65 20 74 68 61 74 20 4c 49 4b  ndicate that LIK
1220: 45 20 68 61 73 20 74 68 65 0a 23 20 73 61 6d 65  E has the.# same
1230: 20 70 72 65 63 65 64 65 6e 63 65 20 61 73 20 27   precedence as '
1240: 3c 27 2e 20 57 68 69 63 68 20 69 73 20 69 6e 63  <'. Which is inc
1250: 6f 72 72 65 63 74 2e 20 49 74 20 68 61 73 20 6c  orrect. It has l
1260: 6f 77 65 72 20 70 72 65 63 65 64 65 6e 63 65 2e  ower precedence.
1270: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1280: 73 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 31 20  st e_expr-1.2.1 
1290: 7b 20 0a 20 20 53 45 4c 45 43 54 20 30 20 3c 20  { .  SELECT 0 < 
12a0: 32 20 4c 49 4b 45 20 31 2c 20 20 20 28 30 20 3c  2 LIKE 1,   (0 <
12b0: 20 32 29 20 4c 49 4b 45 20 31 2c 20 20 20 30 20   2) LIKE 1,   0 
12c0: 3c 20 28 32 20 4c 49 4b 45 20 31 29 0a 7d 20 7b  < (2 LIKE 1).} {
12d0: 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71  1 1 0}.do_execsq
12e0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 2e  l_test e_expr-1.
12f0: 32 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  2.2 { .  SELECT 
1300: 30 20 4c 49 4b 45 20 30 20 3c 20 32 2c 20 20 20  0 LIKE 0 < 2,   
1310: 28 30 20 4c 49 4b 45 20 30 29 20 3c 20 32 2c 20  (0 LIKE 0) < 2, 
1320: 20 20 30 20 4c 49 4b 45 20 28 30 20 3c 20 32 29    0 LIKE (0 < 2)
1330: 0a 7d 20 7b 30 20 31 20 30 7d 0a 0a 23 20 53 68  .} {0 1 0}..# Sh
1340: 6f 77 69 6e 67 20 74 68 61 74 20 4c 49 4b 45 20  owing that LIKE 
1350: 61 6e 64 20 3d 3d 20 68 61 76 65 20 74 68 65 20  and == have the 
1360: 73 61 6d 65 20 70 72 65 63 65 64 65 6e 63 65 0a  same precedence.
1370: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
1380: 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 33 20 7b  t e_expr-1.2.3 {
1390: 20 0a 20 20 53 45 4c 45 43 54 20 32 20 4c 49 4b   .  SELECT 2 LIK
13a0: 45 20 32 20 3d 3d 20 31 2c 20 20 20 28 32 20 4c  E 2 == 1,   (2 L
13b0: 49 4b 45 20 32 29 20 3d 3d 20 31 2c 20 20 20 20  IKE 2) == 1,    
13c0: 32 20 4c 49 4b 45 20 28 32 20 3d 3d 20 31 29 0a  2 LIKE (2 == 1).
13d0: 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65  } {1 1 0}.do_exe
13e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
13f0: 2d 31 2e 32 2e 34 20 7b 20 0a 20 20 53 45 4c 45  -1.2.4 { .  SELE
1400: 43 54 20 32 20 3d 3d 20 32 20 4c 49 4b 45 20 31  CT 2 == 2 LIKE 1
1410: 2c 20 20 20 28 32 20 3d 3d 20 32 29 20 4c 49 4b  ,   (2 == 2) LIK
1420: 45 20 31 2c 20 20 20 20 32 20 3d 3d 20 28 32 20  E 1,    2 == (2 
1430: 4c 49 4b 45 20 31 29 0a 7d 20 7b 31 20 31 20 30  LIKE 1).} {1 1 0
1440: 7d 0a 0a 23 20 53 68 6f 77 69 6e 67 20 74 68 61  }..# Showing tha
1450: 74 20 3c 20 67 72 6f 75 70 73 20 6d 6f 72 65 20  t < groups more 
1460: 74 69 67 68 74 6c 79 20 74 68 61 6e 20 3d 3d 20  tightly than == 
1470: 28 3c 20 68 61 73 20 68 69 67 68 65 72 20 70 72  (< has higher pr
1480: 65 63 65 64 65 6e 63 65 29 2e 20 0a 23 0a 64 6f  ecedence). .#.do
1490: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
14a0: 65 78 70 72 2d 31 2e 32 2e 35 20 7b 20 0a 20 20  expr-1.2.5 { .  
14b0: 53 45 4c 45 43 54 20 30 20 3c 20 32 20 3d 3d 20  SELECT 0 < 2 == 
14c0: 31 2c 20 20 20 28 30 20 3c 20 32 29 20 3d 3d 20  1,   (0 < 2) == 
14d0: 31 2c 20 20 20 30 20 3c 20 28 32 20 3d 3d 20 31  1,   0 < (2 == 1
14e0: 29 0a 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65  ).} {1 1 0}.do_e
14f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
1500: 70 72 2d 31 2e 36 20 7b 20 0a 20 20 53 45 4c 45  pr-1.6 { .  SELE
1510: 43 54 20 30 20 3d 3d 20 30 20 3c 20 32 2c 20 20  CT 0 == 0 < 2,  
1520: 20 28 30 20 3d 3d 20 30 29 20 3c 20 32 2c 20 20   (0 == 0) < 2,  
1530: 20 30 20 3d 3d 20 28 30 20 3c 20 32 29 0a 7d 20   0 == (0 < 2).} 
1540: 7b 30 20 31 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  {0 1 0}..#------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
15a0: 20 74 68 65 20 66 6f 75 72 20 75 6e 61 72 79 20   the four unary 
15b0: 70 72 65 66 69 78 20 6f 70 65 72 61 74 6f 72 73  prefix operators
15c0: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
15d0: 65 20 0a 23 20 64 6f 63 75 6d 65 6e 74 61 74 69  e .# documentati
15e0: 6f 6e 20 65 78 69 73 74 2e 0a 23 0a 23 20 45 56  on exist..#.# EV
15f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 39  IDENCE-OF: R-139
1600: 35 38 2d 35 33 34 31 39 20 53 75 70 70 6f 72 74  58-53419 Support
1610: 65 64 20 75 6e 61 72 79 20 70 72 65 66 69 78 20  ed unary prefix 
1620: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 74 68  operators are th
1630: 65 73 65 3a 0a 23 20 2d 20 2b 20 7e 20 4e 4f 54  ese:.# - + ~ NOT
1640: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1650: 73 74 20 65 5f 65 78 70 72 2d 32 2e 31 20 7b 20  st e_expr-2.1 { 
1660: 53 45 4c 45 43 54 20 2d 20 20 20 31 30 20 20 20  SELECT -   10   
1670: 7d 20 7b 2d 31 30 7d 0a 64 6f 5f 65 78 65 63 73  } {-10}.do_execs
1680: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
1690: 2e 32 20 7b 20 53 45 4c 45 43 54 20 2b 20 20 20  .2 { SELECT +   
16a0: 31 30 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65  10   } {10}.do_e
16b0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
16c0: 70 72 2d 32 2e 33 20 7b 20 53 45 4c 45 43 54 20  pr-2.3 { SELECT 
16d0: 7e 20 20 20 31 30 20 20 20 7d 20 7b 2d 31 31 7d  ~   10   } {-11}
16e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
16f0: 20 65 5f 65 78 70 72 2d 32 2e 34 20 7b 20 53 45   e_expr-2.4 { SE
1700: 4c 45 43 54 20 4e 4f 54 20 31 30 20 20 20 7d 20  LECT NOT 10   } 
1710: 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {0}..#----------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1760: 23 20 54 65 73 74 73 20 66 6f 72 20 74 68 65 20  # Tests for the 
1770: 74 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 6d  two statements m
1780: 61 64 65 20 72 65 67 61 72 64 69 6e 67 20 74 68  ade regarding th
1790: 65 20 75 6e 61 72 79 20 2b 20 6f 70 65 72 61 74  e unary + operat
17a0: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
17b0: 2d 4f 46 3a 20 52 2d 35 33 36 37 30 2d 30 33 33  -OF: R-53670-033
17c0: 37 33 20 54 68 65 20 75 6e 61 72 79 20 6f 70 65  73 The unary ope
17d0: 72 61 74 6f 72 20 2b 20 69 73 20 61 20 6e 6f 2d  rator + is a no-
17e0: 6f 70 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  op..#.# EVIDENCE
17f0: 2d 4f 46 3a 20 52 2d 31 39 34 38 30 2d 33 30 39  -OF: R-19480-309
1800: 36 38 20 49 74 20 63 61 6e 20 62 65 20 61 70 70  68 It can be app
1810: 6c 69 65 64 20 74 6f 20 73 74 72 69 6e 67 73 2c  lied to strings,
1820: 20 6e 75 6d 62 65 72 73 2c 0a 23 20 62 6c 6f 62   numbers,.# blob
1830: 73 20 6f 72 20 4e 55 4c 4c 20 61 6e 64 20 69 74  s or NULL and it
1840: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1850: 61 20 72 65 73 75 6c 74 20 77 69 74 68 20 74 68  a result with th
1860: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 0a  e same value as.
1870: 23 20 74 68 65 20 6f 70 65 72 61 6e 64 2e 0a 23  # the operand..#
1880: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6c 69 74  .foreach {tn lit
1890: 65 72 61 6c 20 74 79 70 65 7d 20 7b 0a 20 20 31  eral type} {.  1
18a0: 20 20 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c 64       'helloworld
18b0: 27 20 20 20 74 65 78 74 0a 20 20 32 20 20 20 20  '   text.  2    
18c0: 20 34 35 20 20 20 20 20 20 20 20 20 20 20 20 20   45             
18d0: 69 6e 74 65 67 65 72 0a 20 20 33 20 20 20 20 20  integer.  3     
18e0: 34 35 2e 32 20 20 20 20 20 20 20 20 20 20 20 72  45.2           r
18f0: 65 61 6c 0a 20 20 34 20 20 20 20 20 34 35 2e 30  eal.  4     45.0
1900: 20 20 20 20 20 20 20 20 20 20 20 72 65 61 6c 0a             real.
1910: 20 20 35 20 20 20 20 20 58 27 41 42 43 44 45 46    5     X'ABCDEF
1920: 27 20 20 20 20 20 20 62 6c 6f 62 0a 20 20 36 20  '      blob.  6 
1930: 20 20 20 20 4e 55 4c 4c 20 20 20 20 20 20 20 20      NULL        
1940: 20 20 20 6e 75 6c 6c 0a 7d 20 7b 0a 20 20 73 65     null.} {.  se
1950: 74 20 73 71 6c 20 22 20 53 45 4c 45 43 54 20 71  t sql " SELECT q
1960: 75 6f 74 65 28 20 2b 20 24 6c 69 74 65 72 61 6c  uote( + $literal
1970: 20 29 2c 20 74 79 70 65 6f 66 28 20 2b 20 24 6c   ), typeof( + $l
1980: 69 74 65 72 61 6c 29 20 22 0a 20 20 64 6f 5f 65  iteral) ".  do_e
1990: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
19a0: 70 72 2d 33 2e 24 74 6e 20 24 73 71 6c 20 5b 6c  pr-3.$tn $sql [l
19b0: 69 73 74 20 24 6c 69 74 65 72 61 6c 20 24 74 79  ist $literal $ty
19c0: 70 65 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  pe].}..#--------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a10: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 62  -.# Check that b
1a20: 6f 74 68 20 3d 20 61 6e 64 20 3d 3d 20 61 72 65  oth = and == are
1a30: 20 62 6f 74 68 20 61 63 63 65 70 74 61 62 6c 65   both acceptable
1a40: 20 61 73 20 74 68 65 20 22 65 71 75 61 6c 73 22   as the "equals"
1a50: 20 6f 70 65 72 61 74 6f 72 2e 0a 23 20 53 69 6d   operator..# Sim
1a60: 69 6c 61 72 6c 79 2c 20 65 69 74 68 65 72 20 21  ilarly, either !
1a70: 3d 20 6f 72 20 3c 3e 20 77 6f 72 6b 20 61 73 20  = or <> work as 
1a80: 74 68 65 20 6e 6f 74 2d 65 71 75 61 6c 73 20 6f  the not-equals o
1a90: 70 65 72 61 74 6f 72 2e 0a 23 0a 23 20 45 56 49  perator..#.# EVI
1aa0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 37  DENCE-OF: R-0367
1ab0: 39 2d 36 30 36 33 39 20 45 71 75 61 6c 73 20 63  9-60639 Equals c
1ac0: 61 6e 20 62 65 20 65 69 74 68 65 72 20 3d 20 6f  an be either = o
1ad0: 72 20 3d 3d 2e 0a 23 0a 23 20 45 56 49 44 45 4e  r ==..#.# EVIDEN
1ae0: 43 45 2d 4f 46 3a 20 52 2d 33 30 30 38 32 2d 33  CE-OF: R-30082-3
1af0: 38 39 39 36 20 54 68 65 20 6e 6f 6e 2d 65 71 75  8996 The non-equ
1b00: 61 6c 73 20 6f 70 65 72 61 74 6f 72 20 63 61 6e  als operator can
1b10: 20 62 65 20 65 69 74 68 65 72 20 21 3d 20 6f 72   be either != or
1b20: 0a 23 20 3c 3e 2e 0a 23 0a 66 6f 72 65 61 63 68  .# <>..#.foreach
1b30: 20 7b 74 6e 20 6c 69 74 65 72 61 6c 20 64 69 66   {tn literal dif
1b40: 66 65 72 65 6e 74 7d 20 7b 0a 20 20 31 20 20 20  ferent} {.  1   
1b50: 27 68 65 6c 6c 6f 77 6f 72 6c 64 27 20 20 27 31  'helloworld'  '1
1b60: 32 33 34 35 27 0a 20 20 32 20 20 20 32 32 20 20  2345'.  2   22  
1b70: 20 20 20 20 20 20 20 20 20 20 32 33 0a 20 20 33            23.  3
1b80: 20 20 20 27 78 79 7a 27 20 20 20 20 20 20 20 20     'xyz'        
1b90: 20 58 27 37 38 37 39 37 41 27 0a 20 20 34 20 20   X'78797A'.  4  
1ba0: 20 58 27 37 38 37 39 37 41 30 30 27 20 20 20 27   X'78797A00'   '
1bb0: 78 79 7a 27 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78  xyz'.} {.  do_ex
1bc0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
1bd0: 72 2d 34 2e 24 74 6e 20 22 0a 20 20 20 20 53 45  r-4.$tn ".    SE
1be0: 4c 45 43 54 20 24 6c 69 74 65 72 61 6c 20 20 3d  LECT $literal  =
1bf0: 20 24 6c 69 74 65 72 61 6c 2c 20 20 20 24 6c 69   $literal,   $li
1c00: 74 65 72 61 6c 20 3d 3d 20 24 6c 69 74 65 72 61  teral == $litera
1c10: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24 6c  l,.           $l
1c20: 69 74 65 72 61 6c 20 20 3d 20 24 64 69 66 66 65  iteral  = $diffe
1c30: 72 65 6e 74 2c 20 24 6c 69 74 65 72 61 6c 20 3d  rent, $literal =
1c40: 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 0a 20 20  = $different,.  
1c50: 20 20 20 20 20 20 20 20 20 24 6c 69 74 65 72 61           $litera
1c60: 6c 20 20 3d 20 4e 55 4c 4c 2c 20 20 20 20 20 20  l  = NULL,      
1c70: 20 24 6c 69 74 65 72 61 6c 20 3d 3d 20 4e 55 4c   $literal == NUL
1c80: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24 6c  L,.           $l
1c90: 69 74 65 72 61 6c 20 21 3d 20 24 6c 69 74 65 72  iteral != $liter
1ca0: 61 6c 2c 20 20 20 24 6c 69 74 65 72 61 6c 20 3c  al,   $literal <
1cb0: 3e 20 24 6c 69 74 65 72 61 6c 2c 0a 20 20 20 20  > $literal,.    
1cc0: 20 20 20 20 20 20 20 24 6c 69 74 65 72 61 6c 20         $literal 
1cd0: 21 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 20 24  != $different, $
1ce0: 6c 69 74 65 72 61 6c 20 3c 3e 20 24 64 69 66 66  literal <> $diff
1cf0: 65 72 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  erent,.         
1d00: 20 20 24 6c 69 74 65 72 61 6c 20 21 3d 20 4e 55    $literal != NU
1d10: 4c 4c 2c 20 20 20 20 20 20 20 24 6c 69 74 65 72  LL,       $liter
1d20: 61 6c 20 21 3d 20 4e 55 4c 4c 0a 0a 20 20 22 20  al != NULL..  " 
1d30: 7b 31 20 31 20 30 20 30 20 7b 7d 20 7b 7d 20 30  {1 1 0 0 {} {} 0
1d40: 20 30 20 31 20 31 20 7b 7d 20 7b 7d 7d 0a 7d 0a   0 1 1 {} {}}.}.
1d50: 0a 23 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 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
1da0: 73 74 20 74 68 65 20 7c 7c 20 6f 70 65 72 61 74  st the || operat
1db0: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
1dc0: 2d 4f 46 3a 20 52 2d 34 34 34 30 39 2d 36 32 36  -OF: R-44409-626
1dd0: 34 31 20 54 68 65 20 7c 7c 20 6f 70 65 72 61 74  41 The || operat
1de0: 6f 72 20 69 73 20 22 63 6f 6e 63 61 74 65 6e 61  or is "concatena
1df0: 74 65 22 20 2d 20 69 74 20 6a 6f 69 6e 73 0a 23  te" - it joins.#
1e00: 20 74 6f 67 65 74 68 65 72 20 74 68 65 20 74 77   together the tw
1e10: 6f 20 73 74 72 69 6e 67 73 20 6f 66 20 69 74 73  o strings of its
1e20: 20 6f 70 65 72 61 6e 64 73 2e 0a 23 0a 66 6f 72   operands..#.for
1e30: 65 61 63 68 20 7b 74 6e 20 61 20 62 7d 20 7b 0a  each {tn a b} {.
1e40: 20 20 31 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c    1   'helloworl
1e50: 64 27 20 20 27 31 32 33 34 35 27 0a 20 20 32 20  d'  '12345'.  2 
1e60: 20 20 32 32 20 20 20 20 20 20 20 20 20 20 20 20    22            
1e70: 32 33 0a 7d 20 7b 0a 20 20 73 65 74 20 61 73 20  23.} {.  set as 
1e80: 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20  [db one "SELECT 
1e90: 24 61 22 5d 0a 20 20 73 65 74 20 62 73 20 5b 64  $a"].  set bs [d
1ea0: 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 24 62  b one "SELECT $b
1eb0: 22 5d 0a 20 20 0a 20 20 64 6f 5f 65 78 65 63 73  "].  .  do_execs
1ec0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 35  ql_test e_expr-5
1ed0: 2e 24 74 6e 20 22 53 45 4c 45 43 54 20 24 61 20  .$tn "SELECT $a 
1ee0: 7c 7c 20 24 62 22 20 5b 6c 69 73 74 20 22 24 7b  || $b" [list "${
1ef0: 61 73 7d 24 7b 62 73 7d 22 5d 0a 7d 0a 0a 23 2d  as}${bs}"].}..#-
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 2d 2d 2d 2d 2d 2d 2d  ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
1f50: 74 68 65 20 25 20 6f 70 65 72 61 74 6f 72 2e 0a  the % operator..
1f60: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
1f70: 20 52 2d 30 38 39 31 34 2d 36 33 37 39 30 20 54   R-08914-63790 T
1f80: 68 65 20 6f 70 65 72 61 74 6f 72 20 25 20 6f 75  he operator % ou
1f90: 74 70 75 74 73 20 74 68 65 20 76 61 6c 75 65 20  tputs the value 
1fa0: 6f 66 20 69 74 73 0a 23 20 6c 65 66 74 20 6f 70  of its.# left op
1fb0: 65 72 61 6e 64 20 6d 6f 64 75 6c 6f 20 69 74 73  erand modulo its
1fc0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 0a   right operand..
1fd0: 23 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 31 20 7b 53 45  t e_expr-6.1 {SE
1ff0: 4c 45 43 54 20 20 37 32 25 35 7d 20 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 32 20 7b 53 45 4c   e_expr-6.2 {SEL
2020: 45 43 54 20 20 37 32 25 2d 35 7d 20 7b 32 7d 0a  ECT  72%-5} {2}.
2030: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2040: 65 5f 65 78 70 72 2d 36 2e 33 20 7b 53 45 4c 45  e_expr-6.3 {SELE
2050: 43 54 20 2d 37 32 25 2d 35 7d 20 7b 2d 32 7d 0a  CT -72%-5} {-2}.
2060: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2070: 65 5f 65 78 70 72 2d 36 2e 34 20 7b 53 45 4c 45  e_expr-6.4 {SELE
2080: 43 54 20 2d 37 32 25 35 7d 20 20 7b 2d 32 7d 0a  CT -72%5}  {-2}.
2090: 0a 23 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 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
20e0: 73 74 20 74 68 61 74 20 74 68 65 20 72 65 73 75  st that the resu
20f0: 6c 74 73 20 6f 66 20 61 6c 6c 20 62 69 6e 61 72  lts of all binar
2100: 79 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  y operators are 
2110: 65 69 74 68 65 72 20 6e 75 6d 65 72 69 63 20 6f  either numeric o
2120: 72 20 0a 23 20 4e 55 4c 4c 2c 20 65 78 63 65 70  r .# NULL, excep
2130: 74 20 66 6f 72 20 74 68 65 20 7c 7c 20 6f 70 65  t for the || ope
2140: 72 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79  rator, which may
2150: 20 65 76 61 6c 75 61 74 65 20 74 6f 20 65 69 74   evaluate to eit
2160: 68 65 72 20 61 20 74 65 78 74 0a 23 20 76 61 6c  her a text.# val
2170: 75 65 20 6f 72 20 4e 55 4c 4c 2e 0a 23 0a 23 20  ue or NULL..#.# 
2180: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
2190: 30 36 36 35 2d 31 37 37 39 32 20 54 68 65 20 72  0665-17792 The r
21a0: 65 73 75 6c 74 20 6f 66 20 61 6e 79 20 62 69 6e  esult of any bin
21b0: 61 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ary operator is 
21c0: 65 69 74 68 65 72 0a 23 20 61 20 6e 75 6d 65 72  either.# a numer
21d0: 69 63 20 76 61 6c 75 65 20 6f 72 20 4e 55 4c 4c  ic value or NULL
21e0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  , except for the
21f0: 20 7c 7c 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f   || concatenatio
2200: 6e 20 6f 70 65 72 61 74 6f 72 0a 23 20 77 68 69  n operator.# whi
2210: 63 68 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  ch always evalua
2220: 74 65 73 20 74 6f 20 65 69 74 68 65 72 20 4e 55  tes to either NU
2230: 4c 4c 20 6f 72 20 61 20 74 65 78 74 20 76 61 6c  LL or a text val
2240: 75 65 2e 0a 23 0a 73 65 74 20 6c 69 74 65 72 61  ue..#.set litera
2250: 6c 73 20 7b 0a 20 20 31 20 27 61 62 63 27 20 20  ls {.  1 'abc'  
2260: 20 20 20 20 20 20 32 20 27 68 65 78 61 64 65 63        2 'hexadec
2270: 69 6d 61 6c 27 20 20 20 20 20 20 20 33 20 27 27  imal'       3 ''
2280: 0a 20 20 34 20 31 32 33 20 20 20 20 20 20 20 20  .  4 123        
2290: 20 20 35 20 2d 31 32 33 20 20 20 20 20 20 20 20    5 -123        
22a0: 20 20 20 20 20 20 20 20 36 20 30 0a 20 20 37 20          6 0.  7 
22b0: 31 32 33 2e 34 20 20 20 20 20 20 20 20 38 20 30  123.4        8 0
22c0: 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
22d0: 20 20 20 39 20 2d 31 32 33 2e 34 0a 20 31 30 20     9 -123.4. 10 
22e0: 58 27 41 42 43 44 45 46 27 20 20 20 31 31 20 58  X'ABCDEF'   11 X
22f0: 27 27 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ''              
2300: 20 20 31 32 20 58 27 30 30 30 30 27 0a 20 31 33    12 X'0000'. 13
2310: 20 20 20 20 20 4e 55 4c 4c 0a 7d 0a 66 6f 72 65       NULL.}.fore
2320: 61 63 68 20 6f 70 20 24 6f 70 6c 69 73 74 20 7b  ach op $oplist {
2330: 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 31 20 72  .  foreach {n1 r
2340: 68 73 7d 20 24 6c 69 74 65 72 61 6c 73 20 7b 20  hs} $literals { 
2350: 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 32 20 6c  .  foreach {n2 l
2360: 68 73 7d 20 24 6c 69 74 65 72 61 6c 73 20 7b 0a  hs} $literals {.
2370: 0a 20 20 20 20 73 65 74 20 74 20 5b 64 62 20 6f  .    set t [db o
2380: 6e 65 20 22 20 53 45 4c 45 43 54 20 74 79 70 65  ne " SELECT type
2390: 6f 66 28 24 6c 68 73 20 24 6f 70 20 24 72 68 73  of($lhs $op $rhs
23a0: 29 20 22 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74  ) "].    do_test
23b0: 20 65 5f 65 78 70 72 2d 37 2e 24 6f 70 6e 61 6d   e_expr-7.$opnam
23c0: 65 28 24 6f 70 29 2e 24 6e 31 2e 24 6e 32 20 7b  e($op).$n1.$n2 {
23d0: 0a 20 20 20 20 20 20 65 78 70 72 20 7b 0a 20 20  .      expr {.  
23e0: 20 20 20 20 20 20 20 20 20 28 24 6f 70 3d 3d 22           ($op=="
23f0: 7c 7c 22 20 26 26 20 28 24 74 20 3d 3d 20 22 74  ||" && ($t == "t
2400: 65 78 74 22 20 7c 7c 20 24 74 20 3d 3d 20 22 6e  ext" || $t == "n
2410: 75 6c 6c 22 29 29 0a 20 20 20 20 20 20 20 20 7c  ull")).        |
2420: 7c 20 28 24 6f 70 21 3d 22 7c 7c 22 20 26 26 20  | ($op!="||" && 
2430: 28 24 74 20 3d 3d 20 22 69 6e 74 65 67 65 72 22  ($t == "integer"
2440: 20 7c 7c 20 24 74 20 3d 3d 20 22 72 65 61 6c 22   || $t == "real"
2450: 20 7c 7c 20 24 74 20 3d 3d 20 22 6e 75 6c 6c 22   || $t == "null"
2460: 29 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  )).      }.    }
2470: 20 31 0a 0a 20 20 7d 7d 0a 7d 0a 0a 23 2d 2d 2d   1..  }}.}..#---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
24d0: 65 20 49 53 20 61 6e 64 20 49 53 20 4e 4f 54 20  e IS and IS NOT 
24e0: 6f 70 65 72 61 74 6f 72 73 2e 0a 23 0a 23 20 45  operators..#.# E
24f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
2500: 37 33 31 2d 34 35 37 37 33 20 54 68 65 20 49 53  731-45773 The IS
2510: 20 61 6e 64 20 49 53 20 4e 4f 54 20 6f 70 65 72   and IS NOT oper
2520: 61 74 6f 72 73 20 77 6f 72 6b 20 6c 69 6b 65 20  ators work like 
2530: 3d 20 61 6e 64 0a 23 20 21 3d 20 65 78 63 65 70  = and.# != excep
2540: 74 20 77 68 65 6e 20 6f 6e 65 20 6f 72 20 62 6f  t when one or bo
2550: 74 68 20 6f 66 20 74 68 65 20 6f 70 65 72 61 6e  th of the operan
2560: 64 73 20 61 72 65 20 4e 55 4c 4c 2e 0a 23 0a 23  ds are NULL..#.#
2570: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2580: 30 36 33 32 35 2d 31 35 33 31 35 20 49 6e 20 74  06325-15315 In t
2590: 68 69 73 20 63 61 73 65 2c 20 69 66 20 62 6f 74  his case, if bot
25a0: 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e  h operands are N
25b0: 55 4c 4c 2c 0a 23 20 74 68 65 6e 20 74 68 65 20  ULL,.# then the 
25c0: 49 53 20 6f 70 65 72 61 74 6f 72 20 65 76 61 6c  IS operator eval
25d0: 75 61 74 65 73 20 74 6f 20 31 20 28 74 72 75 65  uates to 1 (true
25e0: 29 20 61 6e 64 20 74 68 65 20 49 53 20 4e 4f 54  ) and the IS NOT
25f0: 20 6f 70 65 72 61 74 6f 72 0a 23 20 65 76 61 6c   operator.# eval
2600: 75 61 74 65 73 20 74 6f 20 30 20 28 66 61 6c 73  uates to 0 (fals
2610: 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  e)..#.# EVIDENCE
2620: 2d 4f 46 3a 20 52 2d 31 39 38 31 32 2d 33 36 37  -OF: R-19812-367
2630: 37 39 20 49 66 20 6f 6e 65 20 6f 70 65 72 61 6e  79 If one operan
2640: 64 20 69 73 20 4e 55 4c 4c 20 61 6e 64 20 74 68  d is NULL and th
2650: 65 20 6f 74 68 65 72 20 69 73 0a 23 20 6e 6f 74  e other is.# not
2660: 2c 20 74 68 65 6e 20 74 68 65 20 49 53 20 6f 70  , then the IS op
2670: 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73  erator evaluates
2680: 20 74 6f 20 30 20 28 66 61 6c 73 65 29 20 61 6e   to 0 (false) an
2690: 64 20 74 68 65 20 49 53 20 4e 4f 54 0a 23 20 6f  d the IS NOT.# o
26a0: 70 65 72 61 74 6f 72 20 69 73 20 31 20 28 74 72  perator is 1 (tr
26b0: 75 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ue)..#.# EVIDENC
26c0: 45 2d 4f 46 3a 20 52 2d 36 31 39 37 35 2d 31 33  E-OF: R-61975-13
26d0: 34 31 30 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  410 It is not po
26e0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 49 53  ssible for an IS
26f0: 20 6f 72 20 49 53 20 4e 4f 54 0a 23 20 65 78 70   or IS NOT.# exp
2700: 72 65 73 73 69 6f 6e 20 74 6f 20 65 76 61 6c 75  ression to evalu
2710: 61 74 65 20 74 6f 20 4e 55 4c 4c 2e 0a 23 0a 64  ate to NULL..#.d
2720: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
2730: 5f 65 78 70 72 2d 38 2e 31 2e 31 20 20 7b 20 53  _expr-8.1.1  { S
2740: 45 4c 45 43 54 20 4e 55 4c 4c 20 49 53 20 20 20  ELECT NULL IS   
2750: 20 20 4e 55 4c 4c 20 7d 20 7b 31 7d 0a 64 6f 5f    NULL } {1}.do_
2760: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
2770: 78 70 72 2d 38 2e 31 2e 32 20 20 7b 20 53 45 4c  xpr-8.1.2  { SEL
2780: 45 43 54 20 27 61 62 27 20 49 53 20 20 20 20 20  ECT 'ab' IS     
2790: 4e 55 4c 4c 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78  NULL } {0}.do_ex
27a0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
27b0: 72 2d 38 2e 31 2e 33 20 20 7b 20 53 45 4c 45 43  r-8.1.3  { SELEC
27c0: 54 20 4e 55 4c 4c 20 49 53 20 20 20 20 20 27 61  T NULL IS     'a
27d0: 62 27 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63  b' } {0}.do_exec
27e0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
27f0: 38 2e 31 2e 34 20 20 7b 20 53 45 4c 45 43 54 20  8.1.4  { SELECT 
2800: 27 61 62 27 20 49 53 20 20 20 20 20 27 61 62 27  'ab' IS     'ab'
2810: 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71   } {1}.do_execsq
2820: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
2830: 31 2e 35 20 20 7b 20 53 45 4c 45 43 54 20 4e 55  1.5  { SELECT NU
2840: 4c 4c 20 3d 3d 20 20 20 20 20 4e 55 4c 4c 20 7d  LL ==     NULL }
2850: 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {{}}.do_execsql
2860: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31  _test e_expr-8.1
2870: 2e 36 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .6  { SELECT 'ab
2880: 27 20 3d 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20  ' ==     NULL } 
2890: 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {{}}.do_execsql_
28a0: 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e  test e_expr-8.1.
28b0: 37 20 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c  7  { SELECT NULL
28c0: 20 3d 3d 20 20 20 20 20 27 61 62 27 20 7d 20 7b   ==     'ab' } {
28d0: 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}}.do_execsql_t
28e0: 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 38  est e_expr-8.1.8
28f0: 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27 20    { SELECT 'ab' 
2900: 3d 3d 20 20 20 20 20 27 61 62 27 20 7d 20 7b 31  ==     'ab' } {1
2910: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
2920: 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 39 20 20  t e_expr-8.1.9  
2930: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 49 53  { SELECT NULL IS
2940: 20 4e 4f 54 20 4e 55 4c 4c 20 7d 20 7b 30 7d 0a   NOT NULL } {0}.
2950: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2960: 65 5f 65 78 70 72 2d 38 2e 31 2e 31 30 20 7b 20  e_expr-8.1.10 { 
2970: 53 45 4c 45 43 54 20 27 61 62 27 20 49 53 20 4e  SELECT 'ab' IS N
2980: 4f 54 20 4e 55 4c 4c 20 7d 20 7b 31 7d 0a 64 6f  OT NULL } {1}.do
2990: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
29a0: 65 78 70 72 2d 38 2e 31 2e 31 31 20 7b 20 53 45  expr-8.1.11 { SE
29b0: 4c 45 43 54 20 4e 55 4c 4c 20 49 53 20 4e 4f 54  LECT NULL IS NOT
29c0: 20 27 61 62 27 20 7d 20 7b 31 7d 0a 64 6f 5f 65   'ab' } {1}.do_e
29d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
29e0: 70 72 2d 38 2e 31 2e 31 32 20 7b 20 53 45 4c 45  pr-8.1.12 { SELE
29f0: 43 54 20 27 61 62 27 20 49 53 20 4e 4f 54 20 27  CT 'ab' IS NOT '
2a00: 61 62 27 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65  ab' } {0}.do_exe
2a10: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
2a20: 2d 38 2e 31 2e 31 33 20 7b 20 53 45 4c 45 43 54  -8.1.13 { SELECT
2a30: 20 4e 55 4c 4c 20 21 3d 20 20 20 20 20 4e 55 4c   NULL !=     NUL
2a40: 4c 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63  L } {{}}.do_exec
2a50: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
2a60: 38 2e 31 2e 31 34 20 7b 20 53 45 4c 45 43 54 20  8.1.14 { SELECT 
2a70: 27 61 62 27 20 21 3d 20 20 20 20 20 4e 55 4c 4c  'ab' !=     NULL
2a80: 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73   } {{}}.do_execs
2a90: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38  ql_test e_expr-8
2aa0: 2e 31 2e 31 35 20 7b 20 53 45 4c 45 43 54 20 4e  .1.15 { SELECT N
2ab0: 55 4c 4c 20 21 3d 20 20 20 20 20 27 61 62 27 20  ULL !=     'ab' 
2ac0: 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  } {{}}.do_execsq
2ad0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
2ae0: 31 2e 31 36 20 7b 20 53 45 4c 45 43 54 20 27 61  1.16 { SELECT 'a
2af0: 62 27 20 21 3d 20 20 20 20 20 27 61 62 27 20 7d  b' !=     'ab' }
2b00: 20 7b 30 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 6e   {0}..foreach {n
2b10: 31 20 72 68 73 7d 20 24 6c 69 74 65 72 61 6c 73  1 rhs} $literals
2b20: 20 7b 20 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e   { .  foreach {n
2b30: 32 20 6c 68 73 7d 20 24 6c 69 74 65 72 61 6c 73  2 lhs} $literals
2b40: 20 7b 0a 20 20 20 20 69 66 20 7b 24 72 68 73 21   {.    if {$rhs!
2b50: 3d 22 4e 55 4c 4c 22 20 26 26 20 24 6c 68 73 21  ="NULL" && $lhs!
2b60: 3d 22 4e 55 4c 4c 22 7d 20 7b 0a 20 20 20 20 20  ="NULL"} {.     
2b70: 20 73 65 74 20 65 71 20 5b 65 78 65 63 73 71 6c   set eq [execsql
2b80: 20 22 53 45 4c 45 43 54 20 24 6c 68 73 20 3d 20   "SELECT $lhs = 
2b90: 24 72 68 73 2c 20 24 6c 68 73 20 21 3d 20 24 72  $rhs, $lhs != $r
2ba0: 68 73 22 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20  hs"].    } else 
2bb0: 7b 0a 20 20 20 20 20 20 73 65 74 20 65 71 20 5b  {.      set eq [
2bc0: 6c 69 73 74 20 5b 65 78 70 72 20 7b 24 6c 68 73  list [expr {$lhs
2bd0: 3d 3d 22 4e 55 4c 4c 22 20 26 26 20 24 72 68 73  =="NULL" && $rhs
2be0: 3d 3d 22 4e 55 4c 4c 22 7d 5d 20 5c 0a 20 20 20  =="NULL"}] \.   
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 5b 65 78 70 72 20 7b 24 6c 68 73 21 3d 22 4e 55  [expr {$lhs!="NU
2c10: 4c 4c 22 20 7c 7c 20 24 72 68 73 21 3d 22 4e 55  LL" || $rhs!="NU
2c20: 4c 4c 22 7d 5d 0a 20 20 20 20 20 20 5d 0a 20 20  LL"}].      ].  
2c30: 20 20 7d 0a 20 20 20 20 73 65 74 20 74 65 73 74    }.    set test
2c40: 20 65 5f 65 78 70 72 2d 38 2e 32 2e 24 6e 31 2e   e_expr-8.2.$n1.
2c50: 24 6e 32 0a 20 20 20 20 64 6f 5f 65 78 65 63 73  $n2.    do_execs
2c60: 71 6c 5f 74 65 73 74 20 24 74 65 73 74 2e 31 20  ql_test $test.1 
2c70: 22 53 45 4c 45 43 54 20 24 6c 68 73 20 49 53 20  "SELECT $lhs IS 
2c80: 24 72 68 73 2c 20 24 6c 68 73 20 49 53 20 4e 4f  $rhs, $lhs IS NO
2c90: 54 20 24 72 68 73 22 20 24 65 71 0a 20 20 20 20  T $rhs" $eq.    
2ca0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2cb0: 24 74 65 73 74 2e 32 20 22 0a 20 20 20 20 20 20  $test.2 ".      
2cc0: 53 45 4c 45 43 54 20 28 24 6c 68 73 20 49 53 20  SELECT ($lhs IS 
2cd0: 24 72 68 73 29 20 49 53 20 4e 55 4c 4c 2c 20 28  $rhs) IS NULL, (
2ce0: 24 6c 68 73 20 49 53 20 4e 4f 54 20 24 72 68 73  $lhs IS NOT $rhs
2cf0: 29 20 49 53 20 4e 55 4c 4c 0a 20 20 20 20 22 20  ) IS NULL.    " 
2d00: 7b 30 20 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d  {0 0}.  }.}..#--
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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d50: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 75 6e 20 73 6f  -------.# Run so
2d60: 6d 65 20 74 65 73 74 73 20 6f 6e 20 74 68 65 20  me tests on the 
2d70: 43 4f 4c 4c 41 54 45 20 22 75 6e 61 72 79 20 70  COLLATE "unary p
2d80: 6f 73 74 66 69 78 20 6f 70 65 72 61 74 6f 72 22  ostfix operator"
2d90: 2e 0a 23 0a 23 20 54 68 69 73 20 63 6f 6c 6c 61  ..#.# This colla
2da0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65  tion sequence re
2db0: 76 65 72 73 65 73 20 62 6f 74 68 20 61 72 67 75  verses both argu
2dc0: 6d 65 6e 74 73 20 62 65 66 6f 72 65 20 75 73 69  ments before usi
2dd0: 6e 67 20 0a 23 20 5b 73 74 72 69 6e 67 20 63 6f  ng .# [string co
2de0: 6d 70 61 72 65 5d 20 74 6f 20 63 6f 6d 70 61 72  mpare] to compar
2df0: 65 20 74 68 65 6d 2e 20 46 6f 72 20 65 78 61 6d  e them. For exam
2e00: 70 6c 65 2c 20 77 68 65 6e 20 63 6f 6d 70 61 72  ple, when compar
2e10: 69 6e 67 20 74 68 65 0a 23 20 73 74 72 69 6e 67  ing the.# string
2e20: 73 20 27 6f 6e 65 27 20 61 6e 64 20 27 66 6f 75  s 'one' and 'fou
2e30: 72 27 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72  r', return the r
2e40: 65 73 75 6c 74 20 6f 66 3a 0a 23 20 20 20 0a 23  esult of:.#   .#
2e50: 20 20 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72     string compar
2e60: 65 20 65 6e 6f 20 72 75 6f 66 0a 23 0a 70 72 6f  e eno ruof.#.pro
2e70: 63 20 72 65 76 65 72 73 65 5f 73 74 72 20 7b 7a  c reverse_str {z
2e80: 53 74 72 7d 20 7b 0a 20 20 73 65 74 20 6f 75 74  Str} {.  set out
2e90: 20 22 22 0a 20 20 66 6f 72 65 61 63 68 20 63 20   "".  foreach c 
2ea0: 5b 73 70 6c 69 74 20 24 7a 53 74 72 20 7b 7d 5d  [split $zStr {}]
2eb0: 20 7b 20 73 65 74 20 6f 75 74 20 22 24 7b 63 7d   { set out "${c}
2ec0: 24 7b 6f 75 74 7d 22 20 7d 0a 20 20 73 65 74 20  ${out}" }.  set 
2ed0: 6f 75 74 0a 7d 0a 70 72 6f 63 20 72 65 76 65 72  out.}.proc rever
2ee0: 73 65 5f 63 6f 6c 6c 61 74 65 20 7b 7a 4c 65 66  se_collate {zLef
2ef0: 74 20 7a 52 69 67 68 74 7d 20 7b 0a 20 20 73 74  t zRight} {.  st
2f00: 72 69 6e 67 20 63 6f 6d 70 61 72 65 20 5b 72 65  ring compare [re
2f10: 76 65 72 73 65 5f 73 74 72 20 24 7a 4c 65 66 74  verse_str $zLeft
2f20: 5d 20 5b 72 65 76 65 72 73 65 5f 73 74 72 20 24  ] [reverse_str $
2f30: 7a 52 69 67 68 74 5d 0a 7d 0a 64 62 20 63 6f 6c  zRight].}.db col
2f40: 6c 61 74 65 20 72 65 76 65 72 73 65 20 72 65 76  late reverse rev
2f50: 65 72 73 65 5f 63 6f 6c 6c 61 74 65 0a 0a 23 20  erse_collate..# 
2f60: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
2f70: 39 35 37 37 2d 33 33 34 37 31 20 54 68 65 20 43  9577-33471 The C
2f80: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
2f90: 69 73 20 61 20 75 6e 61 72 79 20 70 6f 73 74 66  is a unary postf
2fa0: 69 78 0a 23 20 6f 70 65 72 61 74 6f 72 20 74 68  ix.# operator th
2fb0: 61 74 20 61 73 73 69 67 6e 73 20 61 20 63 6f 6c  at assigns a col
2fc0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
2fd0: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
2fe0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
2ff0: 46 3a 20 52 2d 33 36 32 33 31 2d 33 30 37 33 31  F: R-36231-30731
3000: 20 54 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   The COLLATE ope
3010: 72 61 74 6f 72 20 68 61 73 20 61 20 68 69 67 68  rator has a high
3020: 65 72 0a 23 20 70 72 65 63 65 64 65 6e 63 65 20  er.# precedence 
3030: 28 62 69 6e 64 73 20 6d 6f 72 65 20 74 69 67 68  (binds more tigh
3040: 74 6c 79 29 20 74 68 61 6e 20 61 6e 79 20 62 69  tly) than any bi
3050: 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 61 6e  nary operator an
3060: 64 20 61 6e 79 20 75 6e 61 72 79 0a 23 20 70 72  d any unary.# pr
3070: 65 66 69 78 20 6f 70 65 72 61 74 6f 72 20 65 78  efix operator ex
3080: 63 65 70 74 20 22 7e 22 2e 0a 23 0a 64 6f 5f 65  cept "~"..#.do_e
3090: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
30a0: 70 72 2d 39 2e 31 20 7b 20 53 45 4c 45 43 54 20  pr-9.1 { SELECT 
30b0: 20 27 61 62 63 64 27 20 3c 20 27 62 62 62 62 27   'abcd' < 'bbbb'
30c0: 20 20 20 20 43 4f 4c 4c 41 54 45 20 72 65 76 65      COLLATE reve
30d0: 72 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  rse } 0.do_execs
30e0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
30f0: 2e 32 20 7b 20 53 45 4c 45 43 54 20 28 27 61 62  .2 { SELECT ('ab
3100: 63 64 27 20 3c 20 27 62 62 62 62 27 29 20 20 20  cd' < 'bbbb')   
3110: 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65 20  COLLATE reverse 
3120: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
3130: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 33 20 7b  est e_expr-9.3 {
3140: 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27 20   SELECT  'abcd' 
3150: 3c 3d 20 27 62 62 62 62 27 20 20 20 43 4f 4c 4c  <= 'bbbb'   COLL
3160: 41 54 45 20 72 65 76 65 72 73 65 20 7d 20 30 0a  ATE reverse } 0.
3170: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3180: 65 5f 65 78 70 72 2d 39 2e 34 20 7b 20 53 45 4c  e_expr-9.4 { SEL
3190: 45 43 54 20 28 27 61 62 63 64 27 20 3c 3d 20 27  ECT ('abcd' <= '
31a0: 62 62 62 62 27 29 20 20 43 4f 4c 4c 41 54 45 20  bbbb')  COLLATE 
31b0: 72 65 76 65 72 73 65 20 7d 20 31 0a 0a 64 6f 5f  reverse } 1..do_
31c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
31d0: 78 70 72 2d 39 2e 35 20 7b 20 53 45 4c 45 43 54  xpr-9.5 { SELECT
31e0: 20 20 27 61 62 63 64 27 20 3e 20 27 62 62 62 62    'abcd' > 'bbbb
31f0: 27 20 20 20 20 43 4f 4c 4c 41 54 45 20 72 65 76  '    COLLATE rev
3200: 65 72 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  erse } 1.do_exec
3210: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3220: 39 2e 36 20 7b 20 53 45 4c 45 43 54 20 28 27 61  9.6 { SELECT ('a
3230: 62 63 64 27 20 3e 20 27 62 62 62 62 27 29 20 20  bcd' > 'bbbb')  
3240: 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65   COLLATE reverse
3250: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
3260: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 37 20  test e_expr-9.7 
3270: 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27  { SELECT  'abcd'
3280: 20 3e 3d 20 27 62 62 62 62 27 20 20 20 43 4f 4c   >= 'bbbb'   COL
3290: 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d 20 31  LATE reverse } 1
32a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
32b0: 20 65 5f 65 78 70 72 2d 39 2e 38 20 7b 20 53 45   e_expr-9.8 { SE
32c0: 4c 45 43 54 20 28 27 61 62 63 64 27 20 3e 3d 20  LECT ('abcd' >= 
32d0: 27 62 62 62 62 27 29 20 20 43 4f 4c 4c 41 54 45  'bbbb')  COLLATE
32e0: 20 72 65 76 65 72 73 65 20 7d 20 30 0a 0a 64 6f   reverse } 0..do
32f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3300: 65 78 70 72 2d 39 2e 31 30 20 7b 20 53 45 4c 45  expr-9.10 { SELE
3310: 43 54 20 20 27 61 62 63 64 27 20 3d 20 20 27 41  CT  'abcd' =  'A
3320: 42 43 44 27 20 20 43 4f 4c 4c 41 54 45 20 6e 6f  BCD'  COLLATE no
3330: 63 61 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  case } 1.do_exec
3340: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3350: 39 2e 31 31 20 7b 20 53 45 4c 45 43 54 20 28 27  9.11 { SELECT ('
3360: 61 62 63 64 27 20 3d 20 20 27 41 42 43 44 27 29  abcd' =  'ABCD')
3370: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
3380: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
3390: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 32 20  est e_expr-9.12 
33a0: 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27  { SELECT  'abcd'
33b0: 20 3d 3d 20 27 41 42 43 44 27 20 20 43 4f 4c 4c   == 'ABCD'  COLL
33c0: 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64  ATE nocase } 1.d
33d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
33e0: 5f 65 78 70 72 2d 39 2e 31 33 20 7b 20 53 45 4c  _expr-9.13 { SEL
33f0: 45 43 54 20 28 27 61 62 63 64 27 20 3d 3d 20 27  ECT ('abcd' == '
3400: 41 42 43 44 27 29 20 43 4f 4c 4c 41 54 45 20 6e  ABCD') COLLATE n
3410: 6f 63 61 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65  ocase } 0.do_exe
3420: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3430: 2d 39 2e 31 34 20 7b 20 53 45 4c 45 43 54 20 20  -9.14 { SELECT  
3440: 27 61 62 63 64 27 20 49 53 20 27 41 42 43 44 27  'abcd' IS 'ABCD'
3450: 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65    COLLATE nocase
3460: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
3470: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 35  test e_expr-9.15
3480: 20 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63 64   { SELECT ('abcd
3490: 27 20 49 53 20 27 41 42 43 44 27 29 20 43 4f 4c  ' IS 'ABCD') COL
34a0: 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a  LATE nocase } 0.
34b0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
34c0: 20 65 5f 65 78 70 72 2d 39 2e 31 36 20 7b 20 53   e_expr-9.16 { S
34d0: 45 4c 45 43 54 20 20 27 61 62 63 64 27 20 21 3d  ELECT  'abcd' !=
34e0: 20 27 41 42 43 44 27 20 20 20 20 20 20 43 4f 4c   'ABCD'      COL
34f0: 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a  LATE nocase } 0.
3500: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3510: 65 5f 65 78 70 72 2d 39 2e 31 37 20 7b 20 53 45  e_expr-9.17 { SE
3520: 4c 45 43 54 20 28 27 61 62 63 64 27 20 21 3d 20  LECT ('abcd' != 
3530: 27 41 42 43 44 27 29 20 20 20 20 20 43 4f 4c 4c  'ABCD')     COLL
3540: 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64  ATE nocase } 1.d
3550: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
3560: 5f 65 78 70 72 2d 39 2e 31 38 20 7b 20 53 45 4c  _expr-9.18 { SEL
3570: 45 43 54 20 20 27 61 62 63 64 27 20 3c 3e 20 27  ECT  'abcd' <> '
3580: 41 42 43 44 27 20 20 20 20 20 20 43 4f 4c 4c 41  ABCD'      COLLA
3590: 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64 6f  TE nocase } 0.do
35a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
35b0: 65 78 70 72 2d 39 2e 31 39 20 7b 20 53 45 4c 45  expr-9.19 { SELE
35c0: 43 54 20 28 27 61 62 63 64 27 20 3c 3e 20 27 41  CT ('abcd' <> 'A
35d0: 42 43 44 27 29 20 20 20 20 20 43 4f 4c 4c 41 54  BCD')     COLLAT
35e0: 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64 6f 5f  E nocase } 1.do_
35f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3600: 78 70 72 2d 39 2e 32 30 20 7b 20 53 45 4c 45 43  xpr-9.20 { SELEC
3610: 54 20 20 27 61 62 63 64 27 20 49 53 20 4e 4f 54  T  'abcd' IS NOT
3620: 20 27 41 42 43 44 27 20 20 43 4f 4c 4c 41 54 45   'ABCD'  COLLATE
3630: 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64 6f 5f 65   nocase } 0.do_e
3640: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
3650: 70 72 2d 39 2e 32 31 20 7b 20 53 45 4c 45 43 54  pr-9.21 { SELECT
3660: 20 28 27 61 62 63 64 27 20 49 53 20 4e 4f 54 20   ('abcd' IS NOT 
3670: 27 41 42 43 44 27 29 20 43 4f 4c 4c 41 54 45 20  'ABCD') COLLATE 
3680: 6e 6f 63 61 73 65 20 7d 20 31 0a 0a 64 6f 5f 65  nocase } 1..do_e
3690: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
36a0: 70 72 2d 39 2e 32 32 20 7b 20 0a 20 20 53 45 4c  pr-9.22 { .  SEL
36b0: 45 43 54 20 27 62 62 62 27 20 42 45 54 57 45 45  ECT 'bbb' BETWEE
36c0: 4e 20 27 41 41 41 27 20 41 4e 44 20 27 43 43 43  N 'AAA' AND 'CCC
36d0: 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ' COLLATE nocase
36e0: 20 0a 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c   .} 1.do_execsql
36f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
3700: 33 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 28 27  3 { .  SELECT ('
3710: 62 62 62 27 20 42 45 54 57 45 45 4e 20 27 41 41  bbb' BETWEEN 'AA
3720: 41 27 20 41 4e 44 20 27 43 43 43 27 29 20 43 4f  A' AND 'CCC') CO
3730: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 0a 7d 20  LLATE nocase .} 
3740: 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  0..# EVIDENCE-OF
3750: 3a 20 52 2d 35 38 37 33 31 2d 32 35 34 33 39 20  : R-58731-25439 
3760: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
3770: 71 75 65 6e 63 65 20 73 65 74 20 62 79 20 74 68  quence set by th
3780: 65 20 43 4f 4c 4c 41 54 45 0a 23 20 6f 70 65 72  e COLLATE.# oper
3790: 61 74 6f 72 20 6f 76 65 72 72 69 64 65 73 20 74  ator overrides t
37a0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
37b0: 75 65 6e 63 65 20 64 65 74 65 72 6d 69 6e 65 64  uence determined
37c0: 20 62 79 20 74 68 65 20 43 4f 4c 4c 41 54 45 0a   by the COLLATE.
37d0: 23 20 63 6c 61 75 73 65 20 69 6e 20 61 20 74 61  # clause in a ta
37e0: 62 6c 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  ble column defin
37f0: 69 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63  ition..#.do_exec
3800: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3810: 39 2e 32 34 20 7b 20 0a 20 20 43 52 45 41 54 45  9.24 { .  CREATE
3820: 20 54 41 42 4c 45 20 74 32 34 28 61 20 43 4f 4c   TABLE t24(a COL
3830: 4c 41 54 45 20 4e 4f 43 41 53 45 2c 20 62 29 3b  LATE NOCASE, b);
3840: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
3850: 32 34 20 56 41 4c 55 45 53 28 27 61 61 61 27 2c  24 VALUES('aaa',
3860: 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   1);.  INSERT IN
3870: 54 4f 20 74 32 34 20 56 41 4c 55 45 53 28 27 62  TO t24 VALUES('b
3880: 62 62 27 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52  bb', 2);.  INSER
3890: 54 20 49 4e 54 4f 20 74 32 34 20 56 41 4c 55 45  T INTO t24 VALUE
38a0: 53 28 27 63 63 63 27 2c 20 33 29 3b 0a 7d 20 7b  S('ccc', 3);.} {
38b0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
38c0: 74 20 65 5f 65 78 70 72 2d 39 2e 32 35 20 7b 20  t e_expr-9.25 { 
38d0: 53 45 4c 45 43 54 20 27 42 42 42 27 20 3d 20 61  SELECT 'BBB' = a
38e0: 20 46 52 4f 4d 20 74 32 34 20 7d 20 7b 30 20 31   FROM t24 } {0 1
38f0: 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   0}.do_execsql_t
3900: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32 35 20  est e_expr-9.25 
3910: 7b 20 53 45 4c 45 43 54 20 61 20 3d 20 27 42 42  { SELECT a = 'BB
3920: 42 27 20 46 52 4f 4d 20 74 32 34 20 7d 20 7b 30  B' FROM t24 } {0
3930: 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   1 0}.do_execsql
3940: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
3950: 35 20 7b 20 53 45 4c 45 43 54 20 27 42 42 42 27  5 { SELECT 'BBB'
3960: 20 3d 20 61 20 43 4f 4c 4c 41 54 45 20 62 69 6e   = a COLLATE bin
3970: 61 72 79 20 46 52 4f 4d 20 74 32 34 20 7d 20 7b  ary FROM t24 } {
3980: 30 20 30 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71  0 0 0}.do_execsq
3990: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e  l_test e_expr-9.
39a0: 32 35 20 7b 20 53 45 4c 45 43 54 20 61 20 43 4f  25 { SELECT a CO
39b0: 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 3d 20 27  LLATE binary = '
39c0: 42 42 42 27 20 46 52 4f 4d 20 74 32 34 20 7d 20  BBB' FROM t24 } 
39d0: 7b 30 20 30 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  {0 0 0}..#------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65  ---.# Test state
3a30: 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f  ments related to
3a40: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 2e   literal values.
3a50: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
3a60: 3a 20 52 2d 33 31 35 33 36 2d 33 32 30 30 38 20  : R-31536-32008 
3a70: 4c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20 6d  Literal values m
3a80: 61 79 20 62 65 20 69 6e 74 65 67 65 72 73 2c 20  ay be integers, 
3a90: 66 6c 6f 61 74 69 6e 67 0a 23 20 70 6f 69 6e 74  floating.# point
3aa0: 20 6e 75 6d 62 65 72 73 2c 20 73 74 72 69 6e 67   numbers, string
3ab0: 73 2c 20 42 4c 4f 42 73 2c 20 6f 72 20 4e 55 4c  s, BLOBs, or NUL
3ac0: 4c 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  Ls..#.do_execsql
3ad0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e  _test e_expr-10.
3ae0: 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 74 79 70  1.1 { SELECT typ
3af0: 65 6f 66 28 35 29 20 20 20 20 20 20 20 7d 20 7b  eof(5)       } {
3b00: 69 6e 74 65 67 65 72 7d 0a 64 6f 5f 65 78 65 63  integer}.do_exec
3b10: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3b20: 31 30 2e 31 2e 32 20 7b 20 53 45 4c 45 43 54 20  10.1.2 { SELECT 
3b30: 74 79 70 65 6f 66 28 35 2e 31 29 20 20 20 20 20  typeof(5.1)     
3b40: 7d 20 7b 72 65 61 6c 7d 0a 64 6f 5f 65 78 65 63  } {real}.do_exec
3b50: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3b60: 31 30 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54 20  10.1.3 { SELECT 
3b70: 74 79 70 65 6f 66 28 27 35 2e 31 27 29 20 20 20  typeof('5.1')   
3b80: 7d 20 7b 74 65 78 74 7d 0a 64 6f 5f 65 78 65 63  } {text}.do_exec
3b90: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3ba0: 31 30 2e 31 2e 34 20 7b 20 53 45 4c 45 43 54 20  10.1.4 { SELECT 
3bb0: 74 79 70 65 6f 66 28 58 27 41 42 43 44 27 29 20  typeof(X'ABCD') 
3bc0: 7d 20 7b 62 6c 6f 62 7d 0a 64 6f 5f 65 78 65 63  } {blob}.do_exec
3bd0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3be0: 31 30 2e 31 2e 35 20 7b 20 53 45 4c 45 43 54 20  10.1.5 { SELECT 
3bf0: 74 79 70 65 6f 66 28 4e 55 4c 4c 29 20 20 20 20  typeof(NULL)    
3c00: 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 20 22 53 63 69  } {null}..# "Sci
3c10: 65 6e 74 69 66 69 63 20 6e 6f 74 61 74 69 6f 6e  entific notation
3c20: 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f   is supported fo
3c30: 72 20 70 6f 69 6e 74 20 6c 69 74 65 72 61 6c 20  r point literal 
3c40: 76 61 6c 75 65 73 2e 22 0a 23 0a 64 6f 5f 65 78  values.".#.do_ex
3c50: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3c60: 72 2d 31 30 2e 32 2e 31 20 7b 20 53 45 4c 45 43  r-10.2.1 { SELEC
3c70: 54 20 74 79 70 65 6f 66 28 33 2e 34 65 2d 30 32  T typeof(3.4e-02
3c80: 29 20 20 20 20 7d 20 7b 72 65 61 6c 7d 0a 64 6f  )    } {real}.do
3c90: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3ca0: 65 78 70 72 2d 31 30 2e 32 2e 32 20 7b 20 53 45  expr-10.2.2 { SE
3cb0: 4c 45 43 54 20 74 79 70 65 6f 66 28 33 65 2b 35  LECT typeof(3e+5
3cc0: 29 20 20 20 20 20 20 20 7d 20 7b 72 65 61 6c 7d  )       } {real}
3cd0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3ce0: 20 65 5f 65 78 70 72 2d 31 30 2e 32 2e 33 20 7b   e_expr-10.2.3 {
3cf0: 20 53 45 4c 45 43 54 20 33 2e 34 65 2d 30 32 20   SELECT 3.4e-02 
3d00: 20 20 20 20 20 20 20 20 20 20 20 7d 20 7b 30 2e             } {0.
3d10: 30 33 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  034}.do_execsql_
3d20: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 32  test e_expr-10.2
3d30: 2e 34 20 7b 20 53 45 4c 45 43 54 20 33 65 2b 34  .4 { SELECT 3e+4
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
3d50: 20 7b 33 30 30 30 30 2e 30 7d 0a 0a 23 20 45 56   {30000.0}..# EV
3d60: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 35 32  IDENCE-OF: R-352
3d70: 32 39 2d 31 37 38 33 30 20 41 20 73 74 72 69 6e  29-17830 A strin
3d80: 67 20 63 6f 6e 73 74 61 6e 74 20 69 73 20 66 6f  g constant is fo
3d90: 72 6d 65 64 20 62 79 20 65 6e 63 6c 6f 73 69 6e  rmed by enclosin
3da0: 67 0a 23 20 74 68 65 20 73 74 72 69 6e 67 20 69  g.# the string i
3db0: 6e 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 20  n single quotes 
3dc0: 28 27 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  (')..#.# EVIDENC
3dd0: 45 2d 4f 46 3a 20 52 2d 30 37 31 30 30 2d 30 36  E-OF: R-07100-06
3de0: 36 30 36 20 41 20 73 69 6e 67 6c 65 20 71 75 6f  606 A single quo
3df0: 74 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  te within the st
3e00: 72 69 6e 67 20 63 61 6e 20 62 65 0a 23 20 65 6e  ring can be.# en
3e10: 63 6f 64 65 64 20 62 79 20 70 75 74 74 69 6e 67  coded by putting
3e20: 20 74 77 6f 20 73 69 6e 67 6c 65 20 71 75 6f 74   two single quot
3e30: 65 73 20 69 6e 20 61 20 72 6f 77 20 2d 20 61 73  es in a row - as
3e40: 20 69 6e 20 50 61 73 63 61 6c 2e 0a 23 0a 64 6f   in Pascal..#.do
3e50: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3e60: 65 78 70 72 2d 31 30 2e 33 2e 31 20 7b 20 53 45  expr-10.3.1 { SE
3e70: 4c 45 43 54 20 27 69 73 20 6e 6f 74 27 20 7d 20  LECT 'is not' } 
3e80: 20 20 20 20 20 20 20 20 7b 7b 69 73 20 6e 6f 74          {{is not
3e90: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
3ea0: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 33 2e 32  st e_expr-10.3.2
3eb0: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3ec0: 28 27 69 73 20 6e 6f 74 27 29 20 7d 20 7b 74 65  ('is not') } {te
3ed0: 78 74 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  xt}.do_execsql_t
3ee0: 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 33 2e  est e_expr-10.3.
3ef0: 33 20 7b 20 53 45 4c 45 43 54 20 27 69 73 6e 27  3 { SELECT 'isn'
3f00: 27 74 27 20 7d 20 20 20 20 20 20 20 20 20 7b 69  't' }         {i
3f10: 73 6e 27 74 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  sn't}.do_execsql
3f20: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e  _test e_expr-10.
3f30: 33 2e 34 20 7b 20 53 45 4c 45 43 54 20 74 79 70  3.4 { SELECT typ
3f40: 65 6f 66 28 27 69 73 6e 27 27 74 27 29 20 7d 20  eof('isn''t') } 
3f50: 7b 74 65 78 74 7d 0a 0a 23 20 45 56 49 44 45 4e  {text}..# EVIDEN
3f60: 43 45 2d 4f 46 3a 20 52 2d 30 39 35 39 33 2d 30  CE-OF: R-09593-0
3f70: 33 33 32 31 20 42 4c 4f 42 20 6c 69 74 65 72 61  3321 BLOB litera
3f80: 6c 73 20 61 72 65 20 73 74 72 69 6e 67 20 6c 69  ls are string li
3f90: 74 65 72 61 6c 73 0a 23 20 63 6f 6e 74 61 69 6e  terals.# contain
3fa0: 69 6e 67 20 68 65 78 61 64 65 63 69 6d 61 6c 20  ing hexadecimal 
3fb0: 64 61 74 61 20 61 6e 64 20 70 72 65 63 65 64 65  data and precede
3fc0: 64 20 62 79 20 61 20 73 69 6e 67 6c 65 20 22 78  d by a single "x
3fd0: 22 20 6f 72 20 22 58 22 0a 23 20 63 68 61 72 61  " or "X".# chara
3fe0: 63 74 65 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e  cter..#.# EVIDEN
3ff0: 43 45 2d 4f 46 3a 20 52 2d 33 39 33 34 34 2d 35  CE-OF: R-39344-5
4000: 39 37 38 37 20 46 6f 72 20 65 78 61 6d 70 6c 65  9787 For example
4010: 3a 20 58 27 35 33 35 31 34 43 36 39 37 34 36 35  : X'53514C697465
4020: 27 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  '.#.do_execsql_t
4030: 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e  est e_expr-10.4.
4040: 31 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f  1 { SELECT typeo
4050: 66 28 58 27 30 31 32 33 34 35 36 37 38 39 41 42  f(X'0123456789AB
4060: 43 44 45 46 27 29 20 7d 20 62 6c 6f 62 0a 64 6f  CDEF') } blob.do
4070: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
4080: 65 78 70 72 2d 31 30 2e 34 2e 32 20 7b 20 53 45  expr-10.4.2 { SE
4090: 4c 45 43 54 20 74 79 70 65 6f 66 28 78 27 30 31  LECT typeof(x'01
40a0: 32 33 34 35 36 37 38 39 41 42 43 44 45 46 27 29  23456789ABCDEF')
40b0: 20 7d 20 62 6c 6f 62 0a 64 6f 5f 65 78 65 63 73   } blob.do_execs
40c0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
40d0: 30 2e 34 2e 33 20 7b 20 53 45 4c 45 43 54 20 74  0.4.3 { SELECT t
40e0: 79 70 65 6f 66 28 58 27 30 31 32 33 34 35 36 37  ypeof(X'01234567
40f0: 38 39 61 62 63 64 65 66 27 29 20 7d 20 62 6c 6f  89abcdef') } blo
4100: 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  b.do_execsql_tes
4110: 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e 34 20  t e_expr-10.4.4 
4120: 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28  { SELECT typeof(
4130: 78 27 30 31 32 33 34 35 36 37 38 39 61 62 63 64  x'0123456789abcd
4140: 65 66 27 29 20 7d 20 62 6c 6f 62 0a 64 6f 5f 65  ef') } blob.do_e
4150: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
4160: 70 72 2d 31 30 2e 34 2e 35 20 7b 20 53 45 4c 45  pr-10.4.5 { SELE
4170: 43 54 20 74 79 70 65 6f 66 28 58 27 35 33 35 31  CT typeof(X'5351
4180: 34 43 36 39 37 34 36 35 27 29 20 20 20 20 20 7d  4C697465')     }
4190: 20 62 6c 6f 62 0a 0a 23 20 45 56 49 44 45 4e 43   blob..# EVIDENC
41a0: 45 2d 4f 46 3a 20 52 2d 32 33 39 31 34 2d 35 31  E-OF: R-23914-51
41b0: 34 37 36 20 41 20 6c 69 74 65 72 61 6c 20 76 61  476 A literal va
41c0: 6c 75 65 20 63 61 6e 20 61 6c 73 6f 20 62 65 20  lue can also be 
41d0: 74 68 65 20 74 6f 6b 65 6e 0a 23 20 22 4e 55 4c  the token.# "NUL
41e0: 4c 22 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  L"..#.do_execsql
41f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e  _test e_expr-10.
4200: 35 2e 31 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c  5.1 { SELECT NUL
4210: 4c 20 20 20 20 20 20 20 20 20 7d 20 7b 7b 7d 7d  L         } {{}}
4220: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
4230: 20 65 5f 65 78 70 72 2d 31 30 2e 35 2e 32 20 7b   e_expr-10.5.2 {
4240: 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 4e   SELECT typeof(N
4250: 55 4c 4c 29 20 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23  ULL) } {null}..#
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
42b0: 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65 6c 61   statements rela
42c0: 74 65 64 20 74 6f 20 62 6f 75 6e 64 20 70 61 72  ted to bound par
42d0: 61 6d 65 74 65 72 73 0a 23 0a 0a 70 72 6f 63 20  ameters.#..proc 
42e0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 7b  parameter_test {
42f0: 74 6e 20 73 71 6c 20 70 61 72 61 6d 73 20 72 65  tn sql params re
4300: 73 75 6c 74 7d 20 7b 0a 20 20 73 65 74 20 73 74  sult} {.  set st
4310: 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  mt [sqlite3_prep
4320: 61 72 65 5f 76 32 20 64 62 20 24 73 71 6c 20 2d  are_v2 db $sql -
4330: 31 5d 0a 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e  1]..  foreach {n
4340: 75 6d 62 65 72 20 6e 61 6d 65 7d 20 24 70 61 72  umber name} $par
4350: 61 6d 73 20 7b 0a 20 20 20 20 73 65 74 20 6e 6d  ams {.    set nm
4360: 20 5b 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70   [sqlite3_bind_p
4370: 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20 24 73  arameter_name $s
4380: 74 6d 74 20 24 6e 75 6d 62 65 72 5d 0a 20 20 20  tmt $number].   
4390: 20 64 6f 5f 74 65 73 74 20 24 74 6e 2e 6e 61 6d   do_test $tn.nam
43a0: 65 2e 24 6e 75 6d 62 65 72 20 5b 6c 69 73 74 20  e.$number [list 
43b0: 73 65 74 20 7b 7d 20 24 6e 6d 5d 20 24 6e 61 6d  set {} $nm] $nam
43c0: 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  e.    sqlite3_bi
43d0: 6e 64 5f 69 6e 74 20 24 73 74 6d 74 20 24 6e 75  nd_int $stmt $nu
43e0: 6d 62 65 72 20 5b 65 78 70 72 20 2d 31 20 2a 20  mber [expr -1 * 
43f0: 24 6e 75 6d 62 65 72 5d 0a 20 20 7d 0a 0a 20 20  $number].  }..  
4400: 73 71 6c 69 74 65 33 5f 73 74 65 70 20 24 73 74  sqlite3_step $st
4410: 6d 74 0a 0a 20 20 73 65 74 20 72 65 73 20 5b 6c  mt..  set res [l
4420: 69 73 74 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20  ist].  for {set 
4430: 69 20 30 7d 20 7b 24 69 20 3c 20 5b 73 71 6c 69  i 0} {$i < [sqli
4440: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
4450: 20 24 73 74 6d 74 5d 7d 20 7b 69 6e 63 72 20 69   $stmt]} {incr i
4460: 7d 20 7b 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  } {.    lappend 
4470: 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c  res [sqlite3_col
4480: 75 6d 6e 5f 74 65 78 74 20 24 73 74 6d 74 20 24  umn_text $stmt $
4490: 69 5d 0a 20 20 7d 0a 0a 20 20 73 65 74 20 72 63  i].  }..  set rc
44a0: 20 5b 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   [sqlite3_finali
44b0: 7a 65 20 24 73 74 6d 74 5d 0a 20 20 64 6f 5f 74  ze $stmt].  do_t
44c0: 65 73 74 20 24 74 6e 2e 72 63 20 5b 6c 69 73 74  est $tn.rc [list
44d0: 20 73 65 74 20 7b 7d 20 24 72 63 5d 20 53 51 4c   set {} $rc] SQL
44e0: 49 54 45 5f 4f 4b 0a 20 20 64 6f 5f 74 65 73 74  ITE_OK.  do_test
44f0: 20 24 74 6e 2e 72 65 73 20 5b 6c 69 73 74 20 73   $tn.res [list s
4500: 65 74 20 7b 7d 20 24 72 65 73 5d 20 24 72 65 73  et {} $res] $res
4510: 75 6c 74 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  ult.}..# EVIDENC
4520: 45 2d 4f 46 3a 20 52 2d 33 33 35 30 39 2d 33 39  E-OF: R-33509-39
4530: 34 35 38 20 41 20 71 75 65 73 74 69 6f 6e 20 6d  458 A question m
4540: 61 72 6b 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ark followed by 
4550: 61 20 6e 75 6d 62 65 72 20 4e 4e 4e 0a 23 20 68  a number NNN.# h
4560: 6f 6c 64 73 20 61 20 73 70 6f 74 20 66 6f 72 20  olds a spot for 
4570: 74 68 65 20 4e 4e 4e 2d 74 68 20 70 61 72 61 6d  the NNN-th param
4580: 65 74 65 72 2e 20 4e 4e 4e 20 6d 75 73 74 20 62  eter. NNN must b
4590: 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 0a  e between 1 and.
45a0: 23 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  # SQLITE_MAX_VAR
45b0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2e 0a 23 0a  IABLE_NUMBER..#.
45c0: 73 65 74 20 6d 76 6e 20 24 53 51 4c 49 54 45 5f  set mvn $SQLITE_
45d0: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
45e0: 42 45 52 0a 70 61 72 61 6d 65 74 65 72 5f 74 65  BER.parameter_te
45f0: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 31 20 22  st e_expr-11.1 "
4600: 0a 20 20 53 45 4c 45 43 54 20 3f 31 2c 20 3f 31  .  SELECT ?1, ?1
4610: 32 33 2c 20 3f 24 53 51 4c 49 54 45 5f 4d 41 58  23, ?$SQLITE_MAX
4620: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4630: 2c 20 3f 31 32 33 2c 20 3f 34 0a 22 20 20 20 22  , ?123, ?4."   "
4640: 31 20 3f 31 20 20 31 32 33 20 3f 31 32 33 20 24  1 ?1  123 ?123 $
4650: 6d 76 6e 20 3f 24 6d 76 6e 20 34 20 3f 34 22 20  mvn ?$mvn 4 ?4" 
4660: 20 20 22 2d 31 20 2d 31 32 33 20 2d 24 6d 76 6e    "-1 -123 -$mvn
4670: 20 2d 31 32 33 20 2d 34 22 0a 0a 73 65 74 20 65   -123 -4"..set e
4680: 72 72 6d 73 67 20 22 76 61 72 69 61 62 6c 65 20  rrmsg "variable 
4690: 6e 75 6d 62 65 72 20 6d 75 73 74 20 62 65 20 62  number must be b
46a0: 65 74 77 65 65 6e 20 3f 31 20 61 6e 64 20 3f 24  etween ?1 and ?$
46b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
46c0: 42 4c 45 5f 4e 55 4d 42 45 52 22 0a 66 6f 72 65  BLE_NUMBER".fore
46d0: 61 63 68 20 7b 74 6e 20 70 61 72 61 6d 5f 6e 75  ach {tn param_nu
46e0: 6d 62 65 72 7d 20 5b 6c 69 73 74 20 5c 0a 20 20  mber} [list \.  
46f0: 32 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  2  0            
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 20 20 20 20 20 20 5c 0a 20 20 33 20 20 5b          \.  3  [
4720: 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58  expr $SQLITE_MAX
4730: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4740: 2b 31 5d 20 5c 0a 20 20 34 20 20 5b 65 78 70 72  +1] \.  4  [expr
4750: 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52   $SQLITE_MAX_VAR
4760: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2b 32 5d 20  IABLE_NUMBER+2] 
4770: 5c 0a 20 20 35 20 20 31 32 33 34 35 36 37 38 39  \.  5  123456789
4780: 30 33 34 35 36 37 38 39 30 33 34 35 36 37 38 39  0345678903456789
4790: 30 32 33 34 35 36 37 38 39 30 20 20 5c 0a 20 20  0234567890  \.  
47a0: 36 20 20 32 31 34 37 34 38 33 36 34 38 20 20 20  6  2147483648   
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47c0: 20 20 20 20 20 20 20 20 5c 0a 20 20 37 20 20 32          \.  7  2
47d0: 31 34 37 34 38 33 36 34 39 20 20 20 20 20 20 20  147483649       
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 20 20 5c 0a 20 20 38 20 20 34 32 39 34 39      \.  8  42949
4800: 36 37 32 39 36 20 20 20 20 20 20 20 20 20 20 20  67296           
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 5c 0a 20 20 39 20 20 34 32 39 34 39 36 37 32 39  \.  9  429496729
4830: 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
4840: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
4850: 31 30 20 39 32 32 33 33 37 32 30 33 36 38 35 34  10 9223372036854
4860: 37 37 35 38 30 38 20 20 20 20 20 20 20 20 20 20  775808          
4870: 20 20 20 20 20 20 20 20 5c 0a 20 20 31 31 20 39          \.  11 9
4880: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
4890: 30 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20  09              
48a0: 20 20 20 20 5c 0a 20 20 31 32 20 31 38 34 34 36      \.  12 18446
48b0: 37 34 34 30 37 33 37 30 39 35 35 31 36 31 36 20  744073709551616 
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48d0: 5c 0a 20 20 31 33 20 31 38 34 34 36 37 34 34 30  \.  13 184467440
48e0: 37 33 37 30 39 35 35 31 36 31 37 20 20 20 20 20  73709551617     
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 5d 20              \.] 
4900: 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f  {.  do_catchsql_
4910: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 31  test e_expr-11.1
4920: 2e 24 74 6e 20 22 53 45 4c 45 43 54 20 3f 24 70  .$tn "SELECT ?$p
4930: 61 72 61 6d 5f 6e 75 6d 62 65 72 22 20 5b 6c 69  aram_number" [li
4940: 73 74 20 31 20 24 65 72 72 6d 73 67 5d 0a 7d 0a  st 1 $errmsg].}.
4950: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
4960: 52 2d 33 33 36 37 30 2d 33 36 30 39 37 20 41 20  R-33670-36097 A 
4970: 71 75 65 73 74 69 6f 6e 20 6d 61 72 6b 20 74 68  question mark th
4980: 61 74 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  at is not follow
4990: 65 64 20 62 79 20 61 0a 23 20 6e 75 6d 62 65 72  ed by a.# number
49a0: 20 63 72 65 61 74 65 73 20 61 20 70 61 72 61 6d   creates a param
49b0: 65 74 65 72 20 77 69 74 68 20 61 20 6e 75 6d 62  eter with a numb
49c0: 65 72 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74  er one greater t
49d0: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 0a  han the largest.
49e0: 23 20 70 61 72 61 6d 65 74 65 72 20 6e 75 6d 62  # parameter numb
49f0: 65 72 20 61 6c 72 65 61 64 79 20 61 73 73 69 67  er already assig
4a00: 6e 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ned..#.# EVIDENC
4a10: 45 2d 4f 46 3a 20 52 2d 34 32 39 33 38 2d 30 37  E-OF: R-42938-07
4a20: 30 33 30 20 49 66 20 74 68 69 73 20 6d 65 61 6e  030 If this mean
4a30: 73 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  s the parameter 
4a40: 6e 75 6d 62 65 72 20 69 73 0a 23 20 67 72 65 61  number is.# grea
4a50: 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ter than SQLITE_
4a60: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
4a70: 42 45 52 2c 20 69 74 20 69 73 20 61 6e 20 65 72  BER, it is an er
4a80: 72 6f 72 2e 0a 23 0a 70 61 72 61 6d 65 74 65 72  ror..#.parameter
4a90: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
4aa0: 32 2e 31 20 22 53 45 4c 45 43 54 20 3f 22 20 20  2.1 "SELECT ?"  
4ab0: 20 20 20 20 20 20 20 20 7b 31 20 7b 7d 7d 20 20          {1 {}}  
4ac0: 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65       -1.paramete
4ad0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
4ae0: 2e 32 2e 32 20 22 53 45 4c 45 43 54 20 3f 2c 20  .2.2 "SELECT ?, 
4af0: 3f 22 20 20 20 20 20 20 20 7b 31 20 7b 7d 20 32  ?"       {1 {} 2
4b00: 20 7b 7d 7d 20 20 7b 2d 31 20 2d 32 7d 0a 70 61   {}}  {-1 -2}.pa
4b10: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
4b20: 78 70 72 2d 31 31 2e 32 2e 33 20 22 53 45 4c 45  xpr-11.2.3 "SELE
4b30: 43 54 20 3f 35 2c 20 3f 22 20 20 20 20 20 20 7b  CT ?5, ?"      {
4b40: 35 20 3f 35 20 36 20 7b 7d 7d 20 20 7b 2d 35 20  5 ?5 6 {}}  {-5 
4b50: 2d 36 7d 0a 70 61 72 61 6d 65 74 65 72 5f 74 65  -6}.parameter_te
4b60: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 34  st e_expr-11.2.4
4b70: 20 22 53 45 4c 45 43 54 20 3f 2c 20 3f 35 22 20   "SELECT ?, ?5" 
4b80: 20 20 20 20 20 7b 31 20 7b 7d 20 35 20 3f 35 7d       {1 {} 5 ?5}
4b90: 20 20 7b 2d 31 20 2d 35 7d 0a 70 61 72 61 6d 65    {-1 -5}.parame
4ba0: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4bb0: 31 31 2e 32 2e 35 20 22 53 45 4c 45 43 54 20 3f  11.2.5 "SELECT ?
4bc0: 2c 20 3f 34 35 36 2c 20 3f 22 20 7b 0a 20 20 31  , ?456, ?" {.  1
4bd0: 20 7b 7d 20 34 35 36 20 3f 34 35 36 20 34 35 37   {} 456 ?456 457
4be0: 20 7b 7d 0a 7d 20 20 7b 2d 31 20 2d 34 35 36 20   {}.}  {-1 -456 
4bf0: 2d 34 35 37 7d 0a 70 61 72 61 6d 65 74 65 72 5f  -457}.parameter_
4c00: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32  test e_expr-11.2
4c10: 2e 35 20 22 53 45 4c 45 43 54 20 3f 2c 20 3f 34  .5 "SELECT ?, ?4
4c20: 35 36 2c 20 3f 34 2c 20 3f 22 20 7b 0a 20 20 31  56, ?4, ?" {.  1
4c30: 20 7b 7d 20 34 35 36 20 3f 34 35 36 20 34 20 3f   {} 456 ?456 4 ?
4c40: 34 20 34 35 37 20 7b 7d 0a 7d 20 20 7b 2d 31 20  4 457 {}.}  {-1 
4c50: 2d 34 35 36 20 2d 34 20 2d 34 35 37 7d 0a 66 6f  -456 -4 -457}.fo
4c60: 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20 5b  reach {tn sql} [
4c70: 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
4c90: 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 3f 24  .  1  "SELECT ?$
4ca0: 6d 76 6e 2c 20 3f 22 20 20 20 20 20 20 20 20 20  mvn, ?"         
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 5c 0a 20 20 32 20 20 22 53 45 4c 45 43 54    \.  2  "SELECT
4cd0: 20 3f 5b 65 78 70 72 20 24 6d 76 6e 2d 35 5d 2c   ?[expr $mvn-5],
4ce0: 20 3f 2c 20 3f 2c 20 3f 2c 20 3f 2c 20 3f 2c 20   ?, ?, ?, ?, ?, 
4cf0: 3f 22 20 20 20 5c 0a 20 20 33 20 20 22 53 45 4c  ?"   \.  3  "SEL
4d00: 45 43 54 20 3f 5b 65 78 70 72 20 24 6d 76 6e 5d  ECT ?[expr $mvn]
4d10: 2c 20 3f 35 2c 20 3f 36 2c 20 3f 22 20 20 20 20  , ?5, ?6, ?"    
4d20: 20 20 20 20 20 20 20 20 5c 0a 5d 20 7b 0a 20 20          \.] {.  
4d30: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
4d40: 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e 24 74 6e   e_expr-11.3.$tn
4d50: 20 24 73 71 6c 20 5b 6c 69 73 74 20 31 20 7b 74   $sql [list 1 {t
4d60: 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69  oo many SQL vari
4d70: 61 62 6c 65 73 7d 5d 0a 7d 0a 0a 23 20 45 56 49  ables}].}..# EVI
4d80: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 36 32  DENCE-OF: R-1162
4d90: 30 2d 32 32 37 34 33 20 41 20 63 6f 6c 6f 6e 20  0-22743 A colon 
4da0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20 69  followed by an i
4db0: 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 0a 23  dentifier name.#
4dc0: 20 68 6f 6c 64 73 20 61 20 73 70 6f 74 20 66 6f   holds a spot fo
4dd0: 72 20 61 20 6e 61 6d 65 64 20 70 61 72 61 6d 65  r a named parame
4de0: 74 65 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ter with the nam
4df0: 65 20 3a 41 41 41 41 2e 0a 23 0a 23 20 49 64 65  e :AAAA..#.# Ide
4e00: 6e 74 69 66 69 65 72 73 20 69 6e 20 53 51 4c 69  ntifiers in SQLi
4e10: 74 65 20 63 6f 6e 73 69 73 74 20 6f 66 20 61 6c  te consist of al
4e20: 70 68 61 6e 75 6d 65 72 69 63 2c 20 27 5f 27 20  phanumeric, '_' 
4e30: 61 6e 64 20 27 24 27 20 63 68 61 72 61 63 74 65  and '$' characte
4e40: 72 73 2c 0a 23 20 61 6e 64 20 61 6e 79 20 55 54  rs,.# and any UT
4e50: 46 20 63 68 61 72 61 63 74 65 72 73 20 77 69 74  F characters wit
4e60: 68 20 63 6f 64 65 70 6f 69 6e 74 73 20 6c 61 72  h codepoints lar
4e70: 67 65 72 20 74 68 61 6e 20 31 32 37 20 28 6e 6f  ger than 127 (no
4e80: 6e 2d 41 53 43 49 49 20 0a 23 20 63 68 61 72 61  n-ASCII .# chara
4e90: 63 74 65 72 73 29 2e 0a 23 0a 70 61 72 61 6d 65  cters)..#.parame
4ea0: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4eb0: 31 31 2e 32 2e 31 20 7b 53 45 4c 45 43 54 20 3a  11.2.1 {SELECT :
4ec0: 41 41 41 41 7d 20 20 20 20 20 20 20 20 20 7b 31  AAAA}         {1
4ed0: 20 3a 41 41 41 41 7d 20 20 20 20 20 20 20 2d 31   :AAAA}       -1
4ee0: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
4ef0: 65 5f 65 78 70 72 2d 31 31 2e 32 2e 32 20 7b 53  e_expr-11.2.2 {S
4f00: 45 4c 45 43 54 20 3a 31 32 33 7d 20 20 20 20 20  ELECT :123}     
4f10: 20 20 20 20 20 7b 31 20 3a 31 32 33 7d 20 20 20       {1 :123}   
4f20: 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65       -1.paramete
4f30: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
4f40: 2e 32 2e 33 20 7b 53 45 4c 45 43 54 20 3a 5f 5f  .2.3 {SELECT :__
4f50: 7d 20 20 20 20 20 20 20 20 20 20 20 7b 31 20 3a  }           {1 :
4f60: 5f 5f 7d 20 20 20 20 20 20 20 20 20 2d 31 0a 70  __}         -1.p
4f70: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
4f80: 65 78 70 72 2d 31 31 2e 32 2e 34 20 7b 53 45 4c  expr-11.2.4 {SEL
4f90: 45 43 54 20 3a 5f 24 5f 7d 20 20 20 20 20 20 20  ECT :_$_}       
4fa0: 20 20 20 7b 31 20 3a 5f 24 5f 7d 20 20 20 20 20     {1 :_$_}     
4fb0: 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f     -1.parameter_
4fc0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32  test e_expr-11.2
4fd0: 2e 35 20 22 0a 20 20 53 45 4c 45 43 54 20 3a 5c  .5 ".  SELECT :\
4fe0: 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32  u0e40\u0e2d\u0e2
4ff0: 38 5c 75 30 65 30 32 5c 75 30 65 33 39 5c 75 30  8\u0e02\u0e39\u0
5000: 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 35 0a  e40\u0e2d\u0e25.
5010: 22 20 22 31 20 3a 5c 75 30 65 34 30 5c 75 30 65  " "1 :\u0e40\u0e
5020: 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75  2d\u0e28\u0e02\u
5030: 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64  0e39\u0e40\u0e2d
5040: 5c 75 30 65 32 35 22 20 2d 31 0a 70 61 72 61 6d  \u0e25" -1.param
5050: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
5060: 2d 31 31 2e 32 2e 36 20 22 53 45 4c 45 43 54 20  -11.2.6 "SELECT 
5070: 3a 5c 75 30 30 38 30 22 20 22 31 20 3a 5c 75 30  :\u0080" "1 :\u0
5080: 30 38 30 22 20 2d 31 0a 0a 23 20 45 56 49 44 45  080" -1..# EVIDE
5090: 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 38 33 2d  NCE-OF: R-49783-
50a0: 36 31 32 37 39 20 41 6e 20 22 61 74 22 20 73 69  61279 An "at" si
50b0: 67 6e 20 77 6f 72 6b 73 20 65 78 61 63 74 6c 79  gn works exactly
50c0: 20 6c 69 6b 65 20 61 20 63 6f 6c 6f 6e 2c 0a 23   like a colon,.#
50d0: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
50e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   name of the par
50f0: 61 6d 65 74 65 72 20 63 72 65 61 74 65 64 20 69  ameter created i
5100: 73 20 40 41 41 41 41 2e 0a 23 0a 70 61 72 61 6d  s @AAAA..#.param
5110: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
5120: 2d 31 31 2e 33 2e 31 20 7b 53 45 4c 45 43 54 20  -11.3.1 {SELECT 
5130: 40 41 41 41 41 7d 20 20 20 20 20 20 20 20 20 7b  @AAAA}         {
5140: 31 20 40 41 41 41 41 7d 20 20 20 20 20 20 20 2d  1 @AAAA}       -
5150: 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  1.parameter_test
5160: 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e 32 20 7b   e_expr-11.3.2 {
5170: 53 45 4c 45 43 54 20 40 31 32 33 7d 20 20 20 20  SELECT @123}    
5180: 20 20 20 20 20 20 7b 31 20 40 31 32 33 7d 20 20        {1 @123}  
5190: 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74        -1.paramet
51a0: 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  er_test e_expr-1
51b0: 31 2e 33 2e 33 20 7b 53 45 4c 45 43 54 20 40 5f  1.3.3 {SELECT @_
51c0: 5f 7d 20 20 20 20 20 20 20 20 20 20 20 7b 31 20  _}           {1 
51d0: 40 5f 5f 7d 20 20 20 20 20 20 20 20 20 2d 31 0a  @__}         -1.
51e0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
51f0: 5f 65 78 70 72 2d 31 31 2e 33 2e 34 20 7b 53 45  _expr-11.3.4 {SE
5200: 4c 45 43 54 20 40 5f 24 5f 7d 20 20 20 20 20 20  LECT @_$_}      
5210: 20 20 20 20 7b 31 20 40 5f 24 5f 7d 20 20 20 20      {1 @_$_}    
5220: 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72      -1.parameter
5230: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5240: 33 2e 35 20 22 0a 20 20 53 45 4c 45 43 54 20 40  3.5 ".  SELECT @
5250: 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65  \u0e40\u0e2d\u0e
5260: 32 38 5c 75 30 65 30 32 5c 75 30 65 33 39 5c 75  28\u0e02\u0e39\u
5270: 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 35  0e40\u0e2d\u0e25
5280: 0a 22 20 22 31 20 40 5c 75 30 65 34 30 5c 75 30  ." "1 @\u0e40\u0
5290: 65 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c  e2d\u0e28\u0e02\
52a0: 75 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32  u0e39\u0e40\u0e2
52b0: 64 5c 75 30 65 32 35 22 20 2d 31 0a 70 61 72 61  d\u0e25" -1.para
52c0: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
52d0: 72 2d 31 31 2e 33 2e 36 20 22 53 45 4c 45 43 54  r-11.3.6 "SELECT
52e0: 20 40 5c 75 30 30 38 30 22 20 22 31 20 40 5c 75   @\u0080" "1 @\u
52f0: 30 30 38 30 22 20 2d 31 0a 0a 23 20 45 56 49 44  0080" -1..# EVID
5300: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 32 36 31 30  ENCE-OF: R-62610
5310: 2d 35 31 33 32 39 20 41 20 64 6f 6c 6c 61 72 2d  -51329 A dollar-
5320: 73 69 67 6e 20 66 6f 6c 6c 6f 77 65 64 20 62 79  sign followed by
5330: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 0a 23   an identifier.#
5340: 20 6e 61 6d 65 20 61 6c 73 6f 20 68 6f 6c 64 73   name also holds
5350: 20 61 20 73 70 6f 74 20 66 6f 72 20 61 20 6e 61   a spot for a na
5360: 6d 65 64 20 70 61 72 61 6d 65 74 65 72 20 77 69  med parameter wi
5370: 74 68 20 74 68 65 20 6e 61 6d 65 20 24 41 41 41  th the name $AAA
5380: 41 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  A..#.# EVIDENCE-
5390: 4f 46 3a 20 52 2d 35 35 30 32 35 2d 32 31 30 34  OF: R-55025-2104
53a0: 32 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72  2 The identifier
53b0: 20 6e 61 6d 65 20 69 6e 20 74 68 69 73 20 63 61   name in this ca
53c0: 73 65 20 63 61 6e 0a 23 20 69 6e 63 6c 75 64 65  se can.# include
53d0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 63 63   one or more occ
53e0: 75 72 72 65 6e 63 65 73 20 6f 66 20 22 3a 3a 22  urrences of "::"
53f0: 20 61 6e 64 20 61 20 73 75 66 66 69 78 20 65 6e   and a suffix en
5400: 63 6c 6f 73 65 64 20 69 6e 0a 23 20 22 28 2e 2e  closed in.# "(..
5410: 2e 29 22 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  .)" containing a
5420: 6e 79 20 74 65 78 74 20 61 74 20 61 6c 6c 2e 0a  ny text at all..
5430: 23 0a 23 20 4e 6f 74 65 3a 20 4c 6f 6f 6b 73 20  #.# Note: Looks 
5440: 6c 69 6b 65 20 61 6e 20 69 64 65 6e 74 69 66 69  like an identifi
5450: 65 72 20 63 61 6e 6e 6f 74 20 63 6f 6e 73 69 73  er cannot consis
5460: 74 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 22 3a  t entirely of ":
5470: 3a 22 20 0a 23 20 63 68 61 72 61 63 74 65 72 73  :" .# characters
5480: 20 6f 72 20 6a 75 73 74 20 61 20 73 75 66 66 69   or just a suffi
5490: 78 2e 20 41 6c 73 6f 2c 20 74 68 65 20 6f 74 68  x. Also, the oth
54a0: 65 72 20 6e 61 6d 65 64 20 76 61 72 69 61 62 6c  er named variabl
54b0: 65 20 63 68 61 72 61 63 74 65 72 73 0a 23 20 28  e characters.# (
54c0: 3a 20 61 6e 64 20 40 29 20 77 6f 72 6b 20 74 68  : and @) work th
54d0: 65 20 73 61 6d 65 20 77 61 79 20 69 6e 74 65 72  e same way inter
54e0: 6e 61 6c 6c 79 2e 20 57 68 79 20 6e 6f 74 20 6a  nally. Why not j
54f0: 75 73 74 20 64 6f 63 75 6d 65 6e 74 20 69 74 20  ust document it 
5500: 74 68 61 74 20 77 61 79 3f 0a 23 0a 70 61 72 61  that way?.#.para
5510: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
5520: 72 2d 31 31 2e 34 2e 31 20 7b 53 45 4c 45 43 54  r-11.4.1 {SELECT
5530: 20 24 41 41 41 41 7d 20 20 20 20 20 20 20 20 20   $AAAA}         
5540: 7b 31 20 24 41 41 41 41 7d 20 20 20 20 20 20 20  {1 $AAAA}       
5550: 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  -1.parameter_tes
5560: 74 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e 32 20  t e_expr-11.4.2 
5570: 7b 53 45 4c 45 43 54 20 24 31 32 33 7d 20 20 20  {SELECT $123}   
5580: 20 20 20 20 20 20 20 7b 31 20 24 31 32 33 7d 20         {1 $123} 
5590: 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65         -1.parame
55a0: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
55b0: 31 31 2e 34 2e 33 20 7b 53 45 4c 45 43 54 20 24  11.4.3 {SELECT $
55c0: 5f 5f 7d 20 20 20 20 20 20 20 20 20 20 20 7b 31  __}           {1
55d0: 20 24 5f 5f 7d 20 20 20 20 20 20 20 20 20 2d 31   $__}         -1
55e0: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
55f0: 65 5f 65 78 70 72 2d 31 31 2e 34 2e 34 20 7b 53  e_expr-11.4.4 {S
5600: 45 4c 45 43 54 20 24 5f 24 5f 7d 20 20 20 20 20  ELECT $_$_}     
5610: 20 20 20 20 20 7b 31 20 24 5f 24 5f 7d 20 20 20       {1 $_$_}   
5620: 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65       -1.paramete
5630: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
5640: 2e 34 2e 35 20 22 0a 20 20 53 45 4c 45 43 54 20  .4.5 ".  SELECT 
5650: 5c 24 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75  \$\u0e40\u0e2d\u
5660: 30 65 32 38 5c 75 30 65 30 32 5c 75 30 65 33 39  0e28\u0e02\u0e39
5670: 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65  \u0e40\u0e2d\u0e
5680: 32 35 0a 22 20 22 31 20 5c 24 5c 75 30 65 34 30  25." "1 \$\u0e40
5690: 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75 30 65  \u0e2d\u0e28\u0e
56a0: 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30 5c 75  02\u0e39\u0e40\u
56b0: 30 65 32 64 5c 75 30 65 32 35 22 20 2d 31 0a 70  0e2d\u0e25" -1.p
56c0: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
56d0: 65 78 70 72 2d 31 31 2e 34 2e 36 20 22 53 45 4c  expr-11.4.6 "SEL
56e0: 45 43 54 20 5c 24 5c 75 30 30 38 30 22 20 22 31  ECT \$\u0080" "1
56f0: 20 5c 24 5c 75 30 30 38 30 22 20 2d 31 0a 0a 70   \$\u0080" -1..p
5700: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
5710: 65 78 70 72 2d 31 31 2e 35 2e 31 20 7b 53 45 4c  expr-11.5.1 {SEL
5720: 45 43 54 20 24 3a 3a 3a 3a 61 28 2b 2b 2d 2d 2b  ECT $::::a(++--+
5730: 2b 29 7d 20 7b 31 20 24 3a 3a 3a 3a 61 28 2b 2b  +)} {1 $::::a(++
5740: 2d 2d 2b 2b 29 7d 20 2d 31 0a 70 61 72 61 6d 65  --++)} -1.parame
5750: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
5760: 31 31 2e 35 2e 32 20 7b 53 45 4c 45 43 54 20 24  11.5.2 {SELECT $
5770: 3a 3a 61 28 29 7d 20 7b 31 20 24 3a 3a 61 28 29  ::a()} {1 $::a()
5780: 7d 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74  } -1.parameter_t
5790: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 35 2e  est e_expr-11.5.
57a0: 33 20 7b 53 45 4c 45 43 54 20 24 3a 3a 31 28 3a  3 {SELECT $::1(:
57b0: 3a 23 24 29 7d 20 7b 31 20 24 3a 3a 31 28 3a 3a  :#$)} {1 $::1(::
57c0: 23 24 29 7d 20 2d 31 0a 20 0a 23 20 45 56 49 44  #$)} -1. .# EVID
57d0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 33 37 30  ENCE-OF: R-11370
57e0: 2d 30 34 35 32 30 20 4e 61 6d 65 64 20 70 61 72  -04520 Named par
57f0: 61 6d 65 74 65 72 73 20 61 72 65 20 61 6c 73 6f  ameters are also
5800: 20 6e 75 6d 62 65 72 65 64 2e 20 54 68 65 0a 23   numbered. The.#
5810: 20 6e 75 6d 62 65 72 20 61 73 73 69 67 6e 65 64   number assigned
5820: 20 69 73 20 6f 6e 65 20 67 72 65 61 74 65 72 20   is one greater 
5830: 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74  than the largest
5840: 20 70 61 72 61 6d 65 74 65 72 20 6e 75 6d 62 65   parameter numbe
5850: 72 0a 23 20 61 6c 72 65 61 64 79 20 61 73 73 69  r.# already assi
5860: 67 6e 65 64 2e 0a 23 0a 23 20 45 56 49 44 45 4e  gned..#.# EVIDEN
5870: 43 45 2d 4f 46 3a 20 52 2d 34 32 36 32 30 2d 32  CE-OF: R-42620-2
5880: 32 31 38 34 20 49 66 20 74 68 69 73 20 6d 65 61  2184 If this mea
5890: 6e 73 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  ns the parameter
58a0: 20 77 6f 75 6c 64 20 62 65 0a 23 20 61 73 73 69   would be.# assi
58b0: 67 6e 65 64 20 61 20 6e 75 6d 62 65 72 20 67 72  gned a number gr
58c0: 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54  eater than SQLIT
58d0: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
58e0: 55 4d 42 45 52 2c 20 69 74 20 69 73 20 61 6e 0a  UMBER, it is an.
58f0: 23 20 65 72 72 6f 72 2e 0a 23 0a 70 61 72 61 6d  # error..#.param
5900: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
5910: 2d 31 31 2e 36 2e 31 20 22 53 45 4c 45 43 54 20  -11.6.1 "SELECT 
5920: 3f 2c 20 40 61 62 63 22 20 20 20 20 7b 31 20 7b  ?, @abc"    {1 {
5930: 7d 20 32 20 40 61 62 63 7d 20 7b 2d 31 20 2d 32  } 2 @abc} {-1 -2
5940: 7d 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  }.parameter_test
5950: 20 65 5f 65 78 70 72 2d 31 31 2e 36 2e 32 20 22   e_expr-11.6.2 "
5960: 53 45 4c 45 43 54 20 3f 31 32 33 2c 20 3a 61 31  SELECT ?123, :a1
5970: 22 20 20 7b 31 32 33 20 3f 31 32 33 20 31 32 34  "  {123 ?123 124
5980: 20 3a 61 31 7d 20 7b 2d 31 32 33 20 2d 31 32 34   :a1} {-123 -124
5990: 7d 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  }.parameter_test
59a0: 20 65 5f 65 78 70 72 2d 31 31 2e 36 2e 33 20 7b   e_expr-11.6.3 {
59b0: 53 45 4c 45 43 54 20 24 61 2c 20 3f 38 2c 20 3f  SELECT $a, ?8, ?
59c0: 2c 20 24 62 2c 20 3f 32 2c 20 24 63 7d 20 7b 0a  , $b, ?2, $c} {.
59d0: 20 20 31 20 24 61 20 38 20 3f 38 20 39 20 7b 7d    1 $a 8 ?8 9 {}
59e0: 20 31 30 20 24 62 20 32 20 3f 32 20 31 31 20 24   10 $b 2 ?2 11 $
59f0: 63 0a 7d 20 7b 2d 31 20 2d 38 20 2d 39 20 2d 31  c.} {-1 -8 -9 -1
5a00: 30 20 2d 32 20 2d 31 31 7d 0a 66 6f 72 65 61 63  0 -2 -11}.foreac
5a10: 68 20 7b 74 6e 20 73 71 6c 7d 20 5b 6c 69 73 74  h {tn sql} [list
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 31             \.  1
5a40: 20 20 22 53 45 4c 45 43 54 20 3f 24 6d 76 6e 2c    "SELECT ?$mvn,
5a50: 20 5c 24 3a 3a 61 22 20 20 20 20 20 20 20 20 20   \$::a"         
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
5a70: 20 20 32 20 20 22 53 45 4c 45 43 54 20 3f 24 6d    2  "SELECT ?$m
5a80: 76 6e 2c 20 3f 34 2c 20 40 61 31 22 20 20 20 20  vn, ?4, @a1"    
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 20 5c 0a 20 20 33 20 20 22 53 45 4c 45 43 54 20   \.  3  "SELECT 
5ab0: 3f 5b 65 78 70 72 20 24 6d 76 6e 2d 32 5d 2c 20  ?[expr $mvn-2], 
5ac0: 3a 62 61 67 2c 20 40 31 32 33 2c 20 5c 24 78 22  :bag, @123, \$x"
5ad0: 20 20 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 63      \.] {.  do_c
5ae0: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65  atchsql_test e_e
5af0: 78 70 72 2d 31 31 2e 37 2e 24 74 6e 20 24 73 71  xpr-11.7.$tn $sq
5b00: 6c 20 5b 6c 69 73 74 20 31 20 7b 74 6f 6f 20 6d  l [list 1 {too m
5b10: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
5b20: 73 7d 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  s}].}..# EVIDENC
5b30: 45 2d 4f 46 3a 20 52 2d 31 34 30 36 38 2d 34 39  E-OF: R-14068-49
5b40: 36 37 31 20 50 61 72 61 6d 65 74 65 72 73 20 74  671 Parameters t
5b50: 68 61 74 20 61 72 65 20 6e 6f 74 20 61 73 73 69  hat are not assi
5b60: 67 6e 65 64 20 76 61 6c 75 65 73 0a 23 20 75 73  gned values.# us
5b70: 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ing sqlite3_bind
5b80: 28 29 20 61 72 65 20 74 72 65 61 74 65 64 20 61  () are treated a
5b90: 73 20 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f 74 65 73  s NULL..#.do_tes
5ba0: 74 20 65 5f 65 78 70 72 2d 31 31 2e 37 2e 31 20  t e_expr-11.7.1 
5bb0: 7b 0a 20 20 73 65 74 20 73 74 6d 74 20 5b 73 71  {.  set stmt [sq
5bc0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
5bd0: 20 64 62 20 7b 20 53 45 4c 45 43 54 20 3f 2c 20   db { SELECT ?, 
5be0: 3a 61 2c 20 40 62 2c 20 24 64 20 7d 20 2d 31 5d  :a, @b, $d } -1]
5bf0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20  .  sqlite3_step 
5c00: 24 73 74 6d 74 0a 0a 20 20 6c 69 73 74 20 5b 73  $stmt..  list [s
5c10: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
5c20: 70 65 20 24 73 74 6d 74 20 30 5d 20 5c 0a 20 20  pe $stmt 0] \.  
5c30: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 5f 63 6f       [sqlite3_co
5c40: 6c 75 6d 6e 5f 74 79 70 65 20 24 73 74 6d 74 20  lumn_type $stmt 
5c50: 31 5d 20 5c 0a 20 20 20 20 20 20 20 5b 73 71 6c  1] \.       [sql
5c60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
5c70: 20 24 73 74 6d 74 20 32 5d 20 5c 0a 20 20 20 20   $stmt 2] \.    
5c80: 20 20 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75     [sqlite3_colu
5c90: 6d 6e 5f 74 79 70 65 20 24 73 74 6d 74 20 33 5d  mn_type $stmt 3]
5ca0: 20 0a 7d 20 7b 4e 55 4c 4c 20 4e 55 4c 4c 20 4e   .} {NULL NULL N
5cb0: 55 4c 4c 20 4e 55 4c 4c 7d 0a 64 6f 5f 74 65 73  ULL NULL}.do_tes
5cc0: 74 20 65 5f 65 78 70 72 2d 31 31 2e 37 2e 31 20  t e_expr-11.7.1 
5cd0: 7b 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  { sqlite3_finali
5ce0: 7a 65 20 24 73 74 6d 74 20 7d 20 53 51 4c 49 54  ze $stmt } SQLIT
5cf0: 45 5f 4f 4b 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  E_OK..#---------
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 2d 2d 2d 2d 2d 2d 2d  ----------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d40: 0a 23 20 22 54 65 73 74 22 20 74 68 65 20 73 79  .# "Test" the sy
5d50: 6e 74 61 78 20 64 69 61 67 72 61 6d 73 20 69 6e  ntax diagrams in
5d60: 20 6c 61 6e 67 5f 65 78 70 72 2e 68 74 6d 6c 2e   lang_expr.html.
5d70: 0a 23 0a 23 20 2d 2d 20 73 79 6e 74 61 78 20 64  .#.# -- syntax d
5d80: 69 61 67 72 61 6d 20 73 69 67 6e 65 64 2d 6e 75  iagram signed-nu
5d90: 6d 62 65 72 0a 23 0a 64 6f 5f 65 78 65 63 73 71  mber.#.do_execsq
5da0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  l_test e_expr-12
5db0: 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 30 2c  .1.1 { SELECT 0,
5dc0: 20 2b 30 2c 20 2d 30 20 7d 20 7b 30 20 30 20 30   +0, -0 } {0 0 0
5dd0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
5de0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 31 2e 32 20  t e_expr-12.1.2 
5df0: 7b 20 53 45 4c 45 43 54 20 31 2c 20 2b 31 2c 20  { SELECT 1, +1, 
5e00: 2d 31 20 7d 20 7b 31 20 31 20 2d 31 7d 0a 64 6f  -1 } {1 1 -1}.do
5e10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
5e20: 65 78 70 72 2d 31 32 2e 31 2e 33 20 7b 20 53 45  expr-12.1.3 { SE
5e30: 4c 45 43 54 20 32 2c 20 2b 32 2c 20 2d 32 20 7d  LECT 2, +2, -2 }
5e40: 20 7b 32 20 32 20 2d 32 7d 0a 64 6f 5f 65 78 65   {2 2 -2}.do_exe
5e50: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
5e60: 2d 31 32 2e 31 2e 34 20 7b 20 0a 20 20 53 45 4c  -12.1.4 { .  SEL
5e70: 45 43 54 20 31 2e 34 2c 20 2b 31 2e 34 2c 20 2d  ECT 1.4, +1.4, -
5e80: 31 2e 34 20 0a 7d 20 7b 31 2e 34 20 31 2e 34 20  1.4 .} {1.4 1.4 
5e90: 2d 31 2e 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  -1.4}.do_execsql
5ea0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
5eb0: 31 2e 35 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  1.5 { .  SELECT 
5ec0: 31 2e 35 65 2b 35 2c 20 2b 31 2e 35 65 2b 35 2c  1.5e+5, +1.5e+5,
5ed0: 20 2d 31 2e 35 65 2b 35 20 0a 7d 20 7b 31 35 30   -1.5e+5 .} {150
5ee0: 30 30 30 2e 30 20 31 35 30 30 30 30 2e 30 20 2d  000.0 150000.0 -
5ef0: 31 35 30 30 30 30 2e 30 7d 0a 64 6f 5f 65 78 65  150000.0}.do_exe
5f00: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
5f10: 2d 31 32 2e 31 2e 36 20 7b 20 0a 20 20 53 45 4c  -12.1.6 { .  SEL
5f20: 45 43 54 20 30 2e 30 30 30 31 2c 20 2b 30 2e 30  ECT 0.0001, +0.0
5f30: 30 30 31 2c 20 2d 30 2e 30 30 30 31 20 0a 7d 20  001, -0.0001 .} 
5f40: 7b 30 2e 30 30 30 31 20 30 2e 30 30 30 31 20 2d  {0.0001 0.0001 -
5f50: 30 2e 30 30 30 31 7d 0a 0a 23 20 2d 2d 20 73 79  0.0001}..# -- sy
5f60: 6e 74 61 78 20 64 69 61 67 72 61 6d 20 6c 69 74  ntax diagram lit
5f70: 65 72 61 6c 2d 76 61 6c 75 65 0a 23 0a 73 65 74  eral-value.#.set
5f80: 20 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f   sqlite_current_
5f90: 74 69 6d 65 20 31 0a 64 6f 5f 65 78 65 63 73 71  time 1.do_execsq
5fa0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  l_test e_expr-12
5fb0: 2e 32 2e 31 20 7b 53 45 4c 45 43 54 20 31 32 33  .2.1 {SELECT 123
5fc0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
5fd0: 7b 31 32 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  {123}.do_execsql
5fe0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
5ff0: 32 2e 32 20 7b 53 45 4c 45 43 54 20 31 32 33 2e  2.2 {SELECT 123.
6000: 34 65 30 35 7d 20 20 20 20 20 20 20 20 20 20 7b  4e05}          {
6010: 31 32 33 34 30 30 30 30 2e 30 7d 0a 64 6f 5f 65  12340000.0}.do_e
6020: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
6030: 70 72 2d 31 32 2e 32 2e 33 20 7b 53 45 4c 45 43  pr-12.2.3 {SELEC
6040: 54 20 27 61 62 63 64 65 27 7d 20 20 20 20 20 20  T 'abcde'}      
6050: 20 20 20 20 20 7b 61 62 63 64 65 7d 0a 64 6f 5f       {abcde}.do_
6060: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
6070: 78 70 72 2d 31 32 2e 32 2e 34 20 7b 53 45 4c 45  xpr-12.2.4 {SELE
6080: 43 54 20 58 27 34 31 34 32 34 33 27 7d 20 20 20  CT X'414243'}   
6090: 20 20 20 20 20 20 7b 41 42 43 7d 0a 64 6f 5f 65        {ABC}.do_e
60a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
60b0: 70 72 2d 31 32 2e 32 2e 35 20 7b 53 45 4c 45 43  pr-12.2.5 {SELEC
60c0: 54 20 4e 55 4c 4c 7d 20 20 20 20 20 20 20 20 20  T NULL}         
60d0: 20 20 20 20 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65       {{}}.do_exe
60e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
60f0: 2d 31 32 2e 32 2e 36 20 7b 53 45 4c 45 43 54 20  -12.2.6 {SELECT 
6100: 43 55 52 52 45 4e 54 5f 54 49 4d 45 7d 20 20 20  CURRENT_TIME}   
6110: 20 20 20 7b 30 30 3a 30 30 3a 30 31 7d 0a 64 6f     {00:00:01}.do
6120: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
6130: 65 78 70 72 2d 31 32 2e 32 2e 37 20 7b 53 45 4c  expr-12.2.7 {SEL
6140: 45 43 54 20 43 55 52 52 45 4e 54 5f 44 41 54 45  ECT CURRENT_DATE
6150: 7d 20 20 20 20 20 20 7b 31 39 37 30 2d 30 31 2d  }      {1970-01-
6160: 30 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  01}.do_execsql_t
6170: 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e  est e_expr-12.2.
6180: 38 20 7b 53 45 4c 45 43 54 20 43 55 52 52 45 4e  8 {SELECT CURREN
6190: 54 5f 54 49 4d 45 53 54 41 4d 50 7d 20 7b 7b 31  T_TIMESTAMP} {{1
61a0: 39 37 30 2d 30 31 2d 30 31 20 30 30 3a 30 30 3a  970-01-01 00:00:
61b0: 30 31 7d 7d 0a 73 65 74 20 73 71 6c 69 74 65 5f  01}}.set sqlite_
61c0: 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 30 0a 0a  current_time 0..
61d0: 23 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67  # -- syntax diag
61e0: 72 61 6d 20 65 78 70 72 0a 23 0a 66 6f 72 63 65  ram expr.#.force
61f0: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 32 0a  delete test.db2.
6200: 65 78 65 63 73 71 6c 20 7b 0a 20 20 41 54 54 41  execsql {.  ATTA
6210: 43 48 20 27 74 65 73 74 2e 64 62 32 27 20 41 53  CH 'test.db2' AS
6220: 20 64 62 6e 61 6d 65 3b 0a 20 20 43 52 45 41 54   dbname;.  CREAT
6230: 45 20 54 41 42 4c 45 20 64 62 6e 61 6d 65 2e 74  E TABLE dbname.t
6240: 62 6c 6e 61 6d 65 28 63 6e 61 6d 65 29 3b 0a 7d  blname(cname);.}
6250: 0a 0a 70 72 6f 63 20 67 6c 6f 62 20 7b 61 72 67  ..proc glob {arg
6260: 73 7d 20 7b 72 65 74 75 72 6e 20 31 7d 0a 64 62  s} {return 1}.db
6270: 20 66 75 6e 63 74 69 6f 6e 20 67 6c 6f 62 20 67   function glob g
6280: 6c 6f 62 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20  lob.db function 
6290: 6d 61 74 63 68 20 67 6c 6f 62 0a 64 62 20 66 75  match glob.db fu
62a0: 6e 63 74 69 6f 6e 20 72 65 67 65 78 70 20 67 6c  nction regexp gl
62b0: 6f 62 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  ob..foreach {tn 
62c0: 65 78 70 72 7d 20 7b 0a 20 20 31 20 31 32 33 0a  expr} {.  1 123.
62d0: 20 20 32 20 31 32 33 2e 34 65 30 35 0a 20 20 33    2 123.4e05.  3
62e0: 20 27 61 62 63 64 65 27 0a 20 20 34 20 58 27 34   'abcde'.  4 X'4
62f0: 31 34 32 34 33 27 0a 20 20 35 20 4e 55 4c 4c 0a  14243'.  5 NULL.
6300: 20 20 36 20 43 55 52 52 45 4e 54 5f 54 49 4d 45    6 CURRENT_TIME
6310: 0a 20 20 37 20 43 55 52 52 45 4e 54 5f 44 41 54  .  7 CURRENT_DAT
6320: 45 0a 20 20 38 20 43 55 52 52 45 4e 54 5f 54 49  E.  8 CURRENT_TI
6330: 4d 45 53 54 41 4d 50 0a 0a 20 20 39 20 3f 0a 20  MESTAMP..  9 ?. 
6340: 31 30 20 3f 31 32 33 0a 20 31 31 20 40 68 65 6c  10 ?123. 11 @hel
6350: 6c 6f 0a 20 31 32 20 3a 77 6f 72 6c 64 0a 20 31  lo. 12 :world. 1
6360: 33 20 24 74 63 6c 0a 20 31 34 20 24 74 63 6c 28  3 $tcl. 14 $tcl(
6370: 61 72 72 61 79 29 0a 20 20 0a 20 20 31 35 20 63  array).  .  15 c
6380: 6e 61 6d 65 0a 20 20 31 36 20 74 62 6c 6e 61 6d  name.  16 tblnam
6390: 65 2e 63 6e 61 6d 65 0a 20 20 31 37 20 64 62 6e  e.cname.  17 dbn
63a0: 61 6d 65 2e 74 62 6c 6e 61 6d 65 2e 63 6e 61 6d  ame.tblname.cnam
63b0: 65 0a 0a 20 20 31 38 20 22 2b 20 45 58 50 52 22  e..  18 "+ EXPR"
63c0: 0a 20 20 31 39 20 22 2d 20 45 58 50 52 22 0a 20  .  19 "- EXPR". 
63d0: 20 32 30 20 22 4e 4f 54 20 45 58 50 52 22 0a 20   20 "NOT EXPR". 
63e0: 20 32 31 20 22 7e 20 45 58 50 52 22 0a 0a 20 20   21 "~ EXPR"..  
63f0: 32 32 20 22 45 58 50 52 31 20 7c 7c 20 45 58 50  22 "EXPR1 || EXP
6400: 52 32 22 0a 20 20 32 33 20 22 45 58 50 52 31 20  R2".  23 "EXPR1 
6410: 2a 20 45 58 50 52 32 22 0a 20 20 32 34 20 22 45  * EXPR2".  24 "E
6420: 58 50 52 31 20 2f 20 45 58 50 52 32 22 0a 20 20  XPR1 / EXPR2".  
6430: 32 35 20 22 45 58 50 52 31 20 25 20 45 58 50 52  25 "EXPR1 % EXPR
6440: 32 22 0a 20 20 32 36 20 22 45 58 50 52 31 20 2b  2".  26 "EXPR1 +
6450: 20 45 58 50 52 32 22 0a 20 20 32 37 20 22 45 58   EXPR2".  27 "EX
6460: 50 52 31 20 2d 20 45 58 50 52 32 22 0a 20 20 32  PR1 - EXPR2".  2
6470: 38 20 22 45 58 50 52 31 20 3c 3c 20 45 58 50 52  8 "EXPR1 << EXPR
6480: 32 22 0a 20 20 32 39 20 22 45 58 50 52 31 20 3e  2".  29 "EXPR1 >
6490: 3e 20 45 58 50 52 32 22 0a 20 20 33 30 20 22 45  > EXPR2".  30 "E
64a0: 58 50 52 31 20 26 20 45 58 50 52 32 22 0a 20 20  XPR1 & EXPR2".  
64b0: 33 31 20 22 45 58 50 52 31 20 7c 20 45 58 50 52  31 "EXPR1 | EXPR
64c0: 32 22 0a 20 20 33 32 20 22 45 58 50 52 31 20 3c  2".  32 "EXPR1 <
64d0: 20 45 58 50 52 32 22 0a 20 20 33 33 20 22 45 58   EXPR2".  33 "EX
64e0: 50 52 31 20 3c 3d 20 45 58 50 52 32 22 0a 20 20  PR1 <= EXPR2".  
64f0: 33 34 20 22 45 58 50 52 31 20 3e 20 45 58 50 52  34 "EXPR1 > EXPR
6500: 32 22 0a 20 20 33 35 20 22 45 58 50 52 31 20 3e  2".  35 "EXPR1 >
6510: 3d 20 45 58 50 52 32 22 0a 20 20 33 36 20 22 45  = EXPR2".  36 "E
6520: 58 50 52 31 20 3d 20 45 58 50 52 32 22 0a 20 20  XPR1 = EXPR2".  
6530: 33 37 20 22 45 58 50 52 31 20 3d 3d 20 45 58 50  37 "EXPR1 == EXP
6540: 52 32 22 0a 20 20 33 38 20 22 45 58 50 52 31 20  R2".  38 "EXPR1 
6550: 21 3d 20 45 58 50 52 32 22 0a 20 20 33 39 20 22  != EXPR2".  39 "
6560: 45 58 50 52 31 20 3c 3e 20 45 58 50 52 32 22 0a  EXPR1 <> EXPR2".
6570: 20 20 34 30 20 22 45 58 50 52 31 20 49 53 20 45    40 "EXPR1 IS E
6580: 58 50 52 32 22 0a 20 20 34 31 20 22 45 58 50 52  XPR2".  41 "EXPR
6590: 31 20 49 53 20 4e 4f 54 20 45 58 50 52 32 22 0a  1 IS NOT EXPR2".
65a0: 20 20 34 32 20 22 45 58 50 52 31 20 41 4e 44 20    42 "EXPR1 AND 
65b0: 45 58 50 52 32 22 0a 20 20 34 33 20 22 45 58 50  EXPR2".  43 "EXP
65c0: 52 31 20 4f 52 20 45 58 50 52 32 22 0a 20 0a 20  R1 OR EXPR2". . 
65d0: 20 34 34 20 22 63 6f 75 6e 74 28 2a 29 22 0a 20   44 "count(*)". 
65e0: 20 34 35 20 22 63 6f 75 6e 74 28 44 49 53 54 49   45 "count(DISTI
65f0: 4e 43 54 20 45 58 50 52 29 22 0a 20 20 34 36 20  NCT EXPR)".  46 
6600: 22 73 75 62 73 74 72 28 45 58 50 52 2c 20 31 30  "substr(EXPR, 10
6610: 2c 20 32 30 29 22 0a 20 20 34 37 20 22 63 68 61  , 20)".  47 "cha
6620: 6e 67 65 73 28 29 22 0a 20 0a 20 20 34 38 20 22  nges()". .  48 "
6630: 28 20 45 58 50 52 20 29 22 0a 20 0a 20 20 34 39  ( EXPR )". .  49
6640: 20 22 43 41 53 54 20 28 20 45 58 50 52 20 41 53   "CAST ( EXPR AS
6650: 20 69 6e 74 65 67 65 72 20 29 22 0a 20 20 35 30   integer )".  50
6660: 20 22 43 41 53 54 20 28 20 45 58 50 52 20 41 53   "CAST ( EXPR AS
6670: 20 27 61 62 63 64 27 20 29 22 0a 20 20 35 31 20   'abcd' )".  51 
6680: 22 43 41 53 54 20 28 20 45 58 50 52 20 41 53 20  "CAST ( EXPR AS 
6690: 27 61 62 24 20 24 63 64 27 20 29 22 0a 20 0a 20  'ab$ $cd' )". . 
66a0: 20 35 32 20 22 45 58 50 52 20 43 4f 4c 4c 41 54   52 "EXPR COLLAT
66b0: 45 20 6e 6f 63 61 73 65 22 0a 20 20 35 33 20 22  E nocase".  53 "
66c0: 45 58 50 52 20 43 4f 4c 4c 41 54 45 20 62 69 6e  EXPR COLLATE bin
66d0: 61 72 79 22 0a 20 0a 20 20 35 34 20 22 45 58 50  ary". .  54 "EXP
66e0: 52 31 20 4c 49 4b 45 20 45 58 50 52 32 22 0a 20  R1 LIKE EXPR2". 
66f0: 20 35 35 20 22 45 58 50 52 31 20 4c 49 4b 45 20   55 "EXPR1 LIKE 
6700: 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50  EXPR2 ESCAPE EXP
6710: 52 22 0a 20 20 35 36 20 22 45 58 50 52 31 20 47  R".  56 "EXPR1 G
6720: 4c 4f 42 20 45 58 50 52 32 22 0a 20 20 35 37 20  LOB EXPR2".  57 
6730: 22 45 58 50 52 31 20 47 4c 4f 42 20 45 58 50 52  "EXPR1 GLOB EXPR
6740: 32 20 45 53 43 41 50 45 20 45 58 50 52 22 0a 20  2 ESCAPE EXPR". 
6750: 20 35 38 20 22 45 58 50 52 31 20 52 45 47 45 58   58 "EXPR1 REGEX
6760: 50 20 45 58 50 52 32 22 0a 20 20 35 39 20 22 45  P EXPR2".  59 "E
6770: 58 50 52 31 20 52 45 47 45 58 50 20 45 58 50 52  XPR1 REGEXP EXPR
6780: 32 20 45 53 43 41 50 45 20 45 58 50 52 22 0a 20  2 ESCAPE EXPR". 
6790: 20 36 30 20 22 45 58 50 52 31 20 4d 41 54 43 48   60 "EXPR1 MATCH
67a0: 20 45 58 50 52 32 22 0a 20 20 36 31 20 22 45 58   EXPR2".  61 "EX
67b0: 50 52 31 20 4d 41 54 43 48 20 45 58 50 52 32 20  PR1 MATCH EXPR2 
67c0: 45 53 43 41 50 45 20 45 58 50 52 22 0a 20 20 36  ESCAPE EXPR".  6
67d0: 32 20 22 45 58 50 52 31 20 4e 4f 54 20 4c 49 4b  2 "EXPR1 NOT LIK
67e0: 45 20 45 58 50 52 32 22 0a 20 20 36 33 20 22 45  E EXPR2".  63 "E
67f0: 58 50 52 31 20 4e 4f 54 20 4c 49 4b 45 20 45 58  XPR1 NOT LIKE EX
6800: 50 52 32 20 45 53 43 41 50 45 20 45 58 50 52 22  PR2 ESCAPE EXPR"
6810: 0a 20 20 36 34 20 22 45 58 50 52 31 20 4e 4f 54  .  64 "EXPR1 NOT
6820: 20 47 4c 4f 42 20 45 58 50 52 32 22 0a 20 20 36   GLOB EXPR2".  6
6830: 35 20 22 45 58 50 52 31 20 4e 4f 54 20 47 4c 4f  5 "EXPR1 NOT GLO
6840: 42 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45  B EXPR2 ESCAPE E
6850: 58 50 52 22 0a 20 20 36 36 20 22 45 58 50 52 31  XPR".  66 "EXPR1
6860: 20 4e 4f 54 20 52 45 47 45 58 50 20 45 58 50 52   NOT REGEXP EXPR
6870: 32 22 0a 20 20 36 37 20 22 45 58 50 52 31 20 4e  2".  67 "EXPR1 N
6880: 4f 54 20 52 45 47 45 58 50 20 45 58 50 52 32 20  OT REGEXP EXPR2 
6890: 45 53 43 41 50 45 20 45 58 50 52 22 0a 20 20 36  ESCAPE EXPR".  6
68a0: 38 20 22 45 58 50 52 31 20 4e 4f 54 20 4d 41 54  8 "EXPR1 NOT MAT
68b0: 43 48 20 45 58 50 52 32 22 0a 20 20 36 39 20 22  CH EXPR2".  69 "
68c0: 45 58 50 52 31 20 4e 4f 54 20 4d 41 54 43 48 20  EXPR1 NOT MATCH 
68d0: 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50  EXPR2 ESCAPE EXP
68e0: 52 22 0a 20 0a 20 20 37 30 20 22 45 58 50 52 20  R". .  70 "EXPR 
68f0: 49 53 4e 55 4c 4c 22 0a 20 20 37 31 20 22 45 58  ISNULL".  71 "EX
6900: 50 52 20 4e 4f 54 4e 55 4c 4c 22 0a 20 20 37 32  PR NOTNULL".  72
6910: 20 22 45 58 50 52 20 4e 4f 54 20 4e 55 4c 4c 22   "EXPR NOT NULL"
6920: 0a 20 0a 20 20 37 33 20 22 45 58 50 52 31 20 49  . .  73 "EXPR1 I
6930: 53 20 45 58 50 52 32 22 0a 20 20 37 34 20 22 45  S EXPR2".  74 "E
6940: 58 50 52 31 20 49 53 20 4e 4f 54 20 45 58 50 52  XPR1 IS NOT EXPR
6950: 32 22 0a 0a 20 20 37 35 20 22 45 58 50 52 20 4e  2"..  75 "EXPR N
6960: 4f 54 20 42 45 54 57 45 45 4e 20 45 58 50 52 31  OT BETWEEN EXPR1
6970: 20 41 4e 44 20 45 58 50 52 32 22 0a 20 20 37 36   AND EXPR2".  76
6980: 20 22 45 58 50 52 20 42 45 54 57 45 45 4e 20 45   "EXPR BETWEEN E
6990: 58 50 52 31 20 41 4e 44 20 45 58 50 52 32 22 0a  XPR1 AND EXPR2".
69a0: 0a 20 20 37 37 20 22 45 58 50 52 20 4e 4f 54 20  .  77 "EXPR NOT 
69b0: 49 4e 20 28 53 45 4c 45 43 54 20 63 6e 61 6d 65  IN (SELECT cname
69c0: 20 46 52 4f 4d 20 74 62 6c 6e 61 6d 65 29 22 0a   FROM tblname)".
69d0: 20 20 37 38 20 22 45 58 50 52 20 4e 4f 54 20 49    78 "EXPR NOT I
69e0: 4e 20 28 31 29 22 0a 20 20 37 39 20 22 45 58 50  N (1)".  79 "EXP
69f0: 52 20 4e 4f 54 20 49 4e 20 28 31 2c 20 32 2c 20  R NOT IN (1, 2, 
6a00: 33 29 22 0a 20 20 38 30 20 22 45 58 50 52 20 4e  3)".  80 "EXPR N
6a10: 4f 54 20 49 4e 20 74 62 6c 6e 61 6d 65 22 0a 20  OT IN tblname". 
6a20: 20 38 31 20 22 45 58 50 52 20 4e 4f 54 20 49 4e   81 "EXPR NOT IN
6a30: 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61 6d 65 22   dbname.tblname"
6a40: 0a 20 20 38 32 20 22 45 58 50 52 20 49 4e 20 28  .  82 "EXPR IN (
6a50: 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46 52 4f  SELECT cname FRO
6a60: 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 20 20 38 33  M tblname)".  83
6a70: 20 22 45 58 50 52 20 49 4e 20 28 31 29 22 0a 20   "EXPR IN (1)". 
6a80: 20 38 34 20 22 45 58 50 52 20 49 4e 20 28 31 2c   84 "EXPR IN (1,
6a90: 20 32 2c 20 33 29 22 0a 20 20 38 35 20 22 45 58   2, 3)".  85 "EX
6aa0: 50 52 20 49 4e 20 74 62 6c 6e 61 6d 65 22 0a 20  PR IN tblname". 
6ab0: 20 38 36 20 22 45 58 50 52 20 49 4e 20 64 62 6e   86 "EXPR IN dbn
6ac0: 61 6d 65 2e 74 62 6c 6e 61 6d 65 22 0a 0a 20 20  ame.tblname"..  
6ad0: 38 37 20 22 45 58 49 53 54 53 20 28 53 45 4c 45  87 "EXISTS (SELE
6ae0: 43 54 20 63 6e 61 6d 65 20 46 52 4f 4d 20 74 62  CT cname FROM tb
6af0: 6c 6e 61 6d 65 29 22 0a 20 20 38 38 20 22 4e 4f  lname)".  88 "NO
6b00: 54 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54  T EXISTS (SELECT
6b10: 20 63 6e 61 6d 65 20 46 52 4f 4d 20 74 62 6c 6e   cname FROM tbln
6b20: 61 6d 65 29 22 0a 0a 20 20 38 39 20 22 43 41 53  ame)"..  89 "CAS
6b30: 45 20 45 58 50 52 20 57 48 45 4e 20 45 58 50 52  E EXPR WHEN EXPR
6b40: 31 20 54 48 45 4e 20 45 58 50 52 32 20 45 4c 53  1 THEN EXPR2 ELS
6b50: 45 20 45 58 50 52 20 45 4e 44 22 0a 20 20 39 30  E EXPR END".  90
6b60: 20 22 43 41 53 45 20 45 58 50 52 20 57 48 45 4e   "CASE EXPR WHEN
6b70: 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50 52   EXPR1 THEN EXPR
6b80: 32 20 45 4e 44 22 0a 20 20 39 31 20 22 43 41 53  2 END".  91 "CAS
6b90: 45 20 45 58 50 52 20 57 48 45 4e 20 45 58 50 52  E EXPR WHEN EXPR
6ba0: 31 20 54 48 45 4e 20 45 58 50 52 32 20 57 48 45  1 THEN EXPR2 WHE
6bb0: 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58 50 52  N EXPR THEN EXPR
6bc0: 31 20 45 4c 53 45 20 45 58 50 52 32 20 45 4e 44  1 ELSE EXPR2 END
6bd0: 22 0a 20 20 39 32 20 22 43 41 53 45 20 45 58 50  ".  92 "CASE EXP
6be0: 52 20 57 48 45 4e 20 45 58 50 52 31 20 54 48 45  R WHEN EXPR1 THE
6bf0: 4e 20 45 58 50 52 32 20 57 48 45 4e 20 45 58 50  N EXPR2 WHEN EXP
6c00: 52 20 54 48 45 4e 20 45 58 50 52 31 20 45 4e 44  R THEN EXPR1 END
6c10: 22 0a 20 20 39 33 20 22 43 41 53 45 20 57 48 45  ".  93 "CASE WHE
6c20: 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50  N EXPR1 THEN EXP
6c30: 52 32 20 45 4c 53 45 20 45 58 50 52 20 45 4e 44  R2 ELSE EXPR END
6c40: 22 0a 20 20 39 34 20 22 43 41 53 45 20 57 48 45  ".  94 "CASE WHE
6c50: 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50  N EXPR1 THEN EXP
6c60: 52 32 20 45 4e 44 22 0a 20 20 39 35 20 22 43 41  R2 END".  95 "CA
6c70: 53 45 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  SE WHEN EXPR1 TH
6c80: 45 4e 20 45 58 50 52 32 20 57 48 45 4e 20 45 58  EN EXPR2 WHEN EX
6c90: 50 52 20 54 48 45 4e 20 45 58 50 52 31 20 45 4c  PR THEN EXPR1 EL
6ca0: 53 45 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20  SE EXPR2 END".  
6cb0: 39 36 20 22 43 41 53 45 20 57 48 45 4e 20 45 58  96 "CASE WHEN EX
6cc0: 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 57  PR1 THEN EXPR2 W
6cd0: 48 45 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58  HEN EXPR THEN EX
6ce0: 50 52 31 20 45 4e 44 22 0a 7d 20 7b 0a 0a 20 20  PR1 END".} {..  
6cf0: 23 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  # If the express
6d00: 69 6f 6e 20 73 74 72 69 6e 67 20 62 65 69 6e 67  ion string being
6d10: 20 70 61 72 73 65 64 20 63 6f 6e 74 61 69 6e 73   parsed contains
6d20: 20 22 45 58 50 52 32 22 2c 20 74 68 65 6e 20 72   "EXPR2", then r
6d30: 65 70 6c 61 63 65 0a 20 20 23 20 73 74 72 69 6e  eplace.  # strin
6d40: 67 20 22 45 58 50 52 31 22 20 61 6e 64 20 22 45  g "EXPR1" and "E
6d50: 58 50 52 32 22 20 77 69 74 68 20 61 72 62 69 74  XPR2" with arbit
6d60: 72 61 72 79 20 53 51 4c 20 65 78 70 72 65 73 73  rary SQL express
6d70: 69 6f 6e 73 2e 20 49 66 20 69 74 20 0a 20 20 23  ions. If it .  #
6d80: 20 63 6f 6e 74 61 69 6e 73 20 22 45 58 50 52 22   contains "EXPR"
6d90: 2c 20 74 68 65 6e 20 72 65 70 6c 61 63 65 20 45  , then replace E
6da0: 58 50 52 20 77 69 74 68 20 61 6e 20 61 72 62 69  XPR with an arbi
6db0: 74 72 61 72 79 20 53 51 4c 20 65 78 70 72 65 73  trary SQL expres
6dc0: 73 69 6f 6e 2e 0a 20 20 23 20 0a 20 20 73 65 74  sion..  # .  set
6dd0: 20 65 6c 69 73 74 20 5b 6c 69 73 74 20 24 65 78   elist [list $ex
6de0: 70 72 5d 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e  pr].  if {[strin
6df0: 67 20 6d 61 74 63 68 20 2a 45 58 50 52 32 2a 20  g match *EXPR2* 
6e00: 24 65 78 70 72 5d 7d 20 7b 0a 20 20 20 20 73 65  $expr]} {.    se
6e10: 74 20 65 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 20  t elist [list]. 
6e20: 20 20 20 66 6f 72 65 61 63 68 20 7b 65 31 20 65     foreach {e1 e
6e30: 32 7d 20 7b 20 63 6e 61 6d 65 20 22 33 34 2b 32  2} { cname "34+2
6e40: 32 22 20 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70  2" } {.      lap
6e50: 70 65 6e 64 20 65 6c 69 73 74 20 5b 73 74 72 69  pend elist [stri
6e60: 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 45 58 50  ng map [list EXP
6e70: 52 31 20 24 65 31 20 45 58 50 52 32 20 24 65 32  R1 $e1 EXPR2 $e2
6e80: 5d 20 24 65 78 70 72 5d 0a 20 20 20 20 7d 0a 20  ] $expr].    }. 
6e90: 20 7d 20 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e   } .  if {[strin
6ea0: 67 20 6d 61 74 63 68 20 2a 45 58 50 52 2a 20 24  g match *EXPR* $
6eb0: 65 78 70 72 5d 7d 20 7b 0a 20 20 20 20 73 65 74  expr]} {.    set
6ec0: 20 65 6c 69 73 74 32 20 5b 6c 69 73 74 5d 0a 20   elist2 [list]. 
6ed0: 20 20 20 66 6f 72 65 61 63 68 20 65 6c 20 24 65     foreach el $e
6ee0: 6c 69 73 74 20 7b 0a 20 20 20 20 20 20 66 6f 72  list {.      for
6ef0: 65 61 63 68 20 65 20 7b 20 63 6e 61 6d 65 20 22  each e { cname "
6f00: 33 34 2b 32 32 22 20 7d 20 7b 0a 20 20 20 20 20  34+22" } {.     
6f10: 20 20 20 6c 61 70 70 65 6e 64 20 65 6c 69 73 74     lappend elist
6f20: 32 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c  2 [string map [l
6f30: 69 73 74 20 45 58 50 52 20 24 65 5d 20 24 65 6c  ist EXPR $e] $el
6f40: 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ].      }.    }.
6f50: 20 20 20 20 73 65 74 20 65 6c 69 73 74 20 24 65      set elist $e
6f60: 6c 69 73 74 32 0a 20 20 7d 0a 0a 20 20 73 65 74  list2.  }..  set
6f70: 20 78 20 30 0a 20 20 66 6f 72 65 61 63 68 20 65   x 0.  foreach e
6f80: 20 24 65 6c 69 73 74 20 7b 0a 20 20 20 20 69 6e   $elist {.    in
6f90: 63 72 20 78 0a 20 20 20 20 64 6f 5f 74 65 73 74  cr x.    do_test
6fa0: 20 65 5f 65 78 70 72 2d 31 32 2e 33 2e 24 74 6e   e_expr-12.3.$tn
6fb0: 2e 24 78 20 7b 20 0a 20 20 20 20 20 20 73 65 74  .$x { .      set
6fc0: 20 72 63 20 5b 63 61 74 63 68 20 7b 20 65 78 65   rc [catch { exe
6fd0: 63 73 71 6c 20 22 53 45 4c 45 43 54 20 24 65 20  csql "SELECT $e 
6fe0: 46 52 4f 4d 20 74 62 6c 6e 61 6d 65 22 20 7d 20  FROM tblname" } 
6ff0: 6d 73 67 5d 0a 20 20 20 20 7d 20 7b 30 7d 0a 20  msg].    } {0}. 
7000: 20 7d 0a 7d 0a 0a 23 20 2d 2d 20 73 79 6e 74 61   }.}..# -- synta
7010: 78 20 64 69 61 67 72 61 6d 20 72 61 69 73 65 2d  x diagram raise-
7020: 66 75 6e 63 74 69 6f 6e 0a 23 0a 66 6f 72 65 61  function.#.forea
7030: 63 68 20 7b 74 6e 20 72 61 69 73 65 65 78 70 72  ch {tn raiseexpr
7040: 7d 20 7b 0a 20 20 31 20 22 52 41 49 53 45 28 49  } {.  1 "RAISE(I
7050: 47 4e 4f 52 45 29 22 0a 20 20 32 20 22 52 41 49  GNORE)".  2 "RAI
7060: 53 45 28 52 4f 4c 4c 42 41 43 4b 2c 20 27 65 72  SE(ROLLBACK, 'er
7070: 72 6f 72 20 6d 65 73 73 61 67 65 27 29 22 0a 20  ror message')". 
7080: 20 33 20 22 52 41 49 53 45 28 41 42 4f 52 54 2c   3 "RAISE(ABORT,
7090: 20 27 65 72 72 6f 72 20 6d 65 73 73 61 67 65 27   'error message'
70a0: 29 22 0a 20 20 34 20 22 52 41 49 53 45 28 46 41  )".  4 "RAISE(FA
70b0: 49 4c 2c 20 27 65 72 72 6f 72 20 6d 65 73 73 61  IL, 'error messa
70c0: 67 65 27 29 22 0a 7d 20 7b 0a 20 20 64 6f 5f 65  ge')".} {.  do_e
70d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
70e0: 70 72 2d 31 32 2e 34 2e 24 74 6e 20 22 0a 20 20  pr-12.4.$tn ".  
70f0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
7100: 20 64 62 6e 61 6d 65 2e 74 72 24 74 6e 20 42 45   dbname.tr$tn BE
7110: 46 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 74  FORE DELETE ON t
7120: 62 6c 6e 61 6d 65 20 42 45 47 49 4e 0a 20 20 20  blname BEGIN.   
7130: 20 20 20 53 45 4c 45 43 54 20 24 72 61 69 73 65     SELECT $raise
7140: 65 78 70 72 20 3b 0a 20 20 20 20 45 4e 44 3b 0a  expr ;.    END;.
7150: 20 20 22 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d    " {}.}..#-----
7160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20  ----.# Test the 
71b0: 73 74 61 74 65 6d 65 6e 74 73 20 72 65 6c 61 74  statements relat
71c0: 65 64 20 74 6f 20 74 68 65 20 42 45 54 57 45 45  ed to the BETWEE
71d0: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 23 20  N operator..#.# 
71e0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
71f0: 30 30 37 39 2d 35 34 35 30 33 20 54 68 65 20 42  0079-54503 The B
7200: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 20  ETWEEN operator 
7210: 69 73 20 6c 6f 67 69 63 61 6c 6c 79 0a 23 20 65  is logically.# e
7220: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 20 70  quivalent to a p
7230: 61 69 72 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  air of compariso
7240: 6e 73 2e 20 22 78 20 42 45 54 57 45 45 4e 20 79  ns. "x BETWEEN y
7250: 20 41 4e 44 20 7a 22 20 69 73 20 65 71 75 69 76   AND z" is equiv
7260: 61 6c 65 6e 74 0a 23 20 74 6f 20 22 78 3e 3d 79  alent.# to "x>=y
7270: 20 41 4e 44 20 78 3c 3d 7a 22 20 65 78 63 65 70   AND x<=z" excep
7280: 74 20 74 68 61 74 20 77 69 74 68 20 42 45 54 57  t that with BETW
7290: 45 45 4e 2c 20 74 68 65 20 78 20 65 78 70 72 65  EEN, the x expre
72a0: 73 73 69 6f 6e 20 69 73 0a 23 20 6f 6e 6c 79 20  ssion is.# only 
72b0: 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 2e 0a  evaluated once..
72c0: 23 0a 64 62 20 66 75 6e 63 20 78 20 78 0a 70 72  #.db func x x.pr
72d0: 6f 63 20 78 20 7b 7d 20 7b 20 69 6e 63 72 20 3a  oc x {} { incr :
72e0: 3a 78 63 6f 75 6e 74 20 3b 20 72 65 74 75 72 6e  :xcount ; return
72f0: 20 5b 65 78 70 72 20 24 3a 3a 78 5d 20 7d 0a 66   [expr $::x] }.f
7300: 6f 72 65 61 63 68 20 7b 74 6e 20 78 20 65 78 70  oreach {tn x exp
7310: 72 20 72 65 73 20 6e 45 76 61 6c 7d 20 7b 0a 20  r res nEval} {. 
7320: 20 31 20 20 31 30 20 20 22 78 28 29 20 3e 3d 20   1  10  "x() >= 
7330: 35 20 41 4e 44 20 78 28 29 20 3c 3d 20 31 35 22  5 AND x() <= 15"
7340: 20 20 31 20 20 32 0a 20 20 32 20 20 31 30 20 20    1  2.  2  10  
7350: 22 78 28 29 20 42 45 54 57 45 45 4e 20 35 20 41  "x() BETWEEN 5 A
7360: 4e 44 20 31 35 22 20 20 20 20 31 20 20 31 0a 0a  ND 15"    1  1..
7370: 20 20 33 20 20 20 35 20 20 22 78 28 29 20 3e 3d    3   5  "x() >=
7380: 20 35 20 41 4e 44 20 78 28 29 20 3c 3d 20 35 22   5 AND x() <= 5"
7390: 20 20 20 31 20 20 32 0a 20 20 34 20 20 20 35 20     1  2.  4   5 
73a0: 20 22 78 28 29 20 42 45 54 57 45 45 4e 20 35 20   "x() BETWEEN 5 
73b0: 41 4e 44 20 35 22 20 20 20 20 20 31 20 20 31 0a  AND 5"     1  1.
73c0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  } {.  do_test e_
73d0: 65 78 70 72 2d 31 33 2e 31 2e 24 74 6e 20 7b 0a  expr-13.1.$tn {.
73e0: 20 20 20 20 73 65 74 20 3a 3a 78 63 6f 75 6e 74      set ::xcount
73f0: 20 30 0a 20 20 20 20 73 65 74 20 61 20 5b 65 78   0.    set a [ex
7400: 65 63 73 71 6c 20 22 53 45 4c 45 43 54 20 24 65  ecsql "SELECT $e
7410: 78 70 72 22 5d 0a 20 20 20 20 6c 69 73 74 20 24  xpr"].    list $
7420: 3a 3a 78 63 6f 75 6e 74 20 24 61 0a 20 20 7d 20  ::xcount $a.  } 
7430: 5b 6c 69 73 74 20 24 6e 45 76 61 6c 20 24 72 65  [list $nEval $re
7440: 73 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  s].}..# EVIDENCE
7450: 2d 4f 46 3a 20 52 2d 30 35 31 35 35 2d 33 34 34  -OF: R-05155-344
7460: 35 34 20 54 68 65 20 70 72 65 63 65 64 65 6e 63  54 The precedenc
7470: 65 20 6f 66 20 74 68 65 20 42 45 54 57 45 45 4e  e of the BETWEEN
7480: 20 6f 70 65 72 61 74 6f 72 20 69 73 0a 23 20 74   operator is.# t
7490: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
74a0: 72 65 63 65 64 65 6e 63 65 20 61 73 20 6f 70 65  recedence as ope
74b0: 72 61 74 6f 72 73 20 3d 3d 20 61 6e 64 20 21 3d  rators == and !=
74c0: 20 61 6e 64 20 4c 49 4b 45 20 61 6e 64 20 67 72   and LIKE and gr
74d0: 6f 75 70 73 0a 23 20 6c 65 66 74 20 74 6f 20 72  oups.# left to r
74e0: 69 67 68 74 2e 0a 23 20 0a 23 20 54 68 65 72 65  ight..# .# There
74f0: 66 6f 72 65 2c 20 42 45 54 57 45 45 4e 20 67 72  fore, BETWEEN gr
7500: 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74 6c  oups more tightl
7510: 79 20 74 68 61 6e 20 6f 70 65 72 61 74 6f 72 20  y than operator 
7520: 22 41 4e 44 22 2c 20 62 75 74 20 6c 65 73 73 0a  "AND", but less.
7530: 23 20 73 6f 20 74 68 61 6e 20 22 3c 22 2e 0a 23  # so than "<"..#
7540: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7550: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 20 20   e_expr-13.2.1  
7560: 7b 20 53 45 4c 45 43 54 20 31 20 3d 3d 20 31 30  { SELECT 1 == 10
7570: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
7580: 20 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73     }  1.do_execs
7590: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
75a0: 33 2e 32 2e 32 20 20 7b 20 53 45 4c 45 43 54 20  3.2.2  { SELECT 
75b0: 28 31 20 3d 3d 20 31 30 29 20 42 45 54 57 45 45  (1 == 10) BETWEE
75c0: 4e 20 30 20 41 4e 44 20 32 20 7d 20 20 31 0a 64  N 0 AND 2 }  1.d
75d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
75e0: 5f 65 78 70 72 2d 31 33 2e 32 2e 33 20 20 7b 20  _expr-13.2.3  { 
75f0: 53 45 4c 45 43 54 20 31 20 3d 3d 20 28 31 30 20  SELECT 1 == (10 
7600: 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32 29  BETWEEN 0 AND 2)
7610: 20 7d 20 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c   }  0.do_execsql
7620: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7630: 32 2e 34 20 20 7b 20 53 45 4c 45 43 54 20 20 36  2.4  { SELECT  6
7640: 20 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20 38   BETWEEN 4 AND 8
7650: 20 3d 3d 20 31 20 7d 20 20 20 20 31 0a 64 6f 5f   == 1 }    1.do_
7660: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7670: 78 70 72 2d 31 33 2e 32 2e 35 20 20 7b 20 53 45  xpr-13.2.5  { SE
7680: 4c 45 43 54 20 28 36 20 42 45 54 57 45 45 4e 20  LECT (6 BETWEEN 
7690: 34 20 41 4e 44 20 38 29 20 3d 3d 20 31 20 7d 20  4 AND 8) == 1 } 
76a0: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
76b0: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
76c0: 36 20 20 7b 20 53 45 4c 45 43 54 20 20 36 20 42  6  { SELECT  6 B
76d0: 45 54 57 45 45 4e 20 34 20 41 4e 44 20 28 38 20  ETWEEN 4 AND (8 
76e0: 3d 3d 20 31 29 20 7d 20 20 30 0a 0a 64 6f 5f 65  == 1) }  0..do_e
76f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7700: 70 72 2d 31 33 2e 32 2e 37 20 20 7b 20 53 45 4c  pr-13.2.7  { SEL
7710: 45 43 54 20 20 35 20 42 45 54 57 45 45 4e 20 30  ECT  5 BETWEEN 0
7720: 20 41 4e 44 20 30 20 20 21 3d 20 31 20 7d 20 20   AND 0  != 1 }  
7730: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
7740: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 38  st e_expr-13.2.8
7750: 20 20 7b 20 53 45 4c 45 43 54 20 28 35 20 42 45    { SELECT (5 BE
7760: 54 57 45 45 4e 20 30 20 41 4e 44 20 30 29 20 21  TWEEN 0 AND 0) !
7770: 3d 20 31 20 7d 20 20 20 31 0a 64 6f 5f 65 78 65  = 1 }   1.do_exe
7780: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7790: 2d 31 33 2e 32 2e 39 20 20 7b 20 53 45 4c 45 43  -13.2.9  { SELEC
77a0: 54 20 20 35 20 42 45 54 57 45 45 4e 20 30 20 41  T  5 BETWEEN 0 A
77b0: 4e 44 20 28 30 20 21 3d 20 31 29 20 7d 20 20 30  ND (0 != 1) }  0
77c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
77d0: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 30 20   e_expr-13.2.10 
77e0: 7b 20 53 45 4c 45 43 54 20 20 31 20 21 3d 20 30  { SELECT  1 != 0
77f0: 20 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20    BETWEEN 0 AND 
7800: 32 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73  2  }  1.do_execs
7810: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7820: 33 2e 32 2e 31 31 20 7b 20 53 45 4c 45 43 54 20  3.2.11 { SELECT 
7830: 28 31 20 21 3d 20 30 29 20 42 45 54 57 45 45 4e  (1 != 0) BETWEEN
7840: 20 30 20 41 4e 44 20 32 20 20 7d 20 20 31 0a 64   0 AND 2  }  1.d
7850: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7860: 5f 65 78 70 72 2d 31 33 2e 32 2e 31 32 20 7b 20  _expr-13.2.12 { 
7870: 53 45 4c 45 43 54 20 20 31 20 21 3d 20 28 30 20  SELECT  1 != (0 
7880: 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32 29  BETWEEN 0 AND 2)
7890: 20 7d 20 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71   }  0..do_execsq
78a0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
78b0: 2e 32 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 31  .2.13 { SELECT 1
78c0: 20 4c 49 4b 45 20 31 30 20 42 45 54 57 45 45 4e   LIKE 10 BETWEEN
78d0: 20 30 20 41 4e 44 20 32 20 20 20 7d 20 20 31 0a   0 AND 2   }  1.
78e0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
78f0: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 34 20 7b  e_expr-13.2.14 {
7900: 20 53 45 4c 45 43 54 20 28 31 20 4c 49 4b 45 20   SELECT (1 LIKE 
7910: 31 30 29 20 42 45 54 57 45 45 4e 20 30 20 41 4e  10) BETWEEN 0 AN
7920: 44 20 32 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63  D 2 }  1.do_exec
7930: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
7940: 31 33 2e 32 2e 31 35 20 7b 20 53 45 4c 45 43 54  13.2.15 { SELECT
7950: 20 31 20 4c 49 4b 45 20 28 31 30 20 42 45 54 57   1 LIKE (10 BETW
7960: 45 45 4e 20 30 20 41 4e 44 20 32 29 20 7d 20 20  EEN 0 AND 2) }  
7970: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
7980: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 36  t e_expr-13.2.16
7990: 20 7b 20 53 45 4c 45 43 54 20 20 36 20 42 45 54   { SELECT  6 BET
79a0: 57 45 45 4e 20 34 20 41 4e 44 20 38 20 4c 49 4b  WEEN 4 AND 8 LIK
79b0: 45 20 31 20 20 20 7d 20 20 31 0a 64 6f 5f 65 78  E 1   }  1.do_ex
79c0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
79d0: 72 2d 31 33 2e 32 2e 31 37 20 7b 20 53 45 4c 45  r-13.2.17 { SELE
79e0: 43 54 20 28 36 20 42 45 54 57 45 45 4e 20 34 20  CT (6 BETWEEN 4 
79f0: 41 4e 44 20 38 29 20 4c 49 4b 45 20 31 20 20 7d  AND 8) LIKE 1  }
7a00: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
7a10: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
7a20: 31 38 20 7b 20 53 45 4c 45 43 54 20 20 36 20 42  18 { SELECT  6 B
7a30: 45 54 57 45 45 4e 20 34 20 41 4e 44 20 28 38 20  ETWEEN 4 AND (8 
7a40: 4c 49 4b 45 20 31 29 20 7d 20 20 30 0a 0a 64 6f  LIKE 1) }  0..do
7a50: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7a60: 65 78 70 72 2d 31 33 2e 32 2e 31 39 20 7b 20 53  expr-13.2.19 { S
7a70: 45 4c 45 43 54 20 30 20 41 4e 44 20 30 20 42 45  ELECT 0 AND 0 BE
7a80: 54 57 45 45 4e 20 30 20 41 4e 44 20 31 20 20 20  TWEEN 0 AND 1   
7a90: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
7aa0: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
7ab0: 32 30 20 7b 20 53 45 4c 45 43 54 20 30 20 41 4e  20 { SELECT 0 AN
7ac0: 44 20 28 30 20 42 45 54 57 45 45 4e 20 30 20 41  D (0 BETWEEN 0 A
7ad0: 4e 44 20 31 29 20 7d 20 30 0a 64 6f 5f 65 78 65  ND 1) } 0.do_exe
7ae0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7af0: 2d 31 33 2e 32 2e 32 31 20 7b 20 53 45 4c 45 43  -13.2.21 { SELEC
7b00: 54 20 28 30 20 41 4e 44 20 30 29 20 42 45 54 57  T (0 AND 0) BETW
7b10: 45 45 4e 20 30 20 41 4e 44 20 31 20 7d 20 31 0a  EEN 0 AND 1 } 1.
7b20: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7b30: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 32 20 7b  e_expr-13.2.22 {
7b40: 20 53 45 4c 45 43 54 20 30 20 42 45 54 57 45 45   SELECT 0 BETWEE
7b50: 4e 20 2d 31 20 41 4e 44 20 31 20 41 4e 44 20 30  N -1 AND 1 AND 0
7b60: 20 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71     } 0.do_execsq
7b70: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7b80: 2e 32 2e 32 33 20 7b 20 53 45 4c 45 43 54 20 28  .2.23 { SELECT (
7b90: 30 20 42 45 54 57 45 45 4e 20 2d 31 20 41 4e 44  0 BETWEEN -1 AND
7ba0: 20 31 29 20 41 4e 44 20 30 20 7d 20 30 0a 64 6f   1) AND 0 } 0.do
7bb0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7bc0: 65 78 70 72 2d 31 33 2e 32 2e 32 34 20 7b 20 53  expr-13.2.24 { S
7bd0: 45 4c 45 43 54 20 30 20 42 45 54 57 45 45 4e 20  ELECT 0 BETWEEN 
7be0: 2d 31 20 41 4e 44 20 28 31 20 41 4e 44 20 30 29  -1 AND (1 AND 0)
7bf0: 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   } 1..do_execsql
7c00: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7c10: 32 2e 32 35 20 7b 20 53 45 4c 45 43 54 20 32 20  2.25 { SELECT 2 
7c20: 3c 20 33 20 42 45 54 57 45 45 4e 20 30 20 41 4e  < 3 BETWEEN 0 AN
7c30: 44 20 31 20 20 20 7d 20 31 0a 64 6f 5f 65 78 65  D 1   } 1.do_exe
7c40: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7c50: 2d 31 33 2e 32 2e 32 36 20 7b 20 53 45 4c 45 43  -13.2.26 { SELEC
7c60: 54 20 28 32 20 3c 20 33 29 20 42 45 54 57 45 45  T (2 < 3) BETWEE
7c70: 4e 20 30 20 41 4e 44 20 31 20 7d 20 31 0a 64 6f  N 0 AND 1 } 1.do
7c80: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7c90: 65 78 70 72 2d 31 33 2e 32 2e 32 37 20 7b 20 53  expr-13.2.27 { S
7ca0: 45 4c 45 43 54 20 32 20 3c 20 28 33 20 42 45 54  ELECT 2 < (3 BET
7cb0: 57 45 45 4e 20 30 20 41 4e 44 20 31 29 20 7d 20  WEEN 0 AND 1) } 
7cc0: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
7cd0: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 38  t e_expr-13.2.28
7ce0: 20 7b 20 53 45 4c 45 43 54 20 32 20 42 45 54 57   { SELECT 2 BETW
7cf0: 45 45 4e 20 31 20 41 4e 44 20 32 20 3c 20 33 20  EEN 1 AND 2 < 3 
7d00: 20 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71     } 0.do_execsq
7d10: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7d20: 2e 32 2e 32 39 20 7b 20 53 45 4c 45 43 54 20 32  .2.29 { SELECT 2
7d30: 20 42 45 54 57 45 45 4e 20 31 20 41 4e 44 20 28   BETWEEN 1 AND (
7d40: 32 20 3c 20 33 29 20 20 7d 20 30 0a 64 6f 5f 65  2 < 3)  } 0.do_e
7d50: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7d60: 70 72 2d 31 33 2e 32 2e 33 30 20 7b 20 53 45 4c  pr-13.2.30 { SEL
7d70: 45 43 54 20 28 32 20 42 45 54 57 45 45 4e 20 31  ECT (2 BETWEEN 1
7d80: 20 41 4e 44 20 32 29 20 3c 20 33 20 20 7d 20 31   AND 2) < 3  } 1
7d90: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
7de0: 65 73 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  est the statemen
7df0: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68  ts related to th
7e00: 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20  e LIKE and GLOB 
7e10: 6f 70 65 72 61 74 6f 72 73 2e 0a 23 0a 23 20 45  operators..#.# E
7e20: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36  VIDENCE-OF: R-16
7e30: 35 38 34 2d 36 30 31 38 39 20 54 68 65 20 4c 49  584-60189 The LI
7e40: 4b 45 20 6f 70 65 72 61 74 6f 72 20 64 6f 65 73  KE operator does
7e50: 20 61 20 70 61 74 74 65 72 6e 20 6d 61 74 63 68   a pattern match
7e60: 69 6e 67 0a 23 20 63 6f 6d 70 61 72 69 73 6f 6e  ing.# comparison
7e70: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
7e80: 46 3a 20 52 2d 31 31 32 39 35 2d 30 34 36 35 37  F: R-11295-04657
7e90: 20 54 68 65 20 6f 70 65 72 61 6e 64 20 74 6f 20   The operand to 
7ea0: 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
7eb0: 20 4c 49 4b 45 0a 23 20 6f 70 65 72 61 74 6f 72   LIKE.# operator
7ec0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 61   contains the pa
7ed0: 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20 6c 65  ttern and the le
7ee0: 66 74 20 68 61 6e 64 20 6f 70 65 72 61 6e 64 20  ft hand operand 
7ef0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 23 20 73  contains the.# s
7f00: 74 72 69 6e 67 20 74 6f 20 6d 61 74 63 68 20 61  tring to match a
7f10: 67 61 69 6e 73 74 20 74 68 65 20 70 61 74 74 65  gainst the patte
7f20: 72 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  rn..#.do_execsql
7f30: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
7f40: 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.1 { SELECT 'ab
7f50: 63 25 27 20 4c 49 4b 45 20 27 61 62 63 64 65 27  c%' LIKE 'abcde'
7f60: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
7f70: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 31  test e_expr-14.1
7f80: 2e 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .2 { SELECT 'abc
7f90: 64 65 27 20 4c 49 4b 45 20 27 61 62 63 25 27 20  de' LIKE 'abc%' 
7fa0: 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  } 1..# EVIDENCE-
7fb0: 4f 46 3a 20 52 2d 35 35 34 30 36 2d 33 38 35 32  OF: R-55406-3852
7fc0: 34 20 41 20 70 65 72 63 65 6e 74 20 73 79 6d 62  4 A percent symb
7fd0: 6f 6c 20 28 22 25 22 29 20 69 6e 20 74 68 65 20  ol ("%") in the 
7fe0: 4c 49 4b 45 20 70 61 74 74 65 72 6e 0a 23 20 6d  LIKE pattern.# m
7ff0: 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
8000: 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  nce of zero or m
8010: 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 20 69  ore characters i
8020: 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 23 0a  n the string..#.
8030: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8040: 65 5f 65 78 70 72 2d 31 34 2e 32 2e 31 20 7b 20  e_expr-14.2.1 { 
8050: 53 45 4c 45 43 54 20 27 61 62 64 65 27 20 20 20  SELECT 'abde'   
8060: 20 4c 49 4b 45 20 27 61 62 25 64 65 27 20 7d 20   LIKE 'ab%de' } 
8070: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
8080: 74 20 65 5f 65 78 70 72 2d 31 34 2e 32 2e 32 20  t e_expr-14.2.2 
8090: 7b 20 53 45 4c 45 43 54 20 27 61 62 58 64 65 27  { SELECT 'abXde'
80a0: 20 20 20 4c 49 4b 45 20 27 61 62 25 64 65 27 20     LIKE 'ab%de' 
80b0: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
80c0: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 32 2e  est e_expr-14.2.
80d0: 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62 41 42  3 { SELECT 'abAB
80e0: 43 64 65 27 20 4c 49 4b 45 20 27 61 62 25 64 65  Cde' LIKE 'ab%de
80f0: 27 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43  ' } 1..# EVIDENC
8100: 45 2d 4f 46 3a 20 52 2d 33 30 34 33 33 2d 32 35  E-OF: R-30433-25
8110: 34 34 33 20 41 6e 20 75 6e 64 65 72 73 63 6f 72  443 An underscor
8120: 65 20 28 22 5f 22 29 20 69 6e 20 74 68 65 20 4c  e ("_") in the L
8130: 49 4b 45 20 70 61 74 74 65 72 6e 0a 23 20 6d 61  IKE pattern.# ma
8140: 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65  tches any single
8150: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
8160: 65 20 73 74 72 69 6e 67 2e 0a 23 0a 64 6f 5f 65  e string..#.do_e
8170: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8180: 70 72 2d 31 34 2e 33 2e 31 20 7b 20 53 45 4c 45  pr-14.3.1 { SELE
8190: 43 54 20 27 61 62 64 65 27 20 20 20 20 4c 49 4b  CT 'abde'    LIK
81a0: 45 20 27 61 62 5f 64 65 27 20 7d 20 30 0a 64 6f  E 'ab_de' } 0.do
81b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
81c0: 65 78 70 72 2d 31 34 2e 33 2e 32 20 7b 20 53 45  expr-14.3.2 { SE
81d0: 4c 45 43 54 20 27 61 62 58 64 65 27 20 20 20 4c  LECT 'abXde'   L
81e0: 49 4b 45 20 27 61 62 5f 64 65 27 20 7d 20 31 0a  IKE 'ab_de' } 1.
81f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8200: 65 5f 65 78 70 72 2d 31 34 2e 33 2e 33 20 7b 20  e_expr-14.3.3 { 
8210: 53 45 4c 45 43 54 20 27 61 62 41 42 43 64 65 27  SELECT 'abABCde'
8220: 20 4c 49 4b 45 20 27 61 62 5f 64 65 27 20 7d 20   LIKE 'ab_de' } 
8230: 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  0..# EVIDENCE-OF
8240: 3a 20 52 2d 35 39 30 30 37 2d 32 30 34 35 34 20  : R-59007-20454 
8250: 41 6e 79 20 6f 74 68 65 72 20 63 68 61 72 61 63  Any other charac
8260: 74 65 72 20 6d 61 74 63 68 65 73 20 69 74 73 65  ter matches itse
8270: 6c 66 20 6f 72 20 69 74 73 0a 23 20 6c 6f 77 65  lf or its.# lowe
8280: 72 2f 75 70 70 65 72 20 63 61 73 65 20 65 71 75  r/upper case equ
8290: 69 76 61 6c 65 6e 74 20 28 69 2e 65 2e 20 63 61  ivalent (i.e. ca
82a0: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d  se-insensitive m
82b0: 61 74 63 68 69 6e 67 29 2e 0a 23 0a 64 6f 5f 65  atching)..#.do_e
82c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
82d0: 70 72 2d 31 34 2e 34 2e 31 20 7b 20 53 45 4c 45  pr-14.4.1 { SELE
82e0: 43 54 20 27 61 62 63 27 20 4c 49 4b 45 20 27 61  CT 'abc' LIKE 'a
82f0: 42 63 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73  Bc' } 1.do_execs
8300: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8310: 34 2e 34 2e 32 20 7b 20 53 45 4c 45 43 54 20 27  4.4.2 { SELECT '
8320: 61 42 63 27 20 4c 49 4b 45 20 27 61 42 63 27 20  aBc' LIKE 'aBc' 
8330: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
8340: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 34 2e  est e_expr-14.4.
8350: 33 20 7b 20 53 45 4c 45 43 54 20 27 61 63 27 20  3 { SELECT 'ac' 
8360: 20 4c 49 4b 45 20 27 61 42 63 27 20 7d 20 30 0a   LIKE 'aBc' } 0.
8370: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
8380: 52 2d 32 33 36 34 38 2d 35 38 35 32 37 20 53 51  R-23648-58527 SQ
8390: 4c 69 74 65 20 6f 6e 6c 79 20 75 6e 64 65 72 73  Lite only unders
83a0: 74 61 6e 64 73 20 75 70 70 65 72 2f 6c 6f 77 65  tands upper/lowe
83b0: 72 20 63 61 73 65 0a 23 20 66 6f 72 20 41 53 43  r case.# for ASC
83c0: 49 49 20 63 68 61 72 61 63 74 65 72 73 20 62 79  II characters by
83d0: 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45 56   default..#.# EV
83e0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 35  IDENCE-OF: R-045
83f0: 33 32 2d 31 31 35 32 37 20 54 68 65 20 4c 49 4b  32-11527 The LIK
8400: 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63 61  E operator is ca
8410: 73 65 20 73 65 6e 73 69 74 69 76 65 20 62 79 0a  se sensitive by.
8420: 23 20 64 65 66 61 75 6c 74 20 66 6f 72 20 75 6e  # default for un
8430: 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73  icode characters
8440: 20 74 68 61 74 20 61 72 65 20 62 65 79 6f 6e 64   that are beyond
8450: 20 74 68 65 20 41 53 43 49 49 20 72 61 6e 67 65   the ASCII range
8460: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
8470: 46 3a 20 52 2d 34 34 33 38 31 2d 31 31 36 36 39  F: R-44381-11669
8480: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
8490: 23 20 27 61 27 26 6e 62 73 70 3b 4c 49 4b 45 26  # 'a'&nbsp;LIKE&
84a0: 6e 62 73 70 3b 27 41 27 20 69 73 20 54 52 55 45  nbsp;'A' is TRUE
84b0: 20 62 75 74 0a 23 20 27 26 61 65 6c 69 67 3b 27   but.# '&aelig;'
84c0: 26 6e 62 73 70 3b 4c 49 4b 45 26 6e 62 73 70 3b  &nbsp;LIKE&nbsp;
84d0: 27 26 41 45 6c 69 67 3b 27 20 69 73 20 46 41 4c  '&AElig;' is FAL
84e0: 53 45 2e 0a 23 0a 23 20 20 20 54 68 65 20 72 65  SE..#.#   The re
84f0: 73 74 72 69 63 74 69 6f 6e 20 74 6f 20 41 53 43  striction to ASC
8500: 49 49 20 63 68 61 72 61 63 74 65 72 73 20 64 6f  II characters do
8510: 65 73 20 6e 6f 74 20 61 70 70 6c 79 20 69 66 20  es not apply if 
8520: 74 68 65 20 49 43 55 0a 23 20 20 20 6c 69 62 72  the ICU.#   libr
8530: 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ary is compiled 
8540: 69 6e 2e 20 57 68 65 6e 20 49 43 55 20 69 73 20  in. When ICU is 
8550: 65 6e 61 62 6c 65 64 20 53 51 4c 69 74 65 20 64  enabled SQLite d
8560: 6f 65 73 20 6e 6f 74 20 61 63 74 0a 23 20 20 20  oes not act.#   
8570: 61 73 20 69 74 20 64 6f 65 73 20 22 62 79 20 64  as it does "by d
8580: 65 66 61 75 6c 74 22 2e 0a 23 0a 64 6f 5f 65 78  efault"..#.do_ex
8590: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
85a0: 72 2d 31 34 2e 35 2e 31 20 7b 20 53 45 4c 45 43  r-14.5.1 { SELEC
85b0: 54 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20 20  T 'A' LIKE 'a'  
85c0: 20 20 20 20 20 20 20 7d 20 31 0a 69 66 63 61 70         } 1.ifcap
85d0: 61 62 6c 65 20 21 69 63 75 20 7b 0a 20 20 64 6f  able !icu {.  do
85e0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
85f0: 65 78 70 72 2d 31 34 2e 35 2e 32 20 22 53 45 4c  expr-14.5.2 "SEL
8600: 45 43 54 20 27 5c 75 30 30 63 36 27 20 4c 49 4b  ECT '\u00c6' LIK
8610: 45 20 27 5c 75 30 30 65 36 27 22 20 30 0a 7d 0a  E '\u00e6'" 0.}.
8620: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
8630: 52 2d 35 36 36 38 33 2d 31 33 37 33 31 20 49 66  R-56683-13731 If
8640: 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 45 53   the optional ES
8650: 43 41 50 45 20 63 6c 61 75 73 65 20 69 73 20 70  CAPE clause is p
8660: 72 65 73 65 6e 74 2c 0a 23 20 74 68 65 6e 20 74  resent,.# then t
8670: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f  he expression fo
8680: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 45 53 43 41  llowing the ESCA
8690: 50 45 20 6b 65 79 77 6f 72 64 20 6d 75 73 74 20  PE keyword must 
86a0: 65 76 61 6c 75 61 74 65 20 74 6f 20 61 0a 23 20  evaluate to a.# 
86b0: 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69 6e  string consistin
86c0: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 68  g of a single ch
86d0: 61 72 61 63 74 65 72 2e 0a 23 0a 64 6f 5f 63 61  aracter..#.do_ca
86e0: 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  tchsql_test e_ex
86f0: 70 72 2d 31 34 2e 36 2e 31 20 7b 20 0a 20 20 53  pr-14.6.1 { .  S
8700: 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20 27  ELECT 'A' LIKE '
8710: 61 27 20 45 53 43 41 50 45 20 27 31 32 27 20 0a  a' ESCAPE '12' .
8720: 7d 20 7b 31 20 7b 45 53 43 41 50 45 20 65 78 70  } {1 {ESCAPE exp
8730: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
8740: 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74  a single charact
8750: 65 72 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  er}}.do_catchsql
8760: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
8770: 36 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  6.2 { .  SELECT 
8780: 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53 43  'A' LIKE 'a' ESC
8790: 41 50 45 20 27 27 20 0a 7d 20 7b 31 20 7b 45 53  APE '' .} {1 {ES
87a0: 43 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20  CAPE expression 
87b0: 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65  must be a single
87c0: 20 63 68 61 72 61 63 74 65 72 7d 7d 0a 64 6f 5f   character}}.do_
87d0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f  catchsql_test e_
87e0: 65 78 70 72 2d 31 34 2e 36 2e 33 20 7b 20 53 45  expr-14.6.3 { SE
87f0: 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20 27 61  LECT 'A' LIKE 'a
8800: 27 20 45 53 43 41 50 45 20 27 78 27 20 7d 20 20  ' ESCAPE 'x' }  
8810: 20 20 7b 30 20 31 7d 0a 64 6f 5f 63 61 74 63 68    {0 1}.do_catch
8820: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
8830: 31 34 2e 36 2e 34 20 22 53 45 4c 45 43 54 20 27  14.6.4 "SELECT '
8840: 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53 43 41  A' LIKE 'a' ESCA
8850: 50 45 20 27 5c 75 30 30 65 36 27 22 20 7b 30 20  PE '\u00e6'" {0 
8860: 31 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  1}..# EVIDENCE-O
8870: 46 3a 20 52 2d 30 32 30 34 35 2d 32 33 37 36 32  F: R-02045-23762
8880: 20 54 68 69 73 20 63 68 61 72 61 63 74 65 72 20   This character 
8890: 6d 61 79 20 62 65 20 75 73 65 64 20 69 6e 20 74  may be used in t
88a0: 68 65 20 4c 49 4b 45 0a 23 20 70 61 74 74 65 72  he LIKE.# patter
88b0: 6e 20 74 6f 20 69 6e 63 6c 75 64 65 20 6c 69 74  n to include lit
88c0: 65 72 61 6c 20 70 65 72 63 65 6e 74 20 6f 72 20  eral percent or 
88d0: 75 6e 64 65 72 73 63 6f 72 65 20 63 68 61 72 61  underscore chara
88e0: 63 74 65 72 73 2e 0a 23 0a 23 20 45 56 49 44 45  cters..#.# EVIDE
88f0: 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 33 34 35 2d  NCE-OF: R-13345-
8900: 33 31 38 33 30 20 54 68 65 20 65 73 63 61 70 65  31830 The escape
8910: 20 63 68 61 72 61 63 74 65 72 20 66 6f 6c 6c 6f   character follo
8920: 77 65 64 20 62 79 20 61 20 70 65 72 63 65 6e 74  wed by a percent
8930: 0a 23 20 73 79 6d 62 6f 6c 20 28 25 29 2c 20 75  .# symbol (%), u
8940: 6e 64 65 72 73 63 6f 72 65 20 28 5f 29 2c 20 6f  nderscore (_), o
8950: 72 20 61 20 73 65 63 6f 6e 64 20 69 6e 73 74 61  r a second insta
8960: 6e 63 65 20 6f 66 20 74 68 65 20 65 73 63 61 70  nce of the escap
8970: 65 0a 23 20 63 68 61 72 61 63 74 65 72 20 69 74  e.# character it
8980: 73 65 6c 66 20 6d 61 74 63 68 65 73 20 61 20 6c  self matches a l
8990: 69 74 65 72 61 6c 20 70 65 72 63 65 6e 74 20 73  iteral percent s
89a0: 79 6d 62 6f 6c 2c 20 75 6e 64 65 72 73 63 6f 72  ymbol, underscor
89b0: 65 2c 20 6f 72 20 61 0a 23 20 73 69 6e 67 6c 65  e, or a.# single
89c0: 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65   escape characte
89d0: 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  r, respectively.
89e0: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
89f0: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31  st e_expr-14.7.1
8a00: 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 25    { SELECT 'abc%
8a10: 27 20 20 4c 49 4b 45 20 27 61 62 63 58 25 27 20  '  LIKE 'abcX%' 
8a20: 45 53 43 41 50 45 20 27 58 27 20 7d 20 31 0a 64  ESCAPE 'X' } 1.d
8a30: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8a40: 5f 65 78 70 72 2d 31 34 2e 37 2e 32 20 20 7b 20  _expr-14.7.2  { 
8a50: 53 45 4c 45 43 54 20 27 61 62 63 35 27 20 20 4c  SELECT 'abc5'  L
8a60: 49 4b 45 20 27 61 62 63 58 25 27 20 45 53 43 41  IKE 'abcX%' ESCA
8a70: 50 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78  PE 'X' } 0.do_ex
8a80: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
8a90: 72 2d 31 34 2e 37 2e 33 20 20 7b 20 53 45 4c 45  r-14.7.3  { SELE
8aa0: 43 54 20 27 61 62 63 27 20 20 20 4c 49 4b 45 20  CT 'abc'   LIKE 
8ab0: 27 61 62 63 58 25 27 20 45 53 43 41 50 45 20 27  'abcX%' ESCAPE '
8ac0: 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71  X' } 0.do_execsq
8ad0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
8ae0: 2e 37 2e 34 20 20 7b 20 53 45 4c 45 43 54 20 27  .7.4  { SELECT '
8af0: 61 62 63 58 25 27 20 4c 49 4b 45 20 27 61 62 63  abcX%' LIKE 'abc
8b00: 58 25 27 20 45 53 43 41 50 45 20 27 58 27 20 7d  X%' ESCAPE 'X' }
8b10: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
8b20: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 35  st e_expr-14.7.5
8b30: 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 25    { SELECT 'abc%
8b40: 25 27 20 4c 49 4b 45 20 27 61 62 63 58 25 27 20  %' LIKE 'abcX%' 
8b50: 45 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a  ESCAPE 'X' } 0..
8b60: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8b70: 65 5f 65 78 70 72 2d 31 34 2e 37 2e 36 20 20 7b  e_expr-14.7.6  {
8b80: 20 53 45 4c 45 43 54 20 27 61 62 63 5f 27 20 20   SELECT 'abc_'  
8b90: 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53 43  LIKE 'abcX_' ESC
8ba0: 41 50 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f 65  APE 'X' } 1.do_e
8bb0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8bc0: 70 72 2d 31 34 2e 37 2e 37 20 20 7b 20 53 45 4c  pr-14.7.7  { SEL
8bd0: 45 43 54 20 27 61 62 63 35 27 20 20 4c 49 4b 45  ECT 'abc5'  LIKE
8be0: 20 27 61 62 63 58 5f 27 20 45 53 43 41 50 45 20   'abcX_' ESCAPE 
8bf0: 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  'X' } 0.do_execs
8c00: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8c10: 34 2e 37 2e 38 20 20 7b 20 53 45 4c 45 43 54 20  4.7.8  { SELECT 
8c20: 27 61 62 63 27 20 20 20 4c 49 4b 45 20 27 61 62  'abc'   LIKE 'ab
8c30: 63 58 5f 27 20 45 53 43 41 50 45 20 27 58 27 20  cX_' ESCAPE 'X' 
8c40: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
8c50: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e  est e_expr-14.7.
8c60: 39 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  9  { SELECT 'abc
8c70: 58 5f 27 20 4c 49 4b 45 20 27 61 62 63 58 5f 27  X_' LIKE 'abcX_'
8c80: 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a   ESCAPE 'X' } 0.
8c90: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8ca0: 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 30 20 7b  e_expr-14.7.10 {
8cb0: 20 53 45 4c 45 43 54 20 27 61 62 63 5f 5f 27 20   SELECT 'abc__' 
8cc0: 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53 43  LIKE 'abcX_' ESC
8cd0: 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 64 6f 5f  APE 'X' } 0..do_
8ce0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8cf0: 78 70 72 2d 31 34 2e 37 2e 31 31 20 7b 20 53 45  xpr-14.7.11 { SE
8d00: 4c 45 43 54 20 27 61 62 63 58 27 20 20 4c 49 4b  LECT 'abcX'  LIK
8d10: 45 20 27 61 62 63 58 58 27 20 45 53 43 41 50 45  E 'abcXX' ESCAPE
8d20: 20 27 58 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63   'X' } 1.do_exec
8d30: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
8d40: 31 34 2e 37 2e 31 32 20 7b 20 53 45 4c 45 43 54  14.7.12 { SELECT
8d50: 20 27 61 62 63 35 27 20 20 4c 49 4b 45 20 27 61   'abc5'  LIKE 'a
8d60: 62 63 58 58 27 20 45 53 43 41 50 45 20 27 58 27  bcXX' ESCAPE 'X'
8d70: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
8d80: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37  test e_expr-14.7
8d90: 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .13 { SELECT 'ab
8da0: 63 27 20 20 20 4c 49 4b 45 20 27 61 62 63 58 58  c'   LIKE 'abcXX
8db0: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30  ' ESCAPE 'X' } 0
8dc0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8dd0: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 34 20   e_expr-14.7.14 
8de0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 58 58 27  { SELECT 'abcXX'
8df0: 20 4c 49 4b 45 20 27 61 62 63 58 58 27 20 45 53   LIKE 'abcXX' ES
8e00: 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 23 20  CAPE 'X' } 0..# 
8e10: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
8e20: 31 33 35 39 2d 31 37 34 39 36 20 54 68 65 20 69  1359-17496 The i
8e30: 6e 66 69 78 20 4c 49 4b 45 20 6f 70 65 72 61 74  nfix LIKE operat
8e40: 6f 72 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  or is implemente
8e50: 64 20 62 79 0a 23 20 63 61 6c 6c 69 6e 67 20 74  d by.# calling t
8e60: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64  he application-d
8e70: 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74  efined SQL funct
8e80: 69 6f 6e 73 20 6c 69 6b 65 28 59 2c 58 29 20 6f  ions like(Y,X) o
8e90: 72 20 6c 69 6b 65 28 59 2c 58 2c 5a 29 2e 0a 23  r like(Y,X,Z)..#
8ea0: 0a 70 72 6f 63 20 6c 69 6b 65 66 75 6e 63 20 7b  .proc likefunc {
8eb0: 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20 6c  args} {.  eval l
8ec0: 61 70 70 65 6e 64 20 3a 3a 6c 69 6b 65 61 72 67  append ::likearg
8ed0: 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72 6e  s $args.  return
8ee0: 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 6c 69 6b   1.}.db func lik
8ef0: 65 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 6c 69  e -argcount 2 li
8f00: 6b 65 66 75 6e 63 0a 64 62 20 66 75 6e 63 20 6c  kefunc.db func l
8f10: 69 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 33 20  ike -argcount 3 
8f20: 6c 69 6b 65 66 75 6e 63 0a 73 65 74 20 3a 3a 6c  likefunc.set ::l
8f30: 69 6b 65 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64  ikeargs [list].d
8f40: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8f50: 5f 65 78 70 72 2d 31 35 2e 31 2e 31 20 7b 20 53  _expr-15.1.1 { S
8f60: 45 4c 45 43 54 20 27 61 62 63 27 20 4c 49 4b 45  ELECT 'abc' LIKE
8f70: 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65   'def' } 1.do_te
8f80: 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78 70  st         e_exp
8f90: 72 2d 31 35 2e 31 2e 32 20 7b 20 73 65 74 20 6c  r-15.1.2 { set l
8fa0: 69 6b 65 61 72 67 73 20 7d 20 7b 64 65 66 20 61  ikeargs } {def a
8fb0: 62 63 7d 0a 73 65 74 20 3a 3a 6c 69 6b 65 61 72  bc}.set ::likear
8fc0: 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65  gs [list].do_exe
8fd0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
8fe0: 2d 31 35 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54  -15.1.3 { SELECT
8ff0: 20 27 61 62 63 27 20 4c 49 4b 45 20 27 64 65 66   'abc' LIKE 'def
9000: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 31  ' ESCAPE 'X' } 1
9010: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
9020: 20 65 5f 65 78 70 72 2d 31 35 2e 31 2e 34 20 7b   e_expr-15.1.4 {
9030: 20 73 65 74 20 6c 69 6b 65 61 72 67 73 20 7d 20   set likeargs } 
9040: 7b 64 65 66 20 61 62 63 20 58 7d 0a 64 62 20 63  {def abc X}.db c
9050: 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20  lose.sqlite3 db 
9060: 74 65 73 74 2e 64 62 0a 0a 23 20 45 56 49 44 45  test.db..# EVIDE
9070: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 38 36 38 2d  NCE-OF: R-22868-
9080: 32 35 38 38 30 20 54 68 65 20 4c 49 4b 45 20 6f  25880 The LIKE o
9090: 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65 20 6d  perator can be m
90a0: 61 64 65 20 63 61 73 65 0a 23 20 73 65 6e 73 69  ade case.# sensi
90b0: 74 69 76 65 20 75 73 69 6e 67 20 74 68 65 20 63  tive using the c
90c0: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
90d0: 6b 65 20 70 72 61 67 6d 61 2e 0a 23 0a 64 6f 5f  ke pragma..#.do_
90e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
90f0: 78 70 72 2d 31 36 2e 31 2e 31 20 7b 20 53 45 4c  xpr-16.1.1 { SEL
9100: 45 43 54 20 27 61 62 63 78 79 7a 27 20 4c 49 4b  ECT 'abcxyz' LIK
9110: 45 20 27 41 42 43 25 27 20 7d 20 31 0a 64 6f 5f  E 'ABC%' } 1.do_
9120: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
9130: 78 70 72 2d 31 36 2e 31 2e 32 20 7b 20 50 52 41  xpr-16.1.2 { PRA
9140: 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69  GMA case_sensiti
9150: 76 65 5f 6c 69 6b 65 20 3d 20 31 20 7d 20 7b 7d  ve_like = 1 } {}
9160: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9170: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 33 20 7b   e_expr-16.1.3 {
9180: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
9190: 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20 30   LIKE 'ABC%' } 0
91a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
91b0: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 34 20 7b   e_expr-16.1.4 {
91c0: 20 53 45 4c 45 43 54 20 27 41 42 43 78 79 7a 27   SELECT 'ABCxyz'
91d0: 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20 31   LIKE 'ABC%' } 1
91e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
91f0: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 35 20 7b   e_expr-16.1.5 {
9200: 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e   PRAGMA case_sen
9210: 73 69 74 69 76 65 5f 6c 69 6b 65 20 3d 20 30 20  sitive_like = 0 
9220: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
9230: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
9240: 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .6 { SELECT 'abc
9250: 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25 27  xyz' LIKE 'ABC%'
9260: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
9270: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
9280: 2e 37 20 7b 20 53 45 4c 45 43 54 20 27 41 42 43  .7 { SELECT 'ABC
9290: 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25 27  xyz' LIKE 'ABC%'
92a0: 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43 45   } 1..# EVIDENCE
92b0: 2d 4f 46 3a 20 52 2d 35 32 30 38 37 2d 31 32 30  -OF: R-52087-120
92c0: 34 33 20 54 68 65 20 47 4c 4f 42 20 6f 70 65 72  43 The GLOB oper
92d0: 61 74 6f 72 20 69 73 20 73 69 6d 69 6c 61 72 20  ator is similar 
92e0: 74 6f 20 4c 49 4b 45 20 62 75 74 0a 23 20 75 73  to LIKE but.# us
92f0: 65 73 20 74 68 65 20 55 6e 69 78 20 66 69 6c 65  es the Unix file
9300: 20 67 6c 6f 62 62 69 6e 67 20 73 79 6e 74 61 78   globbing syntax
9310: 20 66 6f 72 20 69 74 73 20 77 69 6c 64 63 61 72   for its wildcar
9320: 64 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ds..#.# EVIDENCE
9330: 2d 4f 46 3a 20 52 2d 30 39 38 31 33 2d 31 37 32  -OF: R-09813-172
9340: 37 39 20 41 6c 73 6f 2c 20 47 4c 4f 42 20 69 73  79 Also, GLOB is
9350: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 2c   case sensitive,
9360: 20 75 6e 6c 69 6b 65 20 4c 49 4b 45 2e 0a 23 0a   unlike LIKE..#.
9370: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9380: 65 5f 65 78 70 72 2d 31 37 2e 31 2e 31 20 7b 20  e_expr-17.1.1 { 
9390: 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20  SELECT 'abcxyz' 
93a0: 47 4c 4f 42 20 27 61 62 63 25 27 20 7d 20 30 0a  GLOB 'abc%' } 0.
93b0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
93c0: 65 5f 65 78 70 72 2d 31 37 2e 31 2e 32 20 7b 20  e_expr-17.1.2 { 
93d0: 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20  SELECT 'abcxyz' 
93e0: 47 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20 31 0a  GLOB 'abc*' } 1.
93f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9400: 65 5f 65 78 70 72 2d 31 37 2e 31 2e 33 20 7b 20  e_expr-17.1.3 { 
9410: 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20  SELECT 'abcxyz' 
9420: 47 4c 4f 42 20 27 61 62 63 5f 5f 5f 27 20 7d 20  GLOB 'abc___' } 
9430: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
9440: 74 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 34 20  t e_expr-17.1.4 
9450: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
9460: 27 20 47 4c 4f 42 20 27 61 62 63 3f 3f 3f 27 20  ' GLOB 'abc???' 
9470: 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } 1..do_execsql_
9480: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31  test e_expr-17.1
9490: 2e 35 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .5 { SELECT 'abc
94a0: 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 2a 27  xyz' GLOB 'abc*'
94b0: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
94c0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31  test e_expr-17.1
94d0: 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 41 42 43  .6 { SELECT 'ABC
94e0: 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 2a 27  xyz' GLOB 'abc*'
94f0: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
9500: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31  test e_expr-17.1
9510: 2e 37 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .7 { SELECT 'abc
9520: 78 79 7a 27 20 47 4c 4f 42 20 27 41 42 43 2a 27  xyz' GLOB 'ABC*'
9530: 20 7d 20 30 0a 0a 23 20 45 56 49 44 45 4e 43 45   } 0..# EVIDENCE
9540: 2d 4f 46 3a 20 52 2d 33 39 36 31 36 2d 32 30 35  -OF: R-39616-205
9550: 35 35 20 42 6f 74 68 20 47 4c 4f 42 20 61 6e 64  55 Both GLOB and
9560: 20 4c 49 4b 45 20 6d 61 79 20 62 65 20 70 72 65   LIKE may be pre
9570: 63 65 64 65 64 20 62 79 20 74 68 65 0a 23 20 4e  ceded by the.# N
9580: 4f 54 20 6b 65 79 77 6f 72 64 20 74 6f 20 69 6e  OT keyword to in
9590: 76 65 72 74 20 74 68 65 20 73 65 6e 73 65 20 6f  vert the sense o
95a0: 66 20 74 68 65 20 74 65 73 74 2e 0a 23 0a 64 6f  f the test..#.do
95b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
95c0: 65 78 70 72 2d 31 37 2e 32 2e 31 20 7b 20 53 45  expr-17.2.1 { SE
95d0: 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e 4f  LECT 'abcxyz' NO
95e0: 54 20 47 4c 4f 42 20 27 41 42 43 2a 27 20 7d 20  T GLOB 'ABC*' } 
95f0: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
9600: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 32 20  t e_expr-17.2.2 
9610: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
9620: 27 20 4e 4f 54 20 47 4c 4f 42 20 27 61 62 63 2a  ' NOT GLOB 'abc*
9630: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
9640: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9650: 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.3 { SELECT 'ab
9660: 63 78 79 7a 27 20 4e 4f 54 20 4c 49 4b 45 20 27  cxyz' NOT LIKE '
9670: 41 42 43 25 27 20 7d 20 30 0a 64 6f 5f 65 78 65  ABC%' } 0.do_exe
9680: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
9690: 2d 31 37 2e 32 2e 34 20 7b 20 53 45 4c 45 43 54  -17.2.4 { SELECT
96a0: 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 4c 49   'abcxyz' NOT LI
96b0: 4b 45 20 27 61 62 63 25 27 20 7d 20 30 0a 64 6f  KE 'abc%' } 0.do
96c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
96d0: 65 78 70 72 2d 31 37 2e 32 2e 35 20 7b 20 53 45  expr-17.2.5 { SE
96e0: 4c 45 43 54 20 27 61 62 64 78 79 7a 27 20 4e 4f  LECT 'abdxyz' NO
96f0: 54 20 4c 49 4b 45 20 27 61 62 63 25 27 20 7d 20  T LIKE 'abc%' } 
9700: 31 0a 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20  1..db nullvalue 
9710: 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  null.do_execsql_
9720: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 32  test e_expr-17.2
9730: 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .6 { SELECT 'abc
9740: 78 79 7a 27 20 4e 4f 54 20 47 4c 4f 42 20 4e 55  xyz' NOT GLOB NU
9750: 4c 4c 20 7d 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65  LL } null.do_exe
9760: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
9770: 2d 31 37 2e 32 2e 37 20 7b 20 53 45 4c 45 43 54  -17.2.7 { SELECT
9780: 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 4c 49   'abcxyz' NOT LI
9790: 4b 45 20 4e 55 4c 4c 20 7d 20 6e 75 6c 6c 0a 64  KE NULL } null.d
97a0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
97b0: 5f 65 78 70 72 2d 31 37 2e 32 2e 38 20 7b 20 53  _expr-17.2.8 { S
97c0: 45 4c 45 43 54 20 4e 55 4c 4c 20 4e 4f 54 20 47  ELECT NULL NOT G
97d0: 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20 6e 75 6c  LOB 'abc*' } nul
97e0: 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l.do_execsql_tes
97f0: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 39 20  t e_expr-17.2.9 
9800: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 4e 4f  { SELECT NULL NO
9810: 54 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20  T LIKE 'ABC%' } 
9820: 6e 75 6c 6c 0a 64 62 20 6e 75 6c 6c 76 61 6c 75  null.db nullvalu
9830: 65 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  e {}..# EVIDENCE
9840: 2d 4f 46 3a 20 52 2d 33 39 34 31 34 2d 33 35 34  -OF: R-39414-354
9850: 38 39 20 54 68 65 20 69 6e 66 69 78 20 47 4c 4f  89 The infix GLO
9860: 42 20 6f 70 65 72 61 74 6f 72 20 69 73 20 69 6d  B operator is im
9870: 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 23 20 63  plemented by.# c
9880: 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74  alling the funct
9890: 69 6f 6e 20 67 6c 6f 62 28 59 2c 58 29 20 61 6e  ion glob(Y,X) an
98a0: 64 20 63 61 6e 20 62 65 20 6d 6f 64 69 66 69 65  d can be modifie
98b0: 64 20 62 79 20 6f 76 65 72 72 69 64 69 6e 67 20  d by overriding 
98c0: 74 68 61 74 0a 23 20 66 75 6e 63 74 69 6f 6e 2e  that.# function.
98d0: 0a 70 72 6f 63 20 67 6c 6f 62 66 75 6e 63 20 7b  .proc globfunc {
98e0: 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20 6c  args} {.  eval l
98f0: 61 70 70 65 6e 64 20 3a 3a 67 6c 6f 62 61 72 67  append ::globarg
9900: 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72 6e  s $args.  return
9910: 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 67 6c 6f   1.}.db func glo
9920: 62 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 67 6c  b -argcount 2 gl
9930: 6f 62 66 75 6e 63 0a 73 65 74 20 3a 3a 67 6c 6f  obfunc.set ::glo
9940: 62 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f  bargs [list].do_
9950: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
9960: 78 70 72 2d 31 37 2e 33 2e 31 20 7b 20 53 45 4c  xpr-17.3.1 { SEL
9970: 45 43 54 20 27 61 62 63 27 20 47 4c 4f 42 20 27  ECT 'abc' GLOB '
9980: 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73 74  def' } 1.do_test
9990: 20 20 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d           e_expr-
99a0: 31 37 2e 33 2e 32 20 7b 20 73 65 74 20 67 6c 6f  17.3.2 { set glo
99b0: 62 61 72 67 73 20 7d 20 7b 64 65 66 20 61 62 63  bargs } {def abc
99c0: 7d 0a 73 65 74 20 3a 3a 67 6c 6f 62 61 72 67 73  }.set ::globargs
99d0: 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73   [list].do_execs
99e0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
99f0: 37 2e 33 2e 33 20 7b 20 53 45 4c 45 43 54 20 27  7.3.3 { SELECT '
9a00: 58 27 20 4e 4f 54 20 47 4c 4f 42 20 27 59 27 20  X' NOT GLOB 'Y' 
9a10: 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20 20 20 20  } 0.do_test     
9a20: 20 20 20 20 65 5f 65 78 70 72 2d 31 37 2e 33 2e      e_expr-17.3.
9a30: 34 20 7b 20 73 65 74 20 67 6c 6f 62 61 72 67 73  4 { set globargs
9a40: 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69 74 65 33   } {Y X}.sqlite3
9a50: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 23 20 45   db test.db..# E
9a60: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31  VIDENCE-OF: R-41
9a70: 36 35 30 2d 32 30 38 37 32 20 4e 6f 20 72 65 67  650-20872 No reg
9a80: 65 78 70 28 29 20 75 73 65 72 20 66 75 6e 63 74  exp() user funct
9a90: 69 6f 6e 20 69 73 20 64 65 66 69 6e 65 64 20 62  ion is defined b
9aa0: 79 0a 23 20 64 65 66 61 75 6c 74 20 61 6e 64 20  y.# default and 
9ab0: 73 6f 20 75 73 65 20 6f 66 20 74 68 65 20 52 45  so use of the RE
9ac0: 47 45 58 50 20 6f 70 65 72 61 74 6f 72 20 77 69  GEXP operator wi
9ad0: 6c 6c 20 6e 6f 72 6d 61 6c 6c 79 20 72 65 73 75  ll normally resu
9ae0: 6c 74 20 69 6e 20 61 6e 0a 23 20 65 72 72 6f 72  lt in an.# error
9af0: 20 6d 65 73 73 61 67 65 2e 0a 23 0a 23 20 20 20   message..#.#   
9b00: 54 68 65 72 65 20 69 73 20 61 20 72 65 67 65 78  There is a regex
9b10: 70 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 49 43  p function if IC
9b20: 55 20 69 73 20 65 6e 61 62 6c 65 64 20 74 68 6f  U is enabled tho
9b30: 75 67 68 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  ugh..#.ifcapable
9b40: 20 21 69 63 75 20 7b 0a 20 20 64 6f 5f 63 61 74   !icu {.  do_cat
9b50: 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  chsql_test e_exp
9b60: 72 2d 31 38 2e 31 2e 31 20 7b 20 0a 20 20 20 20  r-18.1.1 { .    
9b70: 53 45 4c 45 43 54 20 72 65 67 65 78 70 28 27 61  SELECT regexp('a
9b80: 62 63 27 2c 20 27 64 65 66 27 29 20 0a 20 20 7d  bc', 'def') .  }
9b90: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e   {1 {no such fun
9ba0: 63 74 69 6f 6e 3a 20 72 65 67 65 78 70 7d 7d 0a  ction: regexp}}.
9bb0: 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65    do_catchsql_te
9bc0: 73 74 20 65 5f 65 78 70 72 2d 31 38 2e 31 2e 32  st e_expr-18.1.2
9bd0: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 27   { .    SELECT '
9be0: 61 62 63 27 20 52 45 47 45 58 50 20 27 64 65 66  abc' REGEXP 'def
9bf0: 27 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  '.  } {1 {no suc
9c00: 68 20 66 75 6e 63 74 69 6f 6e 3a 20 52 45 47 45  h function: REGE
9c10: 58 50 7d 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  XP}}.}..# EVIDEN
9c20: 43 45 2d 4f 46 3a 20 52 2d 33 33 36 39 33 2d 35  CE-OF: R-33693-5
9c30: 30 31 38 30 20 54 68 65 20 52 45 47 45 58 50 20  0180 The REGEXP 
9c40: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 73 70  operator is a sp
9c50: 65 63 69 61 6c 20 73 79 6e 74 61 78 20 66 6f 72  ecial syntax for
9c60: 0a 23 20 74 68 65 20 72 65 67 65 78 70 28 29 20  .# the regexp() 
9c70: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 23  user function..#
9c80: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
9c90: 52 2d 36 35 35 32 34 2d 36 31 38 34 39 20 49 66  R-65524-61849 If
9ca0: 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d   an application-
9cb0: 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63  defined SQL func
9cc0: 74 69 6f 6e 0a 23 20 6e 61 6d 65 64 20 22 72 65  tion.# named "re
9cd0: 67 65 78 70 22 20 69 73 20 61 64 64 65 64 20 61  gexp" is added a
9ce0: 74 20 72 75 6e 2d 74 69 6d 65 2c 20 74 68 65 6e  t run-time, then
9cf0: 20 74 68 65 20 22 58 20 52 45 47 45 58 50 20 59   the "X REGEXP Y
9d00: 22 20 6f 70 65 72 61 74 6f 72 0a 23 20 77 69 6c  " operator.# wil
9d10: 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l be implemented
9d20: 20 61 73 20 61 20 63 61 6c 6c 20 74 6f 20 22 72   as a call to "r
9d30: 65 67 65 78 70 28 59 2c 58 29 22 2e 0a 23 0a 70  egexp(Y,X)"..#.p
9d40: 72 6f 63 20 72 65 67 65 78 70 66 75 6e 63 20 7b  roc regexpfunc {
9d50: 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20 6c  args} {.  eval l
9d60: 61 70 70 65 6e 64 20 3a 3a 72 65 67 65 78 70 61  append ::regexpa
9d70: 72 67 73 20 24 61 72 67 73 0a 20 20 72 65 74 75  rgs $args.  retu
9d80: 72 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 72  rn 1.}.db func r
9d90: 65 67 65 78 70 20 2d 61 72 67 63 6f 75 6e 74 20  egexp -argcount 
9da0: 32 20 72 65 67 65 78 70 66 75 6e 63 0a 73 65 74  2 regexpfunc.set
9db0: 20 3a 3a 72 65 67 65 78 70 61 72 67 73 20 5b 6c   ::regexpargs [l
9dc0: 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ist].do_execsql_
9dd0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 38 2e 32  test e_expr-18.2
9de0: 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .1 { SELECT 'abc
9df0: 27 20 52 45 47 45 58 50 20 27 64 65 66 27 20 7d  ' REGEXP 'def' }
9e00: 20 31 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20   1.do_test      
9e10: 20 20 20 65 5f 65 78 70 72 2d 31 38 2e 32 2e 32     e_expr-18.2.2
9e20: 20 7b 20 73 65 74 20 72 65 67 65 78 70 61 72 67   { set regexparg
9e30: 73 20 7d 20 7b 64 65 66 20 61 62 63 7d 0a 73 65  s } {def abc}.se
9e40: 74 20 3a 3a 72 65 67 65 78 70 61 72 67 73 20 5b  t ::regexpargs [
9e50: 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c  list].do_execsql
9e60: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 38 2e  _test e_expr-18.
9e70: 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 58 27  2.3 { SELECT 'X'
9e80: 20 4e 4f 54 20 52 45 47 45 58 50 20 27 59 27 20   NOT REGEXP 'Y' 
9e90: 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20 20 20 20  } 0.do_test     
9ea0: 20 20 20 20 65 5f 65 78 70 72 2d 31 38 2e 32 2e      e_expr-18.2.
9eb0: 34 20 7b 20 73 65 74 20 72 65 67 65 78 70 61 72  4 { set regexpar
9ec0: 67 73 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69 74  gs } {Y X}.sqlit
9ed0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 23  e3 db test.db..#
9ee0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
9ef0: 34 32 30 33 37 2d 33 37 38 32 36 20 54 68 65 20  42037-37826 The 
9f00: 64 65 66 61 75 6c 74 20 6d 61 74 63 68 28 29 20  default match() 
9f10: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
9f20: 6e 74 61 74 69 6f 6e 0a 23 20 72 61 69 73 65 73  ntation.# raises
9f30: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 61 6e   an exception an
9f40: 64 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  d is not really 
9f50: 75 73 65 66 75 6c 20 66 6f 72 20 61 6e 79 74 68  useful for anyth
9f60: 69 6e 67 2e 0a 23 0a 64 6f 5f 63 61 74 63 68 73  ing..#.do_catchs
9f70: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
9f80: 39 2e 31 2e 31 20 7b 20 0a 20 20 53 45 4c 45 43  9.1.1 { .  SELEC
9f90: 54 20 27 61 62 63 27 20 4d 41 54 43 48 20 27 64  T 'abc' MATCH 'd
9fa0: 65 66 27 20 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c  ef' .} {1 {unabl
9fb0: 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f  e to use functio
9fc0: 6e 20 4d 41 54 43 48 20 69 6e 20 74 68 65 20 72  n MATCH in the r
9fd0: 65 71 75 65 73 74 65 64 20 63 6f 6e 74 65 78 74  equested context
9fe0: 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }}.do_catchsql_t
9ff0: 65 73 74 20 65 5f 65 78 70 72 2d 31 39 2e 31 2e  est e_expr-19.1.
a000: 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 6d 61  2 { .  SELECT ma
a010: 74 63 68 28 27 61 62 63 27 2c 20 27 64 65 66 27  tch('abc', 'def'
a020: 29 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74  ).} {1 {unable t
a030: 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 4d  o use function M
a040: 41 54 43 48 20 69 6e 20 74 68 65 20 72 65 71 75  ATCH in the requ
a050: 65 73 74 65 64 20 63 6f 6e 74 65 78 74 7d 7d 0a  ested context}}.
a060: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
a070: 52 2d 33 37 39 31 36 2d 34 37 34 30 37 20 54 68  R-37916-47407 Th
a080: 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72  e MATCH operator
a090: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 73 79   is a special sy
a0a0: 6e 74 61 78 20 66 6f 72 0a 23 20 74 68 65 20 6d  ntax for.# the m
a0b0: 61 74 63 68 28 29 20 61 70 70 6c 69 63 61 74 69  atch() applicati
a0c0: 6f 6e 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  on-defined funct
a0d0: 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ion..#.# EVIDENC
a0e0: 45 2d 4f 46 3a 20 52 2d 30 36 30 32 31 2d 30 39  E-OF: R-06021-09
a0f0: 33 37 33 20 42 75 74 20 65 78 74 65 6e 73 69 6f  373 But extensio
a100: 6e 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20  ns can override 
a110: 74 68 65 20 6d 61 74 63 68 28 29 0a 23 20 66 75  the match().# fu
a120: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 6f 72 65  nction with more
a130: 20 68 65 6c 70 66 75 6c 20 6c 6f 67 69 63 2e 0a   helpful logic..
a140: 23 0a 70 72 6f 63 20 6d 61 74 63 68 66 75 6e 63  #.proc matchfunc
a150: 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c   {args} {.  eval
a160: 20 6c 61 70 70 65 6e 64 20 3a 3a 6d 61 74 63 68   lappend ::match
a170: 61 72 67 73 20 24 61 72 67 73 0a 20 20 72 65 74  args $args.  ret
a180: 75 72 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20  urn 1.}.db func 
a190: 6d 61 74 63 68 20 2d 61 72 67 63 6f 75 6e 74 20  match -argcount 
a1a0: 32 20 6d 61 74 63 68 66 75 6e 63 0a 73 65 74 20  2 matchfunc.set 
a1b0: 3a 3a 6d 61 74 63 68 61 72 67 73 20 5b 6c 69 73  ::matchargs [lis
a1c0: 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  t].do_execsql_te
a1d0: 73 74 20 65 5f 65 78 70 72 2d 31 39 2e 32 2e 31  st e_expr-19.2.1
a1e0: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 27 20   { SELECT 'abc' 
a1f0: 4d 41 54 43 48 20 27 64 65 66 27 20 7d 20 31 0a  MATCH 'def' } 1.
a200: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
a210: 65 5f 65 78 70 72 2d 31 39 2e 32 2e 32 20 7b 20  e_expr-19.2.2 { 
a220: 73 65 74 20 6d 61 74 63 68 61 72 67 73 20 7d 20  set matchargs } 
a230: 7b 64 65 66 20 61 62 63 7d 0a 73 65 74 20 3a 3a  {def abc}.set ::
a240: 6d 61 74 63 68 61 72 67 73 20 5b 6c 69 73 74 5d  matchargs [list]
a250: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
a260: 20 65 5f 65 78 70 72 2d 31 39 2e 32 2e 33 20 7b   e_expr-19.2.3 {
a270: 20 53 45 4c 45 43 54 20 27 58 27 20 4e 4f 54 20   SELECT 'X' NOT 
a280: 4d 41 54 43 48 20 27 59 27 20 7d 20 30 0a 64 6f  MATCH 'Y' } 0.do
a290: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 65 5f  _test         e_
a2a0: 65 78 70 72 2d 31 39 2e 32 2e 34 20 7b 20 73 65  expr-19.2.4 { se
a2b0: 74 20 6d 61 74 63 68 61 72 67 73 20 7d 20 7b 59  t matchargs } {Y
a2c0: 20 58 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74   X}.sqlite3 db t
a2d0: 65 73 74 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  est.db..#-------
a2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a320: 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73 20  --.# Test cases 
a330: 66 6f 72 20 74 68 65 20 74 65 73 74 61 62 6c 65  for the testable
a340: 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65 6c 61   statements rela
a350: 74 65 64 20 74 6f 20 74 68 65 20 43 41 53 45 20  ted to the CASE 
a360: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23 0a 23 20  expression..#.# 
a370: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
a380: 35 31 39 39 2d 36 31 33 38 39 20 54 68 65 72 65  5199-61389 There
a390: 20 61 72 65 20 74 77 6f 20 62 61 73 69 63 20 66   are two basic f
a3a0: 6f 72 6d 73 20 6f 66 20 74 68 65 20 43 41 53 45  orms of the CASE
a3b0: 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 3a 20 74  .# expression: t
a3c0: 68 6f 73 65 20 77 69 74 68 20 61 20 62 61 73 65  hose with a base
a3d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
a3e0: 74 68 6f 73 65 20 77 69 74 68 6f 75 74 2e 0a 23  those without..#
a3f0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
a400: 20 65 5f 65 78 70 72 2d 32 30 2e 31 20 7b 0a 20   e_expr-20.1 {. 
a410: 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
a420: 4e 20 31 20 54 48 45 4e 20 27 74 72 75 65 27 20  N 1 THEN 'true' 
a430: 57 48 45 4e 20 30 20 54 48 45 4e 20 27 66 61 6c  WHEN 0 THEN 'fal
a440: 73 65 27 20 45 4c 53 45 20 27 65 6c 73 65 27 20  se' ELSE 'else' 
a450: 45 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a 64 6f  END;.} {true}.do
a460: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
a470: 65 78 70 72 2d 32 30 2e 32 20 7b 0a 20 20 53 45  expr-20.2 {.  SE
a480: 4c 45 43 54 20 43 41 53 45 20 30 20 57 48 45 4e  LECT CASE 0 WHEN
a490: 20 31 20 54 48 45 4e 20 27 74 72 75 65 27 20 57   1 THEN 'true' W
a4a0: 48 45 4e 20 30 20 54 48 45 4e 20 27 66 61 6c 73  HEN 0 THEN 'fals
a4b0: 65 27 20 45 4c 53 45 20 27 65 6c 73 65 27 20 45  e' ELSE 'else' E
a4c0: 4e 44 3b 0a 7d 20 7b 66 61 6c 73 65 7d 0a 0a 70  ND;.} {false}..p
a4d0: 72 6f 63 20 76 61 72 20 7b 6e 6d 7d 20 7b 0a 20  roc var {nm} {. 
a4e0: 20 6c 61 70 70 65 6e 64 20 3a 3a 76 61 72 6c 69   lappend ::varli
a4f0: 73 74 20 24 6e 6d 0a 20 20 72 65 74 75 72 6e 20  st $nm.  return 
a500: 5b 73 65 74 20 22 3a 3a 24 6e 6d 22 5d 0a 7d 0a  [set "::$nm"].}.
a510: 64 62 20 66 75 6e 63 20 76 61 72 20 76 61 72 0a  db func var var.
a520: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
a530: 52 2d 33 30 36 33 38 2d 35 39 39 35 34 20 49 6e  R-30638-59954 In
a540: 20 61 20 43 41 53 45 20 77 69 74 68 6f 75 74 20   a CASE without 
a550: 61 20 62 61 73 65 20 65 78 70 72 65 73 73 69 6f  a base expressio
a560: 6e 2c 20 65 61 63 68 0a 23 20 57 48 45 4e 20 65  n, each.# WHEN e
a570: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
a580: 6c 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72  luated and the r
a590: 65 73 75 6c 74 20 74 72 65 61 74 65 64 20 61 73  esult treated as
a5a0: 20 61 20 62 6f 6f 6c 65 61 6e 2c 0a 23 20 73 74   a boolean,.# st
a5b0: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
a5c0: 6c 65 66 74 6d 6f 73 74 20 61 6e 64 20 63 6f 6e  leftmost and con
a5d0: 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 72  tinuing to the r
a5e0: 69 67 68 74 2e 0a 23 0a 66 6f 72 65 61 63 68 20  ight..#.foreach 
a5f0: 7b 61 20 62 20 63 7d 20 7b 30 20 30 20 30 7d 20  {a b c} {0 0 0} 
a600: 62 72 65 61 6b 0a 73 65 74 20 76 61 72 6c 69 73  break.set varlis
a610: 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63  t [list].do_exec
a620: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
a630: 32 31 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43  21.1.1 {.  SELEC
a640: 54 20 43 41 53 45 20 57 48 45 4e 20 76 61 72 28  T CASE WHEN var(
a650: 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20  'a') THEN 'A' . 
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
a670: 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e 20  N var('b') THEN 
a680: 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'B' .           
a690: 20 20 20 57 48 45 4e 20 76 61 72 28 27 63 27 29     WHEN var('c')
a6a0: 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20   THEN 'C' END.} 
a6b0: 7b 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65  {{}}.do_test e_e
a6c0: 78 70 72 2d 32 31 2e 31 2e 32 20 7b 20 73 65 74  xpr-21.1.2 { set
a6d0: 20 76 61 72 6c 69 73 74 20 7d 20 7b 61 20 62 20   varlist } {a b 
a6e0: 63 7d 0a 73 65 74 20 76 61 72 6c 69 73 74 20 5b  c}.set varlist [
a6f0: 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c  list].do_execsql
a700: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e  _test e_expr-21.
a710: 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.3 {.  SELECT C
a720: 41 53 45 20 57 48 45 4e 20 76 61 72 28 27 63 27  ASE WHEN var('c'
a730: 29 20 54 48 45 4e 20 27 43 27 20 0a 20 20 20 20  ) THEN 'C' .    
a740: 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76            WHEN v
a750: 61 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27  ar('b') THEN 'B'
a760: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
a770: 57 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48  WHEN var('a') TH
a780: 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20  EN 'A' .        
a790: 20 20 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72        ELSE 'no r
a7a0: 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b  esult'.  END.} {
a7b0: 7b 6e 6f 20 72 65 73 75 6c 74 7d 7d 0a 64 6f 5f  {no result}}.do_
a7c0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 31  test e_expr-21.1
a7d0: 2e 34 20 7b 20 73 65 74 20 76 61 72 6c 69 73 74  .4 { set varlist
a7e0: 20 7d 20 7b 63 20 62 20 61 7d 0a 0a 23 20 45 56   } {c b a}..# EV
a7f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 30  IDENCE-OF: R-390
a800: 30 39 2d 32 35 35 39 36 20 54 68 65 20 72 65 73  09-25596 The res
a810: 75 6c 74 20 6f 66 20 74 68 65 20 43 41 53 45 20  ult of the CASE 
a820: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
a830: 65 0a 23 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  e.# evaluation o
a840: 66 20 74 68 65 20 54 48 45 4e 20 65 78 70 72 65  f the THEN expre
a850: 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 72 72 65  ssion that corre
a860: 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 66 69  sponds to the fi
a870: 72 73 74 20 57 48 45 4e 0a 23 20 65 78 70 72 65  rst WHEN.# expre
a880: 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61 6c 75  ssion that evalu
a890: 61 74 65 73 20 74 6f 20 74 72 75 65 2e 0a 23 0a  ates to true..#.
a8a0: 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20  foreach {a b c} 
a8b0: 7b 30 20 31 20 30 7d 20 62 72 65 61 6b 0a 64 6f  {0 1 0} break.do
a8c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
a8d0: 65 78 70 72 2d 32 31 2e 32 2e 31 20 7b 0a 20 20  expr-21.2.1 {.  
a8e0: 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
a8f0: 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20 27   var('a') THEN '
a900: 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  A' .            
a910: 20 20 57 48 45 4e 20 76 61 72 28 27 62 27 29 20    WHEN var('b') 
a920: 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20  THEN 'B' .      
a930: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
a940: 28 27 63 27 29 20 54 48 45 4e 20 27 43 27 20 0a  ('c') THEN 'C' .
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c                EL
a960: 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20  SE 'no result'. 
a970: 20 45 4e 44 0a 7d 20 7b 42 7d 0a 66 6f 72 65 61   END.} {B}.forea
a980: 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20 31 20  ch {a b c} {0 1 
a990: 31 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78 65 63  1} break.do_exec
a9a0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
a9b0: 32 31 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43  21.2.2 {.  SELEC
a9c0: 54 20 43 41 53 45 20 57 48 45 4e 20 76 61 72 28  T CASE WHEN var(
a9d0: 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20  'a') THEN 'A' . 
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
a9f0: 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e 20  N var('b') THEN 
aa00: 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'B' .           
aa10: 20 20 20 57 48 45 4e 20 76 61 72 28 27 63 27 29     WHEN var('c')
aa20: 20 54 48 45 4e 20 27 43 27 0a 20 20 20 20 20 20   THEN 'C'.      
aa30: 20 20 20 20 20 20 20 20 45 4c 53 45 20 27 6e 6f          ELSE 'no
aa40: 20 72 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d   result'.  END.}
aa50: 20 7b 42 7d 0a 66 6f 72 65 61 63 68 20 7b 61 20   {B}.foreach {a 
aa60: 62 20 63 7d 20 7b 30 20 30 20 31 7d 20 62 72 65  b c} {0 0 1} bre
aa70: 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  ak.do_execsql_te
aa80: 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 32 2e 33  st e_expr-21.2.3
aa90: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
aaa0: 20 57 48 45 4e 20 76 61 72 28 27 61 27 29 20 54   WHEN var('a') T
aab0: 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20  HEN 'A' .       
aac0: 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28         WHEN var(
aad0: 27 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20  'b') THEN 'B' . 
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
aaf0: 4e 20 76 61 72 28 27 63 27 29 20 54 48 45 4e 20  N var('c') THEN 
ab00: 27 43 27 0a 20 20 20 20 20 20 20 20 20 20 20 20  'C'.            
ab10: 20 20 45 4c 53 45 20 27 6e 6f 20 72 65 73 75 6c    ELSE 'no resul
ab20: 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 43 7d 0a 0a  t'.  END.} {C}..
ab30: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
ab40: 2d 32 34 32 32 37 2d 30 34 38 30 37 20 4f 72 2c  -24227-04807 Or,
ab50: 20 69 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   if none of the 
ab60: 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 73  WHEN expressions
ab70: 0a 23 20 65 76 61 6c 75 61 74 65 20 74 6f 20 74  .# evaluate to t
ab80: 72 75 65 2c 20 74 68 65 20 72 65 73 75 6c 74 20  rue, the result 
ab90: 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  of evaluating th
aba0: 65 20 45 4c 53 45 20 65 78 70 72 65 73 73 69 6f  e ELSE expressio
abb0: 6e 2c 20 69 66 0a 23 20 61 6e 79 2e 0a 23 0a 66  n, if.# any..#.f
abc0: 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b  oreach {a b c} {
abd0: 30 20 30 20 30 7d 20 62 72 65 61 6b 0a 64 6f 5f  0 0 0} break.do_
abe0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
abf0: 78 70 72 2d 32 31 2e 33 2e 31 20 7b 0a 20 20 53  xpr-21.3.1 {.  S
ac00: 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20  ELECT CASE WHEN 
ac10: 76 61 72 28 27 61 27 29 20 54 48 45 4e 20 27 41  var('a') THEN 'A
ac20: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
ac30: 20 57 48 45 4e 20 76 61 72 28 27 62 27 29 20 54   WHEN var('b') T
ac40: 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20  HEN 'B' .       
ac50: 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28         WHEN var(
ac60: 27 63 27 29 20 54 48 45 4e 20 27 43 27 0a 20 20  'c') THEN 'C'.  
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 45              ELSE
ac80: 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20 45   'no result'.  E
ac90: 4e 44 0a 7d 20 7b 7b 6e 6f 20 72 65 73 75 6c 74  ND.} {{no result
aca0: 7d 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  }}..# EVIDENCE-O
acb0: 46 3a 20 52 2d 31 34 31 36 38 2d 30 37 35 37 39  F: R-14168-07579
acc0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
acd0: 45 4c 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20  ELSE expression 
ace0: 61 6e 64 20 6e 6f 6e 65 20 6f 66 0a 23 20 74 68  and none of.# th
acf0: 65 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f  e WHEN expressio
ad00: 6e 73 20 61 72 65 20 74 72 75 65 2c 20 74 68 65  ns are true, the
ad10: 6e 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 72 65  n the overall re
ad20: 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 23 0a  sult is NULL..#.
ad30: 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 6e 75 6c  db nullvalue nul
ad40: 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l.do_execsql_tes
ad50: 74 20 65 5f 65 78 70 72 2d 32 31 2e 33 2e 32 20  t e_expr-21.3.2 
ad60: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
ad70: 57 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48  WHEN var('a') TH
ad80: 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20  EN 'A' .        
ad90: 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27        WHEN var('
ada0: 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20  b') THEN 'B' .  
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e              WHEN
adc0: 20 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27   var('c') THEN '
add0: 43 27 0a 20 20 45 4e 44 0a 7d 20 7b 6e 75 6c 6c  C'.  END.} {null
ade0: 7d 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 7b  }.db nullvalue {
adf0: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
ae00: 3a 20 52 2d 31 33 39 34 33 2d 31 33 35 39 32 20  : R-13943-13592 
ae10: 41 20 4e 55 4c 4c 20 72 65 73 75 6c 74 20 69 73  A NULL result is
ae20: 20 63 6f 6e 73 69 64 65 72 65 64 20 75 6e 74 72   considered untr
ae30: 75 65 20 77 68 65 6e 0a 23 20 65 76 61 6c 75 61  ue when.# evalua
ae40: 74 69 6e 67 20 57 48 45 4e 20 74 65 72 6d 73 2e  ting WHEN terms.
ae50: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
ae60: 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 34 2e 31  st e_expr-21.4.1
ae70: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
ae80: 20 57 48 45 4e 20 4e 55 4c 4c 20 54 48 45 4e 20   WHEN NULL THEN 
ae90: 27 41 27 20 57 48 45 4e 20 31 20 54 48 45 4e 20  'A' WHEN 1 THEN 
aea0: 27 42 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f  'B' END.} {B}.do
aeb0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
aec0: 65 78 70 72 2d 32 31 2e 34 2e 32 20 7b 0a 20 20  expr-21.4.2 {.  
aed0: 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
aee0: 20 30 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e   0 THEN 'A' WHEN
aef0: 20 4e 55 4c 4c 20 54 48 45 4e 20 27 42 27 20 45   NULL THEN 'B' E
af00: 4c 53 45 20 27 43 27 20 45 4e 44 0a 7d 20 7b 43  LSE 'C' END.} {C
af10: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
af20: 3a 20 52 2d 33 38 36 32 30 2d 31 39 34 39 39 20  : R-38620-19499 
af30: 49 6e 20 61 20 43 41 53 45 20 77 69 74 68 20 61  In a CASE with a
af40: 20 62 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e   base expression
af50: 2c 20 74 68 65 20 62 61 73 65 0a 23 20 65 78 70  , the base.# exp
af60: 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
af70: 61 74 65 64 20 6a 75 73 74 20 6f 6e 63 65 20 61  ated just once a
af80: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  nd the result is
af90: 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73   compared agains
afa0: 74 0a 23 20 74 68 65 20 65 76 61 6c 75 61 74 69  t.# the evaluati
afb0: 6f 6e 20 6f 66 20 65 61 63 68 20 57 48 45 4e 20  on of each WHEN 
afc0: 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20  expression from 
afd0: 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 23  left to right..#
afe0: 0a 23 20 4e 6f 74 65 3a 20 54 68 69 73 20 74 65  .# Note: This te
aff0: 73 74 20 63 61 73 65 20 74 65 73 74 73 20 74 68  st case tests th
b000: 65 20 22 65 76 61 6c 75 61 74 65 64 20 6a 75 73  e "evaluated jus
b010: 74 20 6f 6e 63 65 22 20 70 61 72 74 20 6f 66 20  t once" part of 
b020: 74 68 65 20 61 62 6f 76 65 0a 23 20 73 74 61 74  the above.# stat
b030: 65 6d 65 6e 74 2e 20 54 65 73 74 73 20 61 73 73  ement. Tests ass
b040: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
b050: 20 6e 65 78 74 20 74 77 6f 20 73 74 61 74 65 6d   next two statem
b060: 65 6e 74 73 20 74 65 73 74 20 74 68 61 74 20 74  ents test that t
b070: 68 65 0a 23 20 63 6f 6d 70 61 72 69 73 6f 6e 73  he.# comparisons
b080: 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 23 0a 66   take place..#.f
b090: 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20 5b  oreach {a b c} [
b0a0: 6c 69 73 74 20 5b 65 78 70 72 20 33 5d 20 5b 65  list [expr 3] [e
b0b0: 78 70 72 20 34 5d 20 5b 65 78 70 72 20 35 5d 5d  xpr 4] [expr 5]]
b0c0: 20 62 72 65 61 6b 0a 73 65 74 20 3a 3a 76 61 72   break.set ::var
b0d0: 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65  list [list].do_e
b0e0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
b0f0: 70 72 2d 32 32 2e 31 2e 31 20 7b 0a 20 20 53 45  pr-22.1.1 {.  SE
b100: 4c 45 43 54 20 43 41 53 45 20 76 61 72 28 27 61  LECT CASE var('a
b110: 27 29 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27  ') WHEN 1 THEN '
b120: 41 27 20 57 48 45 4e 20 32 20 54 48 45 4e 20 27  A' WHEN 2 THEN '
b130: 42 27 20 57 48 45 4e 20 33 20 54 48 45 4e 20 27  B' WHEN 3 THEN '
b140: 43 27 20 45 4e 44 0a 7d 20 7b 43 7d 0a 64 6f 5f  C' END.} {C}.do_
b150: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 31  test e_expr-22.1
b160: 2e 32 20 7b 20 73 65 74 20 3a 3a 76 61 72 6c 69  .2 { set ::varli
b170: 73 74 20 7d 20 7b 61 7d 0a 0a 23 20 45 56 49 44  st } {a}..# EVID
b180: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 36 36 37  ENCE-OF: R-07667
b190: 2d 34 39 35 33 37 20 54 68 65 20 72 65 73 75 6c  -49537 The resul
b1a0: 74 20 6f 66 20 74 68 65 20 43 41 53 45 20 65 78  t of the CASE ex
b1b0: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 0a  pression is the.
b1c0: 23 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20  # evaluation of 
b1d0: 74 68 65 20 54 48 45 4e 20 65 78 70 72 65 73 73  the THEN express
b1e0: 69 6f 6e 20 74 68 61 74 20 63 6f 72 72 65 73 70  ion that corresp
b1f0: 6f 6e 64 73 20 74 6f 20 74 68 65 20 66 69 72 73  onds to the firs
b200: 74 20 57 48 45 4e 0a 23 20 65 78 70 72 65 73 73  t WHEN.# express
b210: 69 6f 6e 20 66 6f 72 20 77 68 69 63 68 20 74 68  ion for which th
b220: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
b230: 74 72 75 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  true..#.do_execs
b240: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
b250: 32 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  2.2.1 {.  SELECT
b260: 20 43 41 53 45 20 32 33 20 57 48 45 4e 20 31 20   CASE 23 WHEN 1 
b270: 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32 33  THEN 'A' WHEN 23
b280: 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20 32   THEN 'B' WHEN 2
b290: 33 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d  3 THEN 'C' END.}
b2a0: 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {B}.do_execsql_
b2b0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 32  test e_expr-22.2
b2c0: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .2 {.  SELECT CA
b2d0: 53 45 20 31 20 57 48 45 4e 20 31 20 54 48 45 4e  SE 1 WHEN 1 THEN
b2e0: 20 27 41 27 20 57 48 45 4e 20 32 33 20 54 48 45   'A' WHEN 23 THE
b2f0: 4e 20 27 42 27 20 57 48 45 4e 20 32 33 20 54 48  N 'B' WHEN 23 TH
b300: 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20 7b 41 7d  EN 'C' END.} {A}
b310: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
b320: 20 52 2d 34 37 35 34 33 2d 33 32 31 34 35 20 4f   R-47543-32145 O
b330: 72 2c 20 69 66 20 6e 6f 6e 65 20 6f 66 20 74 68  r, if none of th
b340: 65 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f  e WHEN expressio
b350: 6e 73 0a 23 20 65 76 61 6c 75 61 74 65 20 74 6f  ns.# evaluate to
b360: 20 61 20 76 61 6c 75 65 20 65 71 75 61 6c 20 74   a value equal t
b370: 6f 20 74 68 65 20 62 61 73 65 20 65 78 70 72 65  o the base expre
b380: 73 73 69 6f 6e 2c 20 74 68 65 20 72 65 73 75 6c  ssion, the resul
b390: 74 20 6f 66 0a 23 20 65 76 61 6c 75 61 74 69 6e  t of.# evaluatin
b3a0: 67 20 74 68 65 20 45 4c 53 45 20 65 78 70 72 65  g the ELSE expre
b3b0: 73 73 69 6f 6e 2c 20 69 66 20 61 6e 79 2e 0a 23  ssion, if any..#
b3c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
b3d0: 20 65 5f 65 78 70 72 2d 32 32 2e 33 2e 31 20 7b   e_expr-22.3.1 {
b3e0: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 32  .  SELECT CASE 2
b3f0: 34 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27 41  4 WHEN 1 THEN 'A
b400: 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27  ' WHEN 23 THEN '
b410: 42 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20  B' WHEN 23 THEN 
b420: 27 43 27 20 45 4c 53 45 20 27 44 27 20 45 4e 44  'C' ELSE 'D' END
b430: 0a 7d 20 7b 44 7d 0a 0a 23 20 45 56 49 44 45 4e  .} {D}..# EVIDEN
b440: 43 45 2d 4f 46 3a 20 52 2d 35 34 37 32 31 2d 34  CE-OF: R-54721-4
b450: 38 35 35 37 20 49 66 20 74 68 65 72 65 20 69 73  8557 If there is
b460: 20 6e 6f 20 45 4c 53 45 20 65 78 70 72 65 73 73   no ELSE express
b470: 69 6f 6e 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 0a  ion and none of.
b480: 23 20 74 68 65 20 57 48 45 4e 20 65 78 70 72 65  # the WHEN expre
b490: 73 73 69 6f 6e 73 20 70 72 6f 64 75 63 65 20 61  ssions produce a
b4a0: 20 72 65 73 75 6c 74 20 65 71 75 61 6c 20 74 6f   result equal to
b4b0: 20 74 68 65 20 62 61 73 65 20 65 78 70 72 65 73   the base expres
b4c0: 73 69 6f 6e 2c 0a 23 20 74 68 65 20 6f 76 65 72  sion,.# the over
b4d0: 61 6c 6c 20 72 65 73 75 6c 74 20 69 73 20 4e 55  all result is NU
b4e0: 4c 4c 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  LL..#.do_execsql
b4f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e  _test e_expr-22.
b500: 34 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  4.1 {.  SELECT C
b510: 41 53 45 20 32 34 20 57 48 45 4e 20 31 20 54 48  ASE 24 WHEN 1 TH
b520: 45 4e 20 27 41 27 20 57 48 45 4e 20 32 33 20 54  EN 'A' WHEN 23 T
b530: 48 45 4e 20 27 42 27 20 57 48 45 4e 20 32 33 20  HEN 'B' WHEN 23 
b540: 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20 7b  THEN 'C' END.} {
b550: 7b 7d 7d 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65  {}}.db nullvalue
b560: 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c   null.do_execsql
b570: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e  _test e_expr-22.
b580: 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  4.2 {.  SELECT C
b590: 41 53 45 20 32 34 20 57 48 45 4e 20 31 20 54 48  ASE 24 WHEN 1 TH
b5a0: 45 4e 20 27 41 27 20 57 48 45 4e 20 32 33 20 54  EN 'A' WHEN 23 T
b5b0: 48 45 4e 20 27 42 27 20 57 48 45 4e 20 32 33 20  HEN 'B' WHEN 23 
b5c0: 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20 7b  THEN 'C' END.} {
b5d0: 6e 75 6c 6c 7d 0a 64 62 20 6e 75 6c 6c 76 61 6c  null}.db nullval
b5e0: 75 65 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43  ue {}..# EVIDENC
b5f0: 45 2d 4f 46 3a 20 52 2d 31 31 34 37 39 2d 36 32  E-OF: R-11479-62
b600: 37 37 34 20 57 68 65 6e 20 63 6f 6d 70 61 72 69  774 When compari
b610: 6e 67 20 61 20 62 61 73 65 20 65 78 70 72 65 73  ng a base expres
b620: 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61 0a 23  sion against a.#
b630: 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e   WHEN expression
b640: 2c 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  , the same colla
b650: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 61  ting sequence, a
b660: 66 66 69 6e 69 74 79 2c 20 61 6e 64 0a 23 20 4e  ffinity, and.# N
b670: 55 4c 4c 2d 68 61 6e 64 6c 69 6e 67 20 72 75 6c  ULL-handling rul
b680: 65 73 20 61 70 70 6c 79 20 61 73 20 69 66 20 74  es apply as if t
b690: 68 65 20 62 61 73 65 20 65 78 70 72 65 73 73 69  he base expressi
b6a0: 6f 6e 20 61 6e 64 20 57 48 45 4e 0a 23 20 65 78  on and WHEN.# ex
b6b0: 70 72 65 73 73 69 6f 6e 20 61 72 65 20 72 65 73  pression are res
b6c0: 70 65 63 74 69 76 65 6c 79 20 74 68 65 20 6c 65  pectively the le
b6d0: 66 74 2d 20 61 6e 64 20 72 69 67 68 74 2d 68 61  ft- and right-ha
b6e0: 6e 64 20 6f 70 65 72 61 6e 64 73 20 6f 66 20 61  nd operands of a
b6f0: 6e 20 3d 0a 23 20 6f 70 65 72 61 74 6f 72 2e 0a  n =.# operator..
b700: 23 0a 70 72 6f 63 20 72 65 76 20 7b 73 74 72 7d  #.proc rev {str}
b710: 20 7b 0a 20 20 73 65 74 20 72 65 74 20 22 22 0a   {.  set ret "".
b720: 20 20 73 65 74 20 63 68 61 72 73 20 5b 73 70 6c    set chars [spl
b730: 69 74 20 24 73 74 72 5d 0a 20 20 66 6f 72 20 7b  it $str].  for {
b740: 73 65 74 20 69 20 5b 65 78 70 72 20 5b 6c 6c 65  set i [expr [lle
b750: 6e 67 74 68 20 24 63 68 61 72 73 5d 2d 31 5d 7d  ngth $chars]-1]}
b760: 20 7b 24 69 3e 3d 30 7d 20 7b 69 6e 63 72 20 69   {$i>=0} {incr i
b770: 20 2d 31 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e   -1} {.    appen
b780: 64 20 72 65 74 20 5b 6c 69 6e 64 65 78 20 24 63  d ret [lindex $c
b790: 68 61 72 73 20 24 69 5d 0a 20 20 7d 0a 20 20 73  hars $i].  }.  s
b7a0: 65 74 20 72 65 74 0a 7d 0a 70 72 6f 63 20 72 65  et ret.}.proc re
b7b0: 76 65 72 73 65 20 7b 6c 68 73 20 72 68 73 7d 20  verse {lhs rhs} 
b7c0: 7b 0a 20 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  {.  string compa
b7d0: 72 65 20 5b 72 65 76 20 24 6c 68 73 5d 20 5b 72  re [rev $lhs] [r
b7e0: 65 76 20 24 72 68 73 5d 0a 7d 0a 64 62 20 63 6f  ev $rhs].}.db co
b7f0: 6c 6c 61 74 65 20 72 65 76 65 72 73 65 20 72 65  llate reverse re
b800: 76 65 72 73 65 0a 64 6f 5f 65 78 65 63 73 71 6c  verse.do_execsql
b810: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e  _test e_expr-23.
b820: 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1.1 {.  CREATE T
b830: 41 42 4c 45 20 74 31 28 0a 20 20 20 20 61 20 54  ABLE t1(.    a T
b840: 45 58 54 20 20 20 20 20 43 4f 4c 4c 41 54 45 20  EXT     COLLATE 
b850: 4e 4f 43 41 53 45 2c 0a 20 20 20 20 62 20 20 20  NOCASE,.    b   
b860: 20 20 20 20 20 20 20 43 4f 4c 4c 41 54 45 20 52         COLLATE R
b870: 45 56 45 52 53 45 2c 0a 20 20 20 20 63 20 49 4e  EVERSE,.    c IN
b880: 54 45 47 45 52 2c 0a 20 20 20 20 64 20 42 4c 4f  TEGER,.    d BLO
b890: 42 0a 20 20 29 3b 0a 20 20 49 4e 53 45 52 54 20  B.  );.  INSERT 
b8a0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
b8b0: 61 62 63 27 2c 20 27 63 62 61 27 2c 20 35 35 2c  abc', 'cba', 55,
b8c0: 20 33 34 2e 35 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f   34.5);.} {}.do_
b8d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
b8e0: 78 70 72 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 53  xpr-23.1.2 {.  S
b8f0: 45 4c 45 43 54 20 43 41 53 45 20 61 20 57 48 45  ELECT CASE a WHE
b900: 4e 20 27 78 79 7a 27 20 54 48 45 4e 20 27 41 27  N 'xyz' THEN 'A'
b910: 20 57 48 45 4e 20 27 41 62 43 27 20 54 48 45 4e   WHEN 'AbC' THEN
b920: 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20 74 31   'B' END FROM t1
b930: 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71  .} {B}.do_execsq
b940: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33  l_test e_expr-23
b950: 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.3 {.  SELECT 
b960: 43 41 53 45 20 27 41 62 43 27 20 57 48 45 4e 20  CASE 'AbC' WHEN 
b970: 27 61 62 63 27 20 54 48 45 4e 20 27 41 27 20 57  'abc' THEN 'A' W
b980: 48 45 4e 20 61 20 54 48 45 4e 20 27 42 27 20 45  HEN a THEN 'B' E
b990: 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d  ND FROM t1.} {B}
b9a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
b9b0: 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 34 20 7b   e_expr-23.1.4 {
b9c0: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 61  .  SELECT CASE a
b9d0: 20 57 48 45 4e 20 62 20 54 48 45 4e 20 27 41 27   WHEN b THEN 'A'
b9e0: 20 45 4c 53 45 20 27 42 27 20 45 4e 44 20 46 52   ELSE 'B' END FR
b9f0: 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65  OM t1.} {B}.do_e
ba00: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
ba10: 70 72 2d 32 33 2e 31 2e 35 20 7b 0a 20 20 53 45  pr-23.1.5 {.  SE
ba20: 4c 45 43 54 20 43 41 53 45 20 62 20 57 48 45 4e  LECT CASE b WHEN
ba30: 20 61 20 54 48 45 4e 20 27 41 27 20 45 4c 53 45   a THEN 'A' ELSE
ba40: 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20 74 31   'B' END FROM t1
ba50: 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71  .} {B}.do_execsq
ba60: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33  l_test e_expr-23
ba70: 2e 31 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.6 {.  SELECT 
ba80: 43 41 53 45 20 35 35 20 57 48 45 4e 20 27 35 35  CASE 55 WHEN '55
ba90: 27 20 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20  ' THEN 'A' ELSE 
baa0: 27 42 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f  'B' END.} {B}.do
bab0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
bac0: 65 78 70 72 2d 32 33 2e 31 2e 37 20 7b 0a 20 20  expr-23.1.7 {.  
bad0: 53 45 4c 45 43 54 20 43 41 53 45 20 63 20 57 48  SELECT CASE c WH
bae0: 45 4e 20 27 35 35 27 20 54 48 45 4e 20 27 41 27  EN '55' THEN 'A'
baf0: 20 45 4c 53 45 20 27 42 27 20 45 4e 44 20 46 52   ELSE 'B' END FR
bb00: 4f 4d 20 74 31 0a 7d 20 7b 41 7d 0a 64 6f 5f 65  OM t1.} {A}.do_e
bb10: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
bb20: 70 72 2d 32 33 2e 31 2e 38 20 7b 0a 20 20 53 45  pr-23.1.8 {.  SE
bb30: 4c 45 43 54 20 43 41 53 45 20 27 33 34 2e 35 27  LECT CASE '34.5'
bb40: 20 57 48 45 4e 20 64 20 54 48 45 4e 20 27 41 27   WHEN d THEN 'A'
bb50: 20 45 4c 53 45 20 27 42 27 20 45 4e 44 20 46 52   ELSE 'B' END FR
bb60: 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65  OM t1.} {B}.do_e
bb70: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
bb80: 70 72 2d 32 33 2e 31 2e 39 20 7b 0a 20 20 53 45  pr-23.1.9 {.  SE
bb90: 4c 45 43 54 20 43 41 53 45 20 4e 55 4c 4c 20 57  LECT CASE NULL W
bba0: 48 45 4e 20 4e 55 4c 4c 20 54 48 45 4e 20 27 41  HEN NULL THEN 'A
bbb0: 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 0a 7d  ' ELSE 'B' END.}
bbc0: 20 7b 42 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45   {B}..# EVIDENCE
bbd0: 2d 4f 46 3a 20 52 2d 33 37 33 30 34 2d 33 39 34  -OF: R-37304-394
bbe0: 30 35 20 49 66 20 74 68 65 20 62 61 73 65 20 65  05 If the base e
bbf0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 4e 55 4c  xpression is NUL
bc00: 4c 20 74 68 65 6e 20 74 68 65 0a 23 20 72 65 73  L then the.# res
bc10: 75 6c 74 20 6f 66 20 74 68 65 20 43 41 53 45 20  ult of the CASE 
bc20: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 72 65  is always the re
bc30: 73 75 6c 74 20 6f 66 20 65 76 61 6c 75 61 74 69  sult of evaluati
bc40: 6e 67 20 74 68 65 20 45 4c 53 45 0a 23 20 65 78  ng the ELSE.# ex
bc50: 70 72 65 73 73 69 6f 6e 20 69 66 20 69 74 20 65  pression if it e
bc60: 78 69 73 74 73 2c 20 6f 72 20 4e 55 4c 4c 20 69  xists, or NULL i
bc70: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 23  f it does not..#
bc80: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
bc90: 20 65 5f 65 78 70 72 2d 32 34 2e 31 2e 31 20 7b   e_expr-24.1.1 {
bca0: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 4e  .  SELECT CASE N
bcb0: 55 4c 4c 20 57 48 45 4e 20 27 61 62 63 27 20 54  ULL WHEN 'abc' T
bcc0: 48 45 4e 20 27 41 27 20 57 48 45 4e 20 27 64 65  HEN 'A' WHEN 'de
bcd0: 66 27 20 54 48 45 4e 20 27 42 27 20 45 4e 44 3b  f' THEN 'B' END;
bce0: 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73  .} {{}}.do_execs
bcf0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
bd00: 34 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  4.1.2 {.  SELECT
bd10: 20 43 41 53 45 20 4e 55 4c 4c 20 57 48 45 4e 20   CASE NULL WHEN 
bd20: 27 61 62 63 27 20 54 48 45 4e 20 27 41 27 20 57  'abc' THEN 'A' W
bd30: 48 45 4e 20 27 64 65 66 27 20 54 48 45 4e 20 27  HEN 'def' THEN '
bd40: 42 27 20 45 4c 53 45 20 27 43 27 20 45 4e 44 3b  B' ELSE 'C' END;
bd50: 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56 49 44 45 4e  .} {C}..# EVIDEN
bd60: 43 45 2d 4f 46 3a 20 52 2d 35 36 32 38 30 2d 31  CE-OF: R-56280-1
bd70: 37 33 36 39 20 42 6f 74 68 20 66 6f 72 6d 73 20  7369 Both forms 
bd80: 6f 66 20 74 68 65 20 43 41 53 45 20 65 78 70 72  of the CASE expr
bd90: 65 73 73 69 6f 6e 20 75 73 65 20 6c 61 7a 79 2c  ession use lazy,
bda0: 0a 23 20 6f 72 20 73 68 6f 72 74 2d 63 69 72 63  .# or short-circ
bdb0: 75 69 74 2c 20 65 76 61 6c 75 61 74 69 6f 6e 2e  uit, evaluation.
bdc0: 0a 23 0a 73 65 74 20 76 61 72 6c 69 73 74 20 5b  .#.set varlist [
bdd0: 6c 69 73 74 5d 0a 66 6f 72 65 61 63 68 20 7b 61  list].foreach {a
bde0: 20 62 20 63 7d 20 7b 30 20 31 20 30 7d 20 62 72   b c} {0 1 0} br
bdf0: 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  eak.do_execsql_t
be00: 65 73 74 20 65 5f 65 78 70 72 2d 32 35 2e 31 2e  est e_expr-25.1.
be10: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  1 {.  SELECT CAS
be20: 45 20 57 48 45 4e 20 76 61 72 28 27 61 27 29 20  E WHEN var('a') 
be30: 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20  THEN 'A' .      
be40: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
be50: 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a  ('b') THEN 'B' .
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
be70: 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45 4e  EN var('c') THEN
be80: 20 27 43 27 20 0a 20 20 45 4e 44 0a 7d 20 7b 42   'C' .  END.} {B
be90: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72  }.do_test e_expr
bea0: 2d 32 35 2e 31 2e 32 20 7b 20 73 65 74 20 3a 3a  -25.1.2 { set ::
beb0: 76 61 72 6c 69 73 74 20 7d 20 7b 61 20 62 7d 0a  varlist } {a b}.
bec0: 73 65 74 20 76 61 72 6c 69 73 74 20 5b 6c 69 73  set varlist [lis
bed0: 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  t].do_execsql_te
bee0: 73 74 20 65 5f 65 78 70 72 2d 32 35 2e 31 2e 33  st e_expr-25.1.3
bef0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
bf00: 20 27 30 27 20 57 48 45 4e 20 76 61 72 28 27 61   '0' WHEN var('a
bf10: 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20  ') THEN 'A' .   
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
bf30: 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45  HEN var('b') THE
bf40: 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20  N 'B' .         
bf50: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
bf60: 72 28 27 63 27 29 20 54 48 45 4e 20 27 43 27 20  r('c') THEN 'C' 
bf70: 0a 20 20 45 4e 44 0a 7d 20 7b 41 7d 0a 64 6f 5f  .  END.} {A}.do_
bf80: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 35 2e 31  test e_expr-25.1
bf90: 2e 34 20 7b 20 73 65 74 20 3a 3a 76 61 72 6c 69  .4 { set ::varli
bfa0: 73 74 20 7d 20 7b 61 7d 0a 0a 23 20 45 56 49 44  st } {a}..# EVID
bfb0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 37 37 33  ENCE-OF: R-34773
bfc0: 2d 36 32 32 35 33 20 54 68 65 20 6f 6e 6c 79 20  -62253 The only 
bfd0: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
bfe0: 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
bff0: 0a 23 20 74 77 6f 20 43 41 53 45 20 65 78 70 72  .# two CASE expr
c000: 65 73 73 69 6f 6e 73 20 69 73 20 74 68 61 74 20  essions is that 
c010: 74 68 65 20 78 20 65 78 70 72 65 73 73 69 6f 6e  the x expression
c020: 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 65 78   is evaluated ex
c030: 61 63 74 6c 79 0a 23 20 6f 6e 63 65 20 69 6e 20  actly.# once in 
c040: 74 68 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c  the first exampl
c050: 65 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 65  e but might be e
c060: 76 61 6c 75 61 74 65 64 20 6d 75 6c 74 69 70 6c  valuated multipl
c070: 65 20 74 69 6d 65 73 20 69 6e 20 74 68 65 0a 23  e times in the.#
c080: 20 73 65 63 6f 6e 64 3a 20 43 41 53 45 20 78 20   second: CASE x 
c090: 57 48 45 4e 20 77 31 20 54 48 45 4e 20 72 31 20  WHEN w1 THEN r1 
c0a0: 57 48 45 4e 20 77 32 20 54 48 45 4e 20 72 32 20  WHEN w2 THEN r2 
c0b0: 45 4c 53 45 20 72 33 20 45 4e 44 20 43 41 53 45  ELSE r3 END CASE
c0c0: 20 57 48 45 4e 0a 23 20 78 3d 77 31 20 54 48 45   WHEN.# x=w1 THE
c0d0: 4e 20 72 31 20 57 48 45 4e 20 78 3d 77 32 20 54  N r1 WHEN x=w2 T
c0e0: 48 45 4e 20 72 32 20 45 4c 53 45 20 72 33 20 45  HEN r2 ELSE r3 E
c0f0: 4e 44 0a 23 0a 70 72 6f 63 20 63 65 76 61 6c 20  ND.#.proc ceval 
c100: 7b 78 7d 20 7b 0a 20 20 69 6e 63 72 20 3a 3a 65  {x} {.  incr ::e
c110: 76 61 6c 63 6f 75 6e 74 0a 20 20 72 65 74 75 72  valcount.  retur
c120: 6e 20 24 78 0a 7d 0a 64 62 20 66 75 6e 63 20 63  n $x.}.db func c
c130: 65 76 61 6c 20 63 65 76 61 6c 0a 73 65 74 20 3a  eval ceval.set :
c140: 3a 65 76 61 6c 63 6f 75 6e 74 20 30 0a 0a 64 6f  :evalcount 0..do
c150: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
c160: 65 78 70 72 2d 32 36 2e 31 2e 31 20 7b 0a 20 20  expr-26.1.1 {.  
c170: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
c180: 78 2c 20 77 31 2c 20 72 31 2c 20 77 32 2c 20 72  x, w1, r1, w2, r
c190: 32 2c 20 72 33 29 3b 0a 20 20 49 4e 53 45 52 54  2, r3);.  INSERT
c1a0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
c1b0: 31 2c 20 31 2c 20 27 52 31 27 2c 20 32 2c 20 27  1, 1, 'R1', 2, '
c1c0: 52 32 27 2c 20 27 52 33 27 29 3b 0a 20 20 49 4e  R2', 'R3');.  IN
c1d0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
c1e0: 55 45 53 28 32 2c 20 31 2c 20 27 52 31 27 2c 20  UES(2, 1, 'R1', 
c1f0: 32 2c 20 27 52 32 27 2c 20 27 52 33 27 29 3b 0a  2, 'R2', 'R3');.
c200: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
c210: 20 56 41 4c 55 45 53 28 33 2c 20 31 2c 20 27 52   VALUES(3, 1, 'R
c220: 31 27 2c 20 32 2c 20 27 52 32 27 2c 20 27 52 33  1', 2, 'R2', 'R3
c230: 27 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63  ');.} {}.do_exec
c240: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
c250: 32 36 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43  26.1.2 {.  SELEC
c260: 54 20 43 41 53 45 20 78 20 57 48 45 4e 20 77 31  T CASE x WHEN w1
c270: 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 77 32   THEN r1 WHEN w2
c280: 20 54 48 45 4e 20 72 32 20 45 4c 53 45 20 72 33   THEN r2 ELSE r3
c290: 20 45 4e 44 20 46 52 4f 4d 20 74 32 0a 7d 20 7b   END FROM t2.} {
c2a0: 52 31 20 52 32 20 52 33 7d 0a 64 6f 5f 65 78 65  R1 R2 R3}.do_exe
c2b0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
c2c0: 2d 32 36 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45  -26.1.3 {.  SELE
c2d0: 43 54 20 43 41 53 45 20 57 48 45 4e 20 78 3d 77  CT CASE WHEN x=w
c2e0: 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78  1 THEN r1 WHEN x
c2f0: 3d 77 32 20 54 48 45 4e 20 72 32 20 45 4c 53 45  =w2 THEN r2 ELSE
c300: 20 72 33 20 45 4e 44 20 46 52 4f 4d 20 74 32 0a   r3 END FROM t2.
c310: 7d 20 7b 52 31 20 52 32 20 52 33 7d 0a 0a 64 6f  } {R1 R2 R3}..do
c320: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
c330: 65 78 70 72 2d 32 36 2e 31 2e 34 20 7b 0a 20 20  expr-26.1.4 {.  
c340: 53 45 4c 45 43 54 20 43 41 53 45 20 63 65 76 61  SELECT CASE ceva
c350: 6c 28 78 29 20 57 48 45 4e 20 77 31 20 54 48 45  l(x) WHEN w1 THE
c360: 4e 20 72 31 20 57 48 45 4e 20 77 32 20 54 48 45  N r1 WHEN w2 THE
c370: 4e 20 72 32 20 45 4c 53 45 20 72 33 20 45 4e 44  N r2 ELSE r3 END
c380: 20 46 52 4f 4d 20 74 32 0a 7d 20 7b 52 31 20 52   FROM t2.} {R1 R
c390: 32 20 52 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  2 R3}.do_test e_
c3a0: 65 78 70 72 2d 32 36 2e 31 2e 35 20 7b 20 73 65  expr-26.1.5 { se
c3b0: 74 20 3a 3a 65 76 61 6c 63 6f 75 6e 74 20 7d 20  t ::evalcount } 
c3c0: 7b 33 7d 0a 73 65 74 20 3a 3a 65 76 61 6c 63 6f  {3}.set ::evalco
c3d0: 75 6e 74 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  unt 0.do_execsql
c3e0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e  _test e_expr-26.
c3f0: 31 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.6 {.  SELECT C
c400: 41 53 45 20 0a 20 20 20 20 57 48 45 4e 20 63 65  ASE .    WHEN ce
c410: 76 61 6c 28 78 29 3d 77 31 20 54 48 45 4e 20 72  val(x)=w1 THEN r
c420: 31 20 0a 20 20 20 20 57 48 45 4e 20 63 65 76 61  1 .    WHEN ceva
c430: 6c 28 78 29 3d 77 32 20 54 48 45 4e 20 72 32 20  l(x)=w2 THEN r2 
c440: 0a 20 20 20 20 45 4c 53 45 20 72 33 20 45 4e 44  .    ELSE r3 END
c450: 20 0a 20 20 46 52 4f 4d 20 74 32 0a 7d 20 7b 52   .  FROM t2.} {R
c460: 31 20 52 32 20 52 33 7d 0a 64 6f 5f 74 65 73 74  1 R2 R3}.do_test
c470: 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 36 20 7b   e_expr-26.1.6 {
c480: 20 73 65 74 20 3a 3a 65 76 61 6c 63 6f 75 6e 74   set ::evalcount
c490: 20 7d 20 7b 35 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d   } {5}...#------
c4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4e0: 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65  ---.# Test state
c4f0: 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f  ments related to
c500: 20 43 41 53 54 20 65 78 70 72 65 73 73 69 6f 6e   CAST expression
c510: 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
c520: 4f 46 3a 20 52 2d 36 35 30 37 39 2d 33 31 37 35  OF: R-65079-3175
c530: 38 20 41 70 70 6c 69 63 61 74 69 6f 6e 20 6f 66  8 Application of
c540: 20 61 20 43 41 53 54 20 65 78 70 72 65 73 73 69   a CAST expressi
c550: 6f 6e 20 69 73 0a 23 20 64 69 66 66 65 72 65 6e  on is.# differen
c560: 74 20 74 6f 20 61 70 70 6c 69 63 61 74 69 6f 6e  t to application
c570: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 61 66 66   of a column aff
c580: 69 6e 69 74 79 2c 20 61 73 20 77 69 74 68 20 61  inity, as with a
c590: 20 43 41 53 54 0a 23 20 65 78 70 72 65 73 73 69   CAST.# expressi
c5a0: 6f 6e 20 74 68 65 20 73 74 6f 72 61 67 65 20 63  on the storage c
c5b0: 6c 61 73 73 20 63 6f 6e 76 65 72 73 69 6f 6e 20  lass conversion 
c5c0: 69 73 20 66 6f 72 63 65 64 20 65 76 65 6e 20 69  is forced even i
c5d0: 66 20 69 74 20 69 73 20 6c 6f 73 73 79 0a 23 20  f it is lossy.# 
c5e0: 61 6e 64 20 69 72 72 72 65 76 65 72 73 69 62 6c  and irrreversibl
c5f0: 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  e..#.do_execsql_
c600: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 31  test e_expr-27.1
c610: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .1 {.  CREATE TA
c620: 42 4c 45 20 74 33 28 61 20 54 45 58 54 2c 20 62  BLE t3(a TEXT, b
c630: 20 52 45 41 4c 2c 20 63 20 49 4e 54 45 47 45 52   REAL, c INTEGER
c640: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
c650: 20 74 33 20 56 41 4c 55 45 53 28 58 27 35 35 35   t3 VALUES(X'555
c660: 36 35 35 27 2c 20 27 31 2e 32 33 61 62 63 27 2c  655', '1.23abc',
c670: 20 34 2e 35 29 3b 0a 20 20 53 45 4c 45 43 54 20   4.5);.  SELECT 
c680: 74 79 70 65 6f 66 28 61 29 2c 20 61 2c 20 74 79  typeof(a), a, ty
c690: 70 65 6f 66 28 62 29 2c 20 62 2c 20 74 79 70 65  peof(b), b, type
c6a0: 6f 66 28 63 29 2c 20 63 20 46 52 4f 4d 20 74 33  of(c), c FROM t3
c6b0: 3b 0a 7d 20 7b 62 6c 6f 62 20 55 56 55 20 74 65  ;.} {blob UVU te
c6c0: 78 74 20 31 2e 32 33 61 62 63 20 72 65 61 6c 20  xt 1.23abc real 
c6d0: 34 2e 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  4.5}.do_execsql_
c6e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 31  test e_expr-27.1
c6f0: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 0a 20  .2 {.  SELECT . 
c700: 20 20 20 74 79 70 65 6f 66 28 43 41 53 54 28 58     typeof(CAST(X
c710: 27 35 35 35 36 35 35 27 20 61 73 20 54 45 58 54  '555655' as TEXT
c720: 29 29 2c 20 43 41 53 54 28 58 27 35 35 35 36 35  )), CAST(X'55565
c730: 35 27 20 61 73 20 54 45 58 54 29 2c 0a 20 20 20  5' as TEXT),.   
c740: 20 74 79 70 65 6f 66 28 43 41 53 54 28 27 31 2e   typeof(CAST('1.
c750: 32 33 61 62 63 27 20 61 73 20 52 45 41 4c 29 29  23abc' as REAL))
c760: 2c 20 43 41 53 54 28 27 31 2e 32 33 61 62 63 27  , CAST('1.23abc'
c770: 20 61 73 20 52 45 41 4c 29 2c 0a 20 20 20 20 74   as REAL),.    t
c780: 79 70 65 6f 66 28 43 41 53 54 28 34 2e 35 20 61  ypeof(CAST(4.5 a
c790: 73 20 49 4e 54 45 47 45 52 29 29 2c 20 43 41 53  s INTEGER)), CAS
c7a0: 54 28 34 2e 35 20 61 73 20 49 4e 54 45 47 45 52  T(4.5 as INTEGER
c7b0: 29 0a 7d 20 7b 74 65 78 74 20 55 56 55 20 72 65  ).} {text UVU re
c7c0: 61 6c 20 31 2e 32 33 20 69 6e 74 65 67 65 72 20  al 1.23 integer 
c7d0: 34 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  4}..# EVIDENCE-O
c7e0: 46 3a 20 52 2d 32 37 32 32 35 2d 36 35 30 35 30  F: R-27225-65050
c7f0: 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   If the value of
c800: 20 3c 65 78 70 72 3e 20 69 73 20 4e 55 4c 4c 2c   <expr> is NULL,
c810: 20 74 68 65 6e 0a 23 20 74 68 65 20 72 65 73 75   then.# the resu
c820: 6c 74 20 6f 66 20 74 68 65 20 43 41 53 54 20 65  lt of the CAST e
c830: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73  xpression is als
c840: 6f 20 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f 65 78 70  o NULL..#.do_exp
c850: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
c860: 2e 32 2e 31 20 7b 20 43 41 53 54 28 4e 55 4c 4c  .2.1 { CAST(NULL
c870: 20 41 53 20 69 6e 74 65 67 65 72 29 20 7d 20 6e   AS integer) } n
c880: 75 6c 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72 5f 74  ull {}.do_expr_t
c890: 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 32 2e  est e_expr-27.2.
c8a0: 32 20 7b 20 43 41 53 54 28 4e 55 4c 4c 20 41 53  2 { CAST(NULL AS
c8b0: 20 74 65 78 74 29 20 7d 20 20 20 20 6e 75 6c 6c   text) }    null
c8c0: 20 7b 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74   {}.do_expr_test
c8d0: 20 65 5f 65 78 70 72 2d 32 37 2e 32 2e 33 20 7b   e_expr-27.2.3 {
c8e0: 20 43 41 53 54 28 4e 55 4c 4c 20 41 53 20 62 6c   CAST(NULL AS bl
c8f0: 6f 62 29 20 7d 20 20 20 20 6e 75 6c 6c 20 7b 7d  ob) }    null {}
c900: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
c910: 65 78 70 72 2d 32 37 2e 32 2e 34 20 7b 20 43 41  expr-27.2.4 { CA
c920: 53 54 28 4e 55 4c 4c 20 41 53 20 6e 75 6d 62 65  ST(NULL AS numbe
c930: 72 29 20 7d 20 20 6e 75 6c 6c 20 7b 7d 0a 0a 23  r) }  null {}..#
c940: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c950: 33 31 30 37 36 2d 32 33 35 37 35 20 43 61 73 74  31076-23575 Cast
c960: 69 6e 67 20 61 20 76 61 6c 75 65 20 74 6f 20 61  ing a value to a
c970: 20 3c 74 79 70 65 2d 6e 61 6d 65 3e 20 77 69 74   <type-name> wit
c980: 68 0a 23 20 6e 6f 20 61 66 66 69 6e 69 74 79 20  h.# no affinity 
c990: 63 61 75 73 65 73 20 74 68 65 20 76 61 6c 75 65  causes the value
c9a0: 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64   to be converted
c9b0: 20 69 6e 74 6f 20 61 20 42 4c 4f 42 2e 0a 23 0a   into a BLOB..#.
c9c0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
c9d0: 78 70 72 2d 32 37 2e 33 2e 31 20 7b 20 43 41 53  xpr-27.3.1 { CAS
c9e0: 54 28 27 61 62 63 27 20 41 53 20 62 6c 6f 62 29  T('abc' AS blob)
c9f0: 20 20 20 20 20 20 20 7d 20 62 6c 6f 62 20 61 62         } blob ab
ca00: 63 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  c.do_expr_test e
ca10: 5f 65 78 70 72 2d 32 37 2e 33 2e 32 20 7b 20 43  _expr-27.3.2 { C
ca20: 41 53 54 28 27 64 65 66 27 20 41 53 20 73 68 6f  AST('def' AS sho
ca30: 62 62 6c 6f 62 5f 78 29 20 7d 20 62 6c 6f 62 20  bblob_x) } blob 
ca40: 64 65 66 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  def.do_expr_test
ca50: 20 65 5f 65 78 70 72 2d 32 37 2e 33 2e 33 20 7b   e_expr-27.3.3 {
ca60: 20 43 41 53 54 28 27 67 68 69 27 20 41 53 20 61   CAST('ghi' AS a
ca70: 62 62 4c 4f 62 31 30 29 20 20 20 7d 20 62 6c 6f  bbLOb10)   } blo
ca80: 62 20 67 68 69 0a 0a 23 20 45 56 49 44 45 4e 43  b ghi..# EVIDENC
ca90: 45 2d 4f 46 3a 20 52 2d 32 32 39 35 36 2d 33 37  E-OF: R-22956-37
caa0: 37 35 34 20 43 61 73 74 69 6e 67 20 74 6f 20 61  754 Casting to a
cab0: 20 42 4c 4f 42 20 63 6f 6e 73 69 73 74 73 20 6f   BLOB consists o
cac0: 66 20 66 69 72 73 74 20 63 61 73 74 69 6e 67 0a  f first casting.
cad0: 23 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 54  # the value to T
cae0: 45 58 54 20 69 6e 20 74 68 65 20 65 6e 63 6f 64  EXT in the encod
caf0: 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
cb00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  ase connection, 
cb10: 74 68 65 6e 0a 23 20 69 6e 74 65 72 70 72 65 74  then.# interpret
cb20: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 69 6e  ing the resultin
cb30: 67 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  g byte sequence 
cb40: 61 73 20 61 20 42 4c 4f 42 20 69 6e 73 74 65 61  as a BLOB instea
cb50: 64 20 6f 66 20 61 73 20 54 45 58 54 2e 0a 23 0a  d of as TEXT..#.
cb60: 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f  do_qexpr_test e_
cb70: 65 78 70 72 2d 32 37 2e 34 2e 31 20 7b 20 43 41  expr-27.4.1 { CA
cb80: 53 54 28 27 67 68 69 27 20 41 53 20 62 6c 6f 62  ST('ghi' AS blob
cb90: 29 20 7d 20 58 27 36 37 36 38 36 39 27 0a 64 6f  ) } X'676869'.do
cba0: 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  _qexpr_test e_ex
cbb0: 70 72 2d 32 37 2e 34 2e 32 20 7b 20 43 41 53 54  pr-27.4.2 { CAST
cbc0: 28 34 35 36 20 41 53 20 62 6c 6f 62 29 20 7d 20  (456 AS blob) } 
cbd0: 20 20 58 27 33 34 33 35 33 36 27 0a 64 6f 5f 71    X'343536'.do_q
cbe0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
cbf0: 2d 32 37 2e 34 2e 33 20 7b 20 43 41 53 54 28 31  -27.4.3 { CAST(1
cc00: 2e 37 38 20 41 53 20 62 6c 6f 62 29 20 7d 20 20  .78 AS blob) }  
cc10: 58 27 33 31 32 45 33 37 33 38 27 0a 72 65 6e 61  X'312E3738'.rena
cc20: 6d 65 20 64 62 20 64 62 32 0a 73 71 6c 69 74 65  me db db2.sqlite
cc30: 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 69 66  3 db :memory:.if
cc40: 63 61 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20  capable {utf16} 
cc50: 7b 0a 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47  {.db eval { PRAG
cc60: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75  MA encoding = 'u
cc70: 74 66 2d 31 36 6c 65 27 20 7d 0a 64 6f 5f 71 65  tf-16le' }.do_qe
cc80: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
cc90: 32 37 2e 34 2e 34 20 7b 20 43 41 53 54 28 27 67  27.4.4 { CAST('g
cca0: 68 69 27 20 41 53 20 62 6c 6f 62 29 20 7d 20 58  hi' AS blob) } X
ccb0: 27 36 37 30 30 36 38 30 30 36 39 30 30 27 0a 64  '670068006900'.d
ccc0: 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65  o_qexpr_test e_e
ccd0: 78 70 72 2d 32 37 2e 34 2e 35 20 7b 20 43 41 53  xpr-27.4.5 { CAS
cce0: 54 28 34 35 36 20 41 53 20 62 6c 6f 62 29 20 7d  T(456 AS blob) }
ccf0: 20 20 20 58 27 33 34 30 30 33 35 30 30 33 36 30     X'34003500360
cd00: 30 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74  0'.do_qexpr_test
cd10: 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 36 20 7b   e_expr-27.4.6 {
cd20: 20 43 41 53 54 28 31 2e 37 38 20 41 53 20 62 6c   CAST(1.78 AS bl
cd30: 6f 62 29 20 7d 20 20 58 27 33 31 30 30 32 45 30  ob) }  X'31002E0
cd40: 30 33 37 30 30 33 38 30 30 27 0a 7d 0a 64 62 20  037003800'.}.db 
cd50: 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62  close.sqlite3 db
cd60: 20 3a 6d 65 6d 6f 72 79 3a 0a 64 62 20 65 76 61   :memory:.db eva
cd70: 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  l { PRAGMA encod
cd80: 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 62 65 27  ing = 'utf-16be'
cd90: 20 7d 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74   }.ifcapable {ut
cda0: 66 31 36 7d 20 7b 0a 64 6f 5f 71 65 78 70 72 5f  f16} {.do_qexpr_
cdb0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34  test e_expr-27.4
cdc0: 2e 37 20 7b 20 43 41 53 54 28 27 67 68 69 27 20  .7 { CAST('ghi' 
cdd0: 41 53 20 62 6c 6f 62 29 20 7d 20 58 27 30 30 36  AS blob) } X'006
cde0: 37 30 30 36 38 30 30 36 39 27 0a 64 6f 5f 71 65  700680069'.do_qe
cdf0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
ce00: 32 37 2e 34 2e 38 20 7b 20 43 41 53 54 28 34 35  27.4.8 { CAST(45
ce10: 36 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 20 58  6 AS blob) }   X
ce20: 27 30 30 33 34 30 30 33 35 30 30 33 36 27 0a 64  '003400350036'.d
ce30: 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65  o_qexpr_test e_e
ce40: 78 70 72 2d 32 37 2e 34 2e 39 20 7b 20 43 41 53  xpr-27.4.9 { CAS
ce50: 54 28 31 2e 37 38 20 41 53 20 62 6c 6f 62 29 20  T(1.78 AS blob) 
ce60: 7d 20 20 58 27 30 30 33 31 30 30 32 45 30 30 33  }  X'0031002E003
ce70: 37 30 30 33 38 27 0a 7d 0a 64 62 20 63 6c 6f 73  70038'.}.db clos
ce80: 65 0a 72 65 6e 61 6d 65 20 64 62 32 20 64 62 0a  e.rename db2 db.
ce90: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
cea0: 52 2d 30 34 32 30 37 2d 33 37 39 38 31 20 54 6f  R-04207-37981 To
ceb0: 20 63 61 73 74 20 61 20 42 4c 4f 42 20 76 61 6c   cast a BLOB val
cec0: 75 65 20 74 6f 20 54 45 58 54 2c 20 74 68 65 20  ue to TEXT, the 
ced0: 73 65 71 75 65 6e 63 65 0a 23 20 6f 66 20 62 79  sequence.# of by
cee0: 74 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  tes that make up
cef0: 20 74 68 65 20 42 4c 4f 42 20 69 73 20 69 6e 74   the BLOB is int
cf00: 65 72 70 72 65 74 65 64 20 61 73 20 74 65 78 74  erpreted as text
cf10: 20 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 0a 23   encoded using.#
cf20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 6e   the database en
cf30: 63 6f 64 69 6e 67 2e 0a 23 0a 64 6f 5f 65 78 70  coding..#.do_exp
cf40: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38  r_test e_expr-28
cf50: 2e 31 2e 31 20 7b 20 43 41 53 54 20 28 58 27 36  .1.1 { CAST (X'6
cf60: 37 36 38 36 39 27 20 41 53 20 74 65 78 74 29 20  76869' AS text) 
cf70: 7d 20 74 65 78 74 20 67 68 69 0a 64 6f 5f 65 78  } text ghi.do_ex
cf80: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
cf90: 38 2e 31 2e 32 20 7b 20 43 41 53 54 20 28 58 27  8.1.2 { CAST (X'
cfa0: 36 37 30 30 36 38 30 30 36 39 30 30 27 20 41 53  670068006900' AS
cfb0: 20 74 65 78 74 29 20 7d 20 74 65 78 74 20 67 0a   text) } text g.
cfc0: 72 65 6e 61 6d 65 20 64 62 20 64 62 32 0a 73 71  rename db db2.sq
cfd0: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
cfe0: 3a 0a 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47  :.db eval { PRAG
cff0: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75  MA encoding = 'u
d000: 74 66 2d 31 36 6c 65 27 20 7d 0a 69 66 63 61 70  tf-16le' }.ifcap
d010: 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a 64  able {utf16} {.d
d020: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d030: 70 72 2d 32 38 2e 31 2e 33 20 7b 20 43 41 53 54  pr-28.1.3 { CAST
d040: 20 28 58 27 36 37 36 38 36 39 27 20 41 53 20 74   (X'676869' AS t
d050: 65 78 74 29 20 3d 3d 20 27 67 68 69 27 20 7d 20  ext) == 'ghi' } 
d060: 69 6e 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70  integer 0.do_exp
d070: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38  r_test e_expr-28
d080: 2e 31 2e 34 20 7b 20 43 41 53 54 20 28 58 27 36  .1.4 { CAST (X'6
d090: 37 30 30 36 38 30 30 36 39 30 30 27 20 41 53 20  70068006900' AS 
d0a0: 74 65 78 74 29 20 7d 20 74 65 78 74 20 67 68 69  text) } text ghi
d0b0: 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61  .}.db close.rena
d0c0: 6d 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49  me db2 db..# EVI
d0d0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 32 33  DENCE-OF: R-2223
d0e0: 35 2d 34 37 30 30 36 20 43 61 73 74 69 6e 67 20  5-47006 Casting 
d0f0: 61 6e 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45  an INTEGER or RE
d100: 41 4c 20 76 61 6c 75 65 20 69 6e 74 6f 20 54 45  AL value into TE
d110: 58 54 0a 23 20 72 65 6e 64 65 72 73 20 74 68 65  XT.# renders the
d120: 20 76 61 6c 75 65 20 61 73 20 69 66 20 76 69 61   value as if via
d130: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
d140: 66 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  f() except that 
d150: 74 68 65 0a 23 20 72 65 73 75 6c 74 69 6e 67 20  the.# resulting 
d160: 54 45 58 54 20 75 73 65 73 20 74 68 65 20 65 6e  TEXT uses the en
d170: 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 64 61  coding of the da
d180: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
d190: 6e 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73  n..#.do_expr_tes
d1a0: 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 31 20  t e_expr-28.2.1 
d1b0: 7b 20 43 41 53 54 20 28 31 20 41 53 20 74 65 78  { CAST (1 AS tex
d1c0: 74 29 20 20 20 7d 20 20 20 20 20 74 65 78 74 20  t)   }     text 
d1d0: 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  1.do_expr_test e
d1e0: 5f 65 78 70 72 2d 32 38 2e 32 2e 32 20 7b 20 43  _expr-28.2.2 { C
d1f0: 41 53 54 20 28 34 35 20 41 53 20 74 65 78 74 29  AST (45 AS text)
d200: 20 20 7d 20 20 20 20 20 74 65 78 74 20 34 35 0a    }     text 45.
d210: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d220: 78 70 72 2d 32 38 2e 32 2e 33 20 7b 20 43 41 53  xpr-28.2.3 { CAS
d230: 54 20 28 2d 34 35 20 41 53 20 74 65 78 74 29 20  T (-45 AS text) 
d240: 7d 20 20 20 20 20 74 65 78 74 20 2d 34 35 0a 64  }     text -45.d
d250: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d260: 70 72 2d 32 38 2e 32 2e 34 20 7b 20 43 41 53 54  pr-28.2.4 { CAST
d270: 20 28 38 2e 38 20 41 53 20 74 65 78 74 29 20 20   (8.8 AS text)  
d280: 20 20 7d 20 20 74 65 78 74 20 38 2e 38 0a 64 6f    }  text 8.8.do
d290: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d2a0: 72 2d 32 38 2e 32 2e 35 20 7b 20 43 41 53 54 20  r-28.2.5 { CAST 
d2b0: 28 32 2e 33 65 2b 35 20 41 53 20 74 65 78 74 29  (2.3e+5 AS text)
d2c0: 20 7d 20 20 74 65 78 74 20 32 33 30 30 30 30 2e   }  text 230000.
d2d0: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
d2e0: 5f 65 78 70 72 2d 32 38 2e 32 2e 36 20 7b 20 43  _expr-28.2.6 { C
d2f0: 41 53 54 20 28 2d 32 2e 33 65 2d 35 20 41 53 20  AST (-2.3e-5 AS 
d300: 74 65 78 74 29 20 7d 20 74 65 78 74 20 2d 32 2e  text) } text -2.
d310: 33 65 2d 30 35 0a 64 6f 5f 65 78 70 72 5f 74 65  3e-05.do_expr_te
d320: 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 37  st e_expr-28.2.7
d330: 20 7b 20 43 41 53 54 20 28 30 2e 30 20 41 53 20   { CAST (0.0 AS 
d340: 74 65 78 74 29 20 7d 20 20 20 20 20 74 65 78 74  text) }     text
d350: 20 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73   0.0.do_expr_tes
d360: 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 37 20  t e_expr-28.2.7 
d370: 7b 20 43 41 53 54 20 28 30 20 41 53 20 74 65 78  { CAST (0 AS tex
d380: 74 29 20 7d 20 20 20 20 20 20 20 74 65 78 74 20  t) }       text 
d390: 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  0..# EVIDENCE-OF
d3a0: 3a 20 52 2d 32 36 33 34 36 2d 33 36 34 34 33 20  : R-26346-36443 
d3b0: 57 68 65 6e 20 63 61 73 74 69 6e 67 20 61 20 42  When casting a B
d3c0: 4c 4f 42 20 76 61 6c 75 65 20 74 6f 20 61 20 52  LOB value to a R
d3d0: 45 41 4c 2c 20 74 68 65 0a 23 20 76 61 6c 75 65  EAL, the.# value
d3e0: 20 69 73 20 66 69 72 73 74 20 63 6f 6e 76 65 72   is first conver
d3f0: 74 65 64 20 74 6f 20 54 45 58 54 2e 0a 23 0a 64  ted to TEXT..#.d
d400: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d410: 70 72 2d 32 39 2e 31 2e 31 20 7b 20 43 41 53 54  pr-29.1.1 { CAST
d420: 20 28 58 27 33 31 32 45 33 32 33 33 27 20 41 53   (X'312E3233' AS
d430: 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e   REAL) } real 1.
d440: 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  23.do_expr_test 
d450: 65 5f 65 78 70 72 2d 32 39 2e 31 2e 32 20 7b 20  e_expr-29.1.2 { 
d460: 43 41 53 54 20 28 58 27 33 32 33 33 33 30 32 45  CAST (X'3233302E
d470: 33 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  30' AS REAL) } r
d480: 65 61 6c 20 32 33 30 2e 30 0a 64 6f 5f 65 78 70  eal 230.0.do_exp
d490: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
d4a0: 2e 31 2e 33 20 7b 20 43 41 53 54 20 28 58 27 32  .1.3 { CAST (X'2
d4b0: 44 33 39 32 45 33 38 33 37 27 20 41 53 20 52 45  D392E3837' AS RE
d4c0: 41 4c 29 20 7d 20 72 65 61 6c 20 2d 39 2e 38 37  AL) } real -9.87
d4d0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d4e0: 65 78 70 72 2d 32 39 2e 31 2e 34 20 7b 20 43 41  expr-29.1.4 { CA
d4f0: 53 54 20 28 58 27 33 30 32 45 33 30 33 30 33 30  ST (X'302E303030
d500: 33 31 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  31' AS REAL) } r
d510: 65 61 6c 20 30 2e 30 30 30 31 0a 72 65 6e 61 6d  eal 0.0001.renam
d520: 65 20 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33  e db db2.sqlite3
d530: 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 69 66 63   db :memory:.ifc
d540: 61 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b  apable {utf16} {
d550: 0a 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d  .db eval { PRAGM
d560: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74  A encoding = 'ut
d570: 66 2d 31 36 6c 65 27 20 7d 0a 64 6f 5f 65 78 70  f-16le' }.do_exp
d580: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
d590: 2e 31 2e 35 20 7b 20 0a 20 20 20 20 43 41 53 54  .1.5 { .    CAST
d5a0: 20 28 58 27 33 31 30 30 32 45 30 30 33 32 30 30   (X'31002E003200
d5b0: 33 33 30 30 27 20 41 53 20 52 45 41 4c 29 20 7d  3300' AS REAL) }
d5c0: 20 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65 78   real 1.23.do_ex
d5d0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d5e0: 39 2e 31 2e 36 20 7b 20 0a 20 20 20 20 43 41 53  9.1.6 { .    CAS
d5f0: 54 20 28 58 27 33 32 30 30 33 33 30 30 33 30 30  T (X'32003300300
d600: 30 32 45 30 30 33 30 30 30 27 20 41 53 20 52 45  02E003000' AS RE
d610: 41 4c 29 20 7d 20 72 65 61 6c 20 32 33 30 2e 30  AL) } real 230.0
d620: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d630: 65 78 70 72 2d 32 39 2e 31 2e 37 20 7b 20 0a 20  expr-29.1.7 { . 
d640: 20 20 20 43 41 53 54 20 28 58 27 32 44 30 30 33     CAST (X'2D003
d650: 39 30 30 32 45 30 30 33 38 30 30 33 37 30 30 27  9002E0038003700'
d660: 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c   AS REAL) } real
d670: 20 2d 39 2e 38 37 0a 64 6f 5f 65 78 70 72 5f 74   -9.87.do_expr_t
d680: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e  est e_expr-29.1.
d690: 38 20 7b 20 0a 20 20 20 20 43 41 53 54 20 28 58  8 { .    CAST (X
d6a0: 27 33 30 30 30 32 45 30 30 33 30 30 30 33 30 30  '30002E003000300
d6b0: 30 33 30 30 30 33 31 30 30 27 20 41 53 20 52 45  030003100' AS RE
d6c0: 41 4c 29 20 7d 20 72 65 61 6c 20 30 2e 30 30 30  AL) } real 0.000
d6d0: 31 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e  1.}.db close.ren
d6e0: 61 6d 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56  ame db2 db..# EV
d6f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 38  IDENCE-OF: R-548
d700: 39 38 2d 33 34 35 35 34 20 57 68 65 6e 20 63 61  98-34554 When ca
d710: 73 74 69 6e 67 20 61 20 54 45 58 54 20 76 61 6c  sting a TEXT val
d720: 75 65 20 74 6f 20 52 45 41 4c 2c 20 74 68 65 0a  ue to REAL, the.
d730: 23 20 6c 6f 6e 67 65 73 74 20 70 6f 73 73 69 62  # longest possib
d740: 6c 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  le prefix of the
d750: 20 76 61 6c 75 65 20 74 68 61 74 20 63 61 6e 20   value that can 
d760: 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  be interpreted a
d770: 73 20 61 20 72 65 61 6c 0a 23 20 6e 75 6d 62 65  s a real.# numbe
d780: 72 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  r is extracted f
d790: 72 6f 6d 20 74 68 65 20 54 45 58 54 20 76 61 6c  rom the TEXT val
d7a0: 75 65 20 61 6e 64 20 74 68 65 20 72 65 6d 61 69  ue and the remai
d7b0: 6e 64 65 72 20 69 67 6e 6f 72 65 64 2e 0a 23 0a  nder ignored..#.
d7c0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d7d0: 78 70 72 2d 32 39 2e 32 2e 31 20 7b 20 43 41 53  xpr-29.2.1 { CAS
d7e0: 54 28 27 31 2e 32 33 61 62 63 64 27 20 41 53 20  T('1.23abcd' AS 
d7f0: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32  REAL) } real 1.2
d800: 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  3.do_expr_test e
d810: 5f 65 78 70 72 2d 32 39 2e 32 2e 32 20 7b 20 43  _expr-29.2.2 { C
d820: 41 53 54 28 27 31 2e 34 35 2e 32 33 61 62 63 64  AST('1.45.23abcd
d830: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
d840: 6c 20 31 2e 34 35 0a 64 6f 5f 65 78 70 72 5f 74  l 1.45.do_expr_t
d850: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 32 2e  est e_expr-29.2.
d860: 33 20 7b 20 43 41 53 54 28 27 2d 32 2e 31 32 65  3 { CAST('-2.12e
d870: 2d 30 31 41 42 43 27 20 41 53 20 52 45 41 4c 29  -01ABC' AS REAL)
d880: 20 7d 20 72 65 61 6c 20 2d 30 2e 32 31 32 0a 64   } real -0.212.d
d890: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d8a0: 70 72 2d 32 39 2e 32 2e 34 20 7b 20 43 41 53 54  pr-29.2.4 { CAST
d8b0: 28 27 31 20 32 20 33 20 34 27 20 41 53 20 52 45  ('1 2 3 4' AS RE
d8c0: 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 30 0a 0a  AL) } real 1.0..
d8d0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
d8e0: 2d 31 31 33 32 31 2d 34 37 34 32 37 20 41 6e 79  -11321-47427 Any
d8f0: 20 6c 65 61 64 69 6e 67 20 73 70 61 63 65 73 20   leading spaces 
d900: 69 6e 20 74 68 65 20 54 45 58 54 20 76 61 6c 75  in the TEXT valu
d910: 65 20 61 72 65 0a 23 20 69 67 6e 6f 72 65 64 20  e are.# ignored 
d920: 77 68 65 6e 20 63 6f 6e 76 65 72 67 69 6e 67 20  when converging 
d930: 66 72 6f 6d 20 54 45 58 54 20 74 6f 20 52 45 41  from TEXT to REA
d940: 4c 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73  L..#.do_expr_tes
d950: 74 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e 31 20  t e_expr-29.3.1 
d960: 7b 20 43 41 53 54 28 27 20 31 2e 32 33 61 62 63  { CAST(' 1.23abc
d970: 64 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  d' AS REAL) } re
d980: 61 6c 20 31 2e 32 33 0a 64 6f 5f 65 78 70 72 5f  al 1.23.do_expr_
d990: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 33  test e_expr-29.3
d9a0: 2e 32 20 7b 20 43 41 53 54 28 27 20 20 20 20 31  .2 { CAST('    1
d9b0: 2e 34 35 2e 32 33 61 62 63 64 27 20 41 53 20 52  .45.23abcd' AS R
d9c0: 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 34 35  EAL) } real 1.45
d9d0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d9e0: 65 78 70 72 2d 32 39 2e 33 2e 33 20 7b 20 43 41  expr-29.3.3 { CA
d9f0: 53 54 28 27 20 20 20 2d 32 2e 31 32 65 2d 30 31  ST('   -2.12e-01
da00: 41 42 43 27 20 41 53 20 52 45 41 4c 29 20 7d 20  ABC' AS REAL) } 
da10: 72 65 61 6c 20 2d 30 2e 32 31 32 0a 64 6f 5f 65  real -0.212.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 33 2e 34 20 7b 20 43 41 53 54 28 27 20  29.3.4 { CAST(' 
da40: 31 20 32 20 33 20 34 27 20 41 53 20 52 45 41 4c  1 2 3 4' AS REAL
da50: 29 20 7d 20 72 65 61 6c 20 31 2e 30 0a 0a 23 20  ) } real 1.0..# 
da60: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
da70: 32 36 36 32 2d 32 38 32 31 38 20 49 66 20 74 68  2662-28218 If th
da80: 65 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78  ere is no prefix
da90: 20 74 68 61 74 20 63 61 6e 20 62 65 0a 23 20 69   that can be.# i
daa0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
dab0: 72 65 61 6c 20 6e 75 6d 62 65 72 2c 20 74 68 65  real number, the
dac0: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63   result of the c
dad0: 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 30 2e 30  onversion is 0.0
dae0: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
daf0: 20 65 5f 65 78 70 72 2d 32 39 2e 34 2e 31 20 7b   e_expr-29.4.1 {
db00: 20 43 41 53 54 28 27 27 20 41 53 20 52 45 41 4c   CAST('' AS REAL
db10: 29 20 7d 20 72 65 61 6c 20 30 2e 30 0a 64 6f 5f  ) } real 0.0.do_
db20: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
db30: 2d 32 39 2e 34 2e 32 20 7b 20 43 41 53 54 28 27  -29.4.2 { CAST('
db40: 6e 6f 74 20 61 20 6e 75 6d 62 65 72 27 20 41 53  not a number' AS
db50: 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 30 2e   REAL) } real 0.
db60: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
db70: 5f 65 78 70 72 2d 32 39 2e 34 2e 33 20 7b 20 43  _expr-29.4.3 { C
db80: 41 53 54 28 27 58 58 49 27 20 41 53 20 52 45 41  AST('XXI' AS REA
db90: 4c 29 20 7d 20 72 65 61 6c 20 30 2e 30 0a 0a 23  L) } real 0.0..#
dba0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
dbb0: 32 31 38 32 39 2d 31 34 35 36 33 20 57 68 65 6e  21829-14563 When
dbc0: 20 63 61 73 74 69 6e 67 20 61 20 42 4c 4f 42 20   casting a BLOB 
dbd0: 76 61 6c 75 65 20 74 6f 20 49 4e 54 45 47 45 52  value to INTEGER
dbe0: 2c 20 74 68 65 0a 23 20 76 61 6c 75 65 20 69 73  , the.# value is
dbf0: 20 66 69 72 73 74 20 63 6f 6e 76 65 72 74 65 64   first converted
dc00: 20 74 6f 20 54 45 58 54 2e 0a 23 0a 64 6f 5f 65   to TEXT..#.do_e
dc10: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
dc20: 33 30 2e 31 2e 31 20 7b 20 43 41 53 54 28 58 27  30.1.1 { CAST(X'
dc30: 33 31 33 32 33 33 27 20 41 53 20 49 4e 54 45 47  313233' AS INTEG
dc40: 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 31 32  ER) } integer 12
dc50: 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  3.do_expr_test e
dc60: 5f 65 78 70 72 2d 33 30 2e 31 2e 32 20 7b 20 43  _expr-30.1.2 { C
dc70: 41 53 54 28 58 27 32 44 33 36 33 37 33 38 27 20  AST(X'2D363738' 
dc80: 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e  AS INTEGER) } in
dc90: 74 65 67 65 72 20 2d 36 37 38 0a 64 6f 5f 65 78  teger -678.do_ex
dca0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
dcb0: 30 2e 31 2e 33 20 7b 20 0a 20 20 43 41 53 54 28  0.1.3 { .  CAST(
dcc0: 58 27 33 31 33 30 33 30 33 30 33 30 33 30 33 30  X'31303030303030
dcd0: 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 0a 7d  ' AS INTEGER) .}
dce0: 20 69 6e 74 65 67 65 72 20 31 30 30 30 30 30 30   integer 1000000
dcf0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
dd00: 65 78 70 72 2d 33 30 2e 31 2e 34 20 7b 20 0a 20  expr-30.1.4 { . 
dd10: 20 43 41 53 54 28 58 27 32 44 33 31 33 31 33 32   CAST(X'2D313132
dd20: 33 35 33 38 33 39 33 39 33 39 33 30 33 36 33 38  3538393939303638
dd30: 33 34 33 32 33 36 33 32 33 34 27 20 41 53 20 49  3432363234' AS I
dd40: 4e 54 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67  NTEGER) .} integ
dd50: 65 72 20 2d 31 31 32 35 38 39 39 39 30 36 38 34  er -112589990684
dd60: 32 36 32 34 0a 0a 72 65 6e 61 6d 65 20 64 62 20  2624..rename db 
dd70: 64 62 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a  db2.sqlite3 db :
dd80: 6d 65 6d 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c  memory:.ifcapabl
dd90: 65 20 7b 75 74 66 31 36 7d 20 7b 0a 65 78 65 63  e {utf16} {.exec
dda0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63  sql { PRAGMA enc
ddb0: 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 62  oding = 'utf-16b
ddc0: 65 27 20 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73  e' }.do_expr_tes
ddd0: 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 35 20  t e_expr-30.1.5 
dde0: 7b 20 43 41 53 54 28 58 27 30 30 33 31 30 30 33  { CAST(X'0031003
ddf0: 32 30 30 33 33 27 20 41 53 20 49 4e 54 45 47 45  20033' AS INTEGE
de00: 52 29 20 7d 20 69 6e 74 65 67 65 72 20 31 32 33  R) } integer 123
de10: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
de20: 65 78 70 72 2d 33 30 2e 31 2e 36 20 7b 20 43 41  expr-30.1.6 { CA
de30: 53 54 28 58 27 30 30 32 44 30 30 33 36 30 30 33  ST(X'002D0036003
de40: 37 30 30 33 38 27 20 41 53 20 49 4e 54 45 47 45  70038' AS INTEGE
de50: 52 29 20 7d 20 69 6e 74 65 67 65 72 20 2d 36 37  R) } integer -67
de60: 38 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  8.do_expr_test e
de70: 5f 65 78 70 72 2d 33 30 2e 31 2e 37 20 7b 20 0a  _expr-30.1.7 { .
de80: 20 20 43 41 53 54 28 58 27 30 30 33 31 30 30 33    CAST(X'0031003
de90: 30 30 30 33 30 30 30 33 30 30 30 33 30 30 30 33  0003000300030003
dea0: 30 30 30 33 30 27 20 41 53 20 49 4e 54 45 47 45  00030' AS INTEGE
deb0: 52 29 20 0a 7d 20 69 6e 74 65 67 65 72 20 31 30  R) .} integer 10
dec0: 30 30 30 30 30 0a 64 6f 5f 65 78 70 72 5f 74 65  00000.do_expr_te
ded0: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 38  st e_expr-30.1.8
dee0: 20 7b 20 0a 20 20 43 41 53 54 28 58 27 30 30 32   { .  CAST(X'002
def0: 44 30 30 33 31 30 30 33 31 30 30 33 32 30 30 33  D003100310032003
df00: 35 30 30 33 38 30 30 33 39 30 30 33 39 30 30 33  5003800390039003
df10: 39 30 30 33 30 30 30 33 36 30 30 33 38 30 30 33  9003000360038003
df20: 34 30 30 33 32 30 30 33 36 30 30 33 32 30 30 33  4003200360032003
df30: 34 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 0a  4' AS INTEGER) .
df40: 7d 20 69 6e 74 65 67 65 72 20 2d 31 31 32 35 38  } integer -11258
df50: 39 39 39 30 36 38 34 32 36 32 34 0a 7d 0a 64 62  99906842624.}.db
df60: 20 63 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62   close.rename db
df70: 32 20 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45  2 db..# EVIDENCE
df80: 2d 4f 46 3a 20 52 2d 34 37 36 31 32 2d 34 35 38  -OF: R-47612-458
df90: 34 32 20 57 68 65 6e 20 63 61 73 74 69 6e 67 20  42 When casting 
dfa0: 61 20 54 45 58 54 20 76 61 6c 75 65 20 74 6f 20  a TEXT value to 
dfb0: 49 4e 54 45 47 45 52 2c 20 74 68 65 0a 23 20 6c  INTEGER, the.# l
dfc0: 6f 6e 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20  ongest possible 
dfd0: 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 76 61  prefix of the va
dfe0: 6c 75 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  lue that can be 
dff0: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
e000: 6e 0a 23 20 69 6e 74 65 67 65 72 20 6e 75 6d 62  n.# integer numb
e010: 65 72 20 69 73 20 65 78 74 72 61 63 74 65 64 20  er is extracted 
e020: 66 72 6f 6d 20 74 68 65 20 54 45 58 54 20 76 61  from the TEXT va
e030: 6c 75 65 20 61 6e 64 20 74 68 65 20 72 65 6d 61  lue and the rema
e040: 69 6e 64 65 72 0a 23 20 69 67 6e 6f 72 65 64 2e  inder.# ignored.
e050: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
e060: 65 5f 65 78 70 72 2d 33 30 2e 32 2e 31 20 7b 20  e_expr-30.2.1 { 
e070: 43 41 53 54 28 27 31 32 33 61 62 63 64 27 20 41  CAST('123abcd' A
e080: 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72  S INT) } integer
e090: 20 31 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73   123.do_expr_tes
e0a0: 74 20 65 5f 65 78 70 72 2d 33 30 2e 32 2e 32 20  t e_expr-30.2.2 
e0b0: 7b 20 43 41 53 54 28 27 31 34 35 32 33 61 62 63  { CAST('14523abc
e0c0: 64 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74  d' AS INT) } int
e0d0: 65 67 65 72 20 31 34 35 32 33 0a 64 6f 5f 65 78  eger 14523.do_ex
e0e0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e0f0: 30 2e 32 2e 33 20 7b 20 43 41 53 54 28 27 2d 32  0.2.3 { CAST('-2
e100: 2e 31 32 65 2d 30 31 41 42 43 27 20 41 53 20 49  .12e-01ABC' AS I
e110: 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 2d 32  NT) } integer -2
e120: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e130: 65 78 70 72 2d 33 30 2e 32 2e 34 20 7b 20 43 41  expr-30.2.4 { CA
e140: 53 54 28 27 31 20 32 20 33 20 34 27 20 41 53 20  ST('1 2 3 4' AS 
e150: 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31  INT) } integer 1
e160: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
e170: 20 52 2d 33 34 34 30 30 2d 33 33 37 37 32 20 41   R-34400-33772 A
e180: 6e 79 20 6c 65 61 64 69 6e 67 20 73 70 61 63 65  ny leading space
e190: 73 20 69 6e 20 74 68 65 20 54 45 58 54 20 76 61  s in the TEXT va
e1a0: 6c 75 65 20 77 68 65 6e 0a 23 20 63 6f 6e 76 65  lue when.# conve
e1b0: 72 74 69 6e 67 20 66 72 6f 6d 20 54 45 58 54 20  rting from TEXT 
e1c0: 74 6f 20 49 4e 54 45 47 45 52 20 61 72 65 20 69  to INTEGER are i
e1d0: 67 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 70  gnored..#.do_exp
e1e0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
e1f0: 2e 33 2e 31 20 7b 20 43 41 53 54 28 27 20 20 20  .3.1 { CAST('   
e200: 31 32 33 61 62 63 64 27 20 41 53 20 49 4e 54 29  123abcd' AS INT)
e210: 20 7d 20 69 6e 74 65 67 65 72 20 31 32 33 0a 64   } integer 123.d
e220: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
e230: 70 72 2d 33 30 2e 33 2e 32 20 7b 20 43 41 53 54  pr-30.3.2 { CAST
e240: 28 27 20 20 31 34 35 32 33 61 62 63 64 27 20 41  ('  14523abcd' A
e250: 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72  S INT) } integer
e260: 20 31 34 35 32 33 0a 64 6f 5f 65 78 70 72 5f 74   14523.do_expr_t
e270: 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 33 2e  est e_expr-30.3.
e280: 33 20 7b 20 43 41 53 54 28 27 20 2d 32 2e 31 32  3 { CAST(' -2.12
e290: 65 2d 30 31 41 42 43 27 20 41 53 20 49 4e 54 29  e-01ABC' AS INT)
e2a0: 20 7d 20 69 6e 74 65 67 65 72 20 2d 32 0a 64 6f   } integer -2.do
e2b0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e2c0: 72 2d 33 30 2e 33 2e 34 20 7b 20 43 41 53 54 28  r-30.3.4 { CAST(
e2d0: 27 20 20 20 20 20 31 20 32 20 33 20 34 27 20 41  '     1 2 3 4' A
e2e0: 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72  S INT) } integer
e2f0: 20 31 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f   1..# EVIDENCE-O
e300: 46 3a 20 52 2d 34 33 31 36 34 2d 34 34 32 37 36  F: R-43164-44276
e310: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
e320: 70 72 65 66 69 78 20 74 68 61 74 20 63 61 6e 20  prefix that can 
e330: 62 65 0a 23 20 69 6e 74 65 72 70 72 65 74 65 64  be.# interpreted
e340: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   as an integer n
e350: 75 6d 62 65 72 2c 20 74 68 65 20 72 65 73 75 6c  umber, the resul
e360: 74 20 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73  t of the convers
e370: 69 6f 6e 20 69 73 20 30 2e 0a 23 0a 64 6f 5f 65  ion is 0..#.do_e
e380: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
e390: 33 30 2e 34 2e 31 20 7b 20 43 41 53 54 28 27 27  30.4.1 { CAST(''
e3a0: 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69   AS INTEGER) } i
e3b0: 6e 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72  nteger 0.do_expr
e3c0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
e3d0: 34 2e 32 20 7b 20 43 41 53 54 28 27 6e 6f 74 20  4.2 { CAST('not 
e3e0: 61 20 6e 75 6d 62 65 72 27 20 41 53 20 49 4e 54  a number' AS INT
e3f0: 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20  EGER) } integer 
e400: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
e410: 5f 65 78 70 72 2d 33 30 2e 34 2e 33 20 7b 20 43  _expr-30.4.3 { C
e420: 41 53 54 28 27 58 58 49 27 20 41 53 20 49 4e 54  AST('XXI' AS INT
e430: 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20  EGER) } integer 
e440: 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  0..# EVIDENCE-OF
e450: 3a 20 52 2d 30 30 37 34 31 2d 33 38 37 37 36 20  : R-00741-38776 
e460: 41 20 63 61 73 74 20 6f 66 20 61 20 52 45 41 4c  A cast of a REAL
e470: 20 76 61 6c 75 65 20 69 6e 74 6f 20 61 6e 20 49   value into an I
e480: 4e 54 45 47 45 52 20 77 69 6c 6c 0a 23 20 74 72  NTEGER will.# tr
e490: 75 6e 63 61 74 65 20 74 68 65 20 66 72 61 63 74  uncate the fract
e4a0: 69 6f 6e 61 6c 20 70 61 72 74 20 6f 66 20 74 68  ional part of th
e4b0: 65 20 52 45 41 4c 2e 0a 23 0a 64 6f 5f 65 78 70  e REAL..#.do_exp
e4c0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31  r_test e_expr-31
e4d0: 2e 31 2e 31 20 7b 20 43 41 53 54 28 33 2e 31 34  .1.1 { CAST(3.14
e4e0: 31 35 39 20 41 53 20 49 4e 54 45 47 45 52 29 20  159 AS INTEGER) 
e4f0: 7d 20 69 6e 74 65 67 65 72 20 33 0a 64 6f 5f 65  } integer 3.do_e
e500: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
e510: 33 31 2e 31 2e 32 20 7b 20 43 41 53 54 28 31 2e  31.1.2 { CAST(1.
e520: 39 39 39 39 39 20 41 53 20 49 4e 54 45 47 45 52  99999 AS INTEGER
e530: 29 20 7d 20 69 6e 74 65 67 65 72 20 31 0a 64 6f  ) } integer 1.do
e540: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e550: 72 2d 33 31 2e 31 2e 33 20 7b 20 43 41 53 54 28  r-31.1.3 { CAST(
e560: 2d 31 2e 39 39 39 39 39 20 41 53 20 49 4e 54 45  -1.99999 AS INTE
e570: 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 2d  GER) } integer -
e580: 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  1.do_expr_test e
e590: 5f 65 78 70 72 2d 33 31 2e 31 2e 34 20 7b 20 43  _expr-31.1.4 { C
e5a0: 41 53 54 28 2d 30 2e 39 39 39 39 39 20 41 53 20  AST(-0.99999 AS 
e5b0: 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67  INTEGER) } integ
e5c0: 65 72 20 30 0a 0a 23 20 45 56 49 44 45 4e 43 45  er 0..# EVIDENCE
e5d0: 2d 4f 46 3a 20 52 2d 35 31 35 31 37 2d 34 30 38  -OF: R-51517-408
e5e0: 32 34 20 49 66 20 61 20 52 45 41 4c 20 69 73 20  24 If a REAL is 
e5f0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
e600: 20 67 72 65 61 74 65 73 74 0a 23 20 70 6f 73 73   greatest.# poss
e610: 69 62 6c 65 20 73 69 67 6e 65 64 20 69 6e 74 65  ible signed inte
e620: 67 65 72 20 28 2b 39 32 32 33 33 37 32 30 33 36  ger (+9223372036
e630: 38 35 34 37 37 35 38 30 37 29 20 74 68 65 6e 20  854775807) then 
e640: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  the result is th
e650: 65 0a 23 20 67 72 65 61 74 65 73 74 20 70 6f 73  e.# greatest pos
e660: 73 69 62 6c 65 20 73 69 67 6e 65 64 20 69 6e 74  sible signed int
e670: 65 67 65 72 20 61 6e 64 20 69 66 20 74 68 65 20  eger and if the 
e680: 52 45 41 4c 20 69 73 20 6c 65 73 73 20 74 68 61  REAL is less tha
e690: 6e 20 74 68 65 0a 23 20 6c 65 61 73 74 20 70 6f  n the.# least po
e6a0: 73 73 69 62 6c 65 20 73 69 67 6e 65 64 20 69 6e  ssible signed in
e6b0: 74 65 67 65 72 20 28 2d 39 32 32 33 33 37 32 30  teger (-92233720
e6c0: 33 36 38 35 34 37 37 35 38 30 38 29 20 74 68 65  36854775808) the
e6d0: 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 23 20 69  n the result.# i
e6e0: 73 20 74 68 65 20 6c 65 61 73 74 20 70 6f 73 73  s the least poss
e6f0: 69 62 6c 65 20 73 69 67 6e 65 64 20 69 6e 74 65  ible signed inte
e700: 67 65 72 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74  ger..#.do_expr_t
e710: 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 32 2e  est e_expr-31.2.
e720: 31 20 7b 20 43 41 53 54 28 32 65 2b 35 30 20 41  1 { CAST(2e+50 A
e730: 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72  S INT) } integer
e740: 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37   922337203685477
e750: 35 38 30 37 0a 64 6f 5f 65 78 70 72 5f 74 65 73  5807.do_expr_tes
e760: 74 20 65 5f 65 78 70 72 2d 33 31 2e 32 2e 32 20  t e_expr-31.2.2 
e770: 7b 20 43 41 53 54 28 2d 32 65 2b 35 30 20 41 53  { CAST(-2e+50 AS
e780: 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20   INT) } integer 
e790: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
e7a0: 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74 65 73  5808.do_expr_tes
e7b0: 74 20 65 5f 65 78 70 72 2d 33 31 2e 32 2e 33 20  t e_expr-31.2.3 
e7c0: 7b 20 0a 20 20 43 41 53 54 28 2d 39 32 32 33 33  { .  CAST(-92233
e7d0: 37 32 30 33 36 38 35 34 37 37 35 38 30 39 2e 30  72036854775809.0
e7e0: 20 41 53 20 49 4e 54 29 0a 7d 20 69 6e 74 65 67   AS INT).} integ
e7f0: 65 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35  er -922337203685
e800: 34 37 37 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f  4775808.do_expr_
e810: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 32  test e_expr-31.2
e820: 2e 34 20 7b 20 0a 20 20 43 41 53 54 28 39 32 32  .4 { .  CAST(922
e830: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 39  3372036854775809
e840: 2e 30 20 41 53 20 49 4e 54 29 0a 7d 20 69 6e 74  .0 AS INT).} int
e850: 65 67 65 72 20 39 32 32 33 33 37 32 30 33 36 38  eger 92233720368
e860: 35 34 37 37 35 38 30 37 0a 0a 0a 23 20 45 56 49  54775807...# EVI
e870: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39 32 39  DENCE-OF: R-0929
e880: 35 2d 36 31 33 33 37 20 43 61 73 74 69 6e 67 20  5-61337 Casting 
e890: 61 20 54 45 58 54 20 6f 72 20 42 4c 4f 42 20 76  a TEXT or BLOB v
e8a0: 61 6c 75 65 20 69 6e 74 6f 20 4e 55 4d 45 52 49  alue into NUMERI
e8b0: 43 0a 23 20 66 69 72 73 74 20 64 6f 65 73 20 61  C.# first does a
e8c0: 20 66 6f 72 63 65 64 20 63 6f 6e 76 65 72 73 69   forced conversi
e8d0: 6f 6e 20 69 6e 74 6f 20 52 45 41 4c 20 62 75 74  on into REAL but
e8e0: 20 74 68 65 6e 20 66 75 72 74 68 65 72 20 63 6f   then further co
e8f0: 6e 76 65 72 74 73 20 74 68 65 0a 23 20 72 65 73  nverts the.# res
e900: 75 6c 74 20 69 6e 74 6f 20 49 4e 54 45 47 45 52  ult into INTEGER
e910: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
e920: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66  the conversion f
e930: 72 6f 6d 20 52 45 41 4c 20 74 6f 20 49 4e 54 45  rom REAL to INTE
e940: 47 45 52 0a 23 20 69 73 20 6c 6f 73 73 6c 65 73  GER.# is lossles
e950: 73 20 61 6e 64 20 72 65 76 65 72 73 69 62 6c 65  s and reversible
e960: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
e970: 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e 31 20 7b   e_expr-32.1.1 {
e980: 20 43 41 53 54 28 27 34 35 27 20 20 20 41 53 20   CAST('45'   AS 
e990: 4e 55 4d 45 52 49 43 29 20 20 7d 20 69 6e 74 65  NUMERIC)  } inte
e9a0: 67 65 72 20 34 35 0a 64 6f 5f 65 78 70 72 5f 74  ger 45.do_expr_t
e9b0: 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e  est e_expr-32.1.
e9c0: 32 20 7b 20 43 41 53 54 28 27 34 35 2e 30 27 20  2 { CAST('45.0' 
e9d0: 41 53 20 4e 55 4d 45 52 49 43 29 20 20 7d 20 69  AS NUMERIC)  } i
e9e0: 6e 74 65 67 65 72 20 34 35 0a 64 6f 5f 65 78 70  nteger 45.do_exp
e9f0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32  r_test e_expr-32
ea00: 2e 31 2e 33 20 7b 20 43 41 53 54 28 27 34 35 2e  .1.3 { CAST('45.
ea10: 32 27 20 41 53 20 4e 55 4d 45 52 49 43 29 20 20  2' AS NUMERIC)  
ea20: 7d 20 72 65 61 6c 20 34 35 2e 32 0a 64 6f 5f 65  } real 45.2.do_e
ea30: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
ea40: 33 32 2e 31 2e 34 20 7b 20 43 41 53 54 28 27 31  32.1.4 { CAST('1
ea50: 31 61 62 63 27 20 41 53 20 4e 55 4d 45 52 49 43  1abc' AS NUMERIC
ea60: 29 20 7d 20 69 6e 74 65 67 65 72 20 31 31 0a 64  ) } integer 11.d
ea70: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
ea80: 70 72 2d 33 32 2e 31 2e 35 20 7b 20 43 41 53 54  pr-32.1.5 { CAST
ea90: 28 27 31 31 2e 31 61 62 63 27 20 41 53 20 4e 55  ('11.1abc' AS NU
eaa0: 4d 45 52 49 43 29 20 7d 20 72 65 61 6c 20 31 31  MERIC) } real 11
eab0: 2e 31 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .1..# EVIDENCE-O
eac0: 46 3a 20 52 2d 33 30 33 34 37 2d 31 38 37 30 32  F: R-30347-18702
ead0: 20 43 61 73 74 69 6e 67 20 61 20 52 45 41 4c 20   Casting a REAL 
eae0: 6f 72 20 49 4e 54 45 47 45 52 20 76 61 6c 75 65  or INTEGER value
eaf0: 20 74 6f 20 4e 55 4d 45 52 49 43 0a 23 20 69 73   to NUMERIC.# is
eb00: 20 61 20 6e 6f 2d 6f 70 2c 20 65 76 65 6e 20 69   a no-op, even i
eb10: 66 20 61 20 72 65 61 6c 20 76 61 6c 75 65 20 63  f a real value c
eb20: 6f 75 6c 64 20 62 65 20 6c 6f 73 73 6c 65 73 73  ould be lossless
eb30: 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  ly converted to 
eb40: 61 6e 0a 23 20 69 6e 74 65 67 65 72 2e 0a 23 0a  an.# integer..#.
eb50: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
eb60: 78 70 72 2d 33 32 2e 32 2e 31 20 7b 20 43 41 53  xpr-32.2.1 { CAS
eb70: 54 28 31 33 2e 30 20 41 53 20 4e 55 4d 45 52 49  T(13.0 AS NUMERI
eb80: 43 29 20 7d 20 72 65 61 6c 20 31 33 2e 30 0a 64  C) } real 13.0.d
eb90: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
eba0: 70 72 2d 33 32 2e 32 2e 32 20 7b 20 43 41 53 54  pr-32.2.2 { CAST
ebb0: 28 31 33 2e 35 20 41 53 20 4e 55 4d 45 52 49 43  (13.5 AS NUMERIC
ebc0: 29 20 7d 20 72 65 61 6c 20 31 33 2e 35 0a 0a 64  ) } real 13.5..d
ebd0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
ebe0: 70 72 2d 33 32 2e 32 2e 33 20 7b 20 0a 20 20 43  pr-32.2.3 { .  C
ebf0: 41 53 54 28 2d 39 32 32 33 33 37 32 30 33 36 38  AST(-92233720368
ec00: 35 34 37 37 35 38 30 38 20 41 53 20 4e 55 4d 45  54775808 AS NUME
ec10: 52 49 43 29 0a 7d 20 69 6e 74 65 67 65 72 20 2d  RIC).} integer -
ec20: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
ec30: 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  808.do_expr_test
ec40: 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 34 20 7b   e_expr-32.2.4 {
ec50: 20 0a 20 20 43 41 53 54 28 39 32 32 33 33 37 32   .  CAST(9223372
ec60: 30 33 36 38 35 34 37 37 35 38 30 37 20 41 53 20  036854775807 AS 
ec70: 4e 55 4d 45 52 49 43 29 0a 7d 20 69 6e 74 65 67  NUMERIC).} integ
ec80: 65 72 20 39 32 32 33 33 37 32 30 33 36 38 35 34  er 9223372036854
ec90: 37 37 35 38 30 37 0a 0a 23 20 45 56 49 44 45 4e  775807..# EVIDEN
eca0: 43 45 2d 4f 46 3a 20 52 2d 36 34 35 35 30 2d 32  CE-OF: R-64550-2
ecb0: 39 31 39 31 20 4e 6f 74 65 20 74 68 61 74 20 74  9191 Note that t
ecc0: 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d 20 63  he result from c
ecd0: 61 73 74 69 6e 67 20 61 6e 79 0a 23 20 6e 6f 6e  asting any.# non
ece0: 2d 42 4c 4f 42 20 76 61 6c 75 65 20 69 6e 74 6f  -BLOB value into
ecf0: 20 61 20 42 4c 4f 42 20 61 6e 64 20 74 68 65 20   a BLOB and the 
ed00: 72 65 73 75 6c 74 20 66 72 6f 6d 20 63 61 73 74  result from cast
ed10: 69 6e 67 20 61 6e 79 20 42 4c 4f 42 20 76 61 6c  ing any BLOB val
ed20: 75 65 0a 23 20 69 6e 74 6f 20 61 20 6e 6f 6e 2d  ue.# into a non-
ed30: 42 4c 4f 42 20 76 61 6c 75 65 20 6d 61 79 20 62  BLOB value may b
ed40: 65 20 64 69 66 66 65 72 65 6e 74 20 64 65 70 65  e different depe
ed50: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
ed60: 20 74 68 65 0a 23 20 64 61 74 61 62 61 73 65 20   the.# database 
ed70: 65 6e 63 6f 64 69 6e 67 20 69 73 20 55 54 46 2d  encoding is UTF-
ed80: 38 2c 20 55 54 46 2d 31 36 62 65 2c 20 6f 72 20  8, UTF-16be, or 
ed90: 55 54 46 2d 31 36 6c 65 2e 0a 23 0a 69 66 63 61  UTF-16le..#.ifca
eda0: 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a  pable {utf16} {.
edb0: 73 71 6c 69 74 65 33 20 64 62 31 20 3a 6d 65 6d  sqlite3 db1 :mem
edc0: 6f 72 79 3a 20 3b 20 64 62 31 20 65 76 61 6c 20  ory: ; db1 eval 
edd0: 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e  { PRAGMA encodin
ede0: 67 20 3d 20 27 75 74 66 2d 38 27 20 7d 0a 73 71  g = 'utf-8' }.sq
edf0: 6c 69 74 65 33 20 64 62 32 20 3a 6d 65 6d 6f 72  lite3 db2 :memor
ee00: 79 3a 20 3b 20 64 62 32 20 65 76 61 6c 20 7b 20  y: ; db2 eval { 
ee10: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20  PRAGMA encoding 
ee20: 3d 20 27 75 74 66 2d 31 36 6c 65 27 20 7d 0a 73  = 'utf-16le' }.s
ee30: 71 6c 69 74 65 33 20 64 62 33 20 3a 6d 65 6d 6f  qlite3 db3 :memo
ee40: 72 79 3a 20 3b 20 64 62 33 20 65 76 61 6c 20 7b  ry: ; db3 eval {
ee50: 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67   PRAGMA encoding
ee60: 20 3d 20 27 75 74 66 2d 31 36 62 65 27 20 7d 0a   = 'utf-16be' }.
ee70: 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 61 73 74  foreach {tn cast
ee80: 65 78 70 72 20 64 69 66 66 65 72 73 7d 20 7b 0a  expr differs} {.
ee90: 20 20 31 20 7b 20 43 41 53 54 28 31 32 33 20 41    1 { CAST(123 A
eea0: 53 20 42 4c 4f 42 29 20 20 20 20 7d 20 31 0a 20  S BLOB)    } 1. 
eeb0: 20 32 20 7b 20 43 41 53 54 28 27 27 20 41 53 20   2 { CAST('' AS 
eec0: 42 4c 4f 42 29 20 20 20 20 20 7d 20 30 0a 20 20  BLOB)     } 0.  
eed0: 33 20 7b 20 43 41 53 54 28 27 61 62 63 64 27 20  3 { CAST('abcd' 
eee0: 41 53 20 42 4c 4f 42 29 20 7d 20 31 0a 0a 20 20  AS BLOB) } 1..  
eef0: 34 20 7b 20 43 41 53 54 28 58 27 61 62 63 64 27  4 { CAST(X'abcd'
ef00: 20 41 53 20 54 45 58 54 29 20 7d 20 31 0a 20 20   AS TEXT) } 1.  
ef10: 35 20 7b 20 43 41 53 54 28 58 27 27 20 41 53 20  5 { CAST(X'' AS 
ef20: 54 45 58 54 29 20 20 20 20 20 7d 20 30 0a 7d 20  TEXT)     } 0.} 
ef30: 7b 0a 20 20 73 65 74 20 72 31 20 5b 64 62 31 20  {.  set r1 [db1 
ef40: 65 76 61 6c 20 22 53 45 4c 45 43 54 20 74 79 70  eval "SELECT typ
ef50: 65 6f 66 28 24 63 61 73 74 65 78 70 72 29 2c 20  eof($castexpr), 
ef60: 71 75 6f 74 65 28 24 63 61 73 74 65 78 70 72 29  quote($castexpr)
ef70: 22 5d 0a 20 20 73 65 74 20 72 32 20 5b 64 62 32  "].  set r2 [db2
ef80: 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 74 79   eval "SELECT ty
ef90: 70 65 6f 66 28 24 63 61 73 74 65 78 70 72 29 2c  peof($castexpr),
efa0: 20 71 75 6f 74 65 28 24 63 61 73 74 65 78 70 72   quote($castexpr
efb0: 29 22 5d 0a 20 20 73 65 74 20 72 33 20 5b 64 62  )"].  set r3 [db
efc0: 33 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 74  3 eval "SELECT t
efd0: 79 70 65 6f 66 28 24 63 61 73 74 65 78 70 72 29  ypeof($castexpr)
efe0: 2c 20 71 75 6f 74 65 28 24 63 61 73 74 65 78 70  , quote($castexp
eff0: 72 29 22 5d 0a 0a 20 20 69 66 20 7b 24 64 69 66  r)"]..  if {$dif
f000: 66 65 72 73 7d 20 7b 0a 20 20 20 20 73 65 74 20  fers} {.    set 
f010: 72 65 73 20 5b 65 78 70 72 20 7b 24 72 31 21 3d  res [expr {$r1!=
f020: 24 72 32 20 26 26 20 24 72 32 21 3d 24 72 33 7d  $r2 && $r2!=$r3}
f030: 5d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ].  } else {.   
f040: 20 73 65 74 20 72 65 73 20 5b 65 78 70 72 20 7b   set res [expr {
f050: 24 72 31 3d 3d 24 72 32 20 26 26 20 24 72 32 3d  $r1==$r2 && $r2=
f060: 3d 24 72 33 7d 5d 0a 20 20 7d 0a 0a 20 20 64 6f  =$r3}].  }..  do
f070: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 33 2e  _test e_expr-33.
f080: 31 2e 24 74 6e 20 7b 73 65 74 20 72 65 73 7d 20  1.$tn {set res} 
f090: 31 0a 7d 0a 64 62 31 20 63 6c 6f 73 65 0a 64 62  1.}.db1 close.db
f0a0: 32 20 63 6c 6f 73 65 0a 64 62 33 20 63 6c 6f 73  2 close.db3 clos
f0b0: 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.}..#----------
f0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
f100: 23 20 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74  # Test statement
f110: 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  s related to the
f120: 20 45 58 49 53 54 53 20 61 6e 64 20 4e 4f 54 20   EXISTS and NOT 
f130: 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 73  EXISTS operators
f140: 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64 62 20 63  ..#.catch { db c
f150: 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64 65 6c 65  lose }.forcedele
f160: 74 65 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74  te test.db.sqlit
f170: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 64  e3 db test.db..d
f180: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
f190: 5f 65 78 70 72 2d 33 34 2e 31 20 7b 0a 20 20 43  _expr-34.1 {.  C
f1a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
f1b0: 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , b);.  INSERT I
f1c0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
f1d0: 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   2);.  INSERT IN
f1e0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e 55 4c  TO t1 VALUES(NUL
f1f0: 4c 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20  L, 2);.  INSERT 
f200: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
f210: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53 45 52  , NULL);.  INSER
f220: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
f230: 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 20  (NULL, NULL);.} 
f240: 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  {}..# EVIDENCE-O
f250: 46 3a 20 52 2d 32 35 35 38 38 2d 32 37 31 38 31  F: R-25588-27181
f260: 20 54 68 65 20 45 58 49 53 54 53 20 6f 70 65 72   The EXISTS oper
f270: 61 74 6f 72 20 61 6c 77 61 79 73 20 65 76 61 6c  ator always eval
f280: 75 61 74 65 73 20 74 6f 20 6f 6e 65 0a 23 20 6f  uates to one.# o
f290: 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  f the integer va
f2a0: 6c 75 65 73 20 30 20 61 6e 64 20 31 2e 0a 23 0a  lues 0 and 1..#.
f2b0: 23 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  # This statement
f2c0: 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64 20 62   is not tested b
f2d0: 79 20 69 74 73 65 6c 66 2e 20 49 6e 73 74 65 61  y itself. Instea
f2e0: 64 2c 20 61 6c 6c 20 65 5f 65 78 70 72 2d 33 34  d, all e_expr-34
f2f0: 2e 2a 20 74 65 73 74 73 20 0a 23 20 66 6f 6c 6c  .* tests .# foll
f300: 6f 77 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74  owing this point
f310: 20 65 78 70 6c 69 63 69 74 6c 79 20 74 65 73 74   explicitly test
f320: 20 74 68 61 74 20 73 70 65 63 69 66 69 63 20 69   that specific i
f330: 6e 76 6f 63 61 74 69 6f 6e 73 20 6f 66 20 45 58  nvocations of EX
f340: 49 53 54 53 0a 23 20 72 65 74 75 72 6e 20 65 69  ISTS.# return ei
f350: 74 68 65 72 20 69 6e 74 65 67 65 72 20 30 20 6f  ther integer 0 o
f360: 72 20 69 6e 74 65 67 65 72 20 31 2e 0a 23 0a 0a  r integer 1..#..
f370: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
f380: 2d 35 38 35 35 33 2d 36 33 37 34 30 20 49 66 20  -58553-63740 If 
f390: 65 78 65 63 75 74 69 6e 67 20 74 68 65 20 53 45  executing the SE
f3a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 73  LECT statement s
f3b0: 70 65 63 69 66 69 65 64 0a 23 20 61 73 20 74 68  pecified.# as th
f3c0: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65  e right-hand ope
f3d0: 72 61 6e 64 20 6f 66 20 74 68 65 20 45 58 49 53  rand of the EXIS
f3e0: 54 53 20 6f 70 65 72 61 74 6f 72 20 77 6f 75 6c  TS operator woul
f3f0: 64 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 72 0a  d return one or.
f400: 23 20 6d 6f 72 65 20 72 6f 77 73 2c 20 74 68 65  # more rows, the
f410: 6e 20 74 68 65 20 45 58 49 53 54 53 20 6f 70 65  n the EXISTS ope
f420: 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73 20  rator evaluates 
f430: 74 6f 20 31 2e 0a 23 0a 66 6f 72 65 61 63 68 20  to 1..#.foreach 
f440: 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20 20  {tn expr} {.    
f450: 31 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c  1 { EXISTS ( SEL
f460: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 29 20  ECT a FROM t1 ) 
f470: 7d 0a 20 20 20 20 32 20 7b 20 45 58 49 53 54 53  }.    2 { EXISTS
f480: 20 28 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d   ( SELECT b FROM
f490: 20 74 31 20 29 20 7d 0a 20 20 20 20 33 20 7b 20   t1 ) }.    3 { 
f4a0: 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
f4b0: 32 34 20 29 20 7d 0a 20 20 20 20 34 20 7b 20 45  24 ) }.    4 { E
f4c0: 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 4e  XISTS ( SELECT N
f4d0: 55 4c 4c 20 29 20 7d 0a 20 20 20 20 35 20 7b 20  ULL ) }.    5 { 
f4e0: 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
f4f0: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
f500: 61 20 49 53 20 4e 55 4c 4c 20 29 20 7d 0a 7d 20  a IS NULL ) }.} 
f510: 7b 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  {.  do_expr_test
f520: 20 65 5f 65 78 70 72 2d 33 34 2e 32 2e 24 74 6e   e_expr-34.2.$tn
f530: 20 24 65 78 70 72 20 69 6e 74 65 67 65 72 20 31   $expr integer 1
f540: 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
f550: 46 3a 20 52 2d 31 39 36 37 33 2d 34 30 39 37 32  F: R-19673-40972
f560: 20 49 66 20 65 78 65 63 75 74 69 6e 67 20 74 68   If executing th
f570: 65 20 53 45 4c 45 43 54 20 77 6f 75 6c 64 20 72  e SELECT would r
f580: 65 74 75 72 6e 20 6e 6f 0a 23 20 72 6f 77 73 20  eturn no.# rows 
f590: 61 74 20 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  at all, then the
f5a0: 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
f5b0: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 30 2e   evaluates to 0.
f5c0: 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 65  .#.foreach {tn e
f5d0: 78 70 72 7d 20 7b 0a 20 20 20 20 31 20 7b 20 45  xpr} {.    1 { E
f5e0: 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 61  XISTS ( SELECT a
f5f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 30   FROM t1 WHERE 0
f600: 29 20 7d 0a 20 20 20 20 32 20 7b 20 45 58 49 53  ) }.    2 { EXIS
f610: 54 53 20 28 20 53 45 4c 45 43 54 20 62 20 46 52  TS ( SELECT b FR
f620: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
f630: 35 29 20 7d 0a 20 20 20 20 33 20 7b 20 45 58 49  5) }.    3 { EXI
f640: 53 54 53 20 28 20 53 45 4c 45 43 54 20 32 34 20  STS ( SELECT 24 
f650: 57 48 45 52 45 20 30 29 20 7d 0a 20 20 20 20 34  WHERE 0) }.    4
f660: 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45   { EXISTS ( SELE
f670: 43 54 20 4e 55 4c 4c 20 57 48 45 52 45 20 31 3d  CT NULL WHERE 1=
f680: 32 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78  2) }.} {.  do_ex
f690: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
f6a0: 34 2e 33 2e 24 74 6e 20 24 65 78 70 72 20 69 6e  4.3.$tn $expr in
f6b0: 74 65 67 65 72 20 30 0a 7d 0a 0a 23 20 45 56 49  teger 0.}..# EVI
f6c0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 35 31 30  DENCE-OF: R-3510
f6d0: 39 2d 34 39 31 33 39 20 54 68 65 20 6e 75 6d 62  9-49139 The numb
f6e0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
f6f0: 20 65 61 63 68 20 72 6f 77 20 72 65 74 75 72 6e   each row return
f700: 65 64 0a 23 20 62 79 20 74 68 65 20 53 45 4c 45  ed.# by the SELE
f710: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 28 69 66  CT statement (if
f720: 20 61 6e 79 29 20 61 6e 64 20 74 68 65 20 73 70   any) and the sp
f730: 65 63 69 66 69 63 20 76 61 6c 75 65 73 20 72 65  ecific values re
f740: 74 75 72 6e 65 64 20 68 61 76 65 0a 23 20 6e 6f  turned have.# no
f750: 20 65 66 66 65 63 74 20 6f 6e 20 74 68 65 20 72   effect on the r
f760: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 45 58  esults of the EX
f770: 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2e 0a 23  ISTS operator..#
f780: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 65 78 70  .foreach {tn exp
f790: 72 20 72 65 73 7d 20 7b 0a 20 20 20 20 31 20 7b  r res} {.    1 {
f7a0: 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54   EXISTS ( SELECT
f7b0: 20 2a 20 46 52 4f 4d 20 74 31 20 29 20 7d 20 20   * FROM t1 ) }  
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 20 20 20 20 20 20 20 31 0a 20 20 20 20 32 20          1.    2 
f7e0: 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43  { EXISTS ( SELEC
f7f0: 54 20 2a 2c 20 2a 2c 20 2a 20 46 52 4f 4d 20 74  T *, *, * FROM t
f800: 31 20 29 20 7d 20 20 20 20 20 20 20 20 20 20 20  1 ) }           
f810: 20 20 20 20 20 20 20 20 20 31 0a 20 20 20 20 33           1.    3
f820: 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45   { EXISTS ( SELE
f830: 43 54 20 32 34 2c 20 32 35 20 29 20 7d 20 20 20  CT 24, 25 ) }   
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 20 20 31 0a 20 20 20 20            1.    
f860: 34 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c  4 { EXISTS ( SEL
f870: 45 43 54 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  ECT NULL, NULL, 
f880: 4e 55 4c 4c 20 29 20 7d 20 20 20 20 20 20 20 20  NULL ) }        
f890: 20 20 20 20 20 20 20 20 20 20 20 31 0a 20 20 20             1.   
f8a0: 20 35 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   5 { EXISTS ( SE
f8b0: 4c 45 43 54 20 61 2c 62 2c 61 7c 7c 62 20 46 52  LECT a,b,a||b FR
f8c0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 49 53  OM t1 WHERE a IS
f8d0: 20 4e 55 4c 4c 20 29 20 7d 20 20 20 31 0a 0a 20   NULL ) }   1.. 
f8e0: 20 20 20 36 20 7b 20 45 58 49 53 54 53 20 28 20     6 { EXISTS ( 
f8f0: 53 45 4c 45 43 54 20 61 2c 20 61 20 46 52 4f 4d  SELECT a, a FROM
f900: 20 74 31 20 57 48 45 52 45 20 30 29 20 7d 20 20   t1 WHERE 0) }  
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
f920: 20 20 20 20 37 20 7b 20 45 58 49 53 54 53 20 28      7 { EXISTS (
f930: 20 53 45 4c 45 43 54 20 62 2c 20 62 2c 20 61 20   SELECT b, b, a 
f940: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
f950: 3d 20 35 29 20 7d 20 20 20 20 20 20 20 20 20 30  = 5) }         0
f960: 0a 20 20 20 20 38 20 7b 20 45 58 49 53 54 53 20  .    8 { EXISTS 
f970: 28 20 53 45 4c 45 43 54 20 32 34 2c 20 34 36 2c  ( SELECT 24, 46,
f980: 20 38 39 20 57 48 45 52 45 20 30 29 20 7d 20 20   89 WHERE 0) }  
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 30 0a 20 20 20 20 39 20 7b 20 45 58 49 53 54 53  0.    9 { EXISTS
f9b0: 20 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   ( SELECT NULL, 
f9c0: 4e 55 4c 4c 20 57 48 45 52 45 20 31 3d 32 29 20  NULL WHERE 1=2) 
f9d0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
f9e0: 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70 72   0.} {.  do_expr
f9f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34 2e  _test e_expr-34.
fa00: 34 2e 24 74 6e 20 24 65 78 70 72 20 69 6e 74 65  4.$tn $expr inte
fa10: 67 65 72 20 24 72 65 73 0a 7d 0a 0a 23 20 45 56  ger $res.}..# EV
fa20: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 30 36  IDENCE-OF: R-106
fa30: 34 35 2d 31 32 34 33 39 20 49 6e 20 70 61 72 74  45-12439 In part
fa40: 69 63 75 6c 61 72 2c 20 72 6f 77 73 20 63 6f 6e  icular, rows con
fa50: 74 61 69 6e 69 6e 67 20 4e 55 4c 4c 20 76 61 6c  taining NULL val
fa60: 75 65 73 0a 23 20 61 72 65 20 6e 6f 74 20 68 61  ues.# are not ha
fa70: 6e 64 6c 65 64 20 61 6e 79 20 64 69 66 66 65 72  ndled any differ
fa80: 65 6e 74 6c 79 20 66 72 6f 6d 20 72 6f 77 73 20  ently from rows 
fa90: 77 69 74 68 6f 75 74 20 4e 55 4c 4c 20 76 61 6c  without NULL val
faa0: 75 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  ues..#.foreach {
fab0: 74 6e 20 65 31 20 65 32 7d 20 7b 0a 20 20 31 20  tn e1 e2} {.  1 
fac0: 7b 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54  { EXISTS (SELECT
fad0: 20 27 6e 6f 74 20 6e 75 6c 6c 27 29 20 7d 20 20   'not null') }  
fae0: 20 20 7b 20 45 58 49 53 54 53 20 28 53 45 4c 45    { EXISTS (SELE
faf0: 43 54 20 4e 55 4c 4c 29 20 7d 0a 20 20 32 20 7b  CT NULL) }.  2 {
fb00: 20 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20   EXISTS (SELECT 
fb10: 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 29 20 7d 20  NULL FROM t1) } 
fb20: 20 7b 20 45 58 49 53 54 53 20 28 53 45 4c 45 43   { EXISTS (SELEC
fb30: 54 20 27 62 72 65 61 64 27 20 46 52 4f 4d 20 74  T 'bread' FROM t
fb40: 31 29 20 7d 0a 7d 20 7b 0a 20 20 73 65 74 20 72  1) }.} {.  set r
fb50: 65 73 20 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45  es [db one "SELE
fb60: 43 54 20 24 65 31 22 5d 0a 20 20 64 6f 5f 65 78  CT $e1"].  do_ex
fb70: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
fb80: 34 2e 35 2e 24 7b 74 6e 7d 61 20 24 65 31 20 69  4.5.${tn}a $e1 i
fb90: 6e 74 65 67 65 72 20 24 72 65 73 0a 20 20 64 6f  nteger $res.  do
fba0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
fbb0: 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d 62 20 24 65  r-34.5.${tn}b $e
fbc0: 32 20 69 6e 74 65 67 65 72 20 24 72 65 73 0a 7d  2 integer $res.}
fbd0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
fbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
fc20: 65 73 74 20 73 74 61 74 65 6d 65 6e 74 73 20 72  est statements r
fc30: 65 6c 61 74 65 64 20 74 6f 20 73 63 61 6c 61 72  elated to scalar
fc40: 20 73 75 62 2d 71 75 65 72 69 65 73 2e 0a 23 0a   sub-queries..#.
fc50: 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73  .catch { db clos
fc60: 65 20 7d 0a 66 6f 72 63 65 64 65 6c 65 74 65 20  e }.forcedelete 
fc70: 74 65 73 74 2e 64 62 0a 73 71 6c 69 74 65 33 20  test.db.sqlite3 
fc80: 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65  db test.db.do_te
fc90: 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 30 20 7b  st e_expr-35.0 {
fca0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
fcb0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
fcc0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
fcd0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
fce0: 53 28 27 6f 6e 65 27 2c 20 27 74 77 6f 27 29 3b  S('one', 'two');
fcf0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
fd00: 20 74 32 20 56 41 4c 55 45 53 28 27 74 68 72 65   t2 VALUES('thre
fd10: 65 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49  e', NULL);.    I
fd20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
fd30: 4c 55 45 53 28 34 2c 20 35 2e 30 29 3b 0a 20 20  LUES(4, 5.0);.  
fd40: 7d 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e  }.} {}..# EVIDEN
fd50: 43 45 2d 4f 46 3a 20 52 2d 30 30 39 38 30 2d 33  CE-OF: R-00980-3
fd60: 39 32 35 36 20 41 20 53 45 4c 45 43 54 20 73 74  9256 A SELECT st
fd70: 61 74 65 6d 65 6e 74 20 65 6e 63 6c 6f 73 65 64  atement enclosed
fd80: 20 69 6e 20 70 61 72 65 6e 74 68 65 73 65 73 0a   in parentheses.
fd90: 23 20 6d 61 79 20 61 70 70 65 61 72 20 61 73 20  # may appear as 
fda0: 61 20 73 63 61 6c 61 72 20 71 75 61 6e 74 69 74  a scalar quantit
fdb0: 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  y..#.# EVIDENCE-
fdc0: 4f 46 3a 20 52 2d 35 36 32 39 34 2d 30 33 39 36  OF: R-56294-0396
fdd0: 36 20 41 6c 6c 20 74 79 70 65 73 20 6f 66 20 53  6 All types of S
fde0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
fdf0: 20 69 6e 63 6c 75 64 69 6e 67 0a 23 20 61 67 67   including.# agg
fe00: 72 65 67 61 74 65 20 61 6e 64 20 63 6f 6d 70 6f  regate and compo
fe10: 75 6e 64 20 53 45 4c 45 43 54 20 71 75 65 72 69  und SELECT queri
fe20: 65 73 20 28 71 75 65 72 69 65 73 20 77 69 74 68  es (queries with
fe30: 20 6b 65 79 77 6f 72 64 73 20 6c 69 6b 65 0a 23   keywords like.#
fe40: 20 55 4e 49 4f 4e 20 6f 72 20 45 58 43 45 50 54   UNION or EXCEPT
fe50: 29 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 61 73  ) are allowed as
fe60: 20 73 63 61 6c 61 72 20 73 75 62 71 75 65 72 69   scalar subqueri
fe70: 65 73 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65  es..#.do_expr_te
fe80: 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e 31  st e_expr-35.1.1
fe90: 20 7b 20 28 53 45 4c 45 43 54 20 33 35 29 20 20   { (SELECT 35)  
fea0: 20 7d 20 69 6e 74 65 67 65 72 20 33 35 0a 64 6f   } integer 35.do
feb0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
fec0: 72 2d 33 35 2e 31 2e 32 20 7b 20 28 53 45 4c 45  r-35.1.2 { (SELE
fed0: 43 54 20 4e 55 4c 4c 29 20 7d 20 6e 75 6c 6c 20  CT NULL) } null 
fee0: 7b 7d 0a 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  {}..do_expr_test
fef0: 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e 33 20 7b   e_expr-35.1.3 {
ff00: 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
ff10: 29 20 46 52 4f 4d 20 74 32 29 20 7d 20 69 6e 74  ) FROM t2) } int
ff20: 65 67 65 72 20 33 0a 64 6f 5f 65 78 70 72 5f 74  eger 3.do_expr_t
ff30: 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e  est e_expr-35.1.
ff40: 34 20 7b 20 28 53 45 4c 45 43 54 20 34 20 46 52  4 { (SELECT 4 FR
ff50: 4f 4d 20 74 32 29 20 7d 20 69 6e 74 65 67 65 72  OM t2) } integer
ff60: 20 34 0a 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74   4..do_expr_test
ff70: 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e 35 20 7b   e_expr-35.1.5 {
ff80: 20 0a 20 20 28 53 45 4c 45 43 54 20 62 20 46 52   .  (SELECT b FR
ff90: 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
ffa0: 43 54 20 61 2b 31 20 46 52 4f 4d 20 74 32 29 0a  CT a+1 FROM t2).
ffb0: 7d 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65 78 70  } null {}.do_exp
ffc0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35  r_test e_expr-35
ffd0: 2e 31 2e 36 20 7b 20 0a 20 20 28 53 45 4c 45 43  .1.6 { .  (SELEC
ffe0: 54 20 61 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T a FROM t2 UNIO
fff0: 4e 20 53 45 4c 45 43 54 20 43 4f 41 4c 45 53 43  N SELECT COALESC
10000 45 28 62 2c 20 35 35 29 20 46 52 4f 4d 20 74 32  E(b, 55) FROM t2
10010 20 4f 52 44 45 52 20 42 59 20 31 29 0a 7d 20 69   ORDER BY 1).} i
10020 6e 74 65 67 65 72 20 34 0a 0a 23 20 45 56 49 44  nteger 4..# EVID
10030 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 36 38 39 39  ENCE-OF: R-46899
10040 2d 35 33 37 36 35 20 41 20 53 45 4c 45 43 54 20  -53765 A SELECT 
10050 75 73 65 64 20 61 73 20 61 20 73 63 61 6c 61 72  used as a scalar
10060 20 71 75 61 6e 74 69 74 79 20 6d 75 73 74 0a 23   quantity must.#
10070 20 72 65 74 75 72 6e 20 61 20 72 65 73 75 6c 74   return a result
10080 20 73 65 74 20 77 69 74 68 20 61 20 73 69 6e 67   set with a sing
10090 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 23 20 54  le column..#.# T
100a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
100b0 63 6b 20 74 65 73 74 73 20 74 68 61 74 20 65 72  ck tests that er
100c0 72 6f 72 73 20 61 72 65 20 72 65 74 75 72 6e 65  rors are returne
100d0 64 20 69 6e 20 61 20 62 75 6e 63 68 20 6f 66 20  d in a bunch of 
100e0 63 61 73 65 73 0a 23 20 77 68 65 72 65 20 61 20  cases.# where a 
100f0 73 75 62 71 75 65 72 79 20 72 65 74 75 72 6e 73  subquery returns
10100 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
10110 6f 6c 75 6d 6e 2e 0a 23 0a 73 65 74 20 4d 20 7b  olumn..#.set M {
10120 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
10130 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
10140 20 61 20 53 45 4c 45 43 54 20 74 68 61 74 20 69   a SELECT that i
10150 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
10160 72 65 73 73 69 6f 6e 7d 0a 66 6f 72 65 61 63 68  ression}.foreach
10170 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20 31 20   {tn sql} {.  1 
10180 20 20 20 20 7b 20 53 45 4c 45 43 54 20 28 53 45      { SELECT (SE
10190 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 55  LECT * FROM t2 U
101a0 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61 2b 31 2c  NION SELECT a+1,
101b0 20 62 2b 31 20 46 52 4f 4d 20 74 32 29 20 7d 0a   b+1 FROM t2) }.
101c0 20 20 32 20 20 20 20 20 7b 20 53 45 4c 45 43 54    2     { SELECT
101d0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
101e0 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
101f0 61 2b 31 2c 20 62 2b 31 20 46 52 4f 4d 20 74 32  a+1, b+1 FROM t2
10200 20 4f 52 44 45 52 20 42 59 20 31 29 20 7d 0a 20   ORDER BY 1) }. 
10210 20 33 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20   3     { SELECT 
10220 28 53 45 4c 45 43 54 20 31 2c 20 32 29 20 7d 0a  (SELECT 1, 2) }.
10230 20 20 34 20 20 20 20 20 7b 20 53 45 4c 45 43 54    4     { SELECT
10240 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 4e   (SELECT NULL, N
10250 55 4c 4c 2c 20 4e 55 4c 4c 29 20 7d 0a 20 20 35  ULL, NULL) }.  5
10260 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20 28 53       { SELECT (S
10270 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 29  ELECT * FROM t2)
10280 20 7d 0a 20 20 36 20 20 20 20 20 7b 20 53 45 4c   }.  6     { SEL
10290 45 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46 52  ECT (SELECT * FR
102a0 4f 4d 20 28 53 45 4c 45 43 54 20 31 2c 20 32 2c  OM (SELECT 1, 2,
102b0 20 33 29 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f   3)) }.} {.  do_
102c0 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f  catchsql_test e_
102d0 65 78 70 72 2d 33 35 2e 32 2e 24 74 6e 20 24 73  expr-35.2.$tn $s
102e0 71 6c 20 5b 6c 69 73 74 20 31 20 24 4d 5d 0a 7d  ql [list 1 $M].}
102f0 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
10300 20 52 2d 33 35 37 36 34 2d 32 38 30 34 31 20 54   R-35764-28041 T
10310 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
10320 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
10330 68 65 20 76 61 6c 75 65 0a 23 20 6f 66 20 74 68  he value.# of th
10340 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 20 69 6e  e only column in
10350 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 72   the first row r
10360 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
10370 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
10380 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
10390 3a 20 52 2d 34 31 38 39 38 2d 30 36 36 38 36 20  : R-41898-06686 
103a0 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 79 69  If the SELECT yi
103b0 65 6c 64 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  elds more than o
103c0 6e 65 20 72 65 73 75 6c 74 0a 23 20 72 6f 77 2c  ne result.# row,
103d0 20 61 6c 6c 20 72 6f 77 73 20 61 66 74 65 72 20   all rows after 
103e0 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69 67  the first are ig
103f0 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 65 63  nored..#.do_exec
10400 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
10410 33 36 2e 33 2e 31 20 7b 0a 20 20 43 52 45 41 54  36.3.1 {.  CREAT
10420 45 20 54 41 42 4c 45 20 74 34 28 78 2c 20 79 29  E TABLE t4(x, y)
10430 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
10440 74 34 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e  t4 VALUES(1, 'on
10450 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
10460 54 4f 20 74 34 20 56 41 4c 55 45 53 28 32 2c 20  TO t4 VALUES(2, 
10470 27 74 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54  'two');.  INSERT
10480 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
10490 33 2c 20 27 74 68 72 65 65 27 29 3b 0a 7d 20 7b  3, 'three');.} {
104a0 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 65  }..foreach {tn e
104b0 78 70 72 20 72 65 73 74 79 70 65 20 72 65 73 76  xpr restype resv
104c0 61 6c 7d 20 7b 0a 20 20 20 20 32 20 20 7b 20 28  al} {.    2  { (
104d0 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
104e0 34 20 4f 52 44 45 52 20 42 59 20 78 20 29 20 20  4 ORDER BY x )  
104f0 20 20 20 20 7d 20 20 20 20 20 20 20 20 69 6e 74      }        int
10500 65 67 65 72 20 31 0a 20 20 20 20 33 20 20 7b 20  eger 1.    3  { 
10510 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20  ( SELECT x FROM 
10520 74 34 20 4f 52 44 45 52 20 42 59 20 79 20 29 20  t4 ORDER BY y ) 
10530 20 20 20 20 20 7d 20 20 20 20 20 20 20 20 69 6e       }        in
10540 74 65 67 65 72 20 31 0a 20 20 20 20 34 20 20 7b  teger 1.    4  {
10550 20 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d   ( SELECT x FROM
10560 20 74 34 20 4f 52 44 45 52 20 42 59 20 78 20 44   t4 ORDER BY x D
10570 45 53 43 20 29 20 7d 20 20 20 20 20 20 20 20 69  ESC ) }        i
10580 6e 74 65 67 65 72 20 33 0a 20 20 20 20 35 20 20  nteger 3.    5  
10590 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f  { ( SELECT x FRO
105a0 4d 20 74 34 20 4f 52 44 45 52 20 42 59 20 79 20  M t4 ORDER BY y 
105b0 44 45 53 43 20 29 20 7d 20 20 20 20 20 20 20 20  DESC ) }        
105c0 69 6e 74 65 67 65 72 20 32 0a 20 20 20 20 36 20  integer 2.    6 
105d0 20 7b 20 28 20 53 45 4c 45 43 54 20 79 20 46 52   { ( SELECT y FR
105e0 4f 4d 20 74 34 20 4f 52 44 45 52 20 42 59 20 79  OM t4 ORDER BY y
105f0 20 44 45 53 43 20 29 20 7d 20 20 20 20 20 20 20   DESC ) }       
10600 20 74 65 78 74 20 20 20 20 74 77 6f 0a 0a 20 20   text    two..  
10610 20 20 37 20 20 7b 20 28 20 53 45 4c 45 43 54 20    7  { ( SELECT 
10620 73 75 6d 28 78 29 20 46 52 4f 4d 20 74 34 20 29  sum(x) FROM t4 )
10630 20 20 20 20 20 20 20 20 20 20 20 7d 20 20 20 20             }    
10640 20 20 20 20 20 69 6e 74 65 67 65 72 20 36 0a 20       integer 6. 
10650 20 20 20 38 20 20 7b 20 28 20 53 45 4c 45 43 54     8  { ( SELECT
10660 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 79 2c   group_concat(y,
10670 27 27 29 20 46 52 4f 4d 20 74 34 20 29 20 7d 20  '') FROM t4 ) } 
10680 20 20 20 20 20 20 74 65 78 74 20 20 20 20 6f 6e        text    on
10690 65 74 77 6f 74 68 72 65 65 0a 20 20 20 20 39 20  etwothree.    9 
106a0 20 7b 20 28 20 53 45 4c 45 43 54 20 6d 61 78 28   { ( SELECT max(
106b0 78 29 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45  x) FROM t4 WHERE
106c0 20 79 20 4c 49 4b 45 20 27 5f 5f 5f 27 29 20 7d   y LIKE '___') }
106d0 20 69 6e 74 65 67 65 72 20 32 20 0a 0a 7d 20 7b   integer 2 ..} {
106e0 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .  do_expr_test 
106f0 65 5f 65 78 70 72 2d 33 36 2e 33 2e 24 74 6e 20  e_expr-36.3.$tn 
10700 24 65 78 70 72 20 24 72 65 73 74 79 70 65 20 24  $expr $restype $
10710 72 65 73 76 61 6c 0a 7d 0a 0a 23 20 45 56 49 44  resval.}..# EVID
10720 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 34 39 32  ENCE-OF: R-25492
10730 2d 34 31 35 37 32 20 49 66 20 74 68 65 20 53 45  -41572 If the SE
10740 4c 45 43 54 20 79 69 65 6c 64 73 20 6e 6f 20 72  LECT yields no r
10750 6f 77 73 2c 20 74 68 65 6e 20 74 68 65 0a 23 20  ows, then the.# 
10760 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65 78 70  value of the exp
10770 72 65 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 2e  ression is NULL.
10780 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 65  .#.foreach {tn e
10790 78 70 72 7d 20 7b 0a 20 20 20 20 31 20 20 7b 20  xpr} {.    1  { 
107a0 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20  ( SELECT x FROM 
107b0 74 34 20 57 48 45 52 45 20 78 3e 33 20 4f 52 44  t4 WHERE x>3 ORD
107c0 45 52 20 42 59 20 78 20 29 20 20 20 20 20 20 7d  ER BY x )      }
107d0 0a 20 20 20 20 32 20 20 7b 20 28 20 53 45 4c 45  .    2  { ( SELE
107e0 43 54 20 78 20 46 52 4f 4d 20 74 34 20 57 48 45  CT x FROM t4 WHE
107f0 52 45 20 79 3c 27 6f 6e 65 27 20 4f 52 44 45 52  RE y<'one' ORDER
10800 20 42 59 20 79 20 29 20 20 7d 0a 7d 20 7b 0a 20   BY y )  }.} {. 
10810 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f   do_expr_test e_
10820 65 78 70 72 2d 33 36 2e 34 2e 24 74 6e 20 24 65  expr-36.4.$tn $e
10830 78 70 72 20 6e 75 6c 6c 20 7b 7d 0a 7d 0a 0a 0a  xpr null {}.}...
10840 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.