/ Hex Artifact Content
Login

Artifact 8cd7d85270cc7b1bca4cad6dc1c65f2d414b8851d0a13eb4eed0aa27a3516b9a:


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 34 32 32 33 2d 30 34 33 35 32 20 54   R-04223-04352 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 69 6e 74 65 67 65  tputs the intege
1fa0: 72 20 76 61 6c 75 65 20 6f 66 0a 23 20 69 74 73  r value of.# its
1fb0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6d 6f   left operand mo
1fc0: 64 75 6c 6f 20 69 74 73 20 72 69 67 68 74 20 6f  dulo its right o
1fd0: 70 65 72 61 6e 64 2e 0a 23 0a 64 6f 5f 65 78 65  perand..#.do_exe
1fe0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
1ff0: 2d 36 2e 31 20 7b 53 45 4c 45 43 54 20 20 37 32  -6.1 {SELECT  72
2000: 25 35 7d 20 20 7b 32 7d 0a 64 6f 5f 65 78 65 63  %5}  {2}.do_exec
2010: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
2020: 36 2e 32 20 7b 53 45 4c 45 43 54 20 20 37 32 25  6.2 {SELECT  72%
2030: 2d 35 7d 20 7b 32 7d 0a 64 6f 5f 65 78 65 63 73  -5} {2}.do_execs
2040: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 36  ql_test e_expr-6
2050: 2e 33 20 7b 53 45 4c 45 43 54 20 2d 37 32 25 2d  .3 {SELECT -72%-
2060: 35 7d 20 7b 2d 32 7d 0a 64 6f 5f 65 78 65 63 73  5} {-2}.do_execs
2070: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 36  ql_test e_expr-6
2080: 2e 34 20 7b 53 45 4c 45 43 54 20 2d 37 32 25 35  .4 {SELECT -72%5
2090: 7d 20 20 7b 2d 32 7d 0a 64 6f 5f 65 78 65 63 73  }  {-2}.do_execs
20a0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 36  ql_test e_expr-6
20b0: 2e 35 20 7b 53 45 4c 45 43 54 20 37 32 2e 33 35  .5 {SELECT 72.35
20c0: 25 35 7d 20 7b 32 2e 30 7d 0a 0a 23 2d 2d 2d 2d  %5} {2.0}..#----
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2110: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
2120: 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  t the results of
2130: 20 61 6c 6c 20 62 69 6e 61 72 79 20 6f 70 65 72   all binary oper
2140: 61 74 6f 72 73 20 61 72 65 20 65 69 74 68 65 72  ators are either
2150: 20 6e 75 6d 65 72 69 63 20 6f 72 20 0a 23 20 4e   numeric or .# N
2160: 55 4c 4c 2c 20 65 78 63 65 70 74 20 66 6f 72 20  ULL, except for 
2170: 74 68 65 20 7c 7c 20 6f 70 65 72 61 74 6f 72 2c  the || operator,
2180: 20 77 68 69 63 68 20 6d 61 79 20 65 76 61 6c 75   which may evalu
2190: 61 74 65 20 74 6f 20 65 69 74 68 65 72 20 61 20  ate to either a 
21a0: 74 65 78 74 0a 23 20 76 61 6c 75 65 20 6f 72 20  text.# value or 
21b0: 4e 55 4c 4c 2e 0a 23 0a 23 20 45 56 49 44 45 4e  NULL..#.# EVIDEN
21c0: 43 45 2d 4f 46 3a 20 52 2d 32 30 36 36 35 2d 31  CE-OF: R-20665-1
21d0: 37 37 39 32 20 54 68 65 20 72 65 73 75 6c 74 20  7792 The result 
21e0: 6f 66 20 61 6e 79 20 62 69 6e 61 72 79 20 6f 70  of any binary op
21f0: 65 72 61 74 6f 72 20 69 73 20 65 69 74 68 65 72  erator is either
2200: 0a 23 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c  .# a numeric val
2210: 75 65 20 6f 72 20 4e 55 4c 4c 2c 20 65 78 63 65  ue or NULL, exce
2220: 70 74 20 66 6f 72 20 74 68 65 20 7c 7c 20 63 6f  pt for the || co
2230: 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 70 65 72  ncatenation oper
2240: 61 74 6f 72 0a 23 20 77 68 69 63 68 20 61 6c 77  ator.# which alw
2250: 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ays evaluates to
2260: 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20   either NULL or 
2270: 61 20 74 65 78 74 20 76 61 6c 75 65 2e 0a 23 0a  a text value..#.
2280: 73 65 74 20 6c 69 74 65 72 61 6c 73 20 7b 0a 20  set literals {. 
2290: 20 31 20 27 61 62 63 27 20 20 20 20 20 20 20 20   1 'abc'        
22a0: 32 20 27 68 65 78 61 64 65 63 69 6d 61 6c 27 20  2 'hexadecimal' 
22b0: 20 20 20 20 20 20 33 20 27 27 0a 20 20 34 20 31        3 ''.  4 1
22c0: 32 33 20 20 20 20 20 20 20 20 20 20 35 20 2d 31  23          5 -1
22d0: 32 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20  23              
22e0: 20 20 36 20 30 0a 20 20 37 20 31 32 33 2e 34 20    6 0.  7 123.4 
22f0: 20 20 20 20 20 20 20 38 20 30 2e 30 20 20 20 20         8 0.0    
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 39 20 2d               9 -
2310: 31 32 33 2e 34 0a 20 31 30 20 58 27 41 42 43 44  123.4. 10 X'ABCD
2320: 45 46 27 20 20 20 31 31 20 58 27 27 20 20 20 20  EF'   11 X''    
2330: 20 20 20 20 20 20 20 20 20 20 20 20 31 32 20 58              12 X
2340: 27 30 30 30 30 27 0a 20 31 33 20 20 20 20 20 4e  '0000'. 13     N
2350: 55 4c 4c 0a 7d 0a 66 6f 72 65 61 63 68 20 6f 70  ULL.}.foreach op
2360: 20 24 6f 70 6c 69 73 74 20 7b 0a 20 20 66 6f 72   $oplist {.  for
2370: 65 61 63 68 20 7b 6e 31 20 72 68 73 7d 20 24 6c  each {n1 rhs} $l
2380: 69 74 65 72 61 6c 73 20 7b 20 0a 20 20 66 6f 72  iterals { .  for
2390: 65 61 63 68 20 7b 6e 32 20 6c 68 73 7d 20 24 6c  each {n2 lhs} $l
23a0: 69 74 65 72 61 6c 73 20 7b 0a 0a 20 20 20 20 73  iterals {..    s
23b0: 65 74 20 74 20 5b 64 62 20 6f 6e 65 20 22 20 53  et t [db one " S
23c0: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 24 6c 68  ELECT typeof($lh
23d0: 73 20 24 6f 70 20 24 72 68 73 29 20 22 5d 0a 20  s $op $rhs) "]. 
23e0: 20 20 20 64 6f 5f 74 65 73 74 20 65 5f 65 78 70     do_test e_exp
23f0: 72 2d 37 2e 24 6f 70 6e 61 6d 65 28 24 6f 70 29  r-7.$opname($op)
2400: 2e 24 6e 31 2e 24 6e 32 20 7b 0a 20 20 20 20 20  .$n1.$n2 {.     
2410: 20 65 78 70 72 20 7b 0a 20 20 20 20 20 20 20 20   expr {.        
2420: 20 20 20 28 24 6f 70 3d 3d 22 7c 7c 22 20 26 26     ($op=="||" &&
2430: 20 28 24 74 20 3d 3d 20 22 74 65 78 74 22 20 7c   ($t == "text" |
2440: 7c 20 24 74 20 3d 3d 20 22 6e 75 6c 6c 22 29 29  | $t == "null"))
2450: 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 24 6f 70  .        || ($op
2460: 21 3d 22 7c 7c 22 20 26 26 20 28 24 74 20 3d 3d  !="||" && ($t ==
2470: 20 22 69 6e 74 65 67 65 72 22 20 7c 7c 20 24 74   "integer" || $t
2480: 20 3d 3d 20 22 72 65 61 6c 22 20 7c 7c 20 24 74   == "real" || $t
2490: 20 3d 3d 20 22 6e 75 6c 6c 22 29 29 0a 20 20 20   == "null")).   
24a0: 20 20 20 7d 0a 20 20 20 20 7d 20 31 0a 0a 20 20     }.    } 1..  
24b0: 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}.}..#---------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2500: 0a 23 20 54 65 73 74 20 74 68 65 20 49 53 20 61  .# Test the IS a
2510: 6e 64 20 49 53 20 4e 4f 54 20 6f 70 65 72 61 74  nd IS NOT operat
2520: 6f 72 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ors..#.# EVIDENC
2530: 45 2d 4f 46 3a 20 52 2d 32 34 37 33 31 2d 34 35  E-OF: R-24731-45
2540: 37 37 33 20 54 68 65 20 49 53 20 61 6e 64 20 49  773 The IS and I
2550: 53 20 4e 4f 54 20 6f 70 65 72 61 74 6f 72 73 20  S NOT operators 
2560: 77 6f 72 6b 20 6c 69 6b 65 20 3d 20 61 6e 64 0a  work like = and.
2570: 23 20 21 3d 20 65 78 63 65 70 74 20 77 68 65 6e  # != except when
2580: 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   one or both of 
2590: 74 68 65 20 6f 70 65 72 61 6e 64 73 20 61 72 65  the operands are
25a0: 20 4e 55 4c 4c 2e 0a 23 0a 23 20 45 56 49 44 45   NULL..#.# EVIDE
25b0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 33 32 35 2d  NCE-OF: R-06325-
25c0: 31 35 33 31 35 20 49 6e 20 74 68 69 73 20 63 61  15315 In this ca
25d0: 73 65 2c 20 69 66 20 62 6f 74 68 20 6f 70 65 72  se, if both oper
25e0: 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 2c 0a 23  ands are NULL,.#
25f0: 20 74 68 65 6e 20 74 68 65 20 49 53 20 6f 70 65   then the IS ope
2600: 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73 20  rator evaluates 
2610: 74 6f 20 31 20 28 74 72 75 65 29 20 61 6e 64 20  to 1 (true) and 
2620: 74 68 65 20 49 53 20 4e 4f 54 20 6f 70 65 72 61  the IS NOT opera
2630: 74 6f 72 0a 23 20 65 76 61 6c 75 61 74 65 73 20  tor.# evaluates 
2640: 74 6f 20 30 20 28 66 61 6c 73 65 29 2e 0a 23 0a  to 0 (false)..#.
2650: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
2660: 2d 31 39 38 31 32 2d 33 36 37 37 39 20 49 66 20  -19812-36779 If 
2670: 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  one operand is N
2680: 55 4c 4c 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ULL and the othe
2690: 72 20 69 73 0a 23 20 6e 6f 74 2c 20 74 68 65 6e  r is.# not, then
26a0: 20 74 68 65 20 49 53 20 6f 70 65 72 61 74 6f 72   the IS operator
26b0: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 30 20   evaluates to 0 
26c0: 28 66 61 6c 73 65 29 20 61 6e 64 20 74 68 65 20  (false) and the 
26d0: 49 53 20 4e 4f 54 0a 23 20 6f 70 65 72 61 74 6f  IS NOT.# operato
26e0: 72 20 69 73 20 31 20 28 74 72 75 65 29 2e 0a 23  r is 1 (true)..#
26f0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
2700: 52 2d 36 31 39 37 35 2d 31 33 34 31 30 20 49 74  R-61975-13410 It
2710: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
2720: 20 66 6f 72 20 61 6e 20 49 53 20 6f 72 20 49 53   for an IS or IS
2730: 20 4e 4f 54 0a 23 20 65 78 70 72 65 73 73 69 6f   NOT.# expressio
2740: 6e 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 6f  n to evaluate to
2750: 20 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f 65 78 65 63   NULL..#.do_exec
2760: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
2770: 38 2e 31 2e 31 20 20 7b 20 53 45 4c 45 43 54 20  8.1.1  { SELECT 
2780: 4e 55 4c 4c 20 49 53 20 20 20 20 20 4e 55 4c 4c  NULL IS     NULL
2790: 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71   } {1}.do_execsq
27a0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
27b0: 31 2e 32 20 20 7b 20 53 45 4c 45 43 54 20 27 61  1.2  { SELECT 'a
27c0: 62 27 20 49 53 20 20 20 20 20 4e 55 4c 4c 20 7d  b' IS     NULL }
27d0: 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {0}.do_execsql_
27e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e  test e_expr-8.1.
27f0: 33 20 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c  3  { SELECT NULL
2800: 20 49 53 20 20 20 20 20 27 61 62 27 20 7d 20 7b   IS     'ab' } {
2810: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
2820: 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 34 20  st e_expr-8.1.4 
2830: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27 20 49   { SELECT 'ab' I
2840: 53 20 20 20 20 20 27 61 62 27 20 7d 20 7b 31 7d  S     'ab' } {1}
2850: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2860: 20 65 5f 65 78 70 72 2d 38 2e 31 2e 35 20 20 7b   e_expr-8.1.5  {
2870: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 3d 3d 20   SELECT NULL == 
2880: 20 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b 7d 7d 0a      NULL } {{}}.
2890: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
28a0: 65 5f 65 78 70 72 2d 38 2e 31 2e 36 20 20 7b 20  e_expr-8.1.6  { 
28b0: 53 45 4c 45 43 54 20 27 61 62 27 20 3d 3d 20 20  SELECT 'ab' ==  
28c0: 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b 7d 7d 0a 64     NULL } {{}}.d
28d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
28e0: 5f 65 78 70 72 2d 38 2e 31 2e 37 20 20 7b 20 53  _expr-8.1.7  { S
28f0: 45 4c 45 43 54 20 4e 55 4c 4c 20 3d 3d 20 20 20  ELECT NULL ==   
2900: 20 20 27 61 62 27 20 7d 20 7b 7b 7d 7d 0a 64 6f    'ab' } {{}}.do
2910: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
2920: 65 78 70 72 2d 38 2e 31 2e 38 20 20 7b 20 53 45  expr-8.1.8  { SE
2930: 4c 45 43 54 20 27 61 62 27 20 3d 3d 20 20 20 20  LECT 'ab' ==    
2940: 20 27 61 62 27 20 7d 20 7b 31 7d 0a 64 6f 5f 65   'ab' } {1}.do_e
2950: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
2960: 70 72 2d 38 2e 31 2e 39 20 20 7b 20 53 45 4c 45  pr-8.1.9  { SELE
2970: 43 54 20 4e 55 4c 4c 20 49 53 20 4e 4f 54 20 4e  CT NULL IS NOT N
2980: 55 4c 4c 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65  ULL } {0}.do_exe
2990: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
29a0: 2d 38 2e 31 2e 31 30 20 7b 20 53 45 4c 45 43 54  -8.1.10 { SELECT
29b0: 20 27 61 62 27 20 49 53 20 4e 4f 54 20 4e 55 4c   'ab' IS NOT NUL
29c0: 4c 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73  L } {1}.do_execs
29d0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38  ql_test e_expr-8
29e0: 2e 31 2e 31 31 20 7b 20 53 45 4c 45 43 54 20 4e  .1.11 { SELECT N
29f0: 55 4c 4c 20 49 53 20 4e 4f 54 20 27 61 62 27 20  ULL IS NOT 'ab' 
2a00: 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {1}.do_execsql
2a10: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31  _test e_expr-8.1
2a20: 2e 31 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .12 { SELECT 'ab
2a30: 27 20 49 53 20 4e 4f 54 20 27 61 62 27 20 7d 20  ' IS NOT 'ab' } 
2a40: 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {0}.do_execsql_t
2a50: 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31  est e_expr-8.1.1
2a60: 33 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20  3 { SELECT NULL 
2a70: 21 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b  !=     NULL } {{
2a80: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
2a90: 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31 34  st e_expr-8.1.14
2aa0: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27 20 21   { SELECT 'ab' !
2ab0: 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b 7d  =     NULL } {{}
2ac0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
2ad0: 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31 35 20  t e_expr-8.1.15 
2ae0: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 21 3d  { SELECT NULL !=
2af0: 20 20 20 20 20 27 61 62 27 20 7d 20 7b 7b 7d 7d       'ab' } {{}}
2b00: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2b10: 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31 36 20 7b   e_expr-8.1.16 {
2b20: 20 53 45 4c 45 43 54 20 27 61 62 27 20 21 3d 20   SELECT 'ab' != 
2b30: 20 20 20 20 27 61 62 27 20 7d 20 7b 30 7d 0a 0a      'ab' } {0}..
2b40: 66 6f 72 65 61 63 68 20 7b 6e 31 20 72 68 73 7d  foreach {n1 rhs}
2b50: 20 24 6c 69 74 65 72 61 6c 73 20 7b 20 0a 20 20   $literals { .  
2b60: 66 6f 72 65 61 63 68 20 7b 6e 32 20 6c 68 73 7d  foreach {n2 lhs}
2b70: 20 24 6c 69 74 65 72 61 6c 73 20 7b 0a 20 20 20   $literals {.   
2b80: 20 69 66 20 7b 24 72 68 73 21 3d 22 4e 55 4c 4c   if {$rhs!="NULL
2b90: 22 20 26 26 20 24 6c 68 73 21 3d 22 4e 55 4c 4c  " && $lhs!="NULL
2ba0: 22 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 65  "} {.      set e
2bb0: 71 20 5b 65 78 65 63 73 71 6c 20 22 53 45 4c 45  q [execsql "SELE
2bc0: 43 54 20 24 6c 68 73 20 3d 20 24 72 68 73 2c 20  CT $lhs = $rhs, 
2bd0: 24 6c 68 73 20 21 3d 20 24 72 68 73 22 5d 0a 20  $lhs != $rhs"]. 
2be0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2bf0: 20 20 73 65 74 20 65 71 20 5b 6c 69 73 74 20 5b    set eq [list [
2c00: 65 78 70 72 20 7b 24 6c 68 73 3d 3d 22 4e 55 4c  expr {$lhs=="NUL
2c10: 4c 22 20 26 26 20 24 72 68 73 3d 3d 22 4e 55 4c  L" && $rhs=="NUL
2c20: 4c 22 7d 5d 20 5c 0a 20 20 20 20 20 20 20 20 20  L"}] \.         
2c30: 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
2c40: 7b 24 6c 68 73 21 3d 22 4e 55 4c 4c 22 20 7c 7c  {$lhs!="NULL" ||
2c50: 20 24 72 68 73 21 3d 22 4e 55 4c 4c 22 7d 5d 0a   $rhs!="NULL"}].
2c60: 20 20 20 20 20 20 5d 0a 20 20 20 20 7d 0a 20 20        ].    }.  
2c70: 20 20 73 65 74 20 74 65 73 74 20 65 5f 65 78 70    set test e_exp
2c80: 72 2d 38 2e 32 2e 24 6e 31 2e 24 6e 32 0a 20 20  r-8.2.$n1.$n2.  
2c90: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
2ca0: 74 20 24 74 65 73 74 2e 31 20 22 53 45 4c 45 43  t $test.1 "SELEC
2cb0: 54 20 24 6c 68 73 20 49 53 20 24 72 68 73 2c 20  T $lhs IS $rhs, 
2cc0: 24 6c 68 73 20 49 53 20 4e 4f 54 20 24 72 68 73  $lhs IS NOT $rhs
2cd0: 22 20 24 65 71 0a 20 20 20 20 64 6f 5f 65 78 65  " $eq.    do_exe
2ce0: 63 73 71 6c 5f 74 65 73 74 20 24 74 65 73 74 2e  csql_test $test.
2cf0: 32 20 22 0a 20 20 20 20 20 20 53 45 4c 45 43 54  2 ".      SELECT
2d00: 20 28 24 6c 68 73 20 49 53 20 24 72 68 73 29 20   ($lhs IS $rhs) 
2d10: 49 53 20 4e 55 4c 4c 2c 20 28 24 6c 68 73 20 49  IS NULL, ($lhs I
2d20: 53 20 4e 4f 54 20 24 72 68 73 29 20 49 53 20 4e  S NOT $rhs) IS N
2d30: 55 4c 4c 0a 20 20 20 20 22 20 7b 30 20 30 7d 0a  ULL.    " {0 0}.
2d40: 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d    }.}..#--------
2d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d90: 2d 0a 23 20 52 75 6e 20 73 6f 6d 65 20 74 65 73  -.# Run some tes
2da0: 74 73 20 6f 6e 20 74 68 65 20 43 4f 4c 4c 41 54  ts on the COLLAT
2db0: 45 20 22 75 6e 61 72 79 20 70 6f 73 74 66 69 78  E "unary postfix
2dc0: 20 6f 70 65 72 61 74 6f 72 22 2e 0a 23 0a 23 20   operator"..#.# 
2dd0: 54 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  This collation s
2de0: 65 71 75 65 6e 63 65 20 72 65 76 65 72 73 65 73  equence reverses
2df0: 20 62 6f 74 68 20 61 72 67 75 6d 65 6e 74 73 20   both arguments 
2e00: 62 65 66 6f 72 65 20 75 73 69 6e 67 20 0a 23 20  before using .# 
2e10: 5b 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65 5d  [string compare]
2e20: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 68 65 6d   to compare them
2e30: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  . For example, w
2e40: 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  hen comparing th
2e50: 65 0a 23 20 73 74 72 69 6e 67 73 20 27 6f 6e 65  e.# strings 'one
2e60: 27 20 61 6e 64 20 27 66 6f 75 72 27 2c 20 72 65  ' and 'four', re
2e70: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
2e80: 6f 66 3a 0a 23 20 20 20 0a 23 20 20 20 73 74 72  of:.#   .#   str
2e90: 69 6e 67 20 63 6f 6d 70 61 72 65 20 65 6e 6f 20  ing compare eno 
2ea0: 72 75 6f 66 0a 23 0a 70 72 6f 63 20 72 65 76 65  ruof.#.proc reve
2eb0: 72 73 65 5f 73 74 72 20 7b 7a 53 74 72 7d 20 7b  rse_str {zStr} {
2ec0: 0a 20 20 73 65 74 20 6f 75 74 20 22 22 0a 20 20  .  set out "".  
2ed0: 66 6f 72 65 61 63 68 20 63 20 5b 73 70 6c 69 74  foreach c [split
2ee0: 20 24 7a 53 74 72 20 7b 7d 5d 20 7b 20 73 65 74   $zStr {}] { set
2ef0: 20 6f 75 74 20 22 24 7b 63 7d 24 7b 6f 75 74 7d   out "${c}${out}
2f00: 22 20 7d 0a 20 20 73 65 74 20 6f 75 74 0a 7d 0a  " }.  set out.}.
2f10: 70 72 6f 63 20 72 65 76 65 72 73 65 5f 63 6f 6c  proc reverse_col
2f20: 6c 61 74 65 20 7b 7a 4c 65 66 74 20 7a 52 69 67  late {zLeft zRig
2f30: 68 74 7d 20 7b 0a 20 20 73 74 72 69 6e 67 20 63  ht} {.  string c
2f40: 6f 6d 70 61 72 65 20 5b 72 65 76 65 72 73 65 5f  ompare [reverse_
2f50: 73 74 72 20 24 7a 4c 65 66 74 5d 20 5b 72 65 76  str $zLeft] [rev
2f60: 65 72 73 65 5f 73 74 72 20 24 7a 52 69 67 68 74  erse_str $zRight
2f70: 5d 0a 7d 0a 64 62 20 63 6f 6c 6c 61 74 65 20 72  ].}.db collate r
2f80: 65 76 65 72 73 65 20 72 65 76 65 72 73 65 5f 63  everse reverse_c
2f90: 6f 6c 6c 61 74 65 0a 0a 23 20 45 56 49 44 45 4e  ollate..# EVIDEN
2fa0: 43 45 2d 4f 46 3a 20 52 2d 35 39 35 37 37 2d 33  CE-OF: R-59577-3
2fb0: 33 34 37 31 20 54 68 65 20 43 4f 4c 4c 41 54 45  3471 The COLLATE
2fc0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 75   operator is a u
2fd0: 6e 61 72 79 20 70 6f 73 74 66 69 78 0a 23 20 6f  nary postfix.# o
2fe0: 70 65 72 61 74 6f 72 20 74 68 61 74 20 61 73 73  perator that ass
2ff0: 69 67 6e 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67  igns a collating
3000: 20 73 65 71 75 65 6e 63 65 20 74 6f 20 61 6e 20   sequence to an 
3010: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23 0a 23 20  expression..#.# 
3020: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
3030: 36 32 33 31 2d 33 30 37 33 31 20 54 68 65 20 43  6231-30731 The C
3040: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3050: 68 61 73 20 61 20 68 69 67 68 65 72 0a 23 20 70  has a higher.# p
3060: 72 65 63 65 64 65 6e 63 65 20 28 62 69 6e 64 73  recedence (binds
3070: 20 6d 6f 72 65 20 74 69 67 68 74 6c 79 29 20 74   more tightly) t
3080: 68 61 6e 20 61 6e 79 20 62 69 6e 61 72 79 20 6f  han any binary o
3090: 70 65 72 61 74 6f 72 20 61 6e 64 20 61 6e 79 20  perator and any 
30a0: 75 6e 61 72 79 0a 23 20 70 72 65 66 69 78 20 6f  unary.# prefix o
30b0: 70 65 72 61 74 6f 72 20 65 78 63 65 70 74 20 22  perator except "
30c0: 7e 22 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ~"..#.do_execsql
30d0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31  _test e_expr-9.1
30e0: 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64   { SELECT  'abcd
30f0: 27 20 3c 20 27 62 62 62 62 27 20 20 20 20 43 4f  ' < 'bbbb'    CO
3100: 4c 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d 20  LLATE reverse } 
3110: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
3120: 74 20 65 5f 65 78 70 72 2d 39 2e 32 20 7b 20 53  t e_expr-9.2 { S
3130: 45 4c 45 43 54 20 28 27 61 62 63 64 27 20 3c 20  ELECT ('abcd' < 
3140: 27 62 62 62 62 27 29 20 20 20 43 4f 4c 4c 41 54  'bbbb')   COLLAT
3150: 45 20 72 65 76 65 72 73 65 20 7d 20 31 0a 64 6f  E reverse } 1.do
3160: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3170: 65 78 70 72 2d 39 2e 33 20 7b 20 53 45 4c 45 43  expr-9.3 { SELEC
3180: 54 20 20 27 61 62 63 64 27 20 3c 3d 20 27 62 62  T  'abcd' <= 'bb
3190: 62 62 27 20 20 20 43 4f 4c 4c 41 54 45 20 72 65  bb'   COLLATE re
31a0: 76 65 72 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65  verse } 0.do_exe
31b0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
31c0: 2d 39 2e 34 20 7b 20 53 45 4c 45 43 54 20 28 27  -9.4 { SELECT ('
31d0: 61 62 63 64 27 20 3c 3d 20 27 62 62 62 62 27 29  abcd' <= 'bbbb')
31e0: 20 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73    COLLATE revers
31f0: 65 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71  e } 1..do_execsq
3200: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e  l_test e_expr-9.
3210: 35 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63  5 { SELECT  'abc
3220: 64 27 20 3e 20 27 62 62 62 62 27 20 20 20 20 43  d' > 'bbbb'    C
3230: 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d  OLLATE reverse }
3240: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
3250: 73 74 20 65 5f 65 78 70 72 2d 39 2e 36 20 7b 20  st e_expr-9.6 { 
3260: 53 45 4c 45 43 54 20 28 27 61 62 63 64 27 20 3e  SELECT ('abcd' >
3270: 20 27 62 62 62 62 27 29 20 20 20 43 4f 4c 4c 41   'bbbb')   COLLA
3280: 54 45 20 72 65 76 65 72 73 65 20 7d 20 30 0a 64  TE reverse } 0.d
3290: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
32a0: 5f 65 78 70 72 2d 39 2e 37 20 7b 20 53 45 4c 45  _expr-9.7 { SELE
32b0: 43 54 20 20 27 61 62 63 64 27 20 3e 3d 20 27 62  CT  'abcd' >= 'b
32c0: 62 62 62 27 20 20 20 43 4f 4c 4c 41 54 45 20 72  bbb'   COLLATE r
32d0: 65 76 65 72 73 65 20 7d 20 31 0a 64 6f 5f 65 78  everse } 1.do_ex
32e0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
32f0: 72 2d 39 2e 38 20 7b 20 53 45 4c 45 43 54 20 28  r-9.8 { SELECT (
3300: 27 61 62 63 64 27 20 3e 3d 20 27 62 62 62 62 27  'abcd' >= 'bbbb'
3310: 29 20 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72  )  COLLATE rever
3320: 73 65 20 7d 20 30 0a 0a 64 6f 5f 65 78 65 63 73  se } 0..do_execs
3330: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
3340: 2e 31 30 20 7b 20 53 45 4c 45 43 54 20 20 27 61  .10 { SELECT  'a
3350: 62 63 64 27 20 3d 20 20 27 41 42 43 44 27 20 20  bcd' =  'ABCD'  
3360: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d  COLLATE nocase }
3370: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
3380: 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 31 20 7b  st e_expr-9.11 {
3390: 20 53 45 4c 45 43 54 20 28 27 61 62 63 64 27 20   SELECT ('abcd' 
33a0: 3d 20 20 27 41 42 43 44 27 29 20 43 4f 4c 4c 41  =  'ABCD') COLLA
33b0: 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64 6f  TE nocase } 0.do
33c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
33d0: 65 78 70 72 2d 39 2e 31 32 20 7b 20 53 45 4c 45  expr-9.12 { SELE
33e0: 43 54 20 20 27 61 62 63 64 27 20 3d 3d 20 27 41  CT  'abcd' == 'A
33f0: 42 43 44 27 20 20 43 4f 4c 4c 41 54 45 20 6e 6f  BCD'  COLLATE no
3400: 63 61 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  case } 1.do_exec
3410: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3420: 39 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 28 27  9.13 { SELECT ('
3430: 61 62 63 64 27 20 3d 3d 20 27 41 42 43 44 27 29  abcd' == 'ABCD')
3440: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
3450: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
3460: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 34 20  est e_expr-9.14 
3470: 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27  { SELECT  'abcd'
3480: 20 49 53 20 27 41 42 43 44 27 20 20 43 4f 4c 4c   IS 'ABCD'  COLL
3490: 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64  ATE nocase } 1.d
34a0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
34b0: 5f 65 78 70 72 2d 39 2e 31 35 20 7b 20 53 45 4c  _expr-9.15 { SEL
34c0: 45 43 54 20 28 27 61 62 63 64 27 20 49 53 20 27  ECT ('abcd' IS '
34d0: 41 42 43 44 27 29 20 43 4f 4c 4c 41 54 45 20 6e  ABCD') COLLATE n
34e0: 6f 63 61 73 65 20 7d 20 30 0a 0a 64 6f 5f 65 78  ocase } 0..do_ex
34f0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3500: 72 2d 39 2e 31 36 20 7b 20 53 45 4c 45 43 54 20  r-9.16 { SELECT 
3510: 20 27 61 62 63 64 27 20 21 3d 20 27 41 42 43 44   'abcd' != 'ABCD
3520: 27 20 20 20 20 20 20 43 4f 4c 4c 41 54 45 20 6e  '      COLLATE n
3530: 6f 63 61 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65  ocase } 0.do_exe
3540: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3550: 2d 39 2e 31 37 20 7b 20 53 45 4c 45 43 54 20 28  -9.17 { SELECT (
3560: 27 61 62 63 64 27 20 21 3d 20 27 41 42 43 44 27  'abcd' != 'ABCD'
3570: 29 20 20 20 20 20 43 4f 4c 4c 41 54 45 20 6e 6f  )     COLLATE no
3580: 63 61 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  case } 1.do_exec
3590: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
35a0: 39 2e 31 38 20 7b 20 53 45 4c 45 43 54 20 20 27  9.18 { SELECT  '
35b0: 61 62 63 64 27 20 3c 3e 20 27 41 42 43 44 27 20  abcd' <> 'ABCD' 
35c0: 20 20 20 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63       COLLATE noc
35d0: 61 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  ase } 0.do_execs
35e0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
35f0: 2e 31 39 20 7b 20 53 45 4c 45 43 54 20 28 27 61  .19 { SELECT ('a
3600: 62 63 64 27 20 3c 3e 20 27 41 42 43 44 27 29 20  bcd' <> 'ABCD') 
3610: 20 20 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61      COLLATE noca
3620: 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71  se } 1.do_execsq
3630: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e  l_test e_expr-9.
3640: 32 30 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62  20 { SELECT  'ab
3650: 63 64 27 20 49 53 20 4e 4f 54 20 27 41 42 43 44  cd' IS NOT 'ABCD
3660: 27 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  '  COLLATE nocas
3670: 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  e } 0.do_execsql
3680: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
3690: 31 20 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63  1 { SELECT ('abc
36a0: 64 27 20 49 53 20 4e 4f 54 20 27 41 42 43 44 27  d' IS NOT 'ABCD'
36b0: 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ) COLLATE nocase
36c0: 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   } 1..do_execsql
36d0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
36e0: 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 27 62  2 { .  SELECT 'b
36f0: 62 62 27 20 42 45 54 57 45 45 4e 20 27 41 41 41  bb' BETWEEN 'AAA
3700: 27 20 41 4e 44 20 27 43 43 43 27 20 43 4f 4c 4c  ' AND 'CCC' COLL
3710: 41 54 45 20 6e 6f 63 61 73 65 20 0a 7d 20 31 0a  ATE nocase .} 1.
3720: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3730: 65 5f 65 78 70 72 2d 39 2e 32 33 20 7b 20 0a 20  e_expr-9.23 { . 
3740: 20 53 45 4c 45 43 54 20 28 27 62 62 62 27 20 42   SELECT ('bbb' B
3750: 45 54 57 45 45 4e 20 27 41 41 41 27 20 41 4e 44  ETWEEN 'AAA' AND
3760: 20 27 43 43 43 27 29 20 43 4f 4c 4c 41 54 45 20   'CCC') COLLATE 
3770: 6e 6f 63 61 73 65 20 0a 7d 20 30 0a 0a 23 20 45  nocase .} 0..# E
3780: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
3790: 37 33 31 2d 32 35 34 33 39 20 54 68 65 20 63 6f  731-25439 The co
37a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
37b0: 20 73 65 74 20 62 79 20 74 68 65 20 43 4f 4c 4c   set by the COLL
37c0: 41 54 45 0a 23 20 6f 70 65 72 61 74 6f 72 20 6f  ATE.# operator o
37d0: 76 65 72 72 69 64 65 73 20 74 68 65 20 63 6f 6c  verrides the col
37e0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
37f0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
3800: 65 20 43 4f 4c 4c 41 54 45 0a 23 20 63 6c 61 75  e COLLATE.# clau
3810: 73 65 20 69 6e 20 61 20 74 61 62 6c 65 20 63 6f  se in a table co
3820: 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2e  lumn definition.
3830: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
3840: 73 74 20 65 5f 65 78 70 72 2d 39 2e 32 34 20 7b  st e_expr-9.24 {
3850: 20 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45   .  CREATE TABLE
3860: 20 74 32 34 28 61 20 43 4f 4c 4c 41 54 45 20 4e   t24(a COLLATE N
3870: 4f 43 41 53 45 2c 20 62 29 3b 0a 20 20 49 4e 53  OCASE, b);.  INS
3880: 45 52 54 20 49 4e 54 4f 20 74 32 34 20 56 41 4c  ERT INTO t24 VAL
3890: 55 45 53 28 27 61 61 61 27 2c 20 31 29 3b 0a 20  UES('aaa', 1);. 
38a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 34   INSERT INTO t24
38b0: 20 56 41 4c 55 45 53 28 27 62 62 62 27 2c 20 32   VALUES('bbb', 2
38c0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
38d0: 20 74 32 34 20 56 41 4c 55 45 53 28 27 63 63 63   t24 VALUES('ccc
38e0: 27 2c 20 33 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65  ', 3);.} {}.do_e
38f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
3900: 70 72 2d 39 2e 32 35 20 7b 20 53 45 4c 45 43 54  pr-9.25 { SELECT
3910: 20 27 42 42 42 27 20 3d 20 61 20 46 52 4f 4d 20   'BBB' = a FROM 
3920: 74 32 34 20 7d 20 7b 30 20 31 20 30 7d 0a 64 6f  t24 } {0 1 0}.do
3930: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3940: 65 78 70 72 2d 39 2e 32 35 20 7b 20 53 45 4c 45  expr-9.25 { SELE
3950: 43 54 20 61 20 3d 20 27 42 42 42 27 20 46 52 4f  CT a = 'BBB' FRO
3960: 4d 20 74 32 34 20 7d 20 7b 30 20 31 20 30 7d 0a  M t24 } {0 1 0}.
3970: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3980: 65 5f 65 78 70 72 2d 39 2e 32 35 20 7b 20 53 45  e_expr-9.25 { SE
3990: 4c 45 43 54 20 27 42 42 42 27 20 3d 20 61 20 43  LECT 'BBB' = a C
39a0: 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 46 52  OLLATE binary FR
39b0: 4f 4d 20 74 32 34 20 7d 20 7b 30 20 30 20 30 7d  OM t24 } {0 0 0}
39c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
39d0: 20 65 5f 65 78 70 72 2d 39 2e 32 35 20 7b 20 53   e_expr-9.25 { S
39e0: 45 4c 45 43 54 20 61 20 43 4f 4c 4c 41 54 45 20  ELECT a COLLATE 
39f0: 62 69 6e 61 72 79 20 3d 20 27 42 42 42 27 20 46  binary = 'BBB' F
3a00: 52 4f 4d 20 74 32 34 20 7d 20 7b 30 20 30 20 30  ROM t24 } {0 0 0
3a10: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
3a60: 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74 73 20  Test statements 
3a70: 72 65 6c 61 74 65 64 20 74 6f 20 6c 69 74 65 72  related to liter
3a80: 61 6c 20 76 61 6c 75 65 73 2e 0a 23 0a 23 20 45  al values..#.# E
3a90: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
3aa0: 35 33 36 2d 33 32 30 30 38 20 4c 69 74 65 72 61  536-32008 Litera
3ab0: 6c 20 76 61 6c 75 65 73 20 6d 61 79 20 62 65 20  l values may be 
3ac0: 69 6e 74 65 67 65 72 73 2c 20 66 6c 6f 61 74 69  integers, floati
3ad0: 6e 67 0a 23 20 70 6f 69 6e 74 20 6e 75 6d 62 65  ng.# point numbe
3ae0: 72 73 2c 20 73 74 72 69 6e 67 73 2c 20 42 4c 4f  rs, strings, BLO
3af0: 42 73 2c 20 6f 72 20 4e 55 4c 4c 73 2e 0a 23 0a  Bs, or NULLs..#.
3b00: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3b10: 65 5f 65 78 70 72 2d 31 30 2e 31 2e 31 20 7b 20  e_expr-10.1.1 { 
3b20: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 35 29  SELECT typeof(5)
3b30: 20 20 20 20 20 20 20 7d 20 7b 69 6e 74 65 67 65         } {intege
3b40: 72 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  r}.do_execsql_te
3b50: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 31 2e 32  st e_expr-10.1.2
3b60: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3b70: 28 35 2e 31 29 20 20 20 20 20 7d 20 7b 72 65 61  (5.1)     } {rea
3b80: 6c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  l}.do_execsql_te
3b90: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 31 2e 33  st e_expr-10.1.3
3ba0: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3bb0: 28 27 35 2e 31 27 29 20 20 20 7d 20 7b 74 65 78  ('5.1')   } {tex
3bc0: 74 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  t}.do_execsql_te
3bd0: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 31 2e 34  st e_expr-10.1.4
3be0: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3bf0: 28 58 27 41 42 43 44 27 29 20 7d 20 7b 62 6c 6f  (X'ABCD') } {blo
3c00: 62 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  b}.do_execsql_te
3c10: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 31 2e 35  st e_expr-10.1.5
3c20: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3c30: 28 4e 55 4c 4c 29 20 20 20 20 7d 20 7b 6e 75 6c  (NULL)    } {nul
3c40: 6c 7d 0a 0a 23 20 22 53 63 69 65 6e 74 69 66 69  l}..# "Scientifi
3c50: 63 20 6e 6f 74 61 74 69 6f 6e 20 69 73 20 73 75  c notation is su
3c60: 70 70 6f 72 74 65 64 20 66 6f 72 20 70 6f 69 6e  pported for poin
3c70: 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73  t literal values
3c80: 2e 22 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  .".#.do_execsql_
3c90: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 32  test e_expr-10.2
3ca0: 2e 31 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65  .1 { SELECT type
3cb0: 6f 66 28 33 2e 34 65 2d 30 32 29 20 20 20 20 7d  of(3.4e-02)    }
3cc0: 20 7b 72 65 61 6c 7d 0a 64 6f 5f 65 78 65 63 73   {real}.do_execs
3cd0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
3ce0: 30 2e 32 2e 32 20 7b 20 53 45 4c 45 43 54 20 74  0.2.2 { SELECT t
3cf0: 79 70 65 6f 66 28 33 65 2b 35 29 20 20 20 20 20  ypeof(3e+5)     
3d00: 20 20 7d 20 7b 72 65 61 6c 7d 0a 64 6f 5f 65 78    } {real}.do_ex
3d10: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3d20: 72 2d 31 30 2e 32 2e 33 20 7b 20 53 45 4c 45 43  r-10.2.3 { SELEC
3d30: 54 20 33 2e 34 65 2d 30 32 20 20 20 20 20 20 20  T 3.4e-02       
3d40: 20 20 20 20 20 7d 20 7b 30 2e 30 33 34 7d 0a 64       } {0.034}.d
3d50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
3d60: 5f 65 78 70 72 2d 31 30 2e 32 2e 34 20 7b 20 53  _expr-10.2.4 { S
3d70: 45 4c 45 43 54 20 33 65 2b 34 20 20 20 20 20 20  ELECT 3e+4      
3d80: 20 20 20 20 20 20 20 20 20 7d 20 7b 33 30 30 30           } {3000
3d90: 30 2e 30 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  0.0}..# EVIDENCE
3da0: 2d 4f 46 3a 20 52 2d 33 35 32 32 39 2d 31 37 38  -OF: R-35229-178
3db0: 33 30 20 41 20 73 74 72 69 6e 67 20 63 6f 6e 73  30 A string cons
3dc0: 74 61 6e 74 20 69 73 20 66 6f 72 6d 65 64 20 62  tant is formed b
3dd0: 79 20 65 6e 63 6c 6f 73 69 6e 67 0a 23 20 74 68  y enclosing.# th
3de0: 65 20 73 74 72 69 6e 67 20 69 6e 20 73 69 6e 67  e string in sing
3df0: 6c 65 20 71 75 6f 74 65 73 20 28 27 29 2e 0a 23  le quotes (')..#
3e00: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
3e10: 52 2d 30 37 31 30 30 2d 30 36 36 30 36 20 41 20  R-07100-06606 A 
3e20: 73 69 6e 67 6c 65 20 71 75 6f 74 65 20 77 69 74  single quote wit
3e30: 68 69 6e 20 74 68 65 20 73 74 72 69 6e 67 20 63  hin the string c
3e40: 61 6e 20 62 65 0a 23 20 65 6e 63 6f 64 65 64 20  an be.# encoded 
3e50: 62 79 20 70 75 74 74 69 6e 67 20 74 77 6f 20 73  by putting two s
3e60: 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 69 6e 20  ingle quotes in 
3e70: 61 20 72 6f 77 20 2d 20 61 73 20 69 6e 20 50 61  a row - as in Pa
3e80: 73 63 61 6c 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  scal..#.do_execs
3e90: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
3ea0: 30 2e 33 2e 31 20 7b 20 53 45 4c 45 43 54 20 27  0.3.1 { SELECT '
3eb0: 69 73 20 6e 6f 74 27 20 7d 20 20 20 20 20 20 20  is not' }       
3ec0: 20 20 7b 7b 69 73 20 6e 6f 74 7d 7d 0a 64 6f 5f    {{is not}}.do_
3ed0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3ee0: 78 70 72 2d 31 30 2e 33 2e 32 20 7b 20 53 45 4c  xpr-10.3.2 { SEL
3ef0: 45 43 54 20 74 79 70 65 6f 66 28 27 69 73 20 6e  ECT typeof('is n
3f00: 6f 74 27 29 20 7d 20 7b 74 65 78 74 7d 0a 64 6f  ot') } {text}.do
3f10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3f20: 65 78 70 72 2d 31 30 2e 33 2e 33 20 7b 20 53 45  expr-10.3.3 { SE
3f30: 4c 45 43 54 20 27 69 73 6e 27 27 74 27 20 7d 20  LECT 'isn''t' } 
3f40: 20 20 20 20 20 20 20 20 7b 69 73 6e 27 74 7d 0a          {isn't}.
3f50: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3f60: 65 5f 65 78 70 72 2d 31 30 2e 33 2e 34 20 7b 20  e_expr-10.3.4 { 
3f70: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 27 69  SELECT typeof('i
3f80: 73 6e 27 27 74 27 29 20 7d 20 7b 74 65 78 74 7d  sn''t') } {text}
3f90: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
3fa0: 20 52 2d 30 39 35 39 33 2d 30 33 33 32 31 20 42   R-09593-03321 B
3fb0: 4c 4f 42 20 6c 69 74 65 72 61 6c 73 20 61 72 65  LOB literals are
3fc0: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   string literals
3fd0: 0a 23 20 63 6f 6e 74 61 69 6e 69 6e 67 20 68 65  .# containing he
3fe0: 78 61 64 65 63 69 6d 61 6c 20 64 61 74 61 20 61  xadecimal data a
3ff0: 6e 64 20 70 72 65 63 65 64 65 64 20 62 79 20 61  nd preceded by a
4000: 20 73 69 6e 67 6c 65 20 22 78 22 20 6f 72 20 22   single "x" or "
4010: 58 22 0a 23 20 63 68 61 72 61 63 74 65 72 2e 0a  X".# character..
4020: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
4030: 20 52 2d 31 39 38 33 36 2d 31 31 32 34 34 20 45   R-19836-11244 E
4040: 78 61 6d 70 6c 65 3a 20 58 27 35 33 35 31 34 43  xample: X'53514C
4050: 36 39 37 34 36 35 27 0a 23 0a 64 6f 5f 65 78 65  697465'.#.do_exe
4060: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
4070: 2d 31 30 2e 34 2e 31 20 7b 20 53 45 4c 45 43 54  -10.4.1 { SELECT
4080: 20 74 79 70 65 6f 66 28 58 27 30 31 32 33 34 35   typeof(X'012345
4090: 36 37 38 39 41 42 43 44 45 46 27 29 20 7d 20 62  6789ABCDEF') } b
40a0: 6c 6f 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  lob.do_execsql_t
40b0: 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e  est e_expr-10.4.
40c0: 32 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f  2 { SELECT typeo
40d0: 66 28 78 27 30 31 32 33 34 35 36 37 38 39 41 42  f(x'0123456789AB
40e0: 43 44 45 46 27 29 20 7d 20 62 6c 6f 62 0a 64 6f  CDEF') } blob.do
40f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
4100: 65 78 70 72 2d 31 30 2e 34 2e 33 20 7b 20 53 45  expr-10.4.3 { SE
4110: 4c 45 43 54 20 74 79 70 65 6f 66 28 58 27 30 31  LECT typeof(X'01
4120: 32 33 34 35 36 37 38 39 61 62 63 64 65 66 27 29  23456789abcdef')
4130: 20 7d 20 62 6c 6f 62 0a 64 6f 5f 65 78 65 63 73   } blob.do_execs
4140: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
4150: 30 2e 34 2e 34 20 7b 20 53 45 4c 45 43 54 20 74  0.4.4 { SELECT t
4160: 79 70 65 6f 66 28 78 27 30 31 32 33 34 35 36 37  ypeof(x'01234567
4170: 38 39 61 62 63 64 65 66 27 29 20 7d 20 62 6c 6f  89abcdef') } blo
4180: 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  b.do_execsql_tes
4190: 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e 35 20  t e_expr-10.4.5 
41a0: 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28  { SELECT typeof(
41b0: 58 27 35 33 35 31 34 43 36 39 37 34 36 35 27 29  X'53514C697465')
41c0: 20 20 20 20 20 7d 20 62 6c 6f 62 0a 0a 23 20 45       } blob..# E
41d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33  VIDENCE-OF: R-23
41e0: 39 31 34 2d 35 31 34 37 36 20 41 20 6c 69 74 65  914-51476 A lite
41f0: 72 61 6c 20 76 61 6c 75 65 20 63 61 6e 20 61 6c  ral value can al
4200: 73 6f 20 62 65 20 74 68 65 20 74 6f 6b 65 6e 0a  so be the token.
4210: 23 20 22 4e 55 4c 4c 22 2e 0a 23 0a 64 6f 5f 65  # "NULL"..#.do_e
4220: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
4230: 70 72 2d 31 30 2e 35 2e 31 20 7b 20 53 45 4c 45  pr-10.5.1 { SELE
4240: 43 54 20 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  CT NULL         
4250: 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  } {{}}.do_execsq
4260: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30  l_test e_expr-10
4270: 2e 35 2e 32 20 7b 20 53 45 4c 45 43 54 20 74 79  .5.2 { SELECT ty
4280: 70 65 6f 66 28 4e 55 4c 4c 29 20 7d 20 7b 6e 75  peof(NULL) } {nu
4290: 6c 6c 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ll}..#----------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
42e0: 23 20 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74  # Test statement
42f0: 73 20 72 65 6c 61 74 65 64 20 74 6f 20 62 6f 75  s related to bou
4300: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 0a 23 0a  nd parameters.#.
4310: 0a 70 72 6f 63 20 70 61 72 61 6d 65 74 65 72 5f  .proc parameter_
4320: 74 65 73 74 20 7b 74 6e 20 73 71 6c 20 70 61 72  test {tn sql par
4330: 61 6d 73 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20  ams result} {.  
4340: 73 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65  set stmt [sqlite
4350: 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20  3_prepare_v2 db 
4360: 24 73 71 6c 20 2d 31 5d 0a 0a 20 20 66 6f 72 65  $sql -1]..  fore
4370: 61 63 68 20 7b 6e 75 6d 62 65 72 20 6e 61 6d 65  ach {number name
4380: 7d 20 24 70 61 72 61 6d 73 20 7b 0a 20 20 20 20  } $params {.    
4390: 73 65 74 20 6e 6d 20 5b 73 71 6c 69 74 65 33 5f  set nm [sqlite3_
43a0: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
43b0: 61 6d 65 20 24 73 74 6d 74 20 24 6e 75 6d 62 65  ame $stmt $numbe
43c0: 72 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24  r].    do_test $
43d0: 74 6e 2e 6e 61 6d 65 2e 24 6e 75 6d 62 65 72 20  tn.name.$number 
43e0: 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 6e 6d  [list set {} $nm
43f0: 5d 20 24 6e 61 6d 65 0a 20 20 20 20 73 71 6c 69  ] $name.    sqli
4400: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 24 73 74  te3_bind_int $st
4410: 6d 74 20 24 6e 75 6d 62 65 72 20 5b 65 78 70 72  mt $number [expr
4420: 20 2d 31 20 2a 20 24 6e 75 6d 62 65 72 5d 0a 20   -1 * $number]. 
4430: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   }..  sqlite3_st
4440: 65 70 20 24 73 74 6d 74 0a 0a 20 20 73 65 74 20  ep $stmt..  set 
4450: 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72  res [list].  for
4460: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
4470: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   [sqlite3_column
4480: 5f 63 6f 75 6e 74 20 24 73 74 6d 74 5d 7d 20 7b  _count $stmt]} {
4490: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61  incr i} {.    la
44a0: 70 70 65 6e 64 20 72 65 73 20 5b 73 71 6c 69 74  ppend res [sqlit
44b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24  e3_column_text $
44c0: 73 74 6d 74 20 24 69 5d 0a 20 20 7d 0a 0a 20 20  stmt $i].  }..  
44d0: 73 65 74 20 72 63 20 5b 73 71 6c 69 74 65 33 5f  set rc [sqlite3_
44e0: 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 5d 0a  finalize $stmt].
44f0: 20 20 64 6f 5f 74 65 73 74 20 24 74 6e 2e 72 63    do_test $tn.rc
4500: 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72   [list set {} $r
4510: 63 5d 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 64  c] SQLITE_OK.  d
4520: 6f 5f 74 65 73 74 20 24 74 6e 2e 72 65 73 20 5b  o_test $tn.res [
4530: 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72 65 73  list set {} $res
4540: 5d 20 24 72 65 73 75 6c 74 0a 7d 0a 0a 23 20 45  ] $result.}..# E
4550: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33  VIDENCE-OF: R-33
4560: 35 30 39 2d 33 39 34 35 38 20 41 20 71 75 65 73  509-39458 A ques
4570: 74 69 6f 6e 20 6d 61 72 6b 20 66 6f 6c 6c 6f 77  tion mark follow
4580: 65 64 20 62 79 20 61 20 6e 75 6d 62 65 72 20 4e  ed by a number N
4590: 4e 4e 0a 23 20 68 6f 6c 64 73 20 61 20 73 70 6f  NN.# holds a spo
45a0: 74 20 66 6f 72 20 74 68 65 20 4e 4e 4e 2d 74 68  t for the NNN-th
45b0: 20 70 61 72 61 6d 65 74 65 72 2e 20 4e 4e 4e 20   parameter. NNN 
45c0: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
45d0: 31 20 61 6e 64 0a 23 20 53 51 4c 49 54 45 5f 4d  1 and.# SQLITE_M
45e0: 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
45f0: 45 52 2e 0a 23 0a 73 65 74 20 6d 76 6e 20 24 53  ER..#.set mvn $S
4600: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
4610: 4c 45 5f 4e 55 4d 42 45 52 0a 70 61 72 61 6d 65  LE_NUMBER.parame
4620: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4630: 31 31 2e 31 20 22 0a 20 20 53 45 4c 45 43 54 20  11.1 ".  SELECT 
4640: 3f 31 2c 20 3f 31 32 33 2c 20 3f 24 53 51 4c 49  ?1, ?123, ?$SQLI
4650: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
4660: 4e 55 4d 42 45 52 2c 20 3f 31 32 33 2c 20 3f 34  NUMBER, ?123, ?4
4670: 0a 22 20 20 20 22 31 20 3f 31 20 20 31 32 33 20  ."   "1 ?1  123 
4680: 3f 31 32 33 20 24 6d 76 6e 20 3f 24 6d 76 6e 20  ?123 $mvn ?$mvn 
4690: 34 20 3f 34 22 20 20 20 22 2d 31 20 2d 31 32 33  4 ?4"   "-1 -123
46a0: 20 2d 24 6d 76 6e 20 2d 31 32 33 20 2d 34 22 0a   -$mvn -123 -4".
46b0: 0a 73 65 74 20 65 72 72 6d 73 67 20 22 76 61 72  .set errmsg "var
46c0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
46d0: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
46e0: 61 6e 64 20 3f 24 53 51 4c 49 54 45 5f 4d 41 58  and ?$SQLITE_MAX
46f0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4700: 22 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 70 61  ".foreach {tn pa
4710: 72 61 6d 5f 6e 75 6d 62 65 72 7d 20 5b 6c 69 73  ram_number} [lis
4720: 74 20 5c 0a 20 20 32 20 20 30 20 20 20 20 20 20  t \.  2  0      
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4750: 20 20 33 20 20 5b 65 78 70 72 20 24 53 51 4c 49    3  [expr $SQLI
4760: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
4770: 4e 55 4d 42 45 52 2b 31 5d 20 5c 0a 20 20 34 20  NUMBER+1] \.  4 
4780: 20 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d   [expr $SQLITE_M
4790: 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
47a0: 45 52 2b 32 5d 20 5c 0a 20 20 35 20 20 31 32 33  ER+2] \.  5  123
47b0: 34 35 36 37 38 39 30 33 34 35 36 37 38 39 30 33  4567890345678903
47c0: 34 35 36 37 38 39 30 32 33 34 35 36 37 38 39 30  4567890234567890
47d0: 20 20 5c 0a 20 20 36 20 20 32 31 34 37 34 38 33    \.  6  2147483
47e0: 36 34 38 20 20 20 20 20 20 20 20 20 20 20 20 20  648             
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4800: 20 20 37 20 20 32 31 34 37 34 38 33 36 34 39 20    7  2147483649 
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 38 20            \.  8 
4830: 20 34 32 39 34 39 36 37 32 39 36 20 20 20 20 20   4294967296     
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 5c 0a 20 20 39 20 20 34 32 39        \.  9  429
4860: 34 39 36 37 32 39 37 20 20 20 20 20 20 20 20 20  4967297         
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 5c 0a 20 20 31 30 20 39 32 32 33 33 37 32    \.  10 9223372
4890: 30 33 36 38 35 34 37 37 35 38 30 38 20 20 20 20  036854775808    
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
48b0: 20 20 31 31 20 39 32 32 33 33 37 32 30 33 36 38    11 92233720368
48c0: 35 34 37 37 35 38 30 39 20 20 20 20 20 20 20 20  54775809        
48d0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 31 32            \.  12
48e0: 20 31 38 34 34 36 37 34 34 30 37 33 37 30 39 35   184467440737095
48f0: 35 31 36 31 36 20 20 20 20 20 20 20 20 20 20 20  51616           
4900: 20 20 20 20 20 20 5c 0a 20 20 31 33 20 31 38 34        \.  13 184
4910: 34 36 37 34 34 30 37 33 37 30 39 35 35 31 36 31  4674407370955161
4920: 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
4930: 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 63 61 74    \.] {.  do_cat
4940: 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  chsql_test e_exp
4950: 72 2d 31 31 2e 31 2e 24 74 6e 20 22 53 45 4c 45  r-11.1.$tn "SELE
4960: 43 54 20 3f 24 70 61 72 61 6d 5f 6e 75 6d 62 65  CT ?$param_numbe
4970: 72 22 20 5b 6c 69 73 74 20 31 20 24 65 72 72 6d  r" [list 1 $errm
4980: 73 67 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  sg].}..# EVIDENC
4990: 45 2d 4f 46 3a 20 52 2d 33 33 36 37 30 2d 33 36  E-OF: R-33670-36
49a0: 30 39 37 20 41 20 71 75 65 73 74 69 6f 6e 20 6d  097 A question m
49b0: 61 72 6b 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ark that is not 
49c0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 0a 23 20  followed by a.# 
49d0: 6e 75 6d 62 65 72 20 63 72 65 61 74 65 73 20 61  number creates a
49e0: 20 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20   parameter with 
49f0: 61 20 6e 75 6d 62 65 72 20 6f 6e 65 20 67 72 65  a number one gre
4a00: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  ater than the la
4a10: 72 67 65 73 74 0a 23 20 70 61 72 61 6d 65 74 65  rgest.# paramete
4a20: 72 20 6e 75 6d 62 65 72 20 61 6c 72 65 61 64 79  r number already
4a30: 20 61 73 73 69 67 6e 65 64 2e 0a 23 0a 23 20 45   assigned..#.# E
4a40: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32  VIDENCE-OF: R-42
4a50: 39 33 38 2d 30 37 30 33 30 20 49 66 20 74 68 69  938-07030 If thi
4a60: 73 20 6d 65 61 6e 73 20 74 68 65 20 70 61 72 61  s means the para
4a70: 6d 65 74 65 72 20 6e 75 6d 62 65 72 20 69 73 0a  meter number is.
4a80: 23 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  # greater than S
4a90: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
4aa0: 4c 45 5f 4e 55 4d 42 45 52 2c 20 69 74 20 69 73  LE_NUMBER, it is
4ab0: 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 70 61 72   an error..#.par
4ac0: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
4ad0: 70 72 2d 31 31 2e 32 2e 31 20 22 53 45 4c 45 43  pr-11.2.1 "SELEC
4ae0: 54 20 3f 22 20 20 20 20 20 20 20 20 20 20 7b 31  T ?"          {1
4af0: 20 7b 7d 7d 20 20 20 20 20 20 20 2d 31 0a 70 61   {}}       -1.pa
4b00: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
4b10: 78 70 72 2d 31 31 2e 32 2e 32 20 22 53 45 4c 45  xpr-11.2.2 "SELE
4b20: 43 54 20 3f 2c 20 3f 22 20 20 20 20 20 20 20 7b  CT ?, ?"       {
4b30: 31 20 7b 7d 20 32 20 7b 7d 7d 20 20 7b 2d 31 20  1 {} 2 {}}  {-1 
4b40: 2d 32 7d 0a 70 61 72 61 6d 65 74 65 72 5f 74 65  -2}.parameter_te
4b50: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 33  st e_expr-11.2.3
4b60: 20 22 53 45 4c 45 43 54 20 3f 35 2c 20 3f 22 20   "SELECT ?5, ?" 
4b70: 20 20 20 20 20 7b 35 20 3f 35 20 36 20 7b 7d 7d       {5 ?5 6 {}}
4b80: 20 20 7b 2d 35 20 2d 36 7d 0a 70 61 72 61 6d 65    {-5 -6}.parame
4b90: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4ba0: 31 31 2e 32 2e 34 20 22 53 45 4c 45 43 54 20 3f  11.2.4 "SELECT ?
4bb0: 2c 20 3f 35 22 20 20 20 20 20 20 7b 31 20 7b 7d  , ?5"      {1 {}
4bc0: 20 35 20 3f 35 7d 20 20 7b 2d 31 20 2d 35 7d 0a   5 ?5}  {-1 -5}.
4bd0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
4be0: 5f 65 78 70 72 2d 31 31 2e 32 2e 35 20 22 53 45  _expr-11.2.5 "SE
4bf0: 4c 45 43 54 20 3f 2c 20 3f 34 35 36 2c 20 3f 22  LECT ?, ?456, ?"
4c00: 20 7b 0a 20 20 31 20 7b 7d 20 34 35 36 20 3f 34   {.  1 {} 456 ?4
4c10: 35 36 20 34 35 37 20 7b 7d 0a 7d 20 20 7b 2d 31  56 457 {}.}  {-1
4c20: 20 2d 34 35 36 20 2d 34 35 37 7d 0a 70 61 72 61   -456 -457}.para
4c30: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
4c40: 72 2d 31 31 2e 32 2e 35 20 22 53 45 4c 45 43 54  r-11.2.5 "SELECT
4c50: 20 3f 2c 20 3f 34 35 36 2c 20 3f 34 2c 20 3f 22   ?, ?456, ?4, ?"
4c60: 20 7b 0a 20 20 31 20 7b 7d 20 34 35 36 20 3f 34   {.  1 {} 456 ?4
4c70: 35 36 20 34 20 3f 34 20 34 35 37 20 7b 7d 0a 7d  56 4 ?4 457 {}.}
4c80: 20 20 7b 2d 31 20 2d 34 35 36 20 2d 34 20 2d 34    {-1 -456 -4 -4
4c90: 35 37 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  57}.foreach {tn 
4ca0: 73 71 6c 7d 20 5b 6c 69 73 74 20 20 20 20 20 20  sql} [list      
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 20 20 20 5c 0a 20 20 31 20 20 22 53 45 4c       \.  1  "SEL
4cd0: 45 43 54 20 3f 24 6d 76 6e 2c 20 3f 22 20 20 20  ECT ?$mvn, ?"   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 20 20 20 20 20 20 20 5c 0a 20 20 32 20 20 22          \.  2  "
4d00: 53 45 4c 45 43 54 20 3f 5b 65 78 70 72 20 24 6d  SELECT ?[expr $m
4d10: 76 6e 2d 35 5d 2c 20 3f 2c 20 3f 2c 20 3f 2c 20  vn-5], ?, ?, ?, 
4d20: 3f 2c 20 3f 2c 20 3f 22 20 20 20 5c 0a 20 20 33  ?, ?, ?"   \.  3
4d30: 20 20 22 53 45 4c 45 43 54 20 3f 5b 65 78 70 72    "SELECT ?[expr
4d40: 20 24 6d 76 6e 5d 2c 20 3f 35 2c 20 3f 36 2c 20   $mvn], ?5, ?6, 
4d50: 3f 22 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  ?"            \.
4d60: 5d 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71  ] {.  do_catchsq
4d70: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  l_test e_expr-11
4d80: 2e 33 2e 24 74 6e 20 24 73 71 6c 20 5b 6c 69 73  .3.$tn $sql [lis
4d90: 74 20 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 53 51  t 1 {too many SQ
4da0: 4c 20 76 61 72 69 61 62 6c 65 73 7d 5d 0a 7d 0a  L variables}].}.
4db0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
4dc0: 52 2d 31 31 36 32 30 2d 32 32 37 34 33 20 41 20  R-11620-22743 A 
4dd0: 63 6f 6c 6f 6e 20 66 6f 6c 6c 6f 77 65 64 20 62  colon followed b
4de0: 79 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  y an identifier 
4df0: 6e 61 6d 65 0a 23 20 68 6f 6c 64 73 20 61 20 73  name.# holds a s
4e00: 70 6f 74 20 66 6f 72 20 61 20 6e 61 6d 65 64 20  pot for a named 
4e10: 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 74  parameter with t
4e20: 68 65 20 6e 61 6d 65 20 3a 41 41 41 41 2e 0a 23  he name :AAAA..#
4e30: 0a 23 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  .# Identifiers i
4e40: 6e 20 53 51 4c 69 74 65 20 63 6f 6e 73 69 73 74  n SQLite consist
4e50: 20 6f 66 20 61 6c 70 68 61 6e 75 6d 65 72 69 63   of alphanumeric
4e60: 2c 20 27 5f 27 20 61 6e 64 20 27 24 27 20 63 68  , '_' and '$' ch
4e70: 61 72 61 63 74 65 72 73 2c 0a 23 20 61 6e 64 20  aracters,.# and 
4e80: 61 6e 79 20 55 54 46 20 63 68 61 72 61 63 74 65  any UTF characte
4e90: 72 73 20 77 69 74 68 20 63 6f 64 65 70 6f 69 6e  rs with codepoin
4ea0: 74 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 31  ts larger than 1
4eb0: 32 37 20 28 6e 6f 6e 2d 41 53 43 49 49 20 0a 23  27 (non-ASCII .#
4ec0: 20 63 68 61 72 61 63 74 65 72 73 29 2e 0a 23 0a   characters)..#.
4ed0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
4ee0: 5f 65 78 70 72 2d 31 31 2e 32 2e 31 20 7b 53 45  _expr-11.2.1 {SE
4ef0: 4c 45 43 54 20 3a 41 41 41 41 7d 20 20 20 20 20  LECT :AAAA}     
4f00: 20 20 20 20 7b 31 20 3a 41 41 41 41 7d 20 20 20      {1 :AAAA}   
4f10: 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72      -1.parameter
4f20: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
4f30: 32 2e 32 20 7b 53 45 4c 45 43 54 20 3a 31 32 33  2.2 {SELECT :123
4f40: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 3a 31  }          {1 :1
4f50: 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61  23}        -1.pa
4f60: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
4f70: 78 70 72 2d 31 31 2e 32 2e 33 20 7b 53 45 4c 45  xpr-11.2.3 {SELE
4f80: 43 54 20 3a 5f 5f 7d 20 20 20 20 20 20 20 20 20  CT :__}         
4f90: 20 20 7b 31 20 3a 5f 5f 7d 20 20 20 20 20 20 20    {1 :__}       
4fa0: 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74    -1.parameter_t
4fb0: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e  est e_expr-11.2.
4fc0: 34 20 7b 53 45 4c 45 43 54 20 3a 5f 24 5f 7d 20  4 {SELECT :_$_} 
4fd0: 20 20 20 20 20 20 20 20 20 7b 31 20 3a 5f 24 5f           {1 :_$_
4fe0: 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61  }        -1.para
4ff0: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
5000: 72 2d 31 31 2e 32 2e 35 20 22 0a 20 20 53 45 4c  r-11.2.5 ".  SEL
5010: 45 43 54 20 3a 5c 75 30 65 34 30 5c 75 30 65 32  ECT :\u0e40\u0e2
5020: 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75 30  d\u0e28\u0e02\u0
5030: 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64 5c  e39\u0e40\u0e2d\
5040: 75 30 65 32 35 0a 22 20 22 31 20 3a 5c 75 30 65  u0e25." "1 :\u0e
5050: 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75  40\u0e2d\u0e28\u
5060: 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30  0e02\u0e39\u0e40
5070: 5c 75 30 65 32 64 5c 75 30 65 32 35 22 20 2d 31  \u0e2d\u0e25" -1
5080: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5090: 65 5f 65 78 70 72 2d 31 31 2e 32 2e 36 20 22 53  e_expr-11.2.6 "S
50a0: 45 4c 45 43 54 20 3a 5c 75 30 30 38 30 22 20 22  ELECT :\u0080" "
50b0: 31 20 3a 5c 75 30 30 38 30 22 20 2d 31 0a 0a 23  1 :\u0080" -1..#
50c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
50d0: 34 39 37 38 33 2d 36 31 32 37 39 20 41 6e 20 22  49783-61279 An "
50e0: 61 74 22 20 73 69 67 6e 20 77 6f 72 6b 73 20 65  at" sign works e
50f0: 78 61 63 74 6c 79 20 6c 69 6b 65 20 61 20 63 6f  xactly like a co
5100: 6c 6f 6e 2c 0a 23 20 65 78 63 65 70 74 20 74 68  lon,.# except th
5110: 61 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  at the name of t
5120: 68 65 20 70 61 72 61 6d 65 74 65 72 20 63 72 65  he parameter cre
5130: 61 74 65 64 20 69 73 20 40 41 41 41 41 2e 0a 23  ated is @AAAA..#
5140: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5150: 65 5f 65 78 70 72 2d 31 31 2e 33 2e 31 20 7b 53  e_expr-11.3.1 {S
5160: 45 4c 45 43 54 20 40 41 41 41 41 7d 20 20 20 20  ELECT @AAAA}    
5170: 20 20 20 20 20 7b 31 20 40 41 41 41 41 7d 20 20       {1 @AAAA}  
5180: 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65       -1.paramete
5190: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
51a0: 2e 33 2e 32 20 7b 53 45 4c 45 43 54 20 40 31 32  .3.2 {SELECT @12
51b0: 33 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 40  3}          {1 @
51c0: 31 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70  123}        -1.p
51d0: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
51e0: 65 78 70 72 2d 31 31 2e 33 2e 33 20 7b 53 45 4c  expr-11.3.3 {SEL
51f0: 45 43 54 20 40 5f 5f 7d 20 20 20 20 20 20 20 20  ECT @__}        
5200: 20 20 20 7b 31 20 40 5f 5f 7d 20 20 20 20 20 20     {1 @__}      
5210: 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f     -1.parameter_
5220: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 33  test e_expr-11.3
5230: 2e 34 20 7b 53 45 4c 45 43 54 20 40 5f 24 5f 7d  .4 {SELECT @_$_}
5240: 20 20 20 20 20 20 20 20 20 20 7b 31 20 40 5f 24            {1 @_$
5250: 5f 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72  _}        -1.par
5260: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
5270: 70 72 2d 31 31 2e 33 2e 35 20 22 0a 20 20 53 45  pr-11.3.5 ".  SE
5280: 4c 45 43 54 20 40 5c 75 30 65 34 30 5c 75 30 65  LECT @\u0e40\u0e
5290: 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75  2d\u0e28\u0e02\u
52a0: 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64  0e39\u0e40\u0e2d
52b0: 5c 75 30 65 32 35 0a 22 20 22 31 20 40 5c 75 30  \u0e25." "1 @\u0
52c0: 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c  e40\u0e2d\u0e28\
52d0: 75 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34  u0e02\u0e39\u0e4
52e0: 30 5c 75 30 65 32 64 5c 75 30 65 32 35 22 20 2d  0\u0e2d\u0e25" -
52f0: 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  1.parameter_test
5300: 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e 36 20 22   e_expr-11.3.6 "
5310: 53 45 4c 45 43 54 20 40 5c 75 30 30 38 30 22 20  SELECT @\u0080" 
5320: 22 31 20 40 5c 75 30 30 38 30 22 20 2d 31 0a 0a  "1 @\u0080" -1..
5330: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
5340: 2d 36 32 36 31 30 2d 35 31 33 32 39 20 41 20 64  -62610-51329 A d
5350: 6f 6c 6c 61 72 2d 73 69 67 6e 20 66 6f 6c 6c 6f  ollar-sign follo
5360: 77 65 64 20 62 79 20 61 6e 20 69 64 65 6e 74 69  wed by an identi
5370: 66 69 65 72 0a 23 20 6e 61 6d 65 20 61 6c 73 6f  fier.# name also
5380: 20 68 6f 6c 64 73 20 61 20 73 70 6f 74 20 66 6f   holds a spot fo
5390: 72 20 61 20 6e 61 6d 65 64 20 70 61 72 61 6d 65  r a named parame
53a0: 74 65 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ter with the nam
53b0: 65 20 24 41 41 41 41 2e 0a 23 0a 23 20 45 56 49  e $AAAA..#.# EVI
53c0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 30 32  DENCE-OF: R-5502
53d0: 35 2d 32 31 30 34 32 20 54 68 65 20 69 64 65 6e  5-21042 The iden
53e0: 74 69 66 69 65 72 20 6e 61 6d 65 20 69 6e 20 74  tifier name in t
53f0: 68 69 73 20 63 61 73 65 20 63 61 6e 0a 23 20 69  his case can.# i
5400: 6e 63 6c 75 64 65 20 6f 6e 65 20 6f 72 20 6d 6f  nclude one or mo
5410: 72 65 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f  re occurrences o
5420: 66 20 22 3a 3a 22 20 61 6e 64 20 61 20 73 75 66  f "::" and a suf
5430: 66 69 78 20 65 6e 63 6c 6f 73 65 64 20 69 6e 0a  fix enclosed in.
5440: 23 20 22 28 2e 2e 2e 29 22 20 63 6f 6e 74 61 69  # "(...)" contai
5450: 6e 69 6e 67 20 61 6e 79 20 74 65 78 74 20 61 74  ning any text at
5460: 20 61 6c 6c 2e 0a 23 0a 23 20 4e 6f 74 65 3a 20   all..#.# Note: 
5470: 4c 6f 6f 6b 73 20 6c 69 6b 65 20 61 6e 20 69 64  Looks like an id
5480: 65 6e 74 69 66 69 65 72 20 63 61 6e 6e 6f 74 20  entifier cannot 
5490: 63 6f 6e 73 69 73 74 20 65 6e 74 69 72 65 6c 79  consist entirely
54a0: 20 6f 66 20 22 3a 3a 22 20 0a 23 20 63 68 61 72   of "::" .# char
54b0: 61 63 74 65 72 73 20 6f 72 20 6a 75 73 74 20 61  acters or just a
54c0: 20 73 75 66 66 69 78 2e 20 41 6c 73 6f 2c 20 74   suffix. Also, t
54d0: 68 65 20 6f 74 68 65 72 20 6e 61 6d 65 64 20 76  he other named v
54e0: 61 72 69 61 62 6c 65 20 63 68 61 72 61 63 74 65  ariable characte
54f0: 72 73 0a 23 20 28 3a 20 61 6e 64 20 40 29 20 77  rs.# (: and @) w
5500: 6f 72 6b 20 74 68 65 20 73 61 6d 65 20 77 61 79  ork the same way
5510: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 20 57 68 79   internally. Why
5520: 20 6e 6f 74 20 6a 75 73 74 20 64 6f 63 75 6d 65   not just docume
5530: 6e 74 20 69 74 20 74 68 61 74 20 77 61 79 3f 0a  nt it that way?.
5540: 23 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  #.parameter_test
5550: 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e 31 20 7b   e_expr-11.4.1 {
5560: 53 45 4c 45 43 54 20 24 41 41 41 41 7d 20 20 20  SELECT $AAAA}   
5570: 20 20 20 20 20 20 7b 31 20 24 41 41 41 41 7d 20        {1 $AAAA} 
5580: 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74        -1.paramet
5590: 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  er_test e_expr-1
55a0: 31 2e 34 2e 32 20 7b 53 45 4c 45 43 54 20 24 31  1.4.2 {SELECT $1
55b0: 32 33 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20  23}          {1 
55c0: 24 31 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a  $123}        -1.
55d0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
55e0: 5f 65 78 70 72 2d 31 31 2e 34 2e 33 20 7b 53 45  _expr-11.4.3 {SE
55f0: 4c 45 43 54 20 24 5f 5f 7d 20 20 20 20 20 20 20  LECT $__}       
5600: 20 20 20 20 7b 31 20 24 5f 5f 7d 20 20 20 20 20      {1 $__}     
5610: 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72      -1.parameter
5620: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5630: 34 2e 34 20 7b 53 45 4c 45 43 54 20 24 5f 24 5f  4.4 {SELECT $_$_
5640: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 24 5f  }          {1 $_
5650: 24 5f 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61  $_}        -1.pa
5660: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
5670: 78 70 72 2d 31 31 2e 34 2e 35 20 22 0a 20 20 53  xpr-11.4.5 ".  S
5680: 45 4c 45 43 54 20 5c 24 5c 75 30 65 34 30 5c 75  ELECT \$\u0e40\u
5690: 30 65 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32  0e2d\u0e28\u0e02
56a0: 5c 75 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65  \u0e39\u0e40\u0e
56b0: 32 64 5c 75 30 65 32 35 0a 22 20 22 31 20 5c 24  2d\u0e25." "1 \$
56c0: 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65  \u0e40\u0e2d\u0e
56d0: 32 38 5c 75 30 65 30 32 5c 75 30 65 33 39 5c 75  28\u0e02\u0e39\u
56e0: 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 35  0e40\u0e2d\u0e25
56f0: 22 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74  " -1.parameter_t
5700: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e  est e_expr-11.4.
5710: 36 20 22 53 45 4c 45 43 54 20 5c 24 5c 75 30 30  6 "SELECT \$\u00
5720: 38 30 22 20 22 31 20 5c 24 5c 75 30 30 38 30 22  80" "1 \$\u0080"
5730: 20 2d 31 0a 0a 70 61 72 61 6d 65 74 65 72 5f 74   -1..parameter_t
5740: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 35 2e  est e_expr-11.5.
5750: 31 20 7b 53 45 4c 45 43 54 20 24 3a 3a 3a 3a 61  1 {SELECT $::::a
5760: 28 2b 2b 2d 2d 2b 2b 29 7d 20 7b 31 20 24 3a 3a  (++--++)} {1 $::
5770: 3a 3a 61 28 2b 2b 2d 2d 2b 2b 29 7d 20 2d 31 0a  ::a(++--++)} -1.
5780: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
5790: 5f 65 78 70 72 2d 31 31 2e 35 2e 32 20 7b 53 45  _expr-11.5.2 {SE
57a0: 4c 45 43 54 20 24 3a 3a 61 28 29 7d 20 7b 31 20  LECT $::a()} {1 
57b0: 24 3a 3a 61 28 29 7d 20 2d 31 0a 70 61 72 61 6d  $::a()} -1.param
57c0: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
57d0: 2d 31 31 2e 35 2e 33 20 7b 53 45 4c 45 43 54 20  -11.5.3 {SELECT 
57e0: 24 3a 3a 31 28 3a 3a 23 24 29 7d 20 7b 31 20 24  $::1(::#$)} {1 $
57f0: 3a 3a 31 28 3a 3a 23 24 29 7d 20 2d 31 0a 20 0a  ::1(::#$)} -1. .
5800: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
5810: 2d 31 31 33 37 30 2d 30 34 35 32 30 20 4e 61 6d  -11370-04520 Nam
5820: 65 64 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ed parameters ar
5830: 65 20 61 6c 73 6f 20 6e 75 6d 62 65 72 65 64 2e  e also numbered.
5840: 20 54 68 65 0a 23 20 6e 75 6d 62 65 72 20 61 73   The.# number as
5850: 73 69 67 6e 65 64 20 69 73 20 6f 6e 65 20 67 72  signed is one gr
5860: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c  eater than the l
5870: 61 72 67 65 73 74 20 70 61 72 61 6d 65 74 65 72  argest parameter
5880: 20 6e 75 6d 62 65 72 0a 23 20 61 6c 72 65 61 64   number.# alread
5890: 79 20 61 73 73 69 67 6e 65 64 2e 0a 23 0a 23 20  y assigned..#.# 
58a0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
58b0: 32 36 32 30 2d 32 32 31 38 34 20 49 66 20 74 68  2620-22184 If th
58c0: 69 73 20 6d 65 61 6e 73 20 74 68 65 20 70 61 72  is means the par
58d0: 61 6d 65 74 65 72 20 77 6f 75 6c 64 20 62 65 0a  ameter would be.
58e0: 23 20 61 73 73 69 67 6e 65 64 20 61 20 6e 75 6d  # assigned a num
58f0: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
5900: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
5910: 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 69 74 20  ABLE_NUMBER, it 
5920: 69 73 20 61 6e 0a 23 20 65 72 72 6f 72 2e 0a 23  is an.# error..#
5930: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5940: 65 5f 65 78 70 72 2d 31 31 2e 36 2e 31 20 22 53  e_expr-11.6.1 "S
5950: 45 4c 45 43 54 20 3f 2c 20 40 61 62 63 22 20 20  ELECT ?, @abc"  
5960: 20 20 7b 31 20 7b 7d 20 32 20 40 61 62 63 7d 20    {1 {} 2 @abc} 
5970: 7b 2d 31 20 2d 32 7d 0a 70 61 72 61 6d 65 74 65  {-1 -2}.paramete
5980: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
5990: 2e 36 2e 32 20 22 53 45 4c 45 43 54 20 3f 31 32  .6.2 "SELECT ?12
59a0: 33 2c 20 3a 61 31 22 20 20 7b 31 32 33 20 3f 31  3, :a1"  {123 ?1
59b0: 32 33 20 31 32 34 20 3a 61 31 7d 20 7b 2d 31 32  23 124 :a1} {-12
59c0: 33 20 2d 31 32 34 7d 0a 70 61 72 61 6d 65 74 65  3 -124}.paramete
59d0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
59e0: 2e 36 2e 33 20 7b 53 45 4c 45 43 54 20 24 61 2c  .6.3 {SELECT $a,
59f0: 20 3f 38 2c 20 3f 2c 20 24 62 2c 20 3f 32 2c 20   ?8, ?, $b, ?2, 
5a00: 24 63 7d 20 7b 0a 20 20 31 20 24 61 20 38 20 3f  $c} {.  1 $a 8 ?
5a10: 38 20 39 20 7b 7d 20 31 30 20 24 62 20 32 20 3f  8 9 {} 10 $b 2 ?
5a20: 32 20 31 31 20 24 63 0a 7d 20 7b 2d 31 20 2d 38  2 11 $c.} {-1 -8
5a30: 20 2d 39 20 2d 31 30 20 2d 32 20 2d 31 31 7d 0a   -9 -10 -2 -11}.
5a40: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d  foreach {tn sql}
5a50: 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20   [list          
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 5c 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20   \.  1  "SELECT 
5a80: 3f 24 6d 76 6e 2c 20 5c 24 3a 3a 61 22 20 20 20  ?$mvn, \$::a"   
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 20 20 20 20 5c 0a 20 20 32 20 20 22 53 45 4c 45      \.  2  "SELE
5ab0: 43 54 20 3f 24 6d 76 6e 2c 20 3f 34 2c 20 40 61  CT ?$mvn, ?4, @a
5ac0: 31 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1"              
5ad0: 20 20 20 20 20 20 20 5c 0a 20 20 33 20 20 22 53         \.  3  "S
5ae0: 45 4c 45 43 54 20 3f 5b 65 78 70 72 20 24 6d 76  ELECT ?[expr $mv
5af0: 6e 2d 32 5d 2c 20 3a 62 61 67 2c 20 40 31 32 33  n-2], :bag, @123
5b00: 2c 20 5c 24 78 22 20 20 20 20 5c 0a 5d 20 7b 0a  , \$x"    \.] {.
5b10: 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65    do_catchsql_te
5b20: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 37 2e 24  st e_expr-11.7.$
5b30: 74 6e 20 24 73 71 6c 20 5b 6c 69 73 74 20 31 20  tn $sql [list 1 
5b40: 7b 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  {too many SQL va
5b50: 72 69 61 62 6c 65 73 7d 5d 0a 7d 0a 0a 23 20 45  riables}].}..# E
5b60: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
5b70: 30 36 38 2d 34 39 36 37 31 20 50 61 72 61 6d 65  068-49671 Parame
5b80: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  ters that are no
5b90: 74 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65  t assigned value
5ba0: 73 0a 23 20 75 73 69 6e 67 20 73 71 6c 69 74 65  s.# using sqlite
5bb0: 33 5f 62 69 6e 64 28 29 20 61 72 65 20 74 72 65  3_bind() are tre
5bc0: 61 74 65 64 20 61 73 20 4e 55 4c 4c 2e 0a 23 0a  ated as NULL..#.
5bd0: 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  do_test e_expr-1
5be0: 31 2e 37 2e 31 20 7b 0a 20 20 73 65 74 20 73 74  1.7.1 {.  set st
5bf0: 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  mt [sqlite3_prep
5c00: 61 72 65 5f 76 32 20 64 62 20 7b 20 53 45 4c 45  are_v2 db { SELE
5c10: 43 54 20 3f 2c 20 3a 61 2c 20 40 62 2c 20 24 64  CT ?, :a, @b, $d
5c20: 20 7d 20 2d 31 5d 0a 20 20 73 71 6c 69 74 65 33   } -1].  sqlite3
5c30: 5f 73 74 65 70 20 24 73 74 6d 74 0a 0a 20 20 6c  _step $stmt..  l
5c40: 69 73 74 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c  ist [sqlite3_col
5c50: 75 6d 6e 5f 74 79 70 65 20 24 73 74 6d 74 20 30  umn_type $stmt 0
5c60: 5d 20 5c 0a 20 20 20 20 20 20 20 5b 73 71 6c 69  ] \.       [sqli
5c70: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20  te3_column_type 
5c80: 24 73 74 6d 74 20 31 5d 20 5c 0a 20 20 20 20 20  $stmt 1] \.     
5c90: 20 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d    [sqlite3_colum
5ca0: 6e 5f 74 79 70 65 20 24 73 74 6d 74 20 32 5d 20  n_type $stmt 2] 
5cb0: 5c 0a 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65  \.       [sqlite
5cc0: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24 73  3_column_type $s
5cd0: 74 6d 74 20 33 5d 20 0a 7d 20 7b 4e 55 4c 4c 20  tmt 3] .} {NULL 
5ce0: 4e 55 4c 4c 20 4e 55 4c 4c 20 4e 55 4c 4c 7d 0a  NULL NULL NULL}.
5cf0: 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  do_test e_expr-1
5d00: 31 2e 37 2e 31 20 7b 20 73 71 6c 69 74 65 33 5f  1.7.1 { sqlite3_
5d10: 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 20 7d  finalize $stmt }
5d20: 20 53 51 4c 49 54 45 5f 4f 4b 0a 0a 23 2d 2d 2d   SQLITE_OK..#---
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d70: 2d 2d 2d 2d 2d 2d 0a 23 20 22 54 65 73 74 22 20  ------.# "Test" 
5d80: 74 68 65 20 73 79 6e 74 61 78 20 64 69 61 67 72  the syntax diagr
5d90: 61 6d 73 20 69 6e 20 6c 61 6e 67 5f 65 78 70 72  ams in lang_expr
5da0: 2e 68 74 6d 6c 2e 0a 23 0a 23 20 2d 2d 20 73 79  .html..#.# -- sy
5db0: 6e 74 61 78 20 64 69 61 67 72 61 6d 20 73 69 67  ntax diagram sig
5dc0: 6e 65 64 2d 6e 75 6d 62 65 72 0a 23 0a 64 6f 5f  ned-number.#.do_
5dd0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
5de0: 78 70 72 2d 31 32 2e 31 2e 31 20 7b 20 53 45 4c  xpr-12.1.1 { SEL
5df0: 45 43 54 20 30 2c 20 2b 30 2c 20 2d 30 20 7d 20  ECT 0, +0, -0 } 
5e00: 7b 30 20 30 20 30 7d 0a 64 6f 5f 65 78 65 63 73  {0 0 0}.do_execs
5e10: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
5e20: 32 2e 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 31  2.1.2 { SELECT 1
5e30: 2c 20 2b 31 2c 20 2d 31 20 7d 20 7b 31 20 31 20  , +1, -1 } {1 1 
5e40: 2d 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  -1}.do_execsql_t
5e50: 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 31 2e  est e_expr-12.1.
5e60: 33 20 7b 20 53 45 4c 45 43 54 20 32 2c 20 2b 32  3 { SELECT 2, +2
5e70: 2c 20 2d 32 20 7d 20 7b 32 20 32 20 2d 32 7d 0a  , -2 } {2 2 -2}.
5e80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5e90: 65 5f 65 78 70 72 2d 31 32 2e 31 2e 34 20 7b 20  e_expr-12.1.4 { 
5ea0: 0a 20 20 53 45 4c 45 43 54 20 31 2e 34 2c 20 2b  .  SELECT 1.4, +
5eb0: 31 2e 34 2c 20 2d 31 2e 34 20 0a 7d 20 7b 31 2e  1.4, -1.4 .} {1.
5ec0: 34 20 31 2e 34 20 2d 31 2e 34 7d 0a 64 6f 5f 65  4 1.4 -1.4}.do_e
5ed0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
5ee0: 70 72 2d 31 32 2e 31 2e 35 20 7b 20 0a 20 20 53  pr-12.1.5 { .  S
5ef0: 45 4c 45 43 54 20 31 2e 35 65 2b 35 2c 20 2b 31  ELECT 1.5e+5, +1
5f00: 2e 35 65 2b 35 2c 20 2d 31 2e 35 65 2b 35 20 0a  .5e+5, -1.5e+5 .
5f10: 7d 20 7b 31 35 30 30 30 30 2e 30 20 31 35 30 30  } {150000.0 1500
5f20: 30 30 2e 30 20 2d 31 35 30 30 30 30 2e 30 7d 0a  00.0 -150000.0}.
5f30: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5f40: 65 5f 65 78 70 72 2d 31 32 2e 31 2e 36 20 7b 20  e_expr-12.1.6 { 
5f50: 0a 20 20 53 45 4c 45 43 54 20 30 2e 30 30 30 31  .  SELECT 0.0001
5f60: 2c 20 2b 30 2e 30 30 30 31 2c 20 2d 30 2e 30 30  , +0.0001, -0.00
5f70: 30 31 20 0a 7d 20 7b 30 2e 30 30 30 31 20 30 2e  01 .} {0.0001 0.
5f80: 30 30 30 31 20 2d 30 2e 30 30 30 31 7d 0a 0a 23  0001 -0.0001}..#
5f90: 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72   -- syntax diagr
5fa0: 61 6d 20 6c 69 74 65 72 61 6c 2d 76 61 6c 75 65  am literal-value
5fb0: 0a 23 0a 73 65 74 20 73 71 6c 69 74 65 5f 63 75  .#.set sqlite_cu
5fc0: 72 72 65 6e 74 5f 74 69 6d 65 20 31 0a 64 6f 5f  rrent_time 1.do_
5fd0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
5fe0: 78 70 72 2d 31 32 2e 32 2e 31 20 7b 53 45 4c 45  xpr-12.2.1 {SELE
5ff0: 43 54 20 31 32 33 7d 20 20 20 20 20 20 20 20 20  CT 123}         
6000: 20 20 20 20 20 20 7b 31 32 33 7d 0a 64 6f 5f 65        {123}.do_e
6010: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
6020: 70 72 2d 31 32 2e 32 2e 32 20 7b 53 45 4c 45 43  pr-12.2.2 {SELEC
6030: 54 20 31 32 33 2e 34 65 30 35 7d 20 20 20 20 20  T 123.4e05}     
6040: 20 20 20 20 20 7b 31 32 33 34 30 30 30 30 2e 30       {12340000.0
6050: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
6060: 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 33 20  t e_expr-12.2.3 
6070: 7b 53 45 4c 45 43 54 20 27 61 62 63 64 65 27 7d  {SELECT 'abcde'}
6080: 20 20 20 20 20 20 20 20 20 20 20 7b 61 62 63 64             {abcd
6090: 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e}.do_execsql_te
60a0: 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 34  st e_expr-12.2.4
60b0: 20 7b 53 45 4c 45 43 54 20 58 27 34 31 34 32 34   {SELECT X'41424
60c0: 33 27 7d 20 20 20 20 20 20 20 20 20 7b 41 42 43  3'}         {ABC
60d0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
60e0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 35 20  t e_expr-12.2.5 
60f0: 7b 53 45 4c 45 43 54 20 4e 55 4c 4c 7d 20 20 20  {SELECT NULL}   
6100: 20 20 20 20 20 20 20 20 20 20 20 7b 7b 7d 7d 0a             {{}}.
6110: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6120: 65 5f 65 78 70 72 2d 31 32 2e 32 2e 36 20 7b 53  e_expr-12.2.6 {S
6130: 45 4c 45 43 54 20 43 55 52 52 45 4e 54 5f 54 49  ELECT CURRENT_TI
6140: 4d 45 7d 20 20 20 20 20 20 7b 30 30 3a 30 30 3a  ME}      {00:00:
6150: 30 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  01}.do_execsql_t
6160: 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e  est e_expr-12.2.
6170: 37 20 7b 53 45 4c 45 43 54 20 43 55 52 52 45 4e  7 {SELECT CURREN
6180: 54 5f 44 41 54 45 7d 20 20 20 20 20 20 7b 31 39  T_DATE}      {19
6190: 37 30 2d 30 31 2d 30 31 7d 0a 64 6f 5f 65 78 65  70-01-01}.do_exe
61a0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
61b0: 2d 31 32 2e 32 2e 38 20 7b 53 45 4c 45 43 54 20  -12.2.8 {SELECT 
61c0: 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d  CURRENT_TIMESTAM
61d0: 50 7d 20 7b 7b 31 39 37 30 2d 30 31 2d 30 31 20  P} {{1970-01-01 
61e0: 30 30 3a 30 30 3a 30 31 7d 7d 0a 73 65 74 20 73  00:00:01}}.set s
61f0: 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69  qlite_current_ti
6200: 6d 65 20 30 0a 0a 23 20 2d 2d 20 73 79 6e 74 61  me 0..# -- synta
6210: 78 20 64 69 61 67 72 61 6d 20 65 78 70 72 0a 23  x diagram expr.#
6220: 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
6230: 74 2e 64 62 32 0a 65 78 65 63 73 71 6c 20 7b 0a  t.db2.execsql {.
6240: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
6250: 62 32 27 20 41 53 20 64 62 6e 61 6d 65 3b 0a 20  b2' AS dbname;. 
6260: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 62   CREATE TABLE db
6270: 6e 61 6d 65 2e 74 62 6c 6e 61 6d 65 28 63 6e 61  name.tblname(cna
6280: 6d 65 29 3b 0a 7d 0a 0a 70 72 6f 63 20 67 6c 6f  me);.}..proc glo
6290: 62 20 7b 61 72 67 73 7d 20 7b 72 65 74 75 72 6e  b {args} {return
62a0: 20 31 7d 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20   1}.db function 
62b0: 67 6c 6f 62 20 67 6c 6f 62 0a 64 62 20 66 75 6e  glob glob.db fun
62c0: 63 74 69 6f 6e 20 6d 61 74 63 68 20 67 6c 6f 62  ction match glob
62d0: 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20 72 65 67  .db function reg
62e0: 65 78 70 20 67 6c 6f 62 0a 0a 66 6f 72 65 61 63  exp glob..foreac
62f0: 68 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20  h {tn expr} {.  
6300: 31 20 31 32 33 0a 20 20 32 20 31 32 33 2e 34 65  1 123.  2 123.4e
6310: 30 35 0a 20 20 33 20 27 61 62 63 64 65 27 0a 20  05.  3 'abcde'. 
6320: 20 34 20 58 27 34 31 34 32 34 33 27 0a 20 20 35   4 X'414243'.  5
6330: 20 4e 55 4c 4c 0a 20 20 36 20 43 55 52 52 45 4e   NULL.  6 CURREN
6340: 54 5f 54 49 4d 45 0a 20 20 37 20 43 55 52 52 45  T_TIME.  7 CURRE
6350: 4e 54 5f 44 41 54 45 0a 20 20 38 20 43 55 52 52  NT_DATE.  8 CURR
6360: 45 4e 54 5f 54 49 4d 45 53 54 41 4d 50 0a 0a 20  ENT_TIMESTAMP.. 
6370: 20 39 20 3f 0a 20 31 30 20 3f 31 32 33 0a 20 31   9 ?. 10 ?123. 1
6380: 31 20 40 68 65 6c 6c 6f 0a 20 31 32 20 3a 77 6f  1 @hello. 12 :wo
6390: 72 6c 64 0a 20 31 33 20 24 74 63 6c 0a 20 31 34  rld. 13 $tcl. 14
63a0: 20 24 74 63 6c 28 61 72 72 61 79 29 0a 20 20 0a   $tcl(array).  .
63b0: 20 20 31 35 20 63 6e 61 6d 65 0a 20 20 31 36 20    15 cname.  16 
63c0: 74 62 6c 6e 61 6d 65 2e 63 6e 61 6d 65 0a 20 20  tblname.cname.  
63d0: 31 37 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61 6d  17 dbname.tblnam
63e0: 65 2e 63 6e 61 6d 65 0a 0a 20 20 31 38 20 22 2b  e.cname..  18 "+
63f0: 20 45 58 50 52 22 0a 20 20 31 39 20 22 2d 20 45   EXPR".  19 "- E
6400: 58 50 52 22 0a 20 20 32 30 20 22 4e 4f 54 20 45  XPR".  20 "NOT E
6410: 58 50 52 22 0a 20 20 32 31 20 22 7e 20 45 58 50  XPR".  21 "~ EXP
6420: 52 22 0a 0a 20 20 32 32 20 22 45 58 50 52 31 20  R"..  22 "EXPR1 
6430: 7c 7c 20 45 58 50 52 32 22 0a 20 20 32 33 20 22  || EXPR2".  23 "
6440: 45 58 50 52 31 20 2a 20 45 58 50 52 32 22 0a 20  EXPR1 * EXPR2". 
6450: 20 32 34 20 22 45 58 50 52 31 20 2f 20 45 58 50   24 "EXPR1 / EXP
6460: 52 32 22 0a 20 20 32 35 20 22 45 58 50 52 31 20  R2".  25 "EXPR1 
6470: 25 20 45 58 50 52 32 22 0a 20 20 32 36 20 22 45  % EXPR2".  26 "E
6480: 58 50 52 31 20 2b 20 45 58 50 52 32 22 0a 20 20  XPR1 + EXPR2".  
6490: 32 37 20 22 45 58 50 52 31 20 2d 20 45 58 50 52  27 "EXPR1 - EXPR
64a0: 32 22 0a 20 20 32 38 20 22 45 58 50 52 31 20 3c  2".  28 "EXPR1 <
64b0: 3c 20 45 58 50 52 32 22 0a 20 20 32 39 20 22 45  < EXPR2".  29 "E
64c0: 58 50 52 31 20 3e 3e 20 45 58 50 52 32 22 0a 20  XPR1 >> EXPR2". 
64d0: 20 33 30 20 22 45 58 50 52 31 20 26 20 45 58 50   30 "EXPR1 & EXP
64e0: 52 32 22 0a 20 20 33 31 20 22 45 58 50 52 31 20  R2".  31 "EXPR1 
64f0: 7c 20 45 58 50 52 32 22 0a 20 20 33 32 20 22 45  | EXPR2".  32 "E
6500: 58 50 52 31 20 3c 20 45 58 50 52 32 22 0a 20 20  XPR1 < EXPR2".  
6510: 33 33 20 22 45 58 50 52 31 20 3c 3d 20 45 58 50  33 "EXPR1 <= EXP
6520: 52 32 22 0a 20 20 33 34 20 22 45 58 50 52 31 20  R2".  34 "EXPR1 
6530: 3e 20 45 58 50 52 32 22 0a 20 20 33 35 20 22 45  > EXPR2".  35 "E
6540: 58 50 52 31 20 3e 3d 20 45 58 50 52 32 22 0a 20  XPR1 >= EXPR2". 
6550: 20 33 36 20 22 45 58 50 52 31 20 3d 20 45 58 50   36 "EXPR1 = EXP
6560: 52 32 22 0a 20 20 33 37 20 22 45 58 50 52 31 20  R2".  37 "EXPR1 
6570: 3d 3d 20 45 58 50 52 32 22 0a 20 20 33 38 20 22  == EXPR2".  38 "
6580: 45 58 50 52 31 20 21 3d 20 45 58 50 52 32 22 0a  EXPR1 != EXPR2".
6590: 20 20 33 39 20 22 45 58 50 52 31 20 3c 3e 20 45    39 "EXPR1 <> E
65a0: 58 50 52 32 22 0a 20 20 34 30 20 22 45 58 50 52  XPR2".  40 "EXPR
65b0: 31 20 49 53 20 45 58 50 52 32 22 0a 20 20 34 31  1 IS EXPR2".  41
65c0: 20 22 45 58 50 52 31 20 49 53 20 4e 4f 54 20 45   "EXPR1 IS NOT E
65d0: 58 50 52 32 22 0a 20 20 34 32 20 22 45 58 50 52  XPR2".  42 "EXPR
65e0: 31 20 41 4e 44 20 45 58 50 52 32 22 0a 20 20 34  1 AND EXPR2".  4
65f0: 33 20 22 45 58 50 52 31 20 4f 52 20 45 58 50 52  3 "EXPR1 OR EXPR
6600: 32 22 0a 20 0a 20 20 34 34 20 22 63 6f 75 6e 74  2". .  44 "count
6610: 28 2a 29 22 0a 20 20 34 35 20 22 63 6f 75 6e 74  (*)".  45 "count
6620: 28 44 49 53 54 49 4e 43 54 20 45 58 50 52 29 22  (DISTINCT EXPR)"
6630: 0a 20 20 34 36 20 22 73 75 62 73 74 72 28 45 58  .  46 "substr(EX
6640: 50 52 2c 20 31 30 2c 20 32 30 29 22 0a 20 20 34  PR, 10, 20)".  4
6650: 37 20 22 63 68 61 6e 67 65 73 28 29 22 0a 20 0a  7 "changes()". .
6660: 20 20 34 38 20 22 28 20 45 58 50 52 20 29 22 0a    48 "( EXPR )".
6670: 20 0a 20 20 34 39 20 22 43 41 53 54 20 28 20 45   .  49 "CAST ( E
6680: 58 50 52 20 41 53 20 69 6e 74 65 67 65 72 20 29  XPR AS integer )
6690: 22 0a 20 20 35 30 20 22 43 41 53 54 20 28 20 45  ".  50 "CAST ( E
66a0: 58 50 52 20 41 53 20 27 61 62 63 64 27 20 29 22  XPR AS 'abcd' )"
66b0: 0a 20 20 35 31 20 22 43 41 53 54 20 28 20 45 58  .  51 "CAST ( EX
66c0: 50 52 20 41 53 20 27 61 62 24 20 24 63 64 27 20  PR AS 'ab$ $cd' 
66d0: 29 22 0a 20 0a 20 20 35 32 20 22 45 58 50 52 20  )". .  52 "EXPR 
66e0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a  COLLATE nocase".
66f0: 20 20 35 33 20 22 45 58 50 52 20 43 4f 4c 4c 41    53 "EXPR COLLA
6700: 54 45 20 62 69 6e 61 72 79 22 0a 20 0a 20 20 35  TE binary". .  5
6710: 34 20 22 45 58 50 52 31 20 4c 49 4b 45 20 45 58  4 "EXPR1 LIKE EX
6720: 50 52 32 22 0a 20 20 35 35 20 22 45 58 50 52 31  PR2".  55 "EXPR1
6730: 20 4c 49 4b 45 20 45 58 50 52 32 20 45 53 43 41   LIKE EXPR2 ESCA
6740: 50 45 20 45 58 50 52 22 0a 20 20 35 36 20 22 45  PE EXPR".  56 "E
6750: 58 50 52 31 20 47 4c 4f 42 20 45 58 50 52 32 22  XPR1 GLOB EXPR2"
6760: 0a 20 20 35 37 20 22 45 58 50 52 31 20 47 4c 4f  .  57 "EXPR1 GLO
6770: 42 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45  B EXPR2 ESCAPE E
6780: 58 50 52 22 0a 20 20 35 38 20 22 45 58 50 52 31  XPR".  58 "EXPR1
6790: 20 52 45 47 45 58 50 20 45 58 50 52 32 22 0a 20   REGEXP EXPR2". 
67a0: 20 35 39 20 22 45 58 50 52 31 20 52 45 47 45 58   59 "EXPR1 REGEX
67b0: 50 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45  P EXPR2 ESCAPE E
67c0: 58 50 52 22 0a 20 20 36 30 20 22 45 58 50 52 31  XPR".  60 "EXPR1
67d0: 20 4d 41 54 43 48 20 45 58 50 52 32 22 0a 20 20   MATCH EXPR2".  
67e0: 36 31 20 22 45 58 50 52 31 20 4d 41 54 43 48 20  61 "EXPR1 MATCH 
67f0: 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50  EXPR2 ESCAPE EXP
6800: 52 22 0a 20 20 36 32 20 22 45 58 50 52 31 20 4e  R".  62 "EXPR1 N
6810: 4f 54 20 4c 49 4b 45 20 45 58 50 52 32 22 0a 20  OT LIKE EXPR2". 
6820: 20 36 33 20 22 45 58 50 52 31 20 4e 4f 54 20 4c   63 "EXPR1 NOT L
6830: 49 4b 45 20 45 58 50 52 32 20 45 53 43 41 50 45  IKE EXPR2 ESCAPE
6840: 20 45 58 50 52 22 0a 20 20 36 34 20 22 45 58 50   EXPR".  64 "EXP
6850: 52 31 20 4e 4f 54 20 47 4c 4f 42 20 45 58 50 52  R1 NOT GLOB EXPR
6860: 32 22 0a 20 20 36 35 20 22 45 58 50 52 31 20 4e  2".  65 "EXPR1 N
6870: 4f 54 20 47 4c 4f 42 20 45 58 50 52 32 20 45 53  OT GLOB EXPR2 ES
6880: 43 41 50 45 20 45 58 50 52 22 0a 20 20 36 36 20  CAPE EXPR".  66 
6890: 22 45 58 50 52 31 20 4e 4f 54 20 52 45 47 45 58  "EXPR1 NOT REGEX
68a0: 50 20 45 58 50 52 32 22 0a 20 20 36 37 20 22 45  P EXPR2".  67 "E
68b0: 58 50 52 31 20 4e 4f 54 20 52 45 47 45 58 50 20  XPR1 NOT REGEXP 
68c0: 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50  EXPR2 ESCAPE EXP
68d0: 52 22 0a 20 20 36 38 20 22 45 58 50 52 31 20 4e  R".  68 "EXPR1 N
68e0: 4f 54 20 4d 41 54 43 48 20 45 58 50 52 32 22 0a  OT MATCH EXPR2".
68f0: 20 20 36 39 20 22 45 58 50 52 31 20 4e 4f 54 20    69 "EXPR1 NOT 
6900: 4d 41 54 43 48 20 45 58 50 52 32 20 45 53 43 41  MATCH EXPR2 ESCA
6910: 50 45 20 45 58 50 52 22 0a 20 0a 20 20 37 30 20  PE EXPR". .  70 
6920: 22 45 58 50 52 20 49 53 4e 55 4c 4c 22 0a 20 20  "EXPR ISNULL".  
6930: 37 31 20 22 45 58 50 52 20 4e 4f 54 4e 55 4c 4c  71 "EXPR NOTNULL
6940: 22 0a 20 20 37 32 20 22 45 58 50 52 20 4e 4f 54  ".  72 "EXPR NOT
6950: 20 4e 55 4c 4c 22 0a 20 0a 20 20 37 33 20 22 45   NULL". .  73 "E
6960: 58 50 52 31 20 49 53 20 45 58 50 52 32 22 0a 20  XPR1 IS EXPR2". 
6970: 20 37 34 20 22 45 58 50 52 31 20 49 53 20 4e 4f   74 "EXPR1 IS NO
6980: 54 20 45 58 50 52 32 22 0a 0a 20 20 37 35 20 22  T EXPR2"..  75 "
6990: 45 58 50 52 20 4e 4f 54 20 42 45 54 57 45 45 4e  EXPR NOT BETWEEN
69a0: 20 45 58 50 52 31 20 41 4e 44 20 45 58 50 52 32   EXPR1 AND EXPR2
69b0: 22 0a 20 20 37 36 20 22 45 58 50 52 20 42 45 54  ".  76 "EXPR BET
69c0: 57 45 45 4e 20 45 58 50 52 31 20 41 4e 44 20 45  WEEN EXPR1 AND E
69d0: 58 50 52 32 22 0a 0a 20 20 37 37 20 22 45 58 50  XPR2"..  77 "EXP
69e0: 52 20 4e 4f 54 20 49 4e 20 28 53 45 4c 45 43 54  R NOT IN (SELECT
69f0: 20 63 6e 61 6d 65 20 46 52 4f 4d 20 74 62 6c 6e   cname FROM tbln
6a00: 61 6d 65 29 22 0a 20 20 37 38 20 22 45 58 50 52  ame)".  78 "EXPR
6a10: 20 4e 4f 54 20 49 4e 20 28 31 29 22 0a 20 20 37   NOT IN (1)".  7
6a20: 39 20 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 28  9 "EXPR NOT IN (
6a30: 31 2c 20 32 2c 20 33 29 22 0a 20 20 38 30 20 22  1, 2, 3)".  80 "
6a40: 45 58 50 52 20 4e 4f 54 20 49 4e 20 74 62 6c 6e  EXPR NOT IN tbln
6a50: 61 6d 65 22 0a 20 20 38 31 20 22 45 58 50 52 20  ame".  81 "EXPR 
6a60: 4e 4f 54 20 49 4e 20 64 62 6e 61 6d 65 2e 74 62  NOT IN dbname.tb
6a70: 6c 6e 61 6d 65 22 0a 20 20 38 32 20 22 45 58 50  lname".  82 "EXP
6a80: 52 20 49 4e 20 28 53 45 4c 45 43 54 20 63 6e 61  R IN (SELECT cna
6a90: 6d 65 20 46 52 4f 4d 20 74 62 6c 6e 61 6d 65 29  me FROM tblname)
6aa0: 22 0a 20 20 38 33 20 22 45 58 50 52 20 49 4e 20  ".  83 "EXPR IN 
6ab0: 28 31 29 22 0a 20 20 38 34 20 22 45 58 50 52 20  (1)".  84 "EXPR 
6ac0: 49 4e 20 28 31 2c 20 32 2c 20 33 29 22 0a 20 20  IN (1, 2, 3)".  
6ad0: 38 35 20 22 45 58 50 52 20 49 4e 20 74 62 6c 6e  85 "EXPR IN tbln
6ae0: 61 6d 65 22 0a 20 20 38 36 20 22 45 58 50 52 20  ame".  86 "EXPR 
6af0: 49 4e 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61 6d  IN dbname.tblnam
6b00: 65 22 0a 0a 20 20 38 37 20 22 45 58 49 53 54 53  e"..  87 "EXISTS
6b10: 20 28 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46   (SELECT cname F
6b20: 52 4f 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 20 20  ROM tblname)".  
6b30: 38 38 20 22 4e 4f 54 20 45 58 49 53 54 53 20 28  88 "NOT EXISTS (
6b40: 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46 52 4f  SELECT cname FRO
6b50: 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 0a 20 20 38  M tblname)"..  8
6b60: 39 20 22 43 41 53 45 20 45 58 50 52 20 57 48 45  9 "CASE EXPR WHE
6b70: 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50  N EXPR1 THEN EXP
6b80: 52 32 20 45 4c 53 45 20 45 58 50 52 20 45 4e 44  R2 ELSE EXPR END
6b90: 22 0a 20 20 39 30 20 22 43 41 53 45 20 45 58 50  ".  90 "CASE EXP
6ba0: 52 20 57 48 45 4e 20 45 58 50 52 31 20 54 48 45  R WHEN EXPR1 THE
6bb0: 4e 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20 39  N EXPR2 END".  9
6bc0: 31 20 22 43 41 53 45 20 45 58 50 52 20 57 48 45  1 "CASE EXPR WHE
6bd0: 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50  N EXPR1 THEN EXP
6be0: 52 32 20 57 48 45 4e 20 45 58 50 52 20 54 48 45  R2 WHEN EXPR THE
6bf0: 4e 20 45 58 50 52 31 20 45 4c 53 45 20 45 58 50  N EXPR1 ELSE EXP
6c00: 52 32 20 45 4e 44 22 0a 20 20 39 32 20 22 43 41  R2 END".  92 "CA
6c10: 53 45 20 45 58 50 52 20 57 48 45 4e 20 45 58 50  SE EXPR WHEN EXP
6c20: 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 57 48  R1 THEN EXPR2 WH
6c30: 45 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58 50  EN EXPR THEN EXP
6c40: 52 31 20 45 4e 44 22 0a 20 20 39 33 20 22 43 41  R1 END".  93 "CA
6c50: 53 45 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  SE WHEN EXPR1 TH
6c60: 45 4e 20 45 58 50 52 32 20 45 4c 53 45 20 45 58  EN EXPR2 ELSE EX
6c70: 50 52 20 45 4e 44 22 0a 20 20 39 34 20 22 43 41  PR END".  94 "CA
6c80: 53 45 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  SE WHEN EXPR1 TH
6c90: 45 4e 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20  EN EXPR2 END".  
6ca0: 39 35 20 22 43 41 53 45 20 57 48 45 4e 20 45 58  95 "CASE WHEN EX
6cb0: 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 57  PR1 THEN EXPR2 W
6cc0: 48 45 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58  HEN EXPR THEN EX
6cd0: 50 52 31 20 45 4c 53 45 20 45 58 50 52 32 20 45  PR1 ELSE EXPR2 E
6ce0: 4e 44 22 0a 20 20 39 36 20 22 43 41 53 45 20 57  ND".  96 "CASE W
6cf0: 48 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45  HEN EXPR1 THEN E
6d00: 58 50 52 32 20 57 48 45 4e 20 45 58 50 52 20 54  XPR2 WHEN EXPR T
6d10: 48 45 4e 20 45 58 50 52 31 20 45 4e 44 22 0a 7d  HEN EXPR1 END".}
6d20: 20 7b 0a 0a 20 20 23 20 49 66 20 74 68 65 20 65   {..  # If the e
6d30: 78 70 72 65 73 73 69 6f 6e 20 73 74 72 69 6e 67  xpression string
6d40: 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 63 6f   being parsed co
6d50: 6e 74 61 69 6e 73 20 22 45 58 50 52 32 22 2c 20  ntains "EXPR2", 
6d60: 74 68 65 6e 20 72 65 70 6c 61 63 65 0a 20 20 23  then replace.  #
6d70: 20 73 74 72 69 6e 67 20 22 45 58 50 52 31 22 20   string "EXPR1" 
6d80: 61 6e 64 20 22 45 58 50 52 32 22 20 77 69 74 68  and "EXPR2" with
6d90: 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 20 65   arbitrary SQL e
6da0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 49 66 20 69  xpressions. If i
6db0: 74 20 0a 20 20 23 20 63 6f 6e 74 61 69 6e 73 20  t .  # contains 
6dc0: 22 45 58 50 52 22 2c 20 74 68 65 6e 20 72 65 70  "EXPR", then rep
6dd0: 6c 61 63 65 20 45 58 50 52 20 77 69 74 68 20 61  lace EXPR with a
6de0: 6e 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 20  n arbitrary SQL 
6df0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 23 20  expression..  # 
6e00: 0a 20 20 73 65 74 20 65 6c 69 73 74 20 5b 6c 69  .  set elist [li
6e10: 73 74 20 24 65 78 70 72 5d 0a 20 20 69 66 20 7b  st $expr].  if {
6e20: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 45  [string match *E
6e30: 58 50 52 32 2a 20 24 65 78 70 72 5d 7d 20 7b 0a  XPR2* $expr]} {.
6e40: 20 20 20 20 73 65 74 20 65 6c 69 73 74 20 5b 6c      set elist [l
6e50: 69 73 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68  ist].    foreach
6e60: 20 7b 65 31 20 65 32 7d 20 7b 20 63 6e 61 6d 65   {e1 e2} { cname
6e70: 20 22 33 34 2b 32 32 22 20 7d 20 7b 0a 20 20 20   "34+22" } {.   
6e80: 20 20 20 6c 61 70 70 65 6e 64 20 65 6c 69 73 74     lappend elist
6e90: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
6ea0: 73 74 20 45 58 50 52 31 20 24 65 31 20 45 58 50  st EXPR1 $e1 EXP
6eb0: 52 32 20 24 65 32 5d 20 24 65 78 70 72 5d 0a 20  R2 $e2] $expr]. 
6ec0: 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 20 7b     }.  } .  if {
6ed0: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 45  [string match *E
6ee0: 58 50 52 2a 20 24 65 78 70 72 5d 7d 20 7b 0a 20  XPR* $expr]} {. 
6ef0: 20 20 20 73 65 74 20 65 6c 69 73 74 32 20 5b 6c     set elist2 [l
6f00: 69 73 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68  ist].    foreach
6f10: 20 65 6c 20 24 65 6c 69 73 74 20 7b 0a 20 20 20   el $elist {.   
6f20: 20 20 20 66 6f 72 65 61 63 68 20 65 20 7b 20 63     foreach e { c
6f30: 6e 61 6d 65 20 22 33 34 2b 32 32 22 20 7d 20 7b  name "34+22" } {
6f40: 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
6f50: 20 65 6c 69 73 74 32 20 5b 73 74 72 69 6e 67 20   elist2 [string 
6f60: 6d 61 70 20 5b 6c 69 73 74 20 45 58 50 52 20 24  map [list EXPR $
6f70: 65 5d 20 24 65 6c 5d 0a 20 20 20 20 20 20 7d 0a  e] $el].      }.
6f80: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 65 6c      }.    set el
6f90: 69 73 74 20 24 65 6c 69 73 74 32 0a 20 20 7d 0a  ist $elist2.  }.
6fa0: 0a 20 20 73 65 74 20 78 20 30 0a 20 20 66 6f 72  .  set x 0.  for
6fb0: 65 61 63 68 20 65 20 24 65 6c 69 73 74 20 7b 0a  each e $elist {.
6fc0: 20 20 20 20 69 6e 63 72 20 78 0a 20 20 20 20 64      incr x.    d
6fd0: 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  o_test e_expr-12
6fe0: 2e 33 2e 24 74 6e 2e 24 78 20 7b 20 0a 20 20 20  .3.$tn.$x { .   
6ff0: 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68     set rc [catch
7000: 20 7b 20 65 78 65 63 73 71 6c 20 22 53 45 4c 45   { execsql "SELE
7010: 43 54 20 24 65 20 46 52 4f 4d 20 74 62 6c 6e 61  CT $e FROM tblna
7020: 6d 65 22 20 7d 20 6d 73 67 5d 0a 20 20 20 20 7d  me" } msg].    }
7030: 20 7b 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 20 2d 2d   {0}.  }.}..# --
7040: 20 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20   syntax diagram 
7050: 72 61 69 73 65 2d 66 75 6e 63 74 69 6f 6e 0a 23  raise-function.#
7060: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 72 61 69  .foreach {tn rai
7070: 73 65 65 78 70 72 7d 20 7b 0a 20 20 31 20 22 52  seexpr} {.  1 "R
7080: 41 49 53 45 28 49 47 4e 4f 52 45 29 22 0a 20 20  AISE(IGNORE)".  
7090: 32 20 22 52 41 49 53 45 28 52 4f 4c 4c 42 41 43  2 "RAISE(ROLLBAC
70a0: 4b 2c 20 27 65 72 72 6f 72 20 6d 65 73 73 61 67  K, 'error messag
70b0: 65 27 29 22 0a 20 20 33 20 22 52 41 49 53 45 28  e')".  3 "RAISE(
70c0: 41 42 4f 52 54 2c 20 27 65 72 72 6f 72 20 6d 65  ABORT, 'error me
70d0: 73 73 61 67 65 27 29 22 0a 20 20 34 20 22 52 41  ssage')".  4 "RA
70e0: 49 53 45 28 46 41 49 4c 2c 20 27 65 72 72 6f 72  ISE(FAIL, 'error
70f0: 20 6d 65 73 73 61 67 65 27 29 22 0a 7d 20 7b 0a   message')".} {.
7100: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
7110: 74 20 65 5f 65 78 70 72 2d 31 32 2e 34 2e 24 74  t e_expr-12.4.$t
7120: 6e 20 22 0a 20 20 20 20 43 52 45 41 54 45 20 54  n ".    CREATE T
7130: 52 49 47 47 45 52 20 64 62 6e 61 6d 65 2e 74 72  RIGGER dbname.tr
7140: 24 74 6e 20 42 45 46 4f 52 45 20 44 45 4c 45 54  $tn BEFORE DELET
7150: 45 20 4f 4e 20 74 62 6c 6e 61 6d 65 20 42 45 47  E ON tblname BEG
7160: 49 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  IN.      SELECT 
7170: 24 72 61 69 73 65 65 78 70 72 20 3b 0a 20 20 20  $raiseexpr ;.   
7180: 20 45 4e 44 3b 0a 20 20 22 20 7b 7d 0a 7d 0a 0a   END;.  " {}.}..
7190: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
71e0: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73  t the statements
71f0: 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
7200: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
7210: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
7220: 46 3a 20 52 2d 34 30 30 37 39 2d 35 34 35 30 33  F: R-40079-54503
7230: 20 54 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65   The BETWEEN ope
7240: 72 61 74 6f 72 20 69 73 20 6c 6f 67 69 63 61 6c  rator is logical
7250: 6c 79 0a 23 20 65 71 75 69 76 61 6c 65 6e 74 20  ly.# equivalent 
7260: 74 6f 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6d  to a pair of com
7270: 70 61 72 69 73 6f 6e 73 2e 20 22 78 20 42 45 54  parisons. "x BET
7280: 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73  WEEN y AND z" is
7290: 20 65 71 75 69 76 61 6c 65 6e 74 0a 23 20 74 6f   equivalent.# to
72a0: 20 22 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 22   "x>=y AND x<=z"
72b0: 20 65 78 63 65 70 74 20 74 68 61 74 20 77 69 74   except that wit
72c0: 68 20 42 45 54 57 45 45 4e 2c 20 74 68 65 20 78  h BETWEEN, the x
72d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 23   expression is.#
72e0: 20 6f 6e 6c 79 20 65 76 61 6c 75 61 74 65 64 20   only evaluated 
72f0: 6f 6e 63 65 2e 0a 23 0a 64 62 20 66 75 6e 63 20  once..#.db func 
7300: 78 20 78 0a 70 72 6f 63 20 78 20 7b 7d 20 7b 20  x x.proc x {} { 
7310: 69 6e 63 72 20 3a 3a 78 63 6f 75 6e 74 20 3b 20  incr ::xcount ; 
7320: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 24 3a 3a  return [expr $::
7330: 78 5d 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  x] }.foreach {tn
7340: 20 78 20 65 78 70 72 20 72 65 73 20 6e 45 76 61   x expr res nEva
7350: 6c 7d 20 7b 0a 20 20 31 20 20 31 30 20 20 22 78  l} {.  1  10  "x
7360: 28 29 20 3e 3d 20 35 20 41 4e 44 20 78 28 29 20  () >= 5 AND x() 
7370: 3c 3d 20 31 35 22 20 20 31 20 20 32 0a 20 20 32  <= 15"  1  2.  2
7380: 20 20 31 30 20 20 22 78 28 29 20 42 45 54 57 45    10  "x() BETWE
7390: 45 4e 20 35 20 41 4e 44 20 31 35 22 20 20 20 20  EN 5 AND 15"    
73a0: 31 20 20 31 0a 0a 20 20 33 20 20 20 35 20 20 22  1  1..  3   5  "
73b0: 78 28 29 20 3e 3d 20 35 20 41 4e 44 20 78 28 29  x() >= 5 AND x()
73c0: 20 3c 3d 20 35 22 20 20 20 31 20 20 32 0a 20 20   <= 5"   1  2.  
73d0: 34 20 20 20 35 20 20 22 78 28 29 20 42 45 54 57  4   5  "x() BETW
73e0: 45 45 4e 20 35 20 41 4e 44 20 35 22 20 20 20 20  EEN 5 AND 5"    
73f0: 20 31 20 20 31 0a 0a 20 20 35 20 20 20 39 20 20   1  1..  5   9  
7400: 22 28 78 28 29 2c 38 29 20 3e 3d 20 28 39 2c 37  "(x(),8) >= (9,7
7410: 29 20 41 4e 44 20 28 78 28 29 2c 38 29 3c 3d 28  ) AND (x(),8)<=(
7420: 39 2c 31 30 29 22 20 20 31 20 32 0a 20 20 36 20  9,10)"  1 2.  6 
7430: 20 20 39 20 20 22 28 78 28 29 2c 38 29 20 42 45    9  "(x(),8) BE
7440: 54 57 45 45 4e 20 28 39 2c 37 29 20 41 4e 44 20  TWEEN (9,7) AND 
7450: 28 39 2c 31 30 29 22 20 20 20 20 20 20 31 20 31  (9,10)"      1 1
7460: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65  .} {.  do_test e
7470: 5f 65 78 70 72 2d 31 33 2e 31 2e 24 74 6e 20 7b  _expr-13.1.$tn {
7480: 0a 20 20 20 20 73 65 74 20 3a 3a 78 63 6f 75 6e  .    set ::xcoun
7490: 74 20 30 0a 20 20 20 20 73 65 74 20 61 20 5b 65  t 0.    set a [e
74a0: 78 65 63 73 71 6c 20 22 53 45 4c 45 43 54 20 24  xecsql "SELECT $
74b0: 65 78 70 72 22 5d 0a 20 20 20 20 6c 69 73 74 20  expr"].    list 
74c0: 24 3a 3a 78 63 6f 75 6e 74 20 24 61 0a 20 20 7d  $::xcount $a.  }
74d0: 20 5b 6c 69 73 74 20 24 6e 45 76 61 6c 20 24 72   [list $nEval $r
74e0: 65 73 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  es].}..# EVIDENC
74f0: 45 2d 4f 46 3a 20 52 2d 30 35 31 35 35 2d 33 34  E-OF: R-05155-34
7500: 34 35 34 20 54 68 65 20 70 72 65 63 65 64 65 6e  454 The preceden
7510: 63 65 20 6f 66 20 74 68 65 20 42 45 54 57 45 45  ce of the BETWEE
7520: 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 0a 23 20  N operator is.# 
7530: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
7540: 70 72 65 63 65 64 65 6e 63 65 20 61 73 20 6f 70  precedence as op
7550: 65 72 61 74 6f 72 73 20 3d 3d 20 61 6e 64 20 21  erators == and !
7560: 3d 20 61 6e 64 20 4c 49 4b 45 20 61 6e 64 20 67  = and LIKE and g
7570: 72 6f 75 70 73 0a 23 20 6c 65 66 74 20 74 6f 20  roups.# left to 
7580: 72 69 67 68 74 2e 0a 23 20 0a 23 20 54 68 65 72  right..# .# Ther
7590: 65 66 6f 72 65 2c 20 42 45 54 57 45 45 4e 20 67  efore, BETWEEN g
75a0: 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74  roups more tight
75b0: 6c 79 20 74 68 61 6e 20 6f 70 65 72 61 74 6f 72  ly than operator
75c0: 20 22 41 4e 44 22 2c 20 62 75 74 20 6c 65 73 73   "AND", but less
75d0: 0a 23 20 73 6f 20 74 68 61 6e 20 22 3c 22 2e 0a  .# so than "<"..
75e0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
75f0: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 20  t e_expr-13.2.1 
7600: 20 7b 20 53 45 4c 45 43 54 20 31 20 3d 3d 20 31   { SELECT 1 == 1
7610: 30 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20  0 BETWEEN 0 AND 
7620: 32 20 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63  2   }  1.do_exec
7630: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
7640: 31 33 2e 32 2e 32 20 20 7b 20 53 45 4c 45 43 54  13.2.2  { SELECT
7650: 20 28 31 20 3d 3d 20 31 30 29 20 42 45 54 57 45   (1 == 10) BETWE
7660: 45 4e 20 30 20 41 4e 44 20 32 20 7d 20 20 31 0a  EN 0 AND 2 }  1.
7670: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7680: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 33 20 20 7b  e_expr-13.2.3  {
7690: 20 53 45 4c 45 43 54 20 31 20 3d 3d 20 28 31 30   SELECT 1 == (10
76a0: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
76b0: 29 20 7d 20 20 30 0a 64 6f 5f 65 78 65 63 73 71  ) }  0.do_execsq
76c0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
76d0: 2e 32 2e 34 20 20 7b 20 53 45 4c 45 43 54 20 20  .2.4  { SELECT  
76e0: 36 20 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20  6 BETWEEN 4 AND 
76f0: 38 20 3d 3d 20 31 20 7d 20 20 20 20 31 0a 64 6f  8 == 1 }    1.do
7700: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7710: 65 78 70 72 2d 31 33 2e 32 2e 35 20 20 7b 20 53  expr-13.2.5  { S
7720: 45 4c 45 43 54 20 28 36 20 42 45 54 57 45 45 4e  ELECT (6 BETWEEN
7730: 20 34 20 41 4e 44 20 38 29 20 3d 3d 20 31 20 7d   4 AND 8) == 1 }
7740: 20 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f     1.do_execsql_
7750: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7760: 2e 36 20 20 7b 20 53 45 4c 45 43 54 20 20 36 20  .6  { SELECT  6 
7770: 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20 28 38  BETWEEN 4 AND (8
7780: 20 3d 3d 20 31 29 20 7d 20 20 30 0a 0a 64 6f 5f   == 1) }  0..do_
7790: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
77a0: 78 70 72 2d 31 33 2e 32 2e 37 20 20 7b 20 53 45  xpr-13.2.7  { SE
77b0: 4c 45 43 54 20 20 35 20 42 45 54 57 45 45 4e 20  LECT  5 BETWEEN 
77c0: 30 20 41 4e 44 20 30 20 20 21 3d 20 31 20 7d 20  0 AND 0  != 1 } 
77d0: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
77e0: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
77f0: 38 20 20 7b 20 53 45 4c 45 43 54 20 28 35 20 42  8  { SELECT (5 B
7800: 45 54 57 45 45 4e 20 30 20 41 4e 44 20 30 29 20  ETWEEN 0 AND 0) 
7810: 21 3d 20 31 20 7d 20 20 20 31 0a 64 6f 5f 65 78  != 1 }   1.do_ex
7820: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7830: 72 2d 31 33 2e 32 2e 39 20 20 7b 20 53 45 4c 45  r-13.2.9  { SELE
7840: 43 54 20 20 35 20 42 45 54 57 45 45 4e 20 30 20  CT  5 BETWEEN 0 
7850: 41 4e 44 20 28 30 20 21 3d 20 31 29 20 7d 20 20  AND (0 != 1) }  
7860: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
7870: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 30  t e_expr-13.2.10
7880: 20 7b 20 53 45 4c 45 43 54 20 20 31 20 21 3d 20   { SELECT  1 != 
7890: 30 20 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44  0  BETWEEN 0 AND
78a0: 20 32 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63   2  }  1.do_exec
78b0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
78c0: 31 33 2e 32 2e 31 31 20 7b 20 53 45 4c 45 43 54  13.2.11 { SELECT
78d0: 20 28 31 20 21 3d 20 30 29 20 42 45 54 57 45 45   (1 != 0) BETWEE
78e0: 4e 20 30 20 41 4e 44 20 32 20 20 7d 20 20 31 0a  N 0 AND 2  }  1.
78f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7900: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 32 20 7b  e_expr-13.2.12 {
7910: 20 53 45 4c 45 43 54 20 20 31 20 21 3d 20 28 30   SELECT  1 != (0
7920: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
7930: 29 20 7d 20 20 30 0a 0a 64 6f 5f 65 78 65 63 73  ) }  0..do_execs
7940: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7950: 33 2e 32 2e 31 33 20 7b 20 53 45 4c 45 43 54 20  3.2.13 { SELECT 
7960: 31 20 4c 49 4b 45 20 31 30 20 42 45 54 57 45 45  1 LIKE 10 BETWEE
7970: 4e 20 30 20 41 4e 44 20 32 20 20 20 7d 20 20 31  N 0 AND 2   }  1
7980: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7990: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 34 20   e_expr-13.2.14 
79a0: 7b 20 53 45 4c 45 43 54 20 28 31 20 4c 49 4b 45  { SELECT (1 LIKE
79b0: 20 31 30 29 20 42 45 54 57 45 45 4e 20 30 20 41   10) BETWEEN 0 A
79c0: 4e 44 20 32 20 7d 20 20 31 0a 64 6f 5f 65 78 65  ND 2 }  1.do_exe
79d0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
79e0: 2d 31 33 2e 32 2e 31 35 20 7b 20 53 45 4c 45 43  -13.2.15 { SELEC
79f0: 54 20 31 20 4c 49 4b 45 20 28 31 30 20 42 45 54  T 1 LIKE (10 BET
7a00: 57 45 45 4e 20 30 20 41 4e 44 20 32 29 20 7d 20  WEEN 0 AND 2) } 
7a10: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
7a20: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31  st e_expr-13.2.1
7a30: 36 20 7b 20 53 45 4c 45 43 54 20 20 36 20 42 45  6 { SELECT  6 BE
7a40: 54 57 45 45 4e 20 34 20 41 4e 44 20 38 20 4c 49  TWEEN 4 AND 8 LI
7a50: 4b 45 20 31 20 20 20 7d 20 20 31 0a 64 6f 5f 65  KE 1   }  1.do_e
7a60: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7a70: 70 72 2d 31 33 2e 32 2e 31 37 20 7b 20 53 45 4c  pr-13.2.17 { SEL
7a80: 45 43 54 20 28 36 20 42 45 54 57 45 45 4e 20 34  ECT (6 BETWEEN 4
7a90: 20 41 4e 44 20 38 29 20 4c 49 4b 45 20 31 20 20   AND 8) LIKE 1  
7aa0: 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  }  1.do_execsql_
7ab0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7ac0: 2e 31 38 20 7b 20 53 45 4c 45 43 54 20 20 36 20  .18 { SELECT  6 
7ad0: 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20 28 38  BETWEEN 4 AND (8
7ae0: 20 4c 49 4b 45 20 31 29 20 7d 20 20 30 0a 0a 64   LIKE 1) }  0..d
7af0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7b00: 5f 65 78 70 72 2d 31 33 2e 32 2e 31 39 20 7b 20  _expr-13.2.19 { 
7b10: 53 45 4c 45 43 54 20 30 20 41 4e 44 20 30 20 42  SELECT 0 AND 0 B
7b20: 45 54 57 45 45 4e 20 30 20 41 4e 44 20 31 20 20  ETWEEN 0 AND 1  
7b30: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
7b40: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7b50: 2e 32 30 20 7b 20 53 45 4c 45 43 54 20 30 20 41  .20 { SELECT 0 A
7b60: 4e 44 20 28 30 20 42 45 54 57 45 45 4e 20 30 20  ND (0 BETWEEN 0 
7b70: 41 4e 44 20 31 29 20 7d 20 30 0a 64 6f 5f 65 78  AND 1) } 0.do_ex
7b80: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7b90: 72 2d 31 33 2e 32 2e 32 31 20 7b 20 53 45 4c 45  r-13.2.21 { SELE
7ba0: 43 54 20 28 30 20 41 4e 44 20 30 29 20 42 45 54  CT (0 AND 0) BET
7bb0: 57 45 45 4e 20 30 20 41 4e 44 20 31 20 7d 20 31  WEEN 0 AND 1 } 1
7bc0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7bd0: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 32 20   e_expr-13.2.22 
7be0: 7b 20 53 45 4c 45 43 54 20 30 20 42 45 54 57 45  { SELECT 0 BETWE
7bf0: 45 4e 20 2d 31 20 41 4e 44 20 31 20 41 4e 44 20  EN -1 AND 1 AND 
7c00: 30 20 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  0   } 0.do_execs
7c10: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7c20: 33 2e 32 2e 32 33 20 7b 20 53 45 4c 45 43 54 20  3.2.23 { SELECT 
7c30: 28 30 20 42 45 54 57 45 45 4e 20 2d 31 20 41 4e  (0 BETWEEN -1 AN
7c40: 44 20 31 29 20 41 4e 44 20 30 20 7d 20 30 0a 64  D 1) AND 0 } 0.d
7c50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7c60: 5f 65 78 70 72 2d 31 33 2e 32 2e 32 34 20 7b 20  _expr-13.2.24 { 
7c70: 53 45 4c 45 43 54 20 30 20 42 45 54 57 45 45 4e  SELECT 0 BETWEEN
7c80: 20 2d 31 20 41 4e 44 20 28 31 20 41 4e 44 20 30   -1 AND (1 AND 0
7c90: 29 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71  ) } 1..do_execsq
7ca0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7cb0: 2e 32 2e 32 35 20 7b 20 53 45 4c 45 43 54 20 32  .2.25 { SELECT 2
7cc0: 20 3c 20 33 20 42 45 54 57 45 45 4e 20 30 20 41   < 3 BETWEEN 0 A
7cd0: 4e 44 20 31 20 20 20 7d 20 31 0a 64 6f 5f 65 78  ND 1   } 1.do_ex
7ce0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7cf0: 72 2d 31 33 2e 32 2e 32 36 20 7b 20 53 45 4c 45  r-13.2.26 { SELE
7d00: 43 54 20 28 32 20 3c 20 33 29 20 42 45 54 57 45  CT (2 < 3) BETWE
7d10: 45 4e 20 30 20 41 4e 44 20 31 20 7d 20 31 0a 64  EN 0 AND 1 } 1.d
7d20: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7d30: 5f 65 78 70 72 2d 31 33 2e 32 2e 32 37 20 7b 20  _expr-13.2.27 { 
7d40: 53 45 4c 45 43 54 20 32 20 3c 20 28 33 20 42 45  SELECT 2 < (3 BE
7d50: 54 57 45 45 4e 20 30 20 41 4e 44 20 31 29 20 7d  TWEEN 0 AND 1) }
7d60: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
7d70: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32  st e_expr-13.2.2
7d80: 38 20 7b 20 53 45 4c 45 43 54 20 32 20 42 45 54  8 { SELECT 2 BET
7d90: 57 45 45 4e 20 31 20 41 4e 44 20 32 20 3c 20 33  WEEN 1 AND 2 < 3
7da0: 20 20 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73      } 0.do_execs
7db0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7dc0: 33 2e 32 2e 32 39 20 7b 20 53 45 4c 45 43 54 20  3.2.29 { SELECT 
7dd0: 32 20 42 45 54 57 45 45 4e 20 31 20 41 4e 44 20  2 BETWEEN 1 AND 
7de0: 28 32 20 3c 20 33 29 20 20 7d 20 30 0a 64 6f 5f  (2 < 3)  } 0.do_
7df0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7e00: 78 70 72 2d 31 33 2e 32 2e 33 30 20 7b 20 53 45  xpr-13.2.30 { SE
7e10: 4c 45 43 54 20 28 32 20 42 45 54 57 45 45 4e 20  LECT (2 BETWEEN 
7e20: 31 20 41 4e 44 20 32 29 20 3c 20 33 20 20 7d 20  1 AND 2) < 3  } 
7e30: 31 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  1..#------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
7e80: 54 65 73 74 20 74 68 65 20 73 74 61 74 65 6d 65  Test the stateme
7e90: 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  nts related to t
7ea0: 68 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  he LIKE and GLOB
7eb0: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 23 0a 23 20   operators..#.# 
7ec0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
7ed0: 36 35 38 34 2d 36 30 31 38 39 20 54 68 65 20 4c  6584-60189 The L
7ee0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 64 6f 65  IKE operator doe
7ef0: 73 20 61 20 70 61 74 74 65 72 6e 20 6d 61 74 63  s a pattern matc
7f00: 68 69 6e 67 0a 23 20 63 6f 6d 70 61 72 69 73 6f  hing.# compariso
7f10: 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  n..#.# EVIDENCE-
7f20: 4f 46 3a 20 52 2d 31 31 32 39 35 2d 30 34 36 35  OF: R-11295-0465
7f30: 37 20 54 68 65 20 6f 70 65 72 61 6e 64 20 74 6f  7 The operand to
7f40: 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
7f50: 65 20 4c 49 4b 45 0a 23 20 6f 70 65 72 61 74 6f  e LIKE.# operato
7f60: 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  r contains the p
7f70: 61 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20 6c  attern and the l
7f80: 65 66 74 20 68 61 6e 64 20 6f 70 65 72 61 6e 64  eft hand operand
7f90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 23 20   contains the.# 
7fa0: 73 74 72 69 6e 67 20 74 6f 20 6d 61 74 63 68 20  string to match 
7fb0: 61 67 61 69 6e 73 74 20 74 68 65 20 70 61 74 74  against the patt
7fc0: 65 72 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ern..#.do_execsq
7fd0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
7fe0: 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61  .1.1 { SELECT 'a
7ff0: 62 63 25 27 20 4c 49 4b 45 20 27 61 62 63 64 65  bc%' LIKE 'abcde
8000: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
8010: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
8020: 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.2 { SELECT 'ab
8030: 63 64 65 27 20 4c 49 4b 45 20 27 61 62 63 25 27  cde' LIKE 'abc%'
8040: 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43 45   } 1..# EVIDENCE
8050: 2d 4f 46 3a 20 52 2d 35 35 34 30 36 2d 33 38 35  -OF: R-55406-385
8060: 32 34 20 41 20 70 65 72 63 65 6e 74 20 73 79 6d  24 A percent sym
8070: 62 6f 6c 20 28 22 25 22 29 20 69 6e 20 74 68 65  bol ("%") in the
8080: 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 0a 23 20   LIKE pattern.# 
8090: 6d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  matches any sequ
80a0: 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20  ence of zero or 
80b0: 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 20  more characters 
80c0: 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 23  in the string..#
80d0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
80e0: 20 65 5f 65 78 70 72 2d 31 34 2e 32 2e 31 20 7b   e_expr-14.2.1 {
80f0: 20 53 45 4c 45 43 54 20 27 61 62 64 65 27 20 20   SELECT 'abde'  
8100: 20 20 4c 49 4b 45 20 27 61 62 25 64 65 27 20 7d    LIKE 'ab%de' }
8110: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
8120: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 32 2e 32  st e_expr-14.2.2
8130: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 58 64 65   { SELECT 'abXde
8140: 27 20 20 20 4c 49 4b 45 20 27 61 62 25 64 65 27  '   LIKE 'ab%de'
8150: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
8160: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 32  test e_expr-14.2
8170: 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62 41  .3 { SELECT 'abA
8180: 42 43 64 65 27 20 4c 49 4b 45 20 27 61 62 25 64  BCde' LIKE 'ab%d
8190: 65 27 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e  e' } 1..# EVIDEN
81a0: 43 45 2d 4f 46 3a 20 52 2d 33 30 34 33 33 2d 32  CE-OF: R-30433-2
81b0: 35 34 34 33 20 41 6e 20 75 6e 64 65 72 73 63 6f  5443 An undersco
81c0: 72 65 20 28 22 5f 22 29 20 69 6e 20 74 68 65 20  re ("_") in the 
81d0: 4c 49 4b 45 20 70 61 74 74 65 72 6e 0a 23 20 6d  LIKE pattern.# m
81e0: 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c  atches any singl
81f0: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74  e character in t
8200: 68 65 20 73 74 72 69 6e 67 2e 0a 23 0a 64 6f 5f  he string..#.do_
8210: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8220: 78 70 72 2d 31 34 2e 33 2e 31 20 7b 20 53 45 4c  xpr-14.3.1 { SEL
8230: 45 43 54 20 27 61 62 64 65 27 20 20 20 20 4c 49  ECT 'abde'    LI
8240: 4b 45 20 27 61 62 5f 64 65 27 20 7d 20 30 0a 64  KE 'ab_de' } 0.d
8250: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8260: 5f 65 78 70 72 2d 31 34 2e 33 2e 32 20 7b 20 53  _expr-14.3.2 { S
8270: 45 4c 45 43 54 20 27 61 62 58 64 65 27 20 20 20  ELECT 'abXde'   
8280: 4c 49 4b 45 20 27 61 62 5f 64 65 27 20 7d 20 31  LIKE 'ab_de' } 1
8290: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
82a0: 20 65 5f 65 78 70 72 2d 31 34 2e 33 2e 33 20 7b   e_expr-14.3.3 {
82b0: 20 53 45 4c 45 43 54 20 27 61 62 41 42 43 64 65   SELECT 'abABCde
82c0: 27 20 4c 49 4b 45 20 27 61 62 5f 64 65 27 20 7d  ' LIKE 'ab_de' }
82d0: 20 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f   0..# EVIDENCE-O
82e0: 46 3a 20 52 2d 35 39 30 30 37 2d 32 30 34 35 34  F: R-59007-20454
82f0: 20 41 6e 79 20 6f 74 68 65 72 20 63 68 61 72 61   Any other chara
8300: 63 74 65 72 20 6d 61 74 63 68 65 73 20 69 74 73  cter matches its
8310: 65 6c 66 20 6f 72 20 69 74 73 0a 23 20 6c 6f 77  elf or its.# low
8320: 65 72 2f 75 70 70 65 72 20 63 61 73 65 20 65 71  er/upper case eq
8330: 75 69 76 61 6c 65 6e 74 20 28 69 2e 65 2e 20 63  uivalent (i.e. c
8340: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
8350: 6d 61 74 63 68 69 6e 67 29 2e 0a 23 0a 64 6f 5f  matching)..#.do_
8360: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8370: 78 70 72 2d 31 34 2e 34 2e 31 20 7b 20 53 45 4c  xpr-14.4.1 { SEL
8380: 45 43 54 20 27 61 62 63 27 20 4c 49 4b 45 20 27  ECT 'abc' LIKE '
8390: 61 42 63 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63  aBc' } 1.do_exec
83a0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
83b0: 31 34 2e 34 2e 32 20 7b 20 53 45 4c 45 43 54 20  14.4.2 { SELECT 
83c0: 27 61 42 63 27 20 4c 49 4b 45 20 27 61 42 63 27  'aBc' LIKE 'aBc'
83d0: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
83e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 34  test e_expr-14.4
83f0: 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 63 27  .3 { SELECT 'ac'
8400: 20 20 4c 49 4b 45 20 27 61 42 63 27 20 7d 20 30    LIKE 'aBc' } 0
8410: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
8420: 20 52 2d 32 33 36 34 38 2d 35 38 35 32 37 20 53   R-23648-58527 S
8430: 51 4c 69 74 65 20 6f 6e 6c 79 20 75 6e 64 65 72  QLite only under
8440: 73 74 61 6e 64 73 20 75 70 70 65 72 2f 6c 6f 77  stands upper/low
8450: 65 72 20 63 61 73 65 0a 23 20 66 6f 72 20 41 53  er case.# for AS
8460: 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20 62  CII characters b
8470: 79 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45  y default..#.# E
8480: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34  VIDENCE-OF: R-04
8490: 35 33 32 2d 31 31 35 32 37 20 54 68 65 20 4c 49  532-11527 The LI
84a0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63  KE operator is c
84b0: 61 73 65 20 73 65 6e 73 69 74 69 76 65 20 62 79  ase sensitive by
84c0: 0a 23 20 64 65 66 61 75 6c 74 20 66 6f 72 20 75  .# default for u
84d0: 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72  nicode character
84e0: 73 20 74 68 61 74 20 61 72 65 20 62 65 79 6f 6e  s that are beyon
84f0: 64 20 74 68 65 20 41 53 43 49 49 20 72 61 6e 67  d the ASCII rang
8500: 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  e..#.# EVIDENCE-
8510: 4f 46 3a 20 52 2d 34 34 33 38 31 2d 31 31 36 36  OF: R-44381-1166
8520: 39 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  9 the expression
8530: 0a 23 20 27 61 27 26 6e 62 73 70 3b 4c 49 4b 45  .# 'a'&nbsp;LIKE
8540: 26 6e 62 73 70 3b 27 41 27 20 69 73 20 54 52 55  &nbsp;'A' is TRU
8550: 45 20 62 75 74 0a 23 20 27 26 61 65 6c 69 67 3b  E but.# '&aelig;
8560: 27 26 6e 62 73 70 3b 4c 49 4b 45 26 6e 62 73 70  '&nbsp;LIKE&nbsp
8570: 3b 27 26 41 45 6c 69 67 3b 27 20 69 73 20 46 41  ;'&AElig;' is FA
8580: 4c 53 45 2e 0a 23 0a 23 20 20 20 54 68 65 20 72  LSE..#.#   The r
8590: 65 73 74 72 69 63 74 69 6f 6e 20 74 6f 20 41 53  estriction to AS
85a0: 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20 64  CII characters d
85b0: 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79 20 69 66  oes not apply if
85c0: 20 74 68 65 20 49 43 55 0a 23 20 20 20 6c 69 62   the ICU.#   lib
85d0: 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64  rary is compiled
85e0: 20 69 6e 2e 20 57 68 65 6e 20 49 43 55 20 69 73   in. When ICU is
85f0: 20 65 6e 61 62 6c 65 64 20 53 51 4c 69 74 65 20   enabled SQLite 
8600: 64 6f 65 73 20 6e 6f 74 20 61 63 74 0a 23 20 20  does not act.#  
8610: 20 61 73 20 69 74 20 64 6f 65 73 20 22 62 79 20   as it does "by 
8620: 64 65 66 61 75 6c 74 22 2e 0a 23 0a 64 6f 5f 65  default"..#.do_e
8630: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8640: 70 72 2d 31 34 2e 35 2e 31 20 7b 20 53 45 4c 45  pr-14.5.1 { SELE
8650: 43 54 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20  CT 'A' LIKE 'a' 
8660: 20 20 20 20 20 20 20 20 7d 20 31 0a 69 66 63 61          } 1.ifca
8670: 70 61 62 6c 65 20 21 69 63 75 20 7b 0a 20 20 64  pable !icu {.  d
8680: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8690: 5f 65 78 70 72 2d 31 34 2e 35 2e 32 20 22 53 45  _expr-14.5.2 "SE
86a0: 4c 45 43 54 20 27 5c 75 30 30 63 36 27 20 4c 49  LECT '\u00c6' LI
86b0: 4b 45 20 27 5c 75 30 30 65 36 27 22 20 30 0a 7d  KE '\u00e6'" 0.}
86c0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
86d0: 20 52 2d 35 36 36 38 33 2d 31 33 37 33 31 20 49   R-56683-13731 I
86e0: 66 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 45  f the optional E
86f0: 53 43 41 50 45 20 63 6c 61 75 73 65 20 69 73 20  SCAPE clause is 
8700: 70 72 65 73 65 6e 74 2c 0a 23 20 74 68 65 6e 20  present,.# then 
8710: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66  the expression f
8720: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 45 53 43  ollowing the ESC
8730: 41 50 45 20 6b 65 79 77 6f 72 64 20 6d 75 73 74  APE keyword must
8740: 20 65 76 61 6c 75 61 74 65 20 74 6f 20 61 0a 23   evaluate to a.#
8750: 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69   string consisti
8760: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63  ng of a single c
8770: 68 61 72 61 63 74 65 72 2e 0a 23 0a 64 6f 5f 63  haracter..#.do_c
8780: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65  atchsql_test e_e
8790: 78 70 72 2d 31 34 2e 36 2e 31 20 7b 20 0a 20 20  xpr-14.6.1 { .  
87a0: 53 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20  SELECT 'A' LIKE 
87b0: 27 61 27 20 45 53 43 41 50 45 20 27 31 32 27 20  'a' ESCAPE '12' 
87c0: 0a 7d 20 7b 31 20 7b 45 53 43 41 50 45 20 65 78  .} {1 {ESCAPE ex
87d0: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
87e0: 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63   a single charac
87f0: 74 65 72 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71  ter}}.do_catchsq
8800: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
8810: 2e 36 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54  .6.2 { .  SELECT
8820: 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53   'A' LIKE 'a' ES
8830: 43 41 50 45 20 27 27 20 0a 7d 20 7b 31 20 7b 45  CAPE '' .} {1 {E
8840: 53 43 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e  SCAPE expression
8850: 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c   must be a singl
8860: 65 20 63 68 61 72 61 63 74 65 72 7d 7d 0a 64 6f  e character}}.do
8870: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
8880: 5f 65 78 70 72 2d 31 34 2e 36 2e 33 20 7b 20 53  _expr-14.6.3 { S
8890: 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20 27  ELECT 'A' LIKE '
88a0: 61 27 20 45 53 43 41 50 45 20 27 78 27 20 7d 20  a' ESCAPE 'x' } 
88b0: 20 20 20 7b 30 20 31 7d 0a 64 6f 5f 63 61 74 63     {0 1}.do_catc
88c0: 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  hsql_test e_expr
88d0: 2d 31 34 2e 36 2e 34 20 22 53 45 4c 45 43 54 20  -14.6.4 "SELECT 
88e0: 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53 43  'A' LIKE 'a' ESC
88f0: 41 50 45 20 27 5c 75 30 30 65 36 27 22 20 7b 30  APE '\u00e6'" {0
8900: 20 31 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   1}..# EVIDENCE-
8910: 4f 46 3a 20 52 2d 30 32 30 34 35 2d 32 33 37 36  OF: R-02045-2376
8920: 32 20 54 68 69 73 20 63 68 61 72 61 63 74 65 72  2 This character
8930: 20 6d 61 79 20 62 65 20 75 73 65 64 20 69 6e 20   may be used in 
8940: 74 68 65 20 4c 49 4b 45 0a 23 20 70 61 74 74 65  the LIKE.# patte
8950: 72 6e 20 74 6f 20 69 6e 63 6c 75 64 65 20 6c 69  rn to include li
8960: 74 65 72 61 6c 20 70 65 72 63 65 6e 74 20 6f 72  teral percent or
8970: 20 75 6e 64 65 72 73 63 6f 72 65 20 63 68 61 72   underscore char
8980: 61 63 74 65 72 73 2e 0a 23 0a 23 20 45 56 49 44  acters..#.# EVID
8990: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 33 34 35  ENCE-OF: R-13345
89a0: 2d 33 31 38 33 30 20 54 68 65 20 65 73 63 61 70  -31830 The escap
89b0: 65 20 63 68 61 72 61 63 74 65 72 20 66 6f 6c 6c  e character foll
89c0: 6f 77 65 64 20 62 79 20 61 20 70 65 72 63 65 6e  owed by a percen
89d0: 74 0a 23 20 73 79 6d 62 6f 6c 20 28 25 29 2c 20  t.# symbol (%), 
89e0: 75 6e 64 65 72 73 63 6f 72 65 20 28 5f 29 2c 20  underscore (_), 
89f0: 6f 72 20 61 20 73 65 63 6f 6e 64 20 69 6e 73 74  or a second inst
8a00: 61 6e 63 65 20 6f 66 20 74 68 65 20 65 73 63 61  ance of the esca
8a10: 70 65 0a 23 20 63 68 61 72 61 63 74 65 72 20 69  pe.# character i
8a20: 74 73 65 6c 66 20 6d 61 74 63 68 65 73 20 61 20  tself matches a 
8a30: 6c 69 74 65 72 61 6c 20 70 65 72 63 65 6e 74 20  literal percent 
8a40: 73 79 6d 62 6f 6c 2c 20 75 6e 64 65 72 73 63 6f  symbol, undersco
8a50: 72 65 2c 20 6f 72 20 61 0a 23 20 73 69 6e 67 6c  re, or a.# singl
8a60: 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74  e escape charact
8a70: 65 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  er, respectively
8a80: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
8a90: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e  est e_expr-14.7.
8aa0: 31 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  1  { SELECT 'abc
8ab0: 25 27 20 20 4c 49 4b 45 20 27 61 62 63 58 25 27  %'  LIKE 'abcX%'
8ac0: 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 31 0a   ESCAPE 'X' } 1.
8ad0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8ae0: 65 5f 65 78 70 72 2d 31 34 2e 37 2e 32 20 20 7b  e_expr-14.7.2  {
8af0: 20 53 45 4c 45 43 54 20 27 61 62 63 35 27 20 20   SELECT 'abc5'  
8b00: 4c 49 4b 45 20 27 61 62 63 58 25 27 20 45 53 43  LIKE 'abcX%' ESC
8b10: 41 50 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65  APE 'X' } 0.do_e
8b20: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8b30: 70 72 2d 31 34 2e 37 2e 33 20 20 7b 20 53 45 4c  pr-14.7.3  { SEL
8b40: 45 43 54 20 27 61 62 63 27 20 20 20 4c 49 4b 45  ECT 'abc'   LIKE
8b50: 20 27 61 62 63 58 25 27 20 45 53 43 41 50 45 20   'abcX%' ESCAPE 
8b60: 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  'X' } 0.do_execs
8b70: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8b80: 34 2e 37 2e 34 20 20 7b 20 53 45 4c 45 43 54 20  4.7.4  { SELECT 
8b90: 27 61 62 63 58 25 27 20 4c 49 4b 45 20 27 61 62  'abcX%' LIKE 'ab
8ba0: 63 58 25 27 20 45 53 43 41 50 45 20 27 58 27 20  cX%' ESCAPE 'X' 
8bb0: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
8bc0: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e  est e_expr-14.7.
8bd0: 35 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  5  { SELECT 'abc
8be0: 25 25 27 20 4c 49 4b 45 20 27 61 62 63 58 25 27  %%' LIKE 'abcX%'
8bf0: 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a   ESCAPE 'X' } 0.
8c00: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8c10: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 36 20 20   e_expr-14.7.6  
8c20: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 5f 27 20  { SELECT 'abc_' 
8c30: 20 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53   LIKE 'abcX_' ES
8c40: 43 41 50 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f  CAPE 'X' } 1.do_
8c50: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8c60: 78 70 72 2d 31 34 2e 37 2e 37 20 20 7b 20 53 45  xpr-14.7.7  { SE
8c70: 4c 45 43 54 20 27 61 62 63 35 27 20 20 4c 49 4b  LECT 'abc5'  LIK
8c80: 45 20 27 61 62 63 58 5f 27 20 45 53 43 41 50 45  E 'abcX_' ESCAPE
8c90: 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63   'X' } 0.do_exec
8ca0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
8cb0: 31 34 2e 37 2e 38 20 20 7b 20 53 45 4c 45 43 54  14.7.8  { SELECT
8cc0: 20 27 61 62 63 27 20 20 20 4c 49 4b 45 20 27 61   'abc'   LIKE 'a
8cd0: 62 63 58 5f 27 20 45 53 43 41 50 45 20 27 58 27  bcX_' ESCAPE 'X'
8ce0: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
8cf0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37  test e_expr-14.7
8d00: 2e 39 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .9  { SELECT 'ab
8d10: 63 58 5f 27 20 4c 49 4b 45 20 27 61 62 63 58 5f  cX_' LIKE 'abcX_
8d20: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30  ' ESCAPE 'X' } 0
8d30: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8d40: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 30 20   e_expr-14.7.10 
8d50: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 5f 5f 27  { SELECT 'abc__'
8d60: 20 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53   LIKE 'abcX_' ES
8d70: 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 64 6f  CAPE 'X' } 0..do
8d80: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8d90: 65 78 70 72 2d 31 34 2e 37 2e 31 31 20 7b 20 53  expr-14.7.11 { S
8da0: 45 4c 45 43 54 20 27 61 62 63 58 27 20 20 4c 49  ELECT 'abcX'  LI
8db0: 4b 45 20 27 61 62 63 58 58 27 20 45 53 43 41 50  KE 'abcXX' ESCAP
8dc0: 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f 65 78 65  E 'X' } 1.do_exe
8dd0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
8de0: 2d 31 34 2e 37 2e 31 32 20 7b 20 53 45 4c 45 43  -14.7.12 { SELEC
8df0: 54 20 27 61 62 63 35 27 20 20 4c 49 4b 45 20 27  T 'abc5'  LIKE '
8e00: 61 62 63 58 58 27 20 45 53 43 41 50 45 20 27 58  abcXX' ESCAPE 'X
8e10: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
8e20: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
8e30: 37 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 27 61  7.13 { SELECT 'a
8e40: 62 63 27 20 20 20 4c 49 4b 45 20 27 61 62 63 58  bc'   LIKE 'abcX
8e50: 58 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20  X' ESCAPE 'X' } 
8e60: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
8e70: 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 34  t e_expr-14.7.14
8e80: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 58 58   { SELECT 'abcXX
8e90: 27 20 4c 49 4b 45 20 27 61 62 63 58 58 27 20 45  ' LIKE 'abcXX' E
8ea0: 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 23  SCAPE 'X' } 0..#
8eb0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
8ec0: 35 31 33 35 39 2d 31 37 34 39 36 20 54 68 65 20  51359-17496 The 
8ed0: 69 6e 66 69 78 20 4c 49 4b 45 20 6f 70 65 72 61  infix LIKE opera
8ee0: 74 6f 72 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  tor is implement
8ef0: 65 64 20 62 79 0a 23 20 63 61 6c 6c 69 6e 67 20  ed by.# calling 
8f00: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d  the application-
8f10: 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63  defined SQL func
8f20: 74 69 6f 6e 73 20 6c 69 6b 65 28 59 2c 58 29 20  tions like(Y,X) 
8f30: 6f 72 20 6c 69 6b 65 28 59 2c 58 2c 5a 29 2e 0a  or like(Y,X,Z)..
8f40: 23 0a 70 72 6f 63 20 6c 69 6b 65 66 75 6e 63 20  #.proc likefunc 
8f50: 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20  {args} {.  eval 
8f60: 6c 61 70 70 65 6e 64 20 3a 3a 6c 69 6b 65 61 72  lappend ::likear
8f70: 67 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72  gs $args.  retur
8f80: 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 6c 69  n 1.}.db func li
8f90: 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 6c  ke -argcount 2 l
8fa0: 69 6b 65 66 75 6e 63 0a 64 62 20 66 75 6e 63 20  ikefunc.db func 
8fb0: 6c 69 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 33  like -argcount 3
8fc0: 20 6c 69 6b 65 66 75 6e 63 0a 73 65 74 20 3a 3a   likefunc.set ::
8fd0: 6c 69 6b 65 61 72 67 73 20 5b 6c 69 73 74 5d 0a  likeargs [list].
8fe0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8ff0: 65 5f 65 78 70 72 2d 31 35 2e 31 2e 31 20 7b 20  e_expr-15.1.1 { 
9000: 53 45 4c 45 43 54 20 27 61 62 63 27 20 4c 49 4b  SELECT 'abc' LIK
9010: 45 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74  E 'def' } 1.do_t
9020: 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78  est         e_ex
9030: 70 72 2d 31 35 2e 31 2e 32 20 7b 20 73 65 74 20  pr-15.1.2 { set 
9040: 6c 69 6b 65 61 72 67 73 20 7d 20 7b 64 65 66 20  likeargs } {def 
9050: 61 62 63 7d 0a 73 65 74 20 3a 3a 6c 69 6b 65 61  abc}.set ::likea
9060: 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  rgs [list].do_ex
9070: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
9080: 72 2d 31 35 2e 31 2e 33 20 7b 20 53 45 4c 45 43  r-15.1.3 { SELEC
9090: 54 20 27 61 62 63 27 20 4c 49 4b 45 20 27 64 65  T 'abc' LIKE 'de
90a0: 66 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20  f' ESCAPE 'X' } 
90b0: 31 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  1.do_test       
90c0: 20 20 65 5f 65 78 70 72 2d 31 35 2e 31 2e 34 20    e_expr-15.1.4 
90d0: 7b 20 73 65 74 20 6c 69 6b 65 61 72 67 73 20 7d  { set likeargs }
90e0: 20 7b 64 65 66 20 61 62 63 20 58 7d 0a 64 62 20   {def abc X}.db 
90f0: 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62  close.sqlite3 db
9100: 20 74 65 73 74 2e 64 62 0a 0a 23 20 45 56 49 44   test.db..# EVID
9110: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 38 36 38  ENCE-OF: R-22868
9120: 2d 32 35 38 38 30 20 54 68 65 20 4c 49 4b 45 20  -25880 The LIKE 
9130: 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65 20  operator can be 
9140: 6d 61 64 65 20 63 61 73 65 0a 23 20 73 65 6e 73  made case.# sens
9150: 69 74 69 76 65 20 75 73 69 6e 67 20 74 68 65 20  itive using the 
9160: 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c  case_sensitive_l
9170: 69 6b 65 20 70 72 61 67 6d 61 2e 0a 23 0a 64 6f  ike pragma..#.do
9180: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9190: 65 78 70 72 2d 31 36 2e 31 2e 31 20 20 7b 20 53  expr-16.1.1  { S
91a0: 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4c  ELECT 'abcxyz' L
91b0: 49 4b 45 20 27 41 42 43 25 27 20 7d 20 31 0a 64  IKE 'ABC%' } 1.d
91c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
91d0: 5f 65 78 70 72 2d 31 36 2e 31 2e 31 62 20 7b 20  _expr-16.1.1b { 
91e0: 53 45 4c 45 43 54 20 27 61 62 63 25 78 79 7a 27  SELECT 'abc%xyz'
91f0: 20 4c 49 4b 45 20 27 41 42 43 5c 25 78 25 27 20   LIKE 'ABC\%x%' 
9200: 45 53 43 41 50 45 20 27 5c 27 20 7d 20 31 0a 64  ESCAPE '\' } 1.d
9210: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
9220: 5f 65 78 70 72 2d 31 36 2e 31 2e 32 20 20 7b 20  _expr-16.1.2  { 
9230: 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73  PRAGMA case_sens
9240: 69 74 69 76 65 5f 6c 69 6b 65 20 3d 20 31 20 7d  itive_like = 1 }
9250: 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   {}.do_execsql_t
9260: 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e  est e_expr-16.1.
9270: 33 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  3  { SELECT 'abc
9280: 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25 27  xyz' LIKE 'ABC%'
9290: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
92a0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
92b0: 2e 33 62 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .3b { SELECT 'ab
92c0: 63 25 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43  c%xyz' LIKE 'ABC
92d0: 5c 25 58 25 27 20 45 53 43 41 50 45 20 27 5c 27  \%X%' ESCAPE '\'
92e0: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
92f0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
9300: 2e 34 20 20 7b 20 53 45 4c 45 43 54 20 27 41 42  .4  { SELECT 'AB
9310: 43 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25  Cxyz' LIKE 'ABC%
9320: 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 1.do_execsql
9330: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e  _test e_expr-16.
9340: 31 2e 34 62 20 7b 20 53 45 4c 45 43 54 20 27 41  1.4b { SELECT 'A
9350: 42 43 25 78 79 7a 27 20 4c 49 4b 45 20 27 41 42  BC%xyz' LIKE 'AB
9360: 43 5c 25 78 25 27 20 45 53 43 41 50 45 20 27 5c  C\%x%' ESCAPE '\
9370: 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 1.do_execsql
9380: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e  _test e_expr-16.
9390: 31 2e 35 20 20 7b 20 50 52 41 47 4d 41 20 63 61  1.5  { PRAGMA ca
93a0: 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b  se_sensitive_lik
93b0: 65 20 3d 20 30 20 7d 20 7b 7d 0a 64 6f 5f 65 78  e = 0 } {}.do_ex
93c0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
93d0: 72 2d 31 36 2e 31 2e 36 20 20 7b 20 53 45 4c 45  r-16.1.6  { SELE
93e0: 43 54 20 27 61 62 63 78 79 7a 27 20 4c 49 4b 45  CT 'abcxyz' LIKE
93f0: 20 27 41 42 43 25 27 20 7d 20 31 0a 64 6f 5f 65   'ABC%' } 1.do_e
9400: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
9410: 70 72 2d 31 36 2e 31 2e 36 62 20 7b 20 53 45 4c  pr-16.1.6b { SEL
9420: 45 43 54 20 27 61 62 63 25 78 79 7a 27 20 4c 49  ECT 'abc%xyz' LI
9430: 4b 45 20 27 41 42 43 5c 25 58 25 27 20 45 53 43  KE 'ABC\%X%' ESC
9440: 41 50 45 20 27 5c 27 20 7d 20 31 0a 64 6f 5f 65  APE '\' } 1.do_e
9450: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
9460: 70 72 2d 31 36 2e 31 2e 37 20 20 7b 20 53 45 4c  pr-16.1.7  { SEL
9470: 45 43 54 20 27 41 42 43 78 79 7a 27 20 4c 49 4b  ECT 'ABCxyz' LIK
9480: 45 20 27 41 42 43 25 27 20 7d 20 31 0a 64 6f 5f  E 'ABC%' } 1.do_
9490: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
94a0: 78 70 72 2d 31 36 2e 31 2e 37 62 20 7b 20 53 45  xpr-16.1.7b { SE
94b0: 4c 45 43 54 20 27 41 42 43 25 78 79 7a 27 20 4c  LECT 'ABC%xyz' L
94c0: 49 4b 45 20 27 41 42 43 5c 25 58 25 27 20 45 53  IKE 'ABC\%X%' ES
94d0: 43 41 50 45 20 27 5c 27 20 7d 20 31 0a 0a 23 20  CAPE '\' } 1..# 
94e0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
94f0: 32 30 38 37 2d 31 32 30 34 33 20 54 68 65 20 47  2087-12043 The G
9500: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 69 73 20  LOB operator is 
9510: 73 69 6d 69 6c 61 72 20 74 6f 20 4c 49 4b 45 20  similar to LIKE 
9520: 62 75 74 0a 23 20 75 73 65 73 20 74 68 65 20 55  but.# uses the U
9530: 6e 69 78 20 66 69 6c 65 20 67 6c 6f 62 62 69 6e  nix file globbin
9540: 67 20 73 79 6e 74 61 78 20 66 6f 72 20 69 74 73  g syntax for its
9550: 20 77 69 6c 64 63 61 72 64 73 2e 0a 23 0a 23 20   wildcards..#.# 
9560: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
9570: 39 38 31 33 2d 31 37 32 37 39 20 41 6c 73 6f 2c  9813-17279 Also,
9580: 20 47 4c 4f 42 20 69 73 20 63 61 73 65 20 73 65   GLOB is case se
9590: 6e 73 69 74 69 76 65 2c 20 75 6e 6c 69 6b 65 20  nsitive, unlike 
95a0: 4c 49 4b 45 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  LIKE..#.do_execs
95b0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
95c0: 37 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 27  7.1.1 { SELECT '
95d0: 61 62 63 78 79 7a 27 20 47 4c 4f 42 20 27 61 62  abcxyz' GLOB 'ab
95e0: 63 25 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  c%' } 0.do_execs
95f0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
9600: 37 2e 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 27  7.1.2 { SELECT '
9610: 61 62 63 78 79 7a 27 20 47 4c 4f 42 20 27 61 62  abcxyz' GLOB 'ab
9620: 63 2a 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73  c*' } 1.do_execs
9630: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
9640: 37 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54 20 27  7.1.3 { SELECT '
9650: 61 62 63 78 79 7a 27 20 47 4c 4f 42 20 27 61 62  abcxyz' GLOB 'ab
9660: 63 5f 5f 5f 27 20 7d 20 30 0a 64 6f 5f 65 78 65  c___' } 0.do_exe
9670: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
9680: 2d 31 37 2e 31 2e 34 20 7b 20 53 45 4c 45 43 54  -17.1.4 { SELECT
9690: 20 27 61 62 63 78 79 7a 27 20 47 4c 4f 42 20 27   'abcxyz' GLOB '
96a0: 61 62 63 3f 3f 3f 27 20 7d 20 31 0a 0a 64 6f 5f  abc???' } 1..do_
96b0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
96c0: 78 70 72 2d 31 37 2e 31 2e 35 20 7b 20 53 45 4c  xpr-17.1.5 { SEL
96d0: 45 43 54 20 27 61 62 63 78 79 7a 27 20 47 4c 4f  ECT 'abcxyz' GLO
96e0: 42 20 27 61 62 63 2a 27 20 7d 20 31 0a 64 6f 5f  B 'abc*' } 1.do_
96f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
9700: 78 70 72 2d 31 37 2e 31 2e 36 20 7b 20 53 45 4c  xpr-17.1.6 { SEL
9710: 45 43 54 20 27 41 42 43 78 79 7a 27 20 47 4c 4f  ECT 'ABCxyz' GLO
9720: 42 20 27 61 62 63 2a 27 20 7d 20 30 0a 64 6f 5f  B 'abc*' } 0.do_
9730: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
9740: 78 70 72 2d 31 37 2e 31 2e 37 20 7b 20 53 45 4c  xpr-17.1.7 { SEL
9750: 45 43 54 20 27 61 62 63 78 79 7a 27 20 47 4c 4f  ECT 'abcxyz' GLO
9760: 42 20 27 41 42 43 2a 27 20 7d 20 30 0a 0a 23 20  B 'ABC*' } 0..# 
9770: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
9780: 39 36 31 36 2d 32 30 35 35 35 20 42 6f 74 68 20  9616-20555 Both 
9790: 47 4c 4f 42 20 61 6e 64 20 4c 49 4b 45 20 6d 61  GLOB and LIKE ma
97a0: 79 20 62 65 20 70 72 65 63 65 64 65 64 20 62 79  y be preceded by
97b0: 20 74 68 65 0a 23 20 4e 4f 54 20 6b 65 79 77 6f   the.# NOT keywo
97c0: 72 64 20 74 6f 20 69 6e 76 65 72 74 20 74 68 65  rd to invert the
97d0: 20 73 65 6e 73 65 20 6f 66 20 74 68 65 20 74 65   sense of the te
97e0: 73 74 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  st..#.do_execsql
97f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9800: 32 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.1 { SELECT 'ab
9810: 63 78 79 7a 27 20 4e 4f 54 20 47 4c 4f 42 20 27  cxyz' NOT GLOB '
9820: 41 42 43 2a 27 20 7d 20 31 0a 64 6f 5f 65 78 65  ABC*' } 1.do_exe
9830: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
9840: 2d 31 37 2e 32 2e 32 20 7b 20 53 45 4c 45 43 54  -17.2.2 { SELECT
9850: 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 47 4c   'abcxyz' NOT GL
9860: 4f 42 20 27 61 62 63 2a 27 20 7d 20 30 0a 64 6f  OB 'abc*' } 0.do
9870: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9880: 65 78 70 72 2d 31 37 2e 32 2e 33 20 7b 20 53 45  expr-17.2.3 { SE
9890: 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e 4f  LECT 'abcxyz' NO
98a0: 54 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20  T LIKE 'ABC%' } 
98b0: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
98c0: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 34 20  t e_expr-17.2.4 
98d0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
98e0: 27 20 4e 4f 54 20 4c 49 4b 45 20 27 61 62 63 25  ' NOT LIKE 'abc%
98f0: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
9900: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9910: 32 2e 35 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.5 { SELECT 'ab
9920: 64 78 79 7a 27 20 4e 4f 54 20 4c 49 4b 45 20 27  dxyz' NOT LIKE '
9930: 61 62 63 25 27 20 7d 20 31 0a 0a 64 62 20 6e 75  abc%' } 1..db nu
9940: 6c 6c 76 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f  llvalue null.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 32 2e 36 20 7b 20 53 45 4c  xpr-17.2.6 { SEL
9970: 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e 4f 54  ECT 'abcxyz' NOT
9980: 20 47 4c 4f 42 20 4e 55 4c 4c 20 7d 20 6e 75 6c   GLOB NULL } nul
9990: 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l.do_execsql_tes
99a0: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 37 20  t e_expr-17.2.7 
99b0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
99c0: 27 20 4e 4f 54 20 4c 49 4b 45 20 4e 55 4c 4c 20  ' NOT LIKE NULL 
99d0: 7d 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71  } null.do_execsq
99e0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37  l_test e_expr-17
99f0: 2e 32 2e 38 20 7b 20 53 45 4c 45 43 54 20 4e 55  .2.8 { SELECT NU
9a00: 4c 4c 20 4e 4f 54 20 47 4c 4f 42 20 27 61 62 63  LL NOT GLOB 'abc
9a10: 2a 27 20 7d 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65  *' } null.do_exe
9a20: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
9a30: 2d 31 37 2e 32 2e 39 20 7b 20 53 45 4c 45 43 54  -17.2.9 { SELECT
9a40: 20 4e 55 4c 4c 20 4e 4f 54 20 4c 49 4b 45 20 27   NULL NOT LIKE '
9a50: 41 42 43 25 27 20 7d 20 6e 75 6c 6c 0a 64 62 20  ABC%' } null.db 
9a60: 6e 75 6c 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23 20  nullvalue {}..# 
9a70: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
9a80: 39 34 31 34 2d 33 35 34 38 39 20 54 68 65 20 69  9414-35489 The i
9a90: 6e 66 69 78 20 47 4c 4f 42 20 6f 70 65 72 61 74  nfix GLOB operat
9aa0: 6f 72 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  or is implemente
9ab0: 64 20 62 79 0a 23 20 63 61 6c 6c 69 6e 67 20 74  d by.# calling t
9ac0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 67 6c 6f 62  he function glob
9ad0: 28 59 2c 58 29 20 61 6e 64 20 63 61 6e 20 62 65  (Y,X) and can be
9ae0: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 6f 76 65   modified by ove
9af0: 72 72 69 64 69 6e 67 20 74 68 61 74 0a 23 20 66  rriding that.# f
9b00: 75 6e 63 74 69 6f 6e 2e 0a 70 72 6f 63 20 67 6c  unction..proc gl
9b10: 6f 62 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b 0a  obfunc {args} {.
9b20: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a    eval lappend :
9b30: 3a 67 6c 6f 62 61 72 67 73 20 24 61 72 67 73 0a  :globargs $args.
9b40: 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a 64 62 20    return 1.}.db 
9b50: 66 75 6e 63 20 67 6c 6f 62 20 2d 61 72 67 63 6f  func glob -argco
9b60: 75 6e 74 20 32 20 67 6c 6f 62 66 75 6e 63 0a 73  unt 2 globfunc.s
9b70: 65 74 20 3a 3a 67 6c 6f 62 61 72 67 73 20 5b 6c  et ::globargs [l
9b80: 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ist].do_execsql_
9b90: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 33  test e_expr-17.3
9ba0: 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .1 { SELECT 'abc
9bb0: 27 20 47 4c 4f 42 20 27 64 65 66 27 20 7d 20 31  ' GLOB 'def' } 1
9bc0: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
9bd0: 20 65 5f 65 78 70 72 2d 31 37 2e 33 2e 32 20 7b   e_expr-17.3.2 {
9be0: 20 73 65 74 20 67 6c 6f 62 61 72 67 73 20 7d 20   set globargs } 
9bf0: 7b 64 65 66 20 61 62 63 7d 0a 73 65 74 20 3a 3a  {def abc}.set ::
9c00: 67 6c 6f 62 61 72 67 73 20 5b 6c 69 73 74 5d 0a  globargs [list].
9c10: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9c20: 65 5f 65 78 70 72 2d 31 37 2e 33 2e 33 20 7b 20  e_expr-17.3.3 { 
9c30: 53 45 4c 45 43 54 20 27 58 27 20 4e 4f 54 20 47  SELECT 'X' NOT G
9c40: 4c 4f 42 20 27 59 27 20 7d 20 30 0a 64 6f 5f 74  LOB 'Y' } 0.do_t
9c50: 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78  est         e_ex
9c60: 70 72 2d 31 37 2e 33 2e 34 20 7b 20 73 65 74 20  pr-17.3.4 { set 
9c70: 67 6c 6f 62 61 72 67 73 20 7d 20 7b 59 20 58 7d  globargs } {Y X}
9c80: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
9c90: 2e 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  .db..# EVIDENCE-
9ca0: 4f 46 3a 20 52 2d 34 31 36 35 30 2d 32 30 38 37  OF: R-41650-2087
9cb0: 32 20 4e 6f 20 72 65 67 65 78 70 28 29 20 75 73  2 No regexp() us
9cc0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64  er function is d
9cd0: 65 66 69 6e 65 64 20 62 79 0a 23 20 64 65 66 61  efined by.# defa
9ce0: 75 6c 74 20 61 6e 64 20 73 6f 20 75 73 65 20 6f  ult and so use o
9cf0: 66 20 74 68 65 20 52 45 47 45 58 50 20 6f 70 65  f the REGEXP ope
9d00: 72 61 74 6f 72 20 77 69 6c 6c 20 6e 6f 72 6d 61  rator will norma
9d10: 6c 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  lly result in an
9d20: 0a 23 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  .# error message
9d30: 2e 0a 23 0a 23 20 20 20 54 68 65 72 65 20 69 73  ..#.#   There is
9d40: 20 61 20 72 65 67 65 78 70 20 66 75 6e 63 74 69   a regexp functi
9d50: 6f 6e 20 69 66 20 49 43 55 20 69 73 20 65 6e 61  on if ICU is ena
9d60: 62 6c 65 64 20 74 68 6f 75 67 68 2e 0a 23 0a 69  bled though..#.i
9d70: 66 63 61 70 61 62 6c 65 20 21 69 63 75 20 7b 0a  fcapable !icu {.
9d80: 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65    do_catchsql_te
9d90: 73 74 20 65 5f 65 78 70 72 2d 31 38 2e 31 2e 31  st e_expr-18.1.1
9da0: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 72   { .    SELECT r
9db0: 65 67 65 78 70 28 27 61 62 63 27 2c 20 27 64 65  egexp('abc', 'de
9dc0: 66 27 29 20 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20  f') .  } {1 {no 
9dd0: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 72  such function: r
9de0: 65 67 65 78 70 7d 7d 0a 20 20 64 6f 5f 63 61 74  egexp}}.  do_cat
9df0: 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  chsql_test e_exp
9e00: 72 2d 31 38 2e 31 2e 32 20 7b 20 0a 20 20 20 20  r-18.1.2 { .    
9e10: 53 45 4c 45 43 54 20 27 61 62 63 27 20 52 45 47  SELECT 'abc' REG
9e20: 45 58 50 20 27 64 65 66 27 0a 20 20 7d 20 7b 31  EXP 'def'.  } {1
9e30: 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69   {no such functi
9e40: 6f 6e 3a 20 52 45 47 45 58 50 7d 7d 0a 7d 0a 0a  on: REGEXP}}.}..
9e50: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
9e60: 2d 33 33 36 39 33 2d 35 30 31 38 30 20 54 68 65  -33693-50180 The
9e70: 20 52 45 47 45 58 50 20 6f 70 65 72 61 74 6f 72   REGEXP operator
9e80: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 73 79   is a special sy
9e90: 6e 74 61 78 20 66 6f 72 0a 23 20 74 68 65 20 72  ntax for.# the r
9ea0: 65 67 65 78 70 28 29 20 75 73 65 72 20 66 75 6e  egexp() user fun
9eb0: 63 74 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45  ction..#.# EVIDE
9ec0: 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 35 32 34 2d  NCE-OF: R-65524-
9ed0: 36 31 38 34 39 20 49 66 20 61 6e 20 61 70 70 6c  61849 If an appl
9ee0: 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  ication-defined 
9ef0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 23 20 6e  SQL function.# n
9f00: 61 6d 65 64 20 22 72 65 67 65 78 70 22 20 69 73  amed "regexp" is
9f10: 20 61 64 64 65 64 20 61 74 20 72 75 6e 2d 74 69   added at run-ti
9f20: 6d 65 2c 20 74 68 65 6e 20 74 68 65 20 22 58 20  me, then the "X 
9f30: 52 45 47 45 58 50 20 59 22 20 6f 70 65 72 61 74  REGEXP Y" operat
9f40: 6f 72 0a 23 20 77 69 6c 6c 20 62 65 20 69 6d 70  or.# will be imp
9f50: 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 61  lemented as a ca
9f60: 6c 6c 20 74 6f 20 22 72 65 67 65 78 70 28 59 2c  ll to "regexp(Y,
9f70: 58 29 22 2e 0a 23 0a 70 72 6f 63 20 72 65 67 65  X)"..#.proc rege
9f80: 78 70 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b 0a  xpfunc {args} {.
9f90: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a    eval lappend :
9fa0: 3a 72 65 67 65 78 70 61 72 67 73 20 24 61 72 67  :regexpargs $arg
9fb0: 73 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a 64  s.  return 1.}.d
9fc0: 62 20 66 75 6e 63 20 72 65 67 65 78 70 20 2d 61  b func regexp -a
9fd0: 72 67 63 6f 75 6e 74 20 32 20 72 65 67 65 78 70  rgcount 2 regexp
9fe0: 66 75 6e 63 0a 73 65 74 20 3a 3a 72 65 67 65 78  func.set ::regex
9ff0: 70 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f  pargs [list].do_
a000: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
a010: 78 70 72 2d 31 38 2e 32 2e 31 20 7b 20 53 45 4c  xpr-18.2.1 { SEL
a020: 45 43 54 20 27 61 62 63 27 20 52 45 47 45 58 50  ECT 'abc' REGEXP
a030: 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65   'def' } 1.do_te
a040: 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78 70  st         e_exp
a050: 72 2d 31 38 2e 32 2e 32 20 7b 20 73 65 74 20 72  r-18.2.2 { set r
a060: 65 67 65 78 70 61 72 67 73 20 7d 20 7b 64 65 66  egexpargs } {def
a070: 20 61 62 63 7d 0a 73 65 74 20 3a 3a 72 65 67 65   abc}.set ::rege
a080: 78 70 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f  xpargs [list].do
a090: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
a0a0: 65 78 70 72 2d 31 38 2e 32 2e 33 20 7b 20 53 45  expr-18.2.3 { SE
a0b0: 4c 45 43 54 20 27 58 27 20 4e 4f 54 20 52 45 47  LECT 'X' NOT REG
a0c0: 45 58 50 20 27 59 27 20 7d 20 30 0a 64 6f 5f 74  EXP 'Y' } 0.do_t
a0d0: 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78  est         e_ex
a0e0: 70 72 2d 31 38 2e 32 2e 34 20 7b 20 73 65 74 20  pr-18.2.4 { set 
a0f0: 72 65 67 65 78 70 61 72 67 73 20 7d 20 7b 59 20  regexpargs } {Y 
a100: 58 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  X}.sqlite3 db te
a110: 73 74 2e 64 62 0a 0a 23 20 45 56 49 44 45 4e 43  st.db..# EVIDENC
a120: 45 2d 4f 46 3a 20 52 2d 34 32 30 33 37 2d 33 37  E-OF: R-42037-37
a130: 38 32 36 20 54 68 65 20 64 65 66 61 75 6c 74 20  826 The default 
a140: 6d 61 74 63 68 28 29 20 66 75 6e 63 74 69 6f 6e  match() function
a150: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
a160: 23 20 72 61 69 73 65 73 20 61 6e 20 65 78 63 65  # raises an exce
a170: 70 74 69 6f 6e 20 61 6e 64 20 69 73 20 6e 6f 74  ption and is not
a180: 20 72 65 61 6c 6c 79 20 75 73 65 66 75 6c 20 66   really useful f
a190: 6f 72 20 61 6e 79 74 68 69 6e 67 2e 0a 23 0a 64  or anything..#.d
a1a0: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
a1b0: 65 5f 65 78 70 72 2d 31 39 2e 31 2e 31 20 7b 20  e_expr-19.1.1 { 
a1c0: 0a 20 20 53 45 4c 45 43 54 20 27 61 62 63 27 20  .  SELECT 'abc' 
a1d0: 4d 41 54 43 48 20 27 64 65 66 27 20 0a 7d 20 7b  MATCH 'def' .} {
a1e0: 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73 65  1 {unable to use
a1f0: 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20   function MATCH 
a200: 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
a210: 20 63 6f 6e 74 65 78 74 7d 7d 0a 64 6f 5f 63 61   context}}.do_ca
a220: 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  tchsql_test e_ex
a230: 70 72 2d 31 39 2e 31 2e 32 20 7b 20 0a 20 20 53  pr-19.1.2 { .  S
a240: 45 4c 45 43 54 20 6d 61 74 63 68 28 27 61 62 63  ELECT match('abc
a250: 27 2c 20 27 64 65 66 27 29 0a 7d 20 7b 31 20 7b  ', 'def').} {1 {
a260: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75  unable to use fu
a270: 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20  nction MATCH in 
a280: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
a290: 6e 74 65 78 74 7d 7d 0a 0a 23 20 45 56 49 44 45  ntext}}..# EVIDE
a2a0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 39 31 36 2d  NCE-OF: R-37916-
a2b0: 34 37 34 30 37 20 54 68 65 20 4d 41 54 43 48 20  47407 The MATCH 
a2c0: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 73 70  operator is a sp
a2d0: 65 63 69 61 6c 20 73 79 6e 74 61 78 20 66 6f 72  ecial syntax for
a2e0: 0a 23 20 74 68 65 20 6d 61 74 63 68 28 29 20 61  .# the match() a
a2f0: 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
a300: 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 23  ed function..#.#
a310: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
a320: 30 36 30 32 31 2d 30 39 33 37 33 20 42 75 74 20  06021-09373 But 
a330: 65 78 74 65 6e 73 69 6f 6e 73 20 63 61 6e 20 6f  extensions can o
a340: 76 65 72 72 69 64 65 20 74 68 65 20 6d 61 74 63  verride the matc
a350: 68 28 29 0a 23 20 66 75 6e 63 74 69 6f 6e 20 77  h().# function w
a360: 69 74 68 20 6d 6f 72 65 20 68 65 6c 70 66 75 6c  ith more helpful
a370: 20 6c 6f 67 69 63 2e 0a 23 0a 70 72 6f 63 20 6d   logic..#.proc m
a380: 61 74 63 68 66 75 6e 63 20 7b 61 72 67 73 7d 20  atchfunc {args} 
a390: 7b 0a 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64  {.  eval lappend
a3a0: 20 3a 3a 6d 61 74 63 68 61 72 67 73 20 24 61 72   ::matchargs $ar
a3b0: 67 73 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a  gs.  return 1.}.
a3c0: 64 62 20 66 75 6e 63 20 6d 61 74 63 68 20 2d 61  db func match -a
a3d0: 72 67 63 6f 75 6e 74 20 32 20 6d 61 74 63 68 66  rgcount 2 matchf
a3e0: 75 6e 63 0a 73 65 74 20 3a 3a 6d 61 74 63 68 61  unc.set ::matcha
a3f0: 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  rgs [list].do_ex
a400: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
a410: 72 2d 31 39 2e 32 2e 31 20 7b 20 53 45 4c 45 43  r-19.2.1 { SELEC
a420: 54 20 27 61 62 63 27 20 4d 41 54 43 48 20 27 64  T 'abc' MATCH 'd
a430: 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73 74 20  ef' } 1.do_test 
a440: 20 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31          e_expr-1
a450: 39 2e 32 2e 32 20 7b 20 73 65 74 20 6d 61 74 63  9.2.2 { set matc
a460: 68 61 72 67 73 20 7d 20 7b 64 65 66 20 61 62 63  hargs } {def abc
a470: 7d 0a 73 65 74 20 3a 3a 6d 61 74 63 68 61 72 67  }.set ::matcharg
a480: 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63  s [list].do_exec
a490: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
a4a0: 31 39 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54 20  19.2.3 { SELECT 
a4b0: 27 58 27 20 4e 4f 54 20 4d 41 54 43 48 20 27 59  'X' NOT MATCH 'Y
a4c0: 27 20 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20 20  ' } 0.do_test   
a4d0: 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31 39 2e        e_expr-19.
a4e0: 32 2e 34 20 7b 20 73 65 74 20 6d 61 74 63 68 61  2.4 { set matcha
a4f0: 72 67 73 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69  rgs } {Y X}.sqli
a500: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a  te3 db test.db..
a510: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
a520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
a560: 74 20 63 61 73 65 73 20 66 6f 72 20 74 68 65 20  t cases for the 
a570: 74 65 73 74 61 62 6c 65 20 73 74 61 74 65 6d 65  testable stateme
a580: 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  nts related to t
a590: 68 65 20 43 41 53 45 20 65 78 70 72 65 73 73 69  he CASE expressi
a5a0: 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  on..#.# EVIDENCE
a5b0: 2d 4f 46 3a 20 52 2d 31 35 31 39 39 2d 36 31 33  -OF: R-15199-613
a5c0: 38 39 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  89 There are two
a5d0: 20 62 61 73 69 63 20 66 6f 72 6d 73 20 6f 66 20   basic forms of 
a5e0: 74 68 65 20 43 41 53 45 0a 23 20 65 78 70 72 65  the CASE.# expre
a5f0: 73 73 69 6f 6e 3a 20 74 68 6f 73 65 20 77 69 74  ssion: those wit
a600: 68 20 61 20 62 61 73 65 20 65 78 70 72 65 73 73  h a base express
a610: 69 6f 6e 20 61 6e 64 20 74 68 6f 73 65 20 77 69  ion and those wi
a620: 74 68 6f 75 74 2e 0a 23 0a 64 6f 5f 65 78 65 63  thout..#.do_exec
a630: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
a640: 32 30 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  20.1 {.  SELECT 
a650: 43 41 53 45 20 57 48 45 4e 20 31 20 54 48 45 4e  CASE WHEN 1 THEN
a660: 20 27 74 72 75 65 27 20 57 48 45 4e 20 30 20 54   'true' WHEN 0 T
a670: 48 45 4e 20 27 66 61 6c 73 65 27 20 45 4c 53 45  HEN 'false' ELSE
a680: 20 27 65 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b   'else' END;.} {
a690: 74 72 75 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  true}.do_execsql
a6a0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 30 2e  _test e_expr-20.
a6b0: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  2 {.  SELECT CAS
a6c0: 45 20 30 20 57 48 45 4e 20 31 20 54 48 45 4e 20  E 0 WHEN 1 THEN 
a6d0: 27 74 72 75 65 27 20 57 48 45 4e 20 30 20 54 48  'true' WHEN 0 TH
a6e0: 45 4e 20 27 66 61 6c 73 65 27 20 45 4c 53 45 20  EN 'false' ELSE 
a6f0: 27 65 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66  'else' END;.} {f
a700: 61 6c 73 65 7d 0a 0a 70 72 6f 63 20 76 61 72 20  alse}..proc var 
a710: 7b 6e 6d 7d 20 7b 0a 20 20 6c 61 70 70 65 6e 64  {nm} {.  lappend
a720: 20 3a 3a 76 61 72 6c 69 73 74 20 24 6e 6d 0a 20   ::varlist $nm. 
a730: 20 72 65 74 75 72 6e 20 5b 73 65 74 20 22 3a 3a   return [set "::
a740: 24 6e 6d 22 5d 0a 7d 0a 64 62 20 66 75 6e 63 20  $nm"].}.db func 
a750: 76 61 72 20 76 61 72 0a 0a 23 20 45 56 49 44 45  var var..# EVIDE
a760: 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 36 33 38 2d  NCE-OF: R-30638-
a770: 35 39 39 35 34 20 49 6e 20 61 20 43 41 53 45 20  59954 In a CASE 
a780: 77 69 74 68 6f 75 74 20 61 20 62 61 73 65 20 65  without a base e
a790: 78 70 72 65 73 73 69 6f 6e 2c 20 65 61 63 68 0a  xpression, each.
a7a0: 23 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f  # WHEN expressio
a7b0: 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
a7c0: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 74 72  nd the result tr
a7d0: 65 61 74 65 64 20 61 73 20 61 20 62 6f 6f 6c 65  eated as a boole
a7e0: 61 6e 2c 0a 23 20 73 74 61 72 74 69 6e 67 20 77  an,.# starting w
a7f0: 69 74 68 20 74 68 65 20 6c 65 66 74 6d 6f 73 74  ith the leftmost
a800: 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
a810: 74 6f 20 74 68 65 20 72 69 67 68 74 2e 0a 23 0a  to the right..#.
a820: 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20  foreach {a b c} 
a830: 7b 30 20 30 20 30 7d 20 62 72 65 61 6b 0a 73 65  {0 0 0} break.se
a840: 74 20 76 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d  t varlist [list]
a850: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
a860: 20 65 5f 65 78 70 72 2d 32 31 2e 31 2e 31 20 7b   e_expr-21.1.1 {
a870: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57  .  SELECT CASE W
a880: 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45  HEN var('a') THE
a890: 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20  N 'A' .         
a8a0: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62       WHEN var('b
a8b0: 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20  ') THEN 'B' .   
a8c0: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
a8d0: 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43  var('c') THEN 'C
a8e0: 27 20 45 4e 44 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f  ' END.} {{}}.do_
a8f0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 31  test e_expr-21.1
a900: 2e 32 20 7b 20 73 65 74 20 76 61 72 6c 69 73 74  .2 { set varlist
a910: 20 7d 20 7b 61 20 62 20 63 7d 0a 73 65 74 20 76   } {a b c}.set v
a920: 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f  arlist [list].do
a930: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
a940: 65 78 70 72 2d 32 31 2e 31 2e 33 20 7b 0a 20 20  expr-21.1.3 {.  
a950: 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
a960: 20 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27   var('c') THEN '
a970: 43 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  C' .            
a980: 20 20 57 48 45 4e 20 76 61 72 28 27 62 27 29 20    WHEN var('b') 
a990: 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20  THEN 'B' .      
a9a0: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
a9b0: 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a  ('a') THEN 'A' .
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c                EL
a9d0: 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20  SE 'no result'. 
a9e0: 20 45 4e 44 0a 7d 20 7b 7b 6e 6f 20 72 65 73 75   END.} {{no resu
a9f0: 6c 74 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65  lt}}.do_test e_e
aa00: 78 70 72 2d 32 31 2e 31 2e 34 20 7b 20 73 65 74  xpr-21.1.4 { set
aa10: 20 76 61 72 6c 69 73 74 20 7d 20 7b 63 20 62 20   varlist } {c b 
aa20: 61 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  a}..# EVIDENCE-O
aa30: 46 3a 20 52 2d 33 39 30 30 39 2d 32 35 35 39 36  F: R-39009-25596
aa40: 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
aa50: 68 65 20 43 41 53 45 20 65 78 70 72 65 73 73 69  he CASE expressi
aa60: 6f 6e 20 69 73 20 74 68 65 0a 23 20 65 76 61 6c  on is the.# eval
aa70: 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 48  uation of the TH
aa80: 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  EN expression th
aa90: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
aaa0: 6f 20 74 68 65 20 66 69 72 73 74 20 57 48 45 4e  o the first WHEN
aab0: 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  .# expression th
aac0: 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  at evaluates to 
aad0: 74 72 75 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20  true..#.foreach 
aae0: 7b 61 20 62 20 63 7d 20 7b 30 20 31 20 30 7d 20  {a b c} {0 1 0} 
aaf0: 62 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c  break.do_execsql
ab00: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e  _test e_expr-21.
ab10: 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  2.1 {.  SELECT C
ab20: 41 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27  ASE WHEN var('a'
ab30: 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20  ) THEN 'A' .    
ab40: 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76            WHEN v
ab50: 61 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27  ar('b') THEN 'B'
ab60: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
ab70: 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48  WHEN var('c') TH
ab80: 45 4e 20 27 43 27 20 0a 20 20 20 20 20 20 20 20  EN 'C' .        
ab90: 20 20 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72        ELSE 'no r
aba0: 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b  esult'.  END.} {
abb0: 42 7d 0a 66 6f 72 65 61 63 68 20 7b 61 20 62 20  B}.foreach {a b 
abc0: 63 7d 20 7b 30 20 31 20 31 7d 20 62 72 65 61 6b  c} {0 1 1} break
abd0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
abe0: 20 65 5f 65 78 70 72 2d 32 31 2e 32 2e 32 20 7b   e_expr-21.2.2 {
abf0: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57  .  SELECT CASE W
ac00: 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45  HEN var('a') THE
ac10: 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20  N 'A' .         
ac20: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62       WHEN var('b
ac30: 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20  ') THEN 'B' .   
ac40: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
ac50: 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43  var('c') THEN 'C
ac60: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  '.              
ac70: 45 4c 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27  ELSE 'no result'
ac80: 0a 20 20 45 4e 44 0a 7d 20 7b 42 7d 0a 66 6f 72  .  END.} {B}.for
ac90: 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20  each {a b c} {0 
aca0: 30 20 31 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78  0 1} break.do_ex
acb0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
acc0: 72 2d 32 31 2e 32 2e 33 20 7b 0a 20 20 53 45 4c  r-21.2.3 {.  SEL
acd0: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61  ECT CASE WHEN va
ace0: 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20  r('a') THEN 'A' 
acf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
ad00: 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45  HEN var('b') THE
ad10: 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20  N 'B' .         
ad20: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63       WHEN var('c
ad30: 27 29 20 54 48 45 4e 20 27 43 27 0a 20 20 20 20  ') THEN 'C'.    
ad40: 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 27            ELSE '
ad50: 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20 45 4e 44  no result'.  END
ad60: 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56 49 44 45 4e  .} {C}..# EVIDEN
ad70: 43 45 2d 4f 46 3a 20 52 2d 32 34 32 32 37 2d 30  CE-OF: R-24227-0
ad80: 34 38 30 37 20 4f 72 2c 20 69 66 20 6e 6f 6e 65  4807 Or, if none
ad90: 20 6f 66 20 74 68 65 20 57 48 45 4e 20 65 78 70   of the WHEN exp
ada0: 72 65 73 73 69 6f 6e 73 0a 23 20 65 76 61 6c 75  ressions.# evalu
adb0: 61 74 65 20 74 6f 20 74 72 75 65 2c 20 74 68 65  ate to true, the
adc0: 20 72 65 73 75 6c 74 20 6f 66 20 65 76 61 6c 75   result of evalu
add0: 61 74 69 6e 67 20 74 68 65 20 45 4c 53 45 20 65  ating the ELSE e
ade0: 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 0a 23 20  xpression, if.# 
adf0: 61 6e 79 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  any..#.foreach {
ae00: 61 20 62 20 63 7d 20 7b 30 20 30 20 30 7d 20 62  a b c} {0 0 0} b
ae10: 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  reak.do_execsql_
ae20: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 33  test e_expr-21.3
ae30: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .1 {.  SELECT CA
ae40: 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27 29  SE WHEN var('a')
ae50: 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20   THEN 'A' .     
ae60: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
ae70: 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20  r('b') THEN 'B' 
ae80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
ae90: 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45  HEN var('c') THE
aea0: 4e 20 27 43 27 0a 20 20 20 20 20 20 20 20 20 20  N 'C'.          
aeb0: 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72 65 73      ELSE 'no res
aec0: 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 7b 6e  ult'.  END.} {{n
aed0: 6f 20 72 65 73 75 6c 74 7d 7d 0a 0a 23 20 45 56  o result}}..# EV
aee0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 31  IDENCE-OF: R-141
aef0: 36 38 2d 30 37 35 37 39 20 49 66 20 74 68 65 72  68-07579 If ther
af00: 65 20 69 73 20 6e 6f 20 45 4c 53 45 20 65 78 70  e is no ELSE exp
af10: 72 65 73 73 69 6f 6e 20 61 6e 64 20 6e 6f 6e 65  ression and none
af20: 20 6f 66 0a 23 20 74 68 65 20 57 48 45 4e 20 65   of.# the WHEN e
af30: 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
af40: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 76  rue, then the ov
af50: 65 72 61 6c 6c 20 72 65 73 75 6c 74 20 69 73 20  erall result is 
af60: 4e 55 4c 4c 2e 0a 23 0a 64 62 20 6e 75 6c 6c 76  NULL..#.db nullv
af70: 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65  alue null.do_exe
af80: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
af90: 2d 32 31 2e 33 2e 32 20 7b 0a 20 20 53 45 4c 45  -21.3.2 {.  SELE
afa0: 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61 72  CT CASE WHEN var
afb0: 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a  ('a') THEN 'A' .
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
afd0: 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e  EN var('b') THEN
afe0: 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20   'B' .          
aff0: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63 27      WHEN var('c'
b000: 29 20 54 48 45 4e 20 27 43 27 0a 20 20 45 4e 44  ) THEN 'C'.  END
b010: 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 62 20 6e 75 6c  .} {null}.db nul
b020: 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23 20 45 56 49  lvalue {}..# EVI
b030: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 39 34  DENCE-OF: R-1394
b040: 33 2d 31 33 35 39 32 20 41 20 4e 55 4c 4c 20 72  3-13592 A NULL r
b050: 65 73 75 6c 74 20 69 73 20 63 6f 6e 73 69 64 65  esult is conside
b060: 72 65 64 20 75 6e 74 72 75 65 20 77 68 65 6e 0a  red untrue when.
b070: 23 20 65 76 61 6c 75 61 74 69 6e 67 20 57 48 45  # evaluating WHE
b080: 4e 20 74 65 72 6d 73 2e 0a 23 0a 64 6f 5f 65 78  N terms..#.do_ex
b090: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
b0a0: 72 2d 32 31 2e 34 2e 31 20 7b 0a 20 20 53 45 4c  r-21.4.1 {.  SEL
b0b0: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 4e 55  ECT CASE WHEN NU
b0c0: 4c 4c 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e  LL THEN 'A' WHEN
b0d0: 20 31 20 54 48 45 4e 20 27 42 27 20 45 4e 44 0a   1 THEN 'B' END.
b0e0: 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {B}.do_execsql
b0f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e  _test e_expr-21.
b100: 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  4.2 {.  SELECT C
b110: 41 53 45 20 57 48 45 4e 20 30 20 54 48 45 4e 20  ASE WHEN 0 THEN 
b120: 27 41 27 20 57 48 45 4e 20 4e 55 4c 4c 20 54 48  'A' WHEN NULL TH
b130: 45 4e 20 27 42 27 20 45 4c 53 45 20 27 43 27 20  EN 'B' ELSE 'C' 
b140: 45 4e 44 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56 49  END.} {C}..# EVI
b150: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 38 36 32  DENCE-OF: R-3862
b160: 30 2d 31 39 34 39 39 20 49 6e 20 61 20 43 41 53  0-19499 In a CAS
b170: 45 20 77 69 74 68 20 61 20 62 61 73 65 20 65 78  E with a base ex
b180: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 62 61  pression, the ba
b190: 73 65 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20  se.# expression 
b1a0: 69 73 20 65 76 61 6c 75 61 74 65 64 20 6a 75 73  is evaluated jus
b1b0: 74 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  t once and the r
b1c0: 65 73 75 6c 74 20 69 73 20 63 6f 6d 70 61 72 65  esult is compare
b1d0: 64 20 61 67 61 69 6e 73 74 0a 23 20 74 68 65 20  d against.# the 
b1e0: 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 65 61  evaluation of ea
b1f0: 63 68 20 57 48 45 4e 20 65 78 70 72 65 73 73 69  ch WHEN expressi
b200: 6f 6e 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  on from left to 
b210: 72 69 67 68 74 2e 0a 23 0a 23 20 4e 6f 74 65 3a  right..#.# Note:
b220: 20 54 68 69 73 20 74 65 73 74 20 63 61 73 65 20   This test case 
b230: 74 65 73 74 73 20 74 68 65 20 22 65 76 61 6c 75  tests the "evalu
b240: 61 74 65 64 20 6a 75 73 74 20 6f 6e 63 65 22 20  ated just once" 
b250: 70 61 72 74 20 6f 66 20 74 68 65 20 61 62 6f 76  part of the abov
b260: 65 0a 23 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  e.# statement. T
b270: 65 73 74 73 20 61 73 73 6f 63 69 61 74 65 64 20  ests associated 
b280: 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 74 77  with the next tw
b290: 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 74 65 73  o statements tes
b2a0: 74 20 74 68 61 74 20 74 68 65 0a 23 20 63 6f 6d  t that the.# com
b2b0: 70 61 72 69 73 6f 6e 73 20 74 61 6b 65 20 70 6c  parisons take pl
b2c0: 61 63 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  ace..#.foreach {
b2d0: 61 20 62 20 63 7d 20 5b 6c 69 73 74 20 5b 65 78  a b c} [list [ex
b2e0: 70 72 20 33 5d 20 5b 65 78 70 72 20 34 5d 20 5b  pr 3] [expr 4] [
b2f0: 65 78 70 72 20 35 5d 5d 20 62 72 65 61 6b 0a 73  expr 5]] break.s
b300: 65 74 20 3a 3a 76 61 72 6c 69 73 74 20 5b 6c 69  et ::varlist [li
b310: 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  st].do_execsql_t
b320: 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 31 2e  est e_expr-22.1.
b330: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  1 {.  SELECT CAS
b340: 45 20 76 61 72 28 27 61 27 29 20 57 48 45 4e 20  E var('a') WHEN 
b350: 31 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20  1 THEN 'A' WHEN 
b360: 32 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20  2 THEN 'B' WHEN 
b370: 33 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d  3 THEN 'C' END.}
b380: 20 7b 43 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65   {C}.do_test e_e
b390: 78 70 72 2d 32 32 2e 31 2e 32 20 7b 20 73 65 74  xpr-22.1.2 { set
b3a0: 20 3a 3a 76 61 72 6c 69 73 74 20 7d 20 7b 61 7d   ::varlist } {a}
b3b0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
b3c0: 20 52 2d 30 37 36 36 37 2d 34 39 35 33 37 20 54   R-07667-49537 T
b3d0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
b3e0: 20 43 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e   CASE expression
b3f0: 20 69 73 20 74 68 65 0a 23 20 65 76 61 6c 75 61   is the.# evalua
b400: 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 48 45 4e  tion of the THEN
b410: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
b420: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
b430: 74 68 65 20 66 69 72 73 74 20 57 48 45 4e 0a 23  the first WHEN.#
b440: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   expression for 
b450: 77 68 69 63 68 20 74 68 65 20 63 6f 6d 70 61 72  which the compar
b460: 69 73 6f 6e 20 69 73 20 74 72 75 65 2e 0a 23 0a  ison is true..#.
b470: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
b480: 65 5f 65 78 70 72 2d 32 32 2e 32 2e 31 20 7b 0a  e_expr-22.2.1 {.
b490: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 32 33    SELECT CASE 23
b4a0: 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27   WHEN 1 THEN 'A'
b4b0: 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42   WHEN 23 THEN 'B
b4c0: 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27  ' WHEN 23 THEN '
b4d0: 43 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f  C' END.} {B}.do_
b4e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
b4f0: 78 70 72 2d 32 32 2e 32 2e 32 20 7b 0a 20 20 53  xpr-22.2.2 {.  S
b500: 45 4c 45 43 54 20 43 41 53 45 20 31 20 57 48 45  ELECT CASE 1 WHE
b510: 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57 48 45  N 1 THEN 'A' WHE
b520: 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20 57 48  N 23 THEN 'B' WH
b530: 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27 20 45  EN 23 THEN 'C' E
b540: 4e 44 0a 7d 20 7b 41 7d 0a 0a 23 20 45 56 49 44  ND.} {A}..# EVID
b550: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 35 34 33  ENCE-OF: R-47543
b560: 2d 33 32 31 34 35 20 4f 72 2c 20 69 66 20 6e 6f  -32145 Or, if no
b570: 6e 65 20 6f 66 20 74 68 65 20 57 48 45 4e 20 65  ne of the WHEN e
b580: 78 70 72 65 73 73 69 6f 6e 73 0a 23 20 65 76 61  xpressions.# eva
b590: 6c 75 61 74 65 20 74 6f 20 61 20 76 61 6c 75 65  luate to a value
b5a0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 62 61   equal to the ba
b5b0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  se expression, t
b5c0: 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 23 20 65  he result of.# e
b5d0: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 45 4c  valuating the EL
b5e0: 53 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69  SE expression, i
b5f0: 66 20 61 6e 79 2e 0a 23 0a 64 6f 5f 65 78 65 63  f any..#.do_exec
b600: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
b610: 32 32 2e 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43  22.3.1 {.  SELEC
b620: 54 20 43 41 53 45 20 32 34 20 57 48 45 4e 20 31  T CASE 24 WHEN 1
b630: 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32   THEN 'A' WHEN 2
b640: 33 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20  3 THEN 'B' WHEN 
b650: 32 33 20 54 48 45 4e 20 27 43 27 20 45 4c 53 45  23 THEN 'C' ELSE
b660: 20 27 44 27 20 45 4e 44 0a 7d 20 7b 44 7d 0a 0a   'D' END.} {D}..
b670: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
b680: 2d 35 34 37 32 31 2d 34 38 35 35 37 20 49 66 20  -54721-48557 If 
b690: 74 68 65 72 65 20 69 73 20 6e 6f 20 45 4c 53 45  there is no ELSE
b6a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
b6b0: 6e 6f 6e 65 20 6f 66 0a 23 20 74 68 65 20 57 48  none of.# the WH
b6c0: 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 70  EN expressions p
b6d0: 72 6f 64 75 63 65 20 61 20 72 65 73 75 6c 74 20  roduce a result 
b6e0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 62 61 73  equal to the bas
b6f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 0a 23 20  e expression,.# 
b700: 74 68 65 20 6f 76 65 72 61 6c 6c 20 72 65 73 75  the overall resu
b710: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 23 0a 64 6f  lt is NULL..#.do
b720: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
b730: 65 78 70 72 2d 32 32 2e 34 2e 31 20 7b 0a 20 20  expr-22.4.1 {.  
b740: 53 45 4c 45 43 54 20 43 41 53 45 20 32 34 20 57  SELECT CASE 24 W
b750: 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57  HEN 1 THEN 'A' W
b760: 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20  HEN 23 THEN 'B' 
b770: 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27  WHEN 23 THEN 'C'
b780: 20 45 4e 44 0a 7d 20 7b 7b 7d 7d 0a 64 62 20 6e   END.} {{}}.db n
b790: 75 6c 6c 76 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f  ullvalue null.do
b7a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
b7b0: 65 78 70 72 2d 32 32 2e 34 2e 32 20 7b 0a 20 20  expr-22.4.2 {.  
b7c0: 53 45 4c 45 43 54 20 43 41 53 45 20 32 34 20 57  SELECT CASE 24 W
b7d0: 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57  HEN 1 THEN 'A' W
b7e0: 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20  HEN 23 THEN 'B' 
b7f0: 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27  WHEN 23 THEN 'C'
b800: 20 45 4e 44 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 62   END.} {null}.db
b810: 20 6e 75 6c 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23   nullvalue {}..#
b820: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
b830: 31 31 34 37 39 2d 36 32 37 37 34 20 57 68 65 6e  11479-62774 When
b840: 20 63 6f 6d 70 61 72 69 6e 67 20 61 20 62 61 73   comparing a bas
b850: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61  e expression aga
b860: 69 6e 73 74 20 61 0a 23 20 57 48 45 4e 20 65 78  inst a.# WHEN ex
b870: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 73 61  pression, the sa
b880: 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
b890: 75 65 6e 63 65 2c 20 61 66 66 69 6e 69 74 79 2c  uence, affinity,
b8a0: 20 61 6e 64 0a 23 20 4e 55 4c 4c 2d 68 61 6e 64   and.# NULL-hand
b8b0: 6c 69 6e 67 20 72 75 6c 65 73 20 61 70 70 6c 79  ling rules apply
b8c0: 20 61 73 20 69 66 20 74 68 65 20 62 61 73 65 20   as if the base 
b8d0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 57  expression and W
b8e0: 48 45 4e 0a 23 20 65 78 70 72 65 73 73 69 6f 6e  HEN.# expression
b8f0: 20 61 72 65 20 72 65 73 70 65 63 74 69 76 65 6c   are respectivel
b900: 79 20 74 68 65 20 6c 65 66 74 2d 20 61 6e 64 20  y the left- and 
b910: 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61  right-hand opera
b920: 6e 64 73 20 6f 66 20 61 6e 20 3d 0a 23 20 6f 70  nds of an =.# op
b930: 65 72 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 72  erator..#.proc r
b940: 65 76 20 7b 73 74 72 7d 20 7b 0a 20 20 73 65 74  ev {str} {.  set
b950: 20 72 65 74 20 22 22 0a 20 20 73 65 74 20 63 68   ret "".  set ch
b960: 61 72 73 20 5b 73 70 6c 69 74 20 24 73 74 72 5d  ars [split $str]
b970: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 5b 65  .  for {set i [e
b980: 78 70 72 20 5b 6c 6c 65 6e 67 74 68 20 24 63 68  xpr [llength $ch
b990: 61 72 73 5d 2d 31 5d 7d 20 7b 24 69 3e 3d 30 7d  ars]-1]} {$i>=0}
b9a0: 20 7b 69 6e 63 72 20 69 20 2d 31 7d 20 7b 0a 20   {incr i -1} {. 
b9b0: 20 20 20 61 70 70 65 6e 64 20 72 65 74 20 5b 6c     append ret [l
b9c0: 69 6e 64 65 78 20 24 63 68 61 72 73 20 24 69 5d  index $chars $i]
b9d0: 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d  .  }.  set ret.}
b9e0: 0a 70 72 6f 63 20 72 65 76 65 72 73 65 20 7b 6c  .proc reverse {l
b9f0: 68 73 20 72 68 73 7d 20 7b 0a 20 20 73 74 72 69  hs rhs} {.  stri
ba00: 6e 67 20 63 6f 6d 70 61 72 65 20 5b 72 65 76 20  ng compare [rev 
ba10: 24 6c 68 73 5d 20 5b 72 65 76 20 24 72 68 73 5d  $lhs] [rev $rhs]
ba20: 0a 7d 0a 64 62 20 63 6f 6c 6c 61 74 65 20 72 65  .}.db collate re
ba30: 76 65 72 73 65 20 72 65 76 65 72 73 65 0a 64 6f  verse reverse.do
ba40: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
ba50: 65 78 70 72 2d 32 33 2e 31 2e 31 20 7b 0a 20 20  expr-23.1.1 {.  
ba60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
ba70: 0a 20 20 20 20 61 20 54 45 58 54 20 20 20 20 20  .    a TEXT     
ba80: 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c 0a  COLLATE NOCASE,.
ba90: 20 20 20 20 62 20 20 20 20 20 20 20 20 20 20 43      b          C
baa0: 4f 4c 4c 41 54 45 20 52 45 56 45 52 53 45 2c 0a  OLLATE REVERSE,.
bab0: 20 20 20 20 63 20 49 4e 54 45 47 45 52 2c 0a 20      c INTEGER,. 
bac0: 20 20 20 64 20 42 4c 4f 42 0a 20 20 29 3b 0a 20     d BLOB.  );. 
bad0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
bae0: 56 41 4c 55 45 53 28 27 61 62 63 27 2c 20 27 63  VALUES('abc', 'c
baf0: 62 61 27 2c 20 35 35 2c 20 33 34 2e 35 29 3b 0a  ba', 55, 34.5);.
bb00: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
bb10: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31  test e_expr-23.1
bb20: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .2 {.  SELECT CA
bb30: 53 45 20 61 20 57 48 45 4e 20 27 78 79 7a 27 20  SE a WHEN 'xyz' 
bb40: 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 27 41  THEN 'A' WHEN 'A
bb50: 62 43 27 20 54 48 45 4e 20 27 42 27 20 45 4e 44  bC' THEN 'B' END
bb60: 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64   FROM t1.} {B}.d
bb70: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
bb80: 5f 65 78 70 72 2d 32 33 2e 31 2e 33 20 7b 0a 20  _expr-23.1.3 {. 
bb90: 20 53 45 4c 45 43 54 20 43 41 53 45 20 27 41 62   SELECT CASE 'Ab
bba0: 43 27 20 57 48 45 4e 20 27 61 62 63 27 20 54 48  C' WHEN 'abc' TH
bbb0: 45 4e 20 27 41 27 20 57 48 45 4e 20 61 20 54 48  EN 'A' WHEN a TH
bbc0: 45 4e 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20  EN 'B' END FROM 
bbd0: 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63  t1.} {B}.do_exec
bbe0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
bbf0: 32 33 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43  23.1.4 {.  SELEC
bc00: 54 20 43 41 53 45 20 61 20 57 48 45 4e 20 62 20  T CASE a WHEN b 
bc10: 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42  THEN 'A' ELSE 'B
bc20: 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20  ' END FROM t1.} 
bc30: 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {B}.do_execsql_t
bc40: 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e  est e_expr-23.1.
bc50: 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  5 {.  SELECT CAS
bc60: 45 20 62 20 57 48 45 4e 20 61 20 54 48 45 4e 20  E b WHEN a THEN 
bc70: 27 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44  'A' ELSE 'B' END
bc80: 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64   FROM t1.} {B}.d
bc90: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
bca0: 5f 65 78 70 72 2d 32 33 2e 31 2e 36 20 7b 0a 20  _expr-23.1.6 {. 
bcb0: 20 53 45 4c 45 43 54 20 43 41 53 45 20 35 35 20   SELECT CASE 55 
bcc0: 57 48 45 4e 20 27 35 35 27 20 54 48 45 4e 20 27  WHEN '55' THEN '
bcd0: 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 0a  A' ELSE 'B' END.
bce0: 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {B}.do_execsql
bcf0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e  _test e_expr-23.
bd00: 31 2e 37 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.7 {.  SELECT C
bd10: 41 53 45 20 63 20 57 48 45 4e 20 27 35 35 27 20  ASE c WHEN '55' 
bd20: 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42  THEN 'A' ELSE 'B
bd30: 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20  ' END FROM t1.} 
bd40: 7b 41 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {A}.do_execsql_t
bd50: 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e  est e_expr-23.1.
bd60: 38 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  8 {.  SELECT CAS
bd70: 45 20 27 33 34 2e 35 27 20 57 48 45 4e 20 64 20  E '34.5' WHEN d 
bd80: 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42  THEN 'A' ELSE 'B
bd90: 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20  ' END FROM t1.} 
bda0: 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {B}.do_execsql_t
bdb0: 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e  est e_expr-23.1.
bdc0: 39 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  9 {.  SELECT CAS
bdd0: 45 20 4e 55 4c 4c 20 57 48 45 4e 20 4e 55 4c 4c  E NULL WHEN NULL
bde0: 20 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27   THEN 'A' ELSE '
bdf0: 42 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 0a 23 20  B' END.} {B}..# 
be00: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
be10: 37 33 30 34 2d 33 39 34 30 35 20 49 66 20 74 68  7304-39405 If th
be20: 65 20 62 61 73 65 20 65 78 70 72 65 73 73 69 6f  e base expressio
be30: 6e 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74  n is NULL then t
be40: 68 65 0a 23 20 72 65 73 75 6c 74 20 6f 66 20 74  he.# result of t
be50: 68 65 20 43 41 53 45 20 69 73 20 61 6c 77 61 79  he CASE is alway
be60: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
be70: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 45  evaluating the E
be80: 4c 53 45 0a 23 20 65 78 70 72 65 73 73 69 6f 6e  LSE.# expression
be90: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 6f   if it exists, o
bea0: 72 20 4e 55 4c 4c 20 69 66 20 69 74 20 64 6f 65  r NULL if it doe
beb0: 73 20 6e 6f 74 2e 0a 23 0a 64 6f 5f 65 78 65 63  s not..#.do_exec
bec0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
bed0: 32 34 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43  24.1.1 {.  SELEC
bee0: 54 20 43 41 53 45 20 4e 55 4c 4c 20 57 48 45 4e  T CASE NULL WHEN
bef0: 20 27 61 62 63 27 20 54 48 45 4e 20 27 41 27 20   'abc' THEN 'A' 
bf00: 57 48 45 4e 20 27 64 65 66 27 20 54 48 45 4e 20  WHEN 'def' THEN 
bf10: 27 42 27 20 45 4e 44 3b 0a 7d 20 7b 7b 7d 7d 0a  'B' END;.} {{}}.
bf20: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
bf30: 65 5f 65 78 70 72 2d 32 34 2e 31 2e 32 20 7b 0a  e_expr-24.1.2 {.
bf40: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 4e 55    SELECT CASE NU
bf50: 4c 4c 20 57 48 45 4e 20 27 61 62 63 27 20 54 48  LL WHEN 'abc' TH
bf60: 45 4e 20 27 41 27 20 57 48 45 4e 20 27 64 65 66  EN 'A' WHEN 'def
bf70: 27 20 54 48 45 4e 20 27 42 27 20 45 4c 53 45 20  ' THEN 'B' ELSE 
bf80: 27 43 27 20 45 4e 44 3b 0a 7d 20 7b 43 7d 0a 0a  'C' END;.} {C}..
bf90: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
bfa0: 2d 35 36 32 38 30 2d 31 37 33 36 39 20 42 6f 74  -56280-17369 Bot
bfb0: 68 20 66 6f 72 6d 73 20 6f 66 20 74 68 65 20 43  h forms of the C
bfc0: 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20 75  ASE expression u
bfd0: 73 65 20 6c 61 7a 79 2c 0a 23 20 6f 72 20 73 68  se lazy,.# or sh
bfe0: 6f 72 74 2d 63 69 72 63 75 69 74 2c 20 65 76 61  ort-circuit, eva
bff0: 6c 75 61 74 69 6f 6e 2e 0a 23 0a 73 65 74 20 76  luation..#.set v
c000: 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 66 6f  arlist [list].fo
c010: 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30  reach {a b c} {0
c020: 20 31 20 30 7d 20 62 72 65 61 6b 0a 64 6f 5f 65   1 0} break.do_e
c030: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
c040: 70 72 2d 32 35 2e 31 2e 31 20 7b 0a 20 20 53 45  pr-25.1.1 {.  SE
c050: 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76  LECT CASE WHEN v
c060: 61 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27  ar('a') THEN 'A'
c070: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c080: 57 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48  WHEN var('b') TH
c090: 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20  EN 'B' .        
c0a0: 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27        WHEN var('
c0b0: 63 27 29 20 54 48 45 4e 20 27 43 27 20 0a 20 20  c') THEN 'C' .  
c0c0: 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f 74 65 73  END.} {B}.do_tes
c0d0: 74 20 65 5f 65 78 70 72 2d 32 35 2e 31 2e 32 20  t e_expr-25.1.2 
c0e0: 7b 20 73 65 74 20 3a 3a 76 61 72 6c 69 73 74 20  { set ::varlist 
c0f0: 7d 20 7b 61 20 62 7d 0a 73 65 74 20 76 61 72 6c  } {a b}.set varl
c100: 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  ist [list].do_ex
c110: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
c120: 72 2d 32 35 2e 31 2e 33 20 7b 0a 20 20 53 45 4c  r-25.1.3 {.  SEL
c130: 45 43 54 20 43 41 53 45 20 27 30 27 20 57 48 45  ECT CASE '0' WHE
c140: 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20  N var('a') THEN 
c150: 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'A' .           
c160: 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28         WHEN var(
c170: 27 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20  'b') THEN 'B' . 
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54   WHEN var('c') T
c1a0: 48 45 4e 20 27 43 27 20 0a 20 20 45 4e 44 0a 7d  HEN 'C' .  END.}
c1b0: 20 7b 41 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65   {A}.do_test e_e
c1c0: 78 70 72 2d 32 35 2e 31 2e 34 20 7b 20 73 65 74  xpr-25.1.4 { set
c1d0: 20 3a 3a 76 61 72 6c 69 73 74 20 7d 20 7b 61 7d   ::varlist } {a}
c1e0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
c1f0: 20 52 2d 33 34 37 37 33 2d 36 32 32 35 33 20 54   R-34773-62253 T
c200: 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e  he only differen
c210: 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 66  ce between the f
c220: 6f 6c 6c 6f 77 69 6e 67 0a 23 20 74 77 6f 20 43  ollowing.# two C
c230: 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ASE expressions 
c240: 69 73 20 74 68 61 74 20 74 68 65 20 78 20 65 78  is that the x ex
c250: 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
c260: 75 61 74 65 64 20 65 78 61 63 74 6c 79 0a 23 20  uated exactly.# 
c270: 6f 6e 63 65 20 69 6e 20 74 68 65 20 66 69 72 73  once in the firs
c280: 74 20 65 78 61 6d 70 6c 65 20 62 75 74 20 6d 69  t example but mi
c290: 67 68 74 20 62 65 20 65 76 61 6c 75 61 74 65 64  ght be evaluated
c2a0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
c2b0: 69 6e 20 74 68 65 0a 23 20 73 65 63 6f 6e 64 3a  in the.# second:
c2c0: 20 43 41 53 45 20 78 20 57 48 45 4e 20 77 31 20   CASE x WHEN w1 
c2d0: 54 48 45 4e 20 72 31 20 57 48 45 4e 20 77 32 20  THEN r1 WHEN w2 
c2e0: 54 48 45 4e 20 72 32 20 45 4c 53 45 20 72 33 20  THEN r2 ELSE r3 
c2f0: 45 4e 44 20 43 41 53 45 20 57 48 45 4e 0a 23 20  END CASE WHEN.# 
c300: 78 3d 77 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=w1 THEN r1 WHE
c310: 4e 20 78 3d 77 32 20 54 48 45 4e 20 72 32 20 45  N x=w2 THEN r2 E
c320: 4c 53 45 20 72 33 20 45 4e 44 0a 23 0a 70 72 6f  LSE r3 END.#.pro
c330: 63 20 63 65 76 61 6c 20 7b 78 7d 20 7b 0a 20 20  c ceval {x} {.  
c340: 69 6e 63 72 20 3a 3a 65 76 61 6c 63 6f 75 6e 74  incr ::evalcount
c350: 0a 20 20 72 65 74 75 72 6e 20 24 78 0a 7d 0a 64  .  return $x.}.d
c360: 62 20 66 75 6e 63 20 63 65 76 61 6c 20 63 65 76  b func ceval cev
c370: 61 6c 0a 73 65 74 20 3a 3a 65 76 61 6c 63 6f 75  al.set ::evalcou
c380: 6e 74 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  nt 0..do_execsql
c390: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e  _test e_expr-26.
c3a0: 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1.1 {.  CREATE T
c3b0: 41 42 4c 45 20 74 32 28 78 2c 20 77 31 2c 20 72  ABLE t2(x, w1, r
c3c0: 31 2c 20 77 32 2c 20 72 32 2c 20 72 33 29 3b 0a  1, w2, r2, r3);.
c3d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
c3e0: 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 27 52   VALUES(1, 1, 'R
c3f0: 31 27 2c 20 32 2c 20 27 52 32 27 2c 20 27 52 33  1', 2, 'R2', 'R3
c400: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
c410: 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20 31  O t2 VALUES(2, 1
c420: 2c 20 27 52 31 27 2c 20 32 2c 20 27 52 32 27 2c  , 'R1', 2, 'R2',
c430: 20 27 52 33 27 29 3b 0a 20 20 49 4e 53 45 52 54   'R3');.  INSERT
c440: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
c450: 33 2c 20 31 2c 20 27 52 31 27 2c 20 32 2c 20 27  3, 1, 'R1', 2, '
c460: 52 32 27 2c 20 27 52 33 27 29 3b 0a 7d 20 7b 7d  R2', 'R3');.} {}
c470: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
c480: 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 32 20 7b   e_expr-26.1.2 {
c490: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 78  .  SELECT CASE x
c4a0: 20 57 48 45 4e 20 77 31 20 54 48 45 4e 20 72 31   WHEN w1 THEN r1
c4b0: 20 57 48 45 4e 20 77 32 20 54 48 45 4e 20 72 32   WHEN w2 THEN r2
c4c0: 20 45 4c 53 45 20 72 33 20 45 4e 44 20 46 52 4f   ELSE r3 END FRO
c4d0: 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32 20 52 33  M t2.} {R1 R2 R3
c4e0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
c4f0: 74 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 33 20  t e_expr-26.1.3 
c500: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
c510: 57 48 45 4e 20 78 3d 77 31 20 54 48 45 4e 20 72  WHEN x=w1 THEN r
c520: 31 20 57 48 45 4e 20 78 3d 77 32 20 54 48 45 4e  1 WHEN x=w2 THEN
c530: 20 72 32 20 45 4c 53 45 20 72 33 20 45 4e 44 20   r2 ELSE r3 END 
c540: 46 52 4f 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32  FROM t2.} {R1 R2
c550: 20 52 33 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   R3}..do_execsql
c560: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e  _test e_expr-26.
c570: 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.4 {.  SELECT C
c580: 41 53 45 20 63 65 76 61 6c 28 78 29 20 57 48 45  ASE ceval(x) WHE
c590: 4e 20 77 31 20 54 48 45 4e 20 72 31 20 57 48 45  N w1 THEN r1 WHE
c5a0: 4e 20 77 32 20 54 48 45 4e 20 72 32 20 45 4c 53  N w2 THEN r2 ELS
c5b0: 45 20 72 33 20 45 4e 44 20 46 52 4f 4d 20 74 32  E r3 END FROM t2
c5c0: 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d 0a 64 6f  .} {R1 R2 R3}.do
c5d0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e  _test e_expr-26.
c5e0: 31 2e 35 20 7b 20 73 65 74 20 3a 3a 65 76 61 6c  1.5 { set ::eval
c5f0: 63 6f 75 6e 74 20 7d 20 7b 33 7d 0a 73 65 74 20  count } {3}.set 
c600: 3a 3a 65 76 61 6c 63 6f 75 6e 74 20 30 0a 64 6f  ::evalcount 0.do
c610: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
c620: 65 78 70 72 2d 32 36 2e 31 2e 36 20 7b 0a 20 20  expr-26.1.6 {.  
c630: 53 45 4c 45 43 54 20 43 41 53 45 20 0a 20 20 20  SELECT CASE .   
c640: 20 57 48 45 4e 20 63 65 76 61 6c 28 78 29 3d 77   WHEN ceval(x)=w
c650: 31 20 54 48 45 4e 20 72 31 20 0a 20 20 20 20 57  1 THEN r1 .    W
c660: 48 45 4e 20 63 65 76 61 6c 28 78 29 3d 77 32 20  HEN ceval(x)=w2 
c670: 54 48 45 4e 20 72 32 20 0a 20 20 20 20 45 4c 53  THEN r2 .    ELS
c680: 45 20 72 33 20 45 4e 44 20 0a 20 20 46 52 4f 4d  E r3 END .  FROM
c690: 20 74 32 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d   t2.} {R1 R2 R3}
c6a0: 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  .do_test e_expr-
c6b0: 32 36 2e 31 2e 36 20 7b 20 73 65 74 20 3a 3a 65  26.1.6 { set ::e
c6c0: 76 61 6c 63 6f 75 6e 74 20 7d 20 7b 35 7d 0a 0a  valcount } {5}..
c6d0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
c6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
c720: 73 74 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65  st statements re
c730: 6c 61 74 65 64 20 74 6f 20 43 41 53 54 20 65 78  lated to CAST ex
c740: 70 72 65 73 73 69 6f 6e 73 2e 0a 23 0a 23 20 45  pressions..#.# E
c750: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30  VIDENCE-OF: R-20
c760: 38 35 34 2d 31 37 31 30 39 20 41 20 43 41 53 54  854-17109 A CAST
c770: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 73   conversion is s
c780: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 23 20  imilar to the.# 
c790: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 68 61 74 20  conversion that 
c7a0: 74 61 6b 65 73 20 70 6c 61 63 65 20 77 68 65 6e  takes place when
c7b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69   a column affini
c7c0: 74 79 20 69 73 20 61 70 70 6c 69 65 64 20 74 6f  ty is applied to
c7d0: 20 61 0a 23 20 76 61 6c 75 65 20 65 78 63 65 70   a.# value excep
c7e0: 74 20 74 68 61 74 20 77 69 74 68 20 74 68 65 20  t that with the 
c7f0: 43 41 53 54 20 6f 70 65 72 61 74 6f 72 20 74 68  CAST operator th
c800: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 61 6c 77  e conversion alw
c810: 61 79 73 20 74 61 6b 65 73 0a 23 20 70 6c 61 63  ays takes.# plac
c820: 65 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 6f  e even if the co
c830: 6e 76 65 72 73 69 6f 6e 20 6c 6f 73 73 79 20 61  nversion lossy a
c840: 6e 64 20 69 72 72 65 76 65 72 73 69 62 6c 65 2c  nd irreversible,
c850: 20 77 68 65 72 65 61 73 20 63 6f 6c 75 6d 6e 0a   whereas column.
c860: 23 20 61 66 66 69 6e 69 74 79 20 6f 6e 6c 79 20  # affinity only 
c870: 63 68 61 6e 67 65 73 20 74 68 65 20 64 61 74 61  changes the data
c880: 20 74 79 70 65 20 6f 66 20 61 20 76 61 6c 75 65   type of a value
c890: 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69   if the change i
c8a0: 73 0a 23 20 6c 6f 73 73 6c 65 73 73 20 61 6e 64  s.# lossless and
c8b0: 20 72 65 76 65 72 73 69 62 6c 65 2e 0a 23 0a 64   reversible..#.d
c8c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
c8d0: 5f 65 78 70 72 2d 32 37 2e 31 2e 31 20 7b 0a 20  _expr-27.1.1 {. 
c8e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
c8f0: 28 61 20 54 45 58 54 2c 20 62 20 52 45 41 4c 2c  (a TEXT, b REAL,
c900: 20 63 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 49   c INTEGER);.  I
c910: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
c920: 4c 55 45 53 28 58 27 35 35 35 36 35 35 27 2c 20  LUES(X'555655', 
c930: 27 31 2e 32 33 61 62 63 27 2c 20 34 2e 35 29 3b  '1.23abc', 4.5);
c940: 0a 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66  .  SELECT typeof
c950: 28 61 29 2c 20 61 2c 20 74 79 70 65 6f 66 28 62  (a), a, typeof(b
c960: 29 2c 20 62 2c 20 74 79 70 65 6f 66 28 63 29 2c  ), b, typeof(c),
c970: 20 63 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 62   c FROM t3;.} {b
c980: 6c 6f 62 20 55 56 55 20 74 65 78 74 20 31 2e 32  lob UVU text 1.2
c990: 33 61 62 63 20 72 65 61 6c 20 34 2e 35 7d 0a 64  3abc real 4.5}.d
c9a0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
c9b0: 5f 65 78 70 72 2d 32 37 2e 31 2e 32 20 7b 0a 20  _expr-27.1.2 {. 
c9c0: 20 53 45 4c 45 43 54 20 0a 20 20 20 20 74 79 70   SELECT .    typ
c9d0: 65 6f 66 28 43 41 53 54 28 58 27 35 35 35 36 35  eof(CAST(X'55565
c9e0: 35 27 20 61 73 20 54 45 58 54 29 29 2c 20 43 41  5' as TEXT)), CA
c9f0: 53 54 28 58 27 35 35 35 36 35 35 27 20 61 73 20  ST(X'555655' as 
ca00: 54 45 58 54 29 2c 0a 20 20 20 20 74 79 70 65 6f  TEXT),.    typeo
ca10: 66 28 43 41 53 54 28 27 31 2e 32 33 61 62 63 27  f(CAST('1.23abc'
ca20: 20 61 73 20 52 45 41 4c 29 29 2c 20 43 41 53 54   as REAL)), CAST
ca30: 28 27 31 2e 32 33 61 62 63 27 20 61 73 20 52 45  ('1.23abc' as RE
ca40: 41 4c 29 2c 0a 20 20 20 20 74 79 70 65 6f 66 28  AL),.    typeof(
ca50: 43 41 53 54 28 34 2e 35 20 61 73 20 49 4e 54 45  CAST(4.5 as INTE
ca60: 47 45 52 29 29 2c 20 43 41 53 54 28 34 2e 35 20  GER)), CAST(4.5 
ca70: 61 73 20 49 4e 54 45 47 45 52 29 0a 7d 20 7b 74  as INTEGER).} {t
ca80: 65 78 74 20 55 56 55 20 72 65 61 6c 20 31 2e 32  ext UVU real 1.2
ca90: 33 20 69 6e 74 65 67 65 72 20 34 7d 0a 0a 23 20  3 integer 4}..# 
caa0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
cab0: 32 34 33 34 2d 30 39 30 39 32 20 49 66 20 74 68  2434-09092 If th
cac0: 65 20 76 61 6c 75 65 20 6f 66 20 65 78 70 72 20  e value of expr 
cad0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
cae0: 65 0a 23 20 72 65 73 75 6c 74 20 6f 66 20 74 68  e.# result of th
caf0: 65 20 43 41 53 54 20 65 78 70 72 65 73 73 69 6f  e CAST expressio
cb00: 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a  n is also NULL..
cb10: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
cb20: 5f 65 78 70 72 2d 32 37 2e 32 2e 31 20 7b 20 43  _expr-27.2.1 { C
cb30: 41 53 54 28 4e 55 4c 4c 20 41 53 20 69 6e 74 65  AST(NULL AS inte
cb40: 67 65 72 29 20 7d 20 6e 75 6c 6c 20 7b 7d 0a 64  ger) } null {}.d
cb50: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
cb60: 70 72 2d 32 37 2e 32 2e 32 20 7b 20 43 41 53 54  pr-27.2.2 { CAST
cb70: 28 4e 55 4c 4c 20 41 53 20 74 65 78 74 29 20 7d  (NULL AS text) }
cb80: 20 20 20 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65      null {}.do_e
cb90: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
cba0: 32 37 2e 32 2e 33 20 7b 20 43 41 53 54 28 4e 55  27.2.3 { CAST(NU
cbb0: 4c 4c 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 20  LL AS blob) }   
cbc0: 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72   null {}.do_expr
cbd0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
cbe0: 32 2e 34 20 7b 20 43 41 53 54 28 4e 55 4c 4c 20  2.4 { CAST(NULL 
cbf0: 41 53 20 6e 75 6d 62 65 72 29 20 7d 20 20 6e 75  AS number) }  nu
cc00: 6c 6c 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43  ll {}..# EVIDENC
cc10: 45 2d 4f 46 3a 20 52 2d 32 39 32 38 33 2d 31 35  E-OF: R-29283-15
cc20: 35 36 31 20 4f 74 68 65 72 77 69 73 65 2c 20 74  561 Otherwise, t
cc30: 68 65 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73  he storage class
cc40: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 23   of the result.#
cc50: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
cc60: 79 20 61 70 70 6c 79 69 6e 67 20 74 68 65 20 72  y applying the r
cc70: 75 6c 65 73 20 66 6f 72 20 64 65 74 65 72 6d 69  ules for determi
cc80: 6e 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 66 66 69  ning column affi
cc90: 6e 69 74 79 20 74 6f 0a 23 20 74 68 65 20 74 79  nity to.# the ty
cca0: 70 65 2d 6e 61 6d 65 2e 0a 23 0a 23 20 54 68 65  pe-name..#.# The
ccb0: 20 52 2d 32 39 32 38 33 2d 31 35 35 36 31 20 72   R-29283-15561 r
ccc0: 65 71 75 69 72 65 6d 65 6e 74 20 61 62 6f 76 65  equirement above
ccd0: 20 69 73 20 64 65 6d 6f 6e 73 74 72 61 74 65 64   is demonstrated
cce0: 20 62 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a   by all of the .
ccf0: 23 20 73 75 62 73 65 71 75 65 6e 74 20 65 5f 65  # subsequent e_e
cd00: 78 70 72 2d 32 36 20 74 65 73 74 73 2e 0a 23 0a  xpr-26 tests..#.
cd10: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
cd20: 2d 34 33 35 32 32 2d 33 35 35 34 38 20 43 61 73  -43522-35548 Cas
cd30: 74 69 6e 67 20 61 20 76 61 6c 75 65 20 74 6f 20  ting a value to 
cd40: 61 20 74 79 70 65 2d 6e 61 6d 65 20 77 69 74 68  a type-name with
cd50: 20 6e 6f 0a 23 20 61 66 66 69 6e 69 74 79 20 63   no.# affinity c
cd60: 61 75 73 65 73 20 74 68 65 20 76 61 6c 75 65 20  auses the value 
cd70: 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  to be converted 
cd80: 69 6e 74 6f 20 61 20 42 4c 4f 42 2e 0a 23 0a 64  into a BLOB..#.d
cd90: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
cda0: 70 72 2d 32 37 2e 33 2e 31 20 7b 20 43 41 53 54  pr-27.3.1 { CAST
cdb0: 28 27 61 62 63 27 20 41 53 20 62 6c 6f 62 29 20  ('abc' AS blob) 
cdc0: 20 20 20 20 20 20 7d 20 62 6c 6f 62 20 61 62 63        } blob abc
cdd0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
cde0: 65 78 70 72 2d 32 37 2e 33 2e 32 20 7b 20 43 41  expr-27.3.2 { CA
cdf0: 53 54 28 27 64 65 66 27 20 41 53 20 73 68 6f 62  ST('def' AS shob
ce00: 62 6c 6f 62 5f 78 29 20 7d 20 62 6c 6f 62 20 64  blob_x) } blob d
ce10: 65 66 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  ef.do_expr_test 
ce20: 65 5f 65 78 70 72 2d 32 37 2e 33 2e 33 20 7b 20  e_expr-27.3.3 { 
ce30: 43 41 53 54 28 27 67 68 69 27 20 41 53 20 61 62  CAST('ghi' AS ab
ce40: 62 4c 4f 62 31 30 29 20 20 20 7d 20 62 6c 6f 62  bLOb10)   } blob
ce50: 20 67 68 69 0a 0a 23 20 45 56 49 44 45 4e 43 45   ghi..# EVIDENCE
ce60: 2d 4f 46 3a 20 52 2d 32 32 39 35 36 2d 33 37 37  -OF: R-22956-377
ce70: 35 34 20 43 61 73 74 69 6e 67 20 74 6f 20 61 20  54 Casting to a 
ce80: 42 4c 4f 42 20 63 6f 6e 73 69 73 74 73 20 6f 66  BLOB consists of
ce90: 20 66 69 72 73 74 20 63 61 73 74 69 6e 67 0a 23   first casting.#
cea0: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 54 45   the value to TE
ceb0: 58 54 20 69 6e 20 74 68 65 20 65 6e 63 6f 64 69  XT in the encodi
cec0: 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
ced0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 74  se connection, t
cee0: 68 65 6e 0a 23 20 69 6e 74 65 72 70 72 65 74 69  hen.# interpreti
cef0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  ng the resulting
cf00: 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 61   byte sequence a
cf10: 73 20 61 20 42 4c 4f 42 20 69 6e 73 74 65 61 64  s a BLOB instead
cf20: 20 6f 66 20 61 73 20 54 45 58 54 2e 0a 23 0a 64   of as TEXT..#.d
cf30: 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65  o_qexpr_test e_e
cf40: 78 70 72 2d 32 37 2e 34 2e 31 20 7b 20 43 41 53  xpr-27.4.1 { CAS
cf50: 54 28 27 67 68 69 27 20 41 53 20 62 6c 6f 62 29  T('ghi' AS blob)
cf60: 20 7d 20 58 27 36 37 36 38 36 39 27 0a 64 6f 5f   } X'676869'.do_
cf70: 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  qexpr_test e_exp
cf80: 72 2d 32 37 2e 34 2e 32 20 7b 20 43 41 53 54 28  r-27.4.2 { CAST(
cf90: 34 35 36 20 41 53 20 62 6c 6f 62 29 20 7d 20 20  456 AS blob) }  
cfa0: 20 58 27 33 34 33 35 33 36 27 0a 64 6f 5f 71 65   X'343536'.do_qe
cfb0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
cfc0: 32 37 2e 34 2e 33 20 7b 20 43 41 53 54 28 31 2e  27.4.3 { CAST(1.
cfd0: 37 38 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 58  78 AS blob) }  X
cfe0: 27 33 31 32 45 33 37 33 38 27 0a 72 65 6e 61 6d  '312E3738'.renam
cff0: 65 20 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33  e db db2.sqlite3
d000: 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 69 66 63   db :memory:.ifc
d010: 61 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b  apable {utf16} {
d020: 0a 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d  .db eval { PRAGM
d030: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74  A encoding = 'ut
d040: 66 2d 31 36 6c 65 27 20 7d 0a 64 6f 5f 71 65 78  f-16le' }.do_qex
d050: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d060: 37 2e 34 2e 34 20 7b 20 43 41 53 54 28 27 67 68  7.4.4 { CAST('gh
d070: 69 27 20 41 53 20 62 6c 6f 62 29 20 7d 20 58 27  i' AS blob) } X'
d080: 36 37 30 30 36 38 30 30 36 39 30 30 27 0a 64 6f  670068006900'.do
d090: 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  _qexpr_test e_ex
d0a0: 70 72 2d 32 37 2e 34 2e 35 20 7b 20 43 41 53 54  pr-27.4.5 { CAST
d0b0: 28 34 35 36 20 41 53 20 62 6c 6f 62 29 20 7d 20  (456 AS blob) } 
d0c0: 20 20 58 27 33 34 30 30 33 35 30 30 33 36 30 30    X'340035003600
d0d0: 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20  '.do_qexpr_test 
d0e0: 65 5f 65 78 70 72 2d 32 37 2e 34 2e 36 20 7b 20  e_expr-27.4.6 { 
d0f0: 43 41 53 54 28 31 2e 37 38 20 41 53 20 62 6c 6f  CAST(1.78 AS blo
d100: 62 29 20 7d 20 20 58 27 33 31 30 30 32 45 30 30  b) }  X'31002E00
d110: 33 37 30 30 33 38 30 30 27 0a 7d 0a 64 62 20 63  37003800'.}.db c
d120: 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20  lose.sqlite3 db 
d130: 3a 6d 65 6d 6f 72 79 3a 0a 64 62 20 65 76 61 6c  :memory:.db eval
d140: 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69   { PRAGMA encodi
d150: 6e 67 20 3d 20 27 75 74 66 2d 31 36 62 65 27 20  ng = 'utf-16be' 
d160: 7d 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66  }.ifcapable {utf
d170: 31 36 7d 20 7b 0a 64 6f 5f 71 65 78 70 72 5f 74  16} {.do_qexpr_t
d180: 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e  est e_expr-27.4.
d190: 37 20 7b 20 43 41 53 54 28 27 67 68 69 27 20 41  7 { CAST('ghi' A
d1a0: 53 20 62 6c 6f 62 29 20 7d 20 58 27 30 30 36 37  S blob) } X'0067
d1b0: 30 30 36 38 30 30 36 39 27 0a 64 6f 5f 71 65 78  00680069'.do_qex
d1c0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d1d0: 37 2e 34 2e 38 20 7b 20 43 41 53 54 28 34 35 36  7.4.8 { CAST(456
d1e0: 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 20 58 27   AS blob) }   X'
d1f0: 30 30 33 34 30 30 33 35 30 30 33 36 27 0a 64 6f  003400350036'.do
d200: 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  _qexpr_test e_ex
d210: 70 72 2d 32 37 2e 34 2e 39 20 7b 20 43 41 53 54  pr-27.4.9 { CAST
d220: 28 31 2e 37 38 20 41 53 20 62 6c 6f 62 29 20 7d  (1.78 AS blob) }
d230: 20 20 58 27 30 30 33 31 30 30 32 45 30 30 33 37    X'0031002E0037
d240: 30 30 33 38 27 0a 7d 0a 64 62 20 63 6c 6f 73 65  0038'.}.db close
d250: 0a 72 65 6e 61 6d 65 20 64 62 32 20 64 62 0a 0a  .rename db2 db..
d260: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
d270: 2d 30 34 32 30 37 2d 33 37 39 38 31 20 54 6f 20  -04207-37981 To 
d280: 63 61 73 74 20 61 20 42 4c 4f 42 20 76 61 6c 75  cast a BLOB valu
d290: 65 20 74 6f 20 54 45 58 54 2c 20 74 68 65 20 73  e to TEXT, the s
d2a0: 65 71 75 65 6e 63 65 0a 23 20 6f 66 20 62 79 74  equence.# of byt
d2b0: 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
d2c0: 74 68 65 20 42 4c 4f 42 20 69 73 20 69 6e 74 65  the BLOB is inte
d2d0: 72 70 72 65 74 65 64 20 61 73 20 74 65 78 74 20  rpreted as text 
d2e0: 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 0a 23 20  encoded using.# 
d2f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63  the database enc
d300: 6f 64 69 6e 67 2e 0a 23 0a 64 6f 5f 65 78 70 72  oding..#.do_expr
d310: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e  _test e_expr-28.
d320: 31 2e 31 20 7b 20 43 41 53 54 20 28 58 27 36 37  1.1 { CAST (X'67
d330: 36 38 36 39 27 20 41 53 20 74 65 78 74 29 20 7d  6869' AS text) }
d340: 20 74 65 78 74 20 67 68 69 0a 64 6f 5f 65 78 70   text ghi.do_exp
d350: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38  r_test e_expr-28
d360: 2e 31 2e 32 20 7b 20 43 41 53 54 20 28 58 27 36  .1.2 { CAST (X'6
d370: 37 30 30 36 38 30 30 36 39 30 30 27 20 41 53 20  70068006900' AS 
d380: 74 65 78 74 29 20 7d 20 74 65 78 74 20 67 0a 72  text) } text g.r
d390: 65 6e 61 6d 65 20 64 62 20 64 62 32 0a 73 71 6c  ename db db2.sql
d3a0: 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a  ite3 db :memory:
d3b0: 0a 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d  .db eval { PRAGM
d3c0: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74  A encoding = 'ut
d3d0: 66 2d 31 36 6c 65 27 20 7d 0a 69 66 63 61 70 61  f-16le' }.ifcapa
d3e0: 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a 64 6f  ble {utf16} {.do
d3f0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d400: 72 2d 32 38 2e 31 2e 33 20 7b 20 43 41 53 54 20  r-28.1.3 { CAST 
d410: 28 58 27 36 37 36 38 36 39 27 20 41 53 20 74 65  (X'676869' AS te
d420: 78 74 29 20 3d 3d 20 27 67 68 69 27 20 7d 20 69  xt) == 'ghi' } i
d430: 6e 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72  nteger 0.do_expr
d440: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e  _test e_expr-28.
d450: 31 2e 34 20 7b 20 43 41 53 54 20 28 58 27 36 37  1.4 { CAST (X'67
d460: 30 30 36 38 30 30 36 39 30 30 27 20 41 53 20 74  0068006900' AS t
d470: 65 78 74 29 20 7d 20 74 65 78 74 20 67 68 69 0a  ext) } text ghi.
d480: 7d 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61 6d  }.db close.renam
d490: 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49 44  e db2 db..# EVID
d4a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 32 33 35  ENCE-OF: R-22235
d4b0: 2d 34 37 30 30 36 20 43 61 73 74 69 6e 67 20 61  -47006 Casting a
d4c0: 6e 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41  n INTEGER or REA
d4d0: 4c 20 76 61 6c 75 65 20 69 6e 74 6f 20 54 45 58  L value into TEX
d4e0: 54 0a 23 20 72 65 6e 64 65 72 73 20 74 68 65 20  T.# renders the 
d4f0: 76 61 6c 75 65 20 61 73 20 69 66 20 76 69 61 20  value as if via 
d500: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
d510: 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 74  () except that t
d520: 68 65 0a 23 20 72 65 73 75 6c 74 69 6e 67 20 54  he.# resulting T
d530: 45 58 54 20 75 73 65 73 20 74 68 65 20 65 6e 63  EXT uses the enc
d540: 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  oding of the dat
d550: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
d560: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
d570: 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 31 20 7b   e_expr-28.2.1 {
d580: 20 43 41 53 54 20 28 31 20 41 53 20 74 65 78 74   CAST (1 AS text
d590: 29 20 20 20 7d 20 20 20 20 20 74 65 78 74 20 31  )   }     text 1
d5a0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d5b0: 65 78 70 72 2d 32 38 2e 32 2e 32 20 7b 20 43 41  expr-28.2.2 { CA
d5c0: 53 54 20 28 34 35 20 41 53 20 74 65 78 74 29 20  ST (45 AS text) 
d5d0: 20 7d 20 20 20 20 20 74 65 78 74 20 34 35 0a 64   }     text 45.d
d5e0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d5f0: 70 72 2d 32 38 2e 32 2e 33 20 7b 20 43 41 53 54  pr-28.2.3 { CAST
d600: 20 28 2d 34 35 20 41 53 20 74 65 78 74 29 20 7d   (-45 AS text) }
d610: 20 20 20 20 20 74 65 78 74 20 2d 34 35 0a 64 6f       text -45.do
d620: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d630: 72 2d 32 38 2e 32 2e 34 20 7b 20 43 41 53 54 20  r-28.2.4 { CAST 
d640: 28 38 2e 38 20 41 53 20 74 65 78 74 29 20 20 20  (8.8 AS text)   
d650: 20 7d 20 20 74 65 78 74 20 38 2e 38 0a 64 6f 5f   }  text 8.8.do_
d660: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d670: 2d 32 38 2e 32 2e 35 20 7b 20 43 41 53 54 20 28  -28.2.5 { CAST (
d680: 32 2e 33 65 2b 35 20 41 53 20 74 65 78 74 29 20  2.3e+5 AS text) 
d690: 7d 20 20 74 65 78 74 20 32 33 30 30 30 30 2e 30  }  text 230000.0
d6a0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d6b0: 65 78 70 72 2d 32 38 2e 32 2e 36 20 7b 20 43 41  expr-28.2.6 { CA
d6c0: 53 54 20 28 2d 32 2e 33 65 2d 35 20 41 53 20 74  ST (-2.3e-5 AS t
d6d0: 65 78 74 29 20 7d 20 74 65 78 74 20 2d 32 2e 33  ext) } text -2.3
d6e0: 65 2d 30 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73  e-05.do_expr_tes
d6f0: 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 37 20  t e_expr-28.2.7 
d700: 7b 20 43 41 53 54 20 28 30 2e 30 20 41 53 20 74  { CAST (0.0 AS t
d710: 65 78 74 29 20 7d 20 20 20 20 20 74 65 78 74 20  ext) }     text 
d720: 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  0.0.do_expr_test
d730: 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 37 20 7b   e_expr-28.2.7 {
d740: 20 43 41 53 54 20 28 30 20 41 53 20 74 65 78 74   CAST (0 AS text
d750: 29 20 7d 20 20 20 20 20 20 20 74 65 78 74 20 30  ) }       text 0
d760: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
d770: 20 52 2d 32 36 33 34 36 2d 33 36 34 34 33 20 57   R-26346-36443 W
d780: 68 65 6e 20 63 61 73 74 69 6e 67 20 61 20 42 4c  hen casting a BL
d790: 4f 42 20 76 61 6c 75 65 20 74 6f 20 61 20 52 45  OB value to a RE
d7a0: 41 4c 2c 20 74 68 65 0a 23 20 76 61 6c 75 65 20  AL, the.# value 
d7b0: 69 73 20 66 69 72 73 74 20 63 6f 6e 76 65 72 74  is first convert
d7c0: 65 64 20 74 6f 20 54 45 58 54 2e 0a 23 0a 64 6f  ed to TEXT..#.do
d7d0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d7e0: 72 2d 32 39 2e 31 2e 31 20 7b 20 43 41 53 54 20  r-29.1.1 { CAST 
d7f0: 28 58 27 33 31 32 45 33 32 33 33 27 20 41 53 20  (X'312E3233' AS 
d800: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32  REAL) } real 1.2
d810: 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  3.do_expr_test e
d820: 5f 65 78 70 72 2d 32 39 2e 31 2e 32 20 7b 20 43  _expr-29.1.2 { C
d830: 41 53 54 20 28 58 27 33 32 33 33 33 30 32 45 33  AST (X'3233302E3
d840: 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  0' AS REAL) } re
d850: 61 6c 20 32 33 30 2e 30 0a 64 6f 5f 65 78 70 72  al 230.0.do_expr
d860: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d870: 31 2e 33 20 7b 20 43 41 53 54 20 28 58 27 32 44  1.3 { CAST (X'2D
d880: 33 39 32 45 33 38 33 37 27 20 41 53 20 52 45 41  392E3837' AS REA
d890: 4c 29 20 7d 20 72 65 61 6c 20 2d 39 2e 38 37 0a  L) } real -9.87.
d8a0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d8b0: 78 70 72 2d 32 39 2e 31 2e 34 20 7b 20 43 41 53  xpr-29.1.4 { CAS
d8c0: 54 20 28 58 27 33 30 32 45 33 30 33 30 33 30 33  T (X'302E3030303
d8d0: 31 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  1' AS REAL) } re
d8e0: 61 6c 20 30 2e 30 30 30 31 0a 72 65 6e 61 6d 65  al 0.0001.rename
d8f0: 20 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33 20   db db2.sqlite3 
d900: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 69 66 63 61  db :memory:.ifca
d910: 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a  pable {utf16} {.
d920: 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  db eval { PRAGMA
d930: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66   encoding = 'utf
d940: 2d 31 36 6c 65 27 20 7d 0a 64 6f 5f 65 78 70 72  -16le' }.do_expr
d950: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d960: 31 2e 35 20 7b 20 0a 20 20 20 20 43 41 53 54 20  1.5 { .    CAST 
d970: 28 58 27 33 31 30 30 32 45 30 30 33 32 30 30 33  (X'31002E0032003
d980: 33 30 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20  300' AS REAL) } 
d990: 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65 78 70  real 1.23.do_exp
d9a0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
d9b0: 2e 31 2e 36 20 7b 20 0a 20 20 20 20 43 41 53 54  .1.6 { .    CAST
d9c0: 20 28 58 27 33 32 30 30 33 33 30 30 33 30 30 30   (X'320033003000
d9d0: 32 45 30 30 33 30 30 30 27 20 41 53 20 52 45 41  2E003000' AS REA
d9e0: 4c 29 20 7d 20 72 65 61 6c 20 32 33 30 2e 30 0a  L) } real 230.0.
d9f0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
da00: 78 70 72 2d 32 39 2e 31 2e 37 20 7b 20 0a 20 20  xpr-29.1.7 { .  
da10: 20 20 43 41 53 54 20 28 58 27 32 44 30 30 33 39    CAST (X'2D0039
da20: 30 30 32 45 30 30 33 38 30 30 33 37 30 30 27 20  002E0038003700' 
da30: 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20  AS REAL) } real 
da40: 2d 39 2e 38 37 0a 64 6f 5f 65 78 70 72 5f 74 65  -9.87.do_expr_te
da50: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e 38  st e_expr-29.1.8
da60: 20 7b 20 0a 20 20 20 20 43 41 53 54 20 28 58 27   { .    CAST (X'
da70: 33 30 30 30 32 45 30 30 33 30 30 30 33 30 30 30  30002E0030003000
da80: 33 30 30 30 33 31 30 30 27 20 41 53 20 52 45 41  30003100' AS REA
da90: 4c 29 20 7d 20 72 65 61 6c 20 30 2e 30 30 30 31  L) } real 0.0001
daa0: 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61  .}.db close.rena
dab0: 6d 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49  me db2 db..# EVI
dac0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 38 39  DENCE-OF: R-5489
dad0: 38 2d 33 34 35 35 34 20 57 68 65 6e 20 63 61 73  8-34554 When cas
dae0: 74 69 6e 67 20 61 20 54 45 58 54 20 76 61 6c 75  ting a TEXT valu
daf0: 65 20 74 6f 20 52 45 41 4c 2c 20 74 68 65 0a 23  e to REAL, the.#
db00: 20 6c 6f 6e 67 65 73 74 20 70 6f 73 73 69 62 6c   longest possibl
db10: 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  e prefix of the 
db20: 76 61 6c 75 65 20 74 68 61 74 20 63 61 6e 20 62  value that can b
db30: 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  e interpreted as
db40: 20 61 20 72 65 61 6c 0a 23 20 6e 75 6d 62 65 72   a real.# number
db50: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
db60: 6f 6d 20 74 68 65 20 54 45 58 54 20 76 61 6c 75  om the TEXT valu
db70: 65 20 61 6e 64 20 74 68 65 20 72 65 6d 61 69 6e  e and the remain
db80: 64 65 72 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64  der ignored..#.d
db90: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
dba0: 70 72 2d 32 39 2e 32 2e 31 20 7b 20 43 41 53 54  pr-29.2.1 { CAST
dbb0: 28 27 31 2e 32 33 61 62 63 64 27 20 41 53 20 52  ('1.23abcd' AS R
dbc0: 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32 33  EAL) } real 1.23
dbd0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
dbe0: 65 78 70 72 2d 32 39 2e 32 2e 32 20 7b 20 43 41  expr-29.2.2 { CA
dbf0: 53 54 28 27 31 2e 34 35 2e 32 33 61 62 63 64 27  ST('1.45.23abcd'
dc00: 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c   AS REAL) } real
dc10: 20 31 2e 34 35 0a 64 6f 5f 65 78 70 72 5f 74 65   1.45.do_expr_te
dc20: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 32 2e 33  st e_expr-29.2.3
dc30: 20 7b 20 43 41 53 54 28 27 2d 32 2e 31 32 65 2d   { CAST('-2.12e-
dc40: 30 31 41 42 43 27 20 41 53 20 52 45 41 4c 29 20  01ABC' AS REAL) 
dc50: 7d 20 72 65 61 6c 20 2d 30 2e 32 31 32 0a 64 6f  } real -0.212.do
dc60: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
dc70: 72 2d 32 39 2e 32 2e 34 20 7b 20 43 41 53 54 28  r-29.2.4 { CAST(
dc80: 27 31 20 32 20 33 20 34 27 20 41 53 20 52 45 41  '1 2 3 4' AS REA
dc90: 4c 29 20 7d 20 72 65 61 6c 20 31 2e 30 0a 0a 23  L) } real 1.0..#
dca0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
dcb0: 31 31 33 32 31 2d 34 37 34 32 37 20 41 6e 79 20  11321-47427 Any 
dcc0: 6c 65 61 64 69 6e 67 20 73 70 61 63 65 73 20 69  leading spaces i
dcd0: 6e 20 74 68 65 20 54 45 58 54 20 76 61 6c 75 65  n the TEXT value
dce0: 20 61 72 65 0a 23 20 69 67 6e 6f 72 65 64 20 77   are.# ignored w
dcf0: 68 65 6e 20 63 6f 6e 76 65 72 67 69 6e 67 20 66  hen converging f
dd00: 72 6f 6d 20 54 45 58 54 20 74 6f 20 52 45 41 4c  rom TEXT to REAL
dd10: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
dd20: 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e 31 20 7b   e_expr-29.3.1 {
dd30: 20 43 41 53 54 28 27 20 31 2e 32 33 61 62 63 64   CAST(' 1.23abcd
dd40: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
dd50: 6c 20 31 2e 32 33 0a 64 6f 5f 65 78 70 72 5f 74  l 1.23.do_expr_t
dd60: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e  est e_expr-29.3.
dd70: 32 20 7b 20 43 41 53 54 28 27 20 20 20 20 31 2e  2 { CAST('    1.
dd80: 34 35 2e 32 33 61 62 63 64 27 20 41 53 20 52 45  45.23abcd' AS RE
dd90: 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 34 35 0a  AL) } real 1.45.
dda0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
ddb0: 78 70 72 2d 32 39 2e 33 2e 33 20 7b 20 43 41 53  xpr-29.3.3 { CAS
ddc0: 54 28 27 20 20 20 2d 32 2e 31 32 65 2d 30 31 41  T('   -2.12e-01A
ddd0: 42 43 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  BC' AS REAL) } r
dde0: 65 61 6c 20 2d 30 2e 32 31 32 0a 64 6f 5f 65 78  eal -0.212.do_ex
ddf0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
de00: 39 2e 33 2e 34 20 7b 20 43 41 53 54 28 27 20 31  9.3.4 { CAST(' 1
de10: 20 32 20 33 20 34 27 20 41 53 20 52 45 41 4c 29   2 3 4' AS REAL)
de20: 20 7d 20 72 65 61 6c 20 31 2e 30 0a 0a 23 20 45   } real 1.0..# E
de30: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32  VIDENCE-OF: R-22
de40: 36 36 32 2d 32 38 32 31 38 20 49 66 20 74 68 65  662-28218 If the
de50: 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20  re is no prefix 
de60: 74 68 61 74 20 63 61 6e 20 62 65 0a 23 20 69 6e  that can be.# in
de70: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 72  terpreted as a r
de80: 65 61 6c 20 6e 75 6d 62 65 72 2c 20 74 68 65 20  eal number, the 
de90: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  result of the co
dea0: 6e 76 65 72 73 69 6f 6e 20 69 73 20 30 2e 30 2e  nversion is 0.0.
deb0: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
dec0: 65 5f 65 78 70 72 2d 32 39 2e 34 2e 31 20 7b 20  e_expr-29.4.1 { 
ded0: 43 41 53 54 28 27 27 20 41 53 20 52 45 41 4c 29  CAST('' AS REAL)
dee0: 20 7d 20 72 65 61 6c 20 30 2e 30 0a 64 6f 5f 65   } real 0.0.do_e
def0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
df00: 32 39 2e 34 2e 32 20 7b 20 43 41 53 54 28 27 6e  29.4.2 { CAST('n
df10: 6f 74 20 61 20 6e 75 6d 62 65 72 27 20 41 53 20  ot a number' AS 
df20: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 30 2e 30  REAL) } real 0.0
df30: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
df40: 65 78 70 72 2d 32 39 2e 34 2e 33 20 7b 20 43 41  expr-29.4.3 { CA
df50: 53 54 28 27 58 58 49 27 20 41 53 20 52 45 41 4c  ST('XXI' AS REAL
df60: 29 20 7d 20 72 65 61 6c 20 30 2e 30 0a 0a 23 20  ) } real 0.0..# 
df70: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
df80: 31 38 32 39 2d 31 34 35 36 33 20 57 68 65 6e 20  1829-14563 When 
df90: 63 61 73 74 69 6e 67 20 61 20 42 4c 4f 42 20 76  casting a BLOB v
dfa0: 61 6c 75 65 20 74 6f 20 49 4e 54 45 47 45 52 2c  alue to INTEGER,
dfb0: 20 74 68 65 0a 23 20 76 61 6c 75 65 20 69 73 20   the.# value is 
dfc0: 66 69 72 73 74 20 63 6f 6e 76 65 72 74 65 64 20  first converted 
dfd0: 74 6f 20 54 45 58 54 2e 0a 23 0a 64 6f 5f 65 78  to TEXT..#.do_ex
dfe0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
dff0: 30 2e 31 2e 31 20 7b 20 43 41 53 54 28 58 27 33  0.1.1 { CAST(X'3
e000: 31 33 32 33 33 27 20 41 53 20 49 4e 54 45 47 45  13233' AS INTEGE
e010: 52 29 20 7d 20 69 6e 74 65 67 65 72 20 31 32 33  R) } integer 123
e020: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e030: 65 78 70 72 2d 33 30 2e 31 2e 32 20 7b 20 43 41  expr-30.1.2 { CA
e040: 53 54 28 58 27 32 44 33 36 33 37 33 38 27 20 41  ST(X'2D363738' A
e050: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e060: 65 67 65 72 20 2d 36 37 38 0a 64 6f 5f 65 78 70  eger -678.do_exp
e070: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
e080: 2e 31 2e 33 20 7b 20 0a 20 20 43 41 53 54 28 58  .1.3 { .  CAST(X
e090: 27 33 31 33 30 33 30 33 30 33 30 33 30 33 30 27  '31303030303030'
e0a0: 20 41 53 20 49 4e 54 45 47 45 52 29 20 0a 7d 20   AS INTEGER) .} 
e0b0: 69 6e 74 65 67 65 72 20 31 30 30 30 30 30 30 0a  integer 1000000.
e0c0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e0d0: 78 70 72 2d 33 30 2e 31 2e 34 20 7b 20 0a 20 20  xpr-30.1.4 { .  
e0e0: 43 41 53 54 28 58 27 32 44 33 31 33 31 33 32 33  CAST(X'2D3131323
e0f0: 35 33 38 33 39 33 39 33 39 33 30 33 36 33 38 33  5383939393036383
e100: 34 33 32 33 36 33 32 33 34 27 20 41 53 20 49 4e  432363234' AS IN
e110: 54 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67 65  TEGER) .} intege
e120: 72 20 2d 31 31 32 35 38 39 39 39 30 36 38 34 32  r -1125899906842
e130: 36 32 34 0a 0a 72 65 6e 61 6d 65 20 64 62 20 64  624..rename db d
e140: 62 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d  b2.sqlite3 db :m
e150: 65 6d 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c 65  emory:.ifcapable
e160: 20 7b 75 74 66 31 36 7d 20 7b 0a 65 78 65 63 73   {utf16} {.execs
e170: 71 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f  ql { PRAGMA enco
e180: 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 62 65  ding = 'utf-16be
e190: 27 20 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ' }.do_expr_test
e1a0: 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 35 20 7b   e_expr-30.1.5 {
e1b0: 20 43 41 53 54 28 58 27 30 30 33 31 30 30 33 32   CAST(X'00310032
e1c0: 30 30 33 33 27 20 41 53 20 49 4e 54 45 47 45 52  0033' AS INTEGER
e1d0: 29 20 7d 20 69 6e 74 65 67 65 72 20 31 32 33 0a  ) } integer 123.
e1e0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e1f0: 78 70 72 2d 33 30 2e 31 2e 36 20 7b 20 43 41 53  xpr-30.1.6 { CAS
e200: 54 28 58 27 30 30 32 44 30 30 33 36 30 30 33 37  T(X'002D00360037
e210: 30 30 33 38 27 20 41 53 20 49 4e 54 45 47 45 52  0038' AS INTEGER
e220: 29 20 7d 20 69 6e 74 65 67 65 72 20 2d 36 37 38  ) } integer -678
e230: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e240: 65 78 70 72 2d 33 30 2e 31 2e 37 20 7b 20 0a 20  expr-30.1.7 { . 
e250: 20 43 41 53 54 28 58 27 30 30 33 31 30 30 33 30   CAST(X'00310030
e260: 30 30 33 30 30 30 33 30 30 30 33 30 30 30 33 30  0030003000300030
e270: 30 30 33 30 27 20 41 53 20 49 4e 54 45 47 45 52  0030' AS INTEGER
e280: 29 20 0a 7d 20 69 6e 74 65 67 65 72 20 31 30 30  ) .} integer 100
e290: 30 30 30 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73  0000.do_expr_tes
e2a0: 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 38 20  t e_expr-30.1.8 
e2b0: 7b 20 0a 20 20 43 41 53 54 28 58 27 30 30 32 44  { .  CAST(X'002D
e2c0: 30 30 33 31 30 30 33 31 30 30 33 32 30 30 33 35  0031003100320035
e2d0: 30 30 33 38 30 30 33 39 30 30 33 39 30 30 33 39  0038003900390039
e2e0: 30 30 33 30 30 30 33 36 30 30 33 38 30 30 33 34  0030003600380034
e2f0: 30 30 33 32 30 30 33 36 30 30 33 32 30 30 33 34  0032003600320034
e300: 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 0a 7d  ' AS INTEGER) .}
e310: 20 69 6e 74 65 67 65 72 20 2d 31 31 32 35 38 39   integer -112589
e320: 39 39 30 36 38 34 32 36 32 34 0a 7d 0a 64 62 20  9906842624.}.db 
e330: 63 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62 32  close.rename db2
e340: 20 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   db..# EVIDENCE-
e350: 4f 46 3a 20 52 2d 34 37 36 31 32 2d 34 35 38 34  OF: R-47612-4584
e360: 32 20 57 68 65 6e 20 63 61 73 74 69 6e 67 20 61  2 When casting a
e370: 20 54 45 58 54 20 76 61 6c 75 65 20 74 6f 20 49   TEXT value to I
e380: 4e 54 45 47 45 52 2c 20 74 68 65 0a 23 20 6c 6f  NTEGER, the.# lo
e390: 6e 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70  ngest possible p
e3a0: 72 65 66 69 78 20 6f 66 20 74 68 65 20 76 61 6c  refix of the val
e3b0: 75 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 69  ue that can be i
e3c0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
e3d0: 0a 23 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  .# integer numbe
e3e0: 72 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  r is extracted f
e3f0: 72 6f 6d 20 74 68 65 20 54 45 58 54 20 76 61 6c  rom the TEXT val
e400: 75 65 20 61 6e 64 20 74 68 65 20 72 65 6d 61 69  ue and the remai
e410: 6e 64 65 72 0a 23 20 69 67 6e 6f 72 65 64 2e 0a  nder.# ignored..
e420: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
e430: 5f 65 78 70 72 2d 33 30 2e 32 2e 31 20 7b 20 43  _expr-30.2.1 { C
e440: 41 53 54 28 27 31 32 33 61 62 63 64 27 20 41 53  AST('123abcd' AS
e450: 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20   INT) } integer 
e460: 31 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  123.do_expr_test
e470: 20 65 5f 65 78 70 72 2d 33 30 2e 32 2e 32 20 7b   e_expr-30.2.2 {
e480: 20 43 41 53 54 28 27 31 34 35 32 33 61 62 63 64   CAST('14523abcd
e490: 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65  ' AS INT) } inte
e4a0: 67 65 72 20 31 34 35 32 33 0a 64 6f 5f 65 78 70  ger 14523.do_exp
e4b0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
e4c0: 2e 32 2e 33 20 7b 20 43 41 53 54 28 27 2d 32 2e  .2.3 { CAST('-2.
e4d0: 31 32 65 2d 30 31 41 42 43 27 20 41 53 20 49 4e  12e-01ABC' AS IN
e4e0: 54 29 20 7d 20 69 6e 74 65 67 65 72 20 2d 32 0a  T) } integer -2.
e4f0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e500: 78 70 72 2d 33 30 2e 32 2e 34 20 7b 20 43 41 53  xpr-30.2.4 { CAS
e510: 54 28 27 31 20 32 20 33 20 34 27 20 41 53 20 49  T('1 2 3 4' AS I
e520: 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31 0a  NT) } integer 1.
e530: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
e540: 52 2d 33 34 34 30 30 2d 33 33 37 37 32 20 41 6e  R-34400-33772 An
e550: 79 20 6c 65 61 64 69 6e 67 20 73 70 61 63 65 73  y leading spaces
e560: 20 69 6e 20 74 68 65 20 54 45 58 54 20 76 61 6c   in the TEXT val
e570: 75 65 20 77 68 65 6e 0a 23 20 63 6f 6e 76 65 72  ue when.# conver
e580: 74 69 6e 67 20 66 72 6f 6d 20 54 45 58 54 20 74  ting from TEXT t
e590: 6f 20 49 4e 54 45 47 45 52 20 61 72 65 20 69 67  o INTEGER are ig
e5a0: 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 70 72  nored..#.do_expr
e5b0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
e5c0: 33 2e 31 20 7b 20 43 41 53 54 28 27 20 20 20 31  3.1 { CAST('   1
e5d0: 32 33 61 62 63 64 27 20 41 53 20 49 4e 54 29 20  23abcd' AS INT) 
e5e0: 7d 20 69 6e 74 65 67 65 72 20 31 32 33 0a 64 6f  } integer 123.do
e5f0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e600: 72 2d 33 30 2e 33 2e 32 20 7b 20 43 41 53 54 28  r-30.3.2 { CAST(
e610: 27 20 20 31 34 35 32 33 61 62 63 64 27 20 41 53  '  14523abcd' AS
e620: 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20   INT) } integer 
e630: 31 34 35 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65  14523.do_expr_te
e640: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 33 2e 33  st e_expr-30.3.3
e650: 20 7b 20 43 41 53 54 28 27 20 2d 32 2e 31 32 65   { CAST(' -2.12e
e660: 2d 30 31 41 42 43 27 20 41 53 20 49 4e 54 29 20  -01ABC' AS INT) 
e670: 7d 20 69 6e 74 65 67 65 72 20 2d 32 0a 64 6f 5f  } integer -2.do_
e680: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e690: 2d 33 30 2e 33 2e 34 20 7b 20 43 41 53 54 28 27  -30.3.4 { CAST('
e6a0: 20 20 20 20 20 31 20 32 20 33 20 34 27 20 41 53       1 2 3 4' AS
e6b0: 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20   INT) } integer 
e6c0: 31 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  1..# EVIDENCE-OF
e6d0: 3a 20 52 2d 34 33 31 36 34 2d 34 34 32 37 36 20  : R-43164-44276 
e6e0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  If there is no p
e6f0: 72 65 66 69 78 20 74 68 61 74 20 63 61 6e 20 62  refix that can b
e700: 65 0a 23 20 69 6e 74 65 72 70 72 65 74 65 64 20  e.# interpreted 
e710: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  as an integer nu
e720: 6d 62 65 72 2c 20 74 68 65 20 72 65 73 75 6c 74  mber, the result
e730: 20 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69   of the conversi
e740: 6f 6e 20 69 73 20 30 2e 0a 23 0a 64 6f 5f 65 78  on is 0..#.do_ex
e750: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e760: 30 2e 34 2e 31 20 7b 20 43 41 53 54 28 27 27 20  0.4.1 { CAST('' 
e770: 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e  AS INTEGER) } in
e780: 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72 5f  teger 0.do_expr_
e790: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 34  test e_expr-30.4
e7a0: 2e 32 20 7b 20 43 41 53 54 28 27 6e 6f 74 20 61  .2 { CAST('not a
e7b0: 20 6e 75 6d 62 65 72 27 20 41 53 20 49 4e 54 45   number' AS INTE
e7c0: 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 30  GER) } integer 0
e7d0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e7e0: 65 78 70 72 2d 33 30 2e 34 2e 33 20 7b 20 43 41  expr-30.4.3 { CA
e7f0: 53 54 28 27 58 58 49 27 20 41 53 20 49 4e 54 45  ST('XXI' AS INTE
e800: 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 30  GER) } integer 0
e810: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
e820: 20 52 2d 30 38 39 38 30 2d 35 33 31 32 34 20 54   R-08980-53124 T
e830: 68 65 20 43 41 53 54 20 6f 70 65 72 61 74 6f 72  he CAST operator
e840: 20 75 6e 64 65 72 73 74 61 6e 64 73 20 64 65 63   understands dec
e850: 69 6d 61 6c 0a 23 20 69 6e 74 65 67 65 72 73 20  imal.# integers 
e860: 6f 6e 6c 79 20 26 6d 64 61 73 68 3b 20 63 6f 6e  only &mdash; con
e870: 76 65 72 73 69 6f 6e 20 6f 66 20 68 65 78 61 64  version of hexad
e880: 65 63 69 6d 61 6c 20 69 6e 74 65 67 65 72 73 20  ecimal integers 
e890: 73 74 6f 70 73 20 61 74 0a 23 20 74 68 65 20 22  stops at.# the "
e8a0: 78 22 20 69 6e 20 74 68 65 20 22 30 78 22 20 70  x" in the "0x" p
e8b0: 72 65 66 69 78 20 6f 66 20 74 68 65 20 68 65 78  refix of the hex
e8c0: 61 64 65 63 69 6d 61 6c 20 69 6e 74 65 67 65 72  adecimal integer
e8d0: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 75 73   string and thus
e8e0: 0a 23 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  .# result of the
e8f0: 20 43 41 53 54 20 69 73 20 61 6c 77 61 79 73 20   CAST is always 
e900: 7a 65 72 6f 2e 0a 64 6f 5f 65 78 70 72 5f 74 65  zero..do_expr_te
e910: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 35 2e 31  st e_expr-30.5.1
e920: 20 7b 20 43 41 53 54 28 27 30 78 31 32 33 34 27   { CAST('0x1234'
e930: 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69   AS INTEGER) } i
e940: 6e 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72  nteger 0.do_expr
e950: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
e960: 35 2e 32 20 7b 20 43 41 53 54 28 27 30 58 31 32  5.2 { CAST('0X12
e970: 33 34 27 20 41 53 20 49 4e 54 45 47 45 52 29 20  34' AS INTEGER) 
e980: 7d 20 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45  } integer 0..# E
e990: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32  VIDENCE-OF: R-02
e9a0: 37 35 32 2d 35 30 30 39 31 20 41 20 63 61 73 74  752-50091 A cast
e9b0: 20 6f 66 20 61 20 52 45 41 4c 20 76 61 6c 75 65   of a REAL value
e9c0: 20 69 6e 74 6f 20 61 6e 20 49 4e 54 45 47 45 52   into an INTEGER
e9d0: 0a 23 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  .# results in th
e9e0: 65 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65  e integer betwee
e9f0: 6e 20 74 68 65 20 52 45 41 4c 20 76 61 6c 75 65  n the REAL value
ea00: 20 61 6e 64 20 7a 65 72 6f 20 74 68 61 74 20 69   and zero that i
ea10: 73 20 63 6c 6f 73 65 73 74 0a 23 20 74 6f 20 74  s closest.# to t
ea20: 68 65 20 52 45 41 4c 20 76 61 6c 75 65 2e 0a 23  he REAL value..#
ea30: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
ea40: 65 78 70 72 2d 33 31 2e 31 2e 31 20 7b 20 43 41  expr-31.1.1 { CA
ea50: 53 54 28 33 2e 31 34 31 35 39 20 41 53 20 49 4e  ST(3.14159 AS IN
ea60: 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72  TEGER) } integer
ea70: 20 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20   3.do_expr_test 
ea80: 65 5f 65 78 70 72 2d 33 31 2e 31 2e 32 20 7b 20  e_expr-31.1.2 { 
ea90: 43 41 53 54 28 31 2e 39 39 39 39 39 20 41 53 20  CAST(1.99999 AS 
eaa0: 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67  INTEGER) } integ
eab0: 65 72 20 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73  er 1.do_expr_tes
eac0: 74 20 65 5f 65 78 70 72 2d 33 31 2e 31 2e 33 20  t e_expr-31.1.3 
ead0: 7b 20 43 41 53 54 28 2d 31 2e 39 39 39 39 39 20  { CAST(-1.99999 
eae0: 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e  AS INTEGER) } in
eaf0: 74 65 67 65 72 20 2d 31 0a 64 6f 5f 65 78 70 72  teger -1.do_expr
eb00: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e  _test e_expr-31.
eb10: 31 2e 34 20 7b 20 43 41 53 54 28 2d 30 2e 39 39  1.4 { CAST(-0.99
eb20: 39 39 39 20 41 53 20 49 4e 54 45 47 45 52 29 20  999 AS INTEGER) 
eb30: 7d 20 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45  } integer 0..# E
eb40: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
eb50: 35 31 37 2d 34 30 38 32 34 20 49 66 20 61 20 52  517-40824 If a R
eb60: 45 41 4c 20 69 73 20 67 72 65 61 74 65 72 20 74  EAL is greater t
eb70: 68 61 6e 20 74 68 65 20 67 72 65 61 74 65 73 74  han the greatest
eb80: 0a 23 20 70 6f 73 73 69 62 6c 65 20 73 69 67 6e  .# possible sign
eb90: 65 64 20 69 6e 74 65 67 65 72 20 28 2b 39 32 32  ed integer (+922
eba0: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
ebb0: 29 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  ) then the resul
ebc0: 74 20 69 73 20 74 68 65 0a 23 20 67 72 65 61 74  t is the.# great
ebd0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 73 69 67  est possible sig
ebe0: 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20  ned integer and 
ebf0: 69 66 20 74 68 65 20 52 45 41 4c 20 69 73 20 6c  if the REAL is l
ec00: 65 73 73 20 74 68 61 6e 20 74 68 65 0a 23 20 6c  ess than the.# l
ec10: 65 61 73 74 20 70 6f 73 73 69 62 6c 65 20 73 69  east possible si
ec20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 28 2d 39  gned integer (-9
ec30: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
ec40: 30 38 29 20 74 68 65 6e 20 74 68 65 20 72 65 73  08) then the res
ec50: 75 6c 74 0a 23 20 69 73 20 74 68 65 20 6c 65 61  ult.# is the lea
ec60: 73 74 20 70 6f 73 73 69 62 6c 65 20 73 69 67 6e  st possible sign
ec70: 65 64 20 69 6e 74 65 67 65 72 2e 0a 23 0a 64 6f  ed integer..#.do
ec80: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
ec90: 72 2d 33 31 2e 32 2e 31 20 7b 20 43 41 53 54 28  r-31.2.1 { CAST(
eca0: 32 65 2b 35 30 20 41 53 20 49 4e 54 29 20 7d 20  2e+50 AS INT) } 
ecb0: 69 6e 74 65 67 65 72 20 39 32 32 33 33 37 32 30  integer 92233720
ecc0: 33 36 38 35 34 37 37 35 38 30 37 0a 64 6f 5f 65  36854775807.do_e
ecd0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
ece0: 33 31 2e 32 2e 32 20 7b 20 43 41 53 54 28 2d 32  31.2.2 { CAST(-2
ecf0: 65 2b 35 30 20 41 53 20 49 4e 54 29 20 7d 20 69  e+50 AS INT) } i
ed00: 6e 74 65 67 65 72 20 2d 39 32 32 33 33 37 32 30  nteger -92233720
ed10: 33 36 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65  36854775808.do_e
ed20: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
ed30: 33 31 2e 32 2e 33 20 7b 20 0a 20 20 43 41 53 54  31.2.3 { .  CAST
ed40: 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37  (-92233720368547
ed50: 37 35 38 30 39 2e 30 20 41 53 20 49 4e 54 29 0a  75809.0 AS INT).
ed60: 7d 20 69 6e 74 65 67 65 72 20 2d 39 32 32 33 33  } integer -92233
ed70: 37 32 30 33 36 38 35 34 37 37 35 38 30 38 0a 64  72036854775808.d
ed80: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
ed90: 70 72 2d 33 31 2e 32 2e 34 20 7b 20 0a 20 20 43  pr-31.2.4 { .  C
eda0: 41 53 54 28 39 32 32 33 33 37 32 30 33 36 38 35  AST(922337203685
edb0: 34 37 37 35 38 30 39 2e 30 20 41 53 20 49 4e 54  4775809.0 AS INT
edc0: 29 0a 7d 20 69 6e 74 65 67 65 72 20 39 32 32 33  ).} integer 9223
edd0: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 0a  372036854775807.
ede0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
edf0: 20 52 2d 30 39 32 39 35 2d 36 31 33 33 37 20 43   R-09295-61337 C
ee00: 61 73 74 69 6e 67 20 61 20 54 45 58 54 20 6f 72  asting a TEXT or
ee10: 20 42 4c 4f 42 20 76 61 6c 75 65 20 69 6e 74 6f   BLOB value into
ee20: 20 4e 55 4d 45 52 49 43 0a 23 20 66 69 72 73 74   NUMERIC.# first
ee30: 20 64 6f 65 73 20 61 20 66 6f 72 63 65 64 20 63   does a forced c
ee40: 6f 6e 76 65 72 73 69 6f 6e 20 69 6e 74 6f 20 52  onversion into R
ee50: 45 41 4c 20 62 75 74 20 74 68 65 6e 20 66 75 72  EAL but then fur
ee60: 74 68 65 72 20 63 6f 6e 76 65 72 74 73 20 74 68  ther converts th
ee70: 65 0a 23 20 72 65 73 75 6c 74 20 69 6e 74 6f 20  e.# result into 
ee80: 49 4e 54 45 47 45 52 20 69 66 20 61 6e 64 20 6f  INTEGER if and o
ee90: 6e 6c 79 20 69 66 20 74 68 65 20 63 6f 6e 76 65  nly if the conve
eea0: 72 73 69 6f 6e 20 66 72 6f 6d 20 52 45 41 4c 20  rsion from REAL 
eeb0: 74 6f 20 49 4e 54 45 47 45 52 0a 23 20 69 73 20  to INTEGER.# is 
eec0: 6c 6f 73 73 6c 65 73 73 20 61 6e 64 20 72 65 76  lossless and rev
eed0: 65 72 73 69 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78  ersible..#.do_ex
eee0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
eef0: 32 2e 31 2e 31 20 7b 20 43 41 53 54 28 27 34 35  2.1.1 { CAST('45
ef00: 27 20 20 20 41 53 20 4e 55 4d 45 52 49 43 29 20  '   AS NUMERIC) 
ef10: 20 7d 20 69 6e 74 65 67 65 72 20 34 35 0a 64 6f   } integer 45.do
ef20: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
ef30: 72 2d 33 32 2e 31 2e 32 20 7b 20 43 41 53 54 28  r-32.1.2 { CAST(
ef40: 27 34 35 2e 30 27 20 41 53 20 4e 55 4d 45 52 49  '45.0' AS NUMERI
ef50: 43 29 20 20 7d 20 72 65 61 6c 20 34 35 2e 30 0a  C)  } real 45.0.
ef60: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
ef70: 78 70 72 2d 33 32 2e 31 2e 33 20 7b 20 43 41 53  xpr-32.1.3 { CAS
ef80: 54 28 27 34 35 2e 32 27 20 41 53 20 4e 55 4d 45  T('45.2' AS NUME
ef90: 52 49 43 29 20 20 7d 20 72 65 61 6c 20 34 35 2e  RIC)  } real 45.
efa0: 32 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  2.do_expr_test e
efb0: 5f 65 78 70 72 2d 33 32 2e 31 2e 34 20 7b 20 43  _expr-32.1.4 { C
efc0: 41 53 54 28 27 31 31 61 62 63 27 20 41 53 20 4e  AST('11abc' AS N
efd0: 55 4d 45 52 49 43 29 20 7d 20 69 6e 74 65 67 65  UMERIC) } intege
efe0: 72 20 31 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73  r 11.do_expr_tes
eff0: 74 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e 35 20  t e_expr-32.1.5 
f000: 7b 20 43 41 53 54 28 27 31 31 2e 31 61 62 63 27  { CAST('11.1abc'
f010: 20 41 53 20 4e 55 4d 45 52 49 43 29 20 7d 20 72   AS NUMERIC) } r
f020: 65 61 6c 20 31 31 2e 31 0a 0a 23 20 45 56 49 44  eal 11.1..# EVID
f030: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 33 34 37  ENCE-OF: R-30347
f040: 2d 31 38 37 30 32 20 43 61 73 74 69 6e 67 20 61  -18702 Casting a
f050: 20 52 45 41 4c 20 6f 72 20 49 4e 54 45 47 45 52   REAL or INTEGER
f060: 20 76 61 6c 75 65 20 74 6f 20 4e 55 4d 45 52 49   value to NUMERI
f070: 43 0a 23 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20  C.# is a no-op, 
f080: 65 76 65 6e 20 69 66 20 61 20 72 65 61 6c 20 76  even if a real v
f090: 61 6c 75 65 20 63 6f 75 6c 64 20 62 65 20 6c 6f  alue could be lo
f0a0: 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74  sslessly convert
f0b0: 65 64 20 74 6f 20 61 6e 0a 23 20 69 6e 74 65 67  ed to an.# integ
f0c0: 65 72 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65  er..#.do_expr_te
f0d0: 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 31  st e_expr-32.2.1
f0e0: 20 7b 20 43 41 53 54 28 31 33 2e 30 20 41 53 20   { CAST(13.0 AS 
f0f0: 4e 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c 20  NUMERIC) } real 
f100: 31 33 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73  13.0.do_expr_tes
f110: 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 32 20  t e_expr-32.2.2 
f120: 7b 20 43 41 53 54 28 31 33 2e 35 20 41 53 20 4e  { CAST(13.5 AS N
f130: 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c 20 31  UMERIC) } real 1
f140: 33 2e 35 0a 0a 64 6f 5f 65 78 70 72 5f 74 65 73  3.5..do_expr_tes
f150: 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 33 20  t e_expr-32.2.3 
f160: 7b 20 0a 20 20 43 41 53 54 28 2d 39 32 32 33 33  { .  CAST(-92233
f170: 37 32 30 33 36 38 35 34 37 37 35 38 30 38 20 41  72036854775808 A
f180: 53 20 4e 55 4d 45 52 49 43 29 0a 7d 20 69 6e 74  S NUMERIC).} int
f190: 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33 36  eger -9223372036
f1a0: 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78 70  854775808.do_exp
f1b0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32  r_test e_expr-32
f1c0: 2e 32 2e 34 20 7b 20 0a 20 20 43 41 53 54 28 39  .2.4 { .  CAST(9
f1d0: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
f1e0: 30 37 20 41 53 20 4e 55 4d 45 52 49 43 29 0a 7d  07 AS NUMERIC).}
f1f0: 20 69 6e 74 65 67 65 72 20 39 32 32 33 33 37 32   integer 9223372
f200: 30 33 36 38 35 34 37 37 35 38 30 37 0a 64 6f 5f  036854775807.do_
f210: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
f220: 2d 33 32 2e 32 2e 35 20 7b 20 0a 20 20 43 41 53  -32.2.5 { .  CAS
f230: 54 28 27 39 32 32 33 33 37 32 30 33 36 38 35 34  T('9223372036854
f240: 37 37 35 38 30 37 20 27 20 41 53 20 4e 55 4d 45  775807 ' AS NUME
f250: 52 49 43 29 0a 7d 20 69 6e 74 65 67 65 72 20 39  RIC).} integer 9
f260: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
f270: 30 37 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  07.do_expr_test 
f280: 65 5f 65 78 70 72 2d 33 32 2e 32 2e 36 20 7b 20  e_expr-32.2.6 { 
f290: 0a 20 20 43 41 53 54 28 27 20 20 20 39 32 32 33  .  CAST('   9223
f2a0: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 20  372036854775807 
f2b0: 20 20 27 20 41 53 20 4e 55 4d 45 52 49 43 29 0a    ' AS NUMERIC).
f2c0: 7d 20 69 6e 74 65 67 65 72 20 39 32 32 33 33 37  } integer 922337
f2d0: 32 30 33 36 38 35 34 37 37 35 38 30 37 0a 64 6f  2036854775807.do
f2e0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
f2f0: 72 2d 33 32 2e 32 2e 37 20 7b 20 0a 20 20 43 41  r-32.2.7 { .  CA
f300: 53 54 28 27 20 20 27 20 41 53 20 4e 55 4d 45 52  ST('  ' AS NUMER
f310: 49 43 29 0a 7d 20 69 6e 74 65 67 65 72 20 30 0a  IC).} integer 0.
f320: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
f330: 65 5f 65 78 70 72 2d 33 32 2e 32 2e 38 20 7b 0a  e_expr-32.2.8 {.
f340: 20 20 57 49 54 48 20 74 31 28 78 29 20 41 53 20    WITH t1(x) AS 
f350: 28 56 41 4c 55 45 53 0a 20 20 20 20 20 28 27 39  (VALUES.     ('9
f360: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30  0000000000000000
f370: 30 31 27 29 2c 0a 20 20 20 20 20 28 27 39 30 30  01'),.     ('900
f380: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31  0000000000000001
f390: 78 27 29 2c 0a 20 20 20 20 20 28 27 39 30 30 30  x'),.     ('9000
f3a0: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 20  000000000000001 
f3b0: 27 29 2c 0a 20 20 20 20 20 28 27 20 39 30 30 30  '),.     (' 9000
f3c0: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 20  000000000000001 
f3d0: 27 29 2c 0a 20 20 20 20 20 28 27 20 39 30 30 30  '),.     (' 9000
f3e0: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 27  000000000000001'
f3f0: 29 2c 0a 20 20 20 20 20 28 27 20 39 30 30 30 30  ),.     (' 90000
f400: 30 30 30 30 30 30 30 30 30 30 30 30 30 31 2e 27  00000000000001.'
f410: 29 2c 0a 20 20 20 20 20 28 27 39 32 32 33 33 37  ),.     ('922337
f420: 32 30 33 36 38 35 34 37 37 35 38 30 37 27 29 2c  2036854775807'),
f430: 0a 20 20 20 20 20 28 27 39 32 32 33 33 37 32 30  .     ('92233720
f440: 33 36 38 35 34 37 37 35 38 30 37 20 27 29 2c 0a  36854775807 '),.
f450: 20 20 20 20 20 28 27 20 20 20 39 32 32 33 33 37       ('   922337
f460: 32 30 33 36 38 35 34 37 37 35 38 30 37 20 20 20  2036854775807   
f470: 27 29 2c 0a 20 20 20 20 20 28 27 39 32 32 33 33  '),.     ('92233
f480: 37 32 30 33 36 38 35 34 37 37 35 38 30 38 27 29  72036854775808')
f490: 2c 0a 20 20 20 20 20 28 27 20 20 20 39 32 32 33  ,.     ('   9223
f4a0: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 20  372036854775808 
f4b0: 20 20 27 29 2c 0a 20 20 20 20 20 28 27 39 32 32    '),.     ('922
f4c0: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
f4d0: 2e 30 27 29 2c 0a 20 20 20 20 20 28 27 39 32 32  .0'),.     ('922
f4e0: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
f4f0: 65 2b 30 27 29 2c 0a 20 20 20 20 20 28 27 2d 35  e+0'),.     ('-5
f500: 2e 30 27 29 2c 0a 20 20 20 20 20 28 27 2d 35 65  .0'),.     ('-5e
f510: 2b 30 27 29 29 0a 20 20 53 45 4c 45 43 54 20 74  +0')).  SELECT t
f520: 79 70 65 6f 66 28 43 41 53 54 28 78 20 41 53 20  ypeof(CAST(x AS 
f530: 4e 55 4d 45 52 49 43 29 29 2c 20 43 41 53 54 28  NUMERIC)), CAST(
f540: 78 20 41 53 20 4e 55 4d 45 52 49 43 29 7c 7c 27  x AS NUMERIC)||'
f550: 27 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 5b 6c 69  ' FROM t1;.} [li
f560: 73 74 20 5c 0a 20 69 6e 74 65 67 65 72 20 39 30  st \. integer 90
f570: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30  0000000000000000
f580: 31 20 5c 0a 20 69 6e 74 65 67 65 72 20 39 30 30  1 \. integer 900
f590: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31  0000000000000001
f5a0: 20 5c 0a 20 69 6e 74 65 67 65 72 20 39 30 30 30   \. integer 9000
f5b0: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 20  000000000000001 
f5c0: 5c 0a 20 69 6e 74 65 67 65 72 20 39 30 30 30 30  \. integer 90000
f5d0: 30 30 30 30 30 30 30 30 30 30 30 30 30 31 20 5c  00000000000001 \
f5e0: 0a 20 69 6e 74 65 67 65 72 20 39 30 30 30 30 30  . integer 900000
f5f0: 30 30 30 30 30 30 30 30 30 30 30 30 31 20 5c 0a  0000000000001 \.
f600: 20 72 65 61 6c 20 39 2e 30 65 2b 31 38 20 5c 0a   real 9.0e+18 \.
f610: 20 69 6e 74 65 67 65 72 20 39 32 32 33 33 37 32   integer 9223372
f620: 30 33 36 38 35 34 37 37 35 38 30 37 20 5c 0a 20  036854775807 \. 
f630: 69 6e 74 65 67 65 72 20 39 32 32 33 33 37 32 30  integer 92233720
f640: 33 36 38 35 34 37 37 35 38 30 37 20 5c 0a 20 69  36854775807 \. i
f650: 6e 74 65 67 65 72 20 39 32 32 33 33 37 32 30 33  nteger 922337203
f660: 36 38 35 34 37 37 35 38 30 37 20 5c 0a 20 72 65  6854775807 \. re
f670: 61 6c 20 39 2e 32 32 33 33 37 32 30 33 36 38 35  al 9.22337203685
f680: 34 37 38 65 2b 31 38 20 5c 0a 20 72 65 61 6c 20  478e+18 \. real 
f690: 39 2e 32 32 33 33 37 32 30 33 36 38 35 34 37 38  9.22337203685478
f6a0: 65 2b 31 38 20 5c 0a 20 72 65 61 6c 20 39 2e 32  e+18 \. real 9.2
f6b0: 32 33 33 37 32 30 33 36 38 35 34 37 38 65 2b 31  2337203685478e+1
f6c0: 38 20 5c 0a 20 72 65 61 6c 20 39 2e 32 32 33 33  8 \. real 9.2233
f6d0: 37 32 30 33 36 38 35 34 37 38 65 2b 31 38 20 5c  7203685478e+18 \
f6e0: 0a 20 72 65 61 6c 20 2d 35 2e 30 20 5c 0a 20 72  . real -5.0 \. r
f6f0: 65 61 6c 20 2d 35 2e 30 20 5c 0a 5d 0a 0a 23 20  eal -5.0 \.]..# 
f700: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
f710: 34 35 35 30 2d 32 39 31 39 31 20 4e 6f 74 65 20  4550-29191 Note 
f720: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
f730: 66 72 6f 6d 20 63 61 73 74 69 6e 67 20 61 6e 79  from casting any
f740: 0a 23 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75  .# non-BLOB valu
f750: 65 20 69 6e 74 6f 20 61 20 42 4c 4f 42 20 61 6e  e into a BLOB an
f760: 64 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f  d the result fro
f770: 6d 20 63 61 73 74 69 6e 67 20 61 6e 79 20 42 4c  m casting any BL
f780: 4f 42 20 76 61 6c 75 65 0a 23 20 69 6e 74 6f 20  OB value.# into 
f790: 61 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65  a non-BLOB value
f7a0: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
f7b0: 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  t depending on w
f7c0: 68 65 74 68 65 72 20 74 68 65 0a 23 20 64 61 74  hether the.# dat
f7d0: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 69  abase encoding i
f7e0: 73 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 62  s UTF-8, UTF-16b
f7f0: 65 2c 20 6f 72 20 55 54 46 2d 31 36 6c 65 2e 0a  e, or UTF-16le..
f800: 23 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66  #.ifcapable {utf
f810: 31 36 7d 20 7b 0a 73 71 6c 69 74 65 33 20 64 62  16} {.sqlite3 db
f820: 31 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 31  1 :memory: ; db1
f830: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65   eval { PRAGMA e
f840: 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 38  ncoding = 'utf-8
f850: 27 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 32 20  ' }.sqlite3 db2 
f860: 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 32 20 65  :memory: ; db2 e
f870: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63  val { PRAGMA enc
f880: 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c  oding = 'utf-16l
f890: 65 27 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 33  e' }.sqlite3 db3
f8a0: 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 33 20   :memory: ; db3 
f8b0: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e  eval { PRAGMA en
f8c0: 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36  coding = 'utf-16
f8d0: 62 65 27 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74  be' }.foreach {t
f8e0: 6e 20 63 61 73 74 65 78 70 72 20 64 69 66 66 65  n castexpr diffe
f8f0: 72 73 7d 20 7b 0a 20 20 31 20 7b 20 43 41 53 54  rs} {.  1 { CAST
f900: 28 31 32 33 20 41 53 20 42 4c 4f 42 29 20 20 20  (123 AS BLOB)   
f910: 20 7d 20 31 0a 20 20 32 20 7b 20 43 41 53 54 28   } 1.  2 { CAST(
f920: 27 27 20 41 53 20 42 4c 4f 42 29 20 20 20 20 20  '' AS BLOB)     
f930: 7d 20 30 0a 20 20 33 20 7b 20 43 41 53 54 28 27  } 0.  3 { CAST('
f940: 61 62 63 64 27 20 41 53 20 42 4c 4f 42 29 20 7d  abcd' AS BLOB) }
f950: 20 31 0a 0a 20 20 34 20 7b 20 43 41 53 54 28 58   1..  4 { CAST(X
f960: 27 61 62 63 64 27 20 41 53 20 54 45 58 54 29 20  'abcd' AS TEXT) 
f970: 7d 20 31 0a 20 20 35 20 7b 20 43 41 53 54 28 58  } 1.  5 { CAST(X
f980: 27 27 20 41 53 20 54 45 58 54 29 20 20 20 20 20  '' AS TEXT)     
f990: 7d 20 30 0a 7d 20 7b 0a 20 20 73 65 74 20 72 31  } 0.} {.  set r1
f9a0: 20 5b 64 62 31 20 65 76 61 6c 20 22 53 45 4c 45   [db1 eval "SELE
f9b0: 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74 65  CT typeof($caste
f9c0: 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61 73  xpr), quote($cas
f9d0: 74 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20 72  texpr)"].  set r
f9e0: 32 20 5b 64 62 32 20 65 76 61 6c 20 22 53 45 4c  2 [db2 eval "SEL
f9f0: 45 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74  ECT typeof($cast
fa00: 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61  expr), quote($ca
fa10: 73 74 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20  stexpr)"].  set 
fa20: 72 33 20 5b 64 62 33 20 65 76 61 6c 20 22 53 45  r3 [db3 eval "SE
fa30: 4c 45 43 54 20 74 79 70 65 6f 66 28 24 63 61 73  LECT typeof($cas
fa40: 74 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63  texpr), quote($c
fa50: 61 73 74 65 78 70 72 29 22 5d 0a 0a 20 20 69 66  astexpr)"]..  if
fa60: 20 7b 24 64 69 66 66 65 72 73 7d 20 7b 0a 20 20   {$differs} {.  
fa70: 20 20 73 65 74 20 72 65 73 20 5b 65 78 70 72 20    set res [expr 
fa80: 7b 24 72 31 21 3d 24 72 32 20 26 26 20 24 72 32  {$r1!=$r2 && $r2
fa90: 21 3d 24 72 33 7d 5d 0a 20 20 7d 20 65 6c 73 65  !=$r3}].  } else
faa0: 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b   {.    set res [
fab0: 65 78 70 72 20 7b 24 72 31 3d 3d 24 72 32 20 26  expr {$r1==$r2 &
fac0: 26 20 24 72 32 3d 3d 24 72 33 7d 5d 0a 20 20 7d  & $r2==$r3}].  }
fad0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 65 78  ..  do_test e_ex
fae0: 70 72 2d 33 33 2e 31 2e 24 74 6e 20 7b 73 65 74  pr-33.1.$tn {set
faf0: 20 72 65 73 7d 20 31 0a 7d 0a 64 62 31 20 63 6c   res} 1.}.db1 cl
fb00: 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 64 62  ose.db2 close.db
fb10: 33 20 63 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d 2d  3 close.}..#----
fb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb60: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61  -----.# Test sta
fb70: 74 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20  tements related 
fb80: 74 6f 20 74 68 65 20 45 58 49 53 54 53 20 61 6e  to the EXISTS an
fb90: 64 20 4e 4f 54 20 45 58 49 53 54 53 20 6f 70 65  d NOT EXISTS ope
fba0: 72 61 74 6f 72 73 2e 0a 23 0a 63 61 74 63 68 20  rators..#.catch 
fbb0: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72  { db close }.for
fbc0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
fbd0: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
fbe0: 2e 64 62 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  .db..do_execsql_
fbf0: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34 2e 31  test e_expr-34.1
fc00: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
fc10: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 49 4e  E t1(a, b);.  IN
fc20: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
fc30: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53  UES(1, 2);.  INS
fc40: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
fc50: 45 53 28 4e 55 4c 4c 2c 20 32 29 3b 0a 20 20 49  ES(NULL, 2);.  I
fc60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
fc70: 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20  LUES(1, NULL);. 
fc80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
fc90: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c  VALUES(NULL, NUL
fca0: 4c 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44  L);.} {}..# EVID
fcb0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 35 38 38  ENCE-OF: R-25588
fcc0: 2d 32 37 31 38 31 20 54 68 65 20 45 58 49 53 54  -27181 The EXIST
fcd0: 53 20 6f 70 65 72 61 74 6f 72 20 61 6c 77 61 79  S operator alway
fce0: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 6f  s evaluates to o
fcf0: 6e 65 0a 23 20 6f 66 20 74 68 65 20 69 6e 74 65  ne.# of the inte
fd00: 67 65 72 20 76 61 6c 75 65 73 20 30 20 61 6e 64  ger values 0 and
fd10: 20 31 2e 0a 23 0a 23 20 54 68 69 73 20 73 74 61   1..#.# This sta
fd20: 74 65 6d 65 6e 74 20 69 73 20 6e 6f 74 20 74 65  tement is not te
fd30: 73 74 65 64 20 62 79 20 69 74 73 65 6c 66 2e 20  sted by itself. 
fd40: 49 6e 73 74 65 61 64 2c 20 61 6c 6c 20 65 5f 65  Instead, all e_e
fd50: 78 70 72 2d 33 34 2e 2a 20 74 65 73 74 73 20 0a  xpr-34.* tests .
fd60: 23 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  # following this
fd70: 20 70 6f 69 6e 74 20 65 78 70 6c 69 63 69 74 6c   point explicitl
fd80: 79 20 74 65 73 74 20 74 68 61 74 20 73 70 65 63  y test that spec
fd90: 69 66 69 63 20 69 6e 76 6f 63 61 74 69 6f 6e 73  ific invocations
fda0: 20 6f 66 20 45 58 49 53 54 53 0a 23 20 72 65 74   of EXISTS.# ret
fdb0: 75 72 6e 20 65 69 74 68 65 72 20 69 6e 74 65 67  urn either integ
fdc0: 65 72 20 30 20 6f 72 20 69 6e 74 65 67 65 72 20  er 0 or integer 
fdd0: 31 2e 0a 23 0a 0a 23 20 45 56 49 44 45 4e 43 45  1..#..# EVIDENCE
fde0: 2d 4f 46 3a 20 52 2d 35 38 35 35 33 2d 36 33 37  -OF: R-58553-637
fdf0: 34 30 20 49 66 20 65 78 65 63 75 74 69 6e 67 20  40 If executing 
fe00: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
fe10: 6d 65 6e 74 20 73 70 65 63 69 66 69 65 64 0a 23  ment specified.#
fe20: 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 68 61   as the right-ha
fe30: 6e 64 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  nd operand of th
fe40: 65 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  e EXISTS operato
fe50: 72 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f  r would return o
fe60: 6e 65 20 6f 72 0a 23 20 6d 6f 72 65 20 72 6f 77  ne or.# more row
fe70: 73 2c 20 74 68 65 6e 20 74 68 65 20 45 58 49 53  s, then the EXIS
fe80: 54 53 20 6f 70 65 72 61 74 6f 72 20 65 76 61 6c  TS operator eval
fe90: 75 61 74 65 73 20 74 6f 20 31 2e 0a 23 0a 66 6f  uates to 1..#.fo
fea0: 72 65 61 63 68 20 7b 74 6e 20 65 78 70 72 7d 20  reach {tn expr} 
feb0: 7b 0a 20 20 20 20 31 20 7b 20 45 58 49 53 54 53  {.    1 { EXISTS
fec0: 20 28 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   ( SELECT a FROM
fed0: 20 74 31 20 29 20 7d 0a 20 20 20 20 32 20 7b 20   t1 ) }.    2 { 
fee0: 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
fef0: 62 20 46 52 4f 4d 20 74 31 20 29 20 7d 0a 20 20  b FROM t1 ) }.  
ff00: 20 20 33 20 7b 20 45 58 49 53 54 53 20 28 20 53    3 { EXISTS ( S
ff10: 45 4c 45 43 54 20 32 34 20 29 20 7d 0a 20 20 20  ELECT 24 ) }.   
ff20: 20 34 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   4 { EXISTS ( SE
ff30: 4c 45 43 54 20 4e 55 4c 4c 20 29 20 7d 0a 20 20  LECT NULL ) }.  
ff40: 20 20 35 20 7b 20 45 58 49 53 54 53 20 28 20 53    5 { EXISTS ( S
ff50: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
ff60: 57 48 45 52 45 20 61 20 49 53 20 4e 55 4c 4c 20  WHERE a IS NULL 
ff70: 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70  ) }.} {.  do_exp
ff80: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34  r_test e_expr-34
ff90: 2e 32 2e 24 74 6e 20 24 65 78 70 72 20 69 6e 74  .2.$tn $expr int
ffa0: 65 67 65 72 20 31 0a 7d 0a 0a 23 20 45 56 49 44  eger 1.}..# EVID
ffb0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 36 37 33  ENCE-OF: R-19673
ffc0: 2d 34 30 39 37 32 20 49 66 20 65 78 65 63 75 74  -40972 If execut
ffd0: 69 6e 67 20 74 68 65 20 53 45 4c 45 43 54 20 77  ing the SELECT w
ffe0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f 0a 23  ould return no.#
fff0: 20 72 6f 77 73 20 61 74 20 61 6c 6c 2c 20 74 68   rows at all, th
10000 65 6e 20 74 68 65 20 45 58 49 53 54 53 20 6f 70  en the EXISTS op
10010 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73  erator evaluates
10020 20 74 6f 20 30 2e 0a 23 0a 66 6f 72 65 61 63 68   to 0..#.foreach
10030 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20   {tn expr} {.   
10040 20 31 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   1 { EXISTS ( SE
10050 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57  LECT a FROM t1 W
10060 48 45 52 45 20 30 29 20 7d 0a 20 20 20 20 32 20  HERE 0) }.    2 
10070 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43  { EXISTS ( SELEC
10080 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T b FROM t1 WHER
10090 45 20 61 20 3d 20 35 29 20 7d 0a 20 20 20 20 33  E a = 5) }.    3
100a0 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45   { EXISTS ( SELE
100b0 43 54 20 32 34 20 57 48 45 52 45 20 30 29 20 7d  CT 24 WHERE 0) }
100c0 0a 20 20 20 20 34 20 7b 20 45 58 49 53 54 53 20  .    4 { EXISTS 
100d0 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 57 48  ( SELECT NULL WH
100e0 45 52 45 20 31 3d 32 29 20 7d 0a 7d 20 7b 0a 20  ERE 1=2) }.} {. 
100f0 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f   do_expr_test e_
10100 65 78 70 72 2d 33 34 2e 33 2e 24 74 6e 20 24 65  expr-34.3.$tn $e
10110 78 70 72 20 69 6e 74 65 67 65 72 20 30 0a 7d 0a  xpr integer 0.}.
10120 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
10130 52 2d 33 35 31 30 39 2d 34 39 31 33 39 20 54 68  R-35109-49139 Th
10140 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
10150 6d 6e 73 20 69 6e 20 65 61 63 68 20 72 6f 77 20  mns in each row 
10160 72 65 74 75 72 6e 65 64 0a 23 20 62 79 20 74 68  returned.# by th
10170 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
10180 6e 74 20 28 69 66 20 61 6e 79 29 20 61 6e 64 20  nt (if any) and 
10190 74 68 65 20 73 70 65 63 69 66 69 63 20 76 61 6c  the specific val
101a0 75 65 73 20 72 65 74 75 72 6e 65 64 20 68 61 76  ues returned hav
101b0 65 0a 23 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e  e.# no effect on
101c0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
101d0 74 68 65 20 45 58 49 53 54 53 20 6f 70 65 72 61  the EXISTS opera
101e0 74 6f 72 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  tor..#.foreach {
101f0 74 6e 20 65 78 70 72 20 72 65 73 7d 20 7b 0a 20  tn expr res} {. 
10200 20 20 20 31 20 7b 20 45 58 49 53 54 53 20 28 20     1 { EXISTS ( 
10210 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
10220 20 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20   ) }            
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
10240 20 20 20 20 32 20 7b 20 45 58 49 53 54 53 20 28      2 { EXISTS (
10250 20 53 45 4c 45 43 54 20 2a 2c 20 2a 2c 20 2a 20   SELECT *, *, * 
10260 46 52 4f 4d 20 74 31 20 29 20 7d 20 20 20 20 20  FROM t1 ) }     
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
10280 0a 20 20 20 20 33 20 7b 20 45 58 49 53 54 53 20  .    3 { EXISTS 
10290 28 20 53 45 4c 45 43 54 20 32 34 2c 20 32 35 20  ( SELECT 24, 25 
102a0 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ) }             
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 31 0a 20 20 20 20 34 20 7b 20 45 58 49 53 54 53  1.    4 { EXISTS
102d0 20 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   ( SELECT NULL, 
102e0 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 29 20 7d 20 20  NULL, NULL ) }  
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 31 0a 20 20 20 20 35 20 7b 20 45 58 49 53 54   1.    5 { EXIST
10310 53 20 28 20 53 45 4c 45 43 54 20 61 2c 62 2c 61  S ( SELECT a,b,a
10320 7c 7c 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ||b FROM t1 WHER
10330 45 20 61 20 49 53 20 4e 55 4c 4c 20 29 20 7d 20  E a IS NULL ) } 
10340 20 20 31 0a 0a 20 20 20 20 36 20 7b 20 45 58 49    1..    6 { EXI
10350 53 54 53 20 28 20 53 45 4c 45 43 54 20 61 2c 20  STS ( SELECT a, 
10360 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
10370 30 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0) }            
10380 20 20 20 20 30 0a 20 20 20 20 37 20 7b 20 45 58      0.    7 { EX
10390 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 62 2c  ISTS ( SELECT b,
103a0 20 62 2c 20 61 20 46 52 4f 4d 20 74 31 20 57 48   b, a FROM t1 WH
103b0 45 52 45 20 61 20 3d 20 35 29 20 7d 20 20 20 20  ERE a = 5) }    
103c0 20 20 20 20 20 30 0a 20 20 20 20 38 20 7b 20 45       0.    8 { E
103d0 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 32  XISTS ( SELECT 2
103e0 34 2c 20 34 36 2c 20 38 39 20 57 48 45 52 45 20  4, 46, 89 WHERE 
103f0 30 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0) }            
10400 20 20 20 20 20 20 30 0a 20 20 20 20 39 20 7b 20        0.    9 { 
10410 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
10420 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 57 48 45 52 45  NULL, NULL WHERE
10430 20 31 3d 32 29 20 7d 20 20 20 20 20 20 20 20 20   1=2) }         
10440 20 20 20 20 20 20 20 30 0a 7d 20 7b 0a 20 20 64         0.} {.  d
10450 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
10460 70 72 2d 33 34 2e 34 2e 24 74 6e 20 24 65 78 70  pr-34.4.$tn $exp
10470 72 20 69 6e 74 65 67 65 72 20 24 72 65 73 0a 7d  r integer $res.}
10480 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
10490 20 52 2d 31 30 36 34 35 2d 31 32 34 33 39 20 49   R-10645-12439 I
104a0 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 72 6f  n particular, ro
104b0 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55  ws containing NU
104c0 4c 4c 20 76 61 6c 75 65 73 0a 23 20 61 72 65 20  LL values.# are 
104d0 6e 6f 74 20 68 61 6e 64 6c 65 64 20 61 6e 79 20  not handled any 
104e0 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
104f0 20 72 6f 77 73 20 77 69 74 68 6f 75 74 20 4e 55   rows without NU
10500 4c 4c 20 76 61 6c 75 65 73 2e 0a 23 0a 66 6f 72  LL values..#.for
10510 65 61 63 68 20 7b 74 6e 20 65 31 20 65 32 7d 20  each {tn e1 e2} 
10520 7b 0a 20 20 31 20 7b 20 45 58 49 53 54 53 20 28  {.  1 { EXISTS (
10530 53 45 4c 45 43 54 20 27 6e 6f 74 20 6e 75 6c 6c  SELECT 'not null
10540 27 29 20 7d 20 20 20 20 7b 20 45 58 49 53 54 53  ') }    { EXISTS
10550 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d   (SELECT NULL) }
10560 0a 20 20 32 20 7b 20 45 58 49 53 54 53 20 28 53  .  2 { EXISTS (S
10570 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20  ELECT NULL FROM 
10580 74 31 29 20 7d 20 20 7b 20 45 58 49 53 54 53 20  t1) }  { EXISTS 
10590 28 53 45 4c 45 43 54 20 27 62 72 65 61 64 27 20  (SELECT 'bread' 
105a0 46 52 4f 4d 20 74 31 29 20 7d 0a 7d 20 7b 0a 20  FROM t1) }.} {. 
105b0 20 73 65 74 20 72 65 73 20 5b 64 62 20 6f 6e 65   set res [db one
105c0 20 22 53 45 4c 45 43 54 20 24 65 31 22 5d 0a 20   "SELECT $e1"]. 
105d0 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f   do_expr_test e_
105e0 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d 61  expr-34.5.${tn}a
105f0 20 24 65 31 20 69 6e 74 65 67 65 72 20 24 72 65   $e1 integer $re
10600 73 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  s.  do_expr_test
10610 20 65 5f 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74   e_expr-34.5.${t
10620 6e 7d 62 20 24 65 32 20 69 6e 74 65 67 65 72 20  n}b $e2 integer 
10630 24 72 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  $res.}..#-------
10640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10680 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65 6d  --.# Test statem
10690 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20  ents related to 
106a0 73 63 61 6c 61 72 20 73 75 62 2d 71 75 65 72 69  scalar sub-queri
106b0 65 73 2e 0a 23 0a 0a 63 61 74 63 68 20 7b 20 64  es..#..catch { d
106c0 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64  b close }.forced
106d0 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 73 71  elete test.db.sq
106e0 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
106f0 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  .do_test e_expr-
10700 33 35 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  35.0 {.  execsql
10710 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
10720 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
10730 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
10740 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27   VALUES('one', '
10750 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  two');.    INSER
10760 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
10770 28 27 74 68 72 65 65 27 2c 20 4e 55 4c 4c 29 3b  ('three', NULL);
10780 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
10790 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20 35 2e   t2 VALUES(4, 5.
107a0 30 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20  0);.  }.} {}..# 
107b0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
107c0 33 35 37 33 2d 32 33 34 34 38 20 41 20 53 45 4c  3573-23448 A SEL
107d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 65 6e  ECT statement en
107e0 63 6c 6f 73 65 64 20 69 6e 20 70 61 72 65 6e 74  closed in parent
107f0 68 65 73 65 73 0a 23 20 69 73 20 61 20 73 75 62  heses.# is a sub
10800 71 75 65 72 79 2e 0a 23 0a 23 20 45 56 49 44 45  query..#.# EVIDE
10810 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 32 39 34 2d  NCE-OF: R-56294-
10820 30 33 39 36 36 20 41 6c 6c 20 74 79 70 65 73 20  03966 All types 
10830 6f 66 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  of SELECT statem
10840 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 0a 23  ent, including.#
10850 20 61 67 67 72 65 67 61 74 65 20 61 6e 64 20 63   aggregate and c
10860 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 71  ompound SELECT q
10870 75 65 72 69 65 73 20 28 71 75 65 72 69 65 73 20  ueries (queries 
10880 77 69 74 68 20 6b 65 79 77 6f 72 64 73 20 6c 69  with keywords li
10890 6b 65 0a 23 20 55 4e 49 4f 4e 20 6f 72 20 45 58  ke.# UNION or EX
108a0 43 45 50 54 29 20 61 72 65 20 61 6c 6c 6f 77 65  CEPT) are allowe
108b0 64 20 61 73 20 73 63 61 6c 61 72 20 73 75 62 71  d as scalar subq
108c0 75 65 72 69 65 73 2e 0a 23 0a 64 6f 5f 65 78 70  ueries..#.do_exp
108d0 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35  r_test e_expr-35
108e0 2e 31 2e 31 20 7b 20 28 53 45 4c 45 43 54 20 33  .1.1 { (SELECT 3
108f0 35 29 20 20 20 7d 20 69 6e 74 65 67 65 72 20 33  5)   } integer 3
10900 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  5.do_expr_test e
10910 5f 65 78 70 72 2d 33 35 2e 31 2e 32 20 7b 20 28  _expr-35.1.2 { (
10920 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d 20 6e  SELECT NULL) } n
10930 75 6c 6c 20 7b 7d 0a 0a 64 6f 5f 65 78 70 72 5f  ull {}..do_expr_
10940 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31  test e_expr-35.1
10950 2e 33 20 7b 20 28 53 45 4c 45 43 54 20 63 6f 75  .3 { (SELECT cou
10960 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 7d  nt(*) FROM t2) }
10970 20 69 6e 74 65 67 65 72 20 33 0a 64 6f 5f 65 78   integer 3.do_ex
10980 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
10990 35 2e 31 2e 34 20 7b 20 28 53 45 4c 45 43 54 20  5.1.4 { (SELECT 
109a0 34 20 46 52 4f 4d 20 74 32 29 20 7d 20 69 6e 74  4 FROM t2) } int
109b0 65 67 65 72 20 34 0a 0a 64 6f 5f 65 78 70 72 5f  eger 4..do_expr_
109c0 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31  test e_expr-35.1
109d0 2e 35 20 7b 20 0a 20 20 28 53 45 4c 45 43 54 20  .5 { .  (SELECT 
109e0 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
109f0 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
10a00 74 32 29 0a 7d 20 6e 75 6c 6c 20 7b 7d 0a 64 6f  t2).} null {}.do
10a10 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
10a20 72 2d 33 35 2e 31 2e 36 20 7b 20 0a 20 20 28 53  r-35.1.6 { .  (S
10a30 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 32 20  ELECT a FROM t2 
10a40 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 43 4f 41  UNION SELECT COA
10a50 4c 45 53 43 45 28 62 2c 20 35 35 29 20 46 52 4f  LESCE(b, 55) FRO
10a60 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 31 29  M t2 ORDER BY 1)
10a70 0a 7d 20 69 6e 74 65 67 65 72 20 34 0a 0a 23 20  .} integer 4..# 
10a80 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
10a90 32 32 33 39 2d 33 33 37 34 30 20 41 20 73 75 62  2239-33740 A sub
10aa0 71 75 65 72 79 20 74 68 61 74 20 72 65 74 75 72  query that retur
10ab0 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  ns two or more c
10ac0 6f 6c 75 6d 6e 73 0a 23 20 69 73 20 61 20 72 6f  olumns.# is a ro
10ad0 77 20 76 61 6c 75 65 20 73 75 62 71 75 65 72 79  w value subquery
10ae0 20 61 6e 64 20 63 61 6e 20 6f 6e 6c 79 20 62 65   and can only be
10af0 20 75 73 65 64 20 61 73 20 74 68 65 20 6f 70 65   used as the ope
10b00 72 61 6e 64 20 6f 66 20 61 0a 23 20 63 6f 6d 70  rand of a.# comp
10b10 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
10b20 0a 23 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  .#.# The followi
10b30 6e 67 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 74  ng block tests t
10b40 68 61 74 20 65 72 72 6f 72 73 20 61 72 65 20 72  hat errors are r
10b50 65 74 75 72 6e 65 64 20 69 6e 20 61 20 62 75 6e  eturned in a bun
10b60 63 68 20 6f 66 20 63 61 73 65 73 0a 23 20 77 68  ch of cases.# wh
10b70 65 72 65 20 61 20 73 75 62 71 75 65 72 79 20 72  ere a subquery r
10b80 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
10b90 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 73   one column..#.s
10ba0 65 74 20 4d 20 7b 2f 31 20 7b 73 75 62 2d 73 65  et M {/1 {sub-se
10bb0 6c 65 63 74 20 72 65 74 75 72 6e 73 20 5b 32 33  lect returns [23
10bc0 5d 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  ] columns - expe
10bd0 63 74 65 64 20 31 7d 2f 7d 0a 66 6f 72 65 61 63  cted 1}/}.foreac
10be0 68 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20 31  h {tn sql} {.  1
10bf0 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20 28 53       { SELECT (S
10c00 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
10c10 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61 2b 31  UNION SELECT a+1
10c20 2c 20 62 2b 31 20 46 52 4f 4d 20 74 32 29 20 7d  , b+1 FROM t2) }
10c30 0a 20 20 32 20 20 20 20 20 7b 20 53 45 4c 45 43  .  2     { SELEC
10c40 54 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  T (SELECT * FROM
10c50 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
10c60 20 61 2b 31 2c 20 62 2b 31 20 46 52 4f 4d 20 74   a+1, b+1 FROM t
10c70 32 20 4f 52 44 45 52 20 42 59 20 31 29 20 7d 0a  2 ORDER BY 1) }.
10c80 20 20 33 20 20 20 20 20 7b 20 53 45 4c 45 43 54    3     { SELECT
10c90 20 28 53 45 4c 45 43 54 20 31 2c 20 32 29 20 7d   (SELECT 1, 2) }
10ca0 0a 20 20 34 20 20 20 20 20 7b 20 53 45 4c 45 43  .  4     { SELEC
10cb0 54 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  T (SELECT NULL, 
10cc0 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 20 7d 0a 20 20  NULL, NULL) }.  
10cd0 35 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20 28  5     { SELECT (
10ce0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
10cf0 29 20 7d 0a 20 20 36 20 20 20 20 20 7b 20 53 45  ) }.  6     { SE
10d00 4c 45 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46  LECT (SELECT * F
10d10 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 2c 20 32  ROM (SELECT 1, 2
10d20 2c 20 33 29 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f  , 3)) }.} {.  do
10d30 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
10d40 5f 65 78 70 72 2d 33 35 2e 32 2e 24 74 6e 20 24  _expr-35.2.$tn $
10d50 73 71 6c 20 24 4d 0a 7d 0a 0a 23 20 45 56 49 44  sql $M.}..# EVID
10d60 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 33 31 38  ENCE-OF: R-18318
10d70 2d 31 34 39 39 35 20 54 68 65 20 76 61 6c 75 65  -14995 The value
10d80 20 6f 66 20 61 20 73 75 62 71 75 65 72 79 20 65   of a subquery e
10d90 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
10da0 0a 23 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  .# first row of 
10db0 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d 20  the result from 
10dc0 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 53 45 4c  the enclosed SEL
10dd0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23  ECT statement..#
10de0 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
10df0 52 2d 31 35 39 30 30 2d 35 32 31 35 36 20 49 6e  R-15900-52156 In
10e00 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 6e   other words, an
10e10 20 69 6d 70 6c 69 65 64 20 22 4c 49 4d 49 54 20   implied "LIMIT 
10e20 31 22 20 69 73 0a 23 20 61 64 64 65 64 20 74 6f  1" is.# added to
10e30 20 74 68 65 20 73 75 62 71 75 65 72 79 2c 20 6f   the subquery, o
10e40 76 65 72 72 69 64 69 6e 67 20 61 6e 20 65 78 70  verriding an exp
10e50 6c 69 63 69 74 6c 79 20 63 6f 64 65 64 20 4c 49  licitly coded LI
10e60 4d 49 54 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  MIT..#.do_execsq
10e70 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 36  l_test e_expr-36
10e80 2e 33 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  .3.1 {.  CREATE 
10e90 54 41 42 4c 45 20 74 34 28 78 2c 20 79 29 3b 0a  TABLE t4(x, y);.
10ea0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
10eb0 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27   VALUES(1, 'one'
10ec0 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
10ed0 20 74 34 20 56 41 4c 55 45 53 28 32 2c 20 27 74   t4 VALUES(2, 't
10ee0 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  wo');.  INSERT I
10ef0 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 33 2c  NTO t4 VALUES(3,
10f00 20 27 74 68 72 65 65 27 29 3b 0a 7d 20 7b 7d 0a   'three');.} {}.
10f10 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 65 78 70  .foreach {tn exp
10f20 72 20 72 65 73 74 79 70 65 20 72 65 73 76 61 6c  r restype resval
10f30 7d 20 7b 0a 20 20 20 20 32 20 20 7b 20 28 20 53  } {.    2  { ( S
10f40 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20  ELECT x FROM t4 
10f50 4f 52 44 45 52 20 42 59 20 78 20 29 20 20 20 20  ORDER BY x )    
10f60 20 20 7d 20 20 20 20 20 20 20 20 69 6e 74 65 67    }        integ
10f70 65 72 20 31 0a 20 20 20 20 33 20 20 7b 20 28 20  er 1.    3  { ( 
10f80 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34  SELECT x FROM t4
10f90 20 4f 52 44 45 52 20 42 59 20 79 20 29 20 20 20   ORDER BY y )   
10fa0 20 20 20 7d 20 20 20 20 20 20 20 20 69 6e 74 65     }        inte
10fb0 67 65 72 20 31 0a 20 20 20 20 34 20 20 7b 20 28  ger 1.    4  { (
10fc0 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
10fd0 34 20 4f 52 44 45 52 20 42 59 20 78 20 44 45 53  4 ORDER BY x DES
10fe0 43 20 29 20 7d 20 20 20 20 20 20 20 20 69 6e 74  C ) }        int
10ff0 65 67 65 72 20 33 0a 20 20 20 20 35 20 20 7b 20  eger 3.    5  { 
11000 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20  ( SELECT x FROM 
11010 74 34 20 4f 52 44 45 52 20 42 59 20 79 20 44 45  t4 ORDER BY y DE
11020 53 43 20 29 20 7d 20 20 20 20 20 20 20 20 69 6e  SC ) }        in
11030 74 65 67 65 72 20 32 0a 20 20 20 20 36 20 20 7b  teger 2.    6  {
11040 20 28 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d   ( SELECT y FROM
11050 20 74 34 20 4f 52 44 45 52 20 42 59 20 79 20 44   t4 ORDER BY y D
11060 45 53 43 20 29 20 7d 20 20 20 20 20 20 20 20 74  ESC ) }        t
11070 65 78 74 20 20 20 20 74 77 6f 0a 0a 20 20 20 20  ext    two..    
11080 37 20 20 7b 20 28 20 53 45 4c 45 43 54 20 73 75  7  { ( SELECT su
11090 6d 28 78 29 20 46 52 4f 4d 20 74 34 20 29 20 20  m(x) FROM t4 )  
110a0 20 20 20 20 20 20 20 20 20 7d 20 20 20 20 20 20           }      
110b0 20 20 20 69 6e 74 65 67 65 72 20 36 0a 20 20 20     integer 6.   
110c0 20 38 20 20 7b 20 28 20 53 45 4c 45 43 54 20 67   8  { ( SELECT g
110d0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 79 2c 27 27  roup_concat(y,''
110e0 29 20 46 52 4f 4d 20 74 34 20 29 20 7d 20 20 20  ) FROM t4 ) }   
110f0 20 20 20 20 74 65 78 74 20 20 20 20 6f 6e 65 74      text    onet
11100 77 6f 74 68 72 65 65 0a 20 20 20 20 39 20 20 7b  wothree.    9  {
11110 20 28 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29   ( SELECT max(x)
11120 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 79   FROM t4 WHERE y
11130 20 4c 49 4b 45 20 27 5f 5f 5f 27 29 20 7d 20 69   LIKE '___') } i
11140 6e 74 65 67 65 72 20 32 20 0a 0a 7d 20 7b 0a 20  nteger 2 ..} {. 
11150 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f   do_expr_test e_
11160 65 78 70 72 2d 33 36 2e 33 2e 24 74 6e 20 24 65  expr-36.3.$tn $e
11170 78 70 72 20 24 72 65 73 74 79 70 65 20 24 72 65  xpr $restype $re
11180 73 76 61 6c 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  sval.}..# EVIDEN
11190 43 45 2d 4f 46 3a 20 52 2d 35 32 33 32 35 2d 32  CE-OF: R-52325-2
111a0 35 34 34 39 20 54 68 65 20 76 61 6c 75 65 20 6f  5449 The value o
111b0 66 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70  f a subquery exp
111c0 72 65 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 0a  ression is NULL.
111d0 23 20 69 66 20 74 68 65 20 65 6e 63 6c 6f 73 65  # if the enclose
111e0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
111f0 6e 74 20 72 65 74 75 72 6e 73 20 6e 6f 20 72 6f  nt returns no ro
11200 77 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  ws..#.foreach {t
11210 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20 20 31 20  n expr} {.    1 
11220 20 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46 52   { ( SELECT x FR
11230 4f 4d 20 74 34 20 57 48 45 52 45 20 78 3e 33 20  OM t4 WHERE x>3 
11240 4f 52 44 45 52 20 42 59 20 78 20 29 20 20 20 20  ORDER BY x )    
11250 20 20 7d 0a 20 20 20 20 32 20 20 7b 20 28 20 53    }.    2  { ( S
11260 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20  ELECT x FROM t4 
11270 57 48 45 52 45 20 79 3c 27 6f 6e 65 27 20 4f 52  WHERE y<'one' OR
11280 44 45 52 20 42 59 20 79 20 29 20 20 7d 0a 7d 20  DER BY y )  }.} 
11290 7b 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  {.  do_expr_test
112a0 20 65 5f 65 78 70 72 2d 33 36 2e 34 2e 24 74 6e   e_expr-36.4.$tn
112b0 20 24 65 78 70 72 20 6e 75 6c 6c 20 7b 7d 0a 7d   $expr null {}.}
112c0 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
112d0 20 52 2d 36 32 34 37 37 2d 30 36 34 37 36 20 46   R-62477-06476 F
112e0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
112f0 76 61 6c 75 65 73 20 4e 55 4c 4c 2c 20 30 2e 30  values NULL, 0.0
11300 2c 20 30 2c 0a 23 20 27 65 6e 67 6c 69 73 68 27  , 0,.# 'english'
11310 20 61 6e 64 20 27 30 27 20 61 72 65 20 61 6c 6c   and '0' are all
11320 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
11330 65 20 66 61 6c 73 65 2e 0a 23 0a 64 6f 5f 65 78  e false..#.do_ex
11340 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
11350 72 2d 33 37 2e 31 20 7b 0a 20 20 20 53 45 4c 45  r-37.1 {.   SELE
11360 43 54 20 43 41 53 45 20 57 48 45 4e 20 4e 55 4c  CT CASE WHEN NUL
11370 4c 20 54 48 45 4e 20 27 74 72 75 65 27 20 45 4c  L THEN 'true' EL
11380 53 45 20 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a  SE 'false' END;.
11390 7d 20 7b 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65  } {false}.do_exe
113a0 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
113b0 2d 33 37 2e 32 20 7b 0a 20 20 20 53 45 4c 45 43  -37.2 {.   SELEC
113c0 54 20 43 41 53 45 20 57 48 45 4e 20 30 2e 30 20  T CASE WHEN 0.0 
113d0 54 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45  THEN 'true' ELSE
113e0 20 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20   'false' END;.} 
113f0 7b 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63 73  {false}.do_execs
11400 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  ql_test e_expr-3
11410 37 2e 33 20 7b 0a 20 20 20 53 45 4c 45 43 54 20  7.3 {.   SELECT 
11420 43 41 53 45 20 57 48 45 4e 20 30 20 54 48 45 4e  CASE WHEN 0 THEN
11430 20 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61   'true' ELSE 'fa
11440 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66 61 6c  lse' END;.} {fal
11450 73 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  se}.do_execsql_t
11460 65 73 74 20 65 5f 65 78 70 72 2d 33 37 2e 34 20  est e_expr-37.4 
11470 7b 0a 20 20 20 53 45 4c 45 43 54 20 43 41 53 45  {.   SELECT CASE
11480 20 57 48 45 4e 20 27 65 6e 67 6c 69 67 68 27 20   WHEN 'engligh' 
11490 54 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45  THEN 'true' ELSE
114a0 20 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20   'false' END;.} 
114b0 7b 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63 73  {false}.do_execs
114c0 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  ql_test e_expr-3
114d0 37 2e 35 20 7b 0a 20 20 20 53 45 4c 45 43 54 20  7.5 {.   SELECT 
114e0 43 41 53 45 20 57 48 45 4e 20 27 30 27 20 54 48  CASE WHEN '0' TH
114f0 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20 27  EN 'true' ELSE '
11500 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66  false' END;.} {f
11510 61 6c 73 65 7d 0a 0a 23 20 45 56 49 44 45 4e 43  alse}..# EVIDENC
11520 45 2d 4f 46 3a 20 52 2d 35 35 35 33 32 2d 31 30  E-OF: R-55532-10
11530 31 30 38 20 56 61 6c 75 65 73 20 31 2c 20 31 2e  108 Values 1, 1.
11540 30 2c 20 30 2e 31 2c 20 2d 30 2e 31 20 61 6e 64  0, 0.1, -0.1 and
11550 20 27 31 65 6e 67 6c 69 73 68 27 20 61 72 65 0a   '1english' are.
11560 23 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  # considered to 
11570 62 65 20 74 72 75 65 2e 0a 23 0a 64 6f 5f 65 78  be true..#.do_ex
11580 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
11590 72 2d 33 37 2e 36 20 7b 0a 20 20 20 53 45 4c 45  r-37.6 {.   SELE
115a0 43 54 20 43 41 53 45 20 57 48 45 4e 20 31 20 54  CT CASE WHEN 1 T
115b0 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20  HEN 'true' ELSE 
115c0 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b  'false' END;.} {
115d0 74 72 75 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  true}.do_execsql
115e0 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37 2e  _test e_expr-37.
115f0 37 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43 41  7 {.   SELECT CA
11600 53 45 20 57 48 45 4e 20 31 2e 30 20 54 48 45 4e  SE WHEN 1.0 THEN
11610 20 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61   'true' ELSE 'fa
11620 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75  lse' END;.} {tru
11630 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e}.do_execsql_te
11640 73 74 20 65 5f 65 78 70 72 2d 33 37 2e 38 20 7b  st e_expr-37.8 {
11650 0a 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  .   SELECT CASE 
11660 57 48 45 4e 20 30 2e 31 20 54 48 45 4e 20 27 74  WHEN 0.1 THEN 't
11670 72 75 65 27 20 45 4c 53 45 20 27 66 61 6c 73 65  rue' ELSE 'false
11680 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a  ' END;.} {true}.
11690 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
116a0 65 5f 65 78 70 72 2d 33 37 2e 39 20 7b 0a 20 20  e_expr-37.9 {.  
116b0 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
116c0 4e 20 2d 30 2e 31 20 54 48 45 4e 20 27 74 72 75  N -0.1 THEN 'tru
116d0 65 27 20 45 4c 53 45 20 27 66 61 6c 73 65 27 20  e' ELSE 'false' 
116e0 45 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a 64 6f  END;.} {true}.do
116f0 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
11700 65 78 70 72 2d 33 37 2e 31 30 20 7b 0a 20 20 20  expr-37.10 {.   
11710 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
11720 20 27 31 65 6e 67 6c 69 73 68 27 20 54 48 45 4e   '1english' THEN
11730 20 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61   'true' ELSE 'fa
11740 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75  lse' END;.} {tru
11750 65 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  e}...finish_test
11760 0a                                               .