/ Hex Artifact Content
Login

Artifact 8f5fdd7261e2d746813b0c6a1c0e34824ad3c5ad:


0000: 23 20 32 30 31 30 20 4a 75 6c 79 20 31 36 0a 23  # 2010 July 16.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 23 20 54 68 69 73 20 66 69  ****.#.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65  le implements te
0180: 73 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  sts to verify th
0190: 61 74 20 74 68 65 20 22 74 65 73 74 61 62 6c 65  at the "testable
01a0: 20 73 74 61 74 65 6d 65 6e 74 73 22 20 69 6e 20   statements" in 
01b0: 0a 23 20 74 68 65 20 6c 61 6e 67 5f 65 78 70 72  .# the lang_expr
01c0: 2e 68 74 6d 6c 20 64 6f 63 75 6d 65 6e 74 20 61  .html document a
01d0: 72 65 20 63 6f 72 72 65 63 74 2e 0a 23 0a 0a 73  re correct..#..s
01e0: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
01f0: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
0200: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0210: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72  /tester.tcl.sour
0220: 63 65 20 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c  ce $testdir/mall
0230: 6f 63 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 69  oc_common.tcl..i
0240: 66 63 61 70 61 62 6c 65 20 21 63 6f 6d 70 6f 75  fcapable !compou
0250: 6e 64 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  nd {.  finish_te
0260: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70  st.  return.}..p
0270: 72 6f 63 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  roc do_expr_test
0280: 20 7b 74 6e 20 65 78 70 72 20 74 79 70 65 20 76   {tn expr type v
0290: 61 6c 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65  alue} {.  upleve
02a0: 6c 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l do_execsql_tes
02b0: 74 20 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c  t $tn [list "SEL
02c0: 45 43 54 20 74 79 70 65 6f 66 28 24 65 78 70 72  ECT typeof($expr
02d0: 29 2c 20 24 65 78 70 72 22 5d 20 5b 0a 20 20 20  ), $expr"] [.   
02e0: 20 6c 69 73 74 20 5b 6c 69 73 74 20 24 74 79 70   list [list $typ
02f0: 65 20 24 76 61 6c 75 65 5d 0a 20 20 5d 0a 7d 0a  e $value].  ].}.
0300: 0a 70 72 6f 63 20 64 6f 5f 71 65 78 70 72 5f 74  .proc do_qexpr_t
0310: 65 73 74 20 7b 74 6e 20 65 78 70 72 20 76 61 6c  est {tn expr val
0320: 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20  ue} {.  uplevel 
0330: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0340: 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c 45 43  $tn [list "SELEC
0350: 54 20 71 75 6f 74 65 28 24 65 78 70 72 29 22 5d  T quote($expr)"]
0360: 20 5b 6c 69 73 74 20 24 76 61 6c 75 65 5d 0a 7d   [list $value].}
0370: 0a 0a 23 20 53 65 74 20 75 70 20 74 68 72 65 65  ..# Set up three
0380: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0390: 73 3a 0a 23 0a 23 20 20 20 3a 3a 6f 70 6e 61 6d  s:.#.#   ::opnam
03a0: 65 20 20 20 20 20 20 20 20 20 41 6e 20 61 72 72  e         An arr
03b0: 61 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20  ay mapping from 
03c0: 53 51 4c 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  SQL operator to 
03d0: 61 6e 20 65 61 73 79 20 74 6f 20 70 61 72 73 65  an easy to parse
03e0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
03f0: 20 20 20 20 20 20 6e 61 6d 65 2e 20 54 68 65 20        name. The 
0400: 6e 61 6d 65 73 20 61 72 65 20 75 73 65 64 20 61  names are used a
0410: 73 20 70 61 72 74 20 6f 66 20 74 65 73 74 20 63  s part of test c
0420: 61 73 65 20 6e 61 6d 65 73 2e 0a 23 0a 23 20 20  ase names..#.#  
0430: 20 3a 3a 6f 70 70 72 65 63 20 20 20 20 20 20 20   ::opprec       
0440: 20 20 41 6e 20 61 72 72 61 79 20 6d 61 70 70 69    An array mappi
0450: 6e 67 20 66 72 6f 6d 20 53 51 4c 20 6f 70 65 72  ng from SQL oper
0460: 61 74 6f 72 20 74 6f 20 61 20 6e 75 6d 65 72 69  ator to a numeri
0470: 63 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  c.#             
0480: 20 20 20 20 20 20 20 70 72 65 63 65 64 65 6e 63         precedenc
0490: 65 20 76 61 6c 75 65 2e 20 4f 70 65 72 61 74 6f  e value. Operato
04a0: 72 73 20 74 68 61 74 20 67 72 6f 75 70 20 6d 6f  rs that group mo
04b0: 72 65 20 74 69 67 68 74 6c 79 0a 23 20 20 20 20  re tightly.#    
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 68 61 76 65 20 6c 6f 77 65 72 20 6e 75 6d 65 72  have lower numer
04e0: 69 63 20 70 72 65 63 65 64 65 6e 63 65 73 2e 0a  ic precedences..
04f0: 23 0a 23 20 20 20 3a 3a 6f 70 6c 69 73 74 20 20  #.#   ::oplist  
0500: 20 20 20 20 20 20 20 41 20 6c 69 73 74 20 6f 66         A list of
0510: 20 61 6c 6c 20 53 51 4c 20 6f 70 65 72 61 74 6f   all SQL operato
0520: 72 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  rs supported by 
0530: 53 51 4c 69 74 65 2e 0a 23 0a 66 6f 72 65 61 63  SQLite..#.foreac
0540: 68 20 7b 6f 70 20 6f 70 6e 7d 20 7b 0a 20 20 20  h {op opn} {.   
0550: 20 20 20 7c 7c 20 20 20 63 61 74 20 20 20 20 20     ||   cat     
0560: 2a 20 20 20 6d 75 6c 20 20 20 20 20 20 20 2f 20  *   mul       / 
0570: 20 64 69 76 20 20 20 20 20 20 20 25 20 20 20 20   div       %    
0580: 20 6d 6f 64 20 20 20 20 20 20 20 2b 20 20 20 20   mod       +    
0590: 20 20 61 64 64 0a 20 20 20 20 20 20 2d 20 20 20    add.      -   
05a0: 20 73 75 62 20 20 20 20 20 3c 3c 20 20 6c 73 68   sub     <<  lsh
05b0: 69 66 74 20 20 20 20 3e 3e 20 72 73 68 69 66 74  ift    >> rshift
05c0: 20 20 20 20 26 20 20 20 20 20 62 69 74 61 6e 64      &     bitand
05d0: 20 20 20 20 7c 20 20 20 20 20 20 62 69 74 6f 72      |      bitor
05e0: 0a 20 20 20 20 20 20 3c 20 20 20 20 6c 65 73 73  .      <    less
05f0: 20 20 20 20 3c 3d 20 20 6c 65 73 73 65 71 20 20      <=  lesseq  
0600: 20 20 3e 20 20 6d 6f 72 65 20 20 20 20 20 20 3e    >  more      >
0610: 3d 20 20 20 20 6d 6f 72 65 65 71 20 20 20 20 3d  =    moreeq    =
0620: 20 20 20 20 20 20 65 71 31 0a 20 20 20 20 20 20        eq1.      
0630: 3d 3d 20 20 20 65 71 32 20 20 20 20 20 3c 3e 20  ==   eq2     <> 
0640: 20 6e 65 31 20 20 20 20 20 20 20 21 3d 20 6e 65   ne1       != ne
0650: 32 20 20 20 20 20 20 20 49 53 20 20 20 20 69 73  2       IS    is
0660: 20 20 20 20 20 20 20 20 4c 49 4b 45 20 20 20 6c          LIKE   l
0670: 69 6b 65 0a 20 20 20 20 20 20 47 4c 4f 42 20 67  ike.      GLOB g
0680: 6c 6f 62 20 20 20 20 41 4e 44 20 61 6e 64 20 20  lob    AND and  
0690: 20 20 20 20 20 4f 52 20 6f 72 20 20 20 20 20 20       OR or      
06a0: 20 20 4d 41 54 43 48 20 6d 61 74 63 68 20 20 20    MATCH match   
06b0: 20 20 52 45 47 45 58 50 20 72 65 67 65 78 70 0a    REGEXP regexp.
06c0: 20 20 20 20 20 20 7b 49 53 20 4e 4f 54 7d 20 69        {IS NOT} i
06d0: 73 6e 74 0a 7d 20 7b 0a 20 20 73 65 74 20 3a 3a  snt.} {.  set ::
06e0: 6f 70 6e 61 6d 65 28 24 6f 70 29 20 24 6f 70 6e  opname($op) $opn
06f0: 0a 7d 0a 73 65 74 20 6f 70 6c 69 73 74 20 5b 6c  .}.set oplist [l
0700: 69 73 74 5d 0a 66 6f 72 65 61 63 68 20 7b 70 72  ist].foreach {pr
0710: 65 63 20 6f 70 6c 7d 20 7b 0a 20 20 31 20 20 20  ec opl} {.  1   
0720: 7c 7c 0a 20 20 32 20 20 20 7b 2a 20 2f 20 25 7d  ||.  2   {* / %}
0730: 0a 20 20 33 20 20 20 7b 2b 20 2d 7d 0a 20 20 34  .  3   {+ -}.  4
0740: 20 20 20 7b 3c 3c 20 3e 3e 20 26 20 7c 7d 0a 20     {<< >> & |}. 
0750: 20 35 20 20 20 7b 3c 20 3c 3d 20 3e 20 3e 3d 7d   5   {< <= > >=}
0760: 0a 20 20 36 20 20 20 7b 3d 20 3d 3d 20 21 3d 20  .  6   {= == != 
0770: 3c 3e 20 49 53 20 7b 49 53 20 4e 4f 54 7d 20 4c  <> IS {IS NOT} L
0780: 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48 20 52  IKE GLOB MATCH R
0790: 45 47 45 58 50 7d 0a 20 20 37 20 20 20 41 4e 44  EGEXP}.  7   AND
07a0: 0a 20 20 38 20 20 20 4f 52 0a 7d 20 7b 0a 20 20  .  8   OR.} {.  
07b0: 66 6f 72 65 61 63 68 20 6f 70 20 24 6f 70 6c 20  foreach op $opl 
07c0: 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6f 70 70  { .    set ::opp
07d0: 72 65 63 28 24 6f 70 29 20 24 70 72 65 63 20 0a  rec($op) $prec .
07e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 6f 70 6c 69      lappend opli
07f0: 73 74 20 24 6f 70 0a 20 20 7d 0a 7d 0a 0a 0a 23  st $op.  }.}...#
0800: 20 48 6f 6f 6b 20 69 6e 20 64 65 66 69 6e 69 74   Hook in definit
0810: 69 6f 6e 73 20 6f 66 20 4d 41 54 43 48 20 61 6e  ions of MATCH an
0820: 64 20 52 45 47 45 58 2e 20 54 68 65 20 66 6f 6c  d REGEX. The fol
0830: 6c 6f 77 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  lowing implement
0840: 61 74 69 6f 6e 73 0a 23 20 63 61 75 73 65 20 4d  ations.# cause M
0850: 41 54 43 48 20 61 6e 64 20 52 45 47 45 58 20 74  ATCH and REGEX t
0860: 6f 20 62 65 68 61 76 65 20 73 69 6d 69 6c 61 72  o behave similar
0870: 6c 79 20 74 6f 20 74 68 65 20 3d 3d 20 6f 70 65  ly to the == ope
0880: 72 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 6d 61  rator..#.proc ma
0890: 74 63 68 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20  tchfunc {a b} { 
08a0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 61  return [expr {$a
08b0: 3d 3d 24 62 7d 5d 20 7d 0a 70 72 6f 63 20 72 65  ==$b}] }.proc re
08c0: 67 65 78 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20  gexfunc {a b} { 
08d0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 61  return [expr {$a
08e0: 3d 3d 24 62 7d 5d 20 7d 0a 64 62 20 66 75 6e 63  ==$b}] }.db func
08f0: 20 6d 61 74 63 68 20 20 2d 61 72 67 63 6f 75 6e   match  -argcoun
0900: 74 20 32 20 6d 61 74 63 68 66 75 6e 63 0a 64 62  t 2 matchfunc.db
0910: 20 66 75 6e 63 20 72 65 67 65 78 70 20 2d 61 72   func regexp -ar
0920: 67 63 6f 75 6e 74 20 32 20 72 65 67 65 78 66 75  gcount 2 regexfu
0930: 6e 63 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  nc..#-----------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0980: 20 54 65 73 74 20 63 61 73 65 73 20 65 5f 65 78   Test cases e_ex
0990: 70 72 2d 31 2e 2a 20 61 74 74 65 6d 70 74 20 74  pr-1.* attempt t
09a0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61 6c  o verify that al
09b0: 6c 20 62 69 6e 61 72 79 20 6f 70 65 72 61 74 6f  l binary operato
09c0: 72 73 20 6c 69 73 74 65 64 0a 23 20 69 6e 20 74  rs listed.# in t
09d0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
09e0: 20 65 78 69 73 74 20 61 6e 64 20 74 68 61 74 20   exist and that 
09f0: 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 72 65  the relative pre
0a00: 63 65 64 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  cedences of the.
0a10: 23 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  # operators are 
0a20: 61 6c 73 6f 20 61 73 20 74 68 65 20 64 6f 63 75  also as the docu
0a30: 6d 65 6e 74 61 74 69 6f 6e 20 73 75 67 67 65 73  mentation sugges
0a40: 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ts..#.# EVIDENCE
0a50: 2d 4f 46 3a 20 52 2d 31 35 35 31 34 2d 36 35 31  -OF: R-15514-651
0a60: 36 33 20 53 51 4c 69 74 65 20 75 6e 64 65 72 73  63 SQLite unders
0a70: 74 61 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f 77  tands the follow
0a80: 69 6e 67 20 62 69 6e 61 72 79 0a 23 20 6f 70 65  ing binary.# ope
0a90: 72 61 74 6f 72 73 2c 20 69 6e 20 6f 72 64 65 72  rators, in order
0aa0: 20 66 72 6f 6d 20 68 69 67 68 65 73 74 20 74 6f   from highest to
0ab0: 20 6c 6f 77 65 73 74 20 70 72 65 63 65 64 65 6e   lowest preceden
0ac0: 63 65 3a 20 7c 7c 20 2a 20 2f 20 25 20 2b 20 2d  ce: || * / % + -
0ad0: 0a 23 20 3c 3c 20 3e 3e 20 26 20 7c 20 3c 20 3c  .# << >> & | < <
0ae0: 3d 20 3e 20 3e 3d 20 3d 20 3d 3d 20 21 3d 20 3c  = > >= = == != <
0af0: 3e 20 49 53 20 49 53 0a 23 20 4e 4f 54 20 49 4e  > IS IS.# NOT IN
0b00: 20 4c 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48   LIKE GLOB MATCH
0b10: 20 52 45 47 45 58 50 20 41 4e 44 20 4f 52 0a 23   REGEXP AND OR.#
0b20: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
0b30: 52 2d 33 38 37 35 39 2d 33 38 37 38 39 20 4f 70  R-38759-38789 Op
0b40: 65 72 61 74 6f 72 73 20 49 53 20 61 6e 64 20 49  erators IS and I
0b50: 53 20 4e 4f 54 20 68 61 76 65 20 74 68 65 20 73  S NOT have the s
0b60: 61 6d 65 0a 23 20 70 72 65 63 65 64 65 6e 63 65  ame.# precedence
0b70: 20 61 73 20 3d 2e 0a 23 0a 0a 75 6e 73 65 74 20   as =..#..unset 
0b80: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 75 6e 74 65  -nocomplain unte
0b90: 73 74 65 64 0a 66 6f 72 65 61 63 68 20 6f 70 31  sted.foreach op1
0ba0: 20 24 6f 70 6c 69 73 74 20 7b 0a 20 20 66 6f 72   $oplist {.  for
0bb0: 65 61 63 68 20 6f 70 32 20 24 6f 70 6c 69 73 74  each op2 $oplist
0bc0: 20 7b 0a 20 20 20 20 73 65 74 20 75 6e 74 65 73   {.    set untes
0bd0: 74 65 64 28 24 6f 70 31 2c 24 6f 70 32 29 20 31  ted($op1,$op2) 1
0be0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 74 6e  .    foreach {tn
0bf0: 20 41 20 42 20 43 7d 20 7b 0a 20 20 20 20 20 20   A B C} {.      
0c00: 20 31 20 20 20 20 20 32 32 20 20 20 34 35 20 20   1     22   45  
0c10: 20 20 36 36 0a 20 20 20 20 20 20 20 32 20 20 20    66.       2   
0c20: 20 20 20 30 20 20 20 20 30 20 20 20 20 20 30 0a     0    0     0.
0c30: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 30 20         3      0 
0c40: 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20 20     0     1.     
0c50: 20 20 34 20 20 20 20 20 20 30 20 20 20 20 31 20    4      0    1 
0c60: 20 20 20 20 30 0a 20 20 20 20 20 20 20 35 20 20      0.       5  
0c70: 20 20 20 20 30 20 20 20 20 31 20 20 20 20 20 31      0    1     1
0c80: 0a 20 20 20 20 20 20 20 36 20 20 20 20 20 20 31  .       6      1
0c90: 20 20 20 20 30 20 20 20 20 20 30 0a 20 20 20 20      0     0.    
0ca0: 20 20 20 37 20 20 20 20 20 20 31 20 20 20 20 30     7      1    0
0cb0: 20 20 20 20 20 31 0a 20 20 20 20 20 20 20 38 20       1.       8 
0cc0: 20 20 20 20 20 31 20 20 20 20 31 20 20 20 20 20       1    1     
0cd0: 30 0a 20 20 20 20 20 20 20 39 20 20 20 20 20 20  0.       9      
0ce0: 31 20 20 20 20 31 20 20 20 20 20 31 0a 20 20 20  1    1     1.   
0cf0: 20 20 20 31 30 20 20 20 20 20 20 35 20 20 20 20     10      5    
0d00: 36 20 20 20 20 20 31 0a 20 20 20 20 20 20 31 31  6     1.      11
0d10: 20 20 20 20 20 20 31 20 20 20 20 35 20 20 20 20        1    5    
0d20: 20 36 0a 20 20 20 20 20 20 31 32 20 20 20 20 20   6.      12     
0d30: 20 31 20 20 20 20 35 20 20 20 20 20 35 0a 20 20   1    5     5.  
0d40: 20 20 20 20 31 33 20 20 20 20 20 20 35 20 20 20      13      5   
0d50: 20 35 20 20 20 20 20 31 0a 0a 20 20 20 20 20 20   5     1..      
0d60: 31 34 20 20 20 20 20 20 35 20 20 20 20 32 20 20  14      5    2  
0d70: 20 20 20 31 0a 20 20 20 20 20 20 31 35 20 20 20     1.      15   
0d80: 20 20 20 31 20 20 20 20 34 20 20 20 20 20 31 0a     1    4     1.
0d90: 20 20 20 20 20 20 31 36 20 20 20 20 20 2d 31 20        16     -1 
0da0: 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20 20     0     1.     
0db0: 20 31 37 20 20 20 20 20 20 30 20 20 20 20 31 20   17      0    1 
0dc0: 20 20 20 2d 31 0a 0a 20 20 20 20 7d 20 7b 0a 20     -1..    } {. 
0dd0: 20 20 20 20 20 73 65 74 20 74 65 73 74 6e 61 6d       set testnam
0de0: 65 20 22 65 5f 65 78 70 72 2d 31 2e 24 6f 70 6e  e "e_expr-1.$opn
0df0: 61 6d 65 28 24 6f 70 31 29 2e 24 6f 70 6e 61 6d  ame($op1).$opnam
0e00: 65 28 24 6f 70 32 29 2e 24 74 6e 22 0a 0a 20 20  e($op2).$tn"..  
0e10: 20 20 20 20 23 20 49 66 20 24 6f 70 32 20 67 72      # If $op2 gr
0e20: 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74 6c  oups more tightl
0e30: 79 20 74 68 61 6e 20 24 6f 70 31 2c 20 74 68 65  y than $op1, the
0e40: 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  n the result.   
0e50: 20 20 20 23 20 6f 66 20 65 78 65 63 75 74 69 6e     # of executin
0e60: 67 20 24 73 71 6c 31 20 77 68 6f 75 6c 64 20 62  g $sql1 whould b
0e70: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78  e the same as ex
0e80: 65 63 75 74 69 6e 67 20 24 73 71 6c 33 2e 0a 20  ecuting $sql3.. 
0e90: 20 20 20 20 20 23 20 49 66 20 24 6f 70 31 20 67       # If $op1 g
0ea0: 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74  roups more tight
0eb0: 6c 79 2c 20 6f 72 20 69 66 20 24 6f 70 31 20 61  ly, or if $op1 a
0ec0: 6e 64 20 24 6f 70 32 20 68 61 76 65 20 0a 20 20  nd $op2 have .  
0ed0: 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20 70      # the same p
0ee0: 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 6e 20  recedence, then 
0ef0: 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c 31 20  executing $sql1 
0f00: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20 20  should return.  
0f10: 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20 76      # the same v
0f20: 61 6c 75 65 20 61 73 20 24 73 71 6c 32 2e 0a 20  alue as $sql2.. 
0f30: 20 20 20 20 20 23 0a 20 20 20 20 20 20 73 65 74       #.      set
0f40: 20 73 71 6c 31 20 22 53 45 4c 45 43 54 20 24 41   sql1 "SELECT $A
0f50: 20 24 6f 70 31 20 24 42 20 24 6f 70 32 20 24 43   $op1 $B $op2 $C
0f60: 22 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 32  ".      set sql2
0f70: 20 22 53 45 4c 45 43 54 20 28 24 41 20 24 6f 70   "SELECT ($A $op
0f80: 31 20 24 42 29 20 24 6f 70 32 20 24 43 22 0a 20  1 $B) $op2 $C". 
0f90: 20 20 20 20 20 73 65 74 20 73 71 6c 33 20 22 53       set sql3 "S
0fa0: 45 4c 45 43 54 20 24 41 20 24 6f 70 31 20 28 24  ELECT $A $op1 ($
0fb0: 42 20 24 6f 70 32 20 24 43 29 22 0a 0a 20 20 20  B $op2 $C)"..   
0fc0: 20 20 20 73 65 74 20 61 32 20 5b 64 62 20 6f 6e     set a2 [db on
0fd0: 65 20 24 73 71 6c 32 5d 0a 20 20 20 20 20 20 73  e $sql2].      s
0fe0: 65 74 20 61 33 20 5b 64 62 20 6f 6e 65 20 24 73  et a3 [db one $s
0ff0: 71 6c 33 5d 0a 0a 20 20 20 20 20 20 64 6f 5f 65  ql3]..      do_e
1000: 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 65 73  xecsql_test $tes
1010: 74 6e 61 6d 65 20 24 73 71 6c 31 20 5b 6c 69 73  tname $sql1 [lis
1020: 74 20 5b 0a 20 20 20 20 20 20 20 20 69 66 20 7b  t [.        if {
1030: 24 6f 70 70 72 65 63 28 24 6f 70 32 29 20 3c 20  $opprec($op2) < 
1040: 24 6f 70 70 72 65 63 28 24 6f 70 31 29 7d 20 7b  $opprec($op1)} {
1050: 73 65 74 20 61 33 7d 20 7b 73 65 74 20 61 32 7d  set a3} {set a2}
1060: 0a 20 20 20 20 20 20 5d 5d 0a 20 20 20 20 20 20  .      ]].      
1070: 69 66 20 7b 24 61 32 20 21 3d 20 24 61 33 7d 20  if {$a2 != $a3} 
1080: 7b 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  { unset -nocompl
1090: 61 69 6e 20 75 6e 74 65 73 74 65 64 28 24 6f 70  ain untested($op
10a0: 31 2c 24 6f 70 32 29 20 7d 0a 20 20 20 20 7d 0a  1,$op2) }.    }.
10b0: 20 20 7d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 6f    }.}..foreach o
10c0: 70 20 7b 2a 20 41 4e 44 20 4f 52 20 2b 20 7c 7c  p {* AND OR + ||
10d0: 20 26 20 7c 7d 20 7b 20 75 6e 73 65 74 20 75 6e   & |} { unset un
10e0: 74 65 73 74 65 64 28 24 6f 70 2c 24 6f 70 29 20  tested($op,$op) 
10f0: 7d 0a 75 6e 73 65 74 20 75 6e 74 65 73 74 65 64  }.unset untested
1100: 28 2b 2c 2d 29 20 20 3b 23 20 20 20 20 20 20 20  (+,-)  ;#       
1110: 53 69 6e 63 65 20 20 20 20 28 61 2b 62 29 2d 63  Since    (a+b)-c
1120: 20 3d 3d 20 61 2b 28 62 2d 63 29 0a 75 6e 73 65   == a+(b-c).unse
1130: 74 20 75 6e 74 65 73 74 65 64 28 2a 2c 3c 3c 29  t untested(*,<<)
1140: 20 3b 23 20 20 20 20 20 20 20 53 69 6e 63 65 20   ;#       Since 
1150: 20 20 20 28 61 2a 62 29 3c 3c 63 20 3d 3d 20 61     (a*b)<<c == a
1160: 2a 28 62 3c 3c 63 29 0a 0a 64 6f 5f 74 65 73 74  *(b<<c)..do_test
1170: 20 65 5f 65 78 70 72 2d 31 2e 31 20 7b 20 61 72   e_expr-1.1 { ar
1180: 72 61 79 20 6e 61 6d 65 73 20 75 6e 74 65 73 74  ray names untest
1190: 65 64 20 7d 20 7b 7d 0a 0a 23 20 41 74 20 6f 6e  ed } {}..# At on
11a0: 65 20 70 6f 69 6e 74 2c 20 74 65 73 74 20 31 2e  e point, test 1.
11b0: 32 2e 32 20 77 61 73 20 66 61 69 6c 69 6e 67 2e  2.2 was failing.
11c0: 20 49 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   Instead of the 
11d0: 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 2c 20  correct result, 
11e0: 69 74 0a 23 20 77 61 73 20 72 65 74 75 72 6e 69  it.# was returni
11f0: 6e 67 20 7b 31 20 31 20 30 7d 2e 20 54 68 69 73  ng {1 1 0}. This
1200: 20 77 6f 75 6c 64 20 73 65 65 6d 20 74 6f 20 69   would seem to i
1210: 6e 64 69 63 61 74 65 20 74 68 61 74 20 4c 49 4b  ndicate that LIK
1220: 45 20 68 61 73 20 74 68 65 0a 23 20 73 61 6d 65  E has the.# same
1230: 20 70 72 65 63 65 64 65 6e 63 65 20 61 73 20 27   precedence as '
1240: 3c 27 2e 20 57 68 69 63 68 20 69 73 20 69 6e 63  <'. Which is inc
1250: 6f 72 72 65 63 74 2e 20 49 74 20 68 61 73 20 6c  orrect. It has l
1260: 6f 77 65 72 20 70 72 65 63 65 64 65 6e 63 65 2e  ower precedence.
1270: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1280: 73 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 31 20  st e_expr-1.2.1 
1290: 7b 20 0a 20 20 53 45 4c 45 43 54 20 30 20 3c 20  { .  SELECT 0 < 
12a0: 32 20 4c 49 4b 45 20 31 2c 20 20 20 28 30 20 3c  2 LIKE 1,   (0 <
12b0: 20 32 29 20 4c 49 4b 45 20 31 2c 20 20 20 30 20   2) LIKE 1,   0 
12c0: 3c 20 28 32 20 4c 49 4b 45 20 31 29 0a 7d 20 7b  < (2 LIKE 1).} {
12d0: 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71  1 1 0}.do_execsq
12e0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 2e  l_test e_expr-1.
12f0: 32 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  2.2 { .  SELECT 
1300: 30 20 4c 49 4b 45 20 30 20 3c 20 32 2c 20 20 20  0 LIKE 0 < 2,   
1310: 28 30 20 4c 49 4b 45 20 30 29 20 3c 20 32 2c 20  (0 LIKE 0) < 2, 
1320: 20 20 30 20 4c 49 4b 45 20 28 30 20 3c 20 32 29    0 LIKE (0 < 2)
1330: 0a 7d 20 7b 30 20 31 20 30 7d 0a 0a 23 20 53 68  .} {0 1 0}..# Sh
1340: 6f 77 69 6e 67 20 74 68 61 74 20 4c 49 4b 45 20  owing that LIKE 
1350: 61 6e 64 20 3d 3d 20 68 61 76 65 20 74 68 65 20  and == have the 
1360: 73 61 6d 65 20 70 72 65 63 65 64 65 6e 63 65 0a  same precedence.
1370: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
1380: 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 33 20 7b  t e_expr-1.2.3 {
1390: 20 0a 20 20 53 45 4c 45 43 54 20 32 20 4c 49 4b   .  SELECT 2 LIK
13a0: 45 20 32 20 3d 3d 20 31 2c 20 20 20 28 32 20 4c  E 2 == 1,   (2 L
13b0: 49 4b 45 20 32 29 20 3d 3d 20 31 2c 20 20 20 20  IKE 2) == 1,    
13c0: 32 20 4c 49 4b 45 20 28 32 20 3d 3d 20 31 29 0a  2 LIKE (2 == 1).
13d0: 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65  } {1 1 0}.do_exe
13e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
13f0: 2d 31 2e 32 2e 34 20 7b 20 0a 20 20 53 45 4c 45  -1.2.4 { .  SELE
1400: 43 54 20 32 20 3d 3d 20 32 20 4c 49 4b 45 20 31  CT 2 == 2 LIKE 1
1410: 2c 20 20 20 28 32 20 3d 3d 20 32 29 20 4c 49 4b  ,   (2 == 2) LIK
1420: 45 20 31 2c 20 20 20 20 32 20 3d 3d 20 28 32 20  E 1,    2 == (2 
1430: 4c 49 4b 45 20 31 29 0a 7d 20 7b 31 20 31 20 30  LIKE 1).} {1 1 0
1440: 7d 0a 0a 23 20 53 68 6f 77 69 6e 67 20 74 68 61  }..# Showing tha
1450: 74 20 3c 20 67 72 6f 75 70 73 20 6d 6f 72 65 20  t < groups more 
1460: 74 69 67 68 74 6c 79 20 74 68 61 6e 20 3d 3d 20  tightly than == 
1470: 28 3c 20 68 61 73 20 68 69 67 68 65 72 20 70 72  (< has higher pr
1480: 65 63 65 64 65 6e 63 65 29 2e 20 0a 23 0a 64 6f  ecedence). .#.do
1490: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
14a0: 65 78 70 72 2d 31 2e 32 2e 35 20 7b 20 0a 20 20  expr-1.2.5 { .  
14b0: 53 45 4c 45 43 54 20 30 20 3c 20 32 20 3d 3d 20  SELECT 0 < 2 == 
14c0: 31 2c 20 20 20 28 30 20 3c 20 32 29 20 3d 3d 20  1,   (0 < 2) == 
14d0: 31 2c 20 20 20 30 20 3c 20 28 32 20 3d 3d 20 31  1,   0 < (2 == 1
14e0: 29 0a 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65  ).} {1 1 0}.do_e
14f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
1500: 70 72 2d 31 2e 36 20 7b 20 0a 20 20 53 45 4c 45  pr-1.6 { .  SELE
1510: 43 54 20 30 20 3d 3d 20 30 20 3c 20 32 2c 20 20  CT 0 == 0 < 2,  
1520: 20 28 30 20 3d 3d 20 30 29 20 3c 20 32 2c 20 20   (0 == 0) < 2,  
1530: 20 30 20 3d 3d 20 28 30 20 3c 20 32 29 0a 7d 20   0 == (0 < 2).} 
1540: 7b 30 20 31 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  {0 1 0}..#------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
15a0: 20 74 68 65 20 66 6f 75 72 20 75 6e 61 72 79 20   the four unary 
15b0: 70 72 65 66 69 78 20 6f 70 65 72 61 74 6f 72 73  prefix operators
15c0: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
15d0: 65 20 0a 23 20 64 6f 63 75 6d 65 6e 74 61 74 69  e .# documentati
15e0: 6f 6e 20 65 78 69 73 74 2e 0a 23 0a 23 20 45 56  on exist..#.# EV
15f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 39  IDENCE-OF: R-139
1600: 35 38 2d 35 33 34 31 39 20 53 75 70 70 6f 72 74  58-53419 Support
1610: 65 64 20 75 6e 61 72 79 20 70 72 65 66 69 78 20  ed unary prefix 
1620: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 74 68  operators are th
1630: 65 73 65 3a 0a 23 20 2d 20 2b 20 7e 20 4e 4f 54  ese:.# - + ~ NOT
1640: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1650: 73 74 20 65 5f 65 78 70 72 2d 32 2e 31 20 7b 20  st e_expr-2.1 { 
1660: 53 45 4c 45 43 54 20 2d 20 20 20 31 30 20 20 20  SELECT -   10   
1670: 7d 20 7b 2d 31 30 7d 0a 64 6f 5f 65 78 65 63 73  } {-10}.do_execs
1680: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
1690: 2e 32 20 7b 20 53 45 4c 45 43 54 20 2b 20 20 20  .2 { SELECT +   
16a0: 31 30 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65  10   } {10}.do_e
16b0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
16c0: 70 72 2d 32 2e 33 20 7b 20 53 45 4c 45 43 54 20  pr-2.3 { SELECT 
16d0: 7e 20 20 20 31 30 20 20 20 7d 20 7b 2d 31 31 7d  ~   10   } {-11}
16e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
16f0: 20 65 5f 65 78 70 72 2d 32 2e 34 20 7b 20 53 45   e_expr-2.4 { SE
1700: 4c 45 43 54 20 4e 4f 54 20 31 30 20 20 20 7d 20  LECT NOT 10   } 
1710: 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {0}..#----------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1760: 23 20 54 65 73 74 73 20 66 6f 72 20 74 68 65 20  # Tests for the 
1770: 74 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 6d  two statements m
1780: 61 64 65 20 72 65 67 61 72 64 69 6e 67 20 74 68  ade regarding th
1790: 65 20 75 6e 61 72 79 20 2b 20 6f 70 65 72 61 74  e unary + operat
17a0: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
17b0: 2d 4f 46 3a 20 52 2d 35 33 36 37 30 2d 30 33 33  -OF: R-53670-033
17c0: 37 33 20 54 68 65 20 75 6e 61 72 79 20 6f 70 65  73 The unary ope
17d0: 72 61 74 6f 72 20 2b 20 69 73 20 61 20 6e 6f 2d  rator + is a no-
17e0: 6f 70 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  op..#.# EVIDENCE
17f0: 2d 4f 46 3a 20 52 2d 31 39 34 38 30 2d 33 30 39  -OF: R-19480-309
1800: 36 38 20 49 74 20 63 61 6e 20 62 65 20 61 70 70  68 It can be app
1810: 6c 69 65 64 20 74 6f 20 73 74 72 69 6e 67 73 2c  lied to strings,
1820: 20 6e 75 6d 62 65 72 73 2c 0a 23 20 62 6c 6f 62   numbers,.# blob
1830: 73 20 6f 72 20 4e 55 4c 4c 20 61 6e 64 20 69 74  s or NULL and it
1840: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1850: 61 20 72 65 73 75 6c 74 20 77 69 74 68 20 74 68  a result with th
1860: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 0a  e same value as.
1870: 23 20 74 68 65 20 6f 70 65 72 61 6e 64 2e 0a 23  # the operand..#
1880: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6c 69 74  .foreach {tn lit
1890: 65 72 61 6c 20 74 79 70 65 7d 20 7b 0a 20 20 31  eral type} {.  1
18a0: 20 20 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c 64       'helloworld
18b0: 27 20 20 20 74 65 78 74 0a 20 20 32 20 20 20 20  '   text.  2    
18c0: 20 34 35 20 20 20 20 20 20 20 20 20 20 20 20 20   45             
18d0: 69 6e 74 65 67 65 72 0a 20 20 33 20 20 20 20 20  integer.  3     
18e0: 34 35 2e 32 20 20 20 20 20 20 20 20 20 20 20 72  45.2           r
18f0: 65 61 6c 0a 20 20 34 20 20 20 20 20 34 35 2e 30  eal.  4     45.0
1900: 20 20 20 20 20 20 20 20 20 20 20 72 65 61 6c 0a             real.
1910: 20 20 35 20 20 20 20 20 58 27 41 42 43 44 45 46    5     X'ABCDEF
1920: 27 20 20 20 20 20 20 62 6c 6f 62 0a 20 20 36 20  '      blob.  6 
1930: 20 20 20 20 4e 55 4c 4c 20 20 20 20 20 20 20 20      NULL        
1940: 20 20 20 6e 75 6c 6c 0a 7d 20 7b 0a 20 20 73 65     null.} {.  se
1950: 74 20 73 71 6c 20 22 20 53 45 4c 45 43 54 20 71  t sql " SELECT q
1960: 75 6f 74 65 28 20 2b 20 24 6c 69 74 65 72 61 6c  uote( + $literal
1970: 20 29 2c 20 74 79 70 65 6f 66 28 20 2b 20 24 6c   ), typeof( + $l
1980: 69 74 65 72 61 6c 29 20 22 0a 20 20 64 6f 5f 65  iteral) ".  do_e
1990: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
19a0: 70 72 2d 33 2e 24 74 6e 20 24 73 71 6c 20 5b 6c  pr-3.$tn $sql [l
19b0: 69 73 74 20 24 6c 69 74 65 72 61 6c 20 24 74 79  ist $literal $ty
19c0: 70 65 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  pe].}..#--------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a10: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 62  -.# Check that b
1a20: 6f 74 68 20 3d 20 61 6e 64 20 3d 3d 20 61 72 65  oth = and == are
1a30: 20 62 6f 74 68 20 61 63 63 65 70 74 61 62 6c 65   both acceptable
1a40: 20 61 73 20 74 68 65 20 22 65 71 75 61 6c 73 22   as the "equals"
1a50: 20 6f 70 65 72 61 74 6f 72 2e 0a 23 20 53 69 6d   operator..# Sim
1a60: 69 6c 61 72 6c 79 2c 20 65 69 74 68 65 72 20 21  ilarly, either !
1a70: 3d 20 6f 72 20 3c 3e 20 77 6f 72 6b 20 61 73 20  = or <> work as 
1a80: 74 68 65 20 6e 6f 74 2d 65 71 75 61 6c 73 20 6f  the not-equals o
1a90: 70 65 72 61 74 6f 72 2e 0a 23 0a 23 20 45 56 49  perator..#.# EVI
1aa0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 37  DENCE-OF: R-0367
1ab0: 39 2d 36 30 36 33 39 20 45 71 75 61 6c 73 20 63  9-60639 Equals c
1ac0: 61 6e 20 62 65 20 65 69 74 68 65 72 20 3d 20 6f  an be either = o
1ad0: 72 20 3d 3d 2e 0a 23 0a 23 20 45 56 49 44 45 4e  r ==..#.# EVIDEN
1ae0: 43 45 2d 4f 46 3a 20 52 2d 33 30 30 38 32 2d 33  CE-OF: R-30082-3
1af0: 38 39 39 36 20 54 68 65 20 6e 6f 6e 2d 65 71 75  8996 The non-equ
1b00: 61 6c 73 20 6f 70 65 72 61 74 6f 72 20 63 61 6e  als operator can
1b10: 20 62 65 20 65 69 74 68 65 72 20 21 3d 20 6f 72   be either != or
1b20: 0a 23 20 3c 3e 2e 0a 23 0a 66 6f 72 65 61 63 68  .# <>..#.foreach
1b30: 20 7b 74 6e 20 6c 69 74 65 72 61 6c 20 64 69 66   {tn literal dif
1b40: 66 65 72 65 6e 74 7d 20 7b 0a 20 20 31 20 20 20  ferent} {.  1   
1b50: 27 68 65 6c 6c 6f 77 6f 72 6c 64 27 20 20 27 31  'helloworld'  '1
1b60: 32 33 34 35 27 0a 20 20 32 20 20 20 32 32 20 20  2345'.  2   22  
1b70: 20 20 20 20 20 20 20 20 20 20 32 33 0a 20 20 33            23.  3
1b80: 20 20 20 27 78 79 7a 27 20 20 20 20 20 20 20 20     'xyz'        
1b90: 20 58 27 37 38 37 39 37 41 27 0a 20 20 34 20 20   X'78797A'.  4  
1ba0: 20 58 27 37 38 37 39 37 41 30 30 27 20 20 20 27   X'78797A00'   '
1bb0: 78 79 7a 27 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78  xyz'.} {.  do_ex
1bc0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
1bd0: 72 2d 34 2e 24 74 6e 20 22 0a 20 20 20 20 53 45  r-4.$tn ".    SE
1be0: 4c 45 43 54 20 24 6c 69 74 65 72 61 6c 20 20 3d  LECT $literal  =
1bf0: 20 24 6c 69 74 65 72 61 6c 2c 20 20 20 24 6c 69   $literal,   $li
1c00: 74 65 72 61 6c 20 3d 3d 20 24 6c 69 74 65 72 61  teral == $litera
1c10: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24 6c  l,.           $l
1c20: 69 74 65 72 61 6c 20 20 3d 20 24 64 69 66 66 65  iteral  = $diffe
1c30: 72 65 6e 74 2c 20 24 6c 69 74 65 72 61 6c 20 3d  rent, $literal =
1c40: 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 0a 20 20  = $different,.  
1c50: 20 20 20 20 20 20 20 20 20 24 6c 69 74 65 72 61           $litera
1c60: 6c 20 20 3d 20 4e 55 4c 4c 2c 20 20 20 20 20 20  l  = NULL,      
1c70: 20 24 6c 69 74 65 72 61 6c 20 3d 3d 20 4e 55 4c   $literal == NUL
1c80: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24 6c  L,.           $l
1c90: 69 74 65 72 61 6c 20 21 3d 20 24 6c 69 74 65 72  iteral != $liter
1ca0: 61 6c 2c 20 20 20 24 6c 69 74 65 72 61 6c 20 3c  al,   $literal <
1cb0: 3e 20 24 6c 69 74 65 72 61 6c 2c 0a 20 20 20 20  > $literal,.    
1cc0: 20 20 20 20 20 20 20 24 6c 69 74 65 72 61 6c 20         $literal 
1cd0: 21 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 20 24  != $different, $
1ce0: 6c 69 74 65 72 61 6c 20 3c 3e 20 24 64 69 66 66  literal <> $diff
1cf0: 65 72 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  erent,.         
1d00: 20 20 24 6c 69 74 65 72 61 6c 20 21 3d 20 4e 55    $literal != NU
1d10: 4c 4c 2c 20 20 20 20 20 20 20 24 6c 69 74 65 72  LL,       $liter
1d20: 61 6c 20 21 3d 20 4e 55 4c 4c 0a 0a 20 20 22 20  al != NULL..  " 
1d30: 7b 31 20 31 20 30 20 30 20 7b 7d 20 7b 7d 20 30  {1 1 0 0 {} {} 0
1d40: 20 30 20 31 20 31 20 7b 7d 20 7b 7d 7d 0a 7d 0a   0 1 1 {} {}}.}.
1d50: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
1da0: 73 74 20 74 68 65 20 7c 7c 20 6f 70 65 72 61 74  st the || operat
1db0: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
1dc0: 2d 4f 46 3a 20 52 2d 34 34 34 30 39 2d 36 32 36  -OF: R-44409-626
1dd0: 34 31 20 54 68 65 20 7c 7c 20 6f 70 65 72 61 74  41 The || operat
1de0: 6f 72 20 69 73 20 22 63 6f 6e 63 61 74 65 6e 61  or is "concatena
1df0: 74 65 22 20 2d 20 69 74 20 6a 6f 69 6e 73 0a 23  te" - it joins.#
1e00: 20 74 6f 67 65 74 68 65 72 20 74 68 65 20 74 77   together the tw
1e10: 6f 20 73 74 72 69 6e 67 73 20 6f 66 20 69 74 73  o strings of its
1e20: 20 6f 70 65 72 61 6e 64 73 2e 0a 23 0a 66 6f 72   operands..#.for
1e30: 65 61 63 68 20 7b 74 6e 20 61 20 62 7d 20 7b 0a  each {tn a b} {.
1e40: 20 20 31 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c    1   'helloworl
1e50: 64 27 20 20 27 31 32 33 34 35 27 0a 20 20 32 20  d'  '12345'.  2 
1e60: 20 20 32 32 20 20 20 20 20 20 20 20 20 20 20 20    22            
1e70: 32 33 0a 7d 20 7b 0a 20 20 73 65 74 20 61 73 20  23.} {.  set as 
1e80: 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20  [db one "SELECT 
1e90: 24 61 22 5d 0a 20 20 73 65 74 20 62 73 20 5b 64  $a"].  set bs [d
1ea0: 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 24 62  b one "SELECT $b
1eb0: 22 5d 0a 20 20 0a 20 20 64 6f 5f 65 78 65 63 73  "].  .  do_execs
1ec0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 35  ql_test e_expr-5
1ed0: 2e 24 74 6e 20 22 53 45 4c 45 43 54 20 24 61 20  .$tn "SELECT $a 
1ee0: 7c 7c 20 24 62 22 20 5b 6c 69 73 74 20 22 24 7b  || $b" [list "${
1ef0: 61 73 7d 24 7b 62 73 7d 22 5d 0a 7d 0a 0a 23 2d  as}${bs}"].}..#-
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
1f50: 74 68 65 20 25 20 6f 70 65 72 61 74 6f 72 2e 0a  the % operator..
1f60: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
1f70: 20 52 2d 30 38 39 31 34 2d 36 33 37 39 30 20 54   R-08914-63790 T
1f80: 68 65 20 6f 70 65 72 61 74 6f 72 20 25 20 6f 75  he operator % ou
1f90: 74 70 75 74 73 20 74 68 65 20 76 61 6c 75 65 20  tputs the value 
1fa0: 6f 66 20 69 74 73 0a 23 20 6c 65 66 74 20 6f 70  of its.# left op
1fb0: 65 72 61 6e 64 20 6d 6f 64 75 6c 6f 20 69 74 73  erand modulo its
1fc0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 0a   right operand..
1fd0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
1fe0: 74 20 65 5f 65 78 70 72 2d 36 2e 31 20 7b 53 45  t e_expr-6.1 {SE
1ff0: 4c 45 43 54 20 20 37 32 25 35 7d 20 20 7b 32 7d  LECT  72%5}  {2}
2000: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2010: 20 65 5f 65 78 70 72 2d 36 2e 32 20 7b 53 45 4c   e_expr-6.2 {SEL
2020: 45 43 54 20 20 37 32 25 2d 35 7d 20 7b 32 7d 0a  ECT  72%-5} {2}.
2030: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2040: 65 5f 65 78 70 72 2d 36 2e 33 20 7b 53 45 4c 45  e_expr-6.3 {SELE
2050: 43 54 20 2d 37 32 25 2d 35 7d 20 7b 2d 32 7d 0a  CT -72%-5} {-2}.
2060: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2070: 65 5f 65 78 70 72 2d 36 2e 34 20 7b 53 45 4c 45  e_expr-6.4 {SELE
2080: 43 54 20 2d 37 32 25 35 7d 20 20 7b 2d 32 7d 0a  CT -72%5}  {-2}.
2090: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
20e0: 73 74 20 74 68 61 74 20 74 68 65 20 72 65 73 75  st that the resu
20f0: 6c 74 73 20 6f 66 20 61 6c 6c 20 62 69 6e 61 72  lts of all binar
2100: 79 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  y operators are 
2110: 65 69 74 68 65 72 20 6e 75 6d 65 72 69 63 20 6f  either numeric o
2120: 72 20 0a 23 20 4e 55 4c 4c 2c 20 65 78 63 65 70  r .# NULL, excep
2130: 74 20 66 6f 72 20 74 68 65 20 7c 7c 20 6f 70 65  t for the || ope
2140: 72 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79  rator, which may
2150: 20 65 76 61 6c 75 61 74 65 20 74 6f 20 65 69 74   evaluate to eit
2160: 68 65 72 20 61 20 74 65 78 74 0a 23 20 76 61 6c  her a text.# val
2170: 75 65 20 6f 72 20 4e 55 4c 4c 2e 0a 23 0a 23 20  ue or NULL..#.# 
2180: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
2190: 30 36 36 35 2d 31 37 37 39 32 20 54 68 65 20 72  0665-17792 The r
21a0: 65 73 75 6c 74 20 6f 66 20 61 6e 79 20 62 69 6e  esult of any bin
21b0: 61 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ary operator is 
21c0: 65 69 74 68 65 72 0a 23 20 61 20 6e 75 6d 65 72  either.# a numer
21d0: 69 63 20 76 61 6c 75 65 20 6f 72 20 4e 55 4c 4c  ic value or NULL
21e0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  , except for the
21f0: 20 7c 7c 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f   || concatenatio
2200: 6e 20 6f 70 65 72 61 74 6f 72 0a 23 20 77 68 69  n operator.# whi
2210: 63 68 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  ch always evalua
2220: 74 65 73 20 74 6f 20 65 69 74 68 65 72 20 4e 55  tes to either NU
2230: 4c 4c 20 6f 72 20 61 20 74 65 78 74 20 76 61 6c  LL or a text val
2240: 75 65 2e 0a 23 0a 73 65 74 20 6c 69 74 65 72 61  ue..#.set litera
2250: 6c 73 20 7b 0a 20 20 31 20 27 61 62 63 27 20 20  ls {.  1 'abc'  
2260: 20 20 20 20 20 20 32 20 27 68 65 78 61 64 65 63        2 'hexadec
2270: 69 6d 61 6c 27 20 20 20 20 20 20 20 33 20 27 27  imal'       3 ''
2280: 0a 20 20 34 20 31 32 33 20 20 20 20 20 20 20 20  .  4 123        
2290: 20 20 35 20 2d 31 32 33 20 20 20 20 20 20 20 20    5 -123        
22a0: 20 20 20 20 20 20 20 20 36 20 30 0a 20 20 37 20          6 0.  7 
22b0: 31 32 33 2e 34 20 20 20 20 20 20 20 20 38 20 30  123.4        8 0
22c0: 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
22d0: 20 20 20 39 20 2d 31 32 33 2e 34 0a 20 31 30 20     9 -123.4. 10 
22e0: 58 27 41 42 43 44 45 46 27 20 20 20 31 31 20 58  X'ABCDEF'   11 X
22f0: 27 27 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ''              
2300: 20 20 31 32 20 58 27 30 30 30 30 27 0a 20 31 33    12 X'0000'. 13
2310: 20 20 20 20 20 4e 55 4c 4c 0a 7d 0a 66 6f 72 65       NULL.}.fore
2320: 61 63 68 20 6f 70 20 24 6f 70 6c 69 73 74 20 7b  ach op $oplist {
2330: 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 31 20 72  .  foreach {n1 r
2340: 68 73 7d 20 24 6c 69 74 65 72 61 6c 73 20 7b 20  hs} $literals { 
2350: 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 32 20 6c  .  foreach {n2 l
2360: 68 73 7d 20 24 6c 69 74 65 72 61 6c 73 20 7b 0a  hs} $literals {.
2370: 0a 20 20 20 20 73 65 74 20 74 20 5b 64 62 20 6f  .    set t [db o
2380: 6e 65 20 22 20 53 45 4c 45 43 54 20 74 79 70 65  ne " SELECT type
2390: 6f 66 28 24 6c 68 73 20 24 6f 70 20 24 72 68 73  of($lhs $op $rhs
23a0: 29 20 22 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74  ) "].    do_test
23b0: 20 65 5f 65 78 70 72 2d 37 2e 24 6f 70 6e 61 6d   e_expr-7.$opnam
23c0: 65 28 24 6f 70 29 2e 24 6e 31 2e 24 6e 32 20 7b  e($op).$n1.$n2 {
23d0: 0a 20 20 20 20 20 20 65 78 70 72 20 7b 0a 20 20  .      expr {.  
23e0: 20 20 20 20 20 20 20 20 20 28 24 6f 70 3d 3d 22           ($op=="
23f0: 7c 7c 22 20 26 26 20 28 24 74 20 3d 3d 20 22 74  ||" && ($t == "t
2400: 65 78 74 22 20 7c 7c 20 24 74 20 3d 3d 20 22 6e  ext" || $t == "n
2410: 75 6c 6c 22 29 29 0a 20 20 20 20 20 20 20 20 7c  ull")).        |
2420: 7c 20 28 24 6f 70 21 3d 22 7c 7c 22 20 26 26 20  | ($op!="||" && 
2430: 28 24 74 20 3d 3d 20 22 69 6e 74 65 67 65 72 22  ($t == "integer"
2440: 20 7c 7c 20 24 74 20 3d 3d 20 22 72 65 61 6c 22   || $t == "real"
2450: 20 7c 7c 20 24 74 20 3d 3d 20 22 6e 75 6c 6c 22   || $t == "null"
2460: 29 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  )).      }.    }
2470: 20 31 0a 0a 20 20 7d 7d 0a 7d 0a 0a 23 2d 2d 2d   1..  }}.}..#---
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
24d0: 65 20 49 53 20 61 6e 64 20 49 53 20 4e 4f 54 20  e IS and IS NOT 
24e0: 6f 70 65 72 61 74 6f 72 73 2e 0a 23 0a 23 20 45  operators..#.# E
24f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
2500: 37 33 31 2d 34 35 37 37 33 20 54 68 65 20 49 53  731-45773 The IS
2510: 20 61 6e 64 20 49 53 20 4e 4f 54 20 6f 70 65 72   and IS NOT oper
2520: 61 74 6f 72 73 20 77 6f 72 6b 20 6c 69 6b 65 20  ators work like 
2530: 3d 20 61 6e 64 0a 23 20 21 3d 20 65 78 63 65 70  = and.# != excep
2540: 74 20 77 68 65 6e 20 6f 6e 65 20 6f 72 20 62 6f  t when one or bo
2550: 74 68 20 6f 66 20 74 68 65 20 6f 70 65 72 61 6e  th of the operan
2560: 64 73 20 61 72 65 20 4e 55 4c 4c 2e 0a 23 0a 23  ds are NULL..#.#
2570: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2580: 30 36 33 32 35 2d 31 35 33 31 35 20 49 6e 20 74  06325-15315 In t
2590: 68 69 73 20 63 61 73 65 2c 20 69 66 20 62 6f 74  his case, if bot
25a0: 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e  h operands are N
25b0: 55 4c 4c 2c 0a 23 20 74 68 65 6e 20 74 68 65 20  ULL,.# then the 
25c0: 49 53 20 6f 70 65 72 61 74 6f 72 20 65 76 61 6c  IS operator eval
25d0: 75 61 74 65 73 20 74 6f 20 31 20 28 74 72 75 65  uates to 1 (true
25e0: 29 20 61 6e 64 20 74 68 65 20 49 53 20 4e 4f 54  ) and the IS NOT
25f0: 20 6f 70 65 72 61 74 6f 72 0a 23 20 65 76 61 6c   operator.# eval
2600: 75 61 74 65 73 20 74 6f 20 30 20 28 66 61 6c 73  uates to 0 (fals
2610: 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  e)..#.# EVIDENCE
2620: 2d 4f 46 3a 20 52 2d 31 39 38 31 32 2d 33 36 37  -OF: R-19812-367
2630: 37 39 20 49 66 20 6f 6e 65 20 6f 70 65 72 61 6e  79 If one operan
2640: 64 20 69 73 20 4e 55 4c 4c 20 61 6e 64 20 74 68  d is NULL and th
2650: 65 20 6f 74 68 65 72 20 69 73 0a 23 20 6e 6f 74  e other is.# not
2660: 2c 20 74 68 65 6e 20 74 68 65 20 49 53 20 6f 70  , then the IS op
2670: 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73  erator evaluates
2680: 20 74 6f 20 30 20 28 66 61 6c 73 65 29 20 61 6e   to 0 (false) an
2690: 64 20 74 68 65 20 49 53 20 4e 4f 54 0a 23 20 6f  d the IS NOT.# o
26a0: 70 65 72 61 74 6f 72 20 69 73 20 31 20 28 74 72  perator is 1 (tr
26b0: 75 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ue)..#.# EVIDENC
26c0: 45 2d 4f 46 3a 20 52 2d 36 31 39 37 35 2d 31 33  E-OF: R-61975-13
26d0: 34 31 30 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  410 It is not po
26e0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 49 53  ssible for an IS
26f0: 20 6f 72 20 49 53 20 4e 4f 54 0a 23 20 65 78 70   or IS NOT.# exp
2700: 72 65 73 73 69 6f 6e 20 74 6f 20 65 76 61 6c 75  ression to evalu
2710: 61 74 65 20 74 6f 20 4e 55 4c 4c 2e 0a 23 0a 64  ate to NULL..#.d
2720: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
2730: 5f 65 78 70 72 2d 38 2e 31 2e 31 20 20 7b 20 53  _expr-8.1.1  { S
2740: 45 4c 45 43 54 20 4e 55 4c 4c 20 49 53 20 20 20  ELECT NULL IS   
2750: 20 20 4e 55 4c 4c 20 7d 20 7b 31 7d 0a 64 6f 5f    NULL } {1}.do_
2760: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
2770: 78 70 72 2d 38 2e 31 2e 32 20 20 7b 20 53 45 4c  xpr-8.1.2  { SEL
2780: 45 43 54 20 27 61 62 27 20 49 53 20 20 20 20 20  ECT 'ab' IS     
2790: 4e 55 4c 4c 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78  NULL } {0}.do_ex
27a0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
27b0: 72 2d 38 2e 31 2e 33 20 20 7b 20 53 45 4c 45 43  r-8.1.3  { SELEC
27c0: 54 20 4e 55 4c 4c 20 49 53 20 20 20 20 20 27 61  T NULL IS     'a
27d0: 62 27 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63  b' } {0}.do_exec
27e0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
27f0: 38 2e 31 2e 34 20 20 7b 20 53 45 4c 45 43 54 20  8.1.4  { SELECT 
2800: 27 61 62 27 20 49 53 20 20 20 20 20 27 61 62 27  'ab' IS     'ab'
2810: 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71   } {1}.do_execsq
2820: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
2830: 31 2e 35 20 20 7b 20 53 45 4c 45 43 54 20 4e 55  1.5  { SELECT NU
2840: 4c 4c 20 3d 3d 20 20 20 20 20 4e 55 4c 4c 20 7d  LL ==     NULL }
2850: 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {{}}.do_execsql
2860: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31  _test e_expr-8.1
2870: 2e 36 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .6  { SELECT 'ab
2880: 27 20 3d 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20  ' ==     NULL } 
2890: 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {{}}.do_execsql_
28a0: 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e  test e_expr-8.1.
28b0: 37 20 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c  7  { SELECT NULL
28c0: 20 3d 3d 20 20 20 20 20 27 61 62 27 20 7d 20 7b   ==     'ab' } {
28d0: 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}}.do_execsql_t
28e0: 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 38  est e_expr-8.1.8
28f0: 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27 20    { SELECT 'ab' 
2900: 3d 3d 20 20 20 20 20 27 61 62 27 20 7d 20 7b 31  ==     'ab' } {1
2910: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
2920: 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 39 20 20  t e_expr-8.1.9  
2930: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 49 53  { SELECT NULL IS
2940: 20 4e 4f 54 20 4e 55 4c 4c 20 7d 20 7b 30 7d 0a   NOT NULL } {0}.
2950: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2960: 65 5f 65 78 70 72 2d 38 2e 31 2e 31 30 20 7b 20  e_expr-8.1.10 { 
2970: 53 45 4c 45 43 54 20 27 61 62 27 20 49 53 20 4e  SELECT 'ab' IS N
2980: 4f 54 20 4e 55 4c 4c 20 7d 20 7b 31 7d 0a 64 6f  OT NULL } {1}.do
2990: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
29a0: 65 78 70 72 2d 38 2e 31 2e 31 31 20 7b 20 53 45  expr-8.1.11 { SE
29b0: 4c 45 43 54 20 4e 55 4c 4c 20 49 53 20 4e 4f 54  LECT NULL IS NOT
29c0: 20 27 61 62 27 20 7d 20 7b 31 7d 0a 64 6f 5f 65   'ab' } {1}.do_e
29d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
29e0: 70 72 2d 38 2e 31 2e 31 32 20 7b 20 53 45 4c 45  pr-8.1.12 { SELE
29f0: 43 54 20 27 61 62 27 20 49 53 20 4e 4f 54 20 27  CT 'ab' IS NOT '
2a00: 61 62 27 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65  ab' } {0}.do_exe
2a10: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
2a20: 2d 38 2e 31 2e 31 33 20 7b 20 53 45 4c 45 43 54  -8.1.13 { SELECT
2a30: 20 4e 55 4c 4c 20 21 3d 20 20 20 20 20 4e 55 4c   NULL !=     NUL
2a40: 4c 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63  L } {{}}.do_exec
2a50: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
2a60: 38 2e 31 2e 31 34 20 7b 20 53 45 4c 45 43 54 20  8.1.14 { SELECT 
2a70: 27 61 62 27 20 21 3d 20 20 20 20 20 4e 55 4c 4c  'ab' !=     NULL
2a80: 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73   } {{}}.do_execs
2a90: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38  ql_test e_expr-8
2aa0: 2e 31 2e 31 35 20 7b 20 53 45 4c 45 43 54 20 4e  .1.15 { SELECT N
2ab0: 55 4c 4c 20 21 3d 20 20 20 20 20 27 61 62 27 20  ULL !=     'ab' 
2ac0: 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  } {{}}.do_execsq
2ad0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
2ae0: 31 2e 31 36 20 7b 20 53 45 4c 45 43 54 20 27 61  1.16 { SELECT 'a
2af0: 62 27 20 21 3d 20 20 20 20 20 27 61 62 27 20 7d  b' !=     'ab' }
2b00: 20 7b 30 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 6e   {0}..foreach {n
2b10: 31 20 72 68 73 7d 20 24 6c 69 74 65 72 61 6c 73  1 rhs} $literals
2b20: 20 7b 20 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e   { .  foreach {n
2b30: 32 20 6c 68 73 7d 20 24 6c 69 74 65 72 61 6c 73  2 lhs} $literals
2b40: 20 7b 0a 20 20 20 20 69 66 20 7b 24 72 68 73 21   {.    if {$rhs!
2b50: 3d 22 4e 55 4c 4c 22 20 26 26 20 24 6c 68 73 21  ="NULL" && $lhs!
2b60: 3d 22 4e 55 4c 4c 22 7d 20 7b 0a 20 20 20 20 20  ="NULL"} {.     
2b70: 20 73 65 74 20 65 71 20 5b 65 78 65 63 73 71 6c   set eq [execsql
2b80: 20 22 53 45 4c 45 43 54 20 24 6c 68 73 20 3d 20   "SELECT $lhs = 
2b90: 24 72 68 73 2c 20 24 6c 68 73 20 21 3d 20 24 72  $rhs, $lhs != $r
2ba0: 68 73 22 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20  hs"].    } else 
2bb0: 7b 0a 20 20 20 20 20 20 73 65 74 20 65 71 20 5b  {.      set eq [
2bc0: 6c 69 73 74 20 5b 65 78 70 72 20 7b 24 6c 68 73  list [expr {$lhs
2bd0: 3d 3d 22 4e 55 4c 4c 22 20 26 26 20 24 72 68 73  =="NULL" && $rhs
2be0: 3d 3d 22 4e 55 4c 4c 22 7d 5d 20 5c 0a 20 20 20  =="NULL"}] \.   
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 5b 65 78 70 72 20 7b 24 6c 68 73 21 3d 22 4e 55  [expr {$lhs!="NU
2c10: 4c 4c 22 20 7c 7c 20 24 72 68 73 21 3d 22 4e 55  LL" || $rhs!="NU
2c20: 4c 4c 22 7d 5d 0a 20 20 20 20 20 20 5d 0a 20 20  LL"}].      ].  
2c30: 20 20 7d 0a 20 20 20 20 73 65 74 20 74 65 73 74    }.    set test
2c40: 20 65 5f 65 78 70 72 2d 38 2e 32 2e 24 6e 31 2e   e_expr-8.2.$n1.
2c50: 24 6e 32 0a 20 20 20 20 64 6f 5f 65 78 65 63 73  $n2.    do_execs
2c60: 71 6c 5f 74 65 73 74 20 24 74 65 73 74 2e 31 20  ql_test $test.1 
2c70: 22 53 45 4c 45 43 54 20 24 6c 68 73 20 49 53 20  "SELECT $lhs IS 
2c80: 24 72 68 73 2c 20 24 6c 68 73 20 49 53 20 4e 4f  $rhs, $lhs IS NO
2c90: 54 20 24 72 68 73 22 20 24 65 71 0a 20 20 20 20  T $rhs" $eq.    
2ca0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2cb0: 24 74 65 73 74 2e 32 20 22 0a 20 20 20 20 20 20  $test.2 ".      
2cc0: 53 45 4c 45 43 54 20 28 24 6c 68 73 20 49 53 20  SELECT ($lhs IS 
2cd0: 24 72 68 73 29 20 49 53 20 4e 55 4c 4c 2c 20 28  $rhs) IS NULL, (
2ce0: 24 6c 68 73 20 49 53 20 4e 4f 54 20 24 72 68 73  $lhs IS NOT $rhs
2cf0: 29 20 49 53 20 4e 55 4c 4c 0a 20 20 20 20 22 20  ) IS NULL.    " 
2d00: 7b 30 20 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d  {0 0}.  }.}..#--
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d50: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 75 6e 20 73 6f  -------.# Run so
2d60: 6d 65 20 74 65 73 74 73 20 6f 6e 20 74 68 65 20  me tests on the 
2d70: 43 4f 4c 4c 41 54 45 20 22 75 6e 61 72 79 20 70  COLLATE "unary p
2d80: 6f 73 74 66 69 78 20 6f 70 65 72 61 74 6f 72 22  ostfix operator"
2d90: 2e 0a 23 0a 23 20 54 68 69 73 20 63 6f 6c 6c 61  ..#.# This colla
2da0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65  tion sequence re
2db0: 76 65 72 73 65 73 20 62 6f 74 68 20 61 72 67 75  verses both argu
2dc0: 6d 65 6e 74 73 20 62 65 66 6f 72 65 20 75 73 69  ments before usi
2dd0: 6e 67 20 0a 23 20 5b 73 74 72 69 6e 67 20 63 6f  ng .# [string co
2de0: 6d 70 61 72 65 5d 20 74 6f 20 63 6f 6d 70 61 72  mpare] to compar
2df0: 65 20 74 68 65 6d 2e 20 46 6f 72 20 65 78 61 6d  e them. For exam
2e00: 70 6c 65 2c 20 77 68 65 6e 20 63 6f 6d 70 61 72  ple, when compar
2e10: 69 6e 67 20 74 68 65 0a 23 20 73 74 72 69 6e 67  ing the.# string
2e20: 73 20 27 6f 6e 65 27 20 61 6e 64 20 27 66 6f 75  s 'one' and 'fou
2e30: 72 27 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72  r', return the r
2e40: 65 73 75 6c 74 20 6f 66 3a 0a 23 20 20 20 0a 23  esult of:.#   .#
2e50: 20 20 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72     string compar
2e60: 65 20 65 6e 6f 20 72 75 6f 66 0a 23 0a 70 72 6f  e eno ruof.#.pro
2e70: 63 20 72 65 76 65 72 73 65 5f 73 74 72 20 7b 7a  c reverse_str {z
2e80: 53 74 72 7d 20 7b 0a 20 20 73 65 74 20 6f 75 74  Str} {.  set out
2e90: 20 22 22 0a 20 20 66 6f 72 65 61 63 68 20 63 20   "".  foreach c 
2ea0: 5b 73 70 6c 69 74 20 24 7a 53 74 72 20 7b 7d 5d  [split $zStr {}]
2eb0: 20 7b 20 73 65 74 20 6f 75 74 20 22 24 7b 63 7d   { set out "${c}
2ec0: 24 7b 6f 75 74 7d 22 20 7d 0a 20 20 73 65 74 20  ${out}" }.  set 
2ed0: 6f 75 74 0a 7d 0a 70 72 6f 63 20 72 65 76 65 72  out.}.proc rever
2ee0: 73 65 5f 63 6f 6c 6c 61 74 65 20 7b 7a 4c 65 66  se_collate {zLef
2ef0: 74 20 7a 52 69 67 68 74 7d 20 7b 0a 20 20 73 74  t zRight} {.  st
2f00: 72 69 6e 67 20 63 6f 6d 70 61 72 65 20 5b 72 65  ring compare [re
2f10: 76 65 72 73 65 5f 73 74 72 20 24 7a 4c 65 66 74  verse_str $zLeft
2f20: 5d 20 5b 72 65 76 65 72 73 65 5f 73 74 72 20 24  ] [reverse_str $
2f30: 7a 52 69 67 68 74 5d 0a 7d 0a 64 62 20 63 6f 6c  zRight].}.db col
2f40: 6c 61 74 65 20 72 65 76 65 72 73 65 20 72 65 76  late reverse rev
2f50: 65 72 73 65 5f 63 6f 6c 6c 61 74 65 0a 0a 23 20  erse_collate..# 
2f60: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
2f70: 39 35 37 37 2d 33 33 34 37 31 20 54 68 65 20 43  9577-33471 The C
2f80: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
2f90: 69 73 20 61 20 75 6e 61 72 79 20 70 6f 73 74 66  is a unary postf
2fa0: 69 78 0a 23 20 6f 70 65 72 61 74 6f 72 20 74 68  ix.# operator th
2fb0: 61 74 20 61 73 73 69 67 6e 73 20 61 20 63 6f 6c  at assigns a col
2fc0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
2fd0: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
2fe0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
2ff0: 46 3a 20 52 2d 33 36 32 33 31 2d 33 30 37 33 31  F: R-36231-30731
3000: 20 54 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   The COLLATE ope
3010: 72 61 74 6f 72 20 68 61 73 20 61 20 68 69 67 68  rator has a high
3020: 65 72 0a 23 20 70 72 65 63 65 64 65 6e 63 65 20  er.# precedence 
3030: 28 62 69 6e 64 73 20 6d 6f 72 65 20 74 69 67 68  (binds more tigh
3040: 74 6c 79 29 20 74 68 61 6e 20 61 6e 79 20 62 69  tly) than any bi
3050: 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 61 6e  nary operator an
3060: 64 20 61 6e 79 20 75 6e 61 72 79 0a 23 20 70 72  d any unary.# pr
3070: 65 66 69 78 20 6f 70 65 72 61 74 6f 72 20 65 78  efix operator ex
3080: 63 65 70 74 20 22 7e 22 2e 0a 23 0a 64 6f 5f 65  cept "~"..#.do_e
3090: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
30a0: 70 72 2d 39 2e 31 20 7b 20 53 45 4c 45 43 54 20  pr-9.1 { SELECT 
30b0: 20 27 61 62 63 64 27 20 3c 20 27 62 62 62 62 27   'abcd' < 'bbbb'
30c0: 20 20 20 20 43 4f 4c 4c 41 54 45 20 72 65 76 65      COLLATE reve
30d0: 72 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  rse } 0.do_execs
30e0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
30f0: 2e 32 20 7b 20 53 45 4c 45 43 54 20 28 27 61 62  .2 { SELECT ('ab
3100: 63 64 27 20 3c 20 27 62 62 62 62 27 29 20 20 20  cd' < 'bbbb')   
3110: 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65 20  COLLATE reverse 
3120: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
3130: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 33 20 7b  est e_expr-9.3 {
3140: 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27 20   SELECT  'abcd' 
3150: 3c 3d 20 27 62 62 62 62 27 20 20 20 43 4f 4c 4c  <= 'bbbb'   COLL
3160: 41 54 45 20 72 65 76 65 72 73 65 20 7d 20 30 0a  ATE reverse } 0.
3170: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3180: 65 5f 65 78 70 72 2d 39 2e 34 20 7b 20 53 45 4c  e_expr-9.4 { SEL
3190: 45 43 54 20 28 27 61 62 63 64 27 20 3c 3d 20 27  ECT ('abcd' <= '
31a0: 62 62 62 62 27 29 20 20 43 4f 4c 4c 41 54 45 20  bbbb')  COLLATE 
31b0: 72 65 76 65 72 73 65 20 7d 20 31 0a 0a 64 6f 5f  reverse } 1..do_
31c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
31d0: 78 70 72 2d 39 2e 35 20 7b 20 53 45 4c 45 43 54  xpr-9.5 { SELECT
31e0: 20 20 27 61 62 63 64 27 20 3e 20 27 62 62 62 62    'abcd' > 'bbbb
31f0: 27 20 20 20 20 43 4f 4c 4c 41 54 45 20 72 65 76  '    COLLATE rev
3200: 65 72 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  erse } 1.do_exec
3210: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3220: 39 2e 36 20 7b 20 53 45 4c 45 43 54 20 28 27 61  9.6 { SELECT ('a
3230: 62 63 64 27 20 3e 20 27 62 62 62 62 27 29 20 20  bcd' > 'bbbb')  
3240: 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65   COLLATE reverse
3250: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
3260: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 37 20  test e_expr-9.7 
3270: 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27  { SELECT  'abcd'
3280: 20 3e 3d 20 27 62 62 62 62 27 20 20 20 43 4f 4c   >= 'bbbb'   COL
3290: 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d 20 31  LATE reverse } 1
32a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
32b0: 20 65 5f 65 78 70 72 2d 39 2e 38 20 7b 20 53 45   e_expr-9.8 { SE
32c0: 4c 45 43 54 20 28 27 61 62 63 64 27 20 3e 3d 20  LECT ('abcd' >= 
32d0: 27 62 62 62 62 27 29 20 20 43 4f 4c 4c 41 54 45  'bbbb')  COLLATE
32e0: 20 72 65 76 65 72 73 65 20 7d 20 30 0a 0a 64 6f   reverse } 0..do
32f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3300: 65 78 70 72 2d 39 2e 31 30 20 7b 20 53 45 4c 45  expr-9.10 { SELE
3310: 43 54 20 20 27 61 62 63 64 27 20 3d 20 20 27 41  CT  'abcd' =  'A
3320: 42 43 44 27 20 20 43 4f 4c 4c 41 54 45 20 6e 6f  BCD'  COLLATE no
3330: 63 61 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  case } 1.do_exec
3340: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3350: 39 2e 31 31 20 7b 20 53 45 4c 45 43 54 20 28 27  9.11 { SELECT ('
3360: 61 62 63 64 27 20 3d 20 20 27 41 42 43 44 27 29  abcd' =  'ABCD')
3370: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
3380: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
3390: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 32 20  est e_expr-9.12 
33a0: 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27  { SELECT  'abcd'
33b0: 20 3d 3d 20 27 41 42 43 44 27 20 20 43 4f 4c 4c   == 'ABCD'  COLL
33c0: 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64  ATE nocase } 1.d
33d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
33e0: 5f 65 78 70 72 2d 39 2e 31 33 20 7b 20 53 45 4c  _expr-9.13 { SEL
33f0: 45 43 54 20 28 27 61 62 63 64 27 20 3d 3d 20 27  ECT ('abcd' == '
3400: 41 42 43 44 27 29 20 43 4f 4c 4c 41 54 45 20 6e  ABCD') COLLATE n
3410: 6f 63 61 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65  ocase } 0.do_exe
3420: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3430: 2d 39 2e 31 34 20 7b 20 53 45 4c 45 43 54 20 20  -9.14 { SELECT  
3440: 27 61 62 63 64 27 20 49 53 20 27 41 42 43 44 27  'abcd' IS 'ABCD'
3450: 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65    COLLATE nocase
3460: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
3470: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 35  test e_expr-9.15
3480: 20 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63 64   { SELECT ('abcd
3490: 27 20 49 53 20 27 41 42 43 44 27 29 20 43 4f 4c  ' IS 'ABCD') COL
34a0: 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a  LATE nocase } 0.
34b0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
34c0: 20 65 5f 65 78 70 72 2d 39 2e 31 36 20 7b 20 53   e_expr-9.16 { S
34d0: 45 4c 45 43 54 20 20 27 61 62 63 64 27 20 21 3d  ELECT  'abcd' !=
34e0: 20 27 41 42 43 44 27 20 20 20 20 20 20 43 4f 4c   'ABCD'      COL
34f0: 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a  LATE nocase } 0.
3500: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3510: 65 5f 65 78 70 72 2d 39 2e 31 37 20 7b 20 53 45  e_expr-9.17 { SE
3520: 4c 45 43 54 20 28 27 61 62 63 64 27 20 21 3d 20  LECT ('abcd' != 
3530: 27 41 42 43 44 27 29 20 20 20 20 20 43 4f 4c 4c  'ABCD')     COLL
3540: 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64  ATE nocase } 1.d
3550: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
3560: 5f 65 78 70 72 2d 39 2e 31 38 20 7b 20 53 45 4c  _expr-9.18 { SEL
3570: 45 43 54 20 20 27 61 62 63 64 27 20 3c 3e 20 27  ECT  'abcd' <> '
3580: 41 42 43 44 27 20 20 20 20 20 20 43 4f 4c 4c 41  ABCD'      COLLA
3590: 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64 6f  TE nocase } 0.do
35a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
35b0: 65 78 70 72 2d 39 2e 31 39 20 7b 20 53 45 4c 45  expr-9.19 { SELE
35c0: 43 54 20 28 27 61 62 63 64 27 20 3c 3e 20 27 41  CT ('abcd' <> 'A
35d0: 42 43 44 27 29 20 20 20 20 20 43 4f 4c 4c 41 54  BCD')     COLLAT
35e0: 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64 6f 5f  E nocase } 1.do_
35f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3600: 78 70 72 2d 39 2e 32 30 20 7b 20 53 45 4c 45 43  xpr-9.20 { SELEC
3610: 54 20 20 27 61 62 63 64 27 20 49 53 20 4e 4f 54  T  'abcd' IS NOT
3620: 20 27 41 42 43 44 27 20 20 43 4f 4c 4c 41 54 45   'ABCD'  COLLATE
3630: 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64 6f 5f 65   nocase } 0.do_e
3640: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
3650: 70 72 2d 39 2e 32 31 20 7b 20 53 45 4c 45 43 54  pr-9.21 { SELECT
3660: 20 28 27 61 62 63 64 27 20 49 53 20 4e 4f 54 20   ('abcd' IS NOT 
3670: 27 41 42 43 44 27 29 20 43 4f 4c 4c 41 54 45 20  'ABCD') COLLATE 
3680: 6e 6f 63 61 73 65 20 7d 20 31 0a 0a 64 6f 5f 65  nocase } 1..do_e
3690: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
36a0: 70 72 2d 39 2e 32 32 20 7b 20 0a 20 20 53 45 4c  pr-9.22 { .  SEL
36b0: 45 43 54 20 27 62 62 62 27 20 42 45 54 57 45 45  ECT 'bbb' BETWEE
36c0: 4e 20 27 41 41 41 27 20 41 4e 44 20 27 43 43 43  N 'AAA' AND 'CCC
36d0: 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ' COLLATE nocase
36e0: 20 0a 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c   .} 1.do_execsql
36f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
3700: 33 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 28 27  3 { .  SELECT ('
3710: 62 62 62 27 20 42 45 54 57 45 45 4e 20 27 41 41  bbb' BETWEEN 'AA
3720: 41 27 20 41 4e 44 20 27 43 43 43 27 29 20 43 4f  A' AND 'CCC') CO
3730: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 0a 7d 20  LLATE nocase .} 
3740: 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  0..# EVIDENCE-OF
3750: 3a 20 52 2d 35 38 37 33 31 2d 32 35 34 33 39 20  : R-58731-25439 
3760: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
3770: 71 75 65 6e 63 65 20 73 65 74 20 62 79 20 74 68  quence set by th
3780: 65 20 43 4f 4c 4c 41 54 45 0a 23 20 6f 70 65 72  e COLLATE.# oper
3790: 61 74 6f 72 20 6f 76 65 72 72 69 64 65 73 20 74  ator overrides t
37a0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
37b0: 75 65 6e 63 65 20 64 65 74 65 72 6d 69 6e 65 64  uence determined
37c0: 20 62 79 20 74 68 65 20 43 4f 4c 4c 41 54 45 0a   by the COLLATE.
37d0: 23 20 63 6c 61 75 73 65 20 69 6e 20 61 20 74 61  # clause in a ta
37e0: 62 6c 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  ble column defin
37f0: 69 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63  ition..#.do_exec
3800: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3810: 39 2e 32 34 20 7b 20 0a 20 20 43 52 45 41 54 45  9.24 { .  CREATE
3820: 20 54 41 42 4c 45 20 74 32 34 28 61 20 43 4f 4c   TABLE t24(a COL
3830: 4c 41 54 45 20 4e 4f 43 41 53 45 2c 20 62 29 3b  LATE NOCASE, b);
3840: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
3850: 32 34 20 56 41 4c 55 45 53 28 27 61 61 61 27 2c  24 VALUES('aaa',
3860: 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   1);.  INSERT IN
3870: 54 4f 20 74 32 34 20 56 41 4c 55 45 53 28 27 62  TO t24 VALUES('b
3880: 62 62 27 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52  bb', 2);.  INSER
3890: 54 20 49 4e 54 4f 20 74 32 34 20 56 41 4c 55 45  T INTO t24 VALUE
38a0: 53 28 27 63 63 63 27 2c 20 33 29 3b 0a 7d 20 7b  S('ccc', 3);.} {
38b0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
38c0: 74 20 65 5f 65 78 70 72 2d 39 2e 32 35 20 7b 20  t e_expr-9.25 { 
38d0: 53 45 4c 45 43 54 20 27 42 42 42 27 20 3d 20 61  SELECT 'BBB' = a
38e0: 20 46 52 4f 4d 20 74 32 34 20 7d 20 7b 30 20 31   FROM t24 } {0 1
38f0: 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   0}.do_execsql_t
3900: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32 35 20  est e_expr-9.25 
3910: 7b 20 53 45 4c 45 43 54 20 61 20 3d 20 27 42 42  { SELECT a = 'BB
3920: 42 27 20 46 52 4f 4d 20 74 32 34 20 7d 20 7b 30  B' FROM t24 } {0
3930: 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   1 0}.do_execsql
3940: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
3950: 35 20 7b 20 53 45 4c 45 43 54 20 27 42 42 42 27  5 { SELECT 'BBB'
3960: 20 3d 20 61 20 43 4f 4c 4c 41 54 45 20 62 69 6e   = a COLLATE bin
3970: 61 72 79 20 46 52 4f 4d 20 74 32 34 20 7d 20 7b  ary FROM t24 } {
3980: 30 20 30 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71  0 0 0}.do_execsq
3990: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e  l_test e_expr-9.
39a0: 32 35 20 7b 20 53 45 4c 45 43 54 20 61 20 43 4f  25 { SELECT a CO
39b0: 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 3d 20 27  LLATE binary = '
39c0: 42 42 42 27 20 46 52 4f 4d 20 74 32 34 20 7d 20  BBB' FROM t24 } 
39d0: 7b 30 20 30 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  {0 0 0}..#------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65  ---.# Test state
3a30: 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f  ments related to
3a40: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 2e   literal values.
3a50: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
3a60: 3a 20 52 2d 33 31 35 33 36 2d 33 32 30 30 38 20  : R-31536-32008 
3a70: 4c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20 6d  Literal values m
3a80: 61 79 20 62 65 20 69 6e 74 65 67 65 72 73 2c 20  ay be integers, 
3a90: 66 6c 6f 61 74 69 6e 67 0a 23 20 70 6f 69 6e 74  floating.# point
3aa0: 20 6e 75 6d 62 65 72 73 2c 20 73 74 72 69 6e 67   numbers, string
3ab0: 73 2c 20 42 4c 4f 42 73 2c 20 6f 72 20 4e 55 4c  s, BLOBs, or NUL
3ac0: 4c 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  Ls..#.do_execsql
3ad0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e  _test e_expr-10.
3ae0: 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 74 79 70  1.1 { SELECT typ
3af0: 65 6f 66 28 35 29 20 20 20 20 20 20 20 7d 20 7b  eof(5)       } {
3b00: 69 6e 74 65 67 65 72 7d 0a 64 6f 5f 65 78 65 63  integer}.do_exec
3b10: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3b20: 31 30 2e 31 2e 32 20 7b 20 53 45 4c 45 43 54 20  10.1.2 { SELECT 
3b30: 74 79 70 65 6f 66 28 35 2e 31 29 20 20 20 20 20  typeof(5.1)     
3b40: 7d 20 7b 72 65 61 6c 7d 0a 64 6f 5f 65 78 65 63  } {real}.do_exec
3b50: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3b60: 31 30 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54 20  10.1.3 { SELECT 
3b70: 74 79 70 65 6f 66 28 27 35 2e 31 27 29 20 20 20  typeof('5.1')   
3b80: 7d 20 7b 74 65 78 74 7d 0a 64 6f 5f 65 78 65 63  } {text}.do_exec
3b90: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3ba0: 31 30 2e 31 2e 34 20 7b 20 53 45 4c 45 43 54 20  10.1.4 { SELECT 
3bb0: 74 79 70 65 6f 66 28 58 27 41 42 43 44 27 29 20  typeof(X'ABCD') 
3bc0: 7d 20 7b 62 6c 6f 62 7d 0a 64 6f 5f 65 78 65 63  } {blob}.do_exec
3bd0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3be0: 31 30 2e 31 2e 35 20 7b 20 53 45 4c 45 43 54 20  10.1.5 { SELECT 
3bf0: 74 79 70 65 6f 66 28 4e 55 4c 4c 29 20 20 20 20  typeof(NULL)    
3c00: 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 20 22 53 63 69  } {null}..# "Sci
3c10: 65 6e 74 69 66 69 63 20 6e 6f 74 61 74 69 6f 6e  entific notation
3c20: 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f   is supported fo
3c30: 72 20 70 6f 69 6e 74 20 6c 69 74 65 72 61 6c 20  r point literal 
3c40: 76 61 6c 75 65 73 2e 22 0a 23 0a 64 6f 5f 65 78  values.".#.do_ex
3c50: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3c60: 72 2d 31 30 2e 32 2e 31 20 7b 20 53 45 4c 45 43  r-10.2.1 { SELEC
3c70: 54 20 74 79 70 65 6f 66 28 33 2e 34 65 2d 30 32  T typeof(3.4e-02
3c80: 29 20 20 20 20 7d 20 7b 72 65 61 6c 7d 0a 64 6f  )    } {real}.do
3c90: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3ca0: 65 78 70 72 2d 31 30 2e 32 2e 32 20 7b 20 53 45  expr-10.2.2 { SE
3cb0: 4c 45 43 54 20 74 79 70 65 6f 66 28 33 65 2b 35  LECT typeof(3e+5
3cc0: 29 20 20 20 20 20 20 20 7d 20 7b 72 65 61 6c 7d  )       } {real}
3cd0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3ce0: 20 65 5f 65 78 70 72 2d 31 30 2e 32 2e 33 20 7b   e_expr-10.2.3 {
3cf0: 20 53 45 4c 45 43 54 20 33 2e 34 65 2d 30 32 20   SELECT 3.4e-02 
3d00: 20 20 20 20 20 20 20 20 20 20 20 7d 20 7b 30 2e             } {0.
3d10: 30 33 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  034}.do_execsql_
3d20: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 32  test e_expr-10.2
3d30: 2e 34 20 7b 20 53 45 4c 45 43 54 20 33 65 2b 34  .4 { SELECT 3e+4
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
3d50: 20 7b 33 30 30 30 30 2e 30 7d 0a 0a 23 20 45 56   {30000.0}..# EV
3d60: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 35 32  IDENCE-OF: R-352
3d70: 32 39 2d 31 37 38 33 30 20 41 20 73 74 72 69 6e  29-17830 A strin
3d80: 67 20 63 6f 6e 73 74 61 6e 74 20 69 73 20 66 6f  g constant is fo
3d90: 72 6d 65 64 20 62 79 20 65 6e 63 6c 6f 73 69 6e  rmed by enclosin
3da0: 67 0a 23 20 74 68 65 20 73 74 72 69 6e 67 20 69  g.# the string i
3db0: 6e 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 20  n single quotes 
3dc0: 28 27 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  (')..#.# EVIDENC
3dd0: 45 2d 4f 46 3a 20 52 2d 30 37 31 30 30 2d 30 36  E-OF: R-07100-06
3de0: 36 30 36 20 41 20 73 69 6e 67 6c 65 20 71 75 6f  606 A single quo
3df0: 74 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  te within the st
3e00: 72 69 6e 67 20 63 61 6e 20 62 65 0a 23 20 65 6e  ring can be.# en
3e10: 63 6f 64 65 64 20 62 79 20 70 75 74 74 69 6e 67  coded by putting
3e20: 20 74 77 6f 20 73 69 6e 67 6c 65 20 71 75 6f 74   two single quot
3e30: 65 73 20 69 6e 20 61 20 72 6f 77 20 2d 20 61 73  es in a row - as
3e40: 20 69 6e 20 50 61 73 63 61 6c 2e 0a 23 0a 64 6f   in Pascal..#.do
3e50: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3e60: 65 78 70 72 2d 31 30 2e 33 2e 31 20 7b 20 53 45  expr-10.3.1 { SE
3e70: 4c 45 43 54 20 27 69 73 20 6e 6f 74 27 20 7d 20  LECT 'is not' } 
3e80: 20 20 20 20 20 20 20 20 7b 7b 69 73 20 6e 6f 74          {{is not
3e90: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
3ea0: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 33 2e 32  st e_expr-10.3.2
3eb0: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3ec0: 28 27 69 73 20 6e 6f 74 27 29 20 7d 20 7b 74 65  ('is not') } {te
3ed0: 78 74 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  xt}.do_execsql_t
3ee0: 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 33 2e  est e_expr-10.3.
3ef0: 33 20 7b 20 53 45 4c 45 43 54 20 27 69 73 6e 27  3 { SELECT 'isn'
3f00: 27 74 27 20 7d 20 20 20 20 20 20 20 20 20 7b 69  't' }         {i
3f10: 73 6e 27 74 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  sn't}.do_execsql
3f20: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e  _test e_expr-10.
3f30: 33 2e 34 20 7b 20 53 45 4c 45 43 54 20 74 79 70  3.4 { SELECT typ
3f40: 65 6f 66 28 27 69 73 6e 27 27 74 27 29 20 7d 20  eof('isn''t') } 
3f50: 7b 74 65 78 74 7d 0a 0a 23 20 45 56 49 44 45 4e  {text}..# EVIDEN
3f60: 43 45 2d 4f 46 3a 20 52 2d 30 39 35 39 33 2d 30  CE-OF: R-09593-0
3f70: 33 33 32 31 20 42 4c 4f 42 20 6c 69 74 65 72 61  3321 BLOB litera
3f80: 6c 73 20 61 72 65 20 73 74 72 69 6e 67 20 6c 69  ls are string li
3f90: 74 65 72 61 6c 73 0a 23 20 63 6f 6e 74 61 69 6e  terals.# contain
3fa0: 69 6e 67 20 68 65 78 61 64 65 63 69 6d 61 6c 20  ing hexadecimal 
3fb0: 64 61 74 61 20 61 6e 64 20 70 72 65 63 65 64 65  data and precede
3fc0: 64 20 62 79 20 61 20 73 69 6e 67 6c 65 20 22 78  d by a single "x
3fd0: 22 20 6f 72 20 22 58 22 0a 23 20 63 68 61 72 61  " or "X".# chara
3fe0: 63 74 65 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e  cter..#.# EVIDEN
3ff0: 43 45 2d 4f 46 3a 20 52 2d 31 39 38 33 36 2d 31  CE-OF: R-19836-1
4000: 31 32 34 34 20 45 78 61 6d 70 6c 65 3a 20 58 27  1244 Example: X'
4010: 35 33 35 31 34 43 36 39 37 34 36 35 27 0a 23 0a  53514C697465'.#.
4020: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
4030: 65 5f 65 78 70 72 2d 31 30 2e 34 2e 31 20 7b 20  e_expr-10.4.1 { 
4040: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 58 27  SELECT typeof(X'
4050: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46  0123456789ABCDEF
4060: 27 29 20 7d 20 62 6c 6f 62 0a 64 6f 5f 65 78 65  ') } blob.do_exe
4070: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
4080: 2d 31 30 2e 34 2e 32 20 7b 20 53 45 4c 45 43 54  -10.4.2 { SELECT
4090: 20 74 79 70 65 6f 66 28 78 27 30 31 32 33 34 35   typeof(x'012345
40a0: 36 37 38 39 41 42 43 44 45 46 27 29 20 7d 20 62  6789ABCDEF') } b
40b0: 6c 6f 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  lob.do_execsql_t
40c0: 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e  est e_expr-10.4.
40d0: 33 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f  3 { SELECT typeo
40e0: 66 28 58 27 30 31 32 33 34 35 36 37 38 39 61 62  f(X'0123456789ab
40f0: 63 64 65 66 27 29 20 7d 20 62 6c 6f 62 0a 64 6f  cdef') } blob.do
4100: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
4110: 65 78 70 72 2d 31 30 2e 34 2e 34 20 7b 20 53 45  expr-10.4.4 { SE
4120: 4c 45 43 54 20 74 79 70 65 6f 66 28 78 27 30 31  LECT typeof(x'01
4130: 32 33 34 35 36 37 38 39 61 62 63 64 65 66 27 29  23456789abcdef')
4140: 20 7d 20 62 6c 6f 62 0a 64 6f 5f 65 78 65 63 73   } blob.do_execs
4150: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
4160: 30 2e 34 2e 35 20 7b 20 53 45 4c 45 43 54 20 74  0.4.5 { SELECT t
4170: 79 70 65 6f 66 28 58 27 35 33 35 31 34 43 36 39  ypeof(X'53514C69
4180: 37 34 36 35 27 29 20 20 20 20 20 7d 20 62 6c 6f  7465')     } blo
4190: 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  b..# EVIDENCE-OF
41a0: 3a 20 52 2d 32 33 39 31 34 2d 35 31 34 37 36 20  : R-23914-51476 
41b0: 41 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 20  A literal value 
41c0: 63 61 6e 20 61 6c 73 6f 20 62 65 20 74 68 65 20  can also be the 
41d0: 74 6f 6b 65 6e 0a 23 20 22 4e 55 4c 4c 22 2e 0a  token.# "NULL"..
41e0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
41f0: 74 20 65 5f 65 78 70 72 2d 31 30 2e 35 2e 31 20  t e_expr-10.5.1 
4200: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 20 20  { SELECT NULL   
4210: 20 20 20 20 20 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f        } {{}}.do_
4220: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
4230: 78 70 72 2d 31 30 2e 35 2e 32 20 7b 20 53 45 4c  xpr-10.5.2 { SEL
4240: 45 43 54 20 74 79 70 65 6f 66 28 4e 55 4c 4c 29  ECT typeof(NULL)
4250: 20 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 2d 2d 2d 2d   } {null}..#----
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42a0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61  -----.# Test sta
42b0: 74 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20  tements related 
42c0: 74 6f 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74  to bound paramet
42d0: 65 72 73 0a 23 0a 0a 70 72 6f 63 20 70 61 72 61  ers.#..proc para
42e0: 6d 65 74 65 72 5f 74 65 73 74 20 7b 74 6e 20 73  meter_test {tn s
42f0: 71 6c 20 70 61 72 61 6d 73 20 72 65 73 75 6c 74  ql params result
4300: 7d 20 7b 0a 20 20 73 65 74 20 73 74 6d 74 20 5b  } {.  set stmt [
4310: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
4320: 76 32 20 64 62 20 24 73 71 6c 20 2d 31 5d 0a 0a  v2 db $sql -1]..
4330: 20 20 66 6f 72 65 61 63 68 20 7b 6e 75 6d 62 65    foreach {numbe
4340: 72 20 6e 61 6d 65 7d 20 24 70 61 72 61 6d 73 20  r name} $params 
4350: 7b 0a 20 20 20 20 73 65 74 20 6e 6d 20 5b 73 71  {.    set nm [sq
4360: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
4370: 65 74 65 72 5f 6e 61 6d 65 20 24 73 74 6d 74 20  eter_name $stmt 
4380: 24 6e 75 6d 62 65 72 5d 0a 20 20 20 20 64 6f 5f  $number].    do_
4390: 74 65 73 74 20 24 74 6e 2e 6e 61 6d 65 2e 24 6e  test $tn.name.$n
43a0: 75 6d 62 65 72 20 5b 6c 69 73 74 20 73 65 74 20  umber [list set 
43b0: 7b 7d 20 24 6e 6d 5d 20 24 6e 61 6d 65 0a 20 20  {} $nm] $name.  
43c0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
43d0: 6e 74 20 24 73 74 6d 74 20 24 6e 75 6d 62 65 72  nt $stmt $number
43e0: 20 5b 65 78 70 72 20 2d 31 20 2a 20 24 6e 75 6d   [expr -1 * $num
43f0: 62 65 72 5d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ber].  }..  sqli
4400: 74 65 33 5f 73 74 65 70 20 24 73 74 6d 74 0a 0a  te3_step $stmt..
4410: 20 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74 5d    set res [list]
4420: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
4430: 20 7b 24 69 20 3c 20 5b 73 71 6c 69 74 65 33 5f   {$i < [sqlite3_
4440: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 24 73 74  column_count $st
4450: 6d 74 5d 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  mt]} {incr i} {.
4460: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20      lappend res 
4470: 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  [sqlite3_column_
4480: 74 65 78 74 20 24 73 74 6d 74 20 24 69 5d 0a 20  text $stmt $i]. 
4490: 20 7d 0a 0a 20 20 73 65 74 20 72 63 20 5b 73 71   }..  set rc [sq
44a0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
44b0: 73 74 6d 74 5d 0a 20 20 64 6f 5f 74 65 73 74 20  stmt].  do_test 
44c0: 24 74 6e 2e 72 63 20 5b 6c 69 73 74 20 73 65 74  $tn.rc [list set
44d0: 20 7b 7d 20 24 72 63 5d 20 53 51 4c 49 54 45 5f   {} $rc] SQLITE_
44e0: 4f 4b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 6e  OK.  do_test $tn
44f0: 2e 72 65 73 20 5b 6c 69 73 74 20 73 65 74 20 7b  .res [list set {
4500: 7d 20 24 72 65 73 5d 20 24 72 65 73 75 6c 74 0a  } $res] $result.
4510: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
4520: 3a 20 52 2d 33 33 35 30 39 2d 33 39 34 35 38 20  : R-33509-39458 
4530: 41 20 71 75 65 73 74 69 6f 6e 20 6d 61 72 6b 20  A question mark 
4540: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 6e 75  followed by a nu
4550: 6d 62 65 72 20 4e 4e 4e 0a 23 20 68 6f 6c 64 73  mber NNN.# holds
4560: 20 61 20 73 70 6f 74 20 66 6f 72 20 74 68 65 20   a spot for the 
4570: 4e 4e 4e 2d 74 68 20 70 61 72 61 6d 65 74 65 72  NNN-th parameter
4580: 2e 20 4e 4e 4e 20 6d 75 73 74 20 62 65 20 62 65  . NNN must be be
4590: 74 77 65 65 6e 20 31 20 61 6e 64 0a 23 20 53 51  tween 1 and.# SQ
45a0: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
45b0: 45 5f 4e 55 4d 42 45 52 2e 0a 23 0a 73 65 74 20  E_NUMBER..#.set 
45c0: 6d 76 6e 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f  mvn $SQLITE_MAX_
45d0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 0a  VARIABLE_NUMBER.
45e0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
45f0: 5f 65 78 70 72 2d 31 31 2e 31 20 22 0a 20 20 53  _expr-11.1 ".  S
4600: 45 4c 45 43 54 20 3f 31 2c 20 3f 31 32 33 2c 20  ELECT ?1, ?123, 
4610: 3f 24 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  ?$SQLITE_MAX_VAR
4620: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 3f 31  IABLE_NUMBER, ?1
4630: 32 33 2c 20 3f 34 0a 22 20 20 20 22 31 20 3f 31  23, ?4."   "1 ?1
4640: 20 20 31 32 33 20 3f 31 32 33 20 24 6d 76 6e 20    123 ?123 $mvn 
4650: 3f 24 6d 76 6e 20 34 20 3f 34 22 20 20 20 22 2d  ?$mvn 4 ?4"   "-
4660: 31 20 2d 31 32 33 20 2d 24 6d 76 6e 20 2d 31 32  1 -123 -$mvn -12
4670: 33 20 2d 34 22 0a 0a 73 65 74 20 65 72 72 6d 73  3 -4"..set errms
4680: 67 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  g "variable numb
4690: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
46a0: 65 6e 20 3f 31 20 61 6e 64 20 3f 24 53 51 4c 49  en ?1 and ?$SQLI
46b0: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
46c0: 4e 55 4d 42 45 52 22 0a 66 6f 72 65 61 63 68 20  NUMBER".foreach 
46d0: 7b 74 6e 20 70 61 72 61 6d 5f 6e 75 6d 62 65 72  {tn param_number
46e0: 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 32 20 20 30  } [list \.  2  0
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 20 20 5c 0a 20 20 33 20 20 5b 65 78 70 72      \.  3  [expr
4720: 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52   $SQLITE_MAX_VAR
4730: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2b 31 5d 20  IABLE_NUMBER+1] 
4740: 5c 0a 20 20 34 20 20 5b 65 78 70 72 20 24 53 51  \.  4  [expr $SQ
4750: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
4760: 45 5f 4e 55 4d 42 45 52 2b 32 5d 20 5c 0a 20 20  E_NUMBER+2] \.  
4770: 35 20 20 31 32 33 34 35 36 37 38 39 30 33 34 35  5  1234567890345
4780: 36 37 38 39 30 33 34 35 36 37 38 39 30 32 33 34  6789034567890234
4790: 35 36 37 38 39 30 20 20 5c 0a 20 20 36 20 20 32  567890  \.  6  2
47a0: 31 34 37 34 38 33 36 34 38 20 20 20 20 20 20 20  147483648       
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47c0: 20 20 20 20 5c 0a 20 20 37 20 20 32 31 34 37 34      \.  7  21474
47d0: 38 33 36 34 39 20 20 20 20 20 20 20 20 20 20 20  83649           
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 5c 0a 20 20 38 20 20 34 32 39 34 39 36 37 32 39  \.  8  429496729
4800: 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
4810: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
4820: 39 20 20 34 32 39 34 39 36 37 32 39 37 20 20 20  9  4294967297   
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 20 20 20 20 20 20 20 5c 0a 20 20 31 30 20 39          \.  10 9
4850: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
4860: 30 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20  08              
4870: 20 20 20 20 5c 0a 20 20 31 31 20 39 32 32 33 33      \.  11 92233
4880: 37 32 30 33 36 38 35 34 37 37 35 38 30 39 20 20  72036854775809  
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48a0: 5c 0a 20 20 31 32 20 31 38 34 34 36 37 34 34 30  \.  12 184467440
48b0: 37 33 37 30 39 35 35 31 36 31 36 20 20 20 20 20  73709551616     
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
48d0: 31 33 20 31 38 34 34 36 37 34 34 30 37 33 37 30  13 1844674407370
48e0: 39 35 35 31 36 31 37 20 20 20 20 20 20 20 20 20  9551617         
48f0: 20 20 20 20 20 20 20 20 5c 0a 5d 20 7b 0a 20 20          \.] {.  
4900: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
4910: 20 65 5f 65 78 70 72 2d 31 31 2e 31 2e 24 74 6e   e_expr-11.1.$tn
4920: 20 22 53 45 4c 45 43 54 20 3f 24 70 61 72 61 6d   "SELECT ?$param
4930: 5f 6e 75 6d 62 65 72 22 20 5b 6c 69 73 74 20 31  _number" [list 1
4940: 20 24 65 72 72 6d 73 67 5d 0a 7d 0a 0a 23 20 45   $errmsg].}..# E
4950: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33  VIDENCE-OF: R-33
4960: 36 37 30 2d 33 36 30 39 37 20 41 20 71 75 65 73  670-36097 A ques
4970: 74 69 6f 6e 20 6d 61 72 6b 20 74 68 61 74 20 69  tion mark that i
4980: 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 65 64 20 62  s not followed b
4990: 79 20 61 0a 23 20 6e 75 6d 62 65 72 20 63 72 65  y a.# number cre
49a0: 61 74 65 73 20 61 20 70 61 72 61 6d 65 74 65 72  ates a parameter
49b0: 20 77 69 74 68 20 61 20 6e 75 6d 62 65 72 20 6f   with a number o
49c0: 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ne greater than 
49d0: 74 68 65 20 6c 61 72 67 65 73 74 0a 23 20 70 61  the largest.# pa
49e0: 72 61 6d 65 74 65 72 20 6e 75 6d 62 65 72 20 61  rameter number a
49f0: 6c 72 65 61 64 79 20 61 73 73 69 67 6e 65 64 2e  lready assigned.
4a00: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
4a10: 3a 20 52 2d 34 32 39 33 38 2d 30 37 30 33 30 20  : R-42938-07030 
4a20: 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  If this means th
4a30: 65 20 70 61 72 61 6d 65 74 65 72 20 6e 75 6d 62  e parameter numb
4a40: 65 72 20 69 73 0a 23 20 67 72 65 61 74 65 72 20  er is.# greater 
4a50: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f  than SQLITE_MAX_
4a60: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c  VARIABLE_NUMBER,
4a70: 20 69 74 20 69 73 20 61 6e 20 65 72 72 6f 72 2e   it is an error.
4a80: 0a 23 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  .#.parameter_tes
4a90: 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 31 20  t e_expr-11.2.1 
4aa0: 22 53 45 4c 45 43 54 20 3f 22 20 20 20 20 20 20  "SELECT ?"      
4ab0: 20 20 20 20 7b 31 20 7b 7d 7d 20 20 20 20 20 20      {1 {}}      
4ac0: 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65   -1.parameter_te
4ad0: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 32  st e_expr-11.2.2
4ae0: 20 22 53 45 4c 45 43 54 20 3f 2c 20 3f 22 20 20   "SELECT ?, ?"  
4af0: 20 20 20 20 20 7b 31 20 7b 7d 20 32 20 7b 7d 7d       {1 {} 2 {}}
4b00: 20 20 7b 2d 31 20 2d 32 7d 0a 70 61 72 61 6d 65    {-1 -2}.parame
4b10: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4b20: 31 31 2e 32 2e 33 20 22 53 45 4c 45 43 54 20 3f  11.2.3 "SELECT ?
4b30: 35 2c 20 3f 22 20 20 20 20 20 20 7b 35 20 3f 35  5, ?"      {5 ?5
4b40: 20 36 20 7b 7d 7d 20 20 7b 2d 35 20 2d 36 7d 0a   6 {}}  {-5 -6}.
4b50: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
4b60: 5f 65 78 70 72 2d 31 31 2e 32 2e 34 20 22 53 45  _expr-11.2.4 "SE
4b70: 4c 45 43 54 20 3f 2c 20 3f 35 22 20 20 20 20 20  LECT ?, ?5"     
4b80: 20 7b 31 20 7b 7d 20 35 20 3f 35 7d 20 20 7b 2d   {1 {} 5 ?5}  {-
4b90: 31 20 2d 35 7d 0a 70 61 72 61 6d 65 74 65 72 5f  1 -5}.parameter_
4ba0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32  test e_expr-11.2
4bb0: 2e 35 20 22 53 45 4c 45 43 54 20 3f 2c 20 3f 34  .5 "SELECT ?, ?4
4bc0: 35 36 2c 20 3f 22 20 7b 0a 20 20 31 20 7b 7d 20  56, ?" {.  1 {} 
4bd0: 34 35 36 20 3f 34 35 36 20 34 35 37 20 7b 7d 0a  456 ?456 457 {}.
4be0: 7d 20 20 7b 2d 31 20 2d 34 35 36 20 2d 34 35 37  }  {-1 -456 -457
4bf0: 7d 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  }.parameter_test
4c00: 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 35 20 22   e_expr-11.2.5 "
4c10: 53 45 4c 45 43 54 20 3f 2c 20 3f 34 35 36 2c 20  SELECT ?, ?456, 
4c20: 3f 34 2c 20 3f 22 20 7b 0a 20 20 31 20 7b 7d 20  ?4, ?" {.  1 {} 
4c30: 34 35 36 20 3f 34 35 36 20 34 20 3f 34 20 34 35  456 ?456 4 ?4 45
4c40: 37 20 7b 7d 0a 7d 20 20 7b 2d 31 20 2d 34 35 36  7 {}.}  {-1 -456
4c50: 20 2d 34 20 2d 34 35 37 7d 0a 66 6f 72 65 61 63   -4 -457}.foreac
4c60: 68 20 7b 74 6e 20 73 71 6c 7d 20 5b 6c 69 73 74  h {tn sql} [list
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 31             \.  1
4c90: 20 20 22 53 45 4c 45 43 54 20 3f 24 6d 76 6e 2c    "SELECT ?$mvn,
4ca0: 20 3f 22 20 20 20 20 20 20 20 20 20 20 20 20 20   ?"             
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4cc0: 20 20 32 20 20 22 53 45 4c 45 43 54 20 3f 5b 65    2  "SELECT ?[e
4cd0: 78 70 72 20 24 6d 76 6e 2d 35 5d 2c 20 3f 2c 20  xpr $mvn-5], ?, 
4ce0: 3f 2c 20 3f 2c 20 3f 2c 20 3f 2c 20 3f 22 20 20  ?, ?, ?, ?, ?"  
4cf0: 20 5c 0a 20 20 33 20 20 22 53 45 4c 45 43 54 20   \.  3  "SELECT 
4d00: 3f 5b 65 78 70 72 20 24 6d 76 6e 5d 2c 20 3f 35  ?[expr $mvn], ?5
4d10: 2c 20 3f 36 2c 20 3f 22 20 20 20 20 20 20 20 20  , ?6, ?"        
4d20: 20 20 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 63      \.] {.  do_c
4d30: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65  atchsql_test e_e
4d40: 78 70 72 2d 31 31 2e 33 2e 24 74 6e 20 24 73 71  xpr-11.3.$tn $sq
4d50: 6c 20 5b 6c 69 73 74 20 31 20 7b 74 6f 6f 20 6d  l [list 1 {too m
4d60: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
4d70: 73 7d 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  s}].}..# EVIDENC
4d80: 45 2d 4f 46 3a 20 52 2d 31 31 36 32 30 2d 32 32  E-OF: R-11620-22
4d90: 37 34 33 20 41 20 63 6f 6c 6f 6e 20 66 6f 6c 6c  743 A colon foll
4da0: 6f 77 65 64 20 62 79 20 61 6e 20 69 64 65 6e 74  owed by an ident
4db0: 69 66 69 65 72 20 6e 61 6d 65 0a 23 20 68 6f 6c  ifier name.# hol
4dc0: 64 73 20 61 20 73 70 6f 74 20 66 6f 72 20 61 20  ds a spot for a 
4dd0: 6e 61 6d 65 64 20 70 61 72 61 6d 65 74 65 72 20  named parameter 
4de0: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 3a 41  with the name :A
4df0: 41 41 41 2e 0a 23 0a 23 20 49 64 65 6e 74 69 66  AAA..#.# Identif
4e00: 69 65 72 73 20 69 6e 20 53 51 4c 69 74 65 20 63  iers in SQLite c
4e10: 6f 6e 73 69 73 74 20 6f 66 20 61 6c 70 68 61 6e  onsist of alphan
4e20: 75 6d 65 72 69 63 2c 20 27 5f 27 20 61 6e 64 20  umeric, '_' and 
4e30: 27 24 27 20 63 68 61 72 61 63 74 65 72 73 2c 0a  '$' characters,.
4e40: 23 20 61 6e 64 20 61 6e 79 20 55 54 46 20 63 68  # and any UTF ch
4e50: 61 72 61 63 74 65 72 73 20 77 69 74 68 20 63 6f  aracters with co
4e60: 64 65 70 6f 69 6e 74 73 20 6c 61 72 67 65 72 20  depoints larger 
4e70: 74 68 61 6e 20 31 32 37 20 28 6e 6f 6e 2d 41 53  than 127 (non-AS
4e80: 43 49 49 20 0a 23 20 63 68 61 72 61 63 74 65 72  CII .# character
4e90: 73 29 2e 0a 23 0a 70 61 72 61 6d 65 74 65 72 5f  s)..#.parameter_
4ea0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32  test e_expr-11.2
4eb0: 2e 31 20 7b 53 45 4c 45 43 54 20 3a 41 41 41 41  .1 {SELECT :AAAA
4ec0: 7d 20 20 20 20 20 20 20 20 20 7b 31 20 3a 41 41  }         {1 :AA
4ed0: 41 41 7d 20 20 20 20 20 20 20 2d 31 0a 70 61 72  AA}       -1.par
4ee0: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
4ef0: 70 72 2d 31 31 2e 32 2e 32 20 7b 53 45 4c 45 43  pr-11.2.2 {SELEC
4f00: 54 20 3a 31 32 33 7d 20 20 20 20 20 20 20 20 20  T :123}         
4f10: 20 7b 31 20 3a 31 32 33 7d 20 20 20 20 20 20 20   {1 :123}       
4f20: 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65   -1.parameter_te
4f30: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 33  st e_expr-11.2.3
4f40: 20 7b 53 45 4c 45 43 54 20 3a 5f 5f 7d 20 20 20   {SELECT :__}   
4f50: 20 20 20 20 20 20 20 20 7b 31 20 3a 5f 5f 7d 20          {1 :__} 
4f60: 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d          -1.param
4f70: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
4f80: 2d 31 31 2e 32 2e 34 20 7b 53 45 4c 45 43 54 20  -11.2.4 {SELECT 
4f90: 3a 5f 24 5f 7d 20 20 20 20 20 20 20 20 20 20 7b  :_$_}          {
4fa0: 31 20 3a 5f 24 5f 7d 20 20 20 20 20 20 20 20 2d  1 :_$_}        -
4fb0: 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  1.parameter_test
4fc0: 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 35 20 22   e_expr-11.2.5 "
4fd0: 0a 20 20 53 45 4c 45 43 54 20 3a 5c 75 30 65 34  .  SELECT :\u0e4
4fe0: 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75 30  0\u0e2d\u0e28\u0
4ff0: 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30 5c  e02\u0e39\u0e40\
5000: 75 30 65 32 64 5c 75 30 65 32 35 0a 22 20 22 31  u0e2d\u0e25." "1
5010: 20 3a 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75   :\u0e40\u0e2d\u
5020: 30 65 32 38 5c 75 30 65 30 32 5c 75 30 65 33 39  0e28\u0e02\u0e39
5030: 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65  \u0e40\u0e2d\u0e
5040: 32 35 22 20 2d 31 0a 70 61 72 61 6d 65 74 65 72  25" -1.parameter
5050: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5060: 32 2e 36 20 22 53 45 4c 45 43 54 20 3a 5c 75 30  2.6 "SELECT :\u0
5070: 30 38 30 22 20 22 31 20 3a 5c 75 30 30 38 30 22  080" "1 :\u0080"
5080: 20 2d 31 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   -1..# EVIDENCE-
5090: 4f 46 3a 20 52 2d 34 39 37 38 33 2d 36 31 32 37  OF: R-49783-6127
50a0: 39 20 41 6e 20 22 61 74 22 20 73 69 67 6e 20 77  9 An "at" sign w
50b0: 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c 69 6b  orks exactly lik
50c0: 65 20 61 20 63 6f 6c 6f 6e 2c 0a 23 20 65 78 63  e a colon,.# exc
50d0: 65 70 74 20 74 68 61 74 20 74 68 65 20 6e 61 6d  ept that the nam
50e0: 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  e of the paramet
50f0: 65 72 20 63 72 65 61 74 65 64 20 69 73 20 40 41  er created is @A
5100: 41 41 41 2e 0a 23 0a 70 61 72 61 6d 65 74 65 72  AAA..#.parameter
5110: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5120: 33 2e 31 20 7b 53 45 4c 45 43 54 20 40 41 41 41  3.1 {SELECT @AAA
5130: 41 7d 20 20 20 20 20 20 20 20 20 7b 31 20 40 41  A}         {1 @A
5140: 41 41 41 7d 20 20 20 20 20 20 20 2d 31 0a 70 61  AAA}       -1.pa
5150: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
5160: 78 70 72 2d 31 31 2e 33 2e 32 20 7b 53 45 4c 45  xpr-11.3.2 {SELE
5170: 43 54 20 40 31 32 33 7d 20 20 20 20 20 20 20 20  CT @123}        
5180: 20 20 7b 31 20 40 31 32 33 7d 20 20 20 20 20 20    {1 @123}      
5190: 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74    -1.parameter_t
51a0: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e  est e_expr-11.3.
51b0: 33 20 7b 53 45 4c 45 43 54 20 40 5f 5f 7d 20 20  3 {SELECT @__}  
51c0: 20 20 20 20 20 20 20 20 20 7b 31 20 40 5f 5f 7d           {1 @__}
51d0: 20 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61           -1.para
51e0: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
51f0: 72 2d 31 31 2e 33 2e 34 20 7b 53 45 4c 45 43 54  r-11.3.4 {SELECT
5200: 20 40 5f 24 5f 7d 20 20 20 20 20 20 20 20 20 20   @_$_}          
5210: 7b 31 20 40 5f 24 5f 7d 20 20 20 20 20 20 20 20  {1 @_$_}        
5220: 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  -1.parameter_tes
5230: 74 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e 35 20  t e_expr-11.3.5 
5240: 22 0a 20 20 53 45 4c 45 43 54 20 40 5c 75 30 65  ".  SELECT @\u0e
5250: 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75  40\u0e2d\u0e28\u
5260: 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30  0e02\u0e39\u0e40
5270: 5c 75 30 65 32 64 5c 75 30 65 32 35 0a 22 20 22  \u0e2d\u0e25." "
5280: 31 20 40 5c 75 30 65 34 30 5c 75 30 65 32 64 5c  1 @\u0e40\u0e2d\
5290: 75 30 65 32 38 5c 75 30 65 30 32 5c 75 30 65 33  u0e28\u0e02\u0e3
52a0: 39 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30  9\u0e40\u0e2d\u0
52b0: 65 32 35 22 20 2d 31 0a 70 61 72 61 6d 65 74 65  e25" -1.paramete
52c0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
52d0: 2e 33 2e 36 20 22 53 45 4c 45 43 54 20 40 5c 75  .3.6 "SELECT @\u
52e0: 30 30 38 30 22 20 22 31 20 40 5c 75 30 30 38 30  0080" "1 @\u0080
52f0: 22 20 2d 31 0a 0a 23 20 45 56 49 44 45 4e 43 45  " -1..# EVIDENCE
5300: 2d 4f 46 3a 20 52 2d 36 32 36 31 30 2d 35 31 33  -OF: R-62610-513
5310: 32 39 20 41 20 64 6f 6c 6c 61 72 2d 73 69 67 6e  29 A dollar-sign
5320: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20   followed by an 
5330: 69 64 65 6e 74 69 66 69 65 72 0a 23 20 6e 61 6d  identifier.# nam
5340: 65 20 61 6c 73 6f 20 68 6f 6c 64 73 20 61 20 73  e also holds a s
5350: 70 6f 74 20 66 6f 72 20 61 20 6e 61 6d 65 64 20  pot for a named 
5360: 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 74  parameter with t
5370: 68 65 20 6e 61 6d 65 20 24 41 41 41 41 2e 0a 23  he name $AAAA..#
5380: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
5390: 52 2d 35 35 30 32 35 2d 32 31 30 34 32 20 54 68  R-55025-21042 Th
53a0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
53b0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 63  e in this case c
53c0: 61 6e 0a 23 20 69 6e 63 6c 75 64 65 20 6f 6e 65  an.# include one
53d0: 20 6f 72 20 6d 6f 72 65 20 6f 63 63 75 72 72 65   or more occurre
53e0: 6e 63 65 73 20 6f 66 20 22 3a 3a 22 20 61 6e 64  nces of "::" and
53f0: 20 61 20 73 75 66 66 69 78 20 65 6e 63 6c 6f 73   a suffix enclos
5400: 65 64 20 69 6e 0a 23 20 22 28 2e 2e 2e 29 22 20  ed in.# "(...)" 
5410: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 79 20 74  containing any t
5420: 65 78 74 20 61 74 20 61 6c 6c 2e 0a 23 0a 23 20  ext at all..#.# 
5430: 4e 6f 74 65 3a 20 4c 6f 6f 6b 73 20 6c 69 6b 65  Note: Looks like
5440: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 63   an identifier c
5450: 61 6e 6e 6f 74 20 63 6f 6e 73 69 73 74 20 65 6e  annot consist en
5460: 74 69 72 65 6c 79 20 6f 66 20 22 3a 3a 22 20 0a  tirely of "::" .
5470: 23 20 63 68 61 72 61 63 74 65 72 73 20 6f 72 20  # characters or 
5480: 6a 75 73 74 20 61 20 73 75 66 66 69 78 2e 20 41  just a suffix. A
5490: 6c 73 6f 2c 20 74 68 65 20 6f 74 68 65 72 20 6e  lso, the other n
54a0: 61 6d 65 64 20 76 61 72 69 61 62 6c 65 20 63 68  amed variable ch
54b0: 61 72 61 63 74 65 72 73 0a 23 20 28 3a 20 61 6e  aracters.# (: an
54c0: 64 20 40 29 20 77 6f 72 6b 20 74 68 65 20 73 61  d @) work the sa
54d0: 6d 65 20 77 61 79 20 69 6e 74 65 72 6e 61 6c 6c  me way internall
54e0: 79 2e 20 57 68 79 20 6e 6f 74 20 6a 75 73 74 20  y. Why not just 
54f0: 64 6f 63 75 6d 65 6e 74 20 69 74 20 74 68 61 74  document it that
5500: 20 77 61 79 3f 0a 23 0a 70 61 72 61 6d 65 74 65   way?.#.paramete
5510: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
5520: 2e 34 2e 31 20 7b 53 45 4c 45 43 54 20 24 41 41  .4.1 {SELECT $AA
5530: 41 41 7d 20 20 20 20 20 20 20 20 20 7b 31 20 24  AA}         {1 $
5540: 41 41 41 41 7d 20 20 20 20 20 20 20 2d 31 0a 70  AAAA}       -1.p
5550: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
5560: 65 78 70 72 2d 31 31 2e 34 2e 32 20 7b 53 45 4c  expr-11.4.2 {SEL
5570: 45 43 54 20 24 31 32 33 7d 20 20 20 20 20 20 20  ECT $123}       
5580: 20 20 20 7b 31 20 24 31 32 33 7d 20 20 20 20 20     {1 $123}     
5590: 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f     -1.parameter_
55a0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34  test e_expr-11.4
55b0: 2e 33 20 7b 53 45 4c 45 43 54 20 24 5f 5f 7d 20  .3 {SELECT $__} 
55c0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 24 5f 5f            {1 $__
55d0: 7d 20 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72  }         -1.par
55e0: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
55f0: 70 72 2d 31 31 2e 34 2e 34 20 7b 53 45 4c 45 43  pr-11.4.4 {SELEC
5600: 54 20 24 5f 24 5f 7d 20 20 20 20 20 20 20 20 20  T $_$_}         
5610: 20 7b 31 20 24 5f 24 5f 7d 20 20 20 20 20 20 20   {1 $_$_}       
5620: 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65   -1.parameter_te
5630: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e 35  st e_expr-11.4.5
5640: 20 22 0a 20 20 53 45 4c 45 43 54 20 5c 24 5c 75   ".  SELECT \$\u
5650: 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38  0e40\u0e2d\u0e28
5660: 5c 75 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65  \u0e02\u0e39\u0e
5670: 34 30 5c 75 30 65 32 64 5c 75 30 65 32 35 0a 22  40\u0e2d\u0e25."
5680: 20 22 31 20 5c 24 5c 75 30 65 34 30 5c 75 30 65   "1 \$\u0e40\u0e
5690: 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75  2d\u0e28\u0e02\u
56a0: 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64  0e39\u0e40\u0e2d
56b0: 5c 75 30 65 32 35 22 20 2d 31 0a 70 61 72 61 6d  \u0e25" -1.param
56c0: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
56d0: 2d 31 31 2e 34 2e 36 20 22 53 45 4c 45 43 54 20  -11.4.6 "SELECT 
56e0: 5c 24 5c 75 30 30 38 30 22 20 22 31 20 5c 24 5c  \$\u0080" "1 \$\
56f0: 75 30 30 38 30 22 20 2d 31 0a 0a 70 61 72 61 6d  u0080" -1..param
5700: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
5710: 2d 31 31 2e 35 2e 31 20 7b 53 45 4c 45 43 54 20  -11.5.1 {SELECT 
5720: 24 3a 3a 3a 3a 61 28 2b 2b 2d 2d 2b 2b 29 7d 20  $::::a(++--++)} 
5730: 7b 31 20 24 3a 3a 3a 3a 61 28 2b 2b 2d 2d 2b 2b  {1 $::::a(++--++
5740: 29 7d 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f  )} -1.parameter_
5750: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 35  test e_expr-11.5
5760: 2e 32 20 7b 53 45 4c 45 43 54 20 24 3a 3a 61 28  .2 {SELECT $::a(
5770: 29 7d 20 7b 31 20 24 3a 3a 61 28 29 7d 20 2d 31  )} {1 $::a()} -1
5780: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5790: 65 5f 65 78 70 72 2d 31 31 2e 35 2e 33 20 7b 53  e_expr-11.5.3 {S
57a0: 45 4c 45 43 54 20 24 3a 3a 31 28 3a 3a 23 24 29  ELECT $::1(::#$)
57b0: 7d 20 7b 31 20 24 3a 3a 31 28 3a 3a 23 24 29 7d  } {1 $::1(::#$)}
57c0: 20 2d 31 0a 20 0a 23 20 45 56 49 44 45 4e 43 45   -1. .# EVIDENCE
57d0: 2d 4f 46 3a 20 52 2d 31 31 33 37 30 2d 30 34 35  -OF: R-11370-045
57e0: 32 30 20 4e 61 6d 65 64 20 70 61 72 61 6d 65 74  20 Named paramet
57f0: 65 72 73 20 61 72 65 20 61 6c 73 6f 20 6e 75 6d  ers are also num
5800: 62 65 72 65 64 2e 20 54 68 65 0a 23 20 6e 75 6d  bered. The.# num
5810: 62 65 72 20 61 73 73 69 67 6e 65 64 20 69 73 20  ber assigned is 
5820: 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
5830: 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 61 72   the largest par
5840: 61 6d 65 74 65 72 20 6e 75 6d 62 65 72 0a 23 20  ameter number.# 
5850: 61 6c 72 65 61 64 79 20 61 73 73 69 67 6e 65 64  already assigned
5860: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
5870: 46 3a 20 52 2d 34 32 36 32 30 2d 32 32 31 38 34  F: R-42620-22184
5880: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
5890: 68 65 20 70 61 72 61 6d 65 74 65 72 20 77 6f 75  he parameter wou
58a0: 6c 64 20 62 65 0a 23 20 61 73 73 69 67 6e 65 64  ld be.# assigned
58b0: 20 61 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65   a number greate
58c0: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41  r than SQLITE_MA
58d0: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
58e0: 52 2c 20 69 74 20 69 73 20 61 6e 0a 23 20 65 72  R, it is an.# er
58f0: 72 6f 72 2e 0a 23 0a 70 61 72 61 6d 65 74 65 72  ror..#.parameter
5900: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5910: 36 2e 31 20 22 53 45 4c 45 43 54 20 3f 2c 20 40  6.1 "SELECT ?, @
5920: 61 62 63 22 20 20 20 20 7b 31 20 7b 7d 20 32 20  abc"    {1 {} 2 
5930: 40 61 62 63 7d 20 7b 2d 31 20 2d 32 7d 0a 70 61  @abc} {-1 -2}.pa
5940: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
5950: 78 70 72 2d 31 31 2e 36 2e 32 20 22 53 45 4c 45  xpr-11.6.2 "SELE
5960: 43 54 20 3f 31 32 33 2c 20 3a 61 31 22 20 20 7b  CT ?123, :a1"  {
5970: 31 32 33 20 3f 31 32 33 20 31 32 34 20 3a 61 31  123 ?123 124 :a1
5980: 7d 20 7b 2d 31 32 33 20 2d 31 32 34 7d 0a 70 61  } {-123 -124}.pa
5990: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
59a0: 78 70 72 2d 31 31 2e 36 2e 33 20 7b 53 45 4c 45  xpr-11.6.3 {SELE
59b0: 43 54 20 24 61 2c 20 3f 38 2c 20 3f 2c 20 24 62  CT $a, ?8, ?, $b
59c0: 2c 20 3f 32 2c 20 24 63 7d 20 7b 0a 20 20 31 20  , ?2, $c} {.  1 
59d0: 24 61 20 38 20 3f 38 20 39 20 7b 7d 20 31 30 20  $a 8 ?8 9 {} 10 
59e0: 24 62 20 32 20 3f 32 20 31 31 20 24 63 0a 7d 20  $b 2 ?2 11 $c.} 
59f0: 7b 2d 31 20 2d 38 20 2d 39 20 2d 31 30 20 2d 32  {-1 -8 -9 -10 -2
5a00: 20 2d 31 31 7d 0a 66 6f 72 65 61 63 68 20 7b 74   -11}.foreach {t
5a10: 6e 20 73 71 6c 7d 20 5b 6c 69 73 74 20 20 20 20  n sql} [list    
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 20 20 20 20 20 5c 0a 20 20 31 20 20 22 53         \.  1  "S
5a40: 45 4c 45 43 54 20 3f 24 6d 76 6e 2c 20 5c 24 3a  ELECT ?$mvn, \$:
5a50: 3a 61 22 20 20 20 20 20 20 20 20 20 20 20 20 20  :a"             
5a60: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 32 20            \.  2 
5a70: 20 22 53 45 4c 45 43 54 20 3f 24 6d 76 6e 2c 20   "SELECT ?$mvn, 
5a80: 3f 34 2c 20 40 61 31 22 20 20 20 20 20 20 20 20  ?4, @a1"        
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
5aa0: 20 33 20 20 22 53 45 4c 45 43 54 20 3f 5b 65 78   3  "SELECT ?[ex
5ab0: 70 72 20 24 6d 76 6e 2d 32 5d 2c 20 3a 62 61 67  pr $mvn-2], :bag
5ac0: 2c 20 40 31 32 33 2c 20 5c 24 78 22 20 20 20 20  , @123, \$x"    
5ad0: 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68  \.] {.  do_catch
5ae0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
5af0: 31 31 2e 37 2e 24 74 6e 20 24 73 71 6c 20 5b 6c  11.7.$tn $sql [l
5b00: 69 73 74 20 31 20 7b 74 6f 6f 20 6d 61 6e 79 20  ist 1 {too many 
5b10: 53 51 4c 20 76 61 72 69 61 62 6c 65 73 7d 5d 0a  SQL variables}].
5b20: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
5b30: 3a 20 52 2d 31 34 30 36 38 2d 34 39 36 37 31 20  : R-14068-49671 
5b40: 50 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  Parameters that 
5b50: 61 72 65 20 6e 6f 74 20 61 73 73 69 67 6e 65 64  are not assigned
5b60: 20 76 61 6c 75 65 73 0a 23 20 75 73 69 6e 67 20   values.# using 
5b70: 73 71 6c 69 74 65 33 5f 62 69 6e 64 28 29 20 61  sqlite3_bind() a
5b80: 72 65 20 74 72 65 61 74 65 64 20 61 73 20 4e 55  re treated as NU
5b90: 4c 4c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f  LL..#.do_test e_
5ba0: 65 78 70 72 2d 31 31 2e 37 2e 31 20 7b 0a 20 20  expr-11.7.1 {.  
5bb0: 73 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65  set stmt [sqlite
5bc0: 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20  3_prepare_v2 db 
5bd0: 7b 20 53 45 4c 45 43 54 20 3f 2c 20 3a 61 2c 20  { SELECT ?, :a, 
5be0: 40 62 2c 20 24 64 20 7d 20 2d 31 5d 0a 20 20 73  @b, $d } -1].  s
5bf0: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 73 74 6d  qlite3_step $stm
5c00: 74 0a 0a 20 20 6c 69 73 74 20 5b 73 71 6c 69 74  t..  list [sqlit
5c10: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24  e3_column_type $
5c20: 73 74 6d 74 20 30 5d 20 5c 0a 20 20 20 20 20 20  stmt 0] \.      
5c30: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   [sqlite3_column
5c40: 5f 74 79 70 65 20 24 73 74 6d 74 20 31 5d 20 5c  _type $stmt 1] \
5c50: 0a 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  .       [sqlite3
5c60: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24 73 74  _column_type $st
5c70: 6d 74 20 32 5d 20 5c 0a 20 20 20 20 20 20 20 5b  mt 2] \.       [
5c80: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
5c90: 79 70 65 20 24 73 74 6d 74 20 33 5d 20 0a 7d 20  ype $stmt 3] .} 
5ca0: 7b 4e 55 4c 4c 20 4e 55 4c 4c 20 4e 55 4c 4c 20  {NULL NULL NULL 
5cb0: 4e 55 4c 4c 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  NULL}.do_test e_
5cc0: 65 78 70 72 2d 31 31 2e 37 2e 31 20 7b 20 73 71  expr-11.7.1 { sq
5cd0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
5ce0: 73 74 6d 74 20 7d 20 53 51 4c 49 54 45 5f 4f 4b  stmt } SQLITE_OK
5cf0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 22  ------------.# "
5d40: 54 65 73 74 22 20 74 68 65 20 73 79 6e 74 61 78  Test" the syntax
5d50: 20 64 69 61 67 72 61 6d 73 20 69 6e 20 6c 61 6e   diagrams in lan
5d60: 67 5f 65 78 70 72 2e 68 74 6d 6c 2e 0a 23 0a 23  g_expr.html..#.#
5d70: 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72   -- syntax diagr
5d80: 61 6d 20 73 69 67 6e 65 64 2d 6e 75 6d 62 65 72  am signed-number
5d90: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
5da0: 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 31 2e 31  st e_expr-12.1.1
5db0: 20 7b 20 53 45 4c 45 43 54 20 30 2c 20 2b 30 2c   { SELECT 0, +0,
5dc0: 20 2d 30 20 7d 20 7b 30 20 30 20 30 7d 0a 64 6f   -0 } {0 0 0}.do
5dd0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
5de0: 65 78 70 72 2d 31 32 2e 31 2e 32 20 7b 20 53 45  expr-12.1.2 { SE
5df0: 4c 45 43 54 20 31 2c 20 2b 31 2c 20 2d 31 20 7d  LECT 1, +1, -1 }
5e00: 20 7b 31 20 31 20 2d 31 7d 0a 64 6f 5f 65 78 65   {1 1 -1}.do_exe
5e10: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
5e20: 2d 31 32 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54  -12.1.3 { SELECT
5e30: 20 32 2c 20 2b 32 2c 20 2d 32 20 7d 20 7b 32 20   2, +2, -2 } {2 
5e40: 32 20 2d 32 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  2 -2}.do_execsql
5e50: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
5e60: 31 2e 34 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  1.4 { .  SELECT 
5e70: 31 2e 34 2c 20 2b 31 2e 34 2c 20 2d 31 2e 34 20  1.4, +1.4, -1.4 
5e80: 0a 7d 20 7b 31 2e 34 20 31 2e 34 20 2d 31 2e 34  .} {1.4 1.4 -1.4
5e90: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
5ea0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 31 2e 35 20  t e_expr-12.1.5 
5eb0: 7b 20 0a 20 20 53 45 4c 45 43 54 20 31 2e 35 65  { .  SELECT 1.5e
5ec0: 2b 35 2c 20 2b 31 2e 35 65 2b 35 2c 20 2d 31 2e  +5, +1.5e+5, -1.
5ed0: 35 65 2b 35 20 0a 7d 20 7b 31 35 30 30 30 30 2e  5e+5 .} {150000.
5ee0: 30 20 31 35 30 30 30 30 2e 30 20 2d 31 35 30 30  0 150000.0 -1500
5ef0: 30 30 2e 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  00.0}.do_execsql
5f00: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
5f10: 31 2e 36 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  1.6 { .  SELECT 
5f20: 30 2e 30 30 30 31 2c 20 2b 30 2e 30 30 30 31 2c  0.0001, +0.0001,
5f30: 20 2d 30 2e 30 30 30 31 20 0a 7d 20 7b 30 2e 30   -0.0001 .} {0.0
5f40: 30 30 31 20 30 2e 30 30 30 31 20 2d 30 2e 30 30  001 0.0001 -0.00
5f50: 30 31 7d 0a 0a 23 20 2d 2d 20 73 79 6e 74 61 78  01}..# -- syntax
5f60: 20 64 69 61 67 72 61 6d 20 6c 69 74 65 72 61 6c   diagram literal
5f70: 2d 76 61 6c 75 65 0a 23 0a 73 65 74 20 73 71 6c  -value.#.set sql
5f80: 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  ite_current_time
5f90: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
5fa0: 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 31  st e_expr-12.2.1
5fb0: 20 7b 53 45 4c 45 43 54 20 31 32 33 7d 20 20 20   {SELECT 123}   
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 32 33              {123
5fd0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
5fe0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 32 20  t e_expr-12.2.2 
5ff0: 7b 53 45 4c 45 43 54 20 31 32 33 2e 34 65 30 35  {SELECT 123.4e05
6000: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 32 33 34  }          {1234
6010: 30 30 30 30 2e 30 7d 0a 64 6f 5f 65 78 65 63 73  0000.0}.do_execs
6020: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
6030: 32 2e 32 2e 33 20 7b 53 45 4c 45 43 54 20 27 61  2.2.3 {SELECT 'a
6040: 62 63 64 65 27 7d 20 20 20 20 20 20 20 20 20 20  bcde'}          
6050: 20 7b 61 62 63 64 65 7d 0a 64 6f 5f 65 78 65 63   {abcde}.do_exec
6060: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
6070: 31 32 2e 32 2e 34 20 7b 53 45 4c 45 43 54 20 58  12.2.4 {SELECT X
6080: 27 34 31 34 32 34 33 27 7d 20 20 20 20 20 20 20  '414243'}       
6090: 20 20 7b 41 42 43 7d 0a 64 6f 5f 65 78 65 63 73    {ABC}.do_execs
60a0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
60b0: 32 2e 32 2e 35 20 7b 53 45 4c 45 43 54 20 4e 55  2.2.5 {SELECT NU
60c0: 4c 4c 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  LL}             
60d0: 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {{}}.do_execsql
60e0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
60f0: 32 2e 36 20 7b 53 45 4c 45 43 54 20 43 55 52 52  2.6 {SELECT CURR
6100: 45 4e 54 5f 54 49 4d 45 7d 20 20 20 20 20 20 7b  ENT_TIME}      {
6110: 30 30 3a 30 30 3a 30 31 7d 0a 64 6f 5f 65 78 65  00:00:01}.do_exe
6120: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
6130: 2d 31 32 2e 32 2e 37 20 7b 53 45 4c 45 43 54 20  -12.2.7 {SELECT 
6140: 43 55 52 52 45 4e 54 5f 44 41 54 45 7d 20 20 20  CURRENT_DATE}   
6150: 20 20 20 7b 31 39 37 30 2d 30 31 2d 30 31 7d 0a     {1970-01-01}.
6160: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6170: 65 5f 65 78 70 72 2d 31 32 2e 32 2e 38 20 7b 53  e_expr-12.2.8 {S
6180: 45 4c 45 43 54 20 43 55 52 52 45 4e 54 5f 54 49  ELECT CURRENT_TI
6190: 4d 45 53 54 41 4d 50 7d 20 7b 7b 31 39 37 30 2d  MESTAMP} {{1970-
61a0: 30 31 2d 30 31 20 30 30 3a 30 30 3a 30 31 7d 7d  01-01 00:00:01}}
61b0: 0a 73 65 74 20 73 71 6c 69 74 65 5f 63 75 72 72  .set sqlite_curr
61c0: 65 6e 74 5f 74 69 6d 65 20 30 0a 0a 23 20 2d 2d  ent_time 0..# --
61d0: 20 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20   syntax diagram 
61e0: 65 78 70 72 0a 23 0a 66 6f 72 63 65 64 65 6c 65  expr.#.forcedele
61f0: 74 65 20 74 65 73 74 2e 64 62 32 0a 65 78 65 63  te test.db2.exec
6200: 73 71 6c 20 7b 0a 20 20 41 54 54 41 43 48 20 27  sql {.  ATTACH '
6210: 74 65 73 74 2e 64 62 32 27 20 41 53 20 64 62 6e  test.db2' AS dbn
6220: 61 6d 65 3b 0a 20 20 43 52 45 41 54 45 20 54 41  ame;.  CREATE TA
6230: 42 4c 45 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61  BLE dbname.tblna
6240: 6d 65 28 63 6e 61 6d 65 29 3b 0a 7d 0a 0a 70 72  me(cname);.}..pr
6250: 6f 63 20 67 6c 6f 62 20 7b 61 72 67 73 7d 20 7b  oc glob {args} {
6260: 72 65 74 75 72 6e 20 31 7d 0a 64 62 20 66 75 6e  return 1}.db fun
6270: 63 74 69 6f 6e 20 67 6c 6f 62 20 67 6c 6f 62 0a  ction glob glob.
6280: 64 62 20 66 75 6e 63 74 69 6f 6e 20 6d 61 74 63  db function matc
6290: 68 20 67 6c 6f 62 0a 64 62 20 66 75 6e 63 74 69  h glob.db functi
62a0: 6f 6e 20 72 65 67 65 78 70 20 67 6c 6f 62 0a 0a  on regexp glob..
62b0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 65 78 70 72  foreach {tn expr
62c0: 7d 20 7b 0a 20 20 31 20 31 32 33 0a 20 20 32 20  } {.  1 123.  2 
62d0: 31 32 33 2e 34 65 30 35 0a 20 20 33 20 27 61 62  123.4e05.  3 'ab
62e0: 63 64 65 27 0a 20 20 34 20 58 27 34 31 34 32 34  cde'.  4 X'41424
62f0: 33 27 0a 20 20 35 20 4e 55 4c 4c 0a 20 20 36 20  3'.  5 NULL.  6 
6300: 43 55 52 52 45 4e 54 5f 54 49 4d 45 0a 20 20 37  CURRENT_TIME.  7
6310: 20 43 55 52 52 45 4e 54 5f 44 41 54 45 0a 20 20   CURRENT_DATE.  
6320: 38 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54  8 CURRENT_TIMEST
6330: 41 4d 50 0a 0a 20 20 39 20 3f 0a 20 31 30 20 3f  AMP..  9 ?. 10 ?
6340: 31 32 33 0a 20 31 31 20 40 68 65 6c 6c 6f 0a 20  123. 11 @hello. 
6350: 31 32 20 3a 77 6f 72 6c 64 0a 20 31 33 20 24 74  12 :world. 13 $t
6360: 63 6c 0a 20 31 34 20 24 74 63 6c 28 61 72 72 61  cl. 14 $tcl(arra
6370: 79 29 0a 20 20 0a 20 20 31 35 20 63 6e 61 6d 65  y).  .  15 cname
6380: 0a 20 20 31 36 20 74 62 6c 6e 61 6d 65 2e 63 6e  .  16 tblname.cn
6390: 61 6d 65 0a 20 20 31 37 20 64 62 6e 61 6d 65 2e  ame.  17 dbname.
63a0: 74 62 6c 6e 61 6d 65 2e 63 6e 61 6d 65 0a 0a 20  tblname.cname.. 
63b0: 20 31 38 20 22 2b 20 45 58 50 52 22 0a 20 20 31   18 "+ EXPR".  1
63c0: 39 20 22 2d 20 45 58 50 52 22 0a 20 20 32 30 20  9 "- EXPR".  20 
63d0: 22 4e 4f 54 20 45 58 50 52 22 0a 20 20 32 31 20  "NOT EXPR".  21 
63e0: 22 7e 20 45 58 50 52 22 0a 0a 20 20 32 32 20 22  "~ EXPR"..  22 "
63f0: 45 58 50 52 31 20 7c 7c 20 45 58 50 52 32 22 0a  EXPR1 || EXPR2".
6400: 20 20 32 33 20 22 45 58 50 52 31 20 2a 20 45 58    23 "EXPR1 * EX
6410: 50 52 32 22 0a 20 20 32 34 20 22 45 58 50 52 31  PR2".  24 "EXPR1
6420: 20 2f 20 45 58 50 52 32 22 0a 20 20 32 35 20 22   / EXPR2".  25 "
6430: 45 58 50 52 31 20 25 20 45 58 50 52 32 22 0a 20  EXPR1 % EXPR2". 
6440: 20 32 36 20 22 45 58 50 52 31 20 2b 20 45 58 50   26 "EXPR1 + EXP
6450: 52 32 22 0a 20 20 32 37 20 22 45 58 50 52 31 20  R2".  27 "EXPR1 
6460: 2d 20 45 58 50 52 32 22 0a 20 20 32 38 20 22 45  - EXPR2".  28 "E
6470: 58 50 52 31 20 3c 3c 20 45 58 50 52 32 22 0a 20  XPR1 << EXPR2". 
6480: 20 32 39 20 22 45 58 50 52 31 20 3e 3e 20 45 58   29 "EXPR1 >> EX
6490: 50 52 32 22 0a 20 20 33 30 20 22 45 58 50 52 31  PR2".  30 "EXPR1
64a0: 20 26 20 45 58 50 52 32 22 0a 20 20 33 31 20 22   & EXPR2".  31 "
64b0: 45 58 50 52 31 20 7c 20 45 58 50 52 32 22 0a 20  EXPR1 | EXPR2". 
64c0: 20 33 32 20 22 45 58 50 52 31 20 3c 20 45 58 50   32 "EXPR1 < EXP
64d0: 52 32 22 0a 20 20 33 33 20 22 45 58 50 52 31 20  R2".  33 "EXPR1 
64e0: 3c 3d 20 45 58 50 52 32 22 0a 20 20 33 34 20 22  <= EXPR2".  34 "
64f0: 45 58 50 52 31 20 3e 20 45 58 50 52 32 22 0a 20  EXPR1 > EXPR2". 
6500: 20 33 35 20 22 45 58 50 52 31 20 3e 3d 20 45 58   35 "EXPR1 >= EX
6510: 50 52 32 22 0a 20 20 33 36 20 22 45 58 50 52 31  PR2".  36 "EXPR1
6520: 20 3d 20 45 58 50 52 32 22 0a 20 20 33 37 20 22   = EXPR2".  37 "
6530: 45 58 50 52 31 20 3d 3d 20 45 58 50 52 32 22 0a  EXPR1 == EXPR2".
6540: 20 20 33 38 20 22 45 58 50 52 31 20 21 3d 20 45    38 "EXPR1 != E
6550: 58 50 52 32 22 0a 20 20 33 39 20 22 45 58 50 52  XPR2".  39 "EXPR
6560: 31 20 3c 3e 20 45 58 50 52 32 22 0a 20 20 34 30  1 <> EXPR2".  40
6570: 20 22 45 58 50 52 31 20 49 53 20 45 58 50 52 32   "EXPR1 IS EXPR2
6580: 22 0a 20 20 34 31 20 22 45 58 50 52 31 20 49 53  ".  41 "EXPR1 IS
6590: 20 4e 4f 54 20 45 58 50 52 32 22 0a 20 20 34 32   NOT EXPR2".  42
65a0: 20 22 45 58 50 52 31 20 41 4e 44 20 45 58 50 52   "EXPR1 AND EXPR
65b0: 32 22 0a 20 20 34 33 20 22 45 58 50 52 31 20 4f  2".  43 "EXPR1 O
65c0: 52 20 45 58 50 52 32 22 0a 20 0a 20 20 34 34 20  R EXPR2". .  44 
65d0: 22 63 6f 75 6e 74 28 2a 29 22 0a 20 20 34 35 20  "count(*)".  45 
65e0: 22 63 6f 75 6e 74 28 44 49 53 54 49 4e 43 54 20  "count(DISTINCT 
65f0: 45 58 50 52 29 22 0a 20 20 34 36 20 22 73 75 62  EXPR)".  46 "sub
6600: 73 74 72 28 45 58 50 52 2c 20 31 30 2c 20 32 30  str(EXPR, 10, 20
6610: 29 22 0a 20 20 34 37 20 22 63 68 61 6e 67 65 73  )".  47 "changes
6620: 28 29 22 0a 20 0a 20 20 34 38 20 22 28 20 45 58  ()". .  48 "( EX
6630: 50 52 20 29 22 0a 20 0a 20 20 34 39 20 22 43 41  PR )". .  49 "CA
6640: 53 54 20 28 20 45 58 50 52 20 41 53 20 69 6e 74  ST ( EXPR AS int
6650: 65 67 65 72 20 29 22 0a 20 20 35 30 20 22 43 41  eger )".  50 "CA
6660: 53 54 20 28 20 45 58 50 52 20 41 53 20 27 61 62  ST ( EXPR AS 'ab
6670: 63 64 27 20 29 22 0a 20 20 35 31 20 22 43 41 53  cd' )".  51 "CAS
6680: 54 20 28 20 45 58 50 52 20 41 53 20 27 61 62 24  T ( EXPR AS 'ab$
6690: 20 24 63 64 27 20 29 22 0a 20 0a 20 20 35 32 20   $cd' )". .  52 
66a0: 22 45 58 50 52 20 43 4f 4c 4c 41 54 45 20 6e 6f  "EXPR COLLATE no
66b0: 63 61 73 65 22 0a 20 20 35 33 20 22 45 58 50 52  case".  53 "EXPR
66c0: 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 22   COLLATE binary"
66d0: 0a 20 0a 20 20 35 34 20 22 45 58 50 52 31 20 4c  . .  54 "EXPR1 L
66e0: 49 4b 45 20 45 58 50 52 32 22 0a 20 20 35 35 20  IKE EXPR2".  55 
66f0: 22 45 58 50 52 31 20 4c 49 4b 45 20 45 58 50 52  "EXPR1 LIKE EXPR
6700: 32 20 45 53 43 41 50 45 20 45 58 50 52 22 0a 20  2 ESCAPE EXPR". 
6710: 20 35 36 20 22 45 58 50 52 31 20 47 4c 4f 42 20   56 "EXPR1 GLOB 
6720: 45 58 50 52 32 22 0a 20 20 35 37 20 22 45 58 50  EXPR2".  57 "EXP
6730: 52 31 20 47 4c 4f 42 20 45 58 50 52 32 20 45 53  R1 GLOB EXPR2 ES
6740: 43 41 50 45 20 45 58 50 52 22 0a 20 20 35 38 20  CAPE EXPR".  58 
6750: 22 45 58 50 52 31 20 52 45 47 45 58 50 20 45 58  "EXPR1 REGEXP EX
6760: 50 52 32 22 0a 20 20 35 39 20 22 45 58 50 52 31  PR2".  59 "EXPR1
6770: 20 52 45 47 45 58 50 20 45 58 50 52 32 20 45 53   REGEXP EXPR2 ES
6780: 43 41 50 45 20 45 58 50 52 22 0a 20 20 36 30 20  CAPE EXPR".  60 
6790: 22 45 58 50 52 31 20 4d 41 54 43 48 20 45 58 50  "EXPR1 MATCH EXP
67a0: 52 32 22 0a 20 20 36 31 20 22 45 58 50 52 31 20  R2".  61 "EXPR1 
67b0: 4d 41 54 43 48 20 45 58 50 52 32 20 45 53 43 41  MATCH EXPR2 ESCA
67c0: 50 45 20 45 58 50 52 22 0a 20 20 36 32 20 22 45  PE EXPR".  62 "E
67d0: 58 50 52 31 20 4e 4f 54 20 4c 49 4b 45 20 45 58  XPR1 NOT LIKE EX
67e0: 50 52 32 22 0a 20 20 36 33 20 22 45 58 50 52 31  PR2".  63 "EXPR1
67f0: 20 4e 4f 54 20 4c 49 4b 45 20 45 58 50 52 32 20   NOT LIKE EXPR2 
6800: 45 53 43 41 50 45 20 45 58 50 52 22 0a 20 20 36  ESCAPE EXPR".  6
6810: 34 20 22 45 58 50 52 31 20 4e 4f 54 20 47 4c 4f  4 "EXPR1 NOT GLO
6820: 42 20 45 58 50 52 32 22 0a 20 20 36 35 20 22 45  B EXPR2".  65 "E
6830: 58 50 52 31 20 4e 4f 54 20 47 4c 4f 42 20 45 58  XPR1 NOT GLOB EX
6840: 50 52 32 20 45 53 43 41 50 45 20 45 58 50 52 22  PR2 ESCAPE EXPR"
6850: 0a 20 20 36 36 20 22 45 58 50 52 31 20 4e 4f 54  .  66 "EXPR1 NOT
6860: 20 52 45 47 45 58 50 20 45 58 50 52 32 22 0a 20   REGEXP EXPR2". 
6870: 20 36 37 20 22 45 58 50 52 31 20 4e 4f 54 20 52   67 "EXPR1 NOT R
6880: 45 47 45 58 50 20 45 58 50 52 32 20 45 53 43 41  EGEXP EXPR2 ESCA
6890: 50 45 20 45 58 50 52 22 0a 20 20 36 38 20 22 45  PE EXPR".  68 "E
68a0: 58 50 52 31 20 4e 4f 54 20 4d 41 54 43 48 20 45  XPR1 NOT MATCH E
68b0: 58 50 52 32 22 0a 20 20 36 39 20 22 45 58 50 52  XPR2".  69 "EXPR
68c0: 31 20 4e 4f 54 20 4d 41 54 43 48 20 45 58 50 52  1 NOT MATCH EXPR
68d0: 32 20 45 53 43 41 50 45 20 45 58 50 52 22 0a 20  2 ESCAPE EXPR". 
68e0: 0a 20 20 37 30 20 22 45 58 50 52 20 49 53 4e 55  .  70 "EXPR ISNU
68f0: 4c 4c 22 0a 20 20 37 31 20 22 45 58 50 52 20 4e  LL".  71 "EXPR N
6900: 4f 54 4e 55 4c 4c 22 0a 20 20 37 32 20 22 45 58  OTNULL".  72 "EX
6910: 50 52 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 0a 20  PR NOT NULL". . 
6920: 20 37 33 20 22 45 58 50 52 31 20 49 53 20 45 58   73 "EXPR1 IS EX
6930: 50 52 32 22 0a 20 20 37 34 20 22 45 58 50 52 31  PR2".  74 "EXPR1
6940: 20 49 53 20 4e 4f 54 20 45 58 50 52 32 22 0a 0a   IS NOT EXPR2"..
6950: 20 20 37 35 20 22 45 58 50 52 20 4e 4f 54 20 42    75 "EXPR NOT B
6960: 45 54 57 45 45 4e 20 45 58 50 52 31 20 41 4e 44  ETWEEN EXPR1 AND
6970: 20 45 58 50 52 32 22 0a 20 20 37 36 20 22 45 58   EXPR2".  76 "EX
6980: 50 52 20 42 45 54 57 45 45 4e 20 45 58 50 52 31  PR BETWEEN EXPR1
6990: 20 41 4e 44 20 45 58 50 52 32 22 0a 0a 20 20 37   AND EXPR2"..  7
69a0: 37 20 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 28  7 "EXPR NOT IN (
69b0: 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46 52 4f  SELECT cname FRO
69c0: 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 20 20 37 38  M tblname)".  78
69d0: 20 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 28 31   "EXPR NOT IN (1
69e0: 29 22 0a 20 20 37 39 20 22 45 58 50 52 20 4e 4f  )".  79 "EXPR NO
69f0: 54 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 22 0a  T IN (1, 2, 3)".
6a00: 20 20 38 30 20 22 45 58 50 52 20 4e 4f 54 20 49    80 "EXPR NOT I
6a10: 4e 20 74 62 6c 6e 61 6d 65 22 0a 20 20 38 31 20  N tblname".  81 
6a20: 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 64 62 6e  "EXPR NOT IN dbn
6a30: 61 6d 65 2e 74 62 6c 6e 61 6d 65 22 0a 20 20 38  ame.tblname".  8
6a40: 32 20 22 45 58 50 52 20 49 4e 20 28 53 45 4c 45  2 "EXPR IN (SELE
6a50: 43 54 20 63 6e 61 6d 65 20 46 52 4f 4d 20 74 62  CT cname FROM tb
6a60: 6c 6e 61 6d 65 29 22 0a 20 20 38 33 20 22 45 58  lname)".  83 "EX
6a70: 50 52 20 49 4e 20 28 31 29 22 0a 20 20 38 34 20  PR IN (1)".  84 
6a80: 22 45 58 50 52 20 49 4e 20 28 31 2c 20 32 2c 20  "EXPR IN (1, 2, 
6a90: 33 29 22 0a 20 20 38 35 20 22 45 58 50 52 20 49  3)".  85 "EXPR I
6aa0: 4e 20 74 62 6c 6e 61 6d 65 22 0a 20 20 38 36 20  N tblname".  86 
6ab0: 22 45 58 50 52 20 49 4e 20 64 62 6e 61 6d 65 2e  "EXPR IN dbname.
6ac0: 74 62 6c 6e 61 6d 65 22 0a 0a 20 20 38 37 20 22  tblname"..  87 "
6ad0: 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 63  EXISTS (SELECT c
6ae0: 6e 61 6d 65 20 46 52 4f 4d 20 74 62 6c 6e 61 6d  name FROM tblnam
6af0: 65 29 22 0a 20 20 38 38 20 22 4e 4f 54 20 45 58  e)".  88 "NOT EX
6b00: 49 53 54 53 20 28 53 45 4c 45 43 54 20 63 6e 61  ISTS (SELECT cna
6b10: 6d 65 20 46 52 4f 4d 20 74 62 6c 6e 61 6d 65 29  me FROM tblname)
6b20: 22 0a 0a 20 20 38 39 20 22 43 41 53 45 20 45 58  "..  89 "CASE EX
6b30: 50 52 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  PR WHEN EXPR1 TH
6b40: 45 4e 20 45 58 50 52 32 20 45 4c 53 45 20 45 58  EN EXPR2 ELSE EX
6b50: 50 52 20 45 4e 44 22 0a 20 20 39 30 20 22 43 41  PR END".  90 "CA
6b60: 53 45 20 45 58 50 52 20 57 48 45 4e 20 45 58 50  SE EXPR WHEN EXP
6b70: 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 45 4e  R1 THEN EXPR2 EN
6b80: 44 22 0a 20 20 39 31 20 22 43 41 53 45 20 45 58  D".  91 "CASE EX
6b90: 50 52 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  PR WHEN EXPR1 TH
6ba0: 45 4e 20 45 58 50 52 32 20 57 48 45 4e 20 45 58  EN EXPR2 WHEN EX
6bb0: 50 52 20 54 48 45 4e 20 45 58 50 52 31 20 45 4c  PR THEN EXPR1 EL
6bc0: 53 45 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20  SE EXPR2 END".  
6bd0: 39 32 20 22 43 41 53 45 20 45 58 50 52 20 57 48  92 "CASE EXPR WH
6be0: 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58  EN EXPR1 THEN EX
6bf0: 50 52 32 20 57 48 45 4e 20 45 58 50 52 20 54 48  PR2 WHEN EXPR TH
6c00: 45 4e 20 45 58 50 52 31 20 45 4e 44 22 0a 20 20  EN EXPR1 END".  
6c10: 39 33 20 22 43 41 53 45 20 57 48 45 4e 20 45 58  93 "CASE WHEN EX
6c20: 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 45  PR1 THEN EXPR2 E
6c30: 4c 53 45 20 45 58 50 52 20 45 4e 44 22 0a 20 20  LSE EXPR END".  
6c40: 39 34 20 22 43 41 53 45 20 57 48 45 4e 20 45 58  94 "CASE WHEN EX
6c50: 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 45  PR1 THEN EXPR2 E
6c60: 4e 44 22 0a 20 20 39 35 20 22 43 41 53 45 20 57  ND".  95 "CASE W
6c70: 48 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45  HEN EXPR1 THEN E
6c80: 58 50 52 32 20 57 48 45 4e 20 45 58 50 52 20 54  XPR2 WHEN EXPR T
6c90: 48 45 4e 20 45 58 50 52 31 20 45 4c 53 45 20 45  HEN EXPR1 ELSE E
6ca0: 58 50 52 32 20 45 4e 44 22 0a 20 20 39 36 20 22  XPR2 END".  96 "
6cb0: 43 41 53 45 20 57 48 45 4e 20 45 58 50 52 31 20  CASE WHEN EXPR1 
6cc0: 54 48 45 4e 20 45 58 50 52 32 20 57 48 45 4e 20  THEN EXPR2 WHEN 
6cd0: 45 58 50 52 20 54 48 45 4e 20 45 58 50 52 31 20  EXPR THEN EXPR1 
6ce0: 45 4e 44 22 0a 7d 20 7b 0a 0a 20 20 23 20 49 66  END".} {..  # If
6cf0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6d00: 73 74 72 69 6e 67 20 62 65 69 6e 67 20 70 61 72  string being par
6d10: 73 65 64 20 63 6f 6e 74 61 69 6e 73 20 22 45 58  sed contains "EX
6d20: 50 52 32 22 2c 20 74 68 65 6e 20 72 65 70 6c 61  PR2", then repla
6d30: 63 65 0a 20 20 23 20 73 74 72 69 6e 67 20 22 45  ce.  # string "E
6d40: 58 50 52 31 22 20 61 6e 64 20 22 45 58 50 52 32  XPR1" and "EXPR2
6d50: 22 20 77 69 74 68 20 61 72 62 69 74 72 61 72 79  " with arbitrary
6d60: 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 73   SQL expressions
6d70: 2e 20 49 66 20 69 74 20 0a 20 20 23 20 63 6f 6e  . If it .  # con
6d80: 74 61 69 6e 73 20 22 45 58 50 52 22 2c 20 74 68  tains "EXPR", th
6d90: 65 6e 20 72 65 70 6c 61 63 65 20 45 58 50 52 20  en replace EXPR 
6da0: 77 69 74 68 20 61 6e 20 61 72 62 69 74 72 61 72  with an arbitrar
6db0: 79 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  y SQL expression
6dc0: 2e 0a 20 20 23 20 0a 20 20 73 65 74 20 65 6c 69  ..  # .  set eli
6dd0: 73 74 20 5b 6c 69 73 74 20 24 65 78 70 72 5d 0a  st [list $expr].
6de0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
6df0: 74 63 68 20 2a 45 58 50 52 32 2a 20 24 65 78 70  tch *EXPR2* $exp
6e00: 72 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 65 6c  r]} {.    set el
6e10: 69 73 74 20 5b 6c 69 73 74 5d 0a 20 20 20 20 66  ist [list].    f
6e20: 6f 72 65 61 63 68 20 7b 65 31 20 65 32 7d 20 7b  oreach {e1 e2} {
6e30: 20 63 6e 61 6d 65 20 22 33 34 2b 32 32 22 20 7d   cname "34+22" }
6e40: 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64   {.      lappend
6e50: 20 65 6c 69 73 74 20 5b 73 74 72 69 6e 67 20 6d   elist [string m
6e60: 61 70 20 5b 6c 69 73 74 20 45 58 50 52 31 20 24  ap [list EXPR1 $
6e70: 65 31 20 45 58 50 52 32 20 24 65 32 5d 20 24 65  e1 EXPR2 $e2] $e
6e80: 78 70 72 5d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a  xpr].    }.  } .
6e90: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
6ea0: 74 63 68 20 2a 45 58 50 52 2a 20 24 65 78 70 72  tch *EXPR* $expr
6eb0: 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 65 6c 69  ]} {.    set eli
6ec0: 73 74 32 20 5b 6c 69 73 74 5d 0a 20 20 20 20 66  st2 [list].    f
6ed0: 6f 72 65 61 63 68 20 65 6c 20 24 65 6c 69 73 74  oreach el $elist
6ee0: 20 7b 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68   {.      foreach
6ef0: 20 65 20 7b 20 63 6e 61 6d 65 20 22 33 34 2b 32   e { cname "34+2
6f00: 32 22 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 6c  2" } {.        l
6f10: 61 70 70 65 6e 64 20 65 6c 69 73 74 32 20 5b 73  append elist2 [s
6f20: 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
6f30: 45 58 50 52 20 24 65 5d 20 24 65 6c 5d 0a 20 20  EXPR $e] $el].  
6f40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6f50: 73 65 74 20 65 6c 69 73 74 20 24 65 6c 69 73 74  set elist $elist
6f60: 32 0a 20 20 7d 0a 0a 20 20 73 65 74 20 78 20 30  2.  }..  set x 0
6f70: 0a 20 20 66 6f 72 65 61 63 68 20 65 20 24 65 6c  .  foreach e $el
6f80: 69 73 74 20 7b 0a 20 20 20 20 69 6e 63 72 20 78  ist {.    incr x
6f90: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 65 5f 65  .    do_test e_e
6fa0: 78 70 72 2d 31 32 2e 33 2e 24 74 6e 2e 24 78 20  xpr-12.3.$tn.$x 
6fb0: 7b 20 0a 20 20 20 20 20 20 73 65 74 20 72 63 20  { .      set rc 
6fc0: 5b 63 61 74 63 68 20 7b 20 65 78 65 63 73 71 6c  [catch { execsql
6fd0: 20 22 53 45 4c 45 43 54 20 24 65 20 46 52 4f 4d   "SELECT $e FROM
6fe0: 20 74 62 6c 6e 61 6d 65 22 20 7d 20 6d 73 67 5d   tblname" } msg]
6ff0: 0a 20 20 20 20 7d 20 7b 30 7d 0a 20 20 7d 0a 7d  .    } {0}.  }.}
7000: 0a 0a 23 20 2d 2d 20 73 79 6e 74 61 78 20 64 69  ..# -- syntax di
7010: 61 67 72 61 6d 20 72 61 69 73 65 2d 66 75 6e 63  agram raise-func
7020: 74 69 6f 6e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  tion.#.foreach {
7030: 74 6e 20 72 61 69 73 65 65 78 70 72 7d 20 7b 0a  tn raiseexpr} {.
7040: 20 20 31 20 22 52 41 49 53 45 28 49 47 4e 4f 52    1 "RAISE(IGNOR
7050: 45 29 22 0a 20 20 32 20 22 52 41 49 53 45 28 52  E)".  2 "RAISE(R
7060: 4f 4c 4c 42 41 43 4b 2c 20 27 65 72 72 6f 72 20  OLLBACK, 'error 
7070: 6d 65 73 73 61 67 65 27 29 22 0a 20 20 33 20 22  message')".  3 "
7080: 52 41 49 53 45 28 41 42 4f 52 54 2c 20 27 65 72  RAISE(ABORT, 'er
7090: 72 6f 72 20 6d 65 73 73 61 67 65 27 29 22 0a 20  ror message')". 
70a0: 20 34 20 22 52 41 49 53 45 28 46 41 49 4c 2c 20   4 "RAISE(FAIL, 
70b0: 27 65 72 72 6f 72 20 6d 65 73 73 61 67 65 27 29  'error message')
70c0: 22 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73  ".} {.  do_execs
70d0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
70e0: 32 2e 34 2e 24 74 6e 20 22 0a 20 20 20 20 43 52  2.4.$tn ".    CR
70f0: 45 41 54 45 20 54 52 49 47 47 45 52 20 64 62 6e  EATE TRIGGER dbn
7100: 61 6d 65 2e 74 72 24 74 6e 20 42 45 46 4f 52 45  ame.tr$tn BEFORE
7110: 20 44 45 4c 45 54 45 20 4f 4e 20 74 62 6c 6e 61   DELETE ON tblna
7120: 6d 65 20 42 45 47 49 4e 0a 20 20 20 20 20 20 53  me BEGIN.      S
7130: 45 4c 45 43 54 20 24 72 61 69 73 65 65 78 70 72  ELECT $raiseexpr
7140: 20 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 22 20   ;.    END;.  " 
7150: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
7160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 0a 23 20 54 65 73 74 20 74 68 65 20 73 74 61 74  .# Test the stat
71b0: 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74  ements related t
71c0: 6f 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  o the BETWEEN op
71d0: 65 72 61 74 6f 72 2e 0a 23 0a 23 20 45 56 49 44  erator..#.# EVID
71e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 30 30 37 39  ENCE-OF: R-40079
71f0: 2d 35 34 35 30 33 20 54 68 65 20 42 45 54 57 45  -54503 The BETWE
7200: 45 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6c  EN operator is l
7210: 6f 67 69 63 61 6c 6c 79 0a 23 20 65 71 75 69 76  ogically.# equiv
7220: 61 6c 65 6e 74 20 74 6f 20 61 20 70 61 69 72 20  alent to a pair 
7230: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 20  of comparisons. 
7240: 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44  "x BETWEEN y AND
7250: 20 7a 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   z" is equivalen
7260: 74 0a 23 20 74 6f 20 22 78 3e 3d 79 20 41 4e 44  t.# to "x>=y AND
7270: 20 78 3c 3d 7a 22 20 65 78 63 65 70 74 20 74 68   x<=z" except th
7280: 61 74 20 77 69 74 68 20 42 45 54 57 45 45 4e 2c  at with BETWEEN,
7290: 20 74 68 65 20 78 20 65 78 70 72 65 73 73 69 6f   the x expressio
72a0: 6e 20 69 73 0a 23 20 6f 6e 6c 79 20 65 76 61 6c  n is.# only eval
72b0: 75 61 74 65 64 20 6f 6e 63 65 2e 0a 23 0a 64 62  uated once..#.db
72c0: 20 66 75 6e 63 20 78 20 78 0a 70 72 6f 63 20 78   func x x.proc x
72d0: 20 7b 7d 20 7b 20 69 6e 63 72 20 3a 3a 78 63 6f   {} { incr ::xco
72e0: 75 6e 74 20 3b 20 72 65 74 75 72 6e 20 5b 65 78  unt ; return [ex
72f0: 70 72 20 24 3a 3a 78 5d 20 7d 0a 66 6f 72 65 61  pr $::x] }.forea
7300: 63 68 20 7b 74 6e 20 78 20 65 78 70 72 20 72 65  ch {tn x expr re
7310: 73 20 6e 45 76 61 6c 7d 20 7b 0a 20 20 31 20 20  s nEval} {.  1  
7320: 31 30 20 20 22 78 28 29 20 3e 3d 20 35 20 41 4e  10  "x() >= 5 AN
7330: 44 20 78 28 29 20 3c 3d 20 31 35 22 20 20 31 20  D x() <= 15"  1 
7340: 20 32 0a 20 20 32 20 20 31 30 20 20 22 78 28 29   2.  2  10  "x()
7350: 20 42 45 54 57 45 45 4e 20 35 20 41 4e 44 20 31   BETWEEN 5 AND 1
7360: 35 22 20 20 20 20 31 20 20 31 0a 0a 20 20 33 20  5"    1  1..  3 
7370: 20 20 35 20 20 22 78 28 29 20 3e 3d 20 35 20 41    5  "x() >= 5 A
7380: 4e 44 20 78 28 29 20 3c 3d 20 35 22 20 20 20 31  ND x() <= 5"   1
7390: 20 20 32 0a 20 20 34 20 20 20 35 20 20 22 78 28    2.  4   5  "x(
73a0: 29 20 42 45 54 57 45 45 4e 20 35 20 41 4e 44 20  ) BETWEEN 5 AND 
73b0: 35 22 20 20 20 20 20 31 20 20 31 0a 7d 20 7b 0a  5"     1  1.} {.
73c0: 20 20 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72    do_test e_expr
73d0: 2d 31 33 2e 31 2e 24 74 6e 20 7b 0a 20 20 20 20  -13.1.$tn {.    
73e0: 73 65 74 20 3a 3a 78 63 6f 75 6e 74 20 30 0a 20  set ::xcount 0. 
73f0: 20 20 20 73 65 74 20 61 20 5b 65 78 65 63 73 71     set a [execsq
7400: 6c 20 22 53 45 4c 45 43 54 20 24 65 78 70 72 22  l "SELECT $expr"
7410: 5d 0a 20 20 20 20 6c 69 73 74 20 24 3a 3a 78 63  ].    list $::xc
7420: 6f 75 6e 74 20 24 61 0a 20 20 7d 20 5b 6c 69 73  ount $a.  } [lis
7430: 74 20 24 6e 45 76 61 6c 20 24 72 65 73 5d 0a 7d  t $nEval $res].}
7440: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
7450: 20 52 2d 30 35 31 35 35 2d 33 34 34 35 34 20 54   R-05155-34454 T
7460: 68 65 20 70 72 65 63 65 64 65 6e 63 65 20 6f 66  he precedence of
7470: 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65   the BETWEEN ope
7480: 72 61 74 6f 72 20 69 73 0a 23 20 74 68 65 20 73  rator is.# the s
7490: 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 63 65  ame as the prece
74a0: 64 65 6e 63 65 20 61 73 20 6f 70 65 72 61 74 6f  dence as operato
74b0: 72 73 20 3d 3d 20 61 6e 64 20 21 3d 20 61 6e 64  rs == and != and
74c0: 20 4c 49 4b 45 20 61 6e 64 20 67 72 6f 75 70 73   LIKE and groups
74d0: 0a 23 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  .# left to right
74e0: 2e 0a 23 20 0a 23 20 54 68 65 72 65 66 6f 72 65  ..# .# Therefore
74f0: 2c 20 42 45 54 57 45 45 4e 20 67 72 6f 75 70 73  , BETWEEN groups
7500: 20 6d 6f 72 65 20 74 69 67 68 74 6c 79 20 74 68   more tightly th
7510: 61 6e 20 6f 70 65 72 61 74 6f 72 20 22 41 4e 44  an operator "AND
7520: 22 2c 20 62 75 74 20 6c 65 73 73 0a 23 20 73 6f  ", but less.# so
7530: 20 74 68 61 6e 20 22 3c 22 2e 0a 23 0a 64 6f 5f   than "<"..#.do_
7540: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7550: 78 70 72 2d 31 33 2e 32 2e 31 20 20 7b 20 53 45  xpr-13.2.1  { SE
7560: 4c 45 43 54 20 31 20 3d 3d 20 31 30 20 42 45 54  LECT 1 == 10 BET
7570: 57 45 45 4e 20 30 20 41 4e 44 20 32 20 20 20 7d  WEEN 0 AND 2   }
7580: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
7590: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
75a0: 32 20 20 7b 20 53 45 4c 45 43 54 20 28 31 20 3d  2  { SELECT (1 =
75b0: 3d 20 31 30 29 20 42 45 54 57 45 45 4e 20 30 20  = 10) BETWEEN 0 
75c0: 41 4e 44 20 32 20 7d 20 20 31 0a 64 6f 5f 65 78  AND 2 }  1.do_ex
75d0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
75e0: 72 2d 31 33 2e 32 2e 33 20 20 7b 20 53 45 4c 45  r-13.2.3  { SELE
75f0: 43 54 20 31 20 3d 3d 20 28 31 30 20 42 45 54 57  CT 1 == (10 BETW
7600: 45 45 4e 20 30 20 41 4e 44 20 32 29 20 7d 20 20  EEN 0 AND 2) }  
7610: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
7620: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 34 20  t e_expr-13.2.4 
7630: 20 7b 20 53 45 4c 45 43 54 20 20 36 20 42 45 54   { SELECT  6 BET
7640: 57 45 45 4e 20 34 20 41 4e 44 20 38 20 3d 3d 20  WEEN 4 AND 8 == 
7650: 31 20 7d 20 20 20 20 31 0a 64 6f 5f 65 78 65 63  1 }    1.do_exec
7660: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
7670: 31 33 2e 32 2e 35 20 20 7b 20 53 45 4c 45 43 54  13.2.5  { SELECT
7680: 20 28 36 20 42 45 54 57 45 45 4e 20 34 20 41 4e   (6 BETWEEN 4 AN
7690: 44 20 38 29 20 3d 3d 20 31 20 7d 20 20 20 31 0a  D 8) == 1 }   1.
76a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
76b0: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 36 20 20 7b  e_expr-13.2.6  {
76c0: 20 53 45 4c 45 43 54 20 20 36 20 42 45 54 57 45   SELECT  6 BETWE
76d0: 45 4e 20 34 20 41 4e 44 20 28 38 20 3d 3d 20 31  EN 4 AND (8 == 1
76e0: 29 20 7d 20 20 30 0a 0a 64 6f 5f 65 78 65 63 73  ) }  0..do_execs
76f0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7700: 33 2e 32 2e 37 20 20 7b 20 53 45 4c 45 43 54 20  3.2.7  { SELECT 
7710: 20 35 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44   5 BETWEEN 0 AND
7720: 20 30 20 20 21 3d 20 31 20 7d 20 20 20 31 0a 64   0  != 1 }   1.d
7730: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7740: 5f 65 78 70 72 2d 31 33 2e 32 2e 38 20 20 7b 20  _expr-13.2.8  { 
7750: 53 45 4c 45 43 54 20 28 35 20 42 45 54 57 45 45  SELECT (5 BETWEE
7760: 4e 20 30 20 41 4e 44 20 30 29 20 21 3d 20 31 20  N 0 AND 0) != 1 
7770: 7d 20 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  }   1.do_execsql
7780: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7790: 32 2e 39 20 20 7b 20 53 45 4c 45 43 54 20 20 35  2.9  { SELECT  5
77a0: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 28   BETWEEN 0 AND (
77b0: 30 20 21 3d 20 31 29 20 7d 20 20 30 0a 64 6f 5f  0 != 1) }  0.do_
77c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
77d0: 78 70 72 2d 31 33 2e 32 2e 31 30 20 7b 20 53 45  xpr-13.2.10 { SE
77e0: 4c 45 43 54 20 20 31 20 21 3d 20 30 20 20 42 45  LECT  1 != 0  BE
77f0: 54 57 45 45 4e 20 30 20 41 4e 44 20 32 20 20 7d  TWEEN 0 AND 2  }
7800: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
7810: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
7820: 31 31 20 7b 20 53 45 4c 45 43 54 20 28 31 20 21  11 { SELECT (1 !
7830: 3d 20 30 29 20 42 45 54 57 45 45 4e 20 30 20 41  = 0) BETWEEN 0 A
7840: 4e 44 20 32 20 20 7d 20 20 31 0a 64 6f 5f 65 78  ND 2  }  1.do_ex
7850: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7860: 72 2d 31 33 2e 32 2e 31 32 20 7b 20 53 45 4c 45  r-13.2.12 { SELE
7870: 43 54 20 20 31 20 21 3d 20 28 30 20 42 45 54 57  CT  1 != (0 BETW
7880: 45 45 4e 20 30 20 41 4e 44 20 32 29 20 7d 20 20  EEN 0 AND 2) }  
7890: 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0..do_execsql_te
78a0: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31  st e_expr-13.2.1
78b0: 33 20 7b 20 53 45 4c 45 43 54 20 31 20 4c 49 4b  3 { SELECT 1 LIK
78c0: 45 20 31 30 20 42 45 54 57 45 45 4e 20 30 20 41  E 10 BETWEEN 0 A
78d0: 4e 44 20 32 20 20 20 7d 20 20 31 0a 64 6f 5f 65  ND 2   }  1.do_e
78e0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
78f0: 70 72 2d 31 33 2e 32 2e 31 34 20 7b 20 53 45 4c  pr-13.2.14 { SEL
7900: 45 43 54 20 28 31 20 4c 49 4b 45 20 31 30 29 20  ECT (1 LIKE 10) 
7910: 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32 20  BETWEEN 0 AND 2 
7920: 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  }  1.do_execsql_
7930: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7940: 2e 31 35 20 7b 20 53 45 4c 45 43 54 20 31 20 4c  .15 { SELECT 1 L
7950: 49 4b 45 20 28 31 30 20 42 45 54 57 45 45 4e 20  IKE (10 BETWEEN 
7960: 30 20 41 4e 44 20 32 29 20 7d 20 20 30 0a 64 6f  0 AND 2) }  0.do
7970: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7980: 65 78 70 72 2d 31 33 2e 32 2e 31 36 20 7b 20 53  expr-13.2.16 { S
7990: 45 4c 45 43 54 20 20 36 20 42 45 54 57 45 45 4e  ELECT  6 BETWEEN
79a0: 20 34 20 41 4e 44 20 38 20 4c 49 4b 45 20 31 20   4 AND 8 LIKE 1 
79b0: 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71    }  1.do_execsq
79c0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
79d0: 2e 32 2e 31 37 20 7b 20 53 45 4c 45 43 54 20 28  .2.17 { SELECT (
79e0: 36 20 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20  6 BETWEEN 4 AND 
79f0: 38 29 20 4c 49 4b 45 20 31 20 20 7d 20 20 31 0a  8) LIKE 1  }  1.
7a00: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7a10: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 38 20 7b  e_expr-13.2.18 {
7a20: 20 53 45 4c 45 43 54 20 20 36 20 42 45 54 57 45   SELECT  6 BETWE
7a30: 45 4e 20 34 20 41 4e 44 20 28 38 20 4c 49 4b 45  EN 4 AND (8 LIKE
7a40: 20 31 29 20 7d 20 20 30 0a 0a 64 6f 5f 65 78 65   1) }  0..do_exe
7a50: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7a60: 2d 31 33 2e 32 2e 31 39 20 7b 20 53 45 4c 45 43  -13.2.19 { SELEC
7a70: 54 20 30 20 41 4e 44 20 30 20 42 45 54 57 45 45  T 0 AND 0 BETWEE
7a80: 4e 20 30 20 41 4e 44 20 31 20 20 20 7d 20 30 0a  N 0 AND 1   } 0.
7a90: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7aa0: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 30 20 7b  e_expr-13.2.20 {
7ab0: 20 53 45 4c 45 43 54 20 30 20 41 4e 44 20 28 30   SELECT 0 AND (0
7ac0: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 31   BETWEEN 0 AND 1
7ad0: 29 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ) } 0.do_execsql
7ae0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7af0: 32 2e 32 31 20 7b 20 53 45 4c 45 43 54 20 28 30  2.21 { SELECT (0
7b00: 20 41 4e 44 20 30 29 20 42 45 54 57 45 45 4e 20   AND 0) BETWEEN 
7b10: 30 20 41 4e 44 20 31 20 7d 20 31 0a 64 6f 5f 65  0 AND 1 } 1.do_e
7b20: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7b30: 70 72 2d 31 33 2e 32 2e 32 32 20 7b 20 53 45 4c  pr-13.2.22 { SEL
7b40: 45 43 54 20 30 20 42 45 54 57 45 45 4e 20 2d 31  ECT 0 BETWEEN -1
7b50: 20 41 4e 44 20 31 20 41 4e 44 20 30 20 20 20 7d   AND 1 AND 0   }
7b60: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
7b70: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32  st e_expr-13.2.2
7b80: 33 20 7b 20 53 45 4c 45 43 54 20 28 30 20 42 45  3 { SELECT (0 BE
7b90: 54 57 45 45 4e 20 2d 31 20 41 4e 44 20 31 29 20  TWEEN -1 AND 1) 
7ba0: 41 4e 44 20 30 20 7d 20 30 0a 64 6f 5f 65 78 65  AND 0 } 0.do_exe
7bb0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7bc0: 2d 31 33 2e 32 2e 32 34 20 7b 20 53 45 4c 45 43  -13.2.24 { SELEC
7bd0: 54 20 30 20 42 45 54 57 45 45 4e 20 2d 31 20 41  T 0 BETWEEN -1 A
7be0: 4e 44 20 28 31 20 41 4e 44 20 30 29 20 7d 20 31  ND (1 AND 0) } 1
7bf0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
7c00: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 35  t e_expr-13.2.25
7c10: 20 7b 20 53 45 4c 45 43 54 20 32 20 3c 20 33 20   { SELECT 2 < 3 
7c20: 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 31 20  BETWEEN 0 AND 1 
7c30: 20 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c    } 1.do_execsql
7c40: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7c50: 32 2e 32 36 20 7b 20 53 45 4c 45 43 54 20 28 32  2.26 { SELECT (2
7c60: 20 3c 20 33 29 20 42 45 54 57 45 45 4e 20 30 20   < 3) BETWEEN 0 
7c70: 41 4e 44 20 31 20 7d 20 31 0a 64 6f 5f 65 78 65  AND 1 } 1.do_exe
7c80: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7c90: 2d 31 33 2e 32 2e 32 37 20 7b 20 53 45 4c 45 43  -13.2.27 { SELEC
7ca0: 54 20 32 20 3c 20 28 33 20 42 45 54 57 45 45 4e  T 2 < (3 BETWEEN
7cb0: 20 30 20 41 4e 44 20 31 29 20 7d 20 30 0a 64 6f   0 AND 1) } 0.do
7cc0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7cd0: 65 78 70 72 2d 31 33 2e 32 2e 32 38 20 7b 20 53  expr-13.2.28 { S
7ce0: 45 4c 45 43 54 20 32 20 42 45 54 57 45 45 4e 20  ELECT 2 BETWEEN 
7cf0: 31 20 41 4e 44 20 32 20 3c 20 33 20 20 20 20 7d  1 AND 2 < 3    }
7d00: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
7d10: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32  st e_expr-13.2.2
7d20: 39 20 7b 20 53 45 4c 45 43 54 20 32 20 42 45 54  9 { SELECT 2 BET
7d30: 57 45 45 4e 20 31 20 41 4e 44 20 28 32 20 3c 20  WEEN 1 AND (2 < 
7d40: 33 29 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  3)  } 0.do_execs
7d50: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7d60: 33 2e 32 2e 33 30 20 7b 20 53 45 4c 45 43 54 20  3.2.30 { SELECT 
7d70: 28 32 20 42 45 54 57 45 45 4e 20 31 20 41 4e 44  (2 BETWEEN 1 AND
7d80: 20 32 29 20 3c 20 33 20 20 7d 20 31 0a 0a 23 2d   2) < 3  } 1..#-
7d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
7de0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73 20 72  the statements r
7df0: 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 4c 49  elated to the LI
7e00: 4b 45 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72  KE and GLOB oper
7e10: 61 74 6f 72 73 2e 0a 23 0a 23 20 45 56 49 44 45  ators..#.# EVIDE
7e20: 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 38 34 2d  NCE-OF: R-16584-
7e30: 36 30 31 38 39 20 54 68 65 20 4c 49 4b 45 20 6f  60189 The LIKE o
7e40: 70 65 72 61 74 6f 72 20 64 6f 65 73 20 61 20 70  perator does a p
7e50: 61 74 74 65 72 6e 20 6d 61 74 63 68 69 6e 67 0a  attern matching.
7e60: 23 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 23 0a  # comparison..#.
7e70: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
7e80: 2d 31 31 32 39 35 2d 30 34 36 35 37 20 54 68 65  -11295-04657 The
7e90: 20 6f 70 65 72 61 6e 64 20 74 6f 20 74 68 65 20   operand to the 
7ea0: 72 69 67 68 74 20 6f 66 20 74 68 65 20 4c 49 4b  right of the LIK
7eb0: 45 0a 23 20 6f 70 65 72 61 74 6f 72 20 63 6f 6e  E.# operator con
7ec0: 74 61 69 6e 73 20 74 68 65 20 70 61 74 74 65 72  tains the patter
7ed0: 6e 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 68  n and the left h
7ee0: 61 6e 64 20 6f 70 65 72 61 6e 64 20 63 6f 6e 74  and operand cont
7ef0: 61 69 6e 73 20 74 68 65 0a 23 20 73 74 72 69 6e  ains the.# strin
7f00: 67 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e  g to match again
7f10: 73 74 20 74 68 65 20 70 61 74 74 65 72 6e 2e 0a  st the pattern..
7f20: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
7f30: 74 20 65 5f 65 78 70 72 2d 31 34 2e 31 2e 31 20  t e_expr-14.1.1 
7f40: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 25 27 20  { SELECT 'abc%' 
7f50: 4c 49 4b 45 20 27 61 62 63 64 65 27 20 7d 20 30  LIKE 'abcde' } 0
7f60: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7f70: 20 65 5f 65 78 70 72 2d 31 34 2e 31 2e 32 20 7b   e_expr-14.1.2 {
7f80: 20 53 45 4c 45 43 54 20 27 61 62 63 64 65 27 20   SELECT 'abcde' 
7f90: 4c 49 4b 45 20 27 61 62 63 25 27 20 7d 20 31 0a  LIKE 'abc%' } 1.
7fa0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
7fb0: 52 2d 35 35 34 30 36 2d 33 38 35 32 34 20 41 20  R-55406-38524 A 
7fc0: 70 65 72 63 65 6e 74 20 73 79 6d 62 6f 6c 20 28  percent symbol (
7fd0: 22 25 22 29 20 69 6e 20 74 68 65 20 4c 49 4b 45  "%") in the LIKE
7fe0: 20 70 61 74 74 65 72 6e 0a 23 20 6d 61 74 63 68   pattern.# match
7ff0: 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20  es any sequence 
8000: 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  of zero or more 
8010: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
8020: 65 20 73 74 72 69 6e 67 2e 0a 23 0a 64 6f 5f 65  e string..#.do_e
8030: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8040: 70 72 2d 31 34 2e 32 2e 31 20 7b 20 53 45 4c 45  pr-14.2.1 { SELE
8050: 43 54 20 27 61 62 64 65 27 20 20 20 20 4c 49 4b  CT 'abde'    LIK
8060: 45 20 27 61 62 25 64 65 27 20 7d 20 31 0a 64 6f  E 'ab%de' } 1.do
8070: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8080: 65 78 70 72 2d 31 34 2e 32 2e 32 20 7b 20 53 45  expr-14.2.2 { SE
8090: 4c 45 43 54 20 27 61 62 58 64 65 27 20 20 20 4c  LECT 'abXde'   L
80a0: 49 4b 45 20 27 61 62 25 64 65 27 20 7d 20 31 0a  IKE 'ab%de' } 1.
80b0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
80c0: 65 5f 65 78 70 72 2d 31 34 2e 32 2e 33 20 7b 20  e_expr-14.2.3 { 
80d0: 53 45 4c 45 43 54 20 27 61 62 41 42 43 64 65 27  SELECT 'abABCde'
80e0: 20 4c 49 4b 45 20 27 61 62 25 64 65 27 20 7d 20   LIKE 'ab%de' } 
80f0: 31 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  1..# EVIDENCE-OF
8100: 3a 20 52 2d 33 30 34 33 33 2d 32 35 34 34 33 20  : R-30433-25443 
8110: 41 6e 20 75 6e 64 65 72 73 63 6f 72 65 20 28 22  An underscore ("
8120: 5f 22 29 20 69 6e 20 74 68 65 20 4c 49 4b 45 20  _") in the LIKE 
8130: 70 61 74 74 65 72 6e 0a 23 20 6d 61 74 63 68 65  pattern.# matche
8140: 73 20 61 6e 79 20 73 69 6e 67 6c 65 20 63 68 61  s any single cha
8150: 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 73 74  racter in the st
8160: 72 69 6e 67 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ring..#.do_execs
8170: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8180: 34 2e 33 2e 31 20 7b 20 53 45 4c 45 43 54 20 27  4.3.1 { SELECT '
8190: 61 62 64 65 27 20 20 20 20 4c 49 4b 45 20 27 61  abde'    LIKE 'a
81a0: 62 5f 64 65 27 20 7d 20 30 0a 64 6f 5f 65 78 65  b_de' } 0.do_exe
81b0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
81c0: 2d 31 34 2e 33 2e 32 20 7b 20 53 45 4c 45 43 54  -14.3.2 { SELECT
81d0: 20 27 61 62 58 64 65 27 20 20 20 4c 49 4b 45 20   'abXde'   LIKE 
81e0: 27 61 62 5f 64 65 27 20 7d 20 31 0a 64 6f 5f 65  'ab_de' } 1.do_e
81f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8200: 70 72 2d 31 34 2e 33 2e 33 20 7b 20 53 45 4c 45  pr-14.3.3 { SELE
8210: 43 54 20 27 61 62 41 42 43 64 65 27 20 4c 49 4b  CT 'abABCde' LIK
8220: 45 20 27 61 62 5f 64 65 27 20 7d 20 30 0a 0a 23  E 'ab_de' } 0..#
8230: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
8240: 35 39 30 30 37 2d 32 30 34 35 34 20 41 6e 79 20  59007-20454 Any 
8250: 6f 74 68 65 72 20 63 68 61 72 61 63 74 65 72 20  other character 
8260: 6d 61 74 63 68 65 73 20 69 74 73 65 6c 66 20 6f  matches itself o
8270: 72 20 69 74 73 0a 23 20 6c 6f 77 65 72 2f 75 70  r its.# lower/up
8280: 70 65 72 20 63 61 73 65 20 65 71 75 69 76 61 6c  per case equival
8290: 65 6e 74 20 28 69 2e 65 2e 20 63 61 73 65 2d 69  ent (i.e. case-i
82a0: 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 74 63 68  nsensitive match
82b0: 69 6e 67 29 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ing)..#.do_execs
82c0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
82d0: 34 2e 34 2e 31 20 7b 20 53 45 4c 45 43 54 20 27  4.4.1 { SELECT '
82e0: 61 62 63 27 20 4c 49 4b 45 20 27 61 42 63 27 20  abc' LIKE 'aBc' 
82f0: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
8300: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 34 2e  est e_expr-14.4.
8310: 32 20 7b 20 53 45 4c 45 43 54 20 27 61 42 63 27  2 { SELECT 'aBc'
8320: 20 4c 49 4b 45 20 27 61 42 63 27 20 7d 20 31 0a   LIKE 'aBc' } 1.
8330: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8340: 65 5f 65 78 70 72 2d 31 34 2e 34 2e 33 20 7b 20  e_expr-14.4.3 { 
8350: 53 45 4c 45 43 54 20 27 61 63 27 20 20 4c 49 4b  SELECT 'ac'  LIK
8360: 45 20 27 61 42 63 27 20 7d 20 30 0a 0a 23 20 45  E 'aBc' } 0..# E
8370: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33  VIDENCE-OF: R-23
8380: 36 34 38 2d 35 38 35 32 37 20 53 51 4c 69 74 65  648-58527 SQLite
8390: 20 6f 6e 6c 79 20 75 6e 64 65 72 73 74 61 6e 64   only understand
83a0: 73 20 75 70 70 65 72 2f 6c 6f 77 65 72 20 63 61  s upper/lower ca
83b0: 73 65 0a 23 20 66 6f 72 20 41 53 43 49 49 20 63  se.# for ASCII c
83c0: 68 61 72 61 63 74 65 72 73 20 62 79 20 64 65 66  haracters by def
83d0: 61 75 6c 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ault..#.# EVIDEN
83e0: 43 45 2d 4f 46 3a 20 52 2d 30 34 35 33 32 2d 31  CE-OF: R-04532-1
83f0: 31 35 32 37 20 54 68 65 20 4c 49 4b 45 20 6f 70  1527 The LIKE op
8400: 65 72 61 74 6f 72 20 69 73 20 63 61 73 65 20 73  erator is case s
8410: 65 6e 73 69 74 69 76 65 20 62 79 0a 23 20 64 65  ensitive by.# de
8420: 66 61 75 6c 74 20 66 6f 72 20 75 6e 69 63 6f 64  fault for unicod
8430: 65 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  e characters tha
8440: 74 20 61 72 65 20 62 65 79 6f 6e 64 20 74 68 65  t are beyond the
8450: 20 41 53 43 49 49 20 72 61 6e 67 65 2e 0a 23 0a   ASCII range..#.
8460: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
8470: 2d 34 34 33 38 31 2d 31 31 36 36 39 20 74 68 65  -44381-11669 the
8480: 20 65 78 70 72 65 73 73 69 6f 6e 0a 23 20 27 61   expression.# 'a
8490: 27 26 6e 62 73 70 3b 4c 49 4b 45 26 6e 62 73 70  '&nbsp;LIKE&nbsp
84a0: 3b 27 41 27 20 69 73 20 54 52 55 45 20 62 75 74  ;'A' is TRUE but
84b0: 0a 23 20 27 26 61 65 6c 69 67 3b 27 26 6e 62 73  .# '&aelig;'&nbs
84c0: 70 3b 4c 49 4b 45 26 6e 62 73 70 3b 27 26 41 45  p;LIKE&nbsp;'&AE
84d0: 6c 69 67 3b 27 20 69 73 20 46 41 4c 53 45 2e 0a  lig;' is FALSE..
84e0: 23 0a 23 20 20 20 54 68 65 20 72 65 73 74 72 69  #.#   The restri
84f0: 63 74 69 6f 6e 20 74 6f 20 41 53 43 49 49 20 63  ction to ASCII c
8500: 68 61 72 61 63 74 65 72 73 20 64 6f 65 73 20 6e  haracters does n
8510: 6f 74 20 61 70 70 6c 79 20 69 66 20 74 68 65 20  ot apply if the 
8520: 49 43 55 0a 23 20 20 20 6c 69 62 72 61 72 79 20  ICU.#   library 
8530: 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 2e 20  is compiled in. 
8540: 57 68 65 6e 20 49 43 55 20 69 73 20 65 6e 61 62  When ICU is enab
8550: 6c 65 64 20 53 51 4c 69 74 65 20 64 6f 65 73 20  led SQLite does 
8560: 6e 6f 74 20 61 63 74 0a 23 20 20 20 61 73 20 69  not act.#   as i
8570: 74 20 64 6f 65 73 20 22 62 79 20 64 65 66 61 75  t does "by defau
8580: 6c 74 22 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  lt"..#.do_execsq
8590: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
85a0: 2e 35 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 41  .5.1 { SELECT 'A
85b0: 27 20 4c 49 4b 45 20 27 61 27 20 20 20 20 20 20  ' LIKE 'a'      
85c0: 20 20 20 7d 20 31 0a 69 66 63 61 70 61 62 6c 65     } 1.ifcapable
85d0: 20 21 69 63 75 20 7b 0a 20 20 64 6f 5f 65 78 65   !icu {.  do_exe
85e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
85f0: 2d 31 34 2e 35 2e 32 20 22 53 45 4c 45 43 54 20  -14.5.2 "SELECT 
8600: 27 5c 75 30 30 63 36 27 20 4c 49 4b 45 20 27 5c  '\u00c6' LIKE '\
8610: 75 30 30 65 36 27 22 20 30 0a 7d 0a 0a 23 20 45  u00e6'" 0.}..# E
8620: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36  VIDENCE-OF: R-56
8630: 36 38 33 2d 31 33 37 33 31 20 49 66 20 74 68 65  683-13731 If the
8640: 20 6f 70 74 69 6f 6e 61 6c 20 45 53 43 41 50 45   optional ESCAPE
8650: 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65   clause is prese
8660: 6e 74 2c 0a 23 20 74 68 65 6e 20 74 68 65 20 65  nt,.# then the e
8670: 78 70 72 65 73 73 69 6f 6e 20 66 6f 6c 6c 6f 77  xpression follow
8680: 69 6e 67 20 74 68 65 20 45 53 43 41 50 45 20 6b  ing the ESCAPE k
8690: 65 79 77 6f 72 64 20 6d 75 73 74 20 65 76 61 6c  eyword must eval
86a0: 75 61 74 65 20 74 6f 20 61 0a 23 20 73 74 72 69  uate to a.# stri
86b0: 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ng consisting of
86c0: 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63   a single charac
86d0: 74 65 72 2e 0a 23 0a 64 6f 5f 63 61 74 63 68 73  ter..#.do_catchs
86e0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
86f0: 34 2e 36 2e 31 20 7b 20 0a 20 20 53 45 4c 45 43  4.6.1 { .  SELEC
8700: 54 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45  T 'A' LIKE 'a' E
8710: 53 43 41 50 45 20 27 31 32 27 20 0a 7d 20 7b 31  SCAPE '12' .} {1
8720: 20 7b 45 53 43 41 50 45 20 65 78 70 72 65 73 73   {ESCAPE express
8730: 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 20 73 69  ion must be a si
8740: 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 7d 7d  ngle character}}
8750: 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73  .do_catchsql_tes
8760: 74 20 65 5f 65 78 70 72 2d 31 34 2e 36 2e 32 20  t e_expr-14.6.2 
8770: 7b 20 0a 20 20 53 45 4c 45 43 54 20 27 41 27 20  { .  SELECT 'A' 
8780: 4c 49 4b 45 20 27 61 27 20 45 53 43 41 50 45 20  LIKE 'a' ESCAPE 
8790: 27 27 20 0a 7d 20 7b 31 20 7b 45 53 43 41 50 45  '' .} {1 {ESCAPE
87a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74   expression must
87b0: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 68 61   be a single cha
87c0: 72 61 63 74 65 72 7d 7d 0a 64 6f 5f 63 61 74 63  racter}}.do_catc
87d0: 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  hsql_test e_expr
87e0: 2d 31 34 2e 36 2e 33 20 7b 20 53 45 4c 45 43 54  -14.6.3 { SELECT
87f0: 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53   'A' LIKE 'a' ES
8800: 43 41 50 45 20 27 78 27 20 7d 20 20 20 20 7b 30  CAPE 'x' }    {0
8810: 20 31 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f   1}.do_catchsql_
8820: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 36  test e_expr-14.6
8830: 2e 34 20 22 53 45 4c 45 43 54 20 27 41 27 20 4c  .4 "SELECT 'A' L
8840: 49 4b 45 20 27 61 27 20 45 53 43 41 50 45 20 27  IKE 'a' ESCAPE '
8850: 5c 75 30 30 65 36 27 22 20 7b 30 20 31 7d 0a 0a  \u00e6'" {0 1}..
8860: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
8870: 2d 30 32 30 34 35 2d 32 33 37 36 32 20 54 68 69  -02045-23762 Thi
8880: 73 20 63 68 61 72 61 63 74 65 72 20 6d 61 79 20  s character may 
8890: 62 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 4c  be used in the L
88a0: 49 4b 45 0a 23 20 70 61 74 74 65 72 6e 20 74 6f  IKE.# pattern to
88b0: 20 69 6e 63 6c 75 64 65 20 6c 69 74 65 72 61 6c   include literal
88c0: 20 70 65 72 63 65 6e 74 20 6f 72 20 75 6e 64 65   percent or unde
88d0: 72 73 63 6f 72 65 20 63 68 61 72 61 63 74 65 72  rscore character
88e0: 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
88f0: 4f 46 3a 20 52 2d 31 33 33 34 35 2d 33 31 38 33  OF: R-13345-3183
8900: 30 20 54 68 65 20 65 73 63 61 70 65 20 63 68 61  0 The escape cha
8910: 72 61 63 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20  racter followed 
8920: 62 79 20 61 20 70 65 72 63 65 6e 74 0a 23 20 73  by a percent.# s
8930: 79 6d 62 6f 6c 20 28 25 29 2c 20 75 6e 64 65 72  ymbol (%), under
8940: 73 63 6f 72 65 20 28 5f 29 2c 20 6f 72 20 61 20  score (_), or a 
8950: 73 65 63 6f 6e 64 20 69 6e 73 74 61 6e 63 65 20  second instance 
8960: 6f 66 20 74 68 65 20 65 73 63 61 70 65 0a 23 20  of the escape.# 
8970: 63 68 61 72 61 63 74 65 72 20 69 74 73 65 6c 66  character itself
8980: 20 6d 61 74 63 68 65 73 20 61 20 6c 69 74 65 72   matches a liter
8990: 61 6c 20 70 65 72 63 65 6e 74 20 73 79 6d 62 6f  al percent symbo
89a0: 6c 2c 20 75 6e 64 65 72 73 63 6f 72 65 2c 20 6f  l, underscore, o
89b0: 72 20 61 0a 23 20 73 69 6e 67 6c 65 20 65 73 63  r a.# single esc
89c0: 61 70 65 20 63 68 61 72 61 63 74 65 72 2c 20 72  ape character, r
89d0: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 23 0a 64  espectively..#.d
89e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
89f0: 5f 65 78 70 72 2d 31 34 2e 37 2e 31 20 20 7b 20  _expr-14.7.1  { 
8a00: 53 45 4c 45 43 54 20 27 61 62 63 25 27 20 20 4c  SELECT 'abc%'  L
8a10: 49 4b 45 20 27 61 62 63 58 25 27 20 45 53 43 41  IKE 'abcX%' ESCA
8a20: 50 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f 65 78  PE 'X' } 1.do_ex
8a30: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
8a40: 72 2d 31 34 2e 37 2e 32 20 20 7b 20 53 45 4c 45  r-14.7.2  { SELE
8a50: 43 54 20 27 61 62 63 35 27 20 20 4c 49 4b 45 20  CT 'abc5'  LIKE 
8a60: 27 61 62 63 58 25 27 20 45 53 43 41 50 45 20 27  'abcX%' ESCAPE '
8a70: 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71  X' } 0.do_execsq
8a80: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
8a90: 2e 37 2e 33 20 20 7b 20 53 45 4c 45 43 54 20 27  .7.3  { SELECT '
8aa0: 61 62 63 27 20 20 20 4c 49 4b 45 20 27 61 62 63  abc'   LIKE 'abc
8ab0: 58 25 27 20 45 53 43 41 50 45 20 27 58 27 20 7d  X%' ESCAPE 'X' }
8ac0: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
8ad0: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 34  st e_expr-14.7.4
8ae0: 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 58    { SELECT 'abcX
8af0: 25 27 20 4c 49 4b 45 20 27 61 62 63 58 25 27 20  %' LIKE 'abcX%' 
8b00: 45 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a 64  ESCAPE 'X' } 0.d
8b10: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8b20: 5f 65 78 70 72 2d 31 34 2e 37 2e 35 20 20 7b 20  _expr-14.7.5  { 
8b30: 53 45 4c 45 43 54 20 27 61 62 63 25 25 27 20 4c  SELECT 'abc%%' L
8b40: 49 4b 45 20 27 61 62 63 58 25 27 20 45 53 43 41  IKE 'abcX%' ESCA
8b50: 50 45 20 27 58 27 20 7d 20 30 0a 0a 64 6f 5f 65  PE 'X' } 0..do_e
8b60: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8b70: 70 72 2d 31 34 2e 37 2e 36 20 20 7b 20 53 45 4c  pr-14.7.6  { SEL
8b80: 45 43 54 20 27 61 62 63 5f 27 20 20 4c 49 4b 45  ECT 'abc_'  LIKE
8b90: 20 27 61 62 63 58 5f 27 20 45 53 43 41 50 45 20   'abcX_' ESCAPE 
8ba0: 27 58 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73  'X' } 1.do_execs
8bb0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8bc0: 34 2e 37 2e 37 20 20 7b 20 53 45 4c 45 43 54 20  4.7.7  { SELECT 
8bd0: 27 61 62 63 35 27 20 20 4c 49 4b 45 20 27 61 62  'abc5'  LIKE 'ab
8be0: 63 58 5f 27 20 45 53 43 41 50 45 20 27 58 27 20  cX_' ESCAPE 'X' 
8bf0: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
8c00: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e  est e_expr-14.7.
8c10: 38 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  8  { SELECT 'abc
8c20: 27 20 20 20 4c 49 4b 45 20 27 61 62 63 58 5f 27  '   LIKE 'abcX_'
8c30: 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a   ESCAPE 'X' } 0.
8c40: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8c50: 65 5f 65 78 70 72 2d 31 34 2e 37 2e 39 20 20 7b  e_expr-14.7.9  {
8c60: 20 53 45 4c 45 43 54 20 27 61 62 63 58 5f 27 20   SELECT 'abcX_' 
8c70: 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53 43  LIKE 'abcX_' ESC
8c80: 41 50 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65  APE 'X' } 0.do_e
8c90: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8ca0: 70 72 2d 31 34 2e 37 2e 31 30 20 7b 20 53 45 4c  pr-14.7.10 { SEL
8cb0: 45 43 54 20 27 61 62 63 5f 5f 27 20 4c 49 4b 45  ECT 'abc__' LIKE
8cc0: 20 27 61 62 63 58 5f 27 20 45 53 43 41 50 45 20   'abcX_' ESCAPE 
8cd0: 27 58 27 20 7d 20 30 0a 0a 64 6f 5f 65 78 65 63  'X' } 0..do_exec
8ce0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
8cf0: 31 34 2e 37 2e 31 31 20 7b 20 53 45 4c 45 43 54  14.7.11 { SELECT
8d00: 20 27 61 62 63 58 27 20 20 4c 49 4b 45 20 27 61   'abcX'  LIKE 'a
8d10: 62 63 58 58 27 20 45 53 43 41 50 45 20 27 58 27  bcXX' ESCAPE 'X'
8d20: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
8d30: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37  test e_expr-14.7
8d40: 2e 31 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .12 { SELECT 'ab
8d50: 63 35 27 20 20 4c 49 4b 45 20 27 61 62 63 58 58  c5'  LIKE 'abcXX
8d60: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30  ' ESCAPE 'X' } 0
8d70: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8d80: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 33 20   e_expr-14.7.13 
8d90: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 27 20 20  { SELECT 'abc'  
8da0: 20 4c 49 4b 45 20 27 61 62 63 58 58 27 20 45 53   LIKE 'abcXX' ES
8db0: 43 41 50 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f  CAPE 'X' } 0.do_
8dc0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8dd0: 78 70 72 2d 31 34 2e 37 2e 31 34 20 7b 20 53 45  xpr-14.7.14 { SE
8de0: 4c 45 43 54 20 27 61 62 63 58 58 27 20 4c 49 4b  LECT 'abcXX' LIK
8df0: 45 20 27 61 62 63 58 58 27 20 45 53 43 41 50 45  E 'abcXX' ESCAPE
8e00: 20 27 58 27 20 7d 20 30 0a 0a 23 20 45 56 49 44   'X' } 0..# EVID
8e10: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 33 35 39  ENCE-OF: R-51359
8e20: 2d 31 37 34 39 36 20 54 68 65 20 69 6e 66 69 78  -17496 The infix
8e30: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 69   LIKE operator i
8e40: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
8e50: 0a 23 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 61  .# calling the a
8e60: 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
8e70: 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73  ed SQL functions
8e80: 20 6c 69 6b 65 28 59 2c 58 29 20 6f 72 20 6c 69   like(Y,X) or li
8e90: 6b 65 28 59 2c 58 2c 5a 29 2e 0a 23 0a 70 72 6f  ke(Y,X,Z)..#.pro
8ea0: 63 20 6c 69 6b 65 66 75 6e 63 20 7b 61 72 67 73  c likefunc {args
8eb0: 7d 20 7b 0a 20 20 65 76 61 6c 20 6c 61 70 70 65  } {.  eval lappe
8ec0: 6e 64 20 3a 3a 6c 69 6b 65 61 72 67 73 20 24 61  nd ::likeargs $a
8ed0: 72 67 73 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d  rgs.  return 1.}
8ee0: 0a 64 62 20 66 75 6e 63 20 6c 69 6b 65 20 2d 61  .db func like -a
8ef0: 72 67 63 6f 75 6e 74 20 32 20 6c 69 6b 65 66 75  rgcount 2 likefu
8f00: 6e 63 0a 64 62 20 66 75 6e 63 20 6c 69 6b 65 20  nc.db func like 
8f10: 2d 61 72 67 63 6f 75 6e 74 20 33 20 6c 69 6b 65  -argcount 3 like
8f20: 66 75 6e 63 0a 73 65 74 20 3a 3a 6c 69 6b 65 61  func.set ::likea
8f30: 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  rgs [list].do_ex
8f40: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
8f50: 72 2d 31 35 2e 31 2e 31 20 7b 20 53 45 4c 45 43  r-15.1.1 { SELEC
8f60: 54 20 27 61 62 63 27 20 4c 49 4b 45 20 27 64 65  T 'abc' LIKE 'de
8f70: 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73 74 20 20  f' } 1.do_test  
8f80: 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31 35         e_expr-15
8f90: 2e 31 2e 32 20 7b 20 73 65 74 20 6c 69 6b 65 61  .1.2 { set likea
8fa0: 72 67 73 20 7d 20 7b 64 65 66 20 61 62 63 7d 0a  rgs } {def abc}.
8fb0: 73 65 74 20 3a 3a 6c 69 6b 65 61 72 67 73 20 5b  set ::likeargs [
8fc0: 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c  list].do_execsql
8fd0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 35 2e  _test e_expr-15.
8fe0: 31 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.3 { SELECT 'ab
8ff0: 63 27 20 4c 49 4b 45 20 27 64 65 66 27 20 45 53  c' LIKE 'def' ES
9000: 43 41 50 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f  CAPE 'X' } 1.do_
9010: 74 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65  test         e_e
9020: 78 70 72 2d 31 35 2e 31 2e 34 20 7b 20 73 65 74  xpr-15.1.4 { set
9030: 20 6c 69 6b 65 61 72 67 73 20 7d 20 7b 64 65 66   likeargs } {def
9040: 20 61 62 63 20 58 7d 0a 64 62 20 63 6c 6f 73 65   abc X}.db close
9050: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
9060: 2e 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  .db..# EVIDENCE-
9070: 4f 46 3a 20 52 2d 32 32 38 36 38 2d 32 35 38 38  OF: R-22868-2588
9080: 30 20 54 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  0 The LIKE opera
9090: 74 6f 72 20 63 61 6e 20 62 65 20 6d 61 64 65 20  tor can be made 
90a0: 63 61 73 65 0a 23 20 73 65 6e 73 69 74 69 76 65  case.# sensitive
90b0: 20 75 73 69 6e 67 20 74 68 65 20 63 61 73 65 5f   using the case_
90c0: 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 20 70  sensitive_like p
90d0: 72 61 67 6d 61 2e 0a 23 0a 64 6f 5f 65 78 65 63  ragma..#.do_exec
90e0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
90f0: 31 36 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20  16.1.1 { SELECT 
9100: 27 61 62 63 78 79 7a 27 20 4c 49 4b 45 20 27 41  'abcxyz' LIKE 'A
9110: 42 43 25 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63  BC%' } 1.do_exec
9120: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
9130: 31 36 2e 31 2e 32 20 7b 20 50 52 41 47 4d 41 20  16.1.2 { PRAGMA 
9140: 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c  case_sensitive_l
9150: 69 6b 65 20 3d 20 31 20 7d 20 7b 7d 0a 64 6f 5f  ike = 1 } {}.do_
9160: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
9170: 78 70 72 2d 31 36 2e 31 2e 33 20 7b 20 53 45 4c  xpr-16.1.3 { SEL
9180: 45 43 54 20 27 61 62 63 78 79 7a 27 20 4c 49 4b  ECT 'abcxyz' LIK
9190: 45 20 27 41 42 43 25 27 20 7d 20 30 0a 64 6f 5f  E 'ABC%' } 0.do_
91a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
91b0: 78 70 72 2d 31 36 2e 31 2e 34 20 7b 20 53 45 4c  xpr-16.1.4 { SEL
91c0: 45 43 54 20 27 41 42 43 78 79 7a 27 20 4c 49 4b  ECT 'ABCxyz' LIK
91d0: 45 20 27 41 42 43 25 27 20 7d 20 31 0a 64 6f 5f  E 'ABC%' } 1.do_
91e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
91f0: 78 70 72 2d 31 36 2e 31 2e 35 20 7b 20 50 52 41  xpr-16.1.5 { PRA
9200: 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69  GMA case_sensiti
9210: 76 65 5f 6c 69 6b 65 20 3d 20 30 20 7d 20 7b 7d  ve_like = 0 } {}
9220: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9230: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 36 20 7b   e_expr-16.1.6 {
9240: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
9250: 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20 31   LIKE 'ABC%' } 1
9260: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9270: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 37 20 7b   e_expr-16.1.7 {
9280: 20 53 45 4c 45 43 54 20 27 41 42 43 78 79 7a 27   SELECT 'ABCxyz'
9290: 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20 31   LIKE 'ABC%' } 1
92a0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
92b0: 20 52 2d 35 32 30 38 37 2d 31 32 30 34 33 20 54   R-52087-12043 T
92c0: 68 65 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  he GLOB operator
92d0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 4c   is similar to L
92e0: 49 4b 45 20 62 75 74 0a 23 20 75 73 65 73 20 74  IKE but.# uses t
92f0: 68 65 20 55 6e 69 78 20 66 69 6c 65 20 67 6c 6f  he Unix file glo
9300: 62 62 69 6e 67 20 73 79 6e 74 61 78 20 66 6f 72  bbing syntax for
9310: 20 69 74 73 20 77 69 6c 64 63 61 72 64 73 2e 0a   its wildcards..
9320: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
9330: 20 52 2d 30 39 38 31 33 2d 31 37 32 37 39 20 41   R-09813-17279 A
9340: 6c 73 6f 2c 20 47 4c 4f 42 20 69 73 20 63 61 73  lso, GLOB is cas
9350: 65 20 73 65 6e 73 69 74 69 76 65 2c 20 75 6e 6c  e sensitive, unl
9360: 69 6b 65 20 4c 49 4b 45 2e 0a 23 0a 64 6f 5f 65  ike LIKE..#.do_e
9370: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
9380: 70 72 2d 31 37 2e 31 2e 31 20 7b 20 53 45 4c 45  pr-17.1.1 { SELE
9390: 43 54 20 27 61 62 63 78 79 7a 27 20 47 4c 4f 42  CT 'abcxyz' GLOB
93a0: 20 27 61 62 63 25 27 20 7d 20 30 0a 64 6f 5f 65   'abc%' } 0.do_e
93b0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
93c0: 70 72 2d 31 37 2e 31 2e 32 20 7b 20 53 45 4c 45  pr-17.1.2 { SELE
93d0: 43 54 20 27 61 62 63 78 79 7a 27 20 47 4c 4f 42  CT 'abcxyz' GLOB
93e0: 20 27 61 62 63 2a 27 20 7d 20 31 0a 64 6f 5f 65   'abc*' } 1.do_e
93f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
9400: 70 72 2d 31 37 2e 31 2e 33 20 7b 20 53 45 4c 45  pr-17.1.3 { SELE
9410: 43 54 20 27 61 62 63 78 79 7a 27 20 47 4c 4f 42  CT 'abcxyz' GLOB
9420: 20 27 61 62 63 5f 5f 5f 27 20 7d 20 30 0a 64 6f   'abc___' } 0.do
9430: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9440: 65 78 70 72 2d 31 37 2e 31 2e 34 20 7b 20 53 45  expr-17.1.4 { SE
9450: 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 47 4c  LECT 'abcxyz' GL
9460: 4f 42 20 27 61 62 63 3f 3f 3f 27 20 7d 20 31 0a  OB 'abc???' } 1.
9470: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9480: 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 35 20 7b   e_expr-17.1.5 {
9490: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
94a0: 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20 31   GLOB 'abc*' } 1
94b0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
94c0: 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 36 20 7b   e_expr-17.1.6 {
94d0: 20 53 45 4c 45 43 54 20 27 41 42 43 78 79 7a 27   SELECT 'ABCxyz'
94e0: 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20 30   GLOB 'abc*' } 0
94f0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9500: 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 37 20 7b   e_expr-17.1.7 {
9510: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
9520: 20 47 4c 4f 42 20 27 41 42 43 2a 27 20 7d 20 30   GLOB 'ABC*' } 0
9530: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
9540: 20 52 2d 33 39 36 31 36 2d 32 30 35 35 35 20 42   R-39616-20555 B
9550: 6f 74 68 20 47 4c 4f 42 20 61 6e 64 20 4c 49 4b  oth GLOB and LIK
9560: 45 20 6d 61 79 20 62 65 20 70 72 65 63 65 64 65  E may be precede
9570: 64 20 62 79 20 74 68 65 0a 23 20 4e 4f 54 20 6b  d by the.# NOT k
9580: 65 79 77 6f 72 64 20 74 6f 20 69 6e 76 65 72 74  eyword to invert
9590: 20 74 68 65 20 73 65 6e 73 65 20 6f 66 20 74 68   the sense of th
95a0: 65 20 74 65 73 74 2e 0a 23 0a 64 6f 5f 65 78 65  e test..#.do_exe
95b0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
95c0: 2d 31 37 2e 32 2e 31 20 7b 20 53 45 4c 45 43 54  -17.2.1 { SELECT
95d0: 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 47 4c   'abcxyz' NOT GL
95e0: 4f 42 20 27 41 42 43 2a 27 20 7d 20 31 0a 64 6f  OB 'ABC*' } 1.do
95f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9600: 65 78 70 72 2d 31 37 2e 32 2e 32 20 7b 20 53 45  expr-17.2.2 { SE
9610: 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e 4f  LECT 'abcxyz' NO
9620: 54 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20  T GLOB 'abc*' } 
9630: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
9640: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 33 20  t e_expr-17.2.3 
9650: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
9660: 27 20 4e 4f 54 20 4c 49 4b 45 20 27 41 42 43 25  ' NOT LIKE 'ABC%
9670: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
9680: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9690: 32 2e 34 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.4 { SELECT 'ab
96a0: 63 78 79 7a 27 20 4e 4f 54 20 4c 49 4b 45 20 27  cxyz' NOT LIKE '
96b0: 61 62 63 25 27 20 7d 20 30 0a 64 6f 5f 65 78 65  abc%' } 0.do_exe
96c0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
96d0: 2d 31 37 2e 32 2e 35 20 7b 20 53 45 4c 45 43 54  -17.2.5 { SELECT
96e0: 20 27 61 62 64 78 79 7a 27 20 4e 4f 54 20 4c 49   'abdxyz' NOT LI
96f0: 4b 45 20 27 61 62 63 25 27 20 7d 20 31 0a 0a 64  KE 'abc%' } 1..d
9700: 62 20 6e 75 6c 6c 76 61 6c 75 65 20 6e 75 6c 6c  b nullvalue null
9710: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9720: 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 36 20 7b   e_expr-17.2.6 {
9730: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
9740: 20 4e 4f 54 20 47 4c 4f 42 20 4e 55 4c 4c 20 7d   NOT GLOB NULL }
9750: 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c   null.do_execsql
9760: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9770: 32 2e 37 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.7 { SELECT 'ab
9780: 63 78 79 7a 27 20 4e 4f 54 20 4c 49 4b 45 20 4e  cxyz' NOT LIKE N
9790: 55 4c 4c 20 7d 20 6e 75 6c 6c 0a 64 6f 5f 65 78  ULL } null.do_ex
97a0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
97b0: 72 2d 31 37 2e 32 2e 38 20 7b 20 53 45 4c 45 43  r-17.2.8 { SELEC
97c0: 54 20 4e 55 4c 4c 20 4e 4f 54 20 47 4c 4f 42 20  T NULL NOT GLOB 
97d0: 27 61 62 63 2a 27 20 7d 20 6e 75 6c 6c 0a 64 6f  'abc*' } null.do
97e0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
97f0: 65 78 70 72 2d 31 37 2e 32 2e 39 20 7b 20 53 45  expr-17.2.9 { SE
9800: 4c 45 43 54 20 4e 55 4c 4c 20 4e 4f 54 20 4c 49  LECT NULL NOT LI
9810: 4b 45 20 27 41 42 43 25 27 20 7d 20 6e 75 6c 6c  KE 'ABC%' } null
9820: 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 7b 7d  .db nullvalue {}
9830: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
9840: 20 52 2d 33 39 34 31 34 2d 33 35 34 38 39 20 54   R-39414-35489 T
9850: 68 65 20 69 6e 66 69 78 20 47 4c 4f 42 20 6f 70  he infix GLOB op
9860: 65 72 61 74 6f 72 20 69 73 20 69 6d 70 6c 65 6d  erator is implem
9870: 65 6e 74 65 64 20 62 79 0a 23 20 63 61 6c 6c 69  ented by.# calli
9880: 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ng the function 
9890: 67 6c 6f 62 28 59 2c 58 29 20 61 6e 64 20 63 61  glob(Y,X) and ca
98a0: 6e 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62 79  n be modified by
98b0: 20 6f 76 65 72 72 69 64 69 6e 67 20 74 68 61 74   overriding that
98c0: 0a 23 20 66 75 6e 63 74 69 6f 6e 2e 0a 70 72 6f  .# function..pro
98d0: 63 20 67 6c 6f 62 66 75 6e 63 20 7b 61 72 67 73  c globfunc {args
98e0: 7d 20 7b 0a 20 20 65 76 61 6c 20 6c 61 70 70 65  } {.  eval lappe
98f0: 6e 64 20 3a 3a 67 6c 6f 62 61 72 67 73 20 24 61  nd ::globargs $a
9900: 72 67 73 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d  rgs.  return 1.}
9910: 0a 64 62 20 66 75 6e 63 20 67 6c 6f 62 20 2d 61  .db func glob -a
9920: 72 67 63 6f 75 6e 74 20 32 20 67 6c 6f 62 66 75  rgcount 2 globfu
9930: 6e 63 0a 73 65 74 20 3a 3a 67 6c 6f 62 61 72 67  nc.set ::globarg
9940: 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63  s [list].do_exec
9950: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
9960: 31 37 2e 33 2e 31 20 7b 20 53 45 4c 45 43 54 20  17.3.1 { SELECT 
9970: 27 61 62 63 27 20 47 4c 4f 42 20 27 64 65 66 27  'abc' GLOB 'def'
9980: 20 7d 20 31 0a 64 6f 5f 74 65 73 74 20 20 20 20   } 1.do_test    
9990: 20 20 20 20 20 65 5f 65 78 70 72 2d 31 37 2e 33       e_expr-17.3
99a0: 2e 32 20 7b 20 73 65 74 20 67 6c 6f 62 61 72 67  .2 { set globarg
99b0: 73 20 7d 20 7b 64 65 66 20 61 62 63 7d 0a 73 65  s } {def abc}.se
99c0: 74 20 3a 3a 67 6c 6f 62 61 72 67 73 20 5b 6c 69  t ::globargs [li
99d0: 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  st].do_execsql_t
99e0: 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 33 2e  est e_expr-17.3.
99f0: 33 20 7b 20 53 45 4c 45 43 54 20 27 58 27 20 4e  3 { SELECT 'X' N
9a00: 4f 54 20 47 4c 4f 42 20 27 59 27 20 7d 20 30 0a  OT GLOB 'Y' } 0.
9a10: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
9a20: 65 5f 65 78 70 72 2d 31 37 2e 33 2e 34 20 7b 20  e_expr-17.3.4 { 
9a30: 73 65 74 20 67 6c 6f 62 61 72 67 73 20 7d 20 7b  set globargs } {
9a40: 59 20 58 7d 0a 73 71 6c 69 74 65 33 20 64 62 20  Y X}.sqlite3 db 
9a50: 74 65 73 74 2e 64 62 0a 0a 23 20 45 56 49 44 45  test.db..# EVIDE
9a60: 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 36 35 30 2d  NCE-OF: R-41650-
9a70: 32 30 38 37 32 20 4e 6f 20 72 65 67 65 78 70 28  20872 No regexp(
9a80: 29 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  ) user function 
9a90: 69 73 20 64 65 66 69 6e 65 64 20 62 79 0a 23 20  is defined by.# 
9aa0: 64 65 66 61 75 6c 74 20 61 6e 64 20 73 6f 20 75  default and so u
9ab0: 73 65 20 6f 66 20 74 68 65 20 52 45 47 45 58 50  se of the REGEXP
9ac0: 20 6f 70 65 72 61 74 6f 72 20 77 69 6c 6c 20 6e   operator will n
9ad0: 6f 72 6d 61 6c 6c 79 20 72 65 73 75 6c 74 20 69  ormally result i
9ae0: 6e 20 61 6e 0a 23 20 65 72 72 6f 72 20 6d 65 73  n an.# error mes
9af0: 73 61 67 65 2e 0a 23 0a 23 20 20 20 54 68 65 72  sage..#.#   Ther
9b00: 65 20 69 73 20 61 20 72 65 67 65 78 70 20 66 75  e is a regexp fu
9b10: 6e 63 74 69 6f 6e 20 69 66 20 49 43 55 20 69 73  nction if ICU is
9b20: 20 65 6e 61 62 6c 65 64 20 74 68 6f 75 67 68 2e   enabled though.
9b30: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 21 69 63  .#.ifcapable !ic
9b40: 75 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71  u {.  do_catchsq
9b50: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 38  l_test e_expr-18
9b60: 2e 31 2e 31 20 7b 20 0a 20 20 20 20 53 45 4c 45  .1.1 { .    SELE
9b70: 43 54 20 72 65 67 65 78 70 28 27 61 62 63 27 2c  CT regexp('abc',
9b80: 20 27 64 65 66 27 29 20 0a 20 20 7d 20 7b 31 20   'def') .  } {1 
9b90: 7b 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f  {no such functio
9ba0: 6e 3a 20 72 65 67 65 78 70 7d 7d 0a 20 20 64 6f  n: regexp}}.  do
9bb0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
9bc0: 5f 65 78 70 72 2d 31 38 2e 31 2e 32 20 7b 20 0a  _expr-18.1.2 { .
9bd0: 20 20 20 20 53 45 4c 45 43 54 20 27 61 62 63 27      SELECT 'abc'
9be0: 20 52 45 47 45 58 50 20 27 64 65 66 27 0a 20 20   REGEXP 'def'.  
9bf0: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 66 75  } {1 {no such fu
9c00: 6e 63 74 69 6f 6e 3a 20 52 45 47 45 58 50 7d 7d  nction: REGEXP}}
9c10: 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
9c20: 46 3a 20 52 2d 33 33 36 39 33 2d 35 30 31 38 30  F: R-33693-50180
9c30: 20 54 68 65 20 52 45 47 45 58 50 20 6f 70 65 72   The REGEXP oper
9c40: 61 74 6f 72 20 69 73 20 61 20 73 70 65 63 69 61  ator is a specia
9c50: 6c 20 73 79 6e 74 61 78 20 66 6f 72 0a 23 20 74  l syntax for.# t
9c60: 68 65 20 72 65 67 65 78 70 28 29 20 75 73 65 72  he regexp() user
9c70: 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 23 20 45   function..#.# E
9c80: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35  VIDENCE-OF: R-65
9c90: 35 32 34 2d 36 31 38 34 39 20 49 66 20 61 6e 20  524-61849 If an 
9ca0: 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69  application-defi
9cb0: 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ned SQL function
9cc0: 0a 23 20 6e 61 6d 65 64 20 22 72 65 67 65 78 70  .# named "regexp
9cd0: 22 20 69 73 20 61 64 64 65 64 20 61 74 20 72 75  " is added at ru
9ce0: 6e 2d 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65  n-time, then the
9cf0: 20 22 58 20 52 45 47 45 58 50 20 59 22 20 6f 70   "X REGEXP Y" op
9d00: 65 72 61 74 6f 72 0a 23 20 77 69 6c 6c 20 62 65  erator.# will be
9d10: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
9d20: 61 20 63 61 6c 6c 20 74 6f 20 22 72 65 67 65 78  a call to "regex
9d30: 70 28 59 2c 58 29 22 2e 0a 23 0a 70 72 6f 63 20  p(Y,X)"..#.proc 
9d40: 72 65 67 65 78 70 66 75 6e 63 20 7b 61 72 67 73  regexpfunc {args
9d50: 7d 20 7b 0a 20 20 65 76 61 6c 20 6c 61 70 70 65  } {.  eval lappe
9d60: 6e 64 20 3a 3a 72 65 67 65 78 70 61 72 67 73 20  nd ::regexpargs 
9d70: 24 61 72 67 73 0a 20 20 72 65 74 75 72 6e 20 31  $args.  return 1
9d80: 0a 7d 0a 64 62 20 66 75 6e 63 20 72 65 67 65 78  .}.db func regex
9d90: 70 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 72 65  p -argcount 2 re
9da0: 67 65 78 70 66 75 6e 63 0a 73 65 74 20 3a 3a 72  gexpfunc.set ::r
9db0: 65 67 65 78 70 61 72 67 73 20 5b 6c 69 73 74 5d  egexpargs [list]
9dc0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9dd0: 20 65 5f 65 78 70 72 2d 31 38 2e 32 2e 31 20 7b   e_expr-18.2.1 {
9de0: 20 53 45 4c 45 43 54 20 27 61 62 63 27 20 52 45   SELECT 'abc' RE
9df0: 47 45 58 50 20 27 64 65 66 27 20 7d 20 31 0a 64  GEXP 'def' } 1.d
9e00: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 65  o_test         e
9e10: 5f 65 78 70 72 2d 31 38 2e 32 2e 32 20 7b 20 73  _expr-18.2.2 { s
9e20: 65 74 20 72 65 67 65 78 70 61 72 67 73 20 7d 20  et regexpargs } 
9e30: 7b 64 65 66 20 61 62 63 7d 0a 73 65 74 20 3a 3a  {def abc}.set ::
9e40: 72 65 67 65 78 70 61 72 67 73 20 5b 6c 69 73 74  regexpargs [list
9e50: 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ].do_execsql_tes
9e60: 74 20 65 5f 65 78 70 72 2d 31 38 2e 32 2e 33 20  t e_expr-18.2.3 
9e70: 7b 20 53 45 4c 45 43 54 20 27 58 27 20 4e 4f 54  { SELECT 'X' NOT
9e80: 20 52 45 47 45 58 50 20 27 59 27 20 7d 20 30 0a   REGEXP 'Y' } 0.
9e90: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
9ea0: 65 5f 65 78 70 72 2d 31 38 2e 32 2e 34 20 7b 20  e_expr-18.2.4 { 
9eb0: 73 65 74 20 72 65 67 65 78 70 61 72 67 73 20 7d  set regexpargs }
9ec0: 20 7b 59 20 58 7d 0a 73 71 6c 69 74 65 33 20 64   {Y X}.sqlite3 d
9ed0: 62 20 74 65 73 74 2e 64 62 0a 0a 23 20 45 56 49  b test.db..# EVI
9ee0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32 30 33  DENCE-OF: R-4203
9ef0: 37 2d 33 37 38 32 36 20 54 68 65 20 64 65 66 61  7-37826 The defa
9f00: 75 6c 74 20 6d 61 74 63 68 28 29 20 66 75 6e 63  ult match() func
9f10: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tion implementat
9f20: 69 6f 6e 0a 23 20 72 61 69 73 65 73 20 61 6e 20  ion.# raises an 
9f30: 65 78 63 65 70 74 69 6f 6e 20 61 6e 64 20 69 73  exception and is
9f40: 20 6e 6f 74 20 72 65 61 6c 6c 79 20 75 73 65 66   not really usef
9f50: 75 6c 20 66 6f 72 20 61 6e 79 74 68 69 6e 67 2e  ul for anything.
9f60: 0a 23 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  .#.do_catchsql_t
9f70: 65 73 74 20 65 5f 65 78 70 72 2d 31 39 2e 31 2e  est e_expr-19.1.
9f80: 31 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 27 61  1 { .  SELECT 'a
9f90: 62 63 27 20 4d 41 54 43 48 20 27 64 65 66 27 20  bc' MATCH 'def' 
9fa0: 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f  .} {1 {unable to
9fb0: 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 4d 41   use function MA
9fc0: 54 43 48 20 69 6e 20 74 68 65 20 72 65 71 75 65  TCH in the reque
9fd0: 73 74 65 64 20 63 6f 6e 74 65 78 74 7d 7d 0a 64  sted context}}.d
9fe0: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
9ff0: 65 5f 65 78 70 72 2d 31 39 2e 31 2e 32 20 7b 20  e_expr-19.1.2 { 
a000: 0a 20 20 53 45 4c 45 43 54 20 6d 61 74 63 68 28  .  SELECT match(
a010: 27 61 62 63 27 2c 20 27 64 65 66 27 29 0a 7d 20  'abc', 'def').} 
a020: 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73  {1 {unable to us
a030: 65 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48  e function MATCH
a040: 20 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65   in the requeste
a050: 64 20 63 6f 6e 74 65 78 74 7d 7d 0a 0a 23 20 45  d context}}..# E
a060: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
a070: 39 31 36 2d 34 37 34 30 37 20 54 68 65 20 4d 41  916-47407 The MA
a080: 54 43 48 20 6f 70 65 72 61 74 6f 72 20 69 73 20  TCH operator is 
a090: 61 20 73 70 65 63 69 61 6c 20 73 79 6e 74 61 78  a special syntax
a0a0: 20 66 6f 72 0a 23 20 74 68 65 20 6d 61 74 63 68   for.# the match
a0b0: 28 29 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64  () application-d
a0c0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 2e  efined function.
a0d0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
a0e0: 3a 20 52 2d 30 36 30 32 31 2d 30 39 33 37 33 20  : R-06021-09373 
a0f0: 42 75 74 20 65 78 74 65 6e 73 69 6f 6e 73 20 63  But extensions c
a100: 61 6e 20 6f 76 65 72 72 69 64 65 20 74 68 65 20  an override the 
a110: 6d 61 74 63 68 28 29 0a 23 20 66 75 6e 63 74 69  match().# functi
a120: 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 68 65 6c  on with more hel
a130: 70 66 75 6c 20 6c 6f 67 69 63 2e 0a 23 0a 70 72  pful logic..#.pr
a140: 6f 63 20 6d 61 74 63 68 66 75 6e 63 20 7b 61 72  oc matchfunc {ar
a150: 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20 6c 61 70  gs} {.  eval lap
a160: 70 65 6e 64 20 3a 3a 6d 61 74 63 68 61 72 67 73  pend ::matchargs
a170: 20 24 61 72 67 73 0a 20 20 72 65 74 75 72 6e 20   $args.  return 
a180: 31 0a 7d 0a 64 62 20 66 75 6e 63 20 6d 61 74 63  1.}.db func matc
a190: 68 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 6d 61  h -argcount 2 ma
a1a0: 74 63 68 66 75 6e 63 0a 73 65 74 20 3a 3a 6d 61  tchfunc.set ::ma
a1b0: 74 63 68 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64  tchargs [list].d
a1c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
a1d0: 5f 65 78 70 72 2d 31 39 2e 32 2e 31 20 7b 20 53  _expr-19.2.1 { S
a1e0: 45 4c 45 43 54 20 27 61 62 63 27 20 4d 41 54 43  ELECT 'abc' MATC
a1f0: 48 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74  H 'def' } 1.do_t
a200: 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78  est         e_ex
a210: 70 72 2d 31 39 2e 32 2e 32 20 7b 20 73 65 74 20  pr-19.2.2 { set 
a220: 6d 61 74 63 68 61 72 67 73 20 7d 20 7b 64 65 66  matchargs } {def
a230: 20 61 62 63 7d 0a 73 65 74 20 3a 3a 6d 61 74 63   abc}.set ::matc
a240: 68 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f  hargs [list].do_
a250: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
a260: 78 70 72 2d 31 39 2e 32 2e 33 20 7b 20 53 45 4c  xpr-19.2.3 { SEL
a270: 45 43 54 20 27 58 27 20 4e 4f 54 20 4d 41 54 43  ECT 'X' NOT MATC
a280: 48 20 27 59 27 20 7d 20 30 0a 64 6f 5f 74 65 73  H 'Y' } 0.do_tes
a290: 74 20 20 20 20 20 20 20 20 20 65 5f 65 78 70 72  t         e_expr
a2a0: 2d 31 39 2e 32 2e 34 20 7b 20 73 65 74 20 6d 61  -19.2.4 { set ma
a2b0: 74 63 68 61 72 67 73 20 7d 20 7b 59 20 58 7d 0a  tchargs } {Y X}.
a2c0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
a2d0: 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  db..#-----------
a2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
a320: 20 54 65 73 74 20 63 61 73 65 73 20 66 6f 72 20   Test cases for 
a330: 74 68 65 20 74 65 73 74 61 62 6c 65 20 73 74 61  the testable sta
a340: 74 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20  tements related 
a350: 74 6f 20 74 68 65 20 43 41 53 45 20 65 78 70 72  to the CASE expr
a360: 65 73 73 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44  ession..#.# EVID
a370: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 31 39 39  ENCE-OF: R-15199
a380: 2d 36 31 33 38 39 20 54 68 65 72 65 20 61 72 65  -61389 There are
a390: 20 74 77 6f 20 62 61 73 69 63 20 66 6f 72 6d 73   two basic forms
a3a0: 20 6f 66 20 74 68 65 20 43 41 53 45 0a 23 20 65   of the CASE.# e
a3b0: 78 70 72 65 73 73 69 6f 6e 3a 20 74 68 6f 73 65  xpression: those
a3c0: 20 77 69 74 68 20 61 20 62 61 73 65 20 65 78 70   with a base exp
a3d0: 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68 6f 73  ression and thos
a3e0: 65 20 77 69 74 68 6f 75 74 2e 0a 23 0a 64 6f 5f  e without..#.do_
a3f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
a400: 78 70 72 2d 32 30 2e 31 20 7b 0a 20 20 53 45 4c  xpr-20.1 {.  SEL
a410: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 31 20  ECT CASE WHEN 1 
a420: 54 48 45 4e 20 27 74 72 75 65 27 20 57 48 45 4e  THEN 'true' WHEN
a430: 20 30 20 54 48 45 4e 20 27 66 61 6c 73 65 27 20   0 THEN 'false' 
a440: 45 4c 53 45 20 27 65 6c 73 65 27 20 45 4e 44 3b  ELSE 'else' END;
a450: 0a 7d 20 7b 74 72 75 65 7d 0a 64 6f 5f 65 78 65  .} {true}.do_exe
a460: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
a470: 2d 32 30 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  -20.2 {.  SELECT
a480: 20 43 41 53 45 20 30 20 57 48 45 4e 20 31 20 54   CASE 0 WHEN 1 T
a490: 48 45 4e 20 27 74 72 75 65 27 20 57 48 45 4e 20  HEN 'true' WHEN 
a4a0: 30 20 54 48 45 4e 20 27 66 61 6c 73 65 27 20 45  0 THEN 'false' E
a4b0: 4c 53 45 20 27 65 6c 73 65 27 20 45 4e 44 3b 0a  LSE 'else' END;.
a4c0: 7d 20 7b 66 61 6c 73 65 7d 0a 0a 70 72 6f 63 20  } {false}..proc 
a4d0: 76 61 72 20 7b 6e 6d 7d 20 7b 0a 20 20 6c 61 70  var {nm} {.  lap
a4e0: 70 65 6e 64 20 3a 3a 76 61 72 6c 69 73 74 20 24  pend ::varlist $
a4f0: 6e 6d 0a 20 20 72 65 74 75 72 6e 20 5b 73 65 74  nm.  return [set
a500: 20 22 3a 3a 24 6e 6d 22 5d 0a 7d 0a 64 62 20 66   "::$nm"].}.db f
a510: 75 6e 63 20 76 61 72 20 76 61 72 0a 0a 23 20 45  unc var var..# E
a520: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30  VIDENCE-OF: R-30
a530: 36 33 38 2d 35 39 39 35 34 20 49 6e 20 61 20 43  638-59954 In a C
a540: 41 53 45 20 77 69 74 68 6f 75 74 20 61 20 62 61  ASE without a ba
a550: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65  se expression, e
a560: 61 63 68 0a 23 20 57 48 45 4e 20 65 78 70 72 65  ach.# WHEN expre
a570: 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
a580: 65 64 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c  ed and the resul
a590: 74 20 74 72 65 61 74 65 64 20 61 73 20 61 20 62  t treated as a b
a5a0: 6f 6f 6c 65 61 6e 2c 0a 23 20 73 74 61 72 74 69  oolean,.# starti
a5b0: 6e 67 20 77 69 74 68 20 74 68 65 20 6c 65 66 74  ng with the left
a5c0: 6d 6f 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  most and continu
a5d0: 69 6e 67 20 74 6f 20 74 68 65 20 72 69 67 68 74  ing to the right
a5e0: 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 61 20 62  ..#.foreach {a b
a5f0: 20 63 7d 20 7b 30 20 30 20 30 7d 20 62 72 65 61   c} {0 0 0} brea
a600: 6b 0a 73 65 74 20 76 61 72 6c 69 73 74 20 5b 6c  k.set varlist [l
a610: 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ist].do_execsql_
a620: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 31  test e_expr-21.1
a630: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .1 {.  SELECT CA
a640: 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27 29  SE WHEN var('a')
a650: 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20   THEN 'A' .     
a660: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
a670: 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20  r('b') THEN 'B' 
a680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
a690: 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45  HEN var('c') THE
a6a0: 4e 20 27 43 27 20 45 4e 44 0a 7d 20 7b 7b 7d 7d  N 'C' END.} {{}}
a6b0: 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  .do_test e_expr-
a6c0: 32 31 2e 31 2e 32 20 7b 20 73 65 74 20 76 61 72  21.1.2 { set var
a6d0: 6c 69 73 74 20 7d 20 7b 61 20 62 20 63 7d 0a 73  list } {a b c}.s
a6e0: 65 74 20 76 61 72 6c 69 73 74 20 5b 6c 69 73 74  et varlist [list
a6f0: 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ].do_execsql_tes
a700: 74 20 65 5f 65 78 70 72 2d 32 31 2e 31 2e 33 20  t e_expr-21.1.3 
a710: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
a720: 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48  WHEN var('c') TH
a730: 45 4e 20 27 43 27 20 0a 20 20 20 20 20 20 20 20  EN 'C' .        
a740: 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27        WHEN var('
a750: 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20  b') THEN 'B' .  
a760: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e              WHEN
a770: 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20 27   var('a') THEN '
a780: 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  A' .            
a790: 20 20 45 4c 53 45 20 27 6e 6f 20 72 65 73 75 6c    ELSE 'no resul
a7a0: 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 7b 6e 6f 20  t'.  END.} {{no 
a7b0: 72 65 73 75 6c 74 7d 7d 0a 64 6f 5f 74 65 73 74  result}}.do_test
a7c0: 20 65 5f 65 78 70 72 2d 32 31 2e 31 2e 34 20 7b   e_expr-21.1.4 {
a7d0: 20 73 65 74 20 76 61 72 6c 69 73 74 20 7d 20 7b   set varlist } {
a7e0: 63 20 62 20 61 7d 0a 0a 23 20 45 56 49 44 45 4e  c b a}..# EVIDEN
a7f0: 43 45 2d 4f 46 3a 20 52 2d 33 39 30 30 39 2d 32  CE-OF: R-39009-2
a800: 35 35 39 36 20 54 68 65 20 72 65 73 75 6c 74 20  5596 The result 
a810: 6f 66 20 74 68 65 20 43 41 53 45 20 65 78 70 72  of the CASE expr
a820: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 0a 23 20  ession is the.# 
a830: 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68  evaluation of th
a840: 65 20 54 48 45 4e 20 65 78 70 72 65 73 73 69 6f  e THEN expressio
a850: 6e 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  n that correspon
a860: 64 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ds to the first 
a870: 57 48 45 4e 0a 23 20 65 78 70 72 65 73 73 69 6f  WHEN.# expressio
a880: 6e 20 74 68 61 74 20 65 76 61 6c 75 61 74 65 73  n that evaluates
a890: 20 74 6f 20 74 72 75 65 2e 0a 23 0a 66 6f 72 65   to true..#.fore
a8a0: 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20 31  ach {a b c} {0 1
a8b0: 20 30 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78 65   0} break.do_exe
a8c0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
a8d0: 2d 32 31 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45  -21.2.1 {.  SELE
a8e0: 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61 72  CT CASE WHEN var
a8f0: 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a  ('a') THEN 'A' .
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
a910: 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e  EN var('b') THEN
a920: 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20   'B' .          
a930: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63 27      WHEN var('c'
a940: 29 20 54 48 45 4e 20 27 43 27 20 0a 20 20 20 20  ) THEN 'C' .    
a950: 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 27            ELSE '
a960: 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20 45 4e 44  no result'.  END
a970: 0a 7d 20 7b 42 7d 0a 66 6f 72 65 61 63 68 20 7b  .} {B}.foreach {
a980: 61 20 62 20 63 7d 20 7b 30 20 31 20 31 7d 20 62  a b c} {0 1 1} b
a990: 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  reak.do_execsql_
a9a0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 32  test e_expr-21.2
a9b0: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .2 {.  SELECT CA
a9c0: 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27 29  SE WHEN var('a')
a9d0: 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20   THEN 'A' .     
a9e0: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
a9f0: 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20  r('b') THEN 'B' 
aa00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
aa10: 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45  HEN var('c') THE
aa20: 4e 20 27 43 27 0a 20 20 20 20 20 20 20 20 20 20  N 'C'.          
aa30: 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72 65 73      ELSE 'no res
aa40: 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 42 7d  ult'.  END.} {B}
aa50: 0a 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d  .foreach {a b c}
aa60: 20 7b 30 20 30 20 31 7d 20 62 72 65 61 6b 0a 64   {0 0 1} break.d
aa70: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
aa80: 5f 65 78 70 72 2d 32 31 2e 32 2e 33 20 7b 0a 20  _expr-21.2.3 {. 
aa90: 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
aaa0: 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20  N var('a') THEN 
aab0: 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'A' .           
aac0: 20 20 20 57 48 45 4e 20 76 61 72 28 27 62 27 29     WHEN var('b')
aad0: 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20   THEN 'B' .     
aae0: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
aaf0: 72 28 27 63 27 29 20 54 48 45 4e 20 27 43 27 0a  r('c') THEN 'C'.
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c                EL
ab10: 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20  SE 'no result'. 
ab20: 20 45 4e 44 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56   END.} {C}..# EV
ab30: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 32  IDENCE-OF: R-242
ab40: 32 37 2d 30 34 38 30 37 20 4f 72 2c 20 69 66 20  27-04807 Or, if 
ab50: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 4e  none of the WHEN
ab60: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 23 20 65   expressions.# e
ab70: 76 61 6c 75 61 74 65 20 74 6f 20 74 72 75 65 2c  valuate to true,
ab80: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65   the result of e
ab90: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 45 4c  valuating the EL
aba0: 53 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69  SE expression, i
abb0: 66 0a 23 20 61 6e 79 2e 0a 23 0a 66 6f 72 65 61  f.# any..#.forea
abc0: 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20 30 20  ch {a b c} {0 0 
abd0: 30 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78 65 63  0} break.do_exec
abe0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
abf0: 32 31 2e 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43  21.3.1 {.  SELEC
ac00: 54 20 43 41 53 45 20 57 48 45 4e 20 76 61 72 28  T CASE WHEN var(
ac10: 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20  'a') THEN 'A' . 
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
ac30: 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e 20  N var('b') THEN 
ac40: 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'B' .           
ac50: 20 20 20 57 48 45 4e 20 76 61 72 28 27 63 27 29     WHEN var('c')
ac60: 20 54 48 45 4e 20 27 43 27 0a 20 20 20 20 20 20   THEN 'C'.      
ac70: 20 20 20 20 20 20 20 20 45 4c 53 45 20 27 6e 6f          ELSE 'no
ac80: 20 72 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d   result'.  END.}
ac90: 20 7b 7b 6e 6f 20 72 65 73 75 6c 74 7d 7d 0a 0a   {{no result}}..
aca0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
acb0: 2d 31 34 31 36 38 2d 30 37 35 37 39 20 49 66 20  -14168-07579 If 
acc0: 74 68 65 72 65 20 69 73 20 6e 6f 20 45 4c 53 45  there is no ELSE
acd0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
ace0: 6e 6f 6e 65 20 6f 66 0a 23 20 74 68 65 20 57 48  none of.# the WH
acf0: 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  EN expressions a
ad00: 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  re true, then th
ad10: 65 20 6f 76 65 72 61 6c 6c 20 72 65 73 75 6c 74  e overall result
ad20: 20 69 73 20 4e 55 4c 4c 2e 0a 23 0a 64 62 20 6e   is NULL..#.db n
ad30: 75 6c 6c 76 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f  ullvalue null.do
ad40: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
ad50: 65 78 70 72 2d 32 31 2e 33 2e 32 20 7b 0a 20 20  expr-21.3.2 {.  
ad60: 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
ad70: 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20 27   var('a') THEN '
ad80: 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  A' .            
ad90: 20 20 57 48 45 4e 20 76 61 72 28 27 62 27 29 20    WHEN var('b') 
ada0: 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20  THEN 'B' .      
adb0: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
adc0: 28 27 63 27 29 20 54 48 45 4e 20 27 43 27 0a 20  ('c') THEN 'C'. 
add0: 20 45 4e 44 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 62   END.} {null}.db
ade0: 20 6e 75 6c 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23   nullvalue {}..#
adf0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ae00: 31 33 39 34 33 2d 31 33 35 39 32 20 41 20 4e 55  13943-13592 A NU
ae10: 4c 4c 20 72 65 73 75 6c 74 20 69 73 20 63 6f 6e  LL result is con
ae20: 73 69 64 65 72 65 64 20 75 6e 74 72 75 65 20 77  sidered untrue w
ae30: 68 65 6e 0a 23 20 65 76 61 6c 75 61 74 69 6e 67  hen.# evaluating
ae40: 20 57 48 45 4e 20 74 65 72 6d 73 2e 0a 23 0a 64   WHEN terms..#.d
ae50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
ae60: 5f 65 78 70 72 2d 32 31 2e 34 2e 31 20 7b 0a 20  _expr-21.4.1 {. 
ae70: 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
ae80: 4e 20 4e 55 4c 4c 20 54 48 45 4e 20 27 41 27 20  N NULL THEN 'A' 
ae90: 57 48 45 4e 20 31 20 54 48 45 4e 20 27 42 27 20  WHEN 1 THEN 'B' 
aea0: 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65  END.} {B}.do_exe
aeb0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
aec0: 2d 32 31 2e 34 2e 32 20 7b 0a 20 20 53 45 4c 45  -21.4.2 {.  SELE
aed0: 43 54 20 43 41 53 45 20 57 48 45 4e 20 30 20 54  CT CASE WHEN 0 T
aee0: 48 45 4e 20 27 41 27 20 57 48 45 4e 20 4e 55 4c  HEN 'A' WHEN NUL
aef0: 4c 20 54 48 45 4e 20 27 42 27 20 45 4c 53 45 20  L THEN 'B' ELSE 
af00: 27 43 27 20 45 4e 44 0a 7d 20 7b 43 7d 0a 0a 23  'C' END.} {C}..#
af10: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
af20: 33 38 36 32 30 2d 31 39 34 39 39 20 49 6e 20 61  38620-19499 In a
af30: 20 43 41 53 45 20 77 69 74 68 20 61 20 62 61 73   CASE with a bas
af40: 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  e expression, th
af50: 65 20 62 61 73 65 0a 23 20 65 78 70 72 65 73 73  e base.# express
af60: 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64  ion is evaluated
af70: 20 6a 75 73 74 20 6f 6e 63 65 20 61 6e 64 20 74   just once and t
af80: 68 65 20 72 65 73 75 6c 74 20 69 73 20 63 6f 6d  he result is com
af90: 70 61 72 65 64 20 61 67 61 69 6e 73 74 0a 23 20  pared against.# 
afa0: 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f  the evaluation o
afb0: 66 20 65 61 63 68 20 57 48 45 4e 20 65 78 70 72  f each WHEN expr
afc0: 65 73 73 69 6f 6e 20 66 72 6f 6d 20 6c 65 66 74  ession from left
afd0: 20 74 6f 20 72 69 67 68 74 2e 0a 23 0a 23 20 4e   to right..#.# N
afe0: 6f 74 65 3a 20 54 68 69 73 20 74 65 73 74 20 63  ote: This test c
aff0: 61 73 65 20 74 65 73 74 73 20 74 68 65 20 22 65  ase tests the "e
b000: 76 61 6c 75 61 74 65 64 20 6a 75 73 74 20 6f 6e  valuated just on
b010: 63 65 22 20 70 61 72 74 20 6f 66 20 74 68 65 20  ce" part of the 
b020: 61 62 6f 76 65 0a 23 20 73 74 61 74 65 6d 65 6e  above.# statemen
b030: 74 2e 20 54 65 73 74 73 20 61 73 73 6f 63 69 61  t. Tests associa
b040: 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 65 78  ted with the nex
b050: 74 20 74 77 6f 20 73 74 61 74 65 6d 65 6e 74 73  t two statements
b060: 20 74 65 73 74 20 74 68 61 74 20 74 68 65 0a 23   test that the.#
b070: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 74 61 6b   comparisons tak
b080: 65 20 70 6c 61 63 65 2e 0a 23 0a 66 6f 72 65 61  e place..#.forea
b090: 63 68 20 7b 61 20 62 20 63 7d 20 5b 6c 69 73 74  ch {a b c} [list
b0a0: 20 5b 65 78 70 72 20 33 5d 20 5b 65 78 70 72 20   [expr 3] [expr 
b0b0: 34 5d 20 5b 65 78 70 72 20 35 5d 5d 20 62 72 65  4] [expr 5]] bre
b0c0: 61 6b 0a 73 65 74 20 3a 3a 76 61 72 6c 69 73 74  ak.set ::varlist
b0d0: 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73   [list].do_execs
b0e0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
b0f0: 32 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  2.1.1 {.  SELECT
b100: 20 43 41 53 45 20 76 61 72 28 27 61 27 29 20 57   CASE var('a') W
b110: 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57  HEN 1 THEN 'A' W
b120: 48 45 4e 20 32 20 54 48 45 4e 20 27 42 27 20 57  HEN 2 THEN 'B' W
b130: 48 45 4e 20 33 20 54 48 45 4e 20 27 43 27 20 45  HEN 3 THEN 'C' E
b140: 4e 44 0a 7d 20 7b 43 7d 0a 64 6f 5f 74 65 73 74  ND.} {C}.do_test
b150: 20 65 5f 65 78 70 72 2d 32 32 2e 31 2e 32 20 7b   e_expr-22.1.2 {
b160: 20 73 65 74 20 3a 3a 76 61 72 6c 69 73 74 20 7d   set ::varlist }
b170: 20 7b 61 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45   {a}..# EVIDENCE
b180: 2d 4f 46 3a 20 52 2d 30 37 36 36 37 2d 34 39 35  -OF: R-07667-495
b190: 33 37 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  37 The result of
b1a0: 20 74 68 65 20 43 41 53 45 20 65 78 70 72 65 73   the CASE expres
b1b0: 73 69 6f 6e 20 69 73 20 74 68 65 0a 23 20 65 76  sion is the.# ev
b1c0: 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  aluation of the 
b1d0: 54 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  THEN expression 
b1e0: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
b1f0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 57 48   to the first WH
b200: 45 4e 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20  EN.# expression 
b210: 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 63 6f  for which the co
b220: 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 72 75 65  mparison is true
b230: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
b240: 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 32 2e  est e_expr-22.2.
b250: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  1 {.  SELECT CAS
b260: 45 20 32 33 20 57 48 45 4e 20 31 20 54 48 45 4e  E 23 WHEN 1 THEN
b270: 20 27 41 27 20 57 48 45 4e 20 32 33 20 54 48 45   'A' WHEN 23 THE
b280: 4e 20 27 42 27 20 57 48 45 4e 20 32 33 20 54 48  N 'B' WHEN 23 TH
b290: 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20 7b 42 7d  EN 'C' END.} {B}
b2a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
b2b0: 20 65 5f 65 78 70 72 2d 32 32 2e 32 2e 32 20 7b   e_expr-22.2.2 {
b2c0: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 31  .  SELECT CASE 1
b2d0: 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27   WHEN 1 THEN 'A'
b2e0: 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42   WHEN 23 THEN 'B
b2f0: 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27  ' WHEN 23 THEN '
b300: 43 27 20 45 4e 44 0a 7d 20 7b 41 7d 0a 0a 23 20  C' END.} {A}..# 
b310: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
b320: 37 35 34 33 2d 33 32 31 34 35 20 4f 72 2c 20 69  7543-32145 Or, i
b330: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 57 48  f none of the WH
b340: 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 23  EN expressions.#
b350: 20 65 76 61 6c 75 61 74 65 20 74 6f 20 61 20 76   evaluate to a v
b360: 61 6c 75 65 20 65 71 75 61 6c 20 74 6f 20 74 68  alue equal to th
b370: 65 20 62 61 73 65 20 65 78 70 72 65 73 73 69 6f  e base expressio
b380: 6e 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  n, the result of
b390: 0a 23 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68  .# evaluating th
b3a0: 65 20 45 4c 53 45 20 65 78 70 72 65 73 73 69 6f  e ELSE expressio
b3b0: 6e 2c 20 69 66 20 61 6e 79 2e 0a 23 0a 64 6f 5f  n, if any..#.do_
b3c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
b3d0: 78 70 72 2d 32 32 2e 33 2e 31 20 7b 0a 20 20 53  xpr-22.3.1 {.  S
b3e0: 45 4c 45 43 54 20 43 41 53 45 20 32 34 20 57 48  ELECT CASE 24 WH
b3f0: 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57 48  EN 1 THEN 'A' WH
b400: 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20 57  EN 23 THEN 'B' W
b410: 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27 20  HEN 23 THEN 'C' 
b420: 45 4c 53 45 20 27 44 27 20 45 4e 44 0a 7d 20 7b  ELSE 'D' END.} {
b430: 44 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  D}..# EVIDENCE-O
b440: 46 3a 20 52 2d 35 34 37 32 31 2d 34 38 35 35 37  F: R-54721-48557
b450: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
b460: 45 4c 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20  ELSE expression 
b470: 61 6e 64 20 6e 6f 6e 65 20 6f 66 0a 23 20 74 68  and none of.# th
b480: 65 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f  e WHEN expressio
b490: 6e 73 20 70 72 6f 64 75 63 65 20 61 20 72 65 73  ns produce a res
b4a0: 75 6c 74 20 65 71 75 61 6c 20 74 6f 20 74 68 65  ult equal to the
b4b0: 20 62 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e   base expression
b4c0: 2c 0a 23 20 74 68 65 20 6f 76 65 72 61 6c 6c 20  ,.# the overall 
b4d0: 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a  result is NULL..
b4e0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
b4f0: 74 20 65 5f 65 78 70 72 2d 32 32 2e 34 2e 31 20  t e_expr-22.4.1 
b500: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
b510: 32 34 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27  24 WHEN 1 THEN '
b520: 41 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20  A' WHEN 23 THEN 
b530: 27 42 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e  'B' WHEN 23 THEN
b540: 20 27 43 27 20 45 4e 44 0a 7d 20 7b 7b 7d 7d 0a   'C' END.} {{}}.
b550: 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 6e 75 6c  db nullvalue nul
b560: 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l.do_execsql_tes
b570: 74 20 65 5f 65 78 70 72 2d 32 32 2e 34 2e 32 20  t e_expr-22.4.2 
b580: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
b590: 32 34 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27  24 WHEN 1 THEN '
b5a0: 41 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20  A' WHEN 23 THEN 
b5b0: 27 42 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e  'B' WHEN 23 THEN
b5c0: 20 27 43 27 20 45 4e 44 0a 7d 20 7b 6e 75 6c 6c   'C' END.} {null
b5d0: 7d 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 7b  }.db nullvalue {
b5e0: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
b5f0: 3a 20 52 2d 31 31 34 37 39 2d 36 32 37 37 34 20  : R-11479-62774 
b600: 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 61  When comparing a
b610: 20 62 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e   base expression
b620: 20 61 67 61 69 6e 73 74 20 61 0a 23 20 57 48 45   against a.# WHE
b630: 4e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  N expression, th
b640: 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
b650: 20 73 65 71 75 65 6e 63 65 2c 20 61 66 66 69 6e   sequence, affin
b660: 69 74 79 2c 20 61 6e 64 0a 23 20 4e 55 4c 4c 2d  ity, and.# NULL-
b670: 68 61 6e 64 6c 69 6e 67 20 72 75 6c 65 73 20 61  handling rules a
b680: 70 70 6c 79 20 61 73 20 69 66 20 74 68 65 20 62  pply as if the b
b690: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  ase expression a
b6a0: 6e 64 20 57 48 45 4e 0a 23 20 65 78 70 72 65 73  nd WHEN.# expres
b6b0: 73 69 6f 6e 20 61 72 65 20 72 65 73 70 65 63 74  sion are respect
b6c0: 69 76 65 6c 79 20 74 68 65 20 6c 65 66 74 2d 20  ively the left- 
b6d0: 61 6e 64 20 72 69 67 68 74 2d 68 61 6e 64 20 6f  and right-hand o
b6e0: 70 65 72 61 6e 64 73 20 6f 66 20 61 6e 20 3d 0a  perands of an =.
b6f0: 23 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 70 72  # operator..#.pr
b700: 6f 63 20 72 65 76 20 7b 73 74 72 7d 20 7b 0a 20  oc rev {str} {. 
b710: 20 73 65 74 20 72 65 74 20 22 22 0a 20 20 73 65   set ret "".  se
b720: 74 20 63 68 61 72 73 20 5b 73 70 6c 69 74 20 24  t chars [split $
b730: 73 74 72 5d 0a 20 20 66 6f 72 20 7b 73 65 74 20  str].  for {set 
b740: 69 20 5b 65 78 70 72 20 5b 6c 6c 65 6e 67 74 68  i [expr [llength
b750: 20 24 63 68 61 72 73 5d 2d 31 5d 7d 20 7b 24 69   $chars]-1]} {$i
b760: 3e 3d 30 7d 20 7b 69 6e 63 72 20 69 20 2d 31 7d  >=0} {incr i -1}
b770: 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20 72 65   {.    append re
b780: 74 20 5b 6c 69 6e 64 65 78 20 24 63 68 61 72 73  t [lindex $chars
b790: 20 24 69 5d 0a 20 20 7d 0a 20 20 73 65 74 20 72   $i].  }.  set r
b7a0: 65 74 0a 7d 0a 70 72 6f 63 20 72 65 76 65 72 73  et.}.proc revers
b7b0: 65 20 7b 6c 68 73 20 72 68 73 7d 20 7b 0a 20 20  e {lhs rhs} {.  
b7c0: 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65 20 5b  string compare [
b7d0: 72 65 76 20 24 6c 68 73 5d 20 5b 72 65 76 20 24  rev $lhs] [rev $
b7e0: 72 68 73 5d 0a 7d 0a 64 62 20 63 6f 6c 6c 61 74  rhs].}.db collat
b7f0: 65 20 72 65 76 65 72 73 65 20 72 65 76 65 72 73  e reverse revers
b800: 65 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  e.do_execsql_tes
b810: 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 31 20  t e_expr-23.1.1 
b820: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
b830: 20 74 31 28 0a 20 20 20 20 61 20 54 45 58 54 20   t1(.    a TEXT 
b840: 20 20 20 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41      COLLATE NOCA
b850: 53 45 2c 0a 20 20 20 20 62 20 20 20 20 20 20 20  SE,.    b       
b860: 20 20 20 43 4f 4c 4c 41 54 45 20 52 45 56 45 52     COLLATE REVER
b870: 53 45 2c 0a 20 20 20 20 63 20 49 4e 54 45 47 45  SE,.    c INTEGE
b880: 52 2c 0a 20 20 20 20 64 20 42 4c 4f 42 0a 20 20  R,.    d BLOB.  
b890: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
b8a0: 20 74 31 20 56 41 4c 55 45 53 28 27 61 62 63 27   t1 VALUES('abc'
b8b0: 2c 20 27 63 62 61 27 2c 20 35 35 2c 20 33 34 2e  , 'cba', 55, 34.
b8c0: 35 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63  5);.} {}.do_exec
b8d0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
b8e0: 32 33 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43  23.1.2 {.  SELEC
b8f0: 54 20 43 41 53 45 20 61 20 57 48 45 4e 20 27 78  T CASE a WHEN 'x
b900: 79 7a 27 20 54 48 45 4e 20 27 41 27 20 57 48 45  yz' THEN 'A' WHE
b910: 4e 20 27 41 62 43 27 20 54 48 45 4e 20 27 42 27  N 'AbC' THEN 'B'
b920: 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b   END FROM t1.} {
b930: 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  B}.do_execsql_te
b940: 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 33  st e_expr-23.1.3
b950: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
b960: 20 27 41 62 43 27 20 57 48 45 4e 20 27 61 62 63   'AbC' WHEN 'abc
b970: 27 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20  ' THEN 'A' WHEN 
b980: 61 20 54 48 45 4e 20 27 42 27 20 45 4e 44 20 46  a THEN 'B' END F
b990: 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f  ROM t1.} {B}.do_
b9a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
b9b0: 78 70 72 2d 32 33 2e 31 2e 34 20 7b 0a 20 20 53  xpr-23.1.4 {.  S
b9c0: 45 4c 45 43 54 20 43 41 53 45 20 61 20 57 48 45  ELECT CASE a WHE
b9d0: 4e 20 62 20 54 48 45 4e 20 27 41 27 20 45 4c 53  N b THEN 'A' ELS
b9e0: 45 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20 74  E 'B' END FROM t
b9f0: 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73  1.} {B}.do_execs
ba00: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
ba10: 33 2e 31 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54  3.1.5 {.  SELECT
ba20: 20 43 41 53 45 20 62 20 57 48 45 4e 20 61 20 54   CASE b WHEN a T
ba30: 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42 27  HEN 'A' ELSE 'B'
ba40: 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b   END FROM t1.} {
ba50: 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  B}.do_execsql_te
ba60: 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 36  st e_expr-23.1.6
ba70: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
ba80: 20 35 35 20 57 48 45 4e 20 27 35 35 27 20 54 48   55 WHEN '55' TH
ba90: 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42 27 20  EN 'A' ELSE 'B' 
baa0: 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65  END.} {B}.do_exe
bab0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
bac0: 2d 32 33 2e 31 2e 37 20 7b 0a 20 20 53 45 4c 45  -23.1.7 {.  SELE
bad0: 43 54 20 43 41 53 45 20 63 20 57 48 45 4e 20 27  CT CASE c WHEN '
bae0: 35 35 27 20 54 48 45 4e 20 27 41 27 20 45 4c 53  55' THEN 'A' ELS
baf0: 45 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20 74  E 'B' END FROM t
bb00: 31 0a 7d 20 7b 41 7d 0a 64 6f 5f 65 78 65 63 73  1.} {A}.do_execs
bb10: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
bb20: 33 2e 31 2e 38 20 7b 0a 20 20 53 45 4c 45 43 54  3.1.8 {.  SELECT
bb30: 20 43 41 53 45 20 27 33 34 2e 35 27 20 57 48 45   CASE '34.5' WHE
bb40: 4e 20 64 20 54 48 45 4e 20 27 41 27 20 45 4c 53  N d THEN 'A' ELS
bb50: 45 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20 74  E 'B' END FROM t
bb60: 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73  1.} {B}.do_execs
bb70: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
bb80: 33 2e 31 2e 39 20 7b 0a 20 20 53 45 4c 45 43 54  3.1.9 {.  SELECT
bb90: 20 43 41 53 45 20 4e 55 4c 4c 20 57 48 45 4e 20   CASE NULL WHEN 
bba0: 4e 55 4c 4c 20 54 48 45 4e 20 27 41 27 20 45 4c  NULL THEN 'A' EL
bbb0: 53 45 20 27 42 27 20 45 4e 44 0a 7d 20 7b 42 7d  SE 'B' END.} {B}
bbc0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
bbd0: 20 52 2d 33 37 33 30 34 2d 33 39 34 30 35 20 49   R-37304-39405 I
bbe0: 66 20 74 68 65 20 62 61 73 65 20 65 78 70 72 65  f the base expre
bbf0: 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 20 74 68  ssion is NULL th
bc00: 65 6e 20 74 68 65 0a 23 20 72 65 73 75 6c 74 20  en the.# result 
bc10: 6f 66 20 74 68 65 20 43 41 53 45 20 69 73 20 61  of the CASE is a
bc20: 6c 77 61 79 73 20 74 68 65 20 72 65 73 75 6c 74  lways the result
bc30: 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20 74   of evaluating t
bc40: 68 65 20 45 4c 53 45 0a 23 20 65 78 70 72 65 73  he ELSE.# expres
bc50: 73 69 6f 6e 20 69 66 20 69 74 20 65 78 69 73 74  sion if it exist
bc60: 73 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 69 74  s, or NULL if it
bc70: 20 64 6f 65 73 20 6e 6f 74 2e 0a 23 0a 64 6f 5f   does not..#.do_
bc80: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
bc90: 78 70 72 2d 32 34 2e 31 2e 31 20 7b 0a 20 20 53  xpr-24.1.1 {.  S
bca0: 45 4c 45 43 54 20 43 41 53 45 20 4e 55 4c 4c 20  ELECT CASE NULL 
bcb0: 57 48 45 4e 20 27 61 62 63 27 20 54 48 45 4e 20  WHEN 'abc' THEN 
bcc0: 27 41 27 20 57 48 45 4e 20 27 64 65 66 27 20 54  'A' WHEN 'def' T
bcd0: 48 45 4e 20 27 42 27 20 45 4e 44 3b 0a 7d 20 7b  HEN 'B' END;.} {
bce0: 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}}.do_execsql_t
bcf0: 65 73 74 20 65 5f 65 78 70 72 2d 32 34 2e 31 2e  est e_expr-24.1.
bd00: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  2 {.  SELECT CAS
bd10: 45 20 4e 55 4c 4c 20 57 48 45 4e 20 27 61 62 63  E NULL WHEN 'abc
bd20: 27 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20  ' THEN 'A' WHEN 
bd30: 27 64 65 66 27 20 54 48 45 4e 20 27 42 27 20 45  'def' THEN 'B' E
bd40: 4c 53 45 20 27 43 27 20 45 4e 44 3b 0a 7d 20 7b  LSE 'C' END;.} {
bd50: 43 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  C}..# EVIDENCE-O
bd60: 46 3a 20 52 2d 35 36 32 38 30 2d 31 37 33 36 39  F: R-56280-17369
bd70: 20 42 6f 74 68 20 66 6f 72 6d 73 20 6f 66 20 74   Both forms of t
bd80: 68 65 20 43 41 53 45 20 65 78 70 72 65 73 73 69  he CASE expressi
bd90: 6f 6e 20 75 73 65 20 6c 61 7a 79 2c 0a 23 20 6f  on use lazy,.# o
bda0: 72 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74 2c  r short-circuit,
bdb0: 20 65 76 61 6c 75 61 74 69 6f 6e 2e 0a 23 0a 73   evaluation..#.s
bdc0: 65 74 20 76 61 72 6c 69 73 74 20 5b 6c 69 73 74  et varlist [list
bdd0: 5d 0a 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63  ].foreach {a b c
bde0: 7d 20 7b 30 20 31 20 30 7d 20 62 72 65 61 6b 0a  } {0 1 0} break.
bdf0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
be00: 65 5f 65 78 70 72 2d 32 35 2e 31 2e 31 20 7b 0a  e_expr-25.1.1 {.
be10: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48    SELECT CASE WH
be20: 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e  EN var('a') THEN
be30: 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20   'A' .          
be40: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62 27      WHEN var('b'
be50: 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20  ) THEN 'B' .    
be60: 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76            WHEN v
be70: 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43 27  ar('c') THEN 'C'
be80: 20 0a 20 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f   .  END.} {B}.do
be90: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 35 2e  _test e_expr-25.
bea0: 31 2e 32 20 7b 20 73 65 74 20 3a 3a 76 61 72 6c  1.2 { set ::varl
beb0: 69 73 74 20 7d 20 7b 61 20 62 7d 0a 73 65 74 20  ist } {a b}.set 
bec0: 76 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 64  varlist [list].d
bed0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
bee0: 5f 65 78 70 72 2d 32 35 2e 31 2e 33 20 7b 0a 20  _expr-25.1.3 {. 
bef0: 20 53 45 4c 45 43 54 20 43 41 53 45 20 27 30 27   SELECT CASE '0'
bf00: 20 57 48 45 4e 20 76 61 72 28 27 61 27 29 20 54   WHEN var('a') T
bf10: 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20  HEN 'A' .       
bf20: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
bf30: 76 61 72 28 27 62 27 29 20 54 48 45 4e 20 27 42  var('b') THEN 'B
bf40: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
bf50: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63       WHEN var('c
bf60: 27 29 20 54 48 45 4e 20 27 43 27 20 0a 20 20 45  ') THEN 'C' .  E
bf70: 4e 44 0a 7d 20 7b 41 7d 0a 64 6f 5f 74 65 73 74  ND.} {A}.do_test
bf80: 20 65 5f 65 78 70 72 2d 32 35 2e 31 2e 34 20 7b   e_expr-25.1.4 {
bf90: 20 73 65 74 20 3a 3a 76 61 72 6c 69 73 74 20 7d   set ::varlist }
bfa0: 20 7b 61 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45   {a}..# EVIDENCE
bfb0: 2d 4f 46 3a 20 52 2d 33 34 37 37 33 2d 36 32 32  -OF: R-34773-622
bfc0: 35 33 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66  53 The only diff
bfd0: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
bfe0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 23 20 74  he following.# t
bff0: 77 6f 20 43 41 53 45 20 65 78 70 72 65 73 73 69  wo CASE expressi
c000: 6f 6e 73 20 69 73 20 74 68 61 74 20 74 68 65 20  ons is that the 
c010: 78 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  x expression is 
c020: 65 76 61 6c 75 61 74 65 64 20 65 78 61 63 74 6c  evaluated exactl
c030: 79 0a 23 20 6f 6e 63 65 20 69 6e 20 74 68 65 20  y.# once in the 
c040: 66 69 72 73 74 20 65 78 61 6d 70 6c 65 20 62 75  first example bu
c050: 74 20 6d 69 67 68 74 20 62 65 20 65 76 61 6c 75  t might be evalu
c060: 61 74 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  ated multiple ti
c070: 6d 65 73 20 69 6e 20 74 68 65 0a 23 20 73 65 63  mes in the.# sec
c080: 6f 6e 64 3a 20 43 41 53 45 20 78 20 57 48 45 4e  ond: CASE x WHEN
c090: 20 77 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   w1 THEN r1 WHEN
c0a0: 20 77 32 20 54 48 45 4e 20 72 32 20 45 4c 53 45   w2 THEN r2 ELSE
c0b0: 20 72 33 20 45 4e 44 20 43 41 53 45 20 57 48 45   r3 END CASE WHE
c0c0: 4e 0a 23 20 78 3d 77 31 20 54 48 45 4e 20 72 31  N.# x=w1 THEN r1
c0d0: 20 57 48 45 4e 20 78 3d 77 32 20 54 48 45 4e 20   WHEN x=w2 THEN 
c0e0: 72 32 20 45 4c 53 45 20 72 33 20 45 4e 44 0a 23  r2 ELSE r3 END.#
c0f0: 0a 70 72 6f 63 20 63 65 76 61 6c 20 7b 78 7d 20  .proc ceval {x} 
c100: 7b 0a 20 20 69 6e 63 72 20 3a 3a 65 76 61 6c 63  {.  incr ::evalc
c110: 6f 75 6e 74 0a 20 20 72 65 74 75 72 6e 20 24 78  ount.  return $x
c120: 0a 7d 0a 64 62 20 66 75 6e 63 20 63 65 76 61 6c  .}.db func ceval
c130: 20 63 65 76 61 6c 0a 73 65 74 20 3a 3a 65 76 61   ceval.set ::eva
c140: 6c 63 6f 75 6e 74 20 30 0a 0a 64 6f 5f 65 78 65  lcount 0..do_exe
c150: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
c160: 2d 32 36 2e 31 2e 31 20 7b 0a 20 20 43 52 45 41  -26.1.1 {.  CREA
c170: 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c 20 77  TE TABLE t2(x, w
c180: 31 2c 20 72 31 2c 20 77 32 2c 20 72 32 2c 20 72  1, r1, w2, r2, r
c190: 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  3);.  INSERT INT
c1a0: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 31  O t2 VALUES(1, 1
c1b0: 2c 20 27 52 31 27 2c 20 32 2c 20 27 52 32 27 2c  , 'R1', 2, 'R2',
c1c0: 20 27 52 33 27 29 3b 0a 20 20 49 4e 53 45 52 54   'R3');.  INSERT
c1d0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
c1e0: 32 2c 20 31 2c 20 27 52 31 27 2c 20 32 2c 20 27  2, 1, 'R1', 2, '
c1f0: 52 32 27 2c 20 27 52 33 27 29 3b 0a 20 20 49 4e  R2', 'R3');.  IN
c200: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
c210: 55 45 53 28 33 2c 20 31 2c 20 27 52 31 27 2c 20  UES(3, 1, 'R1', 
c220: 32 2c 20 27 52 32 27 2c 20 27 52 33 27 29 3b 0a  2, 'R2', 'R3');.
c230: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
c240: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e 31  test e_expr-26.1
c250: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .2 {.  SELECT CA
c260: 53 45 20 78 20 57 48 45 4e 20 77 31 20 54 48 45  SE x WHEN w1 THE
c270: 4e 20 72 31 20 57 48 45 4e 20 77 32 20 54 48 45  N r1 WHEN w2 THE
c280: 4e 20 72 32 20 45 4c 53 45 20 72 33 20 45 4e 44  N r2 ELSE r3 END
c290: 20 46 52 4f 4d 20 74 32 0a 7d 20 7b 52 31 20 52   FROM t2.} {R1 R
c2a0: 32 20 52 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  2 R3}.do_execsql
c2b0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e  _test e_expr-26.
c2c0: 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.3 {.  SELECT C
c2d0: 41 53 45 20 57 48 45 4e 20 78 3d 77 31 20 54 48  ASE WHEN x=w1 TH
c2e0: 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 77 32 20  EN r1 WHEN x=w2 
c2f0: 54 48 45 4e 20 72 32 20 45 4c 53 45 20 72 33 20  THEN r2 ELSE r3 
c300: 45 4e 44 20 46 52 4f 4d 20 74 32 0a 7d 20 7b 52  END FROM t2.} {R
c310: 31 20 52 32 20 52 33 7d 0a 0a 64 6f 5f 65 78 65  1 R2 R3}..do_exe
c320: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
c330: 2d 32 36 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45  -26.1.4 {.  SELE
c340: 43 54 20 43 41 53 45 20 63 65 76 61 6c 28 78 29  CT CASE ceval(x)
c350: 20 57 48 45 4e 20 77 31 20 54 48 45 4e 20 72 31   WHEN w1 THEN r1
c360: 20 57 48 45 4e 20 77 32 20 54 48 45 4e 20 72 32   WHEN w2 THEN r2
c370: 20 45 4c 53 45 20 72 33 20 45 4e 44 20 46 52 4f   ELSE r3 END FRO
c380: 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32 20 52 33  M t2.} {R1 R2 R3
c390: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72  }.do_test e_expr
c3a0: 2d 32 36 2e 31 2e 35 20 7b 20 73 65 74 20 3a 3a  -26.1.5 { set ::
c3b0: 65 76 61 6c 63 6f 75 6e 74 20 7d 20 7b 33 7d 0a  evalcount } {3}.
c3c0: 73 65 74 20 3a 3a 65 76 61 6c 63 6f 75 6e 74 20  set ::evalcount 
c3d0: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
c3e0: 74 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 36 20  t e_expr-26.1.6 
c3f0: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
c400: 0a 20 20 20 20 57 48 45 4e 20 63 65 76 61 6c 28  .    WHEN ceval(
c410: 78 29 3d 77 31 20 54 48 45 4e 20 72 31 20 0a 20  x)=w1 THEN r1 . 
c420: 20 20 20 57 48 45 4e 20 63 65 76 61 6c 28 78 29     WHEN ceval(x)
c430: 3d 77 32 20 54 48 45 4e 20 72 32 20 0a 20 20 20  =w2 THEN r2 .   
c440: 20 45 4c 53 45 20 72 33 20 45 4e 44 20 0a 20 20   ELSE r3 END .  
c450: 46 52 4f 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32  FROM t2.} {R1 R2
c460: 20 52 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65   R3}.do_test e_e
c470: 78 70 72 2d 32 36 2e 31 2e 36 20 7b 20 73 65 74  xpr-26.1.6 { set
c480: 20 3a 3a 65 76 61 6c 63 6f 75 6e 74 20 7d 20 7b   ::evalcount } {
c490: 35 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  5}...#----------
c4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
c4e0: 23 20 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74  # Test statement
c4f0: 73 20 72 65 6c 61 74 65 64 20 74 6f 20 43 41 53  s related to CAS
c500: 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 23  T expressions..#
c510: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
c520: 52 2d 32 30 38 35 34 2d 31 37 31 30 39 20 41 20  R-20854-17109 A 
c530: 43 41 53 54 20 63 6f 6e 76 65 72 73 69 6f 6e 20  CAST conversion 
c540: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  is similar to th
c550: 65 0a 23 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74  e.# conversion t
c560: 68 61 74 20 74 61 6b 65 73 20 70 6c 61 63 65 20  hat takes place 
c570: 77 68 65 6e 20 61 20 63 6f 6c 75 6d 6e 20 61 66  when a column af
c580: 66 69 6e 69 74 79 20 69 73 20 61 70 70 6c 69 65  finity is applie
c590: 64 20 74 6f 20 61 0a 23 20 76 61 6c 75 65 20 65  d to a.# value e
c5a0: 78 63 65 70 74 20 74 68 61 74 20 77 69 74 68 20  xcept that with 
c5b0: 74 68 65 20 43 41 53 54 20 6f 70 65 72 61 74 6f  the CAST operato
c5c0: 72 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  r the conversion
c5d0: 20 61 6c 77 61 79 73 20 74 61 6b 65 73 0a 23 20   always takes.# 
c5e0: 70 6c 61 63 65 20 65 76 65 6e 20 69 66 20 74 68  place even if th
c5f0: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 6c 6f 73  e conversion los
c600: 73 79 20 61 6e 64 20 69 72 72 65 76 65 72 73 69  sy and irreversi
c610: 62 6c 65 2c 20 77 68 65 72 65 61 73 20 63 6f 6c  ble, whereas col
c620: 75 6d 6e 0a 23 20 61 66 66 69 6e 69 74 79 20 6f  umn.# affinity o
c630: 6e 6c 79 20 63 68 61 6e 67 65 73 20 74 68 65 20  nly changes the 
c640: 64 61 74 61 20 74 79 70 65 20 6f 66 20 61 20 76  data type of a v
c650: 61 6c 75 65 20 69 66 20 74 68 65 20 63 68 61 6e  alue if the chan
c660: 67 65 20 69 73 0a 23 20 6c 6f 73 73 6c 65 73 73  ge is.# lossless
c670: 20 61 6e 64 20 72 65 76 65 72 73 69 62 6c 65 2e   and reversible.
c680: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
c690: 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 31 2e 31  st e_expr-27.1.1
c6a0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
c6b0: 45 20 74 33 28 61 20 54 45 58 54 2c 20 62 20 52  E t3(a TEXT, b R
c6c0: 45 41 4c 2c 20 63 20 49 4e 54 45 47 45 52 29 3b  EAL, c INTEGER);
c6d0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
c6e0: 33 20 56 41 4c 55 45 53 28 58 27 35 35 35 36 35  3 VALUES(X'55565
c6f0: 35 27 2c 20 27 31 2e 32 33 61 62 63 27 2c 20 34  5', '1.23abc', 4
c700: 2e 35 29 3b 0a 20 20 53 45 4c 45 43 54 20 74 79  .5);.  SELECT ty
c710: 70 65 6f 66 28 61 29 2c 20 61 2c 20 74 79 70 65  peof(a), a, type
c720: 6f 66 28 62 29 2c 20 62 2c 20 74 79 70 65 6f 66  of(b), b, typeof
c730: 28 63 29 2c 20 63 20 46 52 4f 4d 20 74 33 3b 0a  (c), c FROM t3;.
c740: 7d 20 7b 62 6c 6f 62 20 55 56 55 20 74 65 78 74  } {blob UVU text
c750: 20 31 2e 32 33 61 62 63 20 72 65 61 6c 20 34 2e   1.23abc real 4.
c760: 35 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  5}.do_execsql_te
c770: 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 31 2e 32  st e_expr-27.1.2
c780: 20 7b 0a 20 20 53 45 4c 45 43 54 20 0a 20 20 20   {.  SELECT .   
c790: 20 74 79 70 65 6f 66 28 43 41 53 54 28 58 27 35   typeof(CAST(X'5
c7a0: 35 35 36 35 35 27 20 61 73 20 54 45 58 54 29 29  55655' as TEXT))
c7b0: 2c 20 43 41 53 54 28 58 27 35 35 35 36 35 35 27  , CAST(X'555655'
c7c0: 20 61 73 20 54 45 58 54 29 2c 0a 20 20 20 20 74   as TEXT),.    t
c7d0: 79 70 65 6f 66 28 43 41 53 54 28 27 31 2e 32 33  ypeof(CAST('1.23
c7e0: 61 62 63 27 20 61 73 20 52 45 41 4c 29 29 2c 20  abc' as REAL)), 
c7f0: 43 41 53 54 28 27 31 2e 32 33 61 62 63 27 20 61  CAST('1.23abc' a
c800: 73 20 52 45 41 4c 29 2c 0a 20 20 20 20 74 79 70  s REAL),.    typ
c810: 65 6f 66 28 43 41 53 54 28 34 2e 35 20 61 73 20  eof(CAST(4.5 as 
c820: 49 4e 54 45 47 45 52 29 29 2c 20 43 41 53 54 28  INTEGER)), CAST(
c830: 34 2e 35 20 61 73 20 49 4e 54 45 47 45 52 29 0a  4.5 as INTEGER).
c840: 7d 20 7b 74 65 78 74 20 55 56 55 20 72 65 61 6c  } {text UVU real
c850: 20 31 2e 32 33 20 69 6e 74 65 67 65 72 20 34 7d   1.23 integer 4}
c860: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
c870: 20 52 2d 32 37 32 32 35 2d 36 35 30 35 30 20 49   R-27225-65050 I
c880: 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 3c  f the value of <
c890: 65 78 70 72 3e 20 69 73 20 4e 55 4c 4c 2c 20 74  expr> is NULL, t
c8a0: 68 65 6e 0a 23 20 74 68 65 20 72 65 73 75 6c 74  hen.# the result
c8b0: 20 6f 66 20 74 68 65 20 43 41 53 54 20 65 78 70   of the CAST exp
c8c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ression is also 
c8d0: 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  NULL..#.do_expr_
c8e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 32  test e_expr-27.2
c8f0: 2e 31 20 7b 20 43 41 53 54 28 4e 55 4c 4c 20 41  .1 { CAST(NULL A
c900: 53 20 69 6e 74 65 67 65 72 29 20 7d 20 6e 75 6c  S integer) } nul
c910: 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73  l {}.do_expr_tes
c920: 74 20 65 5f 65 78 70 72 2d 32 37 2e 32 2e 32 20  t e_expr-27.2.2 
c930: 7b 20 43 41 53 54 28 4e 55 4c 4c 20 41 53 20 74  { CAST(NULL AS t
c940: 65 78 74 29 20 7d 20 20 20 20 6e 75 6c 6c 20 7b  ext) }    null {
c950: 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  }.do_expr_test e
c960: 5f 65 78 70 72 2d 32 37 2e 32 2e 33 20 7b 20 43  _expr-27.2.3 { C
c970: 41 53 54 28 4e 55 4c 4c 20 41 53 20 62 6c 6f 62  AST(NULL AS blob
c980: 29 20 7d 20 20 20 20 6e 75 6c 6c 20 7b 7d 0a 64  ) }    null {}.d
c990: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
c9a0: 70 72 2d 32 37 2e 32 2e 34 20 7b 20 43 41 53 54  pr-27.2.4 { CAST
c9b0: 28 4e 55 4c 4c 20 41 53 20 6e 75 6d 62 65 72 29  (NULL AS number)
c9c0: 20 7d 20 20 6e 75 6c 6c 20 7b 7d 0a 0a 23 20 45   }  null {}..# E
c9d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
c9e0: 30 37 36 2d 32 33 35 37 35 20 43 61 73 74 69 6e  076-23575 Castin
c9f0: 67 20 61 20 76 61 6c 75 65 20 74 6f 20 61 20 3c  g a value to a <
ca00: 74 79 70 65 2d 6e 61 6d 65 3e 20 77 69 74 68 0a  type-name> with.
ca10: 23 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 63 61  # no affinity ca
ca20: 75 73 65 73 20 74 68 65 20 76 61 6c 75 65 20 74  uses the value t
ca30: 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  o be converted i
ca40: 6e 74 6f 20 61 20 42 4c 4f 42 2e 0a 23 0a 64 6f  nto a BLOB..#.do
ca50: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
ca60: 72 2d 32 37 2e 33 2e 31 20 7b 20 43 41 53 54 28  r-27.3.1 { CAST(
ca70: 27 61 62 63 27 20 41 53 20 62 6c 6f 62 29 20 20  'abc' AS blob)  
ca80: 20 20 20 20 20 7d 20 62 6c 6f 62 20 61 62 63 0a       } blob abc.
ca90: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
caa0: 78 70 72 2d 32 37 2e 33 2e 32 20 7b 20 43 41 53  xpr-27.3.2 { CAS
cab0: 54 28 27 64 65 66 27 20 41 53 20 73 68 6f 62 62  T('def' AS shobb
cac0: 6c 6f 62 5f 78 29 20 7d 20 62 6c 6f 62 20 64 65  lob_x) } blob de
cad0: 66 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  f.do_expr_test e
cae0: 5f 65 78 70 72 2d 32 37 2e 33 2e 33 20 7b 20 43  _expr-27.3.3 { C
caf0: 41 53 54 28 27 67 68 69 27 20 41 53 20 61 62 62  AST('ghi' AS abb
cb00: 4c 4f 62 31 30 29 20 20 20 7d 20 62 6c 6f 62 20  LOb10)   } blob 
cb10: 67 68 69 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  ghi..# EVIDENCE-
cb20: 4f 46 3a 20 52 2d 32 32 39 35 36 2d 33 37 37 35  OF: R-22956-3775
cb30: 34 20 43 61 73 74 69 6e 67 20 74 6f 20 61 20 42  4 Casting to a B
cb40: 4c 4f 42 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  LOB consists of 
cb50: 66 69 72 73 74 20 63 61 73 74 69 6e 67 0a 23 20  first casting.# 
cb60: 74 68 65 20 76 61 6c 75 65 20 74 6f 20 54 45 58  the value to TEX
cb70: 54 20 69 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e  T in the encodin
cb80: 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
cb90: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 74 68  e connection, th
cba0: 65 6e 0a 23 20 69 6e 74 65 72 70 72 65 74 69 6e  en.# interpretin
cbb0: 67 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  g the resulting 
cbc0: 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 61 73  byte sequence as
cbd0: 20 61 20 42 4c 4f 42 20 69 6e 73 74 65 61 64 20   a BLOB instead 
cbe0: 6f 66 20 61 73 20 54 45 58 54 2e 0a 23 0a 64 6f  of as TEXT..#.do
cbf0: 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  _qexpr_test e_ex
cc00: 70 72 2d 32 37 2e 34 2e 31 20 7b 20 43 41 53 54  pr-27.4.1 { CAST
cc10: 28 27 67 68 69 27 20 41 53 20 62 6c 6f 62 29 20  ('ghi' AS blob) 
cc20: 7d 20 58 27 36 37 36 38 36 39 27 0a 64 6f 5f 71  } X'676869'.do_q
cc30: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
cc40: 2d 32 37 2e 34 2e 32 20 7b 20 43 41 53 54 28 34  -27.4.2 { CAST(4
cc50: 35 36 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 20  56 AS blob) }   
cc60: 58 27 33 34 33 35 33 36 27 0a 64 6f 5f 71 65 78  X'343536'.do_qex
cc70: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
cc80: 37 2e 34 2e 33 20 7b 20 43 41 53 54 28 31 2e 37  7.4.3 { CAST(1.7
cc90: 38 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 58 27  8 AS blob) }  X'
cca0: 33 31 32 45 33 37 33 38 27 0a 72 65 6e 61 6d 65  312E3738'.rename
ccb0: 20 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33 20   db db2.sqlite3 
ccc0: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 69 66 63 61  db :memory:.ifca
ccd0: 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a  pable {utf16} {.
cce0: 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  db eval { PRAGMA
ccf0: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66   encoding = 'utf
cd00: 2d 31 36 6c 65 27 20 7d 0a 64 6f 5f 71 65 78 70  -16le' }.do_qexp
cd10: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
cd20: 2e 34 2e 34 20 7b 20 43 41 53 54 28 27 67 68 69  .4.4 { CAST('ghi
cd30: 27 20 41 53 20 62 6c 6f 62 29 20 7d 20 58 27 36  ' AS blob) } X'6
cd40: 37 30 30 36 38 30 30 36 39 30 30 27 0a 64 6f 5f  70068006900'.do_
cd50: 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  qexpr_test e_exp
cd60: 72 2d 32 37 2e 34 2e 35 20 7b 20 43 41 53 54 28  r-27.4.5 { CAST(
cd70: 34 35 36 20 41 53 20 62 6c 6f 62 29 20 7d 20 20  456 AS blob) }  
cd80: 20 58 27 33 34 30 30 33 35 30 30 33 36 30 30 27   X'340035003600'
cd90: 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65  .do_qexpr_test e
cda0: 5f 65 78 70 72 2d 32 37 2e 34 2e 36 20 7b 20 43  _expr-27.4.6 { C
cdb0: 41 53 54 28 31 2e 37 38 20 41 53 20 62 6c 6f 62  AST(1.78 AS blob
cdc0: 29 20 7d 20 20 58 27 33 31 30 30 32 45 30 30 33  ) }  X'31002E003
cdd0: 37 30 30 33 38 30 30 27 0a 7d 0a 64 62 20 63 6c  7003800'.}.db cl
cde0: 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20 3a  ose.sqlite3 db :
cdf0: 6d 65 6d 6f 72 79 3a 0a 64 62 20 65 76 61 6c 20  memory:.db eval 
ce00: 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e  { PRAGMA encodin
ce10: 67 20 3d 20 27 75 74 66 2d 31 36 62 65 27 20 7d  g = 'utf-16be' }
ce20: 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66 31  .ifcapable {utf1
ce30: 36 7d 20 7b 0a 64 6f 5f 71 65 78 70 72 5f 74 65  6} {.do_qexpr_te
ce40: 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 37  st e_expr-27.4.7
ce50: 20 7b 20 43 41 53 54 28 27 67 68 69 27 20 41 53   { CAST('ghi' AS
ce60: 20 62 6c 6f 62 29 20 7d 20 58 27 30 30 36 37 30   blob) } X'00670
ce70: 30 36 38 30 30 36 39 27 0a 64 6f 5f 71 65 78 70  0680069'.do_qexp
ce80: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
ce90: 2e 34 2e 38 20 7b 20 43 41 53 54 28 34 35 36 20  .4.8 { CAST(456 
cea0: 41 53 20 62 6c 6f 62 29 20 7d 20 20 20 58 27 30  AS blob) }   X'0
ceb0: 30 33 34 30 30 33 35 30 30 33 36 27 0a 64 6f 5f  03400350036'.do_
cec0: 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  qexpr_test e_exp
ced0: 72 2d 32 37 2e 34 2e 39 20 7b 20 43 41 53 54 28  r-27.4.9 { CAST(
cee0: 31 2e 37 38 20 41 53 20 62 6c 6f 62 29 20 7d 20  1.78 AS blob) } 
cef0: 20 58 27 30 30 33 31 30 30 32 45 30 30 33 37 30   X'0031002E00370
cf00: 30 33 38 27 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a  038'.}.db close.
cf10: 72 65 6e 61 6d 65 20 64 62 32 20 64 62 0a 0a 23  rename db2 db..#
cf20: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cf30: 30 34 32 30 37 2d 33 37 39 38 31 20 54 6f 20 63  04207-37981 To c
cf40: 61 73 74 20 61 20 42 4c 4f 42 20 76 61 6c 75 65  ast a BLOB value
cf50: 20 74 6f 20 54 45 58 54 2c 20 74 68 65 20 73 65   to TEXT, the se
cf60: 71 75 65 6e 63 65 0a 23 20 6f 66 20 62 79 74 65  quence.# of byte
cf70: 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
cf80: 68 65 20 42 4c 4f 42 20 69 73 20 69 6e 74 65 72  he BLOB is inter
cf90: 70 72 65 74 65 64 20 61 73 20 74 65 78 74 20 65  preted as text e
cfa0: 6e 63 6f 64 65 64 20 75 73 69 6e 67 0a 23 20 74  ncoded using.# t
cfb0: 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f  he database enco
cfc0: 64 69 6e 67 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  ding..#.do_expr_
cfd0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 31  test e_expr-28.1
cfe0: 2e 31 20 7b 20 43 41 53 54 20 28 58 27 36 37 36  .1 { CAST (X'676
cff0: 38 36 39 27 20 41 53 20 74 65 78 74 29 20 7d 20  869' AS text) } 
d000: 74 65 78 74 20 67 68 69 0a 64 6f 5f 65 78 70 72  text ghi.do_expr
d010: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e  _test e_expr-28.
d020: 31 2e 32 20 7b 20 43 41 53 54 20 28 58 27 36 37  1.2 { CAST (X'67
d030: 30 30 36 38 30 30 36 39 30 30 27 20 41 53 20 74  0068006900' AS t
d040: 65 78 74 29 20 7d 20 74 65 78 74 20 67 0a 72 65  ext) } text g.re
d050: 6e 61 6d 65 20 64 62 20 64 62 32 0a 73 71 6c 69  name db db2.sqli
d060: 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a  te3 db :memory:.
d070: 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  db eval { PRAGMA
d080: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66   encoding = 'utf
d090: 2d 31 36 6c 65 27 20 7d 0a 69 66 63 61 70 61 62  -16le' }.ifcapab
d0a0: 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a 64 6f 5f  le {utf16} {.do_
d0b0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d0c0: 2d 32 38 2e 31 2e 33 20 7b 20 43 41 53 54 20 28  -28.1.3 { CAST (
d0d0: 58 27 36 37 36 38 36 39 27 20 41 53 20 74 65 78  X'676869' AS tex
d0e0: 74 29 20 3d 3d 20 27 67 68 69 27 20 7d 20 69 6e  t) == 'ghi' } in
d0f0: 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72 5f  teger 0.do_expr_
d100: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 31  test e_expr-28.1
d110: 2e 34 20 7b 20 43 41 53 54 20 28 58 27 36 37 30  .4 { CAST (X'670
d120: 30 36 38 30 30 36 39 30 30 27 20 41 53 20 74 65  068006900' AS te
d130: 78 74 29 20 7d 20 74 65 78 74 20 67 68 69 0a 7d  xt) } text ghi.}
d140: 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61 6d 65  .db close.rename
d150: 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49 44 45   db2 db..# EVIDE
d160: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 32 33 35 2d  NCE-OF: R-22235-
d170: 34 37 30 30 36 20 43 61 73 74 69 6e 67 20 61 6e  47006 Casting an
d180: 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41 4c   INTEGER or REAL
d190: 20 76 61 6c 75 65 20 69 6e 74 6f 20 54 45 58 54   value into TEXT
d1a0: 0a 23 20 72 65 6e 64 65 72 73 20 74 68 65 20 76  .# renders the v
d1b0: 61 6c 75 65 20 61 73 20 69 66 20 76 69 61 20 73  alue as if via s
d1c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
d1d0: 29 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  ) except that th
d1e0: 65 0a 23 20 72 65 73 75 6c 74 69 6e 67 20 54 45  e.# resulting TE
d1f0: 58 54 20 75 73 65 73 20 74 68 65 20 65 6e 63 6f  XT uses the enco
d200: 64 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ding of the data
d210: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
d220: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
d230: 65 5f 65 78 70 72 2d 32 38 2e 32 2e 31 20 7b 20  e_expr-28.2.1 { 
d240: 43 41 53 54 20 28 31 20 41 53 20 74 65 78 74 29  CAST (1 AS text)
d250: 20 20 20 7d 20 20 20 20 20 74 65 78 74 20 31 0a     }     text 1.
d260: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d270: 78 70 72 2d 32 38 2e 32 2e 32 20 7b 20 43 41 53  xpr-28.2.2 { CAS
d280: 54 20 28 34 35 20 41 53 20 74 65 78 74 29 20 20  T (45 AS text)  
d290: 7d 20 20 20 20 20 74 65 78 74 20 34 35 0a 64 6f  }     text 45.do
d2a0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d2b0: 72 2d 32 38 2e 32 2e 33 20 7b 20 43 41 53 54 20  r-28.2.3 { CAST 
d2c0: 28 2d 34 35 20 41 53 20 74 65 78 74 29 20 7d 20  (-45 AS text) } 
d2d0: 20 20 20 20 74 65 78 74 20 2d 34 35 0a 64 6f 5f      text -45.do_
d2e0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d2f0: 2d 32 38 2e 32 2e 34 20 7b 20 43 41 53 54 20 28  -28.2.4 { CAST (
d300: 38 2e 38 20 41 53 20 74 65 78 74 29 20 20 20 20  8.8 AS text)    
d310: 7d 20 20 74 65 78 74 20 38 2e 38 0a 64 6f 5f 65  }  text 8.8.do_e
d320: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
d330: 32 38 2e 32 2e 35 20 7b 20 43 41 53 54 20 28 32  28.2.5 { CAST (2
d340: 2e 33 65 2b 35 20 41 53 20 74 65 78 74 29 20 7d  .3e+5 AS text) }
d350: 20 20 74 65 78 74 20 32 33 30 30 30 30 2e 30 0a    text 230000.0.
d360: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d370: 78 70 72 2d 32 38 2e 32 2e 36 20 7b 20 43 41 53  xpr-28.2.6 { CAS
d380: 54 20 28 2d 32 2e 33 65 2d 35 20 41 53 20 74 65  T (-2.3e-5 AS te
d390: 78 74 29 20 7d 20 74 65 78 74 20 2d 32 2e 33 65  xt) } text -2.3e
d3a0: 2d 30 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  -05.do_expr_test
d3b0: 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 37 20 7b   e_expr-28.2.7 {
d3c0: 20 43 41 53 54 20 28 30 2e 30 20 41 53 20 74 65   CAST (0.0 AS te
d3d0: 78 74 29 20 7d 20 20 20 20 20 74 65 78 74 20 30  xt) }     text 0
d3e0: 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .0.do_expr_test 
d3f0: 65 5f 65 78 70 72 2d 32 38 2e 32 2e 37 20 7b 20  e_expr-28.2.7 { 
d400: 43 41 53 54 20 28 30 20 41 53 20 74 65 78 74 29  CAST (0 AS text)
d410: 20 7d 20 20 20 20 20 20 20 74 65 78 74 20 30 0a   }       text 0.
d420: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
d430: 52 2d 32 36 33 34 36 2d 33 36 34 34 33 20 57 68  R-26346-36443 Wh
d440: 65 6e 20 63 61 73 74 69 6e 67 20 61 20 42 4c 4f  en casting a BLO
d450: 42 20 76 61 6c 75 65 20 74 6f 20 61 20 52 45 41  B value to a REA
d460: 4c 2c 20 74 68 65 0a 23 20 76 61 6c 75 65 20 69  L, the.# value i
d470: 73 20 66 69 72 73 74 20 63 6f 6e 76 65 72 74 65  s first converte
d480: 64 20 74 6f 20 54 45 58 54 2e 0a 23 0a 64 6f 5f  d to TEXT..#.do_
d490: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d4a0: 2d 32 39 2e 31 2e 31 20 7b 20 43 41 53 54 20 28  -29.1.1 { CAST (
d4b0: 58 27 33 31 32 45 33 32 33 33 27 20 41 53 20 52  X'312E3233' AS R
d4c0: 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32 33  EAL) } real 1.23
d4d0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d4e0: 65 78 70 72 2d 32 39 2e 31 2e 32 20 7b 20 43 41  expr-29.1.2 { CA
d4f0: 53 54 20 28 58 27 33 32 33 33 33 30 32 45 33 30  ST (X'3233302E30
d500: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
d510: 6c 20 32 33 30 2e 30 0a 64 6f 5f 65 78 70 72 5f  l 230.0.do_expr_
d520: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31  test e_expr-29.1
d530: 2e 33 20 7b 20 43 41 53 54 20 28 58 27 32 44 33  .3 { CAST (X'2D3
d540: 39 32 45 33 38 33 37 27 20 41 53 20 52 45 41 4c  92E3837' AS REAL
d550: 29 20 7d 20 72 65 61 6c 20 2d 39 2e 38 37 0a 64  ) } real -9.87.d
d560: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d570: 70 72 2d 32 39 2e 31 2e 34 20 7b 20 43 41 53 54  pr-29.1.4 { CAST
d580: 20 28 58 27 33 30 32 45 33 30 33 30 33 30 33 31   (X'302E30303031
d590: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
d5a0: 6c 20 30 2e 30 30 30 31 0a 72 65 6e 61 6d 65 20  l 0.0001.rename 
d5b0: 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33 20 64  db db2.sqlite3 d
d5c0: 62 20 3a 6d 65 6d 6f 72 79 3a 0a 69 66 63 61 70  b :memory:.ifcap
d5d0: 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a 64  able {utf16} {.d
d5e0: 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  b eval { PRAGMA 
d5f0: 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d  encoding = 'utf-
d600: 31 36 6c 65 27 20 7d 0a 64 6f 5f 65 78 70 72 5f  16le' }.do_expr_
d610: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31  test e_expr-29.1
d620: 2e 35 20 7b 20 0a 20 20 20 20 43 41 53 54 20 28  .5 { .    CAST (
d630: 58 27 33 31 30 30 32 45 30 30 33 32 30 30 33 33  X'31002E00320033
d640: 30 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  00' AS REAL) } r
d650: 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65 78 70 72  eal 1.23.do_expr
d660: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d670: 31 2e 36 20 7b 20 0a 20 20 20 20 43 41 53 54 20  1.6 { .    CAST 
d680: 28 58 27 33 32 30 30 33 33 30 30 33 30 30 30 32  (X'3200330030002
d690: 45 30 30 33 30 30 30 27 20 41 53 20 52 45 41 4c  E003000' AS REAL
d6a0: 29 20 7d 20 72 65 61 6c 20 32 33 30 2e 30 0a 64  ) } real 230.0.d
d6b0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d6c0: 70 72 2d 32 39 2e 31 2e 37 20 7b 20 0a 20 20 20  pr-29.1.7 { .   
d6d0: 20 43 41 53 54 20 28 58 27 32 44 30 30 33 39 30   CAST (X'2D00390
d6e0: 30 32 45 30 30 33 38 30 30 33 37 30 30 27 20 41  02E0038003700' A
d6f0: 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 2d  S REAL) } real -
d700: 39 2e 38 37 0a 64 6f 5f 65 78 70 72 5f 74 65 73  9.87.do_expr_tes
d710: 74 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e 38 20  t e_expr-29.1.8 
d720: 7b 20 0a 20 20 20 20 43 41 53 54 20 28 58 27 33  { .    CAST (X'3
d730: 30 30 30 32 45 30 30 33 30 30 30 33 30 30 30 33  0002E00300030003
d740: 30 30 30 33 31 30 30 27 20 41 53 20 52 45 41 4c  0003100' AS REAL
d750: 29 20 7d 20 72 65 61 6c 20 30 2e 30 30 30 31 0a  ) } real 0.0001.
d760: 7d 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61 6d  }.db close.renam
d770: 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49 44  e db2 db..# EVID
d780: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 38 39 38  ENCE-OF: R-54898
d790: 2d 33 34 35 35 34 20 57 68 65 6e 20 63 61 73 74  -34554 When cast
d7a0: 69 6e 67 20 61 20 54 45 58 54 20 76 61 6c 75 65  ing a TEXT value
d7b0: 20 74 6f 20 52 45 41 4c 2c 20 74 68 65 0a 23 20   to REAL, the.# 
d7c0: 6c 6f 6e 67 65 73 74 20 70 6f 73 73 69 62 6c 65  longest possible
d7d0: 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 76   prefix of the v
d7e0: 61 6c 75 65 20 74 68 61 74 20 63 61 6e 20 62 65  alue that can be
d7f0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
d800: 61 20 72 65 61 6c 0a 23 20 6e 75 6d 62 65 72 20  a real.# number 
d810: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
d820: 6d 20 74 68 65 20 54 45 58 54 20 76 61 6c 75 65  m the TEXT value
d830: 20 61 6e 64 20 74 68 65 20 72 65 6d 61 69 6e 64   and the remaind
d840: 65 72 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64 6f  er ignored..#.do
d850: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d860: 72 2d 32 39 2e 32 2e 31 20 7b 20 43 41 53 54 28  r-29.2.1 { CAST(
d870: 27 31 2e 32 33 61 62 63 64 27 20 41 53 20 52 45  '1.23abcd' AS RE
d880: 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32 33 0a  AL) } real 1.23.
d890: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d8a0: 78 70 72 2d 32 39 2e 32 2e 32 20 7b 20 43 41 53  xpr-29.2.2 { CAS
d8b0: 54 28 27 31 2e 34 35 2e 32 33 61 62 63 64 27 20  T('1.45.23abcd' 
d8c0: 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20  AS REAL) } real 
d8d0: 31 2e 34 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73  1.45.do_expr_tes
d8e0: 74 20 65 5f 65 78 70 72 2d 32 39 2e 32 2e 33 20  t e_expr-29.2.3 
d8f0: 7b 20 43 41 53 54 28 27 2d 32 2e 31 32 65 2d 30  { CAST('-2.12e-0
d900: 31 41 42 43 27 20 41 53 20 52 45 41 4c 29 20 7d  1ABC' AS REAL) }
d910: 20 72 65 61 6c 20 2d 30 2e 32 31 32 0a 64 6f 5f   real -0.212.do_
d920: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d930: 2d 32 39 2e 32 2e 34 20 7b 20 43 41 53 54 28 27  -29.2.4 { CAST('
d940: 31 20 32 20 33 20 34 27 20 41 53 20 52 45 41 4c  1 2 3 4' AS REAL
d950: 29 20 7d 20 72 65 61 6c 20 31 2e 30 0a 0a 23 20  ) } real 1.0..# 
d960: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
d970: 31 33 32 31 2d 34 37 34 32 37 20 41 6e 79 20 6c  1321-47427 Any l
d980: 65 61 64 69 6e 67 20 73 70 61 63 65 73 20 69 6e  eading spaces in
d990: 20 74 68 65 20 54 45 58 54 20 76 61 6c 75 65 20   the TEXT value 
d9a0: 61 72 65 0a 23 20 69 67 6e 6f 72 65 64 20 77 68  are.# ignored wh
d9b0: 65 6e 20 63 6f 6e 76 65 72 67 69 6e 67 20 66 72  en converging fr
d9c0: 6f 6d 20 54 45 58 54 20 74 6f 20 52 45 41 4c 2e  om TEXT to REAL.
d9d0: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
d9e0: 65 5f 65 78 70 72 2d 32 39 2e 33 2e 31 20 7b 20  e_expr-29.3.1 { 
d9f0: 43 41 53 54 28 27 20 31 2e 32 33 61 62 63 64 27  CAST(' 1.23abcd'
da00: 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c   AS REAL) } real
da10: 20 31 2e 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65   1.23.do_expr_te
da20: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e 32  st e_expr-29.3.2
da30: 20 7b 20 43 41 53 54 28 27 20 20 20 20 31 2e 34   { CAST('    1.4
da40: 35 2e 32 33 61 62 63 64 27 20 41 53 20 52 45 41  5.23abcd' AS REA
da50: 4c 29 20 7d 20 72 65 61 6c 20 31 2e 34 35 0a 64  L) } real 1.45.d
da60: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
da70: 70 72 2d 32 39 2e 33 2e 33 20 7b 20 43 41 53 54  pr-29.3.3 { CAST
da80: 28 27 20 20 20 2d 32 2e 31 32 65 2d 30 31 41 42  ('   -2.12e-01AB
da90: 43 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  C' AS REAL) } re
daa0: 61 6c 20 2d 30 2e 32 31 32 0a 64 6f 5f 65 78 70  al -0.212.do_exp
dab0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
dac0: 2e 33 2e 34 20 7b 20 43 41 53 54 28 27 20 31 20  .3.4 { CAST(' 1 
dad0: 32 20 33 20 34 27 20 41 53 20 52 45 41 4c 29 20  2 3 4' AS REAL) 
dae0: 7d 20 72 65 61 6c 20 31 2e 30 0a 0a 23 20 45 56  } real 1.0..# EV
daf0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 36  IDENCE-OF: R-226
db00: 36 32 2d 32 38 32 31 38 20 49 66 20 74 68 65 72  62-28218 If ther
db10: 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20 74  e is no prefix t
db20: 68 61 74 20 63 61 6e 20 62 65 0a 23 20 69 6e 74  hat can be.# int
db30: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 72 65  erpreted as a re
db40: 61 6c 20 6e 75 6d 62 65 72 2c 20 74 68 65 20 72  al number, the r
db50: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6e  esult of the con
db60: 76 65 72 73 69 6f 6e 20 69 73 20 30 2e 30 2e 0a  version is 0.0..
db70: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
db80: 5f 65 78 70 72 2d 32 39 2e 34 2e 31 20 7b 20 43  _expr-29.4.1 { C
db90: 41 53 54 28 27 27 20 41 53 20 52 45 41 4c 29 20  AST('' AS REAL) 
dba0: 7d 20 72 65 61 6c 20 30 2e 30 0a 64 6f 5f 65 78  } real 0.0.do_ex
dbb0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
dbc0: 39 2e 34 2e 32 20 7b 20 43 41 53 54 28 27 6e 6f  9.4.2 { CAST('no
dbd0: 74 20 61 20 6e 75 6d 62 65 72 27 20 41 53 20 52  t a number' AS R
dbe0: 45 41 4c 29 20 7d 20 72 65 61 6c 20 30 2e 30 0a  EAL) } real 0.0.
dbf0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
dc00: 78 70 72 2d 32 39 2e 34 2e 33 20 7b 20 43 41 53  xpr-29.4.3 { CAS
dc10: 54 28 27 58 58 49 27 20 41 53 20 52 45 41 4c 29  T('XXI' AS REAL)
dc20: 20 7d 20 72 65 61 6c 20 30 2e 30 0a 0a 23 20 45   } real 0.0..# E
dc30: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 31  VIDENCE-OF: R-21
dc40: 38 32 39 2d 31 34 35 36 33 20 57 68 65 6e 20 63  829-14563 When c
dc50: 61 73 74 69 6e 67 20 61 20 42 4c 4f 42 20 76 61  asting a BLOB va
dc60: 6c 75 65 20 74 6f 20 49 4e 54 45 47 45 52 2c 20  lue to INTEGER, 
dc70: 74 68 65 0a 23 20 76 61 6c 75 65 20 69 73 20 66  the.# value is f
dc80: 69 72 73 74 20 63 6f 6e 76 65 72 74 65 64 20 74  irst converted t
dc90: 6f 20 54 45 58 54 2e 0a 23 0a 64 6f 5f 65 78 70  o TEXT..#.do_exp
dca0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
dcb0: 2e 31 2e 31 20 7b 20 43 41 53 54 28 58 27 33 31  .1.1 { CAST(X'31
dcc0: 33 32 33 33 27 20 41 53 20 49 4e 54 45 47 45 52  3233' AS INTEGER
dcd0: 29 20 7d 20 69 6e 74 65 67 65 72 20 31 32 33 0a  ) } integer 123.
dce0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
dcf0: 78 70 72 2d 33 30 2e 31 2e 32 20 7b 20 43 41 53  xpr-30.1.2 { CAS
dd00: 54 28 58 27 32 44 33 36 33 37 33 38 27 20 41 53  T(X'2D363738' AS
dd10: 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65   INTEGER) } inte
dd20: 67 65 72 20 2d 36 37 38 0a 64 6f 5f 65 78 70 72  ger -678.do_expr
dd30: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
dd40: 31 2e 33 20 7b 20 0a 20 20 43 41 53 54 28 58 27  1.3 { .  CAST(X'
dd50: 33 31 33 30 33 30 33 30 33 30 33 30 33 30 27 20  31303030303030' 
dd60: 41 53 20 49 4e 54 45 47 45 52 29 20 0a 7d 20 69  AS INTEGER) .} i
dd70: 6e 74 65 67 65 72 20 31 30 30 30 30 30 30 0a 64  nteger 1000000.d
dd80: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
dd90: 70 72 2d 33 30 2e 31 2e 34 20 7b 20 0a 20 20 43  pr-30.1.4 { .  C
dda0: 41 53 54 28 58 27 32 44 33 31 33 31 33 32 33 35  AST(X'2D31313235
ddb0: 33 38 33 39 33 39 33 39 33 30 33 36 33 38 33 34  3839393930363834
ddc0: 33 32 33 36 33 32 33 34 27 20 41 53 20 49 4e 54  32363234' AS INT
ddd0: 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67 65 72  EGER) .} integer
dde0: 20 2d 31 31 32 35 38 39 39 39 30 36 38 34 32 36   -11258999068426
ddf0: 32 34 0a 0a 72 65 6e 61 6d 65 20 64 62 20 64 62  24..rename db db
de00: 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65  2.sqlite3 db :me
de10: 6d 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c 65 20  mory:.ifcapable 
de20: 7b 75 74 66 31 36 7d 20 7b 0a 65 78 65 63 73 71  {utf16} {.execsq
de30: 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  l { PRAGMA encod
de40: 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 62 65 27  ing = 'utf-16be'
de50: 20 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20   }.do_expr_test 
de60: 65 5f 65 78 70 72 2d 33 30 2e 31 2e 35 20 7b 20  e_expr-30.1.5 { 
de70: 43 41 53 54 28 58 27 30 30 33 31 30 30 33 32 30  CAST(X'003100320
de80: 30 33 33 27 20 41 53 20 49 4e 54 45 47 45 52 29  033' AS INTEGER)
de90: 20 7d 20 69 6e 74 65 67 65 72 20 31 32 33 0a 64   } integer 123.d
dea0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
deb0: 70 72 2d 33 30 2e 31 2e 36 20 7b 20 43 41 53 54  pr-30.1.6 { CAST
dec0: 28 58 27 30 30 32 44 30 30 33 36 30 30 33 37 30  (X'002D003600370
ded0: 30 33 38 27 20 41 53 20 49 4e 54 45 47 45 52 29  038' AS INTEGER)
dee0: 20 7d 20 69 6e 74 65 67 65 72 20 2d 36 37 38 0a   } integer -678.
def0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
df00: 78 70 72 2d 33 30 2e 31 2e 37 20 7b 20 0a 20 20  xpr-30.1.7 { .  
df10: 43 41 53 54 28 58 27 30 30 33 31 30 30 33 30 30  CAST(X'003100300
df20: 30 33 30 30 30 33 30 30 30 33 30 30 30 33 30 30  0300030003000300
df30: 30 33 30 27 20 41 53 20 49 4e 54 45 47 45 52 29  030' AS INTEGER)
df40: 20 0a 7d 20 69 6e 74 65 67 65 72 20 31 30 30 30   .} integer 1000
df50: 30 30 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  000.do_expr_test
df60: 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 38 20 7b   e_expr-30.1.8 {
df70: 20 0a 20 20 43 41 53 54 28 58 27 30 30 32 44 30   .  CAST(X'002D0
df80: 30 33 31 30 30 33 31 30 30 33 32 30 30 33 35 30  0310031003200350
df90: 30 33 38 30 30 33 39 30 30 33 39 30 30 33 39 30  0380039003900390
dfa0: 30 33 30 30 30 33 36 30 30 33 38 30 30 33 34 30  0300036003800340
dfb0: 30 33 32 30 30 33 36 30 30 33 32 30 30 33 34 27  032003600320034'
dfc0: 20 41 53 20 49 4e 54 45 47 45 52 29 20 0a 7d 20   AS INTEGER) .} 
dfd0: 69 6e 74 65 67 65 72 20 2d 31 31 32 35 38 39 39  integer -1125899
dfe0: 39 30 36 38 34 32 36 32 34 0a 7d 0a 64 62 20 63  906842624.}.db c
dff0: 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62 32 20  lose.rename db2 
e000: 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  db..# EVIDENCE-O
e010: 46 3a 20 52 2d 34 37 36 31 32 2d 34 35 38 34 32  F: R-47612-45842
e020: 20 57 68 65 6e 20 63 61 73 74 69 6e 67 20 61 20   When casting a 
e030: 54 45 58 54 20 76 61 6c 75 65 20 74 6f 20 49 4e  TEXT value to IN
e040: 54 45 47 45 52 2c 20 74 68 65 0a 23 20 6c 6f 6e  TEGER, the.# lon
e050: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 72  gest possible pr
e060: 65 66 69 78 20 6f 66 20 74 68 65 20 76 61 6c 75  efix of the valu
e070: 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 69 6e  e that can be in
e080: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 0a  terpreted as an.
e090: 23 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  # integer number
e0a0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
e0b0: 6f 6d 20 74 68 65 20 54 45 58 54 20 76 61 6c 75  om the TEXT valu
e0c0: 65 20 61 6e 64 20 74 68 65 20 72 65 6d 61 69 6e  e and the remain
e0d0: 64 65 72 0a 23 20 69 67 6e 6f 72 65 64 2e 0a 23  der.# ignored..#
e0e0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e0f0: 65 78 70 72 2d 33 30 2e 32 2e 31 20 7b 20 43 41  expr-30.2.1 { CA
e100: 53 54 28 27 31 32 33 61 62 63 64 27 20 41 53 20  ST('123abcd' AS 
e110: 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31  INT) } integer 1
e120: 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  23.do_expr_test 
e130: 65 5f 65 78 70 72 2d 33 30 2e 32 2e 32 20 7b 20  e_expr-30.2.2 { 
e140: 43 41 53 54 28 27 31 34 35 32 33 61 62 63 64 27  CAST('14523abcd'
e150: 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67   AS INT) } integ
e160: 65 72 20 31 34 35 32 33 0a 64 6f 5f 65 78 70 72  er 14523.do_expr
e170: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
e180: 32 2e 33 20 7b 20 43 41 53 54 28 27 2d 32 2e 31  2.3 { CAST('-2.1
e190: 32 65 2d 30 31 41 42 43 27 20 41 53 20 49 4e 54  2e-01ABC' AS INT
e1a0: 29 20 7d 20 69 6e 74 65 67 65 72 20 2d 32 0a 64  ) } integer -2.d
e1b0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
e1c0: 70 72 2d 33 30 2e 32 2e 34 20 7b 20 43 41 53 54  pr-30.2.4 { CAST
e1d0: 28 27 31 20 32 20 33 20 34 27 20 41 53 20 49 4e  ('1 2 3 4' AS IN
e1e0: 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31 0a 0a  T) } integer 1..
e1f0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
e200: 2d 33 34 34 30 30 2d 33 33 37 37 32 20 41 6e 79  -34400-33772 Any
e210: 20 6c 65 61 64 69 6e 67 20 73 70 61 63 65 73 20   leading spaces 
e220: 69 6e 20 74 68 65 20 54 45 58 54 20 76 61 6c 75  in the TEXT valu
e230: 65 20 77 68 65 6e 0a 23 20 63 6f 6e 76 65 72 74  e when.# convert
e240: 69 6e 67 20 66 72 6f 6d 20 54 45 58 54 20 74 6f  ing from TEXT to
e250: 20 49 4e 54 45 47 45 52 20 61 72 65 20 69 67 6e   INTEGER are ign
e260: 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  ored..#.do_expr_
e270: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 33  test e_expr-30.3
e280: 2e 31 20 7b 20 43 41 53 54 28 27 20 20 20 31 32  .1 { CAST('   12
e290: 33 61 62 63 64 27 20 41 53 20 49 4e 54 29 20 7d  3abcd' AS INT) }
e2a0: 20 69 6e 74 65 67 65 72 20 31 32 33 0a 64 6f 5f   integer 123.do_
e2b0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e2c0: 2d 33 30 2e 33 2e 32 20 7b 20 43 41 53 54 28 27  -30.3.2 { CAST('
e2d0: 20 20 31 34 35 32 33 61 62 63 64 27 20 41 53 20    14523abcd' AS 
e2e0: 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31  INT) } integer 1
e2f0: 34 35 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73  4523.do_expr_tes
e300: 74 20 65 5f 65 78 70 72 2d 33 30 2e 33 2e 33 20  t e_expr-30.3.3 
e310: 7b 20 43 41 53 54 28 27 20 2d 32 2e 31 32 65 2d  { CAST(' -2.12e-
e320: 30 31 41 42 43 27 20 41 53 20 49 4e 54 29 20 7d  01ABC' AS INT) }
e330: 20 69 6e 74 65 67 65 72 20 2d 32 0a 64 6f 5f 65   integer -2.do_e
e340: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
e350: 33 30 2e 33 2e 34 20 7b 20 43 41 53 54 28 27 20  30.3.4 { CAST(' 
e360: 20 20 20 20 31 20 32 20 33 20 34 27 20 41 53 20      1 2 3 4' AS 
e370: 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31  INT) } integer 1
e380: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
e390: 20 52 2d 34 33 31 36 34 2d 34 34 32 37 36 20 49   R-43164-44276 I
e3a0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72  f there is no pr
e3b0: 65 66 69 78 20 74 68 61 74 20 63 61 6e 20 62 65  efix that can be
e3c0: 0a 23 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  .# interpreted a
e3d0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  s an integer num
e3e0: 62 65 72 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ber, the result 
e3f0: 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  of the conversio
e400: 6e 20 69 73 20 30 2e 0a 23 0a 64 6f 5f 65 78 70  n is 0..#.do_exp
e410: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
e420: 2e 34 2e 31 20 7b 20 43 41 53 54 28 27 27 20 41  .4.1 { CAST('' A
e430: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e440: 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72 5f 74  eger 0.do_expr_t
e450: 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 34 2e  est e_expr-30.4.
e460: 32 20 7b 20 43 41 53 54 28 27 6e 6f 74 20 61 20  2 { CAST('not a 
e470: 6e 75 6d 62 65 72 27 20 41 53 20 49 4e 54 45 47  number' AS INTEG
e480: 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 30 0a  ER) } integer 0.
e490: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e4a0: 78 70 72 2d 33 30 2e 34 2e 33 20 7b 20 43 41 53  xpr-30.4.3 { CAS
e4b0: 54 28 27 58 58 49 27 20 41 53 20 49 4e 54 45 47  T('XXI' AS INTEG
e4c0: 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 30 0a  ER) } integer 0.
e4d0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
e4e0: 52 2d 30 38 39 38 30 2d 35 33 31 32 34 20 54 68  R-08980-53124 Th
e4f0: 65 20 43 41 53 54 20 6f 70 65 72 61 74 6f 72 20  e CAST operator 
e500: 75 6e 64 65 72 73 74 61 6e 64 73 20 64 65 63 69  understands deci
e510: 6d 61 6c 0a 23 20 69 6e 74 65 67 65 72 73 20 6f  mal.# integers o
e520: 6e 6c 79 20 26 6d 64 61 73 68 3b 20 63 6f 6e 76  nly &mdash; conv
e530: 65 72 73 69 6f 6e 20 6f 66 20 68 65 78 61 64 65  ersion of hexade
e540: 63 69 6d 61 6c 20 69 6e 74 65 67 65 72 73 20 73  cimal integers s
e550: 74 6f 70 73 20 61 74 0a 23 20 74 68 65 20 22 78  tops at.# the "x
e560: 22 20 69 6e 20 74 68 65 20 22 30 78 22 20 70 72  " in the "0x" pr
e570: 65 66 69 78 20 6f 66 20 74 68 65 20 68 65 78 61  efix of the hexa
e580: 64 65 63 69 6d 61 6c 20 69 6e 74 65 67 65 72 20  decimal integer 
e590: 73 74 72 69 6e 67 20 61 6e 64 20 74 68 75 73 0a  string and thus.
e5a0: 23 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  # result of the 
e5b0: 43 41 53 54 20 69 73 20 61 6c 77 61 79 73 20 7a  CAST is always z
e5c0: 65 72 6f 2e 0a 64 6f 5f 65 78 70 72 5f 74 65 73  ero..do_expr_tes
e5d0: 74 20 65 5f 65 78 70 72 2d 33 30 2e 35 2e 31 20  t e_expr-30.5.1 
e5e0: 7b 20 43 41 53 54 28 27 30 78 31 32 33 34 27 20  { CAST('0x1234' 
e5f0: 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e  AS INTEGER) } in
e600: 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72 5f  teger 0.do_expr_
e610: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 35  test e_expr-30.5
e620: 2e 32 20 7b 20 43 41 53 54 28 27 30 58 31 32 33  .2 { CAST('0X123
e630: 34 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d  4' AS INTEGER) }
e640: 20 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45 56   integer 0..# EV
e650: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32 37  IDENCE-OF: R-027
e660: 35 32 2d 35 30 30 39 31 20 41 20 63 61 73 74 20  52-50091 A cast 
e670: 6f 66 20 61 20 52 45 41 4c 20 76 61 6c 75 65 20  of a REAL value 
e680: 69 6e 74 6f 20 61 6e 20 49 4e 54 45 47 45 52 0a  into an INTEGER.
e690: 23 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  # results in the
e6a0: 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e   integer between
e6b0: 20 74 68 65 20 52 45 41 4c 20 76 61 6c 75 65 20   the REAL value 
e6c0: 61 6e 64 20 7a 65 72 6f 20 74 68 61 74 20 69 73  and zero that is
e6d0: 20 63 6c 6f 73 65 73 74 0a 23 20 74 6f 20 74 68   closest.# to th
e6e0: 65 20 52 45 41 4c 20 76 61 6c 75 65 2e 0a 23 0a  e REAL value..#.
e6f0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e700: 78 70 72 2d 33 31 2e 31 2e 31 20 7b 20 43 41 53  xpr-31.1.1 { CAS
e710: 54 28 33 2e 31 34 31 35 39 20 41 53 20 49 4e 54  T(3.14159 AS INT
e720: 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20  EGER) } integer 
e730: 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  3.do_expr_test e
e740: 5f 65 78 70 72 2d 33 31 2e 31 2e 32 20 7b 20 43  _expr-31.1.2 { C
e750: 41 53 54 28 31 2e 39 39 39 39 39 20 41 53 20 49  AST(1.99999 AS I
e760: 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65  NTEGER) } intege
e770: 72 20 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  r 1.do_expr_test
e780: 20 65 5f 65 78 70 72 2d 33 31 2e 31 2e 33 20 7b   e_expr-31.1.3 {
e790: 20 43 41 53 54 28 2d 31 2e 39 39 39 39 39 20 41   CAST(-1.99999 A
e7a0: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e7b0: 65 67 65 72 20 2d 31 0a 64 6f 5f 65 78 70 72 5f  eger -1.do_expr_
e7c0: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 31  test e_expr-31.1
e7d0: 2e 34 20 7b 20 43 41 53 54 28 2d 30 2e 39 39 39  .4 { CAST(-0.999
e7e0: 39 39 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d  99 AS INTEGER) }
e7f0: 20 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45 56   integer 0..# EV
e800: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 35  IDENCE-OF: R-515
e810: 31 37 2d 34 30 38 32 34 20 49 66 20 61 20 52 45  17-40824 If a RE
e820: 41 4c 20 69 73 20 67 72 65 61 74 65 72 20 74 68  AL is greater th
e830: 61 6e 20 74 68 65 20 67 72 65 61 74 65 73 74 0a  an the greatest.
e840: 23 20 70 6f 73 73 69 62 6c 65 20 73 69 67 6e 65  # possible signe
e850: 64 20 69 6e 74 65 67 65 72 20 28 2b 39 32 32 33  d integer (+9223
e860: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 29  372036854775807)
e870: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
e880: 20 69 73 20 74 68 65 0a 23 20 67 72 65 61 74 65   is the.# greate
e890: 73 74 20 70 6f 73 73 69 62 6c 65 20 73 69 67 6e  st possible sign
e8a0: 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 69  ed integer and i
e8b0: 66 20 74 68 65 20 52 45 41 4c 20 69 73 20 6c 65  f the REAL is le
e8c0: 73 73 20 74 68 61 6e 20 74 68 65 0a 23 20 6c 65  ss than the.# le
e8d0: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 73 69 67  ast possible sig
e8e0: 6e 65 64 20 69 6e 74 65 67 65 72 20 28 2d 39 32  ned integer (-92
e8f0: 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
e900: 38 29 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  8) then the resu
e910: 6c 74 0a 23 20 69 73 20 74 68 65 20 6c 65 61 73  lt.# is the leas
e920: 74 20 70 6f 73 73 69 62 6c 65 20 73 69 67 6e 65  t possible signe
e930: 64 20 69 6e 74 65 67 65 72 2e 0a 23 0a 64 6f 5f  d integer..#.do_
e940: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e950: 2d 33 31 2e 32 2e 31 20 7b 20 43 41 53 54 28 32  -31.2.1 { CAST(2
e960: 65 2b 35 30 20 41 53 20 49 4e 54 29 20 7d 20 69  e+50 AS INT) } i
e970: 6e 74 65 67 65 72 20 39 32 32 33 33 37 32 30 33  nteger 922337203
e980: 36 38 35 34 37 37 35 38 30 37 0a 64 6f 5f 65 78  6854775807.do_ex
e990: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e9a0: 31 2e 32 2e 32 20 7b 20 43 41 53 54 28 2d 32 65  1.2.2 { CAST(-2e
e9b0: 2b 35 30 20 41 53 20 49 4e 54 29 20 7d 20 69 6e  +50 AS INT) } in
e9c0: 74 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33  teger -922337203
e9d0: 36 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78  6854775808.do_ex
e9e0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e9f0: 31 2e 32 2e 33 20 7b 20 0a 20 20 43 41 53 54 28  1.2.3 { .  CAST(
ea00: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
ea10: 35 38 30 39 2e 30 20 41 53 20 49 4e 54 29 0a 7d  5809.0 AS INT).}
ea20: 20 69 6e 74 65 67 65 72 20 2d 39 32 32 33 33 37   integer -922337
ea30: 32 30 33 36 38 35 34 37 37 35 38 30 38 0a 64 6f  2036854775808.do
ea40: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
ea50: 72 2d 33 31 2e 32 2e 34 20 7b 20 0a 20 20 43 41  r-31.2.4 { .  CA
ea60: 53 54 28 39 32 32 33 33 37 32 30 33 36 38 35 34  ST(9223372036854
ea70: 37 37 35 38 30 39 2e 30 20 41 53 20 49 4e 54 29  775809.0 AS INT)
ea80: 0a 7d 20 69 6e 74 65 67 65 72 20 39 32 32 33 33  .} integer 92233
ea90: 37 32 30 33 36 38 35 34 37 37 35 38 30 37 0a 0a  72036854775807..
eaa0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
eab0: 52 2d 30 39 32 39 35 2d 36 31 33 33 37 20 43 61  R-09295-61337 Ca
eac0: 73 74 69 6e 67 20 61 20 54 45 58 54 20 6f 72 20  sting a TEXT or 
ead0: 42 4c 4f 42 20 76 61 6c 75 65 20 69 6e 74 6f 20  BLOB value into 
eae0: 4e 55 4d 45 52 49 43 0a 23 20 66 69 72 73 74 20  NUMERIC.# first 
eaf0: 64 6f 65 73 20 61 20 66 6f 72 63 65 64 20 63 6f  does a forced co
eb00: 6e 76 65 72 73 69 6f 6e 20 69 6e 74 6f 20 52 45  nversion into RE
eb10: 41 4c 20 62 75 74 20 74 68 65 6e 20 66 75 72 74  AL but then furt
eb20: 68 65 72 20 63 6f 6e 76 65 72 74 73 20 74 68 65  her converts the
eb30: 0a 23 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 49  .# result into I
eb40: 4e 54 45 47 45 52 20 69 66 20 61 6e 64 20 6f 6e  NTEGER if and on
eb50: 6c 79 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72  ly if the conver
eb60: 73 69 6f 6e 20 66 72 6f 6d 20 52 45 41 4c 20 74  sion from REAL t
eb70: 6f 20 49 4e 54 45 47 45 52 0a 23 20 69 73 20 6c  o INTEGER.# is l
eb80: 6f 73 73 6c 65 73 73 20 61 6e 64 20 72 65 76 65  ossless and reve
eb90: 72 73 69 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 70  rsible..#.do_exp
eba0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32  r_test e_expr-32
ebb0: 2e 31 2e 31 20 7b 20 43 41 53 54 28 27 34 35 27  .1.1 { CAST('45'
ebc0: 20 20 20 41 53 20 4e 55 4d 45 52 49 43 29 20 20     AS NUMERIC)  
ebd0: 7d 20 69 6e 74 65 67 65 72 20 34 35 0a 64 6f 5f  } integer 45.do_
ebe0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
ebf0: 2d 33 32 2e 31 2e 32 20 7b 20 43 41 53 54 28 27  -32.1.2 { CAST('
ec00: 34 35 2e 30 27 20 41 53 20 4e 55 4d 45 52 49 43  45.0' AS NUMERIC
ec10: 29 20 20 7d 20 69 6e 74 65 67 65 72 20 34 35 0a  )  } integer 45.
ec20: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
ec30: 78 70 72 2d 33 32 2e 31 2e 33 20 7b 20 43 41 53  xpr-32.1.3 { CAS
ec40: 54 28 27 34 35 2e 32 27 20 41 53 20 4e 55 4d 45  T('45.2' AS NUME
ec50: 52 49 43 29 20 20 7d 20 72 65 61 6c 20 34 35 2e  RIC)  } real 45.
ec60: 32 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  2.do_expr_test e
ec70: 5f 65 78 70 72 2d 33 32 2e 31 2e 34 20 7b 20 43  _expr-32.1.4 { C
ec80: 41 53 54 28 27 31 31 61 62 63 27 20 41 53 20 4e  AST('11abc' AS N
ec90: 55 4d 45 52 49 43 29 20 7d 20 69 6e 74 65 67 65  UMERIC) } intege
eca0: 72 20 31 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73  r 11.do_expr_tes
ecb0: 74 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e 35 20  t e_expr-32.1.5 
ecc0: 7b 20 43 41 53 54 28 27 31 31 2e 31 61 62 63 27  { CAST('11.1abc'
ecd0: 20 41 53 20 4e 55 4d 45 52 49 43 29 20 7d 20 72   AS NUMERIC) } r
ece0: 65 61 6c 20 31 31 2e 31 0a 0a 23 20 45 56 49 44  eal 11.1..# EVID
ecf0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 33 34 37  ENCE-OF: R-30347
ed00: 2d 31 38 37 30 32 20 43 61 73 74 69 6e 67 20 61  -18702 Casting a
ed10: 20 52 45 41 4c 20 6f 72 20 49 4e 54 45 47 45 52   REAL or INTEGER
ed20: 20 76 61 6c 75 65 20 74 6f 20 4e 55 4d 45 52 49   value to NUMERI
ed30: 43 0a 23 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20  C.# is a no-op, 
ed40: 65 76 65 6e 20 69 66 20 61 20 72 65 61 6c 20 76  even if a real v
ed50: 61 6c 75 65 20 63 6f 75 6c 64 20 62 65 20 6c 6f  alue could be lo
ed60: 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74  sslessly convert
ed70: 65 64 20 74 6f 20 61 6e 0a 23 20 69 6e 74 65 67  ed to an.# integ
ed80: 65 72 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65  er..#.do_expr_te
ed90: 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 31  st e_expr-32.2.1
eda0: 20 7b 20 43 41 53 54 28 31 33 2e 30 20 41 53 20   { CAST(13.0 AS 
edb0: 4e 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c 20  NUMERIC) } real 
edc0: 31 33 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73  13.0.do_expr_tes
edd0: 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 32 20  t e_expr-32.2.2 
ede0: 7b 20 43 41 53 54 28 31 33 2e 35 20 41 53 20 4e  { CAST(13.5 AS N
edf0: 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c 20 31  UMERIC) } real 1
ee00: 33 2e 35 0a 0a 64 6f 5f 65 78 70 72 5f 74 65 73  3.5..do_expr_tes
ee10: 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 33 20  t e_expr-32.2.3 
ee20: 7b 20 0a 20 20 43 41 53 54 28 2d 39 32 32 33 33  { .  CAST(-92233
ee30: 37 32 30 33 36 38 35 34 37 37 35 38 30 38 20 41  72036854775808 A
ee40: 53 20 4e 55 4d 45 52 49 43 29 0a 7d 20 69 6e 74  S NUMERIC).} int
ee50: 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33 36  eger -9223372036
ee60: 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78 70  854775808.do_exp
ee70: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32  r_test e_expr-32
ee80: 2e 32 2e 34 20 7b 20 0a 20 20 43 41 53 54 28 39  .2.4 { .  CAST(9
ee90: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
eea0: 30 37 20 41 53 20 4e 55 4d 45 52 49 43 29 0a 7d  07 AS NUMERIC).}
eeb0: 20 69 6e 74 65 67 65 72 20 39 32 32 33 33 37 32   integer 9223372
eec0: 30 33 36 38 35 34 37 37 35 38 30 37 0a 0a 23 20  036854775807..# 
eed0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
eee0: 34 35 35 30 2d 32 39 31 39 31 20 4e 6f 74 65 20  4550-29191 Note 
eef0: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
ef00: 66 72 6f 6d 20 63 61 73 74 69 6e 67 20 61 6e 79  from casting any
ef10: 0a 23 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75  .# non-BLOB valu
ef20: 65 20 69 6e 74 6f 20 61 20 42 4c 4f 42 20 61 6e  e into a BLOB an
ef30: 64 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f  d the result fro
ef40: 6d 20 63 61 73 74 69 6e 67 20 61 6e 79 20 42 4c  m casting any BL
ef50: 4f 42 20 76 61 6c 75 65 0a 23 20 69 6e 74 6f 20  OB value.# into 
ef60: 61 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65  a non-BLOB value
ef70: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
ef80: 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  t depending on w
ef90: 68 65 74 68 65 72 20 74 68 65 0a 23 20 64 61 74  hether the.# dat
efa0: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 69  abase encoding i
efb0: 73 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 62  s UTF-8, UTF-16b
efc0: 65 2c 20 6f 72 20 55 54 46 2d 31 36 6c 65 2e 0a  e, or UTF-16le..
efd0: 23 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66  #.ifcapable {utf
efe0: 31 36 7d 20 7b 0a 73 71 6c 69 74 65 33 20 64 62  16} {.sqlite3 db
eff0: 31 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 31  1 :memory: ; db1
f000: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65   eval { PRAGMA e
f010: 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 38  ncoding = 'utf-8
f020: 27 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 32 20  ' }.sqlite3 db2 
f030: 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 32 20 65  :memory: ; db2 e
f040: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63  val { PRAGMA enc
f050: 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c  oding = 'utf-16l
f060: 65 27 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 33  e' }.sqlite3 db3
f070: 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 33 20   :memory: ; db3 
f080: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e  eval { PRAGMA en
f090: 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36  coding = 'utf-16
f0a0: 62 65 27 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74  be' }.foreach {t
f0b0: 6e 20 63 61 73 74 65 78 70 72 20 64 69 66 66 65  n castexpr diffe
f0c0: 72 73 7d 20 7b 0a 20 20 31 20 7b 20 43 41 53 54  rs} {.  1 { CAST
f0d0: 28 31 32 33 20 41 53 20 42 4c 4f 42 29 20 20 20  (123 AS BLOB)   
f0e0: 20 7d 20 31 0a 20 20 32 20 7b 20 43 41 53 54 28   } 1.  2 { CAST(
f0f0: 27 27 20 41 53 20 42 4c 4f 42 29 20 20 20 20 20  '' AS BLOB)     
f100: 7d 20 30 0a 20 20 33 20 7b 20 43 41 53 54 28 27  } 0.  3 { CAST('
f110: 61 62 63 64 27 20 41 53 20 42 4c 4f 42 29 20 7d  abcd' AS BLOB) }
f120: 20 31 0a 0a 20 20 34 20 7b 20 43 41 53 54 28 58   1..  4 { CAST(X
f130: 27 61 62 63 64 27 20 41 53 20 54 45 58 54 29 20  'abcd' AS TEXT) 
f140: 7d 20 31 0a 20 20 35 20 7b 20 43 41 53 54 28 58  } 1.  5 { CAST(X
f150: 27 27 20 41 53 20 54 45 58 54 29 20 20 20 20 20  '' AS TEXT)     
f160: 7d 20 30 0a 7d 20 7b 0a 20 20 73 65 74 20 72 31  } 0.} {.  set r1
f170: 20 5b 64 62 31 20 65 76 61 6c 20 22 53 45 4c 45   [db1 eval "SELE
f180: 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74 65  CT typeof($caste
f190: 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61 73  xpr), quote($cas
f1a0: 74 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20 72  texpr)"].  set r
f1b0: 32 20 5b 64 62 32 20 65 76 61 6c 20 22 53 45 4c  2 [db2 eval "SEL
f1c0: 45 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74  ECT typeof($cast
f1d0: 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61  expr), quote($ca
f1e0: 73 74 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20  stexpr)"].  set 
f1f0: 72 33 20 5b 64 62 33 20 65 76 61 6c 20 22 53 45  r3 [db3 eval "SE
f200: 4c 45 43 54 20 74 79 70 65 6f 66 28 24 63 61 73  LECT typeof($cas
f210: 74 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63  texpr), quote($c
f220: 61 73 74 65 78 70 72 29 22 5d 0a 0a 20 20 69 66  astexpr)"]..  if
f230: 20 7b 24 64 69 66 66 65 72 73 7d 20 7b 0a 20 20   {$differs} {.  
f240: 20 20 73 65 74 20 72 65 73 20 5b 65 78 70 72 20    set res [expr 
f250: 7b 24 72 31 21 3d 24 72 32 20 26 26 20 24 72 32  {$r1!=$r2 && $r2
f260: 21 3d 24 72 33 7d 5d 0a 20 20 7d 20 65 6c 73 65  !=$r3}].  } else
f270: 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b   {.    set res [
f280: 65 78 70 72 20 7b 24 72 31 3d 3d 24 72 32 20 26  expr {$r1==$r2 &
f290: 26 20 24 72 32 3d 3d 24 72 33 7d 5d 0a 20 20 7d  & $r2==$r3}].  }
f2a0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 65 78  ..  do_test e_ex
f2b0: 70 72 2d 33 33 2e 31 2e 24 74 6e 20 7b 73 65 74  pr-33.1.$tn {set
f2c0: 20 72 65 73 7d 20 31 0a 7d 0a 64 62 31 20 63 6c   res} 1.}.db1 cl
f2d0: 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 64 62  ose.db2 close.db
f2e0: 33 20 63 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d 2d  3 close.}..#----
f2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f330: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61  -----.# Test sta
f340: 74 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20  tements related 
f350: 74 6f 20 74 68 65 20 45 58 49 53 54 53 20 61 6e  to the EXISTS an
f360: 64 20 4e 4f 54 20 45 58 49 53 54 53 20 6f 70 65  d NOT EXISTS ope
f370: 72 61 74 6f 72 73 2e 0a 23 0a 63 61 74 63 68 20  rators..#.catch 
f380: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72  { db close }.for
f390: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
f3a0: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
f3b0: 2e 64 62 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  .db..do_execsql_
f3c0: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34 2e 31  test e_expr-34.1
f3d0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
f3e0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 49 4e  E t1(a, b);.  IN
f3f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
f400: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53  UES(1, 2);.  INS
f410: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
f420: 45 53 28 4e 55 4c 4c 2c 20 32 29 3b 0a 20 20 49  ES(NULL, 2);.  I
f430: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
f440: 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20  LUES(1, NULL);. 
f450: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
f460: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c  VALUES(NULL, NUL
f470: 4c 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44  L);.} {}..# EVID
f480: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 35 38 38  ENCE-OF: R-25588
f490: 2d 32 37 31 38 31 20 54 68 65 20 45 58 49 53 54  -27181 The EXIST
f4a0: 53 20 6f 70 65 72 61 74 6f 72 20 61 6c 77 61 79  S operator alway
f4b0: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 6f  s evaluates to o
f4c0: 6e 65 0a 23 20 6f 66 20 74 68 65 20 69 6e 74 65  ne.# of the inte
f4d0: 67 65 72 20 76 61 6c 75 65 73 20 30 20 61 6e 64  ger values 0 and
f4e0: 20 31 2e 0a 23 0a 23 20 54 68 69 73 20 73 74 61   1..#.# This sta
f4f0: 74 65 6d 65 6e 74 20 69 73 20 6e 6f 74 20 74 65  tement is not te
f500: 73 74 65 64 20 62 79 20 69 74 73 65 6c 66 2e 20  sted by itself. 
f510: 49 6e 73 74 65 61 64 2c 20 61 6c 6c 20 65 5f 65  Instead, all e_e
f520: 78 70 72 2d 33 34 2e 2a 20 74 65 73 74 73 20 0a  xpr-34.* tests .
f530: 23 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  # following this
f540: 20 70 6f 69 6e 74 20 65 78 70 6c 69 63 69 74 6c   point explicitl
f550: 79 20 74 65 73 74 20 74 68 61 74 20 73 70 65 63  y test that spec
f560: 69 66 69 63 20 69 6e 76 6f 63 61 74 69 6f 6e 73  ific invocations
f570: 20 6f 66 20 45 58 49 53 54 53 0a 23 20 72 65 74   of EXISTS.# ret
f580: 75 72 6e 20 65 69 74 68 65 72 20 69 6e 74 65 67  urn either integ
f590: 65 72 20 30 20 6f 72 20 69 6e 74 65 67 65 72 20  er 0 or integer 
f5a0: 31 2e 0a 23 0a 0a 23 20 45 56 49 44 45 4e 43 45  1..#..# EVIDENCE
f5b0: 2d 4f 46 3a 20 52 2d 35 38 35 35 33 2d 36 33 37  -OF: R-58553-637
f5c0: 34 30 20 49 66 20 65 78 65 63 75 74 69 6e 67 20  40 If executing 
f5d0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
f5e0: 6d 65 6e 74 20 73 70 65 63 69 66 69 65 64 0a 23  ment specified.#
f5f0: 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 68 61   as the right-ha
f600: 6e 64 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  nd operand of th
f610: 65 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  e EXISTS operato
f620: 72 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f  r would return o
f630: 6e 65 20 6f 72 0a 23 20 6d 6f 72 65 20 72 6f 77  ne or.# more row
f640: 73 2c 20 74 68 65 6e 20 74 68 65 20 45 58 49 53  s, then the EXIS
f650: 54 53 20 6f 70 65 72 61 74 6f 72 20 65 76 61 6c  TS operator eval
f660: 75 61 74 65 73 20 74 6f 20 31 2e 0a 23 0a 66 6f  uates to 1..#.fo
f670: 72 65 61 63 68 20 7b 74 6e 20 65 78 70 72 7d 20  reach {tn expr} 
f680: 7b 0a 20 20 20 20 31 20 7b 20 45 58 49 53 54 53  {.    1 { EXISTS
f690: 20 28 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   ( SELECT a FROM
f6a0: 20 74 31 20 29 20 7d 0a 20 20 20 20 32 20 7b 20   t1 ) }.    2 { 
f6b0: 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
f6c0: 62 20 46 52 4f 4d 20 74 31 20 29 20 7d 0a 20 20  b FROM t1 ) }.  
f6d0: 20 20 33 20 7b 20 45 58 49 53 54 53 20 28 20 53    3 { EXISTS ( S
f6e0: 45 4c 45 43 54 20 32 34 20 29 20 7d 0a 20 20 20  ELECT 24 ) }.   
f6f0: 20 34 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   4 { EXISTS ( SE
f700: 4c 45 43 54 20 4e 55 4c 4c 20 29 20 7d 0a 20 20  LECT NULL ) }.  
f710: 20 20 35 20 7b 20 45 58 49 53 54 53 20 28 20 53    5 { EXISTS ( S
f720: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
f730: 57 48 45 52 45 20 61 20 49 53 20 4e 55 4c 4c 20  WHERE a IS NULL 
f740: 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70  ) }.} {.  do_exp
f750: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34  r_test e_expr-34
f760: 2e 32 2e 24 74 6e 20 24 65 78 70 72 20 69 6e 74  .2.$tn $expr int
f770: 65 67 65 72 20 31 0a 7d 0a 0a 23 20 45 56 49 44  eger 1.}..# EVID
f780: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 36 37 33  ENCE-OF: R-19673
f790: 2d 34 30 39 37 32 20 49 66 20 65 78 65 63 75 74  -40972 If execut
f7a0: 69 6e 67 20 74 68 65 20 53 45 4c 45 43 54 20 77  ing the SELECT w
f7b0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f 0a 23  ould return no.#
f7c0: 20 72 6f 77 73 20 61 74 20 61 6c 6c 2c 20 74 68   rows at all, th
f7d0: 65 6e 20 74 68 65 20 45 58 49 53 54 53 20 6f 70  en the EXISTS op
f7e0: 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73  erator evaluates
f7f0: 20 74 6f 20 30 2e 0a 23 0a 66 6f 72 65 61 63 68   to 0..#.foreach
f800: 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20   {tn expr} {.   
f810: 20 31 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   1 { EXISTS ( SE
f820: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57  LECT a FROM t1 W
f830: 48 45 52 45 20 30 29 20 7d 0a 20 20 20 20 32 20  HERE 0) }.    2 
f840: 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43  { EXISTS ( SELEC
f850: 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T b FROM t1 WHER
f860: 45 20 61 20 3d 20 35 29 20 7d 0a 20 20 20 20 33  E a = 5) }.    3
f870: 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45   { EXISTS ( SELE
f880: 43 54 20 32 34 20 57 48 45 52 45 20 30 29 20 7d  CT 24 WHERE 0) }
f890: 0a 20 20 20 20 34 20 7b 20 45 58 49 53 54 53 20  .    4 { EXISTS 
f8a0: 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 57 48  ( SELECT NULL WH
f8b0: 45 52 45 20 31 3d 32 29 20 7d 0a 7d 20 7b 0a 20  ERE 1=2) }.} {. 
f8c0: 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f   do_expr_test e_
f8d0: 65 78 70 72 2d 33 34 2e 33 2e 24 74 6e 20 24 65  expr-34.3.$tn $e
f8e0: 78 70 72 20 69 6e 74 65 67 65 72 20 30 0a 7d 0a  xpr integer 0.}.
f8f0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
f900: 52 2d 33 35 31 30 39 2d 34 39 31 33 39 20 54 68  R-35109-49139 Th
f910: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
f920: 6d 6e 73 20 69 6e 20 65 61 63 68 20 72 6f 77 20  mns in each row 
f930: 72 65 74 75 72 6e 65 64 0a 23 20 62 79 20 74 68  returned.# by th
f940: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
f950: 6e 74 20 28 69 66 20 61 6e 79 29 20 61 6e 64 20  nt (if any) and 
f960: 74 68 65 20 73 70 65 63 69 66 69 63 20 76 61 6c  the specific val
f970: 75 65 73 20 72 65 74 75 72 6e 65 64 20 68 61 76  ues returned hav
f980: 65 0a 23 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e  e.# no effect on
f990: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
f9a0: 74 68 65 20 45 58 49 53 54 53 20 6f 70 65 72 61  the EXISTS opera
f9b0: 74 6f 72 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  tor..#.foreach {
f9c0: 74 6e 20 65 78 70 72 20 72 65 73 7d 20 7b 0a 20  tn expr res} {. 
f9d0: 20 20 20 31 20 7b 20 45 58 49 53 54 53 20 28 20     1 { EXISTS ( 
f9e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
f9f0: 20 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20   ) }            
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
fa10: 20 20 20 20 32 20 7b 20 45 58 49 53 54 53 20 28      2 { EXISTS (
fa20: 20 53 45 4c 45 43 54 20 2a 2c 20 2a 2c 20 2a 20   SELECT *, *, * 
fa30: 46 52 4f 4d 20 74 31 20 29 20 7d 20 20 20 20 20  FROM t1 ) }     
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
fa50: 0a 20 20 20 20 33 20 7b 20 45 58 49 53 54 53 20  .    3 { EXISTS 
fa60: 28 20 53 45 4c 45 43 54 20 32 34 2c 20 32 35 20  ( SELECT 24, 25 
fa70: 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ) }             
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 31 0a 20 20 20 20 34 20 7b 20 45 58 49 53 54 53  1.    4 { EXISTS
faa0: 20 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   ( SELECT NULL, 
fab0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 29 20 7d 20 20  NULL, NULL ) }  
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fad0: 20 31 0a 20 20 20 20 35 20 7b 20 45 58 49 53 54   1.    5 { EXIST
fae0: 53 20 28 20 53 45 4c 45 43 54 20 61 2c 62 2c 61  S ( SELECT a,b,a
faf0: 7c 7c 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ||b FROM t1 WHER
fb00: 45 20 61 20 49 53 20 4e 55 4c 4c 20 29 20 7d 20  E a IS NULL ) } 
fb10: 20 20 31 0a 0a 20 20 20 20 36 20 7b 20 45 58 49    1..    6 { EXI
fb20: 53 54 53 20 28 20 53 45 4c 45 43 54 20 61 2c 20  STS ( SELECT a, 
fb30: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
fb40: 30 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0) }            
fb50: 20 20 20 20 30 0a 20 20 20 20 37 20 7b 20 45 58      0.    7 { EX
fb60: 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 62 2c  ISTS ( SELECT b,
fb70: 20 62 2c 20 61 20 46 52 4f 4d 20 74 31 20 57 48   b, a FROM t1 WH
fb80: 45 52 45 20 61 20 3d 20 35 29 20 7d 20 20 20 20  ERE a = 5) }    
fb90: 20 20 20 20 20 30 0a 20 20 20 20 38 20 7b 20 45       0.    8 { E
fba0: 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 32  XISTS ( SELECT 2
fbb0: 34 2c 20 34 36 2c 20 38 39 20 57 48 45 52 45 20  4, 46, 89 WHERE 
fbc0: 30 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0) }            
fbd0: 20 20 20 20 20 20 30 0a 20 20 20 20 39 20 7b 20        0.    9 { 
fbe0: 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
fbf0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 57 48 45 52 45  NULL, NULL WHERE
fc00: 20 31 3d 32 29 20 7d 20 20 20 20 20 20 20 20 20   1=2) }         
fc10: 20 20 20 20 20 20 20 30 0a 7d 20 7b 0a 20 20 64         0.} {.  d
fc20: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
fc30: 70 72 2d 33 34 2e 34 2e 24 74 6e 20 24 65 78 70  pr-34.4.$tn $exp
fc40: 72 20 69 6e 74 65 67 65 72 20 24 72 65 73 0a 7d  r integer $res.}
fc50: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
fc60: 20 52 2d 31 30 36 34 35 2d 31 32 34 33 39 20 49   R-10645-12439 I
fc70: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 72 6f  n particular, ro
fc80: 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55  ws containing NU
fc90: 4c 4c 20 76 61 6c 75 65 73 0a 23 20 61 72 65 20  LL values.# are 
fca0: 6e 6f 74 20 68 61 6e 64 6c 65 64 20 61 6e 79 20  not handled any 
fcb0: 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
fcc0: 20 72 6f 77 73 20 77 69 74 68 6f 75 74 20 4e 55   rows without NU
fcd0: 4c 4c 20 76 61 6c 75 65 73 2e 0a 23 0a 66 6f 72  LL values..#.for
fce0: 65 61 63 68 20 7b 74 6e 20 65 31 20 65 32 7d 20  each {tn e1 e2} 
fcf0: 7b 0a 20 20 31 20 7b 20 45 58 49 53 54 53 20 28  {.  1 { EXISTS (
fd00: 53 45 4c 45 43 54 20 27 6e 6f 74 20 6e 75 6c 6c  SELECT 'not null
fd10: 27 29 20 7d 20 20 20 20 7b 20 45 58 49 53 54 53  ') }    { EXISTS
fd20: 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d   (SELECT NULL) }
fd30: 0a 20 20 32 20 7b 20 45 58 49 53 54 53 20 28 53  .  2 { EXISTS (S
fd40: 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20  ELECT NULL FROM 
fd50: 74 31 29 20 7d 20 20 7b 20 45 58 49 53 54 53 20  t1) }  { EXISTS 
fd60: 28 53 45 4c 45 43 54 20 27 62 72 65 61 64 27 20  (SELECT 'bread' 
fd70: 46 52 4f 4d 20 74 31 29 20 7d 0a 7d 20 7b 0a 20  FROM t1) }.} {. 
fd80: 20 73 65 74 20 72 65 73 20 5b 64 62 20 6f 6e 65   set res [db one
fd90: 20 22 53 45 4c 45 43 54 20 24 65 31 22 5d 0a 20   "SELECT $e1"]. 
fda0: 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f   do_expr_test e_
fdb0: 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d 61  expr-34.5.${tn}a
fdc0: 20 24 65 31 20 69 6e 74 65 67 65 72 20 24 72 65   $e1 integer $re
fdd0: 73 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  s.  do_expr_test
fde0: 20 65 5f 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74   e_expr-34.5.${t
fdf0: 6e 7d 62 20 24 65 32 20 69 6e 74 65 67 65 72 20  n}b $e2 integer 
fe00: 24 72 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  $res.}..#-------
fe10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe50: 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65 6d  --.# Test statem
fe60: 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20  ents related to 
fe70: 73 63 61 6c 61 72 20 73 75 62 2d 71 75 65 72 69  scalar sub-queri
fe80: 65 73 2e 0a 23 0a 0a 63 61 74 63 68 20 7b 20 64  es..#..catch { d
fe90: 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64  b close }.forced
fea0: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 73 71  elete test.db.sq
feb0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
fec0: 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  .do_test e_expr-
fed0: 33 35 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  35.0 {.  execsql
fee0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
fef0: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
ff00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
ff10: 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27   VALUES('one', '
ff20: 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  two');.    INSER
ff30: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
ff40: 28 27 74 68 72 65 65 27 2c 20 4e 55 4c 4c 29 3b  ('three', NULL);
ff50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
ff60: 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20 35 2e   t2 VALUES(4, 5.
ff70: 30 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20  0);.  }.} {}..# 
ff80: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
ff90: 30 39 38 30 2d 33 39 32 35 36 20 41 20 53 45 4c  0980-39256 A SEL
ffa0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 65 6e  ECT statement en
ffb0: 63 6c 6f 73 65 64 20 69 6e 20 70 61 72 65 6e 74  closed in parent
ffc0: 68 65 73 65 73 0a 23 20 6d 61 79 20 61 70 70 65  heses.# may appe
ffd0: 61 72 20 61 73 20 61 20 73 63 61 6c 61 72 20 71  ar as a scalar q
ffe0: 75 61 6e 74 69 74 79 2e 0a 23 0a 23 20 45 56 49  uantity..#.# EVI
fff0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 32 39  DENCE-OF: R-5629
10000 34 2d 30 33 39 36 36 20 41 6c 6c 20 74 79 70 65  4-03966 All type
10010 73 20 6f 66 20 53 45 4c 45 43 54 20 73 74 61 74  s of SELECT stat
10020 65 6d 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  ement, including
10030 0a 23 20 61 67 67 72 65 67 61 74 65 20 61 6e 64  .# aggregate and
10040 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
10050 20 71 75 65 72 69 65 73 20 28 71 75 65 72 69 65   queries (querie
10060 73 20 77 69 74 68 20 6b 65 79 77 6f 72 64 73 20  s with keywords 
10070 6c 69 6b 65 0a 23 20 55 4e 49 4f 4e 20 6f 72 20  like.# UNION or 
10080 45 58 43 45 50 54 29 20 61 72 65 20 61 6c 6c 6f  EXCEPT) are allo
10090 77 65 64 20 61 73 20 73 63 61 6c 61 72 20 73 75  wed as scalar su
100a0 62 71 75 65 72 69 65 73 2e 0a 23 0a 64 6f 5f 65  bqueries..#.do_e
100b0 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
100c0 33 35 2e 31 2e 31 20 7b 20 28 53 45 4c 45 43 54  35.1.1 { (SELECT
100d0 20 33 35 29 20 20 20 7d 20 69 6e 74 65 67 65 72   35)   } integer
100e0 20 33 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74   35.do_expr_test
100f0 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e 32 20 7b   e_expr-35.1.2 {
10100 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d   (SELECT NULL) }
10110 20 6e 75 6c 6c 20 7b 7d 0a 0a 64 6f 5f 65 78 70   null {}..do_exp
10120 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35  r_test e_expr-35
10130 2e 31 2e 33 20 7b 20 28 53 45 4c 45 43 54 20 63  .1.3 { (SELECT c
10140 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
10150 20 7d 20 69 6e 74 65 67 65 72 20 33 0a 64 6f 5f   } integer 3.do_
10160 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
10170 2d 33 35 2e 31 2e 34 20 7b 20 28 53 45 4c 45 43  -35.1.4 { (SELEC
10180 54 20 34 20 46 52 4f 4d 20 74 32 29 20 7d 20 69  T 4 FROM t2) } i
10190 6e 74 65 67 65 72 20 34 0a 0a 64 6f 5f 65 78 70  nteger 4..do_exp
101a0 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35  r_test e_expr-35
101b0 2e 31 2e 35 20 7b 20 0a 20 20 28 53 45 4c 45 43  .1.5 { .  (SELEC
101c0 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
101d0 4e 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f  N SELECT a+1 FRO
101e0 4d 20 74 32 29 0a 7d 20 6e 75 6c 6c 20 7b 7d 0a  M t2).} null {}.
101f0 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
10200 78 70 72 2d 33 35 2e 31 2e 36 20 7b 20 0a 20 20  xpr-35.1.6 { .  
10210 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74  (SELECT a FROM t
10220 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 43  2 UNION SELECT C
10230 4f 41 4c 45 53 43 45 28 62 2c 20 35 35 29 20 46  OALESCE(b, 55) F
10240 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
10250 31 29 0a 7d 20 69 6e 74 65 67 65 72 20 34 0a 0a  1).} integer 4..
10260 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
10270 2d 34 36 38 39 39 2d 35 33 37 36 35 20 41 20 53  -46899-53765 A S
10280 45 4c 45 43 54 20 75 73 65 64 20 61 73 20 61 20  ELECT used as a 
10290 73 63 61 6c 61 72 20 71 75 61 6e 74 69 74 79 20  scalar quantity 
102a0 6d 75 73 74 0a 23 20 72 65 74 75 72 6e 20 61 20  must.# return a 
102b0 72 65 73 75 6c 74 20 73 65 74 20 77 69 74 68 20  result set with 
102c0 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
102d0 0a 23 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  .#.# The followi
102e0 6e 67 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 74  ng block tests t
102f0 68 61 74 20 65 72 72 6f 72 73 20 61 72 65 20 72  hat errors are r
10300 65 74 75 72 6e 65 64 20 69 6e 20 61 20 62 75 6e  eturned in a bun
10310 63 68 20 6f 66 20 63 61 73 65 73 0a 23 20 77 68  ch of cases.# wh
10320 65 72 65 20 61 20 73 75 62 71 75 65 72 79 20 72  ere a subquery r
10330 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
10340 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 73   one column..#.s
10350 65 74 20 4d 20 7b 6f 6e 6c 79 20 61 20 73 69 6e  et M {only a sin
10360 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
10370 65 64 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  ed for a SELECT 
10380 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
10390 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 7d 0a 66  an expression}.f
103a0 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20  oreach {tn sql} 
103b0 7b 0a 20 20 31 20 20 20 20 20 7b 20 53 45 4c 45  {.  1     { SELE
103c0 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  CT (SELECT * FRO
103d0 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
103e0 54 20 61 2b 31 2c 20 62 2b 31 20 46 52 4f 4d 20  T a+1, b+1 FROM 
103f0 74 32 29 20 7d 0a 20 20 32 20 20 20 20 20 7b 20  t2) }.  2     { 
10400 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 2a  SELECT (SELECT *
10410 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
10420 45 4c 45 43 54 20 61 2b 31 2c 20 62 2b 31 20 46  ELECT a+1, b+1 F
10430 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
10440 31 29 20 7d 0a 20 20 33 20 20 20 20 20 7b 20 53  1) }.  3     { S
10450 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 31 2c  ELECT (SELECT 1,
10460 20 32 29 20 7d 0a 20 20 34 20 20 20 20 20 7b 20   2) }.  4     { 
10470 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 4e  SELECT (SELECT N
10480 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
10490 20 7d 0a 20 20 35 20 20 20 20 20 7b 20 53 45 4c   }.  5     { SEL
104a0 45 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46 52  ECT (SELECT * FR
104b0 4f 4d 20 74 32 29 20 7d 0a 20 20 36 20 20 20 20  OM t2) }.  6    
104c0 20 7b 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43   { SELECT (SELEC
104d0 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
104e0 20 31 2c 20 32 2c 20 33 29 29 20 7d 0a 7d 20 7b   1, 2, 3)) }.} {
104f0 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  .  do_catchsql_t
10500 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 32 2e  est e_expr-35.2.
10510 24 74 6e 20 24 73 71 6c 20 5b 6c 69 73 74 20 31  $tn $sql [list 1
10520 20 24 4d 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e   $M].}..# EVIDEN
10530 43 45 2d 4f 46 3a 20 52 2d 33 35 37 36 34 2d 32  CE-OF: R-35764-2
10540 38 30 34 31 20 54 68 65 20 72 65 73 75 6c 74 20  8041 The result 
10550 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
10560 6e 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 23  n is the value.#
10570 20 6f 66 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c   of the only col
10580 75 6d 6e 20 69 6e 20 74 68 65 20 66 69 72 73 74  umn in the first
10590 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79   row returned by
105a0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
105b0 65 6d 65 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45  ement..#.# EVIDE
105c0 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 38 39 38 2d  NCE-OF: R-41898-
105d0 30 36 36 38 36 20 49 66 20 74 68 65 20 53 45 4c  06686 If the SEL
105e0 45 43 54 20 79 69 65 6c 64 73 20 6d 6f 72 65 20  ECT yields more 
105f0 74 68 61 6e 20 6f 6e 65 20 72 65 73 75 6c 74 0a  than one result.
10600 23 20 72 6f 77 2c 20 61 6c 6c 20 72 6f 77 73 20  # row, all rows 
10610 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
10620 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64  are ignored..#.d
10630 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
10640 5f 65 78 70 72 2d 33 36 2e 33 2e 31 20 7b 0a 20  _expr-36.3.1 {. 
10650 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34   CREATE TABLE t4
10660 28 78 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52 54  (x, y);.  INSERT
10670 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
10680 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53  1, 'one');.  INS
10690 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
106a0 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20  ES(2, 'two');.  
106b0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
106c0 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65 27  ALUES(3, 'three'
106d0 29 3b 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68  );.} {}..foreach
106e0 20 7b 74 6e 20 65 78 70 72 20 72 65 73 74 79 70   {tn expr restyp
106f0 65 20 72 65 73 76 61 6c 7d 20 7b 0a 20 20 20 20  e resval} {.    
10700 32 20 20 7b 20 28 20 53 45 4c 45 43 54 20 78 20  2  { ( SELECT x 
10710 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20 42 59  FROM t4 ORDER BY
10720 20 78 20 29 20 20 20 20 20 20 7d 20 20 20 20 20   x )      }     
10730 20 20 20 69 6e 74 65 67 65 72 20 31 0a 20 20 20     integer 1.   
10740 20 33 20 20 7b 20 28 20 53 45 4c 45 43 54 20 78   3  { ( SELECT x
10750 20 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20 42   FROM t4 ORDER B
10760 59 20 79 20 29 20 20 20 20 20 20 7d 20 20 20 20  Y y )      }    
10770 20 20 20 20 69 6e 74 65 67 65 72 20 31 0a 20 20      integer 1.  
10780 20 20 34 20 20 7b 20 28 20 53 45 4c 45 43 54 20    4  { ( SELECT 
10790 78 20 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20  x FROM t4 ORDER 
107a0 42 59 20 78 20 44 45 53 43 20 29 20 7d 20 20 20  BY x DESC ) }   
107b0 20 20 20 20 20 69 6e 74 65 67 65 72 20 33 0a 20       integer 3. 
107c0 20 20 20 35 20 20 7b 20 28 20 53 45 4c 45 43 54     5  { ( SELECT
107d0 20 78 20 46 52 4f 4d 20 74 34 20 4f 52 44 45 52   x FROM t4 ORDER
107e0 20 42 59 20 79 20 44 45 53 43 20 29 20 7d 20 20   BY y DESC ) }  
107f0 20 20 20 20 20 20 69 6e 74 65 67 65 72 20 32 0a        integer 2.
10800 20 20 20 20 36 20 20 7b 20 28 20 53 45 4c 45 43      6  { ( SELEC
10810 54 20 79 20 46 52 4f 4d 20 74 34 20 4f 52 44 45  T y FROM t4 ORDE
10820 52 20 42 59 20 79 20 44 45 53 43 20 29 20 7d 20  R BY y DESC ) } 
10830 20 20 20 20 20 20 20 74 65 78 74 20 20 20 20 74         text    t
10840 77 6f 0a 0a 20 20 20 20 37 20 20 7b 20 28 20 53  wo..    7  { ( S
10850 45 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f  ELECT sum(x) FRO
10860 4d 20 74 34 20 29 20 20 20 20 20 20 20 20 20 20  M t4 )          
10870 20 7d 20 20 20 20 20 20 20 20 20 69 6e 74 65 67   }         integ
10880 65 72 20 36 0a 20 20 20 20 38 20 20 7b 20 28 20  er 6.    8  { ( 
10890 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
108a0 63 61 74 28 79 2c 27 27 29 20 46 52 4f 4d 20 74  cat(y,'') FROM t
108b0 34 20 29 20 7d 20 20 20 20 20 20 20 74 65 78 74  4 ) }       text
108c0 20 20 20 20 6f 6e 65 74 77 6f 74 68 72 65 65 0a      onetwothree.
108d0 20 20 20 20 39 20 20 7b 20 28 20 53 45 4c 45 43      9  { ( SELEC
108e0 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 74 34  T max(x) FROM t4
108f0 20 57 48 45 52 45 20 79 20 4c 49 4b 45 20 27 5f   WHERE y LIKE '_
10900 5f 5f 27 29 20 7d 20 69 6e 74 65 67 65 72 20 32  __') } integer 2
10910 20 0a 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70 72   ..} {.  do_expr
10920 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 36 2e  _test e_expr-36.
10930 33 2e 24 74 6e 20 24 65 78 70 72 20 24 72 65 73  3.$tn $expr $res
10940 74 79 70 65 20 24 72 65 73 76 61 6c 0a 7d 0a 0a  type $resval.}..
10950 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
10960 2d 32 35 34 39 32 2d 34 31 35 37 32 20 49 66 20  -25492-41572 If 
10970 74 68 65 20 53 45 4c 45 43 54 20 79 69 65 6c 64  the SELECT yield
10980 73 20 6e 6f 20 72 6f 77 73 2c 20 74 68 65 6e 20  s no rows, then 
10990 74 68 65 0a 23 20 76 61 6c 75 65 20 6f 66 20 74  the.# value of t
109a0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
109b0 20 4e 55 4c 4c 2e 0a 23 0a 66 6f 72 65 61 63 68   NULL..#.foreach
109c0 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20   {tn expr} {.   
109d0 20 31 20 20 7b 20 28 20 53 45 4c 45 43 54 20 78   1  { ( SELECT x
109e0 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 78   FROM t4 WHERE x
109f0 3e 33 20 4f 52 44 45 52 20 42 59 20 78 20 29 20  >3 ORDER BY x ) 
10a00 20 20 20 20 20 7d 0a 20 20 20 20 32 20 20 7b 20       }.    2  { 
10a10 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20  ( SELECT x FROM 
10a20 74 34 20 57 48 45 52 45 20 79 3c 27 6f 6e 65 27  t4 WHERE y<'one'
10a30 20 4f 52 44 45 52 20 42 59 20 79 20 29 20 20 7d   ORDER BY y )  }
10a40 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70 72 5f 74  .} {.  do_expr_t
10a50 65 73 74 20 65 5f 65 78 70 72 2d 33 36 2e 34 2e  est e_expr-36.4.
10a60 24 74 6e 20 24 65 78 70 72 20 6e 75 6c 6c 20 7b  $tn $expr null {
10a70 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  }.}..# EVIDENCE-
10a80 4f 46 3a 20 52 2d 36 32 34 37 37 2d 30 36 34 37  OF: R-62477-0647
10a90 36 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  6 For example, t
10aa0 68 65 20 76 61 6c 75 65 73 20 4e 55 4c 4c 2c 20  he values NULL, 
10ab0 30 2e 30 2c 20 30 2c 0a 23 20 27 65 6e 67 6c 69  0.0, 0,.# 'engli
10ac0 73 68 27 20 61 6e 64 20 27 30 27 20 61 72 65 20  sh' and '0' are 
10ad0 61 6c 6c 20 63 6f 6e 73 69 64 65 72 65 64 20 74  all considered t
10ae0 6f 20 62 65 20 66 61 6c 73 65 2e 0a 23 0a 64 6f  o be false..#.do
10af0 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
10b00 65 78 70 72 2d 33 37 2e 31 20 7b 0a 20 20 20 53  expr-37.1 {.   S
10b10 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20  ELECT CASE WHEN 
10b20 4e 55 4c 4c 20 54 48 45 4e 20 27 74 72 75 65 27  NULL THEN 'true'
10b30 20 45 4c 53 45 20 27 66 61 6c 73 65 27 20 45 4e   ELSE 'false' EN
10b40 44 3b 0a 7d 20 7b 66 61 6c 73 65 7d 0a 64 6f 5f  D;.} {false}.do_
10b50 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
10b60 78 70 72 2d 33 37 2e 32 20 7b 0a 20 20 20 53 45  xpr-37.2 {.   SE
10b70 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 30  LECT CASE WHEN 0
10b80 2e 30 20 54 48 45 4e 20 27 74 72 75 65 27 20 45  .0 THEN 'true' E
10b90 4c 53 45 20 27 66 61 6c 73 65 27 20 45 4e 44 3b  LSE 'false' END;
10ba0 0a 7d 20 7b 66 61 6c 73 65 7d 0a 64 6f 5f 65 78  .} {false}.do_ex
10bb0 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
10bc0 72 2d 33 37 2e 33 20 7b 0a 20 20 20 53 45 4c 45  r-37.3 {.   SELE
10bd0 43 54 20 43 41 53 45 20 57 48 45 4e 20 30 20 54  CT CASE WHEN 0 T
10be0 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20  HEN 'true' ELSE 
10bf0 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b  'false' END;.} {
10c00 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63 73 71  false}.do_execsq
10c10 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37  l_test e_expr-37
10c20 2e 34 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43  .4 {.   SELECT C
10c30 41 53 45 20 57 48 45 4e 20 27 65 6e 67 6c 69 67  ASE WHEN 'englig
10c40 68 27 20 54 48 45 4e 20 27 74 72 75 65 27 20 45  h' THEN 'true' E
10c50 4c 53 45 20 27 66 61 6c 73 65 27 20 45 4e 44 3b  LSE 'false' END;
10c60 0a 7d 20 7b 66 61 6c 73 65 7d 0a 64 6f 5f 65 78  .} {false}.do_ex
10c70 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
10c80 72 2d 33 37 2e 35 20 7b 0a 20 20 20 53 45 4c 45  r-37.5 {.   SELE
10c90 43 54 20 43 41 53 45 20 57 48 45 4e 20 27 30 27  CT CASE WHEN '0'
10ca0 20 54 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53   THEN 'true' ELS
10cb0 45 20 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d  E 'false' END;.}
10cc0 20 7b 66 61 6c 73 65 7d 0a 0a 23 20 45 56 49 44   {false}..# EVID
10cd0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 32  ENCE-OF: R-55532
10ce0 2d 31 30 31 30 38 20 56 61 6c 75 65 73 20 31 2c  -10108 Values 1,
10cf0 20 31 2e 30 2c 20 30 2e 31 2c 20 2d 30 2e 31 20   1.0, 0.1, -0.1 
10d00 61 6e 64 20 27 31 65 6e 67 6c 69 73 68 27 20 61  and '1english' a
10d10 72 65 0a 23 20 63 6f 6e 73 69 64 65 72 65 64 20  re.# considered 
10d20 74 6f 20 62 65 20 74 72 75 65 2e 0a 23 0a 64 6f  to be true..#.do
10d30 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
10d40 65 78 70 72 2d 33 37 2e 36 20 7b 0a 20 20 20 53  expr-37.6 {.   S
10d50 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20  ELECT CASE WHEN 
10d60 31 20 54 48 45 4e 20 27 74 72 75 65 27 20 45 4c  1 THEN 'true' EL
10d70 53 45 20 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a  SE 'false' END;.
10d80 7d 20 7b 74 72 75 65 7d 0a 64 6f 5f 65 78 65 63  } {true}.do_exec
10d90 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
10da0 33 37 2e 37 20 7b 0a 20 20 20 53 45 4c 45 43 54  37.7 {.   SELECT
10db0 20 43 41 53 45 20 57 48 45 4e 20 31 2e 30 20 54   CASE WHEN 1.0 T
10dc0 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20  HEN 'true' ELSE 
10dd0 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b  'false' END;.} {
10de0 74 72 75 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  true}.do_execsql
10df0 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37 2e  _test e_expr-37.
10e00 38 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43 41  8 {.   SELECT CA
10e10 53 45 20 57 48 45 4e 20 30 2e 31 20 54 48 45 4e  SE WHEN 0.1 THEN
10e20 20 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61   'true' ELSE 'fa
10e30 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75  lse' END;.} {tru
10e40 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e}.do_execsql_te
10e50 73 74 20 65 5f 65 78 70 72 2d 33 37 2e 39 20 7b  st e_expr-37.9 {
10e60 0a 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  .   SELECT CASE 
10e70 57 48 45 4e 20 2d 30 2e 31 20 54 48 45 4e 20 27  WHEN -0.1 THEN '
10e80 74 72 75 65 27 20 45 4c 53 45 20 27 66 61 6c 73  true' ELSE 'fals
10e90 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d  e' END;.} {true}
10ea0 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
10eb0 20 65 5f 65 78 70 72 2d 33 37 2e 31 30 20 7b 0a   e_expr-37.10 {.
10ec0 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57     SELECT CASE W
10ed0 48 45 4e 20 27 31 65 6e 67 6c 69 73 68 27 20 54  HEN '1english' T
10ee0 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20  HEN 'true' ELSE 
10ef0 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b  'false' END;.} {
10f00 74 72 75 65 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74  true}...finish_t
10f10 65 73 74 0a                                      est.