/ Hex Artifact Content
Login

Artifact 03a84a6fa9bd3472112d6bd4599f5269f5f74803:


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 33 32 34 33 34 2d 30 39 30 39 32 20 49   R-32434-09092 I
c880: 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65  f the value of e
c890: 78 70 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  xpr is NULL, the
c8a0: 6e 20 74 68 65 0a 23 20 72 65 73 75 6c 74 20 6f  n the.# result o
c8b0: 66 20 74 68 65 20 43 41 53 54 20 65 78 70 72 65  f the CAST expre
c8c0: 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 4e 55  ssion is also NU
c8d0: 4c 4c 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65  LL..#.do_expr_te
c8e0: 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 32 2e 31  st e_expr-27.2.1
c8f0: 20 7b 20 43 41 53 54 28 4e 55 4c 4c 20 41 53 20   { CAST(NULL AS 
c900: 69 6e 74 65 67 65 72 29 20 7d 20 6e 75 6c 6c 20  integer) } null 
c910: 7b 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  {}.do_expr_test 
c920: 65 5f 65 78 70 72 2d 32 37 2e 32 2e 32 20 7b 20  e_expr-27.2.2 { 
c930: 43 41 53 54 28 4e 55 4c 4c 20 41 53 20 74 65 78  CAST(NULL AS tex
c940: 74 29 20 7d 20 20 20 20 6e 75 6c 6c 20 7b 7d 0a  t) }    null {}.
c950: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
c960: 78 70 72 2d 32 37 2e 32 2e 33 20 7b 20 43 41 53  xpr-27.2.3 { CAS
c970: 54 28 4e 55 4c 4c 20 41 53 20 62 6c 6f 62 29 20  T(NULL AS blob) 
c980: 7d 20 20 20 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f  }    null {}.do_
c990: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
c9a0: 2d 32 37 2e 32 2e 34 20 7b 20 43 41 53 54 28 4e  -27.2.4 { CAST(N
c9b0: 55 4c 4c 20 41 53 20 6e 75 6d 62 65 72 29 20 7d  ULL AS number) }
c9c0: 20 20 6e 75 6c 6c 20 7b 7d 0a 0a 23 20 45 56 49    null {}..# EVI
c9d0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 35 32  DENCE-OF: R-4352
c9e0: 32 2d 33 35 35 34 38 20 43 61 73 74 69 6e 67 20  2-35548 Casting 
c9f0: 61 20 76 61 6c 75 65 20 74 6f 20 61 20 74 79 70  a value to a typ
ca00: 65 2d 6e 61 6d 65 20 77 69 74 68 20 6e 6f 0a 23  e-name with no.#
ca10: 20 61 66 66 69 6e 69 74 79 20 63 61 75 73 65 73   affinity causes
ca20: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
ca30: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
ca40: 61 20 42 4c 4f 42 2e 0a 23 0a 64 6f 5f 65 78 70  a BLOB..#.do_exp
ca50: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
ca60: 2e 33 2e 31 20 7b 20 43 41 53 54 28 27 61 62 63  .3.1 { CAST('abc
ca70: 27 20 41 53 20 62 6c 6f 62 29 20 20 20 20 20 20  ' AS blob)      
ca80: 20 7d 20 62 6c 6f 62 20 61 62 63 0a 64 6f 5f 65   } blob abc.do_e
ca90: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
caa0: 32 37 2e 33 2e 32 20 7b 20 43 41 53 54 28 27 64  27.3.2 { CAST('d
cab0: 65 66 27 20 41 53 20 73 68 6f 62 62 6c 6f 62 5f  ef' AS shobblob_
cac0: 78 29 20 7d 20 62 6c 6f 62 20 64 65 66 0a 64 6f  x) } blob def.do
cad0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
cae0: 72 2d 32 37 2e 33 2e 33 20 7b 20 43 41 53 54 28  r-27.3.3 { CAST(
caf0: 27 67 68 69 27 20 41 53 20 61 62 62 4c 4f 62 31  'ghi' AS abbLOb1
cb00: 30 29 20 20 20 7d 20 62 6c 6f 62 20 67 68 69 0a  0)   } blob ghi.
cb10: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
cb20: 52 2d 32 32 39 35 36 2d 33 37 37 35 34 20 43 61  R-22956-37754 Ca
cb30: 73 74 69 6e 67 20 74 6f 20 61 20 42 4c 4f 42 20  sting to a BLOB 
cb40: 63 6f 6e 73 69 73 74 73 20 6f 66 20 66 69 72 73  consists of firs
cb50: 74 20 63 61 73 74 69 6e 67 0a 23 20 74 68 65 20  t casting.# the 
cb60: 76 61 6c 75 65 20 74 6f 20 54 45 58 54 20 69 6e  value to TEXT in
cb70: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66   the encoding of
cb80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
cb90: 6e 6e 65 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 23  nnection, then.#
cba0: 20 69 6e 74 65 72 70 72 65 74 69 6e 67 20 74 68   interpreting th
cbb0: 65 20 72 65 73 75 6c 74 69 6e 67 20 62 79 74 65  e resulting byte
cbc0: 20 73 65 71 75 65 6e 63 65 20 61 73 20 61 20 42   sequence as a B
cbd0: 4c 4f 42 20 69 6e 73 74 65 61 64 20 6f 66 20 61  LOB instead of a
cbe0: 73 20 54 45 58 54 2e 0a 23 0a 64 6f 5f 71 65 78  s TEXT..#.do_qex
cbf0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
cc00: 37 2e 34 2e 31 20 7b 20 43 41 53 54 28 27 67 68  7.4.1 { CAST('gh
cc10: 69 27 20 41 53 20 62 6c 6f 62 29 20 7d 20 58 27  i' AS blob) } X'
cc20: 36 37 36 38 36 39 27 0a 64 6f 5f 71 65 78 70 72  676869'.do_qexpr
cc30: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
cc40: 34 2e 32 20 7b 20 43 41 53 54 28 34 35 36 20 41  4.2 { CAST(456 A
cc50: 53 20 62 6c 6f 62 29 20 7d 20 20 20 58 27 33 34  S blob) }   X'34
cc60: 33 35 33 36 27 0a 64 6f 5f 71 65 78 70 72 5f 74  3536'.do_qexpr_t
cc70: 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e  est e_expr-27.4.
cc80: 33 20 7b 20 43 41 53 54 28 31 2e 37 38 20 41 53  3 { CAST(1.78 AS
cc90: 20 62 6c 6f 62 29 20 7d 20 20 58 27 33 31 32 45   blob) }  X'312E
cca0: 33 37 33 38 27 0a 72 65 6e 61 6d 65 20 64 62 20  3738'.rename db 
ccb0: 64 62 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a  db2.sqlite3 db :
ccc0: 6d 65 6d 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c  memory:.ifcapabl
ccd0: 65 20 7b 75 74 66 31 36 7d 20 7b 0a 64 62 20 65  e {utf16} {.db e
cce0: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63  val { PRAGMA enc
ccf0: 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c  oding = 'utf-16l
cd00: 65 27 20 7d 0a 64 6f 5f 71 65 78 70 72 5f 74 65  e' }.do_qexpr_te
cd10: 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 34  st e_expr-27.4.4
cd20: 20 7b 20 43 41 53 54 28 27 67 68 69 27 20 41 53   { CAST('ghi' AS
cd30: 20 62 6c 6f 62 29 20 7d 20 58 27 36 37 30 30 36   blob) } X'67006
cd40: 38 30 30 36 39 30 30 27 0a 64 6f 5f 71 65 78 70  8006900'.do_qexp
cd50: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
cd60: 2e 34 2e 35 20 7b 20 43 41 53 54 28 34 35 36 20  .4.5 { CAST(456 
cd70: 41 53 20 62 6c 6f 62 29 20 7d 20 20 20 58 27 33  AS blob) }   X'3
cd80: 34 30 30 33 35 30 30 33 36 30 30 27 0a 64 6f 5f  40035003600'.do_
cd90: 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  qexpr_test e_exp
cda0: 72 2d 32 37 2e 34 2e 36 20 7b 20 43 41 53 54 28  r-27.4.6 { CAST(
cdb0: 31 2e 37 38 20 41 53 20 62 6c 6f 62 29 20 7d 20  1.78 AS blob) } 
cdc0: 20 58 27 33 31 30 30 32 45 30 30 33 37 30 30 33   X'31002E0037003
cdd0: 38 30 30 27 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a  800'.}.db close.
cde0: 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f  sqlite3 db :memo
cdf0: 72 79 3a 0a 64 62 20 65 76 61 6c 20 7b 20 50 52  ry:.db eval { PR
ce00: 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20  AGMA encoding = 
ce10: 27 75 74 66 2d 31 36 62 65 27 20 7d 0a 69 66 63  'utf-16be' }.ifc
ce20: 61 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b  apable {utf16} {
ce30: 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65  .do_qexpr_test e
ce40: 5f 65 78 70 72 2d 32 37 2e 34 2e 37 20 7b 20 43  _expr-27.4.7 { C
ce50: 41 53 54 28 27 67 68 69 27 20 41 53 20 62 6c 6f  AST('ghi' AS blo
ce60: 62 29 20 7d 20 58 27 30 30 36 37 30 30 36 38 30  b) } X'006700680
ce70: 30 36 39 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65  069'.do_qexpr_te
ce80: 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 38  st e_expr-27.4.8
ce90: 20 7b 20 43 41 53 54 28 34 35 36 20 41 53 20 62   { CAST(456 AS b
cea0: 6c 6f 62 29 20 7d 20 20 20 58 27 30 30 33 34 30  lob) }   X'00340
ceb0: 30 33 35 30 30 33 36 27 0a 64 6f 5f 71 65 78 70  0350036'.do_qexp
cec0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
ced0: 2e 34 2e 39 20 7b 20 43 41 53 54 28 31 2e 37 38  .4.9 { CAST(1.78
cee0: 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 58 27 30   AS blob) }  X'0
cef0: 30 33 31 30 30 32 45 30 30 33 37 30 30 33 38 27  031002E00370038'
cf00: 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61  .}.db close.rena
cf10: 6d 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49  me db2 db..# EVI
cf20: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 32 30  DENCE-OF: R-0420
cf30: 37 2d 33 37 39 38 31 20 54 6f 20 63 61 73 74 20  7-37981 To cast 
cf40: 61 20 42 4c 4f 42 20 76 61 6c 75 65 20 74 6f 20  a BLOB value to 
cf50: 54 45 58 54 2c 20 74 68 65 20 73 65 71 75 65 6e  TEXT, the sequen
cf60: 63 65 0a 23 20 6f 66 20 62 79 74 65 73 20 74 68  ce.# of bytes th
cf70: 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 42  at make up the B
cf80: 4c 4f 42 20 69 73 20 69 6e 74 65 72 70 72 65 74  LOB is interpret
cf90: 65 64 20 61 73 20 74 65 78 74 20 65 6e 63 6f 64  ed as text encod
cfa0: 65 64 20 75 73 69 6e 67 0a 23 20 74 68 65 20 64  ed using.# the d
cfb0: 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67  atabase encoding
cfc0: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
cfd0: 20 65 5f 65 78 70 72 2d 32 38 2e 31 2e 31 20 7b   e_expr-28.1.1 {
cfe0: 20 43 41 53 54 20 28 58 27 36 37 36 38 36 39 27   CAST (X'676869'
cff0: 20 41 53 20 74 65 78 74 29 20 7d 20 74 65 78 74   AS text) } text
d000: 20 67 68 69 0a 64 6f 5f 65 78 70 72 5f 74 65 73   ghi.do_expr_tes
d010: 74 20 65 5f 65 78 70 72 2d 32 38 2e 31 2e 32 20  t e_expr-28.1.2 
d020: 7b 20 43 41 53 54 20 28 58 27 36 37 30 30 36 38  { CAST (X'670068
d030: 30 30 36 39 30 30 27 20 41 53 20 74 65 78 74 29  006900' AS text)
d040: 20 7d 20 74 65 78 74 20 67 0a 72 65 6e 61 6d 65   } text g.rename
d050: 20 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33 20   db db2.sqlite3 
d060: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 64 62 20 65  db :memory:.db e
d070: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63  val { PRAGMA enc
d080: 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c  oding = 'utf-16l
d090: 65 27 20 7d 0a 69 66 63 61 70 61 62 6c 65 20 7b  e' }.ifcapable {
d0a0: 75 74 66 31 36 7d 20 7b 0a 64 6f 5f 65 78 70 72  utf16} {.do_expr
d0b0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e  _test e_expr-28.
d0c0: 31 2e 33 20 7b 20 43 41 53 54 20 28 58 27 36 37  1.3 { CAST (X'67
d0d0: 36 38 36 39 27 20 41 53 20 74 65 78 74 29 20 3d  6869' AS text) =
d0e0: 3d 20 27 67 68 69 27 20 7d 20 69 6e 74 65 67 65  = 'ghi' } intege
d0f0: 72 20 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  r 0.do_expr_test
d100: 20 65 5f 65 78 70 72 2d 32 38 2e 31 2e 34 20 7b   e_expr-28.1.4 {
d110: 20 43 41 53 54 20 28 58 27 36 37 30 30 36 38 30   CAST (X'6700680
d120: 30 36 39 30 30 27 20 41 53 20 74 65 78 74 29 20  06900' AS text) 
d130: 7d 20 74 65 78 74 20 67 68 69 0a 7d 0a 64 62 20  } text ghi.}.db 
d140: 63 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62 32  close.rename db2
d150: 20 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   db..# EVIDENCE-
d160: 4f 46 3a 20 52 2d 32 32 32 33 35 2d 34 37 30 30  OF: R-22235-4700
d170: 36 20 43 61 73 74 69 6e 67 20 61 6e 20 49 4e 54  6 Casting an INT
d180: 45 47 45 52 20 6f 72 20 52 45 41 4c 20 76 61 6c  EGER or REAL val
d190: 75 65 20 69 6e 74 6f 20 54 45 58 54 0a 23 20 72  ue into TEXT.# r
d1a0: 65 6e 64 65 72 73 20 74 68 65 20 76 61 6c 75 65  enders the value
d1b0: 20 61 73 20 69 66 20 76 69 61 20 73 71 6c 69 74   as if via sqlit
d1c0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20 65 78  e3_snprintf() ex
d1d0: 63 65 70 74 20 74 68 61 74 20 74 68 65 0a 23 20  cept that the.# 
d1e0: 72 65 73 75 6c 74 69 6e 67 20 54 45 58 54 20 75  resulting TEXT u
d1f0: 73 65 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  ses the encoding
d200: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d210: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23 0a 64   connection..#.d
d220: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d230: 70 72 2d 32 38 2e 32 2e 31 20 7b 20 43 41 53 54  pr-28.2.1 { CAST
d240: 20 28 31 20 41 53 20 74 65 78 74 29 20 20 20 7d   (1 AS text)   }
d250: 20 20 20 20 20 74 65 78 74 20 31 0a 64 6f 5f 65       text 1.do_e
d260: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
d270: 32 38 2e 32 2e 32 20 7b 20 43 41 53 54 20 28 34  28.2.2 { CAST (4
d280: 35 20 41 53 20 74 65 78 74 29 20 20 7d 20 20 20  5 AS text)  }   
d290: 20 20 74 65 78 74 20 34 35 0a 64 6f 5f 65 78 70    text 45.do_exp
d2a0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38  r_test e_expr-28
d2b0: 2e 32 2e 33 20 7b 20 43 41 53 54 20 28 2d 34 35  .2.3 { CAST (-45
d2c0: 20 41 53 20 74 65 78 74 29 20 7d 20 20 20 20 20   AS text) }     
d2d0: 74 65 78 74 20 2d 34 35 0a 64 6f 5f 65 78 70 72  text -45.do_expr
d2e0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e  _test e_expr-28.
d2f0: 32 2e 34 20 7b 20 43 41 53 54 20 28 38 2e 38 20  2.4 { CAST (8.8 
d300: 41 53 20 74 65 78 74 29 20 20 20 20 7d 20 20 74  AS text)    }  t
d310: 65 78 74 20 38 2e 38 0a 64 6f 5f 65 78 70 72 5f  ext 8.8.do_expr_
d320: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32  test e_expr-28.2
d330: 2e 35 20 7b 20 43 41 53 54 20 28 32 2e 33 65 2b  .5 { CAST (2.3e+
d340: 35 20 41 53 20 74 65 78 74 29 20 7d 20 20 74 65  5 AS text) }  te
d350: 78 74 20 32 33 30 30 30 30 2e 30 0a 64 6f 5f 65  xt 230000.0.do_e
d360: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
d370: 32 38 2e 32 2e 36 20 7b 20 43 41 53 54 20 28 2d  28.2.6 { CAST (-
d380: 32 2e 33 65 2d 35 20 41 53 20 74 65 78 74 29 20  2.3e-5 AS text) 
d390: 7d 20 74 65 78 74 20 2d 32 2e 33 65 2d 30 35 0a  } text -2.3e-05.
d3a0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d3b0: 78 70 72 2d 32 38 2e 32 2e 37 20 7b 20 43 41 53  xpr-28.2.7 { CAS
d3c0: 54 20 28 30 2e 30 20 41 53 20 74 65 78 74 29 20  T (0.0 AS text) 
d3d0: 7d 20 20 20 20 20 74 65 78 74 20 30 2e 30 0a 64  }     text 0.0.d
d3e0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d3f0: 70 72 2d 32 38 2e 32 2e 37 20 7b 20 43 41 53 54  pr-28.2.7 { CAST
d400: 20 28 30 20 41 53 20 74 65 78 74 29 20 7d 20 20   (0 AS text) }  
d410: 20 20 20 20 20 74 65 78 74 20 30 0a 0a 23 20 45       text 0..# E
d420: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36  VIDENCE-OF: R-26
d430: 33 34 36 2d 33 36 34 34 33 20 57 68 65 6e 20 63  346-36443 When c
d440: 61 73 74 69 6e 67 20 61 20 42 4c 4f 42 20 76 61  asting a BLOB va
d450: 6c 75 65 20 74 6f 20 61 20 52 45 41 4c 2c 20 74  lue to a REAL, t
d460: 68 65 0a 23 20 76 61 6c 75 65 20 69 73 20 66 69  he.# value is fi
d470: 72 73 74 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  rst converted to
d480: 20 54 45 58 54 2e 0a 23 0a 64 6f 5f 65 78 70 72   TEXT..#.do_expr
d490: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d4a0: 31 2e 31 20 7b 20 43 41 53 54 20 28 58 27 33 31  1.1 { CAST (X'31
d4b0: 32 45 33 32 33 33 27 20 41 53 20 52 45 41 4c 29  2E3233' AS REAL)
d4c0: 20 7d 20 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f   } real 1.23.do_
d4d0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d4e0: 2d 32 39 2e 31 2e 32 20 7b 20 43 41 53 54 20 28  -29.1.2 { CAST (
d4f0: 58 27 33 32 33 33 33 30 32 45 33 30 27 20 41 53  X'3233302E30' AS
d500: 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 32 33   REAL) } real 23
d510: 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  0.0.do_expr_test
d520: 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e 33 20 7b   e_expr-29.1.3 {
d530: 20 43 41 53 54 20 28 58 27 32 44 33 39 32 45 33   CAST (X'2D392E3
d540: 38 33 37 27 20 41 53 20 52 45 41 4c 29 20 7d 20  837' AS REAL) } 
d550: 72 65 61 6c 20 2d 39 2e 38 37 0a 64 6f 5f 65 78  real -9.87.do_ex
d560: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d570: 39 2e 31 2e 34 20 7b 20 43 41 53 54 20 28 58 27  9.1.4 { CAST (X'
d580: 33 30 32 45 33 30 33 30 33 30 33 31 27 20 41 53  302E30303031' AS
d590: 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 30 2e   REAL) } real 0.
d5a0: 30 30 30 31 0a 72 65 6e 61 6d 65 20 64 62 20 64  0001.rename db d
d5b0: 62 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d  b2.sqlite3 db :m
d5c0: 65 6d 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c 65  emory:.ifcapable
d5d0: 20 7b 75 74 66 31 36 7d 20 7b 0a 64 62 20 65 76   {utf16} {.db ev
d5e0: 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f  al { PRAGMA enco
d5f0: 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65  ding = 'utf-16le
d600: 27 20 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ' }.do_expr_test
d610: 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e 35 20 7b   e_expr-29.1.5 {
d620: 20 0a 20 20 20 20 43 41 53 54 20 28 58 27 33 31   .    CAST (X'31
d630: 30 30 32 45 30 30 33 32 30 30 33 33 30 30 27 20  002E0032003300' 
d640: 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20  AS REAL) } real 
d650: 31 2e 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73  1.23.do_expr_tes
d660: 74 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e 36 20  t e_expr-29.1.6 
d670: 7b 20 0a 20 20 20 20 43 41 53 54 20 28 58 27 33  { .    CAST (X'3
d680: 32 30 30 33 33 30 30 33 30 30 30 32 45 30 30 33  200330030002E003
d690: 30 30 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20  000' AS REAL) } 
d6a0: 72 65 61 6c 20 32 33 30 2e 30 0a 64 6f 5f 65 78  real 230.0.do_ex
d6b0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d6c0: 39 2e 31 2e 37 20 7b 20 0a 20 20 20 20 43 41 53  9.1.7 { .    CAS
d6d0: 54 20 28 58 27 32 44 30 30 33 39 30 30 32 45 30  T (X'2D0039002E0
d6e0: 30 33 38 30 30 33 37 30 30 27 20 41 53 20 52 45  038003700' AS RE
d6f0: 41 4c 29 20 7d 20 72 65 61 6c 20 2d 39 2e 38 37  AL) } real -9.87
d700: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d710: 65 78 70 72 2d 32 39 2e 31 2e 38 20 7b 20 0a 20  expr-29.1.8 { . 
d720: 20 20 20 43 41 53 54 20 28 58 27 33 30 30 30 32     CAST (X'30002
d730: 45 30 30 33 30 30 30 33 30 30 30 33 30 30 30 33  E003000300030003
d740: 31 30 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20  100' AS REAL) } 
d750: 72 65 61 6c 20 30 2e 30 30 30 31 0a 7d 0a 64 62  real 0.0001.}.db
d760: 20 63 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62   close.rename db
d770: 32 20 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45  2 db..# EVIDENCE
d780: 2d 4f 46 3a 20 52 2d 35 34 38 39 38 2d 33 34 35  -OF: R-54898-345
d790: 35 34 20 57 68 65 6e 20 63 61 73 74 69 6e 67 20  54 When casting 
d7a0: 61 20 54 45 58 54 20 76 61 6c 75 65 20 74 6f 20  a TEXT value to 
d7b0: 52 45 41 4c 2c 20 74 68 65 0a 23 20 6c 6f 6e 67  REAL, the.# long
d7c0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 72 65  est possible pre
d7d0: 66 69 78 20 6f 66 20 74 68 65 20 76 61 6c 75 65  fix of the value
d7e0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 69 6e 74   that can be int
d7f0: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 72 65  erpreted as a re
d800: 61 6c 0a 23 20 6e 75 6d 62 65 72 20 69 73 20 65  al.# number is e
d810: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
d820: 65 20 54 45 58 54 20 76 61 6c 75 65 20 61 6e 64  e TEXT value and
d830: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69   the remainder i
d840: 67 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 70  gnored..#.do_exp
d850: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
d860: 2e 32 2e 31 20 7b 20 43 41 53 54 28 27 31 2e 32  .2.1 { CAST('1.2
d870: 33 61 62 63 64 27 20 41 53 20 52 45 41 4c 29 20  3abcd' AS REAL) 
d880: 7d 20 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65  } real 1.23.do_e
d890: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
d8a0: 32 39 2e 32 2e 32 20 7b 20 43 41 53 54 28 27 31  29.2.2 { CAST('1
d8b0: 2e 34 35 2e 32 33 61 62 63 64 27 20 41 53 20 52  .45.23abcd' AS R
d8c0: 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 34 35  EAL) } real 1.45
d8d0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d8e0: 65 78 70 72 2d 32 39 2e 32 2e 33 20 7b 20 43 41  expr-29.2.3 { CA
d8f0: 53 54 28 27 2d 32 2e 31 32 65 2d 30 31 41 42 43  ST('-2.12e-01ABC
d900: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
d910: 6c 20 2d 30 2e 32 31 32 0a 64 6f 5f 65 78 70 72  l -0.212.do_expr
d920: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d930: 32 2e 34 20 7b 20 43 41 53 54 28 27 31 20 32 20  2.4 { CAST('1 2 
d940: 33 20 34 27 20 41 53 20 52 45 41 4c 29 20 7d 20  3 4' AS REAL) } 
d950: 72 65 61 6c 20 31 2e 30 0a 0a 23 20 45 56 49 44  real 1.0..# EVID
d960: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 33 32 31  ENCE-OF: R-11321
d970: 2d 34 37 34 32 37 20 41 6e 79 20 6c 65 61 64 69  -47427 Any leadi
d980: 6e 67 20 73 70 61 63 65 73 20 69 6e 20 74 68 65  ng spaces in the
d990: 20 54 45 58 54 20 76 61 6c 75 65 20 61 72 65 0a   TEXT value are.
d9a0: 23 20 69 67 6e 6f 72 65 64 20 77 68 65 6e 20 63  # ignored when c
d9b0: 6f 6e 76 65 72 67 69 6e 67 20 66 72 6f 6d 20 54  onverging from T
d9c0: 45 58 54 20 74 6f 20 52 45 41 4c 2e 0a 23 0a 64  EXT to REAL..#.d
d9d0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d9e0: 70 72 2d 32 39 2e 33 2e 31 20 7b 20 43 41 53 54  pr-29.3.1 { CAST
d9f0: 28 27 20 31 2e 32 33 61 62 63 64 27 20 41 53 20  (' 1.23abcd' AS 
da00: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32  REAL) } real 1.2
da10: 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  3.do_expr_test e
da20: 5f 65 78 70 72 2d 32 39 2e 33 2e 32 20 7b 20 43  _expr-29.3.2 { C
da30: 41 53 54 28 27 20 20 20 20 31 2e 34 35 2e 32 33  AST('    1.45.23
da40: 61 62 63 64 27 20 41 53 20 52 45 41 4c 29 20 7d  abcd' AS REAL) }
da50: 20 72 65 61 6c 20 31 2e 34 35 0a 64 6f 5f 65 78   real 1.45.do_ex
da60: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
da70: 39 2e 33 2e 33 20 7b 20 43 41 53 54 28 27 20 20  9.3.3 { CAST('  
da80: 20 2d 32 2e 31 32 65 2d 30 31 41 42 43 27 20 41   -2.12e-01ABC' A
da90: 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 2d  S REAL) } real -
daa0: 30 2e 32 31 32 0a 64 6f 5f 65 78 70 72 5f 74 65  0.212.do_expr_te
dab0: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e 34  st e_expr-29.3.4
dac0: 20 7b 20 43 41 53 54 28 27 20 31 20 32 20 33 20   { CAST(' 1 2 3 
dad0: 34 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  4' AS REAL) } re
dae0: 61 6c 20 31 2e 30 0a 0a 23 20 45 56 49 44 45 4e  al 1.0..# EVIDEN
daf0: 43 45 2d 4f 46 3a 20 52 2d 32 32 36 36 32 2d 32  CE-OF: R-22662-2
db00: 38 32 31 38 20 49 66 20 74 68 65 72 65 20 69 73  8218 If there is
db10: 20 6e 6f 20 70 72 65 66 69 78 20 74 68 61 74 20   no prefix that 
db20: 63 61 6e 20 62 65 0a 23 20 69 6e 74 65 72 70 72  can be.# interpr
db30: 65 74 65 64 20 61 73 20 61 20 72 65 61 6c 20 6e  eted as a real n
db40: 75 6d 62 65 72 2c 20 74 68 65 20 72 65 73 75 6c  umber, the resul
db50: 74 20 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73  t of the convers
db60: 69 6f 6e 20 69 73 20 30 2e 30 2e 0a 23 0a 64 6f  ion is 0.0..#.do
db70: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
db80: 72 2d 32 39 2e 34 2e 31 20 7b 20 43 41 53 54 28  r-29.4.1 { CAST(
db90: 27 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  '' AS REAL) } re
dba0: 61 6c 20 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74  al 0.0.do_expr_t
dbb0: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 34 2e  est e_expr-29.4.
dbc0: 32 20 7b 20 43 41 53 54 28 27 6e 6f 74 20 61 20  2 { CAST('not a 
dbd0: 6e 75 6d 62 65 72 27 20 41 53 20 52 45 41 4c 29  number' AS REAL)
dbe0: 20 7d 20 72 65 61 6c 20 30 2e 30 0a 64 6f 5f 65   } real 0.0.do_e
dbf0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
dc00: 32 39 2e 34 2e 33 20 7b 20 43 41 53 54 28 27 58  29.4.3 { CAST('X
dc10: 58 49 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  XI' AS REAL) } r
dc20: 65 61 6c 20 30 2e 30 0a 0a 23 20 45 56 49 44 45  eal 0.0..# EVIDE
dc30: 4e 43 45 2d 4f 46 3a 20 52 2d 32 31 38 32 39 2d  NCE-OF: R-21829-
dc40: 31 34 35 36 33 20 57 68 65 6e 20 63 61 73 74 69  14563 When casti
dc50: 6e 67 20 61 20 42 4c 4f 42 20 76 61 6c 75 65 20  ng a BLOB value 
dc60: 74 6f 20 49 4e 54 45 47 45 52 2c 20 74 68 65 0a  to INTEGER, the.
dc70: 23 20 76 61 6c 75 65 20 69 73 20 66 69 72 73 74  # value is first
dc80: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 54 45   converted to TE
dc90: 58 54 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65  XT..#.do_expr_te
dca0: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 31  st e_expr-30.1.1
dcb0: 20 7b 20 43 41 53 54 28 58 27 33 31 33 32 33 33   { CAST(X'313233
dcc0: 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20  ' AS INTEGER) } 
dcd0: 69 6e 74 65 67 65 72 20 31 32 33 0a 64 6f 5f 65  integer 123.do_e
dce0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
dcf0: 33 30 2e 31 2e 32 20 7b 20 43 41 53 54 28 58 27  30.1.2 { CAST(X'
dd00: 32 44 33 36 33 37 33 38 27 20 41 53 20 49 4e 54  2D363738' AS INT
dd10: 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20  EGER) } integer 
dd20: 2d 36 37 38 0a 64 6f 5f 65 78 70 72 5f 74 65 73  -678.do_expr_tes
dd30: 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 33 20  t e_expr-30.1.3 
dd40: 7b 20 0a 20 20 43 41 53 54 28 58 27 33 31 33 30  { .  CAST(X'3130
dd50: 33 30 33 30 33 30 33 30 33 30 27 20 41 53 20 49  3030303030' AS I
dd60: 4e 54 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67  NTEGER) .} integ
dd70: 65 72 20 31 30 30 30 30 30 30 0a 64 6f 5f 65 78  er 1000000.do_ex
dd80: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
dd90: 30 2e 31 2e 34 20 7b 20 0a 20 20 43 41 53 54 28  0.1.4 { .  CAST(
dda0: 58 27 32 44 33 31 33 31 33 32 33 35 33 38 33 39  X'2D313132353839
ddb0: 33 39 33 39 33 30 33 36 33 38 33 34 33 32 33 36  3939303638343236
ddc0: 33 32 33 34 27 20 41 53 20 49 4e 54 45 47 45 52  3234' AS INTEGER
ddd0: 29 20 0a 7d 20 69 6e 74 65 67 65 72 20 2d 31 31  ) .} integer -11
dde0: 32 35 38 39 39 39 30 36 38 34 32 36 32 34 0a 0a  25899906842624..
ddf0: 72 65 6e 61 6d 65 20 64 62 20 64 62 32 0a 73 71  rename db db2.sq
de00: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
de10: 3a 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66  :.ifcapable {utf
de20: 31 36 7d 20 7b 0a 65 78 65 63 73 71 6c 20 7b 20  16} {.execsql { 
de30: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20  PRAGMA encoding 
de40: 3d 20 27 75 74 66 2d 31 36 62 65 27 20 7d 0a 64  = 'utf-16be' }.d
de50: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
de60: 70 72 2d 33 30 2e 31 2e 35 20 7b 20 43 41 53 54  pr-30.1.5 { CAST
de70: 28 58 27 30 30 33 31 30 30 33 32 30 30 33 33 27  (X'003100320033'
de80: 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69   AS INTEGER) } i
de90: 6e 74 65 67 65 72 20 31 32 33 0a 64 6f 5f 65 78  nteger 123.do_ex
dea0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
deb0: 30 2e 31 2e 36 20 7b 20 43 41 53 54 28 58 27 30  0.1.6 { CAST(X'0
dec0: 30 32 44 30 30 33 36 30 30 33 37 30 30 33 38 27  02D003600370038'
ded0: 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69   AS INTEGER) } i
dee0: 6e 74 65 67 65 72 20 2d 36 37 38 0a 64 6f 5f 65  nteger -678.do_e
def0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
df00: 33 30 2e 31 2e 37 20 7b 20 0a 20 20 43 41 53 54  30.1.7 { .  CAST
df10: 28 58 27 30 30 33 31 30 30 33 30 30 30 33 30 30  (X'0031003000300
df20: 30 33 30 30 30 33 30 30 30 33 30 30 30 33 30 27  030003000300030'
df30: 20 41 53 20 49 4e 54 45 47 45 52 29 20 0a 7d 20   AS INTEGER) .} 
df40: 69 6e 74 65 67 65 72 20 31 30 30 30 30 30 30 0a  integer 1000000.
df50: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
df60: 78 70 72 2d 33 30 2e 31 2e 38 20 7b 20 0a 20 20  xpr-30.1.8 { .  
df70: 43 41 53 54 28 58 27 30 30 32 44 30 30 33 31 30  CAST(X'002D00310
df80: 30 33 31 30 30 33 32 30 30 33 35 30 30 33 38 30  0310032003500380
df90: 30 33 39 30 30 33 39 30 30 33 39 30 30 33 30 30  0390039003900300
dfa0: 30 33 36 30 30 33 38 30 30 33 34 30 30 33 32 30  0360038003400320
dfb0: 30 33 36 30 30 33 32 30 30 33 34 27 20 41 53 20  03600320034' AS 
dfc0: 49 4e 54 45 47 45 52 29 20 0a 7d 20 69 6e 74 65  INTEGER) .} inte
dfd0: 67 65 72 20 2d 31 31 32 35 38 39 39 39 30 36 38  ger -11258999068
dfe0: 34 32 36 32 34 0a 7d 0a 64 62 20 63 6c 6f 73 65  42624.}.db close
dff0: 0a 72 65 6e 61 6d 65 20 64 62 32 20 64 62 0a 0a  .rename db2 db..
e000: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
e010: 2d 34 37 36 31 32 2d 34 35 38 34 32 20 57 68 65  -47612-45842 Whe
e020: 6e 20 63 61 73 74 69 6e 67 20 61 20 54 45 58 54  n casting a TEXT
e030: 20 76 61 6c 75 65 20 74 6f 20 49 4e 54 45 47 45   value to INTEGE
e040: 52 2c 20 74 68 65 0a 23 20 6c 6f 6e 67 65 73 74  R, the.# longest
e050: 20 70 6f 73 73 69 62 6c 65 20 70 72 65 66 69 78   possible prefix
e060: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 74 68   of the value th
e070: 61 74 20 63 61 6e 20 62 65 20 69 6e 74 65 72 70  at can be interp
e080: 72 65 74 65 64 20 61 73 20 61 6e 0a 23 20 69 6e  reted as an.# in
e090: 74 65 67 65 72 20 6e 75 6d 62 65 72 20 69 73 20  teger number is 
e0a0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
e0b0: 68 65 20 54 45 58 54 20 76 61 6c 75 65 20 61 6e  he TEXT value an
e0c0: 64 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 0a  d the remainder.
e0d0: 23 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f  # ignored..#.do_
e0e0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e0f0: 2d 33 30 2e 32 2e 31 20 7b 20 43 41 53 54 28 27  -30.2.1 { CAST('
e100: 31 32 33 61 62 63 64 27 20 41 53 20 49 4e 54 29  123abcd' AS INT)
e110: 20 7d 20 69 6e 74 65 67 65 72 20 31 32 33 0a 64   } integer 123.d
e120: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
e130: 70 72 2d 33 30 2e 32 2e 32 20 7b 20 43 41 53 54  pr-30.2.2 { CAST
e140: 28 27 31 34 35 32 33 61 62 63 64 27 20 41 53 20  ('14523abcd' AS 
e150: 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31  INT) } integer 1
e160: 34 35 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73  4523.do_expr_tes
e170: 74 20 65 5f 65 78 70 72 2d 33 30 2e 32 2e 33 20  t e_expr-30.2.3 
e180: 7b 20 43 41 53 54 28 27 2d 32 2e 31 32 65 2d 30  { CAST('-2.12e-0
e190: 31 41 42 43 27 20 41 53 20 49 4e 54 29 20 7d 20  1ABC' AS INT) } 
e1a0: 69 6e 74 65 67 65 72 20 2d 32 0a 64 6f 5f 65 78  integer -2.do_ex
e1b0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e1c0: 30 2e 32 2e 34 20 7b 20 43 41 53 54 28 27 31 20  0.2.4 { CAST('1 
e1d0: 32 20 33 20 34 27 20 41 53 20 49 4e 54 29 20 7d  2 3 4' AS INT) }
e1e0: 20 69 6e 74 65 67 65 72 20 31 0a 0a 23 20 45 56   integer 1..# EV
e1f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 34  IDENCE-OF: R-344
e200: 30 30 2d 33 33 37 37 32 20 41 6e 79 20 6c 65 61  00-33772 Any lea
e210: 64 69 6e 67 20 73 70 61 63 65 73 20 69 6e 20 74  ding spaces in t
e220: 68 65 20 54 45 58 54 20 76 61 6c 75 65 20 77 68  he TEXT value wh
e230: 65 6e 0a 23 20 63 6f 6e 76 65 72 74 69 6e 67 20  en.# converting 
e240: 66 72 6f 6d 20 54 45 58 54 20 74 6f 20 49 4e 54  from TEXT to INT
e250: 45 47 45 52 20 61 72 65 20 69 67 6e 6f 72 65 64  EGER are ignored
e260: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
e270: 20 65 5f 65 78 70 72 2d 33 30 2e 33 2e 31 20 7b   e_expr-30.3.1 {
e280: 20 43 41 53 54 28 27 20 20 20 31 32 33 61 62 63   CAST('   123abc
e290: 64 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74  d' AS INT) } int
e2a0: 65 67 65 72 20 31 32 33 0a 64 6f 5f 65 78 70 72  eger 123.do_expr
e2b0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
e2c0: 33 2e 32 20 7b 20 43 41 53 54 28 27 20 20 31 34  3.2 { CAST('  14
e2d0: 35 32 33 61 62 63 64 27 20 41 53 20 49 4e 54 29  523abcd' AS INT)
e2e0: 20 7d 20 69 6e 74 65 67 65 72 20 31 34 35 32 33   } integer 14523
e2f0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e300: 65 78 70 72 2d 33 30 2e 33 2e 33 20 7b 20 43 41  expr-30.3.3 { CA
e310: 53 54 28 27 20 2d 32 2e 31 32 65 2d 30 31 41 42  ST(' -2.12e-01AB
e320: 43 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74  C' AS INT) } int
e330: 65 67 65 72 20 2d 32 0a 64 6f 5f 65 78 70 72 5f  eger -2.do_expr_
e340: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 33  test e_expr-30.3
e350: 2e 34 20 7b 20 43 41 53 54 28 27 20 20 20 20 20  .4 { CAST('     
e360: 31 20 32 20 33 20 34 27 20 41 53 20 49 4e 54 29  1 2 3 4' AS INT)
e370: 20 7d 20 69 6e 74 65 67 65 72 20 31 0a 0a 23 20   } integer 1..# 
e380: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
e390: 33 31 36 34 2d 34 34 32 37 36 20 49 66 20 74 68  3164-44276 If th
e3a0: 65 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78  ere is no prefix
e3b0: 20 74 68 61 74 20 63 61 6e 20 62 65 0a 23 20 69   that can be.# i
e3c0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
e3d0: 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 2c   integer number,
e3e0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
e3f0: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73  he conversion is
e400: 20 30 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65   0..#.do_expr_te
e410: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 34 2e 31  st e_expr-30.4.1
e420: 20 7b 20 43 41 53 54 28 27 27 20 41 53 20 49 4e   { CAST('' AS IN
e430: 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72  TEGER) } integer
e440: 20 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20   0.do_expr_test 
e450: 65 5f 65 78 70 72 2d 33 30 2e 34 2e 32 20 7b 20  e_expr-30.4.2 { 
e460: 43 41 53 54 28 27 6e 6f 74 20 61 20 6e 75 6d 62  CAST('not a numb
e470: 65 72 27 20 41 53 20 49 4e 54 45 47 45 52 29 20  er' AS INTEGER) 
e480: 7d 20 69 6e 74 65 67 65 72 20 30 0a 64 6f 5f 65  } integer 0.do_e
e490: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
e4a0: 33 30 2e 34 2e 33 20 7b 20 43 41 53 54 28 27 58  30.4.3 { CAST('X
e4b0: 58 49 27 20 41 53 20 49 4e 54 45 47 45 52 29 20  XI' AS INTEGER) 
e4c0: 7d 20 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45  } integer 0..# E
e4d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
e4e0: 39 38 30 2d 35 33 31 32 34 20 54 68 65 20 43 41  980-53124 The CA
e4f0: 53 54 20 6f 70 65 72 61 74 6f 72 20 75 6e 64 65  ST operator unde
e500: 72 73 74 61 6e 64 73 20 64 65 63 69 6d 61 6c 0a  rstands decimal.
e510: 23 20 69 6e 74 65 67 65 72 73 20 6f 6e 6c 79 20  # integers only 
e520: 26 6d 64 61 73 68 3b 20 63 6f 6e 76 65 72 73 69  &mdash; conversi
e530: 6f 6e 20 6f 66 20 68 65 78 61 64 65 63 69 6d 61  on of hexadecima
e540: 6c 20 69 6e 74 65 67 65 72 73 20 73 74 6f 70 73  l integers stops
e550: 20 61 74 0a 23 20 74 68 65 20 22 78 22 20 69 6e   at.# the "x" in
e560: 20 74 68 65 20 22 30 78 22 20 70 72 65 66 69 78   the "0x" prefix
e570: 20 6f 66 20 74 68 65 20 68 65 78 61 64 65 63 69   of the hexadeci
e580: 6d 61 6c 20 69 6e 74 65 67 65 72 20 73 74 72 69  mal integer stri
e590: 6e 67 20 61 6e 64 20 74 68 75 73 0a 23 20 72 65  ng and thus.# re
e5a0: 73 75 6c 74 20 6f 66 20 74 68 65 20 43 41 53 54  sult of the CAST
e5b0: 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2e   is always zero.
e5c0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e5d0: 65 78 70 72 2d 33 30 2e 35 2e 31 20 7b 20 43 41  expr-30.5.1 { CA
e5e0: 53 54 28 27 30 78 31 32 33 34 27 20 41 53 20 49  ST('0x1234' AS I
e5f0: 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65  NTEGER) } intege
e600: 72 20 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  r 0.do_expr_test
e610: 20 65 5f 65 78 70 72 2d 33 30 2e 35 2e 32 20 7b   e_expr-30.5.2 {
e620: 20 43 41 53 54 28 27 30 58 31 32 33 34 27 20 41   CAST('0X1234' A
e630: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e640: 65 67 65 72 20 30 0a 0a 23 20 45 56 49 44 45 4e  eger 0..# EVIDEN
e650: 43 45 2d 4f 46 3a 20 52 2d 30 32 37 35 32 2d 35  CE-OF: R-02752-5
e660: 30 30 39 31 20 41 20 63 61 73 74 20 6f 66 20 61  0091 A cast of a
e670: 20 52 45 41 4c 20 76 61 6c 75 65 20 69 6e 74 6f   REAL value into
e680: 20 61 6e 20 49 4e 54 45 47 45 52 0a 23 20 72 65   an INTEGER.# re
e690: 73 75 6c 74 73 20 69 6e 20 74 68 65 20 69 6e 74  sults in the int
e6a0: 65 67 65 72 20 62 65 74 77 65 65 6e 20 74 68 65  eger between the
e6b0: 20 52 45 41 4c 20 76 61 6c 75 65 20 61 6e 64 20   REAL value and 
e6c0: 7a 65 72 6f 20 74 68 61 74 20 69 73 20 63 6c 6f  zero that is clo
e6d0: 73 65 73 74 0a 23 20 74 6f 20 74 68 65 20 52 45  sest.# to the RE
e6e0: 41 4c 20 76 61 6c 75 65 2e 0a 23 0a 64 6f 5f 65  AL value..#.do_e
e6f0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
e700: 33 31 2e 31 2e 31 20 7b 20 43 41 53 54 28 33 2e  31.1.1 { CAST(3.
e710: 31 34 31 35 39 20 41 53 20 49 4e 54 45 47 45 52  14159 AS INTEGER
e720: 29 20 7d 20 69 6e 74 65 67 65 72 20 33 0a 64 6f  ) } integer 3.do
e730: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e740: 72 2d 33 31 2e 31 2e 32 20 7b 20 43 41 53 54 28  r-31.1.2 { CAST(
e750: 31 2e 39 39 39 39 39 20 41 53 20 49 4e 54 45 47  1.99999 AS INTEG
e760: 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 31 0a  ER) } integer 1.
e770: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e780: 78 70 72 2d 33 31 2e 31 2e 33 20 7b 20 43 41 53  xpr-31.1.3 { CAS
e790: 54 28 2d 31 2e 39 39 39 39 39 20 41 53 20 49 4e  T(-1.99999 AS IN
e7a0: 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72  TEGER) } integer
e7b0: 20 2d 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74   -1.do_expr_test
e7c0: 20 65 5f 65 78 70 72 2d 33 31 2e 31 2e 34 20 7b   e_expr-31.1.4 {
e7d0: 20 43 41 53 54 28 2d 30 2e 39 39 39 39 39 20 41   CAST(-0.99999 A
e7e0: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e7f0: 65 67 65 72 20 30 0a 0a 23 20 45 56 49 44 45 4e  eger 0..# EVIDEN
e800: 43 45 2d 4f 46 3a 20 52 2d 35 31 35 31 37 2d 34  CE-OF: R-51517-4
e810: 30 38 32 34 20 49 66 20 61 20 52 45 41 4c 20 69  0824 If a REAL i
e820: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
e830: 68 65 20 67 72 65 61 74 65 73 74 0a 23 20 70 6f  he greatest.# po
e840: 73 73 69 62 6c 65 20 73 69 67 6e 65 64 20 69 6e  ssible signed in
e850: 74 65 67 65 72 20 28 2b 39 32 32 33 33 37 32 30  teger (+92233720
e860: 33 36 38 35 34 37 37 35 38 30 37 29 20 74 68 65  36854775807) the
e870: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  n the result is 
e880: 74 68 65 0a 23 20 67 72 65 61 74 65 73 74 20 70  the.# greatest p
e890: 6f 73 73 69 62 6c 65 20 73 69 67 6e 65 64 20 69  ossible signed i
e8a0: 6e 74 65 67 65 72 20 61 6e 64 20 69 66 20 74 68  nteger and if th
e8b0: 65 20 52 45 41 4c 20 69 73 20 6c 65 73 73 20 74  e REAL is less t
e8c0: 68 61 6e 20 74 68 65 0a 23 20 6c 65 61 73 74 20  han the.# least 
e8d0: 70 6f 73 73 69 62 6c 65 20 73 69 67 6e 65 64 20  possible signed 
e8e0: 69 6e 74 65 67 65 72 20 28 2d 39 32 32 33 33 37  integer (-922337
e8f0: 32 30 33 36 38 35 34 37 37 35 38 30 38 29 20 74  2036854775808) t
e900: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 23  hen the result.#
e910: 20 69 73 20 74 68 65 20 6c 65 61 73 74 20 70 6f   is the least po
e920: 73 73 69 62 6c 65 20 73 69 67 6e 65 64 20 69 6e  ssible signed in
e930: 74 65 67 65 72 2e 0a 23 0a 64 6f 5f 65 78 70 72  teger..#.do_expr
e940: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e  _test e_expr-31.
e950: 32 2e 31 20 7b 20 43 41 53 54 28 32 65 2b 35 30  2.1 { CAST(2e+50
e960: 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67   AS INT) } integ
e970: 65 72 20 39 32 32 33 33 37 32 30 33 36 38 35 34  er 9223372036854
e980: 37 37 35 38 30 37 0a 64 6f 5f 65 78 70 72 5f 74  775807.do_expr_t
e990: 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 32 2e  est e_expr-31.2.
e9a0: 32 20 7b 20 43 41 53 54 28 2d 32 65 2b 35 30 20  2 { CAST(-2e+50 
e9b0: 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65  AS INT) } intege
e9c0: 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  r -9223372036854
e9d0: 37 37 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74  775808.do_expr_t
e9e0: 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 32 2e  est e_expr-31.2.
e9f0: 33 20 7b 20 0a 20 20 43 41 53 54 28 2d 39 32 32  3 { .  CAST(-922
ea00: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 39  3372036854775809
ea10: 2e 30 20 41 53 20 49 4e 54 29 0a 7d 20 69 6e 74  .0 AS INT).} int
ea20: 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33 36  eger -9223372036
ea30: 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78 70  854775808.do_exp
ea40: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31  r_test e_expr-31
ea50: 2e 32 2e 34 20 7b 20 0a 20 20 43 41 53 54 28 39  .2.4 { .  CAST(9
ea60: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
ea70: 30 39 2e 30 20 41 53 20 49 4e 54 29 0a 7d 20 69  09.0 AS INT).} i
ea80: 6e 74 65 67 65 72 20 39 32 32 33 33 37 32 30 33  nteger 922337203
ea90: 36 38 35 34 37 37 35 38 30 37 0a 0a 0a 23 20 45  6854775807...# E
eaa0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39  VIDENCE-OF: R-09
eab0: 32 39 35 2d 36 31 33 33 37 20 43 61 73 74 69 6e  295-61337 Castin
eac0: 67 20 61 20 54 45 58 54 20 6f 72 20 42 4c 4f 42  g a TEXT or BLOB
ead0: 20 76 61 6c 75 65 20 69 6e 74 6f 20 4e 55 4d 45   value into NUME
eae0: 52 49 43 0a 23 20 66 69 72 73 74 20 64 6f 65 73  RIC.# first does
eaf0: 20 61 20 66 6f 72 63 65 64 20 63 6f 6e 76 65 72   a forced conver
eb00: 73 69 6f 6e 20 69 6e 74 6f 20 52 45 41 4c 20 62  sion into REAL b
eb10: 75 74 20 74 68 65 6e 20 66 75 72 74 68 65 72 20  ut then further 
eb20: 63 6f 6e 76 65 72 74 73 20 74 68 65 0a 23 20 72  converts the.# r
eb30: 65 73 75 6c 74 20 69 6e 74 6f 20 49 4e 54 45 47  esult into INTEG
eb40: 45 52 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ER if and only i
eb50: 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  f the conversion
eb60: 20 66 72 6f 6d 20 52 45 41 4c 20 74 6f 20 49 4e   from REAL to IN
eb70: 54 45 47 45 52 0a 23 20 69 73 20 6c 6f 73 73 6c  TEGER.# is lossl
eb80: 65 73 73 20 61 6e 64 20 72 65 76 65 72 73 69 62  ess and reversib
eb90: 6c 65 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65  le..#.do_expr_te
eba0: 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e 31  st e_expr-32.1.1
ebb0: 20 7b 20 43 41 53 54 28 27 34 35 27 20 20 20 41   { CAST('45'   A
ebc0: 53 20 4e 55 4d 45 52 49 43 29 20 20 7d 20 69 6e  S NUMERIC)  } in
ebd0: 74 65 67 65 72 20 34 35 0a 64 6f 5f 65 78 70 72  teger 45.do_expr
ebe0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e  _test e_expr-32.
ebf0: 31 2e 32 20 7b 20 43 41 53 54 28 27 34 35 2e 30  1.2 { CAST('45.0
ec00: 27 20 41 53 20 4e 55 4d 45 52 49 43 29 20 20 7d  ' AS NUMERIC)  }
ec10: 20 69 6e 74 65 67 65 72 20 34 35 0a 64 6f 5f 65   integer 45.do_e
ec20: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
ec30: 33 32 2e 31 2e 33 20 7b 20 43 41 53 54 28 27 34  32.1.3 { CAST('4
ec40: 35 2e 32 27 20 41 53 20 4e 55 4d 45 52 49 43 29  5.2' AS NUMERIC)
ec50: 20 20 7d 20 72 65 61 6c 20 34 35 2e 32 0a 64 6f    } real 45.2.do
ec60: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
ec70: 72 2d 33 32 2e 31 2e 34 20 7b 20 43 41 53 54 28  r-32.1.4 { CAST(
ec80: 27 31 31 61 62 63 27 20 41 53 20 4e 55 4d 45 52  '11abc' AS NUMER
ec90: 49 43 29 20 7d 20 69 6e 74 65 67 65 72 20 31 31  IC) } integer 11
eca0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
ecb0: 65 78 70 72 2d 33 32 2e 31 2e 35 20 7b 20 43 41  expr-32.1.5 { CA
ecc0: 53 54 28 27 31 31 2e 31 61 62 63 27 20 41 53 20  ST('11.1abc' AS 
ecd0: 4e 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c 20  NUMERIC) } real 
ece0: 31 31 2e 31 0a 0a 23 20 45 56 49 44 45 4e 43 45  11.1..# EVIDENCE
ecf0: 2d 4f 46 3a 20 52 2d 33 30 33 34 37 2d 31 38 37  -OF: R-30347-187
ed00: 30 32 20 43 61 73 74 69 6e 67 20 61 20 52 45 41  02 Casting a REA
ed10: 4c 20 6f 72 20 49 4e 54 45 47 45 52 20 76 61 6c  L or INTEGER val
ed20: 75 65 20 74 6f 20 4e 55 4d 45 52 49 43 0a 23 20  ue to NUMERIC.# 
ed30: 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 65 76 65 6e  is a no-op, even
ed40: 20 69 66 20 61 20 72 65 61 6c 20 76 61 6c 75 65   if a real value
ed50: 20 63 6f 75 6c 64 20 62 65 20 6c 6f 73 73 6c 65   could be lossle
ed60: 73 73 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 74  ssly converted t
ed70: 6f 20 61 6e 0a 23 20 69 6e 74 65 67 65 72 2e 0a  o an.# integer..
ed80: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
ed90: 5f 65 78 70 72 2d 33 32 2e 32 2e 31 20 7b 20 43  _expr-32.2.1 { C
eda0: 41 53 54 28 31 33 2e 30 20 41 53 20 4e 55 4d 45  AST(13.0 AS NUME
edb0: 52 49 43 29 20 7d 20 72 65 61 6c 20 31 33 2e 30  RIC) } real 13.0
edc0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
edd0: 65 78 70 72 2d 33 32 2e 32 2e 32 20 7b 20 43 41  expr-32.2.2 { CA
ede0: 53 54 28 31 33 2e 35 20 41 53 20 4e 55 4d 45 52  ST(13.5 AS NUMER
edf0: 49 43 29 20 7d 20 72 65 61 6c 20 31 33 2e 35 0a  IC) } real 13.5.
ee00: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
ee10: 65 78 70 72 2d 33 32 2e 32 2e 33 20 7b 20 0a 20  expr-32.2.3 { . 
ee20: 20 43 41 53 54 28 2d 39 32 32 33 33 37 32 30 33   CAST(-922337203
ee30: 36 38 35 34 37 37 35 38 30 38 20 41 53 20 4e 55  6854775808 AS NU
ee40: 4d 45 52 49 43 29 0a 7d 20 69 6e 74 65 67 65 72  MERIC).} integer
ee50: 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37   -92233720368547
ee60: 37 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74 65  75808.do_expr_te
ee70: 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 34  st e_expr-32.2.4
ee80: 20 7b 20 0a 20 20 43 41 53 54 28 39 32 32 33 33   { .  CAST(92233
ee90: 37 32 30 33 36 38 35 34 37 37 35 38 30 37 20 41  72036854775807 A
eea0: 53 20 4e 55 4d 45 52 49 43 29 0a 7d 20 69 6e 74  S NUMERIC).} int
eeb0: 65 67 65 72 20 39 32 32 33 33 37 32 30 33 36 38  eger 92233720368
eec0: 35 34 37 37 35 38 30 37 0a 0a 23 20 45 56 49 44  54775807..# EVID
eed0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34 35 35 30  ENCE-OF: R-64550
eee0: 2d 32 39 31 39 31 20 4e 6f 74 65 20 74 68 61 74  -29191 Note that
eef0: 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d   the result from
ef00: 20 63 61 73 74 69 6e 67 20 61 6e 79 0a 23 20 6e   casting any.# n
ef10: 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65 20 69 6e  on-BLOB value in
ef20: 74 6f 20 61 20 42 4c 4f 42 20 61 6e 64 20 74 68  to a BLOB and th
ef30: 65 20 72 65 73 75 6c 74 20 66 72 6f 6d 20 63 61  e result from ca
ef40: 73 74 69 6e 67 20 61 6e 79 20 42 4c 4f 42 20 76  sting any BLOB v
ef50: 61 6c 75 65 0a 23 20 69 6e 74 6f 20 61 20 6e 6f  alue.# into a no
ef60: 6e 2d 42 4c 4f 42 20 76 61 6c 75 65 20 6d 61 79  n-BLOB value may
ef70: 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 64 65   be different de
ef80: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
ef90: 65 72 20 74 68 65 0a 23 20 64 61 74 61 62 61 73  er the.# databas
efa0: 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55 54  e encoding is UT
efb0: 46 2d 38 2c 20 55 54 46 2d 31 36 62 65 2c 20 6f  F-8, UTF-16be, o
efc0: 72 20 55 54 46 2d 31 36 6c 65 2e 0a 23 0a 69 66  r UTF-16le..#.if
efd0: 63 61 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20  capable {utf16} 
efe0: 7b 0a 73 71 6c 69 74 65 33 20 64 62 31 20 3a 6d  {.sqlite3 db1 :m
eff0: 65 6d 6f 72 79 3a 20 3b 20 64 62 31 20 65 76 61  emory: ; db1 eva
f000: 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  l { PRAGMA encod
f010: 69 6e 67 20 3d 20 27 75 74 66 2d 38 27 20 7d 0a  ing = 'utf-8' }.
f020: 73 71 6c 69 74 65 33 20 64 62 32 20 3a 6d 65 6d  sqlite3 db2 :mem
f030: 6f 72 79 3a 20 3b 20 64 62 32 20 65 76 61 6c 20  ory: ; db2 eval 
f040: 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e  { PRAGMA encodin
f050: 67 20 3d 20 27 75 74 66 2d 31 36 6c 65 27 20 7d  g = 'utf-16le' }
f060: 0a 73 71 6c 69 74 65 33 20 64 62 33 20 3a 6d 65  .sqlite3 db3 :me
f070: 6d 6f 72 79 3a 20 3b 20 64 62 33 20 65 76 61 6c  mory: ; db3 eval
f080: 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69   { PRAGMA encodi
f090: 6e 67 20 3d 20 27 75 74 66 2d 31 36 62 65 27 20  ng = 'utf-16be' 
f0a0: 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 61  }.foreach {tn ca
f0b0: 73 74 65 78 70 72 20 64 69 66 66 65 72 73 7d 20  stexpr differs} 
f0c0: 7b 0a 20 20 31 20 7b 20 43 41 53 54 28 31 32 33  {.  1 { CAST(123
f0d0: 20 41 53 20 42 4c 4f 42 29 20 20 20 20 7d 20 31   AS BLOB)    } 1
f0e0: 0a 20 20 32 20 7b 20 43 41 53 54 28 27 27 20 41  .  2 { CAST('' A
f0f0: 53 20 42 4c 4f 42 29 20 20 20 20 20 7d 20 30 0a  S BLOB)     } 0.
f100: 20 20 33 20 7b 20 43 41 53 54 28 27 61 62 63 64    3 { CAST('abcd
f110: 27 20 41 53 20 42 4c 4f 42 29 20 7d 20 31 0a 0a  ' AS BLOB) } 1..
f120: 20 20 34 20 7b 20 43 41 53 54 28 58 27 61 62 63    4 { CAST(X'abc
f130: 64 27 20 41 53 20 54 45 58 54 29 20 7d 20 31 0a  d' AS TEXT) } 1.
f140: 20 20 35 20 7b 20 43 41 53 54 28 58 27 27 20 41    5 { CAST(X'' A
f150: 53 20 54 45 58 54 29 20 20 20 20 20 7d 20 30 0a  S TEXT)     } 0.
f160: 7d 20 7b 0a 20 20 73 65 74 20 72 31 20 5b 64 62  } {.  set r1 [db
f170: 31 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20 74  1 eval "SELECT t
f180: 79 70 65 6f 66 28 24 63 61 73 74 65 78 70 72 29  ypeof($castexpr)
f190: 2c 20 71 75 6f 74 65 28 24 63 61 73 74 65 78 70  , quote($castexp
f1a0: 72 29 22 5d 0a 20 20 73 65 74 20 72 32 20 5b 64  r)"].  set r2 [d
f1b0: 62 32 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20  b2 eval "SELECT 
f1c0: 74 79 70 65 6f 66 28 24 63 61 73 74 65 78 70 72  typeof($castexpr
f1d0: 29 2c 20 71 75 6f 74 65 28 24 63 61 73 74 65 78  ), quote($castex
f1e0: 70 72 29 22 5d 0a 20 20 73 65 74 20 72 33 20 5b  pr)"].  set r3 [
f1f0: 64 62 33 20 65 76 61 6c 20 22 53 45 4c 45 43 54  db3 eval "SELECT
f200: 20 74 79 70 65 6f 66 28 24 63 61 73 74 65 78 70   typeof($castexp
f210: 72 29 2c 20 71 75 6f 74 65 28 24 63 61 73 74 65  r), quote($caste
f220: 78 70 72 29 22 5d 0a 0a 20 20 69 66 20 7b 24 64  xpr)"]..  if {$d
f230: 69 66 66 65 72 73 7d 20 7b 0a 20 20 20 20 73 65  iffers} {.    se
f240: 74 20 72 65 73 20 5b 65 78 70 72 20 7b 24 72 31  t res [expr {$r1
f250: 21 3d 24 72 32 20 26 26 20 24 72 32 21 3d 24 72  !=$r2 && $r2!=$r
f260: 33 7d 5d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  3}].  } else {. 
f270: 20 20 20 73 65 74 20 72 65 73 20 5b 65 78 70 72     set res [expr
f280: 20 7b 24 72 31 3d 3d 24 72 32 20 26 26 20 24 72   {$r1==$r2 && $r
f290: 32 3d 3d 24 72 33 7d 5d 0a 20 20 7d 0a 0a 20 20  2==$r3}].  }..  
f2a0: 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  do_test e_expr-3
f2b0: 33 2e 31 2e 24 74 6e 20 7b 73 65 74 20 72 65 73  3.1.$tn {set res
f2c0: 7d 20 31 0a 7d 0a 64 62 31 20 63 6c 6f 73 65 0a  } 1.}.db1 close.
f2d0: 64 62 32 20 63 6c 6f 73 65 0a 64 62 33 20 63 6c  db2 close.db3 cl
f2e0: 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ose.}..#--------
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 0a 23 20 54 65 73 74 20 73 74 61 74 65 6d 65  -.# Test stateme
f340: 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  nts related to t
f350: 68 65 20 45 58 49 53 54 53 20 61 6e 64 20 4e 4f  he EXISTS and NO
f360: 54 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  T EXISTS operato
f370: 72 73 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64 62  rs..#.catch { db
f380: 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64 65   close }.forcede
f390: 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 73 71 6c  lete test.db.sql
f3a0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
f3b0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
f3c0: 20 65 5f 65 78 70 72 2d 33 34 2e 31 20 7b 0a 20   e_expr-34.1 {. 
f3d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
f3e0: 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54  (a, b);.  INSERT
f3f0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
f400: 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20  1, 2);.  INSERT 
f410: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 4e  INTO t1 VALUES(N
f420: 55 4c 4c 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52  ULL, 2);.  INSER
f430: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
f440: 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e 53  (1, NULL);.  INS
f450: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
f460: 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  ES(NULL, NULL);.
f470: 7d 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  } {}..# EVIDENCE
f480: 2d 4f 46 3a 20 52 2d 32 35 35 38 38 2d 32 37 31  -OF: R-25588-271
f490: 38 31 20 54 68 65 20 45 58 49 53 54 53 20 6f 70  81 The EXISTS op
f4a0: 65 72 61 74 6f 72 20 61 6c 77 61 79 73 20 65 76  erator always ev
f4b0: 61 6c 75 61 74 65 73 20 74 6f 20 6f 6e 65 0a 23  aluates to one.#
f4c0: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
f4d0: 76 61 6c 75 65 73 20 30 20 61 6e 64 20 31 2e 0a  values 0 and 1..
f4e0: 23 0a 23 20 54 68 69 73 20 73 74 61 74 65 6d 65  #.# This stateme
f4f0: 6e 74 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64  nt is not tested
f500: 20 62 79 20 69 74 73 65 6c 66 2e 20 49 6e 73 74   by itself. Inst
f510: 65 61 64 2c 20 61 6c 6c 20 65 5f 65 78 70 72 2d  ead, all e_expr-
f520: 33 34 2e 2a 20 74 65 73 74 73 20 0a 23 20 66 6f  34.* tests .# fo
f530: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 70 6f 69  llowing this poi
f540: 6e 74 20 65 78 70 6c 69 63 69 74 6c 79 20 74 65  nt explicitly te
f550: 73 74 20 74 68 61 74 20 73 70 65 63 69 66 69 63  st that specific
f560: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6f 66 20   invocations of 
f570: 45 58 49 53 54 53 0a 23 20 72 65 74 75 72 6e 20  EXISTS.# return 
f580: 65 69 74 68 65 72 20 69 6e 74 65 67 65 72 20 30  either integer 0
f590: 20 6f 72 20 69 6e 74 65 67 65 72 20 31 2e 0a 23   or integer 1..#
f5a0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
f5b0: 20 52 2d 35 38 35 35 33 2d 36 33 37 34 30 20 49   R-58553-63740 I
f5c0: 66 20 65 78 65 63 75 74 69 6e 67 20 74 68 65 20  f executing the 
f5d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
f5e0: 20 73 70 65 63 69 66 69 65 64 0a 23 20 61 73 20   specified.# as 
f5f0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 6f  the right-hand o
f600: 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 45 58  perand of the EX
f610: 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 77 6f  ISTS operator wo
f620: 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f  uld return one o
f630: 72 0a 23 20 6d 6f 72 65 20 72 6f 77 73 2c 20 74  r.# more rows, t
f640: 68 65 6e 20 74 68 65 20 45 58 49 53 54 53 20 6f  hen the EXISTS o
f650: 70 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65  perator evaluate
f660: 73 20 74 6f 20 31 2e 0a 23 0a 66 6f 72 65 61 63  s to 1..#.foreac
f670: 68 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20  h {tn expr} {.  
f680: 20 20 31 20 7b 20 45 58 49 53 54 53 20 28 20 53    1 { EXISTS ( S
f690: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
f6a0: 29 20 7d 0a 20 20 20 20 32 20 7b 20 45 58 49 53  ) }.    2 { EXIS
f6b0: 54 53 20 28 20 53 45 4c 45 43 54 20 62 20 46 52  TS ( SELECT b FR
f6c0: 4f 4d 20 74 31 20 29 20 7d 0a 20 20 20 20 33 20  OM t1 ) }.    3 
f6d0: 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43  { EXISTS ( SELEC
f6e0: 54 20 32 34 20 29 20 7d 0a 20 20 20 20 34 20 7b  T 24 ) }.    4 {
f6f0: 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54   EXISTS ( SELECT
f700: 20 4e 55 4c 4c 20 29 20 7d 0a 20 20 20 20 35 20   NULL ) }.    5 
f710: 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43  { EXISTS ( SELEC
f720: 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T a FROM t1 WHER
f730: 45 20 61 20 49 53 20 4e 55 4c 4c 20 29 20 7d 0a  E a IS NULL ) }.
f740: 7d 20 7b 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65  } {.  do_expr_te
f750: 73 74 20 65 5f 65 78 70 72 2d 33 34 2e 32 2e 24  st e_expr-34.2.$
f760: 74 6e 20 24 65 78 70 72 20 69 6e 74 65 67 65 72  tn $expr integer
f770: 20 31 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45   1.}..# EVIDENCE
f780: 2d 4f 46 3a 20 52 2d 31 39 36 37 33 2d 34 30 39  -OF: R-19673-409
f790: 37 32 20 49 66 20 65 78 65 63 75 74 69 6e 67 20  72 If executing 
f7a0: 74 68 65 20 53 45 4c 45 43 54 20 77 6f 75 6c 64  the SELECT would
f7b0: 20 72 65 74 75 72 6e 20 6e 6f 0a 23 20 72 6f 77   return no.# row
f7c0: 73 20 61 74 20 61 6c 6c 2c 20 74 68 65 6e 20 74  s at all, then t
f7d0: 68 65 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  he EXISTS operat
f7e0: 6f 72 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  or evaluates to 
f7f0: 30 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  0..#.foreach {tn
f800: 20 65 78 70 72 7d 20 7b 0a 20 20 20 20 31 20 7b   expr} {.    1 {
f810: 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54   EXISTS ( SELECT
f820: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
f830: 20 30 29 20 7d 0a 20 20 20 20 32 20 7b 20 45 58   0) }.    2 { EX
f840: 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 62 20  ISTS ( SELECT b 
f850: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
f860: 3d 20 35 29 20 7d 0a 20 20 20 20 33 20 7b 20 45  = 5) }.    3 { E
f870: 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 32  XISTS ( SELECT 2
f880: 34 20 57 48 45 52 45 20 30 29 20 7d 0a 20 20 20  4 WHERE 0) }.   
f890: 20 34 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   4 { EXISTS ( SE
f8a0: 4c 45 43 54 20 4e 55 4c 4c 20 57 48 45 52 45 20  LECT NULL WHERE 
f8b0: 31 3d 32 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f  1=2) }.} {.  do_
f8c0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
f8d0: 2d 33 34 2e 33 2e 24 74 6e 20 24 65 78 70 72 20  -34.3.$tn $expr 
f8e0: 69 6e 74 65 67 65 72 20 30 0a 7d 0a 0a 23 20 45  integer 0.}..# E
f8f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 35  VIDENCE-OF: R-35
f900: 31 30 39 2d 34 39 31 33 39 20 54 68 65 20 6e 75  109-49139 The nu
f910: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f920: 69 6e 20 65 61 63 68 20 72 6f 77 20 72 65 74 75  in each row retu
f930: 72 6e 65 64 0a 23 20 62 79 20 74 68 65 20 53 45  rned.# by the SE
f940: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 28  LECT statement (
f950: 69 66 20 61 6e 79 29 20 61 6e 64 20 74 68 65 20  if any) and the 
f960: 73 70 65 63 69 66 69 63 20 76 61 6c 75 65 73 20  specific values 
f970: 72 65 74 75 72 6e 65 64 20 68 61 76 65 0a 23 20  returned have.# 
f980: 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 74 68 65  no effect on the
f990: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
f9a0: 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 2e  EXISTS operator.
f9b0: 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 65  .#.foreach {tn e
f9c0: 78 70 72 20 72 65 73 7d 20 7b 0a 20 20 20 20 31  xpr res} {.    1
f9d0: 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45   { EXISTS ( SELE
f9e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 29 20 7d  CT * FROM t1 ) }
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa00: 20 20 20 20 20 20 20 20 20 20 31 0a 20 20 20 20            1.    
fa10: 32 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c  2 { EXISTS ( SEL
fa20: 45 43 54 20 2a 2c 20 2a 2c 20 2a 20 46 52 4f 4d  ECT *, *, * FROM
fa30: 20 74 31 20 29 20 7d 20 20 20 20 20 20 20 20 20   t1 ) }         
fa40: 20 20 20 20 20 20 20 20 20 20 20 31 0a 20 20 20             1.   
fa50: 20 33 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   3 { EXISTS ( SE
fa60: 4c 45 43 54 20 32 34 2c 20 32 35 20 29 20 7d 20  LECT 24, 25 ) } 
fa70: 20 20 20 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 31 0a 20 20              1.  
fa90: 20 20 34 20 7b 20 45 58 49 53 54 53 20 28 20 53    4 { EXISTS ( S
faa0: 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ELECT NULL, NULL
fab0: 2c 20 4e 55 4c 4c 20 29 20 7d 20 20 20 20 20 20  , NULL ) }      
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 20               1. 
fad0: 20 20 20 35 20 7b 20 45 58 49 53 54 53 20 28 20     5 { EXISTS ( 
fae0: 53 45 4c 45 43 54 20 61 2c 62 2c 61 7c 7c 62 20  SELECT a,b,a||b 
faf0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
fb00: 49 53 20 4e 55 4c 4c 20 29 20 7d 20 20 20 31 0a  IS NULL ) }   1.
fb10: 0a 20 20 20 20 36 20 7b 20 45 58 49 53 54 53 20  .    6 { EXISTS 
fb20: 28 20 53 45 4c 45 43 54 20 61 2c 20 61 20 46 52  ( SELECT a, a FR
fb30: 4f 4d 20 74 31 20 57 48 45 52 45 20 30 29 20 7d  OM t1 WHERE 0) }
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 30 0a 20 20 20 20 37 20 7b 20 45 58 49 53 54 53  0.    7 { EXISTS
fb60: 20 28 20 53 45 4c 45 43 54 20 62 2c 20 62 2c 20   ( SELECT b, b, 
fb70: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
fb80: 61 20 3d 20 35 29 20 7d 20 20 20 20 20 20 20 20  a = 5) }        
fb90: 20 30 0a 20 20 20 20 38 20 7b 20 45 58 49 53 54   0.    8 { EXIST
fba0: 53 20 28 20 53 45 4c 45 43 54 20 32 34 2c 20 34  S ( SELECT 24, 4
fbb0: 36 2c 20 38 39 20 57 48 45 52 45 20 30 29 20 7d  6, 89 WHERE 0) }
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 30 0a 20 20 20 20 39 20 7b 20 45 58 49 53    0.    9 { EXIS
fbe0: 54 53 20 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c  TS ( SELECT NULL
fbf0: 2c 20 4e 55 4c 4c 20 57 48 45 52 45 20 31 3d 32  , NULL WHERE 1=2
fc00: 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ) }             
fc10: 20 20 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78     0.} {.  do_ex
fc20: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
fc30: 34 2e 34 2e 24 74 6e 20 24 65 78 70 72 20 69 6e  4.4.$tn $expr in
fc40: 74 65 67 65 72 20 24 72 65 73 0a 7d 0a 0a 23 20  teger $res.}..# 
fc50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
fc60: 30 36 34 35 2d 31 32 34 33 39 20 49 6e 20 70 61  0645-12439 In pa
fc70: 72 74 69 63 75 6c 61 72 2c 20 72 6f 77 73 20 63  rticular, rows c
fc80: 6f 6e 74 61 69 6e 69 6e 67 20 4e 55 4c 4c 20 76  ontaining NULL v
fc90: 61 6c 75 65 73 0a 23 20 61 72 65 20 6e 6f 74 20  alues.# are not 
fca0: 68 61 6e 64 6c 65 64 20 61 6e 79 20 64 69 66 66  handled any diff
fcb0: 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 72 6f 77  erently from row
fcc0: 73 20 77 69 74 68 6f 75 74 20 4e 55 4c 4c 20 76  s without NULL v
fcd0: 61 6c 75 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68  alues..#.foreach
fce0: 20 7b 74 6e 20 65 31 20 65 32 7d 20 7b 0a 20 20   {tn e1 e2} {.  
fcf0: 31 20 7b 20 45 58 49 53 54 53 20 28 53 45 4c 45  1 { EXISTS (SELE
fd00: 43 54 20 27 6e 6f 74 20 6e 75 6c 6c 27 29 20 7d  CT 'not null') }
fd10: 20 20 20 20 7b 20 45 58 49 53 54 53 20 28 53 45      { EXISTS (SE
fd20: 4c 45 43 54 20 4e 55 4c 4c 29 20 7d 0a 20 20 32  LECT NULL) }.  2
fd30: 20 7b 20 45 58 49 53 54 53 20 28 53 45 4c 45 43   { EXISTS (SELEC
fd40: 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 29 20  T NULL FROM t1) 
fd50: 7d 20 20 7b 20 45 58 49 53 54 53 20 28 53 45 4c  }  { EXISTS (SEL
fd60: 45 43 54 20 27 62 72 65 61 64 27 20 46 52 4f 4d  ECT 'bread' FROM
fd70: 20 74 31 29 20 7d 0a 7d 20 7b 0a 20 20 73 65 74   t1) }.} {.  set
fd80: 20 72 65 73 20 5b 64 62 20 6f 6e 65 20 22 53 45   res [db one "SE
fd90: 4c 45 43 54 20 24 65 31 22 5d 0a 20 20 64 6f 5f  LECT $e1"].  do_
fda0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
fdb0: 2d 33 34 2e 35 2e 24 7b 74 6e 7d 61 20 24 65 31  -34.5.${tn}a $e1
fdc0: 20 69 6e 74 65 67 65 72 20 24 72 65 73 0a 20 20   integer $res.  
fdd0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
fde0: 78 70 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d 62 20  xpr-34.5.${tn}b 
fdf0: 24 65 32 20 69 6e 74 65 67 65 72 20 24 72 65 73  $e2 integer $res
fe00: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
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 0a 23  --------------.#
fe50: 20 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74 73   Test statements
fe60: 20 72 65 6c 61 74 65 64 20 74 6f 20 73 63 61 6c   related to scal
fe70: 61 72 20 73 75 62 2d 71 75 65 72 69 65 73 2e 0a  ar sub-queries..
fe80: 23 0a 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c  #..catch { db cl
fe90: 6f 73 65 20 7d 0a 66 6f 72 63 65 64 65 6c 65 74  ose }.forcedelet
fea0: 65 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74 65  e test.db.sqlite
feb0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f  3 db test.db.do_
fec0: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 30  test e_expr-35.0
fed0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
fee0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
fef0: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t2(a, b);.    IN
ff00: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
ff10: 55 45 53 28 27 6f 6e 65 27 2c 20 27 74 77 6f 27  UES('one', 'two'
ff20: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
ff30: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 74 68  TO t2 VALUES('th
ff40: 72 65 65 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  ree', NULL);.   
ff50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
ff60: 56 41 4c 55 45 53 28 34 2c 20 35 2e 30 29 3b 0a  VALUES(4, 5.0);.
ff70: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44    }.} {}..# EVID
ff80: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 30 39 38 30  ENCE-OF: R-00980
ff90: 2d 33 39 32 35 36 20 41 20 53 45 4c 45 43 54 20  -39256 A SELECT 
ffa0: 73 74 61 74 65 6d 65 6e 74 20 65 6e 63 6c 6f 73  statement enclos
ffb0: 65 64 20 69 6e 20 70 61 72 65 6e 74 68 65 73 65  ed in parenthese
ffc0: 73 0a 23 20 6d 61 79 20 61 70 70 65 61 72 20 61  s.# may appear a
ffd0: 73 20 61 20 73 63 61 6c 61 72 20 71 75 61 6e 74  s a scalar quant
ffe0: 69 74 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ity..#.# EVIDENC
fff0: 45 2d 4f 46 3a 20 52 2d 35 36 32 39 34 2d 30 33  E-OF: R-56294-03
10000 39 36 36 20 41 6c 6c 20 74 79 70 65 73 20 6f 66  966 All types of
10010 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10020 74 2c 20 69 6e 63 6c 75 64 69 6e 67 0a 23 20 61  t, including.# a
10030 67 67 72 65 67 61 74 65 20 61 6e 64 20 63 6f 6d  ggregate and com
10040 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 71 75 65  pound SELECT que
10050 72 69 65 73 20 28 71 75 65 72 69 65 73 20 77 69  ries (queries wi
10060 74 68 20 6b 65 79 77 6f 72 64 73 20 6c 69 6b 65  th keywords like
10070 0a 23 20 55 4e 49 4f 4e 20 6f 72 20 45 58 43 45  .# UNION or EXCE
10080 50 54 29 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  PT) are allowed 
10090 61 73 20 73 63 61 6c 61 72 20 73 75 62 71 75 65  as scalar subque
100a0 72 69 65 73 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  ries..#.do_expr_
100b0 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31  test e_expr-35.1
100c0 2e 31 20 7b 20 28 53 45 4c 45 43 54 20 33 35 29  .1 { (SELECT 35)
100d0 20 20 20 7d 20 69 6e 74 65 67 65 72 20 33 35 0a     } integer 35.
100e0 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
100f0 78 70 72 2d 33 35 2e 31 2e 32 20 7b 20 28 53 45  xpr-35.1.2 { (SE
10100 4c 45 43 54 20 4e 55 4c 4c 29 20 7d 20 6e 75 6c  LECT NULL) } nul
10110 6c 20 7b 7d 0a 0a 64 6f 5f 65 78 70 72 5f 74 65  l {}..do_expr_te
10120 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e 33  st e_expr-35.1.3
10130 20 7b 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74   { (SELECT count
10140 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 7d 20 69  (*) FROM t2) } i
10150 6e 74 65 67 65 72 20 33 0a 64 6f 5f 65 78 70 72  nteger 3.do_expr
10160 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e  _test e_expr-35.
10170 31 2e 34 20 7b 20 28 53 45 4c 45 43 54 20 34 20  1.4 { (SELECT 4 
10180 46 52 4f 4d 20 74 32 29 20 7d 20 69 6e 74 65 67  FROM t2) } integ
10190 65 72 20 34 0a 0a 64 6f 5f 65 78 70 72 5f 74 65  er 4..do_expr_te
101a0 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e 35  st e_expr-35.1.5
101b0 20 7b 20 0a 20 20 28 53 45 4c 45 43 54 20 62 20   { .  (SELECT b 
101c0 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
101d0 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 74 32  LECT a+1 FROM t2
101e0 29 0a 7d 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65  ).} null {}.do_e
101f0 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
10200 33 35 2e 31 2e 36 20 7b 20 0a 20 20 28 53 45 4c  35.1.6 { .  (SEL
10210 45 43 54 20 61 20 46 52 4f 4d 20 74 32 20 55 4e  ECT a FROM t2 UN
10220 49 4f 4e 20 53 45 4c 45 43 54 20 43 4f 41 4c 45  ION SELECT COALE
10230 53 43 45 28 62 2c 20 35 35 29 20 46 52 4f 4d 20  SCE(b, 55) FROM 
10240 74 32 20 4f 52 44 45 52 20 42 59 20 31 29 0a 7d  t2 ORDER BY 1).}
10250 20 69 6e 74 65 67 65 72 20 34 0a 0a 23 20 45 56   integer 4..# EV
10260 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 36 38  IDENCE-OF: R-468
10270 39 39 2d 35 33 37 36 35 20 41 20 53 45 4c 45 43  99-53765 A SELEC
10280 54 20 75 73 65 64 20 61 73 20 61 20 73 63 61 6c  T used as a scal
10290 61 72 20 71 75 61 6e 74 69 74 79 20 6d 75 73 74  ar quantity must
102a0 0a 23 20 72 65 74 75 72 6e 20 61 20 72 65 73 75  .# return a resu
102b0 6c 74 20 73 65 74 20 77 69 74 68 20 61 20 73 69  lt set with a si
102c0 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 23  ngle column..#.#
102d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
102e0 6c 6f 63 6b 20 74 65 73 74 73 20 74 68 61 74 20  lock tests that 
102f0 65 72 72 6f 72 73 20 61 72 65 20 72 65 74 75 72  errors are retur
10300 6e 65 64 20 69 6e 20 61 20 62 75 6e 63 68 20 6f  ned in a bunch o
10310 66 20 63 61 73 65 73 0a 23 20 77 68 65 72 65 20  f cases.# where 
10320 61 20 73 75 62 71 75 65 72 79 20 72 65 74 75 72  a subquery retur
10330 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ns more than one
10340 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 73 65 74 20 4d   column..#.set M
10350 20 7b 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20   {only a single 
10360 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66  result allowed f
10370 6f 72 20 61 20 53 45 4c 45 43 54 20 74 68 61 74  or a SELECT that
10380 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
10390 78 70 72 65 73 73 69 6f 6e 7d 0a 66 6f 72 65 61  xpression}.forea
103a0 63 68 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20  ch {tn sql} {.  
103b0 31 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20 28  1     { SELECT (
103c0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
103d0 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61 2b   UNION SELECT a+
103e0 31 2c 20 62 2b 31 20 46 52 4f 4d 20 74 32 29 20  1, b+1 FROM t2) 
103f0 7d 0a 20 20 32 20 20 20 20 20 7b 20 53 45 4c 45  }.  2     { SELE
10400 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  CT (SELECT * FRO
10410 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
10420 54 20 61 2b 31 2c 20 62 2b 31 20 46 52 4f 4d 20  T a+1, b+1 FROM 
10430 74 32 20 4f 52 44 45 52 20 42 59 20 31 29 20 7d  t2 ORDER BY 1) }
10440 0a 20 20 33 20 20 20 20 20 7b 20 53 45 4c 45 43  .  3     { SELEC
10450 54 20 28 53 45 4c 45 43 54 20 31 2c 20 32 29 20  T (SELECT 1, 2) 
10460 7d 0a 20 20 34 20 20 20 20 20 7b 20 53 45 4c 45  }.  4     { SELE
10470 43 54 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 2c  CT (SELECT NULL,
10480 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 20 7d 0a 20   NULL, NULL) }. 
10490 20 35 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20   5     { SELECT 
104a0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
104b0 32 29 20 7d 0a 20 20 36 20 20 20 20 20 7b 20 53  2) }.  6     { S
104c0 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 2a 20  ELECT (SELECT * 
104d0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 2c 20  FROM (SELECT 1, 
104e0 32 2c 20 33 29 29 20 7d 0a 7d 20 7b 0a 20 20 64  2, 3)) }.} {.  d
104f0 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
10500 65 5f 65 78 70 72 2d 33 35 2e 32 2e 24 74 6e 20  e_expr-35.2.$tn 
10510 24 73 71 6c 20 5b 6c 69 73 74 20 31 20 24 4d 5d  $sql [list 1 $M]
10520 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .}..# EVIDENCE-O
10530 46 3a 20 52 2d 33 35 37 36 34 2d 32 38 30 34 31  F: R-35764-28041
10540 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
10550 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
10560 20 74 68 65 20 76 61 6c 75 65 0a 23 20 6f 66 20   the value.# of 
10570 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 20  the only column 
10580 69 6e 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  in the first row
10590 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
105a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
105b0 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  t..#.# EVIDENCE-
105c0 4f 46 3a 20 52 2d 34 31 38 39 38 2d 30 36 36 38  OF: R-41898-0668
105d0 36 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  6 If the SELECT 
105e0 79 69 65 6c 64 73 20 6d 6f 72 65 20 74 68 61 6e  yields more than
105f0 20 6f 6e 65 20 72 65 73 75 6c 74 0a 23 20 72 6f   one result.# ro
10600 77 2c 20 61 6c 6c 20 72 6f 77 73 20 61 66 74 65  w, all rows afte
10610 72 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20  r the first are 
10620 69 67 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78  ignored..#.do_ex
10630 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
10640 72 2d 33 36 2e 33 2e 31 20 7b 0a 20 20 43 52 45  r-36.3.1 {.  CRE
10650 41 54 45 20 54 41 42 4c 45 20 74 34 28 78 2c 20  ATE TABLE t4(x, 
10660 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  y);.  INSERT INT
10670 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c 20 27  O t4 VALUES(1, '
10680 6f 6e 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  one');.  INSERT 
10690 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 32  INTO t4 VALUES(2
106a0 2c 20 27 74 77 6f 27 29 3b 0a 20 20 49 4e 53 45  , 'two');.  INSE
106b0 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
106c0 53 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a 7d  S(3, 'three');.}
106d0 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e   {}..foreach {tn
106e0 20 65 78 70 72 20 72 65 73 74 79 70 65 20 72 65   expr restype re
106f0 73 76 61 6c 7d 20 7b 0a 20 20 20 20 32 20 20 7b  sval} {.    2  {
10700 20 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d   ( SELECT x FROM
10710 20 74 34 20 4f 52 44 45 52 20 42 59 20 78 20 29   t4 ORDER BY x )
10720 20 20 20 20 20 20 7d 20 20 20 20 20 20 20 20 69        }        i
10730 6e 74 65 67 65 72 20 31 0a 20 20 20 20 33 20 20  nteger 1.    3  
10740 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f  { ( SELECT x FRO
10750 4d 20 74 34 20 4f 52 44 45 52 20 42 59 20 79 20  M t4 ORDER BY y 
10760 29 20 20 20 20 20 20 7d 20 20 20 20 20 20 20 20  )      }        
10770 69 6e 74 65 67 65 72 20 31 0a 20 20 20 20 34 20  integer 1.    4 
10780 20 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46 52   { ( SELECT x FR
10790 4f 4d 20 74 34 20 4f 52 44 45 52 20 42 59 20 78  OM t4 ORDER BY x
107a0 20 44 45 53 43 20 29 20 7d 20 20 20 20 20 20 20   DESC ) }       
107b0 20 69 6e 74 65 67 65 72 20 33 0a 20 20 20 20 35   integer 3.    5
107c0 20 20 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46    { ( SELECT x F
107d0 52 4f 4d 20 74 34 20 4f 52 44 45 52 20 42 59 20  ROM t4 ORDER BY 
107e0 79 20 44 45 53 43 20 29 20 7d 20 20 20 20 20 20  y DESC ) }      
107f0 20 20 69 6e 74 65 67 65 72 20 32 0a 20 20 20 20    integer 2.    
10800 36 20 20 7b 20 28 20 53 45 4c 45 43 54 20 79 20  6  { ( SELECT y 
10810 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20 42 59  FROM t4 ORDER BY
10820 20 79 20 44 45 53 43 20 29 20 7d 20 20 20 20 20   y DESC ) }     
10830 20 20 20 74 65 78 74 20 20 20 20 74 77 6f 0a 0a     text    two..
10840 20 20 20 20 37 20 20 7b 20 28 20 53 45 4c 45 43      7  { ( SELEC
10850 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 74 34  T sum(x) FROM t4
10860 20 29 20 20 20 20 20 20 20 20 20 20 20 7d 20 20   )           }  
10870 20 20 20 20 20 20 20 69 6e 74 65 67 65 72 20 36         integer 6
10880 0a 20 20 20 20 38 20 20 7b 20 28 20 53 45 4c 45  .    8  { ( SELE
10890 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  CT group_concat(
108a0 79 2c 27 27 29 20 46 52 4f 4d 20 74 34 20 29 20  y,'') FROM t4 ) 
108b0 7d 20 20 20 20 20 20 20 74 65 78 74 20 20 20 20  }       text    
108c0 6f 6e 65 74 77 6f 74 68 72 65 65 0a 20 20 20 20  onetwothree.    
108d0 39 20 20 7b 20 28 20 53 45 4c 45 43 54 20 6d 61  9  { ( SELECT ma
108e0 78 28 78 29 20 46 52 4f 4d 20 74 34 20 57 48 45  x(x) FROM t4 WHE
108f0 52 45 20 79 20 4c 49 4b 45 20 27 5f 5f 5f 27 29  RE y LIKE '___')
10900 20 7d 20 69 6e 74 65 67 65 72 20 32 20 0a 0a 7d   } integer 2 ..}
10910 20 7b 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73   {.  do_expr_tes
10920 74 20 65 5f 65 78 70 72 2d 33 36 2e 33 2e 24 74  t e_expr-36.3.$t
10930 6e 20 24 65 78 70 72 20 24 72 65 73 74 79 70 65  n $expr $restype
10940 20 24 72 65 73 76 61 6c 0a 7d 0a 0a 23 20 45 56   $resval.}..# EV
10950 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 34  IDENCE-OF: R-254
10960 39 32 2d 34 31 35 37 32 20 49 66 20 74 68 65 20  92-41572 If the 
10970 53 45 4c 45 43 54 20 79 69 65 6c 64 73 20 6e 6f  SELECT yields no
10980 20 72 6f 77 73 2c 20 74 68 65 6e 20 74 68 65 0a   rows, then the.
10990 23 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 65  # value of the e
109a0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 4e 55 4c  xpression is NUL
109b0 4c 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  L..#.foreach {tn
109c0 20 65 78 70 72 7d 20 7b 0a 20 20 20 20 31 20 20   expr} {.    1  
109d0 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f  { ( SELECT x FRO
109e0 4d 20 74 34 20 57 48 45 52 45 20 78 3e 33 20 4f  M t4 WHERE x>3 O
109f0 52 44 45 52 20 42 59 20 78 20 29 20 20 20 20 20  RDER BY x )     
10a00 20 7d 0a 20 20 20 20 32 20 20 7b 20 28 20 53 45   }.    2  { ( SE
10a10 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20 57  LECT x FROM t4 W
10a20 48 45 52 45 20 79 3c 27 6f 6e 65 27 20 4f 52 44  HERE y<'one' ORD
10a30 45 52 20 42 59 20 79 20 29 20 20 7d 0a 7d 20 7b  ER BY y )  }.} {
10a40 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .  do_expr_test 
10a50 65 5f 65 78 70 72 2d 33 36 2e 34 2e 24 74 6e 20  e_expr-36.4.$tn 
10a60 24 65 78 70 72 20 6e 75 6c 6c 20 7b 7d 0a 7d 0a  $expr null {}.}.
10a70 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
10a80 52 2d 36 32 34 37 37 2d 30 36 34 37 36 20 46 6f  R-62477-06476 Fo
10a90 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 76  r example, the v
10aa0 61 6c 75 65 73 20 4e 55 4c 4c 2c 20 30 2e 30 2c  alues NULL, 0.0,
10ab0 20 30 2c 0a 23 20 27 65 6e 67 6c 69 73 68 27 20   0,.# 'english' 
10ac0 61 6e 64 20 27 30 27 20 61 72 65 20 61 6c 6c 20  and '0' are all 
10ad0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
10ae0 20 66 61 6c 73 65 2e 0a 23 0a 64 6f 5f 65 78 65   false..#.do_exe
10af0 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
10b00 2d 33 37 2e 31 20 7b 0a 20 20 20 53 45 4c 45 43  -37.1 {.   SELEC
10b10 54 20 43 41 53 45 20 57 48 45 4e 20 4e 55 4c 4c  T CASE WHEN NULL
10b20 20 54 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53   THEN 'true' ELS
10b30 45 20 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d  E 'false' END;.}
10b40 20 7b 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63   {false}.do_exec
10b50 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
10b60 33 37 2e 32 20 7b 0a 20 20 20 53 45 4c 45 43 54  37.2 {.   SELECT
10b70 20 43 41 53 45 20 57 48 45 4e 20 30 2e 30 20 54   CASE WHEN 0.0 T
10b80 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20  HEN 'true' ELSE 
10b90 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b  'false' END;.} {
10ba0 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63 73 71  false}.do_execsq
10bb0 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37  l_test e_expr-37
10bc0 2e 33 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43  .3 {.   SELECT C
10bd0 41 53 45 20 57 48 45 4e 20 30 20 54 48 45 4e 20  ASE WHEN 0 THEN 
10be0 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61 6c  'true' ELSE 'fal
10bf0 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66 61 6c 73  se' END;.} {fals
10c00 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e}.do_execsql_te
10c10 73 74 20 65 5f 65 78 70 72 2d 33 37 2e 34 20 7b  st e_expr-37.4 {
10c20 0a 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  .   SELECT CASE 
10c30 57 48 45 4e 20 27 65 6e 67 6c 69 67 68 27 20 54  WHEN 'engligh' T
10c40 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20  HEN 'true' ELSE 
10c50 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b  'false' END;.} {
10c60 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63 73 71  false}.do_execsq
10c70 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37  l_test e_expr-37
10c80 2e 35 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43  .5 {.   SELECT C
10c90 41 53 45 20 57 48 45 4e 20 27 30 27 20 54 48 45  ASE WHEN '0' THE
10ca0 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20 27 66  N 'true' ELSE 'f
10cb0 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66 61  alse' END;.} {fa
10cc0 6c 73 65 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  lse}..# EVIDENCE
10cd0 2d 4f 46 3a 20 52 2d 35 35 35 33 32 2d 31 30 31  -OF: R-55532-101
10ce0 30 38 20 56 61 6c 75 65 73 20 31 2c 20 31 2e 30  08 Values 1, 1.0
10cf0 2c 20 30 2e 31 2c 20 2d 30 2e 31 20 61 6e 64 20  , 0.1, -0.1 and 
10d00 27 31 65 6e 67 6c 69 73 68 27 20 61 72 65 0a 23  '1english' are.#
10d10 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
10d20 65 20 74 72 75 65 2e 0a 23 0a 64 6f 5f 65 78 65  e true..#.do_exe
10d30 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
10d40 2d 33 37 2e 36 20 7b 0a 20 20 20 53 45 4c 45 43  -37.6 {.   SELEC
10d50 54 20 43 41 53 45 20 57 48 45 4e 20 31 20 54 48  T CASE WHEN 1 TH
10d60 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20 27  EN 'true' ELSE '
10d70 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74  false' END;.} {t
10d80 72 75 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  rue}.do_execsql_
10d90 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37 2e 37  test e_expr-37.7
10da0 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43 41 53   {.   SELECT CAS
10db0 45 20 57 48 45 4e 20 31 2e 30 20 54 48 45 4e 20  E WHEN 1.0 THEN 
10dc0 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61 6c  'true' ELSE 'fal
10dd0 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65  se' END;.} {true
10de0 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
10df0 74 20 65 5f 65 78 70 72 2d 33 37 2e 38 20 7b 0a  t e_expr-37.8 {.
10e00 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57     SELECT CASE W
10e10 48 45 4e 20 30 2e 31 20 54 48 45 4e 20 27 74 72  HEN 0.1 THEN 'tr
10e20 75 65 27 20 45 4c 53 45 20 27 66 61 6c 73 65 27  ue' ELSE 'false'
10e30 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a 64   END;.} {true}.d
10e40 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
10e50 5f 65 78 70 72 2d 33 37 2e 39 20 7b 0a 20 20 20  _expr-37.9 {.   
10e60 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
10e70 20 2d 30 2e 31 20 54 48 45 4e 20 27 74 72 75 65   -0.1 THEN 'true
10e80 27 20 45 4c 53 45 20 27 66 61 6c 73 65 27 20 45  ' ELSE 'false' E
10e90 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a 64 6f 5f  ND;.} {true}.do_
10ea0 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
10eb0 78 70 72 2d 33 37 2e 31 30 20 7b 0a 20 20 20 53  xpr-37.10 {.   S
10ec0 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20  ELECT CASE WHEN 
10ed0 27 31 65 6e 67 6c 69 73 68 27 20 54 48 45 4e 20  '1english' THEN 
10ee0 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61 6c  'true' ELSE 'fal
10ef0 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65  se' END;.} {true
10f00 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  }...finish_test.