/ Hex Artifact Content
Login

Artifact e6048fe3901241799c4315bdd625f39dae790ff089c454979ca85f03b644dc6f:


0000: 23 20 32 30 31 30 20 4a 75 6c 79 20 31 36 0a 23  # 2010 July 16.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 23 20 54 68 69 73 20 66 69  ****.#.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65  le implements te
0180: 73 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  sts to verify th
0190: 61 74 20 74 68 65 20 22 74 65 73 74 61 62 6c 65  at the "testable
01a0: 20 73 74 61 74 65 6d 65 6e 74 73 22 20 69 6e 20   statements" in 
01b0: 0a 23 20 74 68 65 20 6c 61 6e 67 5f 65 78 70 72  .# the lang_expr
01c0: 2e 68 74 6d 6c 20 64 6f 63 75 6d 65 6e 74 20 61  .html document a
01d0: 72 65 20 63 6f 72 72 65 63 74 2e 0a 23 0a 0a 73  re correct..#..s
01e0: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
01f0: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
0200: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0210: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72  /tester.tcl.sour
0220: 63 65 20 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c  ce $testdir/mall
0230: 6f 63 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 69  oc_common.tcl..i
0240: 66 63 61 70 61 62 6c 65 20 21 63 6f 6d 70 6f 75  fcapable !compou
0250: 6e 64 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  nd {.  finish_te
0260: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70  st.  return.}..p
0270: 72 6f 63 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  roc do_expr_test
0280: 20 7b 74 6e 20 65 78 70 72 20 74 79 70 65 20 76   {tn expr type v
0290: 61 6c 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65  alue} {.  upleve
02a0: 6c 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l do_execsql_tes
02b0: 74 20 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c  t $tn [list "SEL
02c0: 45 43 54 20 74 79 70 65 6f 66 28 24 65 78 70 72  ECT typeof($expr
02d0: 29 2c 20 24 65 78 70 72 22 5d 20 5b 0a 20 20 20  ), $expr"] [.   
02e0: 20 6c 69 73 74 20 5b 6c 69 73 74 20 24 74 79 70   list [list $typ
02f0: 65 20 24 76 61 6c 75 65 5d 0a 20 20 5d 0a 7d 0a  e $value].  ].}.
0300: 0a 70 72 6f 63 20 64 6f 5f 71 65 78 70 72 5f 74  .proc do_qexpr_t
0310: 65 73 74 20 7b 74 6e 20 65 78 70 72 20 76 61 6c  est {tn expr val
0320: 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20  ue} {.  uplevel 
0330: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0340: 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c 45 43  $tn [list "SELEC
0350: 54 20 71 75 6f 74 65 28 24 65 78 70 72 29 22 5d  T quote($expr)"]
0360: 20 5b 6c 69 73 74 20 24 76 61 6c 75 65 5d 0a 7d   [list $value].}
0370: 0a 0a 23 20 53 65 74 20 75 70 20 74 68 72 65 65  ..# Set up three
0380: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0390: 73 3a 0a 23 0a 23 20 20 20 3a 3a 6f 70 6e 61 6d  s:.#.#   ::opnam
03a0: 65 20 20 20 20 20 20 20 20 20 41 6e 20 61 72 72  e         An arr
03b0: 61 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20  ay mapping from 
03c0: 53 51 4c 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  SQL operator to 
03d0: 61 6e 20 65 61 73 79 20 74 6f 20 70 61 72 73 65  an easy to parse
03e0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
03f0: 20 20 20 20 20 20 6e 61 6d 65 2e 20 54 68 65 20        name. The 
0400: 6e 61 6d 65 73 20 61 72 65 20 75 73 65 64 20 61  names are used a
0410: 73 20 70 61 72 74 20 6f 66 20 74 65 73 74 20 63  s part of test c
0420: 61 73 65 20 6e 61 6d 65 73 2e 0a 23 0a 23 20 20  ase names..#.#  
0430: 20 3a 3a 6f 70 70 72 65 63 20 20 20 20 20 20 20   ::opprec       
0440: 20 20 41 6e 20 61 72 72 61 79 20 6d 61 70 70 69    An array mappi
0450: 6e 67 20 66 72 6f 6d 20 53 51 4c 20 6f 70 65 72  ng from SQL oper
0460: 61 74 6f 72 20 74 6f 20 61 20 6e 75 6d 65 72 69  ator to a numeri
0470: 63 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  c.#             
0480: 20 20 20 20 20 20 20 70 72 65 63 65 64 65 6e 63         precedenc
0490: 65 20 76 61 6c 75 65 2e 20 4f 70 65 72 61 74 6f  e value. Operato
04a0: 72 73 20 74 68 61 74 20 67 72 6f 75 70 20 6d 6f  rs that group mo
04b0: 72 65 20 74 69 67 68 74 6c 79 0a 23 20 20 20 20  re tightly.#    
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 68 61 76 65 20 6c 6f 77 65 72 20 6e 75 6d 65 72  have lower numer
04e0: 69 63 20 70 72 65 63 65 64 65 6e 63 65 73 2e 0a  ic precedences..
04f0: 23 0a 23 20 20 20 3a 3a 6f 70 6c 69 73 74 20 20  #.#   ::oplist  
0500: 20 20 20 20 20 20 20 41 20 6c 69 73 74 20 6f 66         A list of
0510: 20 61 6c 6c 20 53 51 4c 20 6f 70 65 72 61 74 6f   all SQL operato
0520: 72 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  rs supported by 
0530: 53 51 4c 69 74 65 2e 0a 23 0a 66 6f 72 65 61 63  SQLite..#.foreac
0540: 68 20 7b 6f 70 20 6f 70 6e 7d 20 7b 0a 20 20 20  h {op opn} {.   
0550: 20 20 20 7c 7c 20 20 20 63 61 74 20 20 20 20 20     ||   cat     
0560: 2a 20 20 20 6d 75 6c 20 20 20 20 20 20 20 2f 20  *   mul       / 
0570: 20 64 69 76 20 20 20 20 20 20 20 25 20 20 20 20   div       %    
0580: 20 6d 6f 64 20 20 20 20 20 20 20 2b 20 20 20 20   mod       +    
0590: 20 20 61 64 64 0a 20 20 20 20 20 20 2d 20 20 20    add.      -   
05a0: 20 73 75 62 20 20 20 20 20 3c 3c 20 20 6c 73 68   sub     <<  lsh
05b0: 69 66 74 20 20 20 20 3e 3e 20 72 73 68 69 66 74  ift    >> rshift
05c0: 20 20 20 20 26 20 20 20 20 20 62 69 74 61 6e 64      &     bitand
05d0: 20 20 20 20 7c 20 20 20 20 20 20 62 69 74 6f 72      |      bitor
05e0: 0a 20 20 20 20 20 20 3c 20 20 20 20 6c 65 73 73  .      <    less
05f0: 20 20 20 20 3c 3d 20 20 6c 65 73 73 65 71 20 20      <=  lesseq  
0600: 20 20 3e 20 20 6d 6f 72 65 20 20 20 20 20 20 3e    >  more      >
0610: 3d 20 20 20 20 6d 6f 72 65 65 71 20 20 20 20 3d  =    moreeq    =
0620: 20 20 20 20 20 20 65 71 31 0a 20 20 20 20 20 20        eq1.      
0630: 3d 3d 20 20 20 65 71 32 20 20 20 20 20 3c 3e 20  ==   eq2     <> 
0640: 20 6e 65 31 20 20 20 20 20 20 20 21 3d 20 6e 65   ne1       != ne
0650: 32 20 20 20 20 20 20 20 49 53 20 20 20 20 69 73  2       IS    is
0660: 20 20 20 20 20 20 20 20 4c 49 4b 45 20 20 20 6c          LIKE   l
0670: 69 6b 65 0a 20 20 20 20 20 20 47 4c 4f 42 20 67  ike.      GLOB g
0680: 6c 6f 62 20 20 20 20 41 4e 44 20 61 6e 64 20 20  lob    AND and  
0690: 20 20 20 20 20 4f 52 20 6f 72 20 20 20 20 20 20       OR or      
06a0: 20 20 4d 41 54 43 48 20 6d 61 74 63 68 20 20 20    MATCH match   
06b0: 20 20 52 45 47 45 58 50 20 72 65 67 65 78 70 0a    REGEXP regexp.
06c0: 20 20 20 20 20 20 7b 49 53 20 4e 4f 54 7d 20 69        {IS NOT} i
06d0: 73 6e 74 0a 7d 20 7b 0a 20 20 73 65 74 20 3a 3a  snt.} {.  set ::
06e0: 6f 70 6e 61 6d 65 28 24 6f 70 29 20 24 6f 70 6e  opname($op) $opn
06f0: 0a 7d 0a 73 65 74 20 6f 70 6c 69 73 74 20 5b 6c  .}.set oplist [l
0700: 69 73 74 5d 0a 66 6f 72 65 61 63 68 20 7b 70 72  ist].foreach {pr
0710: 65 63 20 6f 70 6c 7d 20 7b 0a 20 20 31 20 20 20  ec opl} {.  1   
0720: 7c 7c 0a 20 20 32 20 20 20 7b 2a 20 2f 20 25 7d  ||.  2   {* / %}
0730: 0a 20 20 33 20 20 20 7b 2b 20 2d 7d 0a 20 20 34  .  3   {+ -}.  4
0740: 20 20 20 7b 3c 3c 20 3e 3e 20 26 20 7c 7d 0a 20     {<< >> & |}. 
0750: 20 35 20 20 20 7b 3c 20 3c 3d 20 3e 20 3e 3d 7d   5   {< <= > >=}
0760: 0a 20 20 36 20 20 20 7b 3d 20 3d 3d 20 21 3d 20  .  6   {= == != 
0770: 3c 3e 20 49 53 20 7b 49 53 20 4e 4f 54 7d 20 4c  <> IS {IS NOT} L
0780: 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48 20 52  IKE GLOB MATCH R
0790: 45 47 45 58 50 7d 0a 20 20 37 20 20 20 41 4e 44  EGEXP}.  7   AND
07a0: 0a 20 20 38 20 20 20 4f 52 0a 7d 20 7b 0a 20 20  .  8   OR.} {.  
07b0: 66 6f 72 65 61 63 68 20 6f 70 20 24 6f 70 6c 20  foreach op $opl 
07c0: 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6f 70 70  { .    set ::opp
07d0: 72 65 63 28 24 6f 70 29 20 24 70 72 65 63 20 0a  rec($op) $prec .
07e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 6f 70 6c 69      lappend opli
07f0: 73 74 20 24 6f 70 0a 20 20 7d 0a 7d 0a 0a 0a 23  st $op.  }.}...#
0800: 20 48 6f 6f 6b 20 69 6e 20 64 65 66 69 6e 69 74   Hook in definit
0810: 69 6f 6e 73 20 6f 66 20 4d 41 54 43 48 20 61 6e  ions of MATCH an
0820: 64 20 52 45 47 45 58 2e 20 54 68 65 20 66 6f 6c  d REGEX. The fol
0830: 6c 6f 77 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  lowing implement
0840: 61 74 69 6f 6e 73 0a 23 20 63 61 75 73 65 20 4d  ations.# cause M
0850: 41 54 43 48 20 61 6e 64 20 52 45 47 45 58 20 74  ATCH and REGEX t
0860: 6f 20 62 65 68 61 76 65 20 73 69 6d 69 6c 61 72  o behave similar
0870: 6c 79 20 74 6f 20 74 68 65 20 3d 3d 20 6f 70 65  ly to the == ope
0880: 72 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 6d 61  rator..#.proc ma
0890: 74 63 68 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20  tchfunc {a b} { 
08a0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 61  return [expr {$a
08b0: 3d 3d 24 62 7d 5d 20 7d 0a 70 72 6f 63 20 72 65  ==$b}] }.proc re
08c0: 67 65 78 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20  gexfunc {a b} { 
08d0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 61  return [expr {$a
08e0: 3d 3d 24 62 7d 5d 20 7d 0a 64 62 20 66 75 6e 63  ==$b}] }.db func
08f0: 20 6d 61 74 63 68 20 20 2d 61 72 67 63 6f 75 6e   match  -argcoun
0900: 74 20 32 20 6d 61 74 63 68 66 75 6e 63 0a 64 62  t 2 matchfunc.db
0910: 20 66 75 6e 63 20 72 65 67 65 78 70 20 2d 61 72   func regexp -ar
0920: 67 63 6f 75 6e 74 20 32 20 72 65 67 65 78 66 75  gcount 2 regexfu
0930: 6e 63 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  nc..#-----------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0980: 20 54 65 73 74 20 63 61 73 65 73 20 65 5f 65 78   Test cases e_ex
0990: 70 72 2d 31 2e 2a 20 61 74 74 65 6d 70 74 20 74  pr-1.* attempt t
09a0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61 6c  o verify that al
09b0: 6c 20 62 69 6e 61 72 79 20 6f 70 65 72 61 74 6f  l binary operato
09c0: 72 73 20 6c 69 73 74 65 64 0a 23 20 69 6e 20 74  rs listed.# in t
09d0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
09e0: 20 65 78 69 73 74 20 61 6e 64 20 74 68 61 74 20   exist and that 
09f0: 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 72 65  the relative pre
0a00: 63 65 64 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  cedences of the.
0a10: 23 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  # operators are 
0a20: 61 6c 73 6f 20 61 73 20 74 68 65 20 64 6f 63 75  also as the docu
0a30: 6d 65 6e 74 61 74 69 6f 6e 20 73 75 67 67 65 73  mentation sugges
0a40: 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ts..#.# EVIDENCE
0a50: 2d 4f 46 3a 20 52 2d 31 35 35 31 34 2d 36 35 31  -OF: R-15514-651
0a60: 36 33 20 53 51 4c 69 74 65 20 75 6e 64 65 72 73  63 SQLite unders
0a70: 74 61 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f 77  tands the follow
0a80: 69 6e 67 20 62 69 6e 61 72 79 0a 23 20 6f 70 65  ing binary.# ope
0a90: 72 61 74 6f 72 73 2c 20 69 6e 20 6f 72 64 65 72  rators, in order
0aa0: 20 66 72 6f 6d 20 68 69 67 68 65 73 74 20 74 6f   from highest to
0ab0: 20 6c 6f 77 65 73 74 20 70 72 65 63 65 64 65 6e   lowest preceden
0ac0: 63 65 3a 20 7c 7c 20 2a 20 2f 20 25 20 2b 20 2d  ce: || * / % + -
0ad0: 0a 23 20 3c 3c 20 3e 3e 20 26 20 7c 20 3c 20 3c  .# << >> & | < <
0ae0: 3d 20 3e 20 3e 3d 20 3d 20 3d 3d 20 21 3d 20 3c  = > >= = == != <
0af0: 3e 20 49 53 20 49 53 0a 23 20 4e 4f 54 20 49 4e  > IS IS.# NOT IN
0b00: 20 4c 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48   LIKE GLOB MATCH
0b10: 20 52 45 47 45 58 50 20 41 4e 44 20 4f 52 0a 23   REGEXP AND OR.#
0b20: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
0b30: 52 2d 33 38 37 35 39 2d 33 38 37 38 39 20 4f 70  R-38759-38789 Op
0b40: 65 72 61 74 6f 72 73 20 49 53 20 61 6e 64 20 49  erators IS and I
0b50: 53 20 4e 4f 54 20 68 61 76 65 20 74 68 65 20 73  S NOT have the s
0b60: 61 6d 65 0a 23 20 70 72 65 63 65 64 65 6e 63 65  ame.# precedence
0b70: 20 61 73 20 3d 2e 0a 23 0a 0a 75 6e 73 65 74 20   as =..#..unset 
0b80: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 75 6e 74 65  -nocomplain unte
0b90: 73 74 65 64 0a 66 6f 72 65 61 63 68 20 6f 70 31  sted.foreach op1
0ba0: 20 24 6f 70 6c 69 73 74 20 7b 0a 20 20 66 6f 72   $oplist {.  for
0bb0: 65 61 63 68 20 6f 70 32 20 24 6f 70 6c 69 73 74  each op2 $oplist
0bc0: 20 7b 0a 20 20 20 20 73 65 74 20 75 6e 74 65 73   {.    set untes
0bd0: 74 65 64 28 24 6f 70 31 2c 24 6f 70 32 29 20 31  ted($op1,$op2) 1
0be0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 74 6e  .    foreach {tn
0bf0: 20 41 20 42 20 43 7d 20 7b 0a 20 20 20 20 20 20   A B C} {.      
0c00: 20 31 20 20 20 20 20 32 32 20 20 20 34 35 20 20   1     22   45  
0c10: 20 20 36 36 0a 20 20 20 20 20 20 20 32 20 20 20    66.       2   
0c20: 20 20 20 30 20 20 20 20 30 20 20 20 20 20 30 0a     0    0     0.
0c30: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 30 20         3      0 
0c40: 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20 20     0     1.     
0c50: 20 20 34 20 20 20 20 20 20 30 20 20 20 20 31 20    4      0    1 
0c60: 20 20 20 20 30 0a 20 20 20 20 20 20 20 35 20 20      0.       5  
0c70: 20 20 20 20 30 20 20 20 20 31 20 20 20 20 20 31      0    1     1
0c80: 0a 20 20 20 20 20 20 20 36 20 20 20 20 20 20 31  .       6      1
0c90: 20 20 20 20 30 20 20 20 20 20 30 0a 20 20 20 20      0     0.    
0ca0: 20 20 20 37 20 20 20 20 20 20 31 20 20 20 20 30     7      1    0
0cb0: 20 20 20 20 20 31 0a 20 20 20 20 20 20 20 38 20       1.       8 
0cc0: 20 20 20 20 20 31 20 20 20 20 31 20 20 20 20 20       1    1     
0cd0: 30 0a 20 20 20 20 20 20 20 39 20 20 20 20 20 20  0.       9      
0ce0: 31 20 20 20 20 31 20 20 20 20 20 31 0a 20 20 20  1    1     1.   
0cf0: 20 20 20 31 30 20 20 20 20 20 20 35 20 20 20 20     10      5    
0d00: 36 20 20 20 20 20 31 0a 20 20 20 20 20 20 31 31  6     1.      11
0d10: 20 20 20 20 20 20 31 20 20 20 20 35 20 20 20 20        1    5    
0d20: 20 36 0a 20 20 20 20 20 20 31 32 20 20 20 20 20   6.      12     
0d30: 20 31 20 20 20 20 35 20 20 20 20 20 35 0a 20 20   1    5     5.  
0d40: 20 20 20 20 31 33 20 20 20 20 20 20 35 20 20 20      13      5   
0d50: 20 35 20 20 20 20 20 31 0a 0a 20 20 20 20 20 20   5     1..      
0d60: 31 34 20 20 20 20 20 20 35 20 20 20 20 32 20 20  14      5    2  
0d70: 20 20 20 31 0a 20 20 20 20 20 20 31 35 20 20 20     1.      15   
0d80: 20 20 20 31 20 20 20 20 34 20 20 20 20 20 31 0a     1    4     1.
0d90: 20 20 20 20 20 20 31 36 20 20 20 20 20 2d 31 20        16     -1 
0da0: 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20 20     0     1.     
0db0: 20 31 37 20 20 20 20 20 20 30 20 20 20 20 31 20   17      0    1 
0dc0: 20 20 20 2d 31 0a 0a 20 20 20 20 7d 20 7b 0a 20     -1..    } {. 
0dd0: 20 20 20 20 20 73 65 74 20 74 65 73 74 6e 61 6d       set testnam
0de0: 65 20 22 65 5f 65 78 70 72 2d 31 2e 24 6f 70 6e  e "e_expr-1.$opn
0df0: 61 6d 65 28 24 6f 70 31 29 2e 24 6f 70 6e 61 6d  ame($op1).$opnam
0e00: 65 28 24 6f 70 32 29 2e 24 74 6e 22 0a 0a 20 20  e($op2).$tn"..  
0e10: 20 20 20 20 23 20 49 66 20 24 6f 70 32 20 67 72      # If $op2 gr
0e20: 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74 6c  oups more tightl
0e30: 79 20 74 68 61 6e 20 24 6f 70 31 2c 20 74 68 65  y than $op1, the
0e40: 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  n the result.   
0e50: 20 20 20 23 20 6f 66 20 65 78 65 63 75 74 69 6e     # of executin
0e60: 67 20 24 73 71 6c 31 20 77 68 6f 75 6c 64 20 62  g $sql1 whould b
0e70: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78  e the same as ex
0e80: 65 63 75 74 69 6e 67 20 24 73 71 6c 33 2e 0a 20  ecuting $sql3.. 
0e90: 20 20 20 20 20 23 20 49 66 20 24 6f 70 31 20 67       # If $op1 g
0ea0: 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74  roups more tight
0eb0: 6c 79 2c 20 6f 72 20 69 66 20 24 6f 70 31 20 61  ly, or if $op1 a
0ec0: 6e 64 20 24 6f 70 32 20 68 61 76 65 20 0a 20 20  nd $op2 have .  
0ed0: 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20 70      # the same p
0ee0: 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 6e 20  recedence, then 
0ef0: 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c 31 20  executing $sql1 
0f00: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20 20  should return.  
0f10: 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20 76      # the same v
0f20: 61 6c 75 65 20 61 73 20 24 73 71 6c 32 2e 0a 20  alue as $sql2.. 
0f30: 20 20 20 20 20 23 0a 20 20 20 20 20 20 73 65 74       #.      set
0f40: 20 73 71 6c 31 20 22 53 45 4c 45 43 54 20 24 41   sql1 "SELECT $A
0f50: 20 24 6f 70 31 20 24 42 20 24 6f 70 32 20 24 43   $op1 $B $op2 $C
0f60: 22 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 32  ".      set sql2
0f70: 20 22 53 45 4c 45 43 54 20 28 24 41 20 24 6f 70   "SELECT ($A $op
0f80: 31 20 24 42 29 20 24 6f 70 32 20 24 43 22 0a 20  1 $B) $op2 $C". 
0f90: 20 20 20 20 20 73 65 74 20 73 71 6c 33 20 22 53       set sql3 "S
0fa0: 45 4c 45 43 54 20 24 41 20 24 6f 70 31 20 28 24  ELECT $A $op1 ($
0fb0: 42 20 24 6f 70 32 20 24 43 29 22 0a 0a 20 20 20  B $op2 $C)"..   
0fc0: 20 20 20 73 65 74 20 61 32 20 5b 64 62 20 6f 6e     set a2 [db on
0fd0: 65 20 24 73 71 6c 32 5d 0a 20 20 20 20 20 20 73  e $sql2].      s
0fe0: 65 74 20 61 33 20 5b 64 62 20 6f 6e 65 20 24 73  et a3 [db one $s
0ff0: 71 6c 33 5d 0a 0a 20 20 20 20 20 20 64 6f 5f 65  ql3]..      do_e
1000: 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 65 73  xecsql_test $tes
1010: 74 6e 61 6d 65 20 24 73 71 6c 31 20 5b 6c 69 73  tname $sql1 [lis
1020: 74 20 5b 0a 20 20 20 20 20 20 20 20 69 66 20 7b  t [.        if {
1030: 24 6f 70 70 72 65 63 28 24 6f 70 32 29 20 3c 20  $opprec($op2) < 
1040: 24 6f 70 70 72 65 63 28 24 6f 70 31 29 7d 20 7b  $opprec($op1)} {
1050: 73 65 74 20 61 33 7d 20 7b 73 65 74 20 61 32 7d  set a3} {set a2}
1060: 0a 20 20 20 20 20 20 5d 5d 0a 20 20 20 20 20 20  .      ]].      
1070: 69 66 20 7b 24 61 32 20 21 3d 20 24 61 33 7d 20  if {$a2 != $a3} 
1080: 7b 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  { unset -nocompl
1090: 61 69 6e 20 75 6e 74 65 73 74 65 64 28 24 6f 70  ain untested($op
10a0: 31 2c 24 6f 70 32 29 20 7d 0a 20 20 20 20 7d 0a  1,$op2) }.    }.
10b0: 20 20 7d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 6f    }.}..foreach o
10c0: 70 20 7b 2a 20 41 4e 44 20 4f 52 20 2b 20 7c 7c  p {* AND OR + ||
10d0: 20 26 20 7c 7d 20 7b 20 75 6e 73 65 74 20 75 6e   & |} { unset un
10e0: 74 65 73 74 65 64 28 24 6f 70 2c 24 6f 70 29 20  tested($op,$op) 
10f0: 7d 0a 75 6e 73 65 74 20 75 6e 74 65 73 74 65 64  }.unset untested
1100: 28 2b 2c 2d 29 20 20 3b 23 20 20 20 20 20 20 20  (+,-)  ;#       
1110: 53 69 6e 63 65 20 20 20 20 28 61 2b 62 29 2d 63  Since    (a+b)-c
1120: 20 3d 3d 20 61 2b 28 62 2d 63 29 0a 75 6e 73 65   == a+(b-c).unse
1130: 74 20 75 6e 74 65 73 74 65 64 28 2a 2c 3c 3c 29  t untested(*,<<)
1140: 20 3b 23 20 20 20 20 20 20 20 53 69 6e 63 65 20   ;#       Since 
1150: 20 20 20 28 61 2a 62 29 3c 3c 63 20 3d 3d 20 61     (a*b)<<c == a
1160: 2a 28 62 3c 3c 63 29 0a 0a 64 6f 5f 74 65 73 74  *(b<<c)..do_test
1170: 20 65 5f 65 78 70 72 2d 31 2e 31 20 7b 20 61 72   e_expr-1.1 { ar
1180: 72 61 79 20 6e 61 6d 65 73 20 75 6e 74 65 73 74  ray names untest
1190: 65 64 20 7d 20 7b 7d 0a 0a 23 20 41 74 20 6f 6e  ed } {}..# At on
11a0: 65 20 70 6f 69 6e 74 2c 20 74 65 73 74 20 31 2e  e point, test 1.
11b0: 32 2e 32 20 77 61 73 20 66 61 69 6c 69 6e 67 2e  2.2 was failing.
11c0: 20 49 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   Instead of the 
11d0: 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 2c 20  correct result, 
11e0: 69 74 0a 23 20 77 61 73 20 72 65 74 75 72 6e 69  it.# was returni
11f0: 6e 67 20 7b 31 20 31 20 30 7d 2e 20 54 68 69 73  ng {1 1 0}. This
1200: 20 77 6f 75 6c 64 20 73 65 65 6d 20 74 6f 20 69   would seem to i
1210: 6e 64 69 63 61 74 65 20 74 68 61 74 20 4c 49 4b  ndicate that LIK
1220: 45 20 68 61 73 20 74 68 65 0a 23 20 73 61 6d 65  E has the.# same
1230: 20 70 72 65 63 65 64 65 6e 63 65 20 61 73 20 27   precedence as '
1240: 3c 27 2e 20 57 68 69 63 68 20 69 73 20 69 6e 63  <'. Which is inc
1250: 6f 72 72 65 63 74 2e 20 49 74 20 68 61 73 20 6c  orrect. It has l
1260: 6f 77 65 72 20 70 72 65 63 65 64 65 6e 63 65 2e  ower precedence.
1270: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1280: 73 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 31 20  st e_expr-1.2.1 
1290: 7b 20 0a 20 20 53 45 4c 45 43 54 20 30 20 3c 20  { .  SELECT 0 < 
12a0: 32 20 4c 49 4b 45 20 31 2c 20 20 20 28 30 20 3c  2 LIKE 1,   (0 <
12b0: 20 32 29 20 4c 49 4b 45 20 31 2c 20 20 20 30 20   2) LIKE 1,   0 
12c0: 3c 20 28 32 20 4c 49 4b 45 20 31 29 0a 7d 20 7b  < (2 LIKE 1).} {
12d0: 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71  1 1 0}.do_execsq
12e0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 2e  l_test e_expr-1.
12f0: 32 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  2.2 { .  SELECT 
1300: 30 20 4c 49 4b 45 20 30 20 3c 20 32 2c 20 20 20  0 LIKE 0 < 2,   
1310: 28 30 20 4c 49 4b 45 20 30 29 20 3c 20 32 2c 20  (0 LIKE 0) < 2, 
1320: 20 20 30 20 4c 49 4b 45 20 28 30 20 3c 20 32 29    0 LIKE (0 < 2)
1330: 0a 7d 20 7b 30 20 31 20 30 7d 0a 0a 23 20 53 68  .} {0 1 0}..# Sh
1340: 6f 77 69 6e 67 20 74 68 61 74 20 4c 49 4b 45 20  owing that LIKE 
1350: 61 6e 64 20 3d 3d 20 68 61 76 65 20 74 68 65 20  and == have the 
1360: 73 61 6d 65 20 70 72 65 63 65 64 65 6e 63 65 0a  same precedence.
1370: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
1380: 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 33 20 7b  t e_expr-1.2.3 {
1390: 20 0a 20 20 53 45 4c 45 43 54 20 32 20 4c 49 4b   .  SELECT 2 LIK
13a0: 45 20 32 20 3d 3d 20 31 2c 20 20 20 28 32 20 4c  E 2 == 1,   (2 L
13b0: 49 4b 45 20 32 29 20 3d 3d 20 31 2c 20 20 20 20  IKE 2) == 1,    
13c0: 32 20 4c 49 4b 45 20 28 32 20 3d 3d 20 31 29 0a  2 LIKE (2 == 1).
13d0: 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65  } {1 1 0}.do_exe
13e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
13f0: 2d 31 2e 32 2e 34 20 7b 20 0a 20 20 53 45 4c 45  -1.2.4 { .  SELE
1400: 43 54 20 32 20 3d 3d 20 32 20 4c 49 4b 45 20 31  CT 2 == 2 LIKE 1
1410: 2c 20 20 20 28 32 20 3d 3d 20 32 29 20 4c 49 4b  ,   (2 == 2) LIK
1420: 45 20 31 2c 20 20 20 20 32 20 3d 3d 20 28 32 20  E 1,    2 == (2 
1430: 4c 49 4b 45 20 31 29 0a 7d 20 7b 31 20 31 20 30  LIKE 1).} {1 1 0
1440: 7d 0a 0a 23 20 53 68 6f 77 69 6e 67 20 74 68 61  }..# Showing tha
1450: 74 20 3c 20 67 72 6f 75 70 73 20 6d 6f 72 65 20  t < groups more 
1460: 74 69 67 68 74 6c 79 20 74 68 61 6e 20 3d 3d 20  tightly than == 
1470: 28 3c 20 68 61 73 20 68 69 67 68 65 72 20 70 72  (< has higher pr
1480: 65 63 65 64 65 6e 63 65 29 2e 20 0a 23 0a 64 6f  ecedence). .#.do
1490: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
14a0: 65 78 70 72 2d 31 2e 32 2e 35 20 7b 20 0a 20 20  expr-1.2.5 { .  
14b0: 53 45 4c 45 43 54 20 30 20 3c 20 32 20 3d 3d 20  SELECT 0 < 2 == 
14c0: 31 2c 20 20 20 28 30 20 3c 20 32 29 20 3d 3d 20  1,   (0 < 2) == 
14d0: 31 2c 20 20 20 30 20 3c 20 28 32 20 3d 3d 20 31  1,   0 < (2 == 1
14e0: 29 0a 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65  ).} {1 1 0}.do_e
14f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
1500: 70 72 2d 31 2e 36 20 7b 20 0a 20 20 53 45 4c 45  pr-1.6 { .  SELE
1510: 43 54 20 30 20 3d 3d 20 30 20 3c 20 32 2c 20 20  CT 0 == 0 < 2,  
1520: 20 28 30 20 3d 3d 20 30 29 20 3c 20 32 2c 20 20   (0 == 0) < 2,  
1530: 20 30 20 3d 3d 20 28 30 20 3c 20 32 29 0a 7d 20   0 == (0 < 2).} 
1540: 7b 30 20 31 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  {0 1 0}..#------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
15a0: 20 74 68 65 20 66 6f 75 72 20 75 6e 61 72 79 20   the four unary 
15b0: 70 72 65 66 69 78 20 6f 70 65 72 61 74 6f 72 73  prefix operators
15c0: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
15d0: 65 20 0a 23 20 64 6f 63 75 6d 65 6e 74 61 74 69  e .# documentati
15e0: 6f 6e 20 65 78 69 73 74 2e 0a 23 0a 23 20 45 56  on exist..#.# EV
15f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 39  IDENCE-OF: R-139
1600: 35 38 2d 35 33 34 31 39 20 53 75 70 70 6f 72 74  58-53419 Support
1610: 65 64 20 75 6e 61 72 79 20 70 72 65 66 69 78 20  ed unary prefix 
1620: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 74 68  operators are th
1630: 65 73 65 3a 0a 23 20 2d 20 2b 20 7e 20 4e 4f 54  ese:.# - + ~ NOT
1640: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1650: 73 74 20 65 5f 65 78 70 72 2d 32 2e 31 20 7b 20  st e_expr-2.1 { 
1660: 53 45 4c 45 43 54 20 2d 20 20 20 31 30 20 20 20  SELECT -   10   
1670: 7d 20 7b 2d 31 30 7d 0a 64 6f 5f 65 78 65 63 73  } {-10}.do_execs
1680: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
1690: 2e 32 20 7b 20 53 45 4c 45 43 54 20 2b 20 20 20  .2 { SELECT +   
16a0: 31 30 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65  10   } {10}.do_e
16b0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
16c0: 70 72 2d 32 2e 33 20 7b 20 53 45 4c 45 43 54 20  pr-2.3 { SELECT 
16d0: 7e 20 20 20 31 30 20 20 20 7d 20 7b 2d 31 31 7d  ~   10   } {-11}
16e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
16f0: 20 65 5f 65 78 70 72 2d 32 2e 34 20 7b 20 53 45   e_expr-2.4 { SE
1700: 4c 45 43 54 20 4e 4f 54 20 31 30 20 20 20 7d 20  LECT NOT 10   } 
1710: 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {0}..#----------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1760: 23 20 54 65 73 74 73 20 66 6f 72 20 74 68 65 20  # Tests for the 
1770: 74 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 6d  two statements m
1780: 61 64 65 20 72 65 67 61 72 64 69 6e 67 20 74 68  ade regarding th
1790: 65 20 75 6e 61 72 79 20 2b 20 6f 70 65 72 61 74  e unary + operat
17a0: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
17b0: 2d 4f 46 3a 20 52 2d 35 33 36 37 30 2d 30 33 33  -OF: R-53670-033
17c0: 37 33 20 54 68 65 20 75 6e 61 72 79 20 6f 70 65  73 The unary ope
17d0: 72 61 74 6f 72 20 2b 20 69 73 20 61 20 6e 6f 2d  rator + is a no-
17e0: 6f 70 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  op..#.# EVIDENCE
17f0: 2d 4f 46 3a 20 52 2d 31 39 34 38 30 2d 33 30 39  -OF: R-19480-309
1800: 36 38 20 49 74 20 63 61 6e 20 62 65 20 61 70 70  68 It can be app
1810: 6c 69 65 64 20 74 6f 20 73 74 72 69 6e 67 73 2c  lied to strings,
1820: 20 6e 75 6d 62 65 72 73 2c 0a 23 20 62 6c 6f 62   numbers,.# blob
1830: 73 20 6f 72 20 4e 55 4c 4c 20 61 6e 64 20 69 74  s or NULL and it
1840: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1850: 61 20 72 65 73 75 6c 74 20 77 69 74 68 20 74 68  a result with th
1860: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 0a  e same value as.
1870: 23 20 74 68 65 20 6f 70 65 72 61 6e 64 2e 0a 23  # the operand..#
1880: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6c 69 74  .foreach {tn lit
1890: 65 72 61 6c 20 74 79 70 65 7d 20 7b 0a 20 20 31  eral type} {.  1
18a0: 20 20 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c 64       'helloworld
18b0: 27 20 20 20 74 65 78 74 0a 20 20 32 20 20 20 20  '   text.  2    
18c0: 20 34 35 20 20 20 20 20 20 20 20 20 20 20 20 20   45             
18d0: 69 6e 74 65 67 65 72 0a 20 20 33 20 20 20 20 20  integer.  3     
18e0: 34 35 2e 32 20 20 20 20 20 20 20 20 20 20 20 72  45.2           r
18f0: 65 61 6c 0a 20 20 34 20 20 20 20 20 34 35 2e 30  eal.  4     45.0
1900: 20 20 20 20 20 20 20 20 20 20 20 72 65 61 6c 0a             real.
1910: 20 20 35 20 20 20 20 20 58 27 41 42 43 44 45 46    5     X'ABCDEF
1920: 27 20 20 20 20 20 20 62 6c 6f 62 0a 20 20 36 20  '      blob.  6 
1930: 20 20 20 20 4e 55 4c 4c 20 20 20 20 20 20 20 20      NULL        
1940: 20 20 20 6e 75 6c 6c 0a 7d 20 7b 0a 20 20 73 65     null.} {.  se
1950: 74 20 73 71 6c 20 22 20 53 45 4c 45 43 54 20 71  t sql " SELECT q
1960: 75 6f 74 65 28 20 2b 20 24 6c 69 74 65 72 61 6c  uote( + $literal
1970: 20 29 2c 20 74 79 70 65 6f 66 28 20 2b 20 24 6c   ), typeof( + $l
1980: 69 74 65 72 61 6c 29 20 22 0a 20 20 64 6f 5f 65  iteral) ".  do_e
1990: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
19a0: 70 72 2d 33 2e 24 74 6e 20 24 73 71 6c 20 5b 6c  pr-3.$tn $sql [l
19b0: 69 73 74 20 24 6c 69 74 65 72 61 6c 20 24 74 79  ist $literal $ty
19c0: 70 65 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  pe].}..#--------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a10: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 62  -.# Check that b
1a20: 6f 74 68 20 3d 20 61 6e 64 20 3d 3d 20 61 72 65  oth = and == are
1a30: 20 62 6f 74 68 20 61 63 63 65 70 74 61 62 6c 65   both acceptable
1a40: 20 61 73 20 74 68 65 20 22 65 71 75 61 6c 73 22   as the "equals"
1a50: 20 6f 70 65 72 61 74 6f 72 2e 0a 23 20 53 69 6d   operator..# Sim
1a60: 69 6c 61 72 6c 79 2c 20 65 69 74 68 65 72 20 21  ilarly, either !
1a70: 3d 20 6f 72 20 3c 3e 20 77 6f 72 6b 20 61 73 20  = or <> work as 
1a80: 74 68 65 20 6e 6f 74 2d 65 71 75 61 6c 73 20 6f  the not-equals o
1a90: 70 65 72 61 74 6f 72 2e 0a 23 0a 23 20 45 56 49  perator..#.# EVI
1aa0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 37  DENCE-OF: R-0367
1ab0: 39 2d 36 30 36 33 39 20 45 71 75 61 6c 73 20 63  9-60639 Equals c
1ac0: 61 6e 20 62 65 20 65 69 74 68 65 72 20 3d 20 6f  an be either = o
1ad0: 72 20 3d 3d 2e 0a 23 0a 23 20 45 56 49 44 45 4e  r ==..#.# EVIDEN
1ae0: 43 45 2d 4f 46 3a 20 52 2d 33 30 30 38 32 2d 33  CE-OF: R-30082-3
1af0: 38 39 39 36 20 54 68 65 20 6e 6f 6e 2d 65 71 75  8996 The non-equ
1b00: 61 6c 73 20 6f 70 65 72 61 74 6f 72 20 63 61 6e  als operator can
1b10: 20 62 65 20 65 69 74 68 65 72 20 21 3d 20 6f 72   be either != or
1b20: 0a 23 20 3c 3e 2e 0a 23 0a 66 6f 72 65 61 63 68  .# <>..#.foreach
1b30: 20 7b 74 6e 20 6c 69 74 65 72 61 6c 20 64 69 66   {tn literal dif
1b40: 66 65 72 65 6e 74 7d 20 7b 0a 20 20 31 20 20 20  ferent} {.  1   
1b50: 27 68 65 6c 6c 6f 77 6f 72 6c 64 27 20 20 27 31  'helloworld'  '1
1b60: 32 33 34 35 27 0a 20 20 32 20 20 20 32 32 20 20  2345'.  2   22  
1b70: 20 20 20 20 20 20 20 20 20 20 32 33 0a 20 20 33            23.  3
1b80: 20 20 20 27 78 79 7a 27 20 20 20 20 20 20 20 20     'xyz'        
1b90: 20 58 27 37 38 37 39 37 41 27 0a 20 20 34 20 20   X'78797A'.  4  
1ba0: 20 58 27 37 38 37 39 37 41 30 30 27 20 20 20 27   X'78797A00'   '
1bb0: 78 79 7a 27 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78  xyz'.} {.  do_ex
1bc0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
1bd0: 72 2d 34 2e 24 74 6e 20 22 0a 20 20 20 20 53 45  r-4.$tn ".    SE
1be0: 4c 45 43 54 20 24 6c 69 74 65 72 61 6c 20 20 3d  LECT $literal  =
1bf0: 20 24 6c 69 74 65 72 61 6c 2c 20 20 20 24 6c 69   $literal,   $li
1c00: 74 65 72 61 6c 20 3d 3d 20 24 6c 69 74 65 72 61  teral == $litera
1c10: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24 6c  l,.           $l
1c20: 69 74 65 72 61 6c 20 20 3d 20 24 64 69 66 66 65  iteral  = $diffe
1c30: 72 65 6e 74 2c 20 24 6c 69 74 65 72 61 6c 20 3d  rent, $literal =
1c40: 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 0a 20 20  = $different,.  
1c50: 20 20 20 20 20 20 20 20 20 24 6c 69 74 65 72 61           $litera
1c60: 6c 20 20 3d 20 4e 55 4c 4c 2c 20 20 20 20 20 20  l  = NULL,      
1c70: 20 24 6c 69 74 65 72 61 6c 20 3d 3d 20 4e 55 4c   $literal == NUL
1c80: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24 6c  L,.           $l
1c90: 69 74 65 72 61 6c 20 21 3d 20 24 6c 69 74 65 72  iteral != $liter
1ca0: 61 6c 2c 20 20 20 24 6c 69 74 65 72 61 6c 20 3c  al,   $literal <
1cb0: 3e 20 24 6c 69 74 65 72 61 6c 2c 0a 20 20 20 20  > $literal,.    
1cc0: 20 20 20 20 20 20 20 24 6c 69 74 65 72 61 6c 20         $literal 
1cd0: 21 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 20 24  != $different, $
1ce0: 6c 69 74 65 72 61 6c 20 3c 3e 20 24 64 69 66 66  literal <> $diff
1cf0: 65 72 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  erent,.         
1d00: 20 20 24 6c 69 74 65 72 61 6c 20 21 3d 20 4e 55    $literal != NU
1d10: 4c 4c 2c 20 20 20 20 20 20 20 24 6c 69 74 65 72  LL,       $liter
1d20: 61 6c 20 21 3d 20 4e 55 4c 4c 0a 0a 20 20 22 20  al != NULL..  " 
1d30: 7b 31 20 31 20 30 20 30 20 7b 7d 20 7b 7d 20 30  {1 1 0 0 {} {} 0
1d40: 20 30 20 31 20 31 20 7b 7d 20 7b 7d 7d 0a 7d 0a   0 1 1 {} {}}.}.
1d50: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
1da0: 73 74 20 74 68 65 20 7c 7c 20 6f 70 65 72 61 74  st the || operat
1db0: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
1dc0: 2d 4f 46 3a 20 52 2d 34 34 34 30 39 2d 36 32 36  -OF: R-44409-626
1dd0: 34 31 20 54 68 65 20 7c 7c 20 6f 70 65 72 61 74  41 The || operat
1de0: 6f 72 20 69 73 20 22 63 6f 6e 63 61 74 65 6e 61  or is "concatena
1df0: 74 65 22 20 2d 20 69 74 20 6a 6f 69 6e 73 0a 23  te" - it joins.#
1e00: 20 74 6f 67 65 74 68 65 72 20 74 68 65 20 74 77   together the tw
1e10: 6f 20 73 74 72 69 6e 67 73 20 6f 66 20 69 74 73  o strings of its
1e20: 20 6f 70 65 72 61 6e 64 73 2e 0a 23 0a 66 6f 72   operands..#.for
1e30: 65 61 63 68 20 7b 74 6e 20 61 20 62 7d 20 7b 0a  each {tn a b} {.
1e40: 20 20 31 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c    1   'helloworl
1e50: 64 27 20 20 27 31 32 33 34 35 27 0a 20 20 32 20  d'  '12345'.  2 
1e60: 20 20 32 32 20 20 20 20 20 20 20 20 20 20 20 20    22            
1e70: 32 33 0a 7d 20 7b 0a 20 20 73 65 74 20 61 73 20  23.} {.  set as 
1e80: 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20  [db one "SELECT 
1e90: 24 61 22 5d 0a 20 20 73 65 74 20 62 73 20 5b 64  $a"].  set bs [d
1ea0: 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 24 62  b one "SELECT $b
1eb0: 22 5d 0a 20 20 0a 20 20 64 6f 5f 65 78 65 63 73  "].  .  do_execs
1ec0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 35  ql_test e_expr-5
1ed0: 2e 24 74 6e 20 22 53 45 4c 45 43 54 20 24 61 20  .$tn "SELECT $a 
1ee0: 7c 7c 20 24 62 22 20 5b 6c 69 73 74 20 22 24 7b  || $b" [list "${
1ef0: 61 73 7d 24 7b 62 73 7d 22 5d 0a 7d 0a 0a 23 2d  as}${bs}"].}..#-
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
1f50: 74 68 65 20 25 20 6f 70 65 72 61 74 6f 72 2e 0a  the % operator..
1f60: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
1f70: 20 52 2d 30 34 32 32 33 2d 30 34 33 35 32 20 54   R-04223-04352 T
1f80: 68 65 20 6f 70 65 72 61 74 6f 72 20 25 20 6f 75  he operator % ou
1f90: 74 70 75 74 73 20 74 68 65 20 69 6e 74 65 67 65  tputs the intege
1fa0: 72 20 76 61 6c 75 65 20 6f 66 0a 23 20 69 74 73  r value of.# its
1fb0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6d 6f   left operand mo
1fc0: 64 75 6c 6f 20 69 74 73 20 72 69 67 68 74 20 6f  dulo its right o
1fd0: 70 65 72 61 6e 64 2e 0a 23 0a 64 6f 5f 65 78 65  perand..#.do_exe
1fe0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
1ff0: 2d 36 2e 31 20 7b 53 45 4c 45 43 54 20 20 37 32  -6.1 {SELECT  72
2000: 25 35 7d 20 20 7b 32 7d 0a 64 6f 5f 65 78 65 63  %5}  {2}.do_exec
2010: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
2020: 36 2e 32 20 7b 53 45 4c 45 43 54 20 20 37 32 25  6.2 {SELECT  72%
2030: 2d 35 7d 20 7b 32 7d 0a 64 6f 5f 65 78 65 63 73  -5} {2}.do_execs
2040: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 36  ql_test e_expr-6
2050: 2e 33 20 7b 53 45 4c 45 43 54 20 2d 37 32 25 2d  .3 {SELECT -72%-
2060: 35 7d 20 7b 2d 32 7d 0a 64 6f 5f 65 78 65 63 73  5} {-2}.do_execs
2070: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 36  ql_test e_expr-6
2080: 2e 34 20 7b 53 45 4c 45 43 54 20 2d 37 32 25 35  .4 {SELECT -72%5
2090: 7d 20 20 7b 2d 32 7d 0a 64 6f 5f 65 78 65 63 73  }  {-2}.do_execs
20a0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 36  ql_test e_expr-6
20b0: 2e 35 20 7b 53 45 4c 45 43 54 20 37 32 2e 33 35  .5 {SELECT 72.35
20c0: 25 35 7d 20 7b 32 2e 30 7d 0a 0a 23 2d 2d 2d 2d  %5} {2.0}..#----
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2110: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
2120: 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  t the results of
2130: 20 61 6c 6c 20 62 69 6e 61 72 79 20 6f 70 65 72   all binary oper
2140: 61 74 6f 72 73 20 61 72 65 20 65 69 74 68 65 72  ators are either
2150: 20 6e 75 6d 65 72 69 63 20 6f 72 20 0a 23 20 4e   numeric or .# N
2160: 55 4c 4c 2c 20 65 78 63 65 70 74 20 66 6f 72 20  ULL, except for 
2170: 74 68 65 20 7c 7c 20 6f 70 65 72 61 74 6f 72 2c  the || operator,
2180: 20 77 68 69 63 68 20 6d 61 79 20 65 76 61 6c 75   which may evalu
2190: 61 74 65 20 74 6f 20 65 69 74 68 65 72 20 61 20  ate to either a 
21a0: 74 65 78 74 0a 23 20 76 61 6c 75 65 20 6f 72 20  text.# value or 
21b0: 4e 55 4c 4c 2e 0a 23 0a 23 20 45 56 49 44 45 4e  NULL..#.# EVIDEN
21c0: 43 45 2d 4f 46 3a 20 52 2d 32 30 36 36 35 2d 31  CE-OF: R-20665-1
21d0: 37 37 39 32 20 54 68 65 20 72 65 73 75 6c 74 20  7792 The result 
21e0: 6f 66 20 61 6e 79 20 62 69 6e 61 72 79 20 6f 70  of any binary op
21f0: 65 72 61 74 6f 72 20 69 73 20 65 69 74 68 65 72  erator is either
2200: 0a 23 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c  .# a numeric val
2210: 75 65 20 6f 72 20 4e 55 4c 4c 2c 20 65 78 63 65  ue or NULL, exce
2220: 70 74 20 66 6f 72 20 74 68 65 20 7c 7c 20 63 6f  pt for the || co
2230: 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 70 65 72  ncatenation oper
2240: 61 74 6f 72 0a 23 20 77 68 69 63 68 20 61 6c 77  ator.# which alw
2250: 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ays evaluates to
2260: 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20   either NULL or 
2270: 61 20 74 65 78 74 20 76 61 6c 75 65 2e 0a 23 0a  a text value..#.
2280: 73 65 74 20 6c 69 74 65 72 61 6c 73 20 7b 0a 20  set literals {. 
2290: 20 31 20 27 61 62 63 27 20 20 20 20 20 20 20 20   1 'abc'        
22a0: 32 20 27 68 65 78 61 64 65 63 69 6d 61 6c 27 20  2 'hexadecimal' 
22b0: 20 20 20 20 20 20 33 20 27 27 0a 20 20 34 20 31        3 ''.  4 1
22c0: 32 33 20 20 20 20 20 20 20 20 20 20 35 20 2d 31  23          5 -1
22d0: 32 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20  23              
22e0: 20 20 36 20 30 0a 20 20 37 20 31 32 33 2e 34 20    6 0.  7 123.4 
22f0: 20 20 20 20 20 20 20 38 20 30 2e 30 20 20 20 20         8 0.0    
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 39 20 2d               9 -
2310: 31 32 33 2e 34 0a 20 31 30 20 58 27 41 42 43 44  123.4. 10 X'ABCD
2320: 45 46 27 20 20 20 31 31 20 58 27 27 20 20 20 20  EF'   11 X''    
2330: 20 20 20 20 20 20 20 20 20 20 20 20 31 32 20 58              12 X
2340: 27 30 30 30 30 27 0a 20 31 33 20 20 20 20 20 4e  '0000'. 13     N
2350: 55 4c 4c 0a 7d 0a 66 6f 72 65 61 63 68 20 6f 70  ULL.}.foreach op
2360: 20 24 6f 70 6c 69 73 74 20 7b 0a 20 20 66 6f 72   $oplist {.  for
2370: 65 61 63 68 20 7b 6e 31 20 72 68 73 7d 20 24 6c  each {n1 rhs} $l
2380: 69 74 65 72 61 6c 73 20 7b 20 0a 20 20 66 6f 72  iterals { .  for
2390: 65 61 63 68 20 7b 6e 32 20 6c 68 73 7d 20 24 6c  each {n2 lhs} $l
23a0: 69 74 65 72 61 6c 73 20 7b 0a 0a 20 20 20 20 73  iterals {..    s
23b0: 65 74 20 74 20 5b 64 62 20 6f 6e 65 20 22 20 53  et t [db one " S
23c0: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 24 6c 68  ELECT typeof($lh
23d0: 73 20 24 6f 70 20 24 72 68 73 29 20 22 5d 0a 20  s $op $rhs) "]. 
23e0: 20 20 20 64 6f 5f 74 65 73 74 20 65 5f 65 78 70     do_test e_exp
23f0: 72 2d 37 2e 24 6f 70 6e 61 6d 65 28 24 6f 70 29  r-7.$opname($op)
2400: 2e 24 6e 31 2e 24 6e 32 20 7b 0a 20 20 20 20 20  .$n1.$n2 {.     
2410: 20 65 78 70 72 20 7b 0a 20 20 20 20 20 20 20 20   expr {.        
2420: 20 20 20 28 24 6f 70 3d 3d 22 7c 7c 22 20 26 26     ($op=="||" &&
2430: 20 28 24 74 20 3d 3d 20 22 74 65 78 74 22 20 7c   ($t == "text" |
2440: 7c 20 24 74 20 3d 3d 20 22 6e 75 6c 6c 22 29 29  | $t == "null"))
2450: 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 24 6f 70  .        || ($op
2460: 21 3d 22 7c 7c 22 20 26 26 20 28 24 74 20 3d 3d  !="||" && ($t ==
2470: 20 22 69 6e 74 65 67 65 72 22 20 7c 7c 20 24 74   "integer" || $t
2480: 20 3d 3d 20 22 72 65 61 6c 22 20 7c 7c 20 24 74   == "real" || $t
2490: 20 3d 3d 20 22 6e 75 6c 6c 22 29 29 0a 20 20 20   == "null")).   
24a0: 20 20 20 7d 0a 20 20 20 20 7d 20 31 0a 0a 20 20     }.    } 1..  
24b0: 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}.}..#---------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2500: 0a 23 20 54 65 73 74 20 74 68 65 20 49 53 20 61  .# Test the IS a
2510: 6e 64 20 49 53 20 4e 4f 54 20 6f 70 65 72 61 74  nd IS NOT operat
2520: 6f 72 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ors..#.# EVIDENC
2530: 45 2d 4f 46 3a 20 52 2d 32 34 37 33 31 2d 34 35  E-OF: R-24731-45
2540: 37 37 33 20 54 68 65 20 49 53 20 61 6e 64 20 49  773 The IS and I
2550: 53 20 4e 4f 54 20 6f 70 65 72 61 74 6f 72 73 20  S NOT operators 
2560: 77 6f 72 6b 20 6c 69 6b 65 20 3d 20 61 6e 64 0a  work like = and.
2570: 23 20 21 3d 20 65 78 63 65 70 74 20 77 68 65 6e  # != except when
2580: 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   one or both of 
2590: 74 68 65 20 6f 70 65 72 61 6e 64 73 20 61 72 65  the operands are
25a0: 20 4e 55 4c 4c 2e 0a 23 0a 23 20 45 56 49 44 45   NULL..#.# EVIDE
25b0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 33 32 35 2d  NCE-OF: R-06325-
25c0: 31 35 33 31 35 20 49 6e 20 74 68 69 73 20 63 61  15315 In this ca
25d0: 73 65 2c 20 69 66 20 62 6f 74 68 20 6f 70 65 72  se, if both oper
25e0: 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 2c 0a 23  ands are NULL,.#
25f0: 20 74 68 65 6e 20 74 68 65 20 49 53 20 6f 70 65   then the IS ope
2600: 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73 20  rator evaluates 
2610: 74 6f 20 31 20 28 74 72 75 65 29 20 61 6e 64 20  to 1 (true) and 
2620: 74 68 65 20 49 53 20 4e 4f 54 20 6f 70 65 72 61  the IS NOT opera
2630: 74 6f 72 0a 23 20 65 76 61 6c 75 61 74 65 73 20  tor.# evaluates 
2640: 74 6f 20 30 20 28 66 61 6c 73 65 29 2e 0a 23 0a  to 0 (false)..#.
2650: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
2660: 2d 31 39 38 31 32 2d 33 36 37 37 39 20 49 66 20  -19812-36779 If 
2670: 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  one operand is N
2680: 55 4c 4c 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ULL and the othe
2690: 72 20 69 73 0a 23 20 6e 6f 74 2c 20 74 68 65 6e  r is.# not, then
26a0: 20 74 68 65 20 49 53 20 6f 70 65 72 61 74 6f 72   the IS operator
26b0: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 30 20   evaluates to 0 
26c0: 28 66 61 6c 73 65 29 20 61 6e 64 20 74 68 65 20  (false) and the 
26d0: 49 53 20 4e 4f 54 0a 23 20 6f 70 65 72 61 74 6f  IS NOT.# operato
26e0: 72 20 69 73 20 31 20 28 74 72 75 65 29 2e 0a 23  r is 1 (true)..#
26f0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
2700: 52 2d 36 31 39 37 35 2d 31 33 34 31 30 20 49 74  R-61975-13410 It
2710: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
2720: 20 66 6f 72 20 61 6e 20 49 53 20 6f 72 20 49 53   for an IS or IS
2730: 20 4e 4f 54 0a 23 20 65 78 70 72 65 73 73 69 6f   NOT.# expressio
2740: 6e 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 6f  n to evaluate to
2750: 20 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f 65 78 65 63   NULL..#.do_exec
2760: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
2770: 38 2e 31 2e 31 20 20 7b 20 53 45 4c 45 43 54 20  8.1.1  { SELECT 
2780: 4e 55 4c 4c 20 49 53 20 20 20 20 20 4e 55 4c 4c  NULL IS     NULL
2790: 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71   } {1}.do_execsq
27a0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
27b0: 31 2e 32 20 20 7b 20 53 45 4c 45 43 54 20 27 61  1.2  { SELECT 'a
27c0: 62 27 20 49 53 20 20 20 20 20 4e 55 4c 4c 20 7d  b' IS     NULL }
27d0: 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {0}.do_execsql_
27e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e  test e_expr-8.1.
27f0: 33 20 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c  3  { SELECT NULL
2800: 20 49 53 20 20 20 20 20 27 61 62 27 20 7d 20 7b   IS     'ab' } {
2810: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
2820: 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 34 20  st e_expr-8.1.4 
2830: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27 20 49   { SELECT 'ab' I
2840: 53 20 20 20 20 20 27 61 62 27 20 7d 20 7b 31 7d  S     'ab' } {1}
2850: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2860: 20 65 5f 65 78 70 72 2d 38 2e 31 2e 35 20 20 7b   e_expr-8.1.5  {
2870: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 3d 3d 20   SELECT NULL == 
2880: 20 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b 7d 7d 0a      NULL } {{}}.
2890: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
28a0: 65 5f 65 78 70 72 2d 38 2e 31 2e 36 20 20 7b 20  e_expr-8.1.6  { 
28b0: 53 45 4c 45 43 54 20 27 61 62 27 20 3d 3d 20 20  SELECT 'ab' ==  
28c0: 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b 7d 7d 0a 64     NULL } {{}}.d
28d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
28e0: 5f 65 78 70 72 2d 38 2e 31 2e 37 20 20 7b 20 53  _expr-8.1.7  { S
28f0: 45 4c 45 43 54 20 4e 55 4c 4c 20 3d 3d 20 20 20  ELECT NULL ==   
2900: 20 20 27 61 62 27 20 7d 20 7b 7b 7d 7d 0a 64 6f    'ab' } {{}}.do
2910: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
2920: 65 78 70 72 2d 38 2e 31 2e 38 20 20 7b 20 53 45  expr-8.1.8  { SE
2930: 4c 45 43 54 20 27 61 62 27 20 3d 3d 20 20 20 20  LECT 'ab' ==    
2940: 20 27 61 62 27 20 7d 20 7b 31 7d 0a 64 6f 5f 65   'ab' } {1}.do_e
2950: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
2960: 70 72 2d 38 2e 31 2e 39 20 20 7b 20 53 45 4c 45  pr-8.1.9  { SELE
2970: 43 54 20 4e 55 4c 4c 20 49 53 20 4e 4f 54 20 4e  CT NULL IS NOT N
2980: 55 4c 4c 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65  ULL } {0}.do_exe
2990: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
29a0: 2d 38 2e 31 2e 31 30 20 7b 20 53 45 4c 45 43 54  -8.1.10 { SELECT
29b0: 20 27 61 62 27 20 49 53 20 4e 4f 54 20 4e 55 4c   'ab' IS NOT NUL
29c0: 4c 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73  L } {1}.do_execs
29d0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38  ql_test e_expr-8
29e0: 2e 31 2e 31 31 20 7b 20 53 45 4c 45 43 54 20 4e  .1.11 { SELECT N
29f0: 55 4c 4c 20 49 53 20 4e 4f 54 20 27 61 62 27 20  ULL IS NOT 'ab' 
2a00: 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {1}.do_execsql
2a10: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31  _test e_expr-8.1
2a20: 2e 31 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .12 { SELECT 'ab
2a30: 27 20 49 53 20 4e 4f 54 20 27 61 62 27 20 7d 20  ' IS NOT 'ab' } 
2a40: 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {0}.do_execsql_t
2a50: 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31  est e_expr-8.1.1
2a60: 33 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20  3 { SELECT NULL 
2a70: 21 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b  !=     NULL } {{
2a80: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
2a90: 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31 34  st e_expr-8.1.14
2aa0: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27 20 21   { SELECT 'ab' !
2ab0: 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b 7d  =     NULL } {{}
2ac0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
2ad0: 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31 35 20  t e_expr-8.1.15 
2ae0: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 21 3d  { SELECT NULL !=
2af0: 20 20 20 20 20 27 61 62 27 20 7d 20 7b 7b 7d 7d       'ab' } {{}}
2b00: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2b10: 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31 36 20 7b   e_expr-8.1.16 {
2b20: 20 53 45 4c 45 43 54 20 27 61 62 27 20 21 3d 20   SELECT 'ab' != 
2b30: 20 20 20 20 27 61 62 27 20 7d 20 7b 30 7d 0a 0a      'ab' } {0}..
2b40: 66 6f 72 65 61 63 68 20 7b 6e 31 20 72 68 73 7d  foreach {n1 rhs}
2b50: 20 24 6c 69 74 65 72 61 6c 73 20 7b 20 0a 20 20   $literals { .  
2b60: 66 6f 72 65 61 63 68 20 7b 6e 32 20 6c 68 73 7d  foreach {n2 lhs}
2b70: 20 24 6c 69 74 65 72 61 6c 73 20 7b 0a 20 20 20   $literals {.   
2b80: 20 69 66 20 7b 24 72 68 73 21 3d 22 4e 55 4c 4c   if {$rhs!="NULL
2b90: 22 20 26 26 20 24 6c 68 73 21 3d 22 4e 55 4c 4c  " && $lhs!="NULL
2ba0: 22 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 65  "} {.      set e
2bb0: 71 20 5b 65 78 65 63 73 71 6c 20 22 53 45 4c 45  q [execsql "SELE
2bc0: 43 54 20 24 6c 68 73 20 3d 20 24 72 68 73 2c 20  CT $lhs = $rhs, 
2bd0: 24 6c 68 73 20 21 3d 20 24 72 68 73 22 5d 0a 20  $lhs != $rhs"]. 
2be0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2bf0: 20 20 73 65 74 20 65 71 20 5b 6c 69 73 74 20 5b    set eq [list [
2c00: 65 78 70 72 20 7b 24 6c 68 73 3d 3d 22 4e 55 4c  expr {$lhs=="NUL
2c10: 4c 22 20 26 26 20 24 72 68 73 3d 3d 22 4e 55 4c  L" && $rhs=="NUL
2c20: 4c 22 7d 5d 20 5c 0a 20 20 20 20 20 20 20 20 20  L"}] \.         
2c30: 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
2c40: 7b 24 6c 68 73 21 3d 22 4e 55 4c 4c 22 20 7c 7c  {$lhs!="NULL" ||
2c50: 20 24 72 68 73 21 3d 22 4e 55 4c 4c 22 7d 5d 0a   $rhs!="NULL"}].
2c60: 20 20 20 20 20 20 5d 0a 20 20 20 20 7d 0a 20 20        ].    }.  
2c70: 20 20 73 65 74 20 74 65 73 74 20 65 5f 65 78 70    set test e_exp
2c80: 72 2d 38 2e 32 2e 24 6e 31 2e 24 6e 32 0a 20 20  r-8.2.$n1.$n2.  
2c90: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
2ca0: 74 20 24 74 65 73 74 2e 31 20 22 53 45 4c 45 43  t $test.1 "SELEC
2cb0: 54 20 24 6c 68 73 20 49 53 20 24 72 68 73 2c 20  T $lhs IS $rhs, 
2cc0: 24 6c 68 73 20 49 53 20 4e 4f 54 20 24 72 68 73  $lhs IS NOT $rhs
2cd0: 22 20 24 65 71 0a 20 20 20 20 64 6f 5f 65 78 65  " $eq.    do_exe
2ce0: 63 73 71 6c 5f 74 65 73 74 20 24 74 65 73 74 2e  csql_test $test.
2cf0: 32 20 22 0a 20 20 20 20 20 20 53 45 4c 45 43 54  2 ".      SELECT
2d00: 20 28 24 6c 68 73 20 49 53 20 24 72 68 73 29 20   ($lhs IS $rhs) 
2d10: 49 53 20 4e 55 4c 4c 2c 20 28 24 6c 68 73 20 49  IS NULL, ($lhs I
2d20: 53 20 4e 4f 54 20 24 72 68 73 29 20 49 53 20 4e  S NOT $rhs) IS N
2d30: 55 4c 4c 0a 20 20 20 20 22 20 7b 30 20 30 7d 0a  ULL.    " {0 0}.
2d40: 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d    }.}..#--------
2d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d90: 2d 0a 23 20 52 75 6e 20 73 6f 6d 65 20 74 65 73  -.# Run some tes
2da0: 74 73 20 6f 6e 20 74 68 65 20 43 4f 4c 4c 41 54  ts on the COLLAT
2db0: 45 20 22 75 6e 61 72 79 20 70 6f 73 74 66 69 78  E "unary postfix
2dc0: 20 6f 70 65 72 61 74 6f 72 22 2e 0a 23 0a 23 20   operator"..#.# 
2dd0: 54 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  This collation s
2de0: 65 71 75 65 6e 63 65 20 72 65 76 65 72 73 65 73  equence reverses
2df0: 20 62 6f 74 68 20 61 72 67 75 6d 65 6e 74 73 20   both arguments 
2e00: 62 65 66 6f 72 65 20 75 73 69 6e 67 20 0a 23 20  before using .# 
2e10: 5b 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65 5d  [string compare]
2e20: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 68 65 6d   to compare them
2e30: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  . For example, w
2e40: 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  hen comparing th
2e50: 65 0a 23 20 73 74 72 69 6e 67 73 20 27 6f 6e 65  e.# strings 'one
2e60: 27 20 61 6e 64 20 27 66 6f 75 72 27 2c 20 72 65  ' and 'four', re
2e70: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
2e80: 6f 66 3a 0a 23 20 20 20 0a 23 20 20 20 73 74 72  of:.#   .#   str
2e90: 69 6e 67 20 63 6f 6d 70 61 72 65 20 65 6e 6f 20  ing compare eno 
2ea0: 72 75 6f 66 0a 23 0a 70 72 6f 63 20 72 65 76 65  ruof.#.proc reve
2eb0: 72 73 65 5f 73 74 72 20 7b 7a 53 74 72 7d 20 7b  rse_str {zStr} {
2ec0: 0a 20 20 73 65 74 20 6f 75 74 20 22 22 0a 20 20  .  set out "".  
2ed0: 66 6f 72 65 61 63 68 20 63 20 5b 73 70 6c 69 74  foreach c [split
2ee0: 20 24 7a 53 74 72 20 7b 7d 5d 20 7b 20 73 65 74   $zStr {}] { set
2ef0: 20 6f 75 74 20 22 24 7b 63 7d 24 7b 6f 75 74 7d   out "${c}${out}
2f00: 22 20 7d 0a 20 20 73 65 74 20 6f 75 74 0a 7d 0a  " }.  set out.}.
2f10: 70 72 6f 63 20 72 65 76 65 72 73 65 5f 63 6f 6c  proc reverse_col
2f20: 6c 61 74 65 20 7b 7a 4c 65 66 74 20 7a 52 69 67  late {zLeft zRig
2f30: 68 74 7d 20 7b 0a 20 20 73 74 72 69 6e 67 20 63  ht} {.  string c
2f40: 6f 6d 70 61 72 65 20 5b 72 65 76 65 72 73 65 5f  ompare [reverse_
2f50: 73 74 72 20 24 7a 4c 65 66 74 5d 20 5b 72 65 76  str $zLeft] [rev
2f60: 65 72 73 65 5f 73 74 72 20 24 7a 52 69 67 68 74  erse_str $zRight
2f70: 5d 0a 7d 0a 64 62 20 63 6f 6c 6c 61 74 65 20 72  ].}.db collate r
2f80: 65 76 65 72 73 65 20 72 65 76 65 72 73 65 5f 63  everse reverse_c
2f90: 6f 6c 6c 61 74 65 0a 0a 23 20 45 56 49 44 45 4e  ollate..# EVIDEN
2fa0: 43 45 2d 4f 46 3a 20 52 2d 35 39 35 37 37 2d 33  CE-OF: R-59577-3
2fb0: 33 34 37 31 20 54 68 65 20 43 4f 4c 4c 41 54 45  3471 The COLLATE
2fc0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 75   operator is a u
2fd0: 6e 61 72 79 20 70 6f 73 74 66 69 78 0a 23 20 6f  nary postfix.# o
2fe0: 70 65 72 61 74 6f 72 20 74 68 61 74 20 61 73 73  perator that ass
2ff0: 69 67 6e 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67  igns a collating
3000: 20 73 65 71 75 65 6e 63 65 20 74 6f 20 61 6e 20   sequence to an 
3010: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23 0a 23 20  expression..#.# 
3020: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
3030: 36 32 33 31 2d 33 30 37 33 31 20 54 68 65 20 43  6231-30731 The C
3040: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3050: 68 61 73 20 61 20 68 69 67 68 65 72 0a 23 20 70  has a higher.# p
3060: 72 65 63 65 64 65 6e 63 65 20 28 62 69 6e 64 73  recedence (binds
3070: 20 6d 6f 72 65 20 74 69 67 68 74 6c 79 29 20 74   more tightly) t
3080: 68 61 6e 20 61 6e 79 20 62 69 6e 61 72 79 20 6f  han any binary o
3090: 70 65 72 61 74 6f 72 20 61 6e 64 20 61 6e 79 20  perator and any 
30a0: 75 6e 61 72 79 0a 23 20 70 72 65 66 69 78 20 6f  unary.# prefix o
30b0: 70 65 72 61 74 6f 72 20 65 78 63 65 70 74 20 22  perator except "
30c0: 7e 22 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ~"..#.do_execsql
30d0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31  _test e_expr-9.1
30e0: 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64   { SELECT  'abcd
30f0: 27 20 3c 20 27 62 62 62 62 27 20 20 20 20 43 4f  ' < 'bbbb'    CO
3100: 4c 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d 20  LLATE reverse } 
3110: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
3120: 74 20 65 5f 65 78 70 72 2d 39 2e 32 20 7b 20 53  t e_expr-9.2 { S
3130: 45 4c 45 43 54 20 28 27 61 62 63 64 27 20 3c 20  ELECT ('abcd' < 
3140: 27 62 62 62 62 27 29 20 20 20 43 4f 4c 4c 41 54  'bbbb')   COLLAT
3150: 45 20 72 65 76 65 72 73 65 20 7d 20 31 0a 64 6f  E reverse } 1.do
3160: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3170: 65 78 70 72 2d 39 2e 33 20 7b 20 53 45 4c 45 43  expr-9.3 { SELEC
3180: 54 20 20 27 61 62 63 64 27 20 3c 3d 20 27 62 62  T  'abcd' <= 'bb
3190: 62 62 27 20 20 20 43 4f 4c 4c 41 54 45 20 72 65  bb'   COLLATE re
31a0: 76 65 72 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65  verse } 0.do_exe
31b0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
31c0: 2d 39 2e 34 20 7b 20 53 45 4c 45 43 54 20 28 27  -9.4 { SELECT ('
31d0: 61 62 63 64 27 20 3c 3d 20 27 62 62 62 62 27 29  abcd' <= 'bbbb')
31e0: 20 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73    COLLATE revers
31f0: 65 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71  e } 1..do_execsq
3200: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e  l_test e_expr-9.
3210: 35 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63  5 { SELECT  'abc
3220: 64 27 20 3e 20 27 62 62 62 62 27 20 20 20 20 43  d' > 'bbbb'    C
3230: 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d  OLLATE reverse }
3240: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
3250: 73 74 20 65 5f 65 78 70 72 2d 39 2e 36 20 7b 20  st e_expr-9.6 { 
3260: 53 45 4c 45 43 54 20 28 27 61 62 63 64 27 20 3e  SELECT ('abcd' >
3270: 20 27 62 62 62 62 27 29 20 20 20 43 4f 4c 4c 41   'bbbb')   COLLA
3280: 54 45 20 72 65 76 65 72 73 65 20 7d 20 30 0a 64  TE reverse } 0.d
3290: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
32a0: 5f 65 78 70 72 2d 39 2e 37 20 7b 20 53 45 4c 45  _expr-9.7 { SELE
32b0: 43 54 20 20 27 61 62 63 64 27 20 3e 3d 20 27 62  CT  'abcd' >= 'b
32c0: 62 62 62 27 20 20 20 43 4f 4c 4c 41 54 45 20 72  bbb'   COLLATE r
32d0: 65 76 65 72 73 65 20 7d 20 31 0a 64 6f 5f 65 78  everse } 1.do_ex
32e0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
32f0: 72 2d 39 2e 38 20 7b 20 53 45 4c 45 43 54 20 28  r-9.8 { SELECT (
3300: 27 61 62 63 64 27 20 3e 3d 20 27 62 62 62 62 27  'abcd' >= 'bbbb'
3310: 29 20 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72  )  COLLATE rever
3320: 73 65 20 7d 20 30 0a 0a 64 6f 5f 65 78 65 63 73  se } 0..do_execs
3330: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
3340: 2e 31 30 20 7b 20 53 45 4c 45 43 54 20 20 27 61  .10 { SELECT  'a
3350: 62 63 64 27 20 3d 20 20 27 41 42 43 44 27 20 20  bcd' =  'ABCD'  
3360: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d  COLLATE nocase }
3370: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
3380: 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 31 20 7b  st e_expr-9.11 {
3390: 20 53 45 4c 45 43 54 20 28 27 61 62 63 64 27 20   SELECT ('abcd' 
33a0: 3d 20 20 27 41 42 43 44 27 29 20 43 4f 4c 4c 41  =  'ABCD') COLLA
33b0: 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64 6f  TE nocase } 0.do
33c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
33d0: 65 78 70 72 2d 39 2e 31 32 20 7b 20 53 45 4c 45  expr-9.12 { SELE
33e0: 43 54 20 20 27 61 62 63 64 27 20 3d 3d 20 27 41  CT  'abcd' == 'A
33f0: 42 43 44 27 20 20 43 4f 4c 4c 41 54 45 20 6e 6f  BCD'  COLLATE no
3400: 63 61 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  case } 1.do_exec
3410: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3420: 39 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 28 27  9.13 { SELECT ('
3430: 61 62 63 64 27 20 3d 3d 20 27 41 42 43 44 27 29  abcd' == 'ABCD')
3440: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
3450: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
3460: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 34 20  est e_expr-9.14 
3470: 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27  { SELECT  'abcd'
3480: 20 49 53 20 27 41 42 43 44 27 20 20 43 4f 4c 4c   IS 'ABCD'  COLL
3490: 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64  ATE nocase } 1.d
34a0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
34b0: 5f 65 78 70 72 2d 39 2e 31 35 20 7b 20 53 45 4c  _expr-9.15 { SEL
34c0: 45 43 54 20 28 27 61 62 63 64 27 20 49 53 20 27  ECT ('abcd' IS '
34d0: 41 42 43 44 27 29 20 43 4f 4c 4c 41 54 45 20 6e  ABCD') COLLATE n
34e0: 6f 63 61 73 65 20 7d 20 30 0a 0a 64 6f 5f 65 78  ocase } 0..do_ex
34f0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3500: 72 2d 39 2e 31 36 20 7b 20 53 45 4c 45 43 54 20  r-9.16 { SELECT 
3510: 20 27 61 62 63 64 27 20 21 3d 20 27 41 42 43 44   'abcd' != 'ABCD
3520: 27 20 20 20 20 20 20 43 4f 4c 4c 41 54 45 20 6e  '      COLLATE n
3530: 6f 63 61 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65  ocase } 0.do_exe
3540: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3550: 2d 39 2e 31 37 20 7b 20 53 45 4c 45 43 54 20 28  -9.17 { SELECT (
3560: 27 61 62 63 64 27 20 21 3d 20 27 41 42 43 44 27  'abcd' != 'ABCD'
3570: 29 20 20 20 20 20 43 4f 4c 4c 41 54 45 20 6e 6f  )     COLLATE no
3580: 63 61 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  case } 1.do_exec
3590: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
35a0: 39 2e 31 38 20 7b 20 53 45 4c 45 43 54 20 20 27  9.18 { SELECT  '
35b0: 61 62 63 64 27 20 3c 3e 20 27 41 42 43 44 27 20  abcd' <> 'ABCD' 
35c0: 20 20 20 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63       COLLATE noc
35d0: 61 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  ase } 0.do_execs
35e0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
35f0: 2e 31 39 20 7b 20 53 45 4c 45 43 54 20 28 27 61  .19 { SELECT ('a
3600: 62 63 64 27 20 3c 3e 20 27 41 42 43 44 27 29 20  bcd' <> 'ABCD') 
3610: 20 20 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61      COLLATE noca
3620: 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71  se } 1.do_execsq
3630: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e  l_test e_expr-9.
3640: 32 30 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62  20 { SELECT  'ab
3650: 63 64 27 20 49 53 20 4e 4f 54 20 27 41 42 43 44  cd' IS NOT 'ABCD
3660: 27 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  '  COLLATE nocas
3670: 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  e } 0.do_execsql
3680: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
3690: 31 20 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63  1 { SELECT ('abc
36a0: 64 27 20 49 53 20 4e 4f 54 20 27 41 42 43 44 27  d' IS NOT 'ABCD'
36b0: 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ) COLLATE nocase
36c0: 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   } 1..do_execsql
36d0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
36e0: 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 27 62  2 { .  SELECT 'b
36f0: 62 62 27 20 42 45 54 57 45 45 4e 20 27 41 41 41  bb' BETWEEN 'AAA
3700: 27 20 41 4e 44 20 27 43 43 43 27 20 43 4f 4c 4c  ' AND 'CCC' COLL
3710: 41 54 45 20 6e 6f 63 61 73 65 20 0a 7d 20 31 0a  ATE nocase .} 1.
3720: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3730: 65 5f 65 78 70 72 2d 39 2e 32 33 20 7b 20 0a 20  e_expr-9.23 { . 
3740: 20 53 45 4c 45 43 54 20 28 27 62 62 62 27 20 42   SELECT ('bbb' B
3750: 45 54 57 45 45 4e 20 27 41 41 41 27 20 41 4e 44  ETWEEN 'AAA' AND
3760: 20 27 43 43 43 27 29 20 43 4f 4c 4c 41 54 45 20   'CCC') COLLATE 
3770: 6e 6f 63 61 73 65 20 0a 7d 20 30 0a 0a 23 20 45  nocase .} 0..# E
3780: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
3790: 37 33 31 2d 32 35 34 33 39 20 54 68 65 20 63 6f  731-25439 The co
37a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
37b0: 20 73 65 74 20 62 79 20 74 68 65 20 43 4f 4c 4c   set by the COLL
37c0: 41 54 45 0a 23 20 6f 70 65 72 61 74 6f 72 20 6f  ATE.# operator o
37d0: 76 65 72 72 69 64 65 73 20 74 68 65 20 63 6f 6c  verrides the col
37e0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
37f0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
3800: 65 20 43 4f 4c 4c 41 54 45 0a 23 20 63 6c 61 75  e COLLATE.# clau
3810: 73 65 20 69 6e 20 61 20 74 61 62 6c 65 20 63 6f  se in a table co
3820: 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2e  lumn definition.
3830: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
3840: 73 74 20 65 5f 65 78 70 72 2d 39 2e 32 34 20 7b  st e_expr-9.24 {
3850: 20 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45   .  CREATE TABLE
3860: 20 74 32 34 28 61 20 43 4f 4c 4c 41 54 45 20 4e   t24(a COLLATE N
3870: 4f 43 41 53 45 2c 20 62 29 3b 0a 20 20 49 4e 53  OCASE, b);.  INS
3880: 45 52 54 20 49 4e 54 4f 20 74 32 34 20 56 41 4c  ERT INTO t24 VAL
3890: 55 45 53 28 27 61 61 61 27 2c 20 31 29 3b 0a 20  UES('aaa', 1);. 
38a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 34   INSERT INTO t24
38b0: 20 56 41 4c 55 45 53 28 27 62 62 62 27 2c 20 32   VALUES('bbb', 2
38c0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
38d0: 20 74 32 34 20 56 41 4c 55 45 53 28 27 63 63 63   t24 VALUES('ccc
38e0: 27 2c 20 33 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65  ', 3);.} {}.do_e
38f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
3900: 70 72 2d 39 2e 32 35 20 7b 20 53 45 4c 45 43 54  pr-9.25 { SELECT
3910: 20 27 42 42 42 27 20 3d 20 61 20 46 52 4f 4d 20   'BBB' = a FROM 
3920: 74 32 34 20 7d 20 7b 30 20 31 20 30 7d 0a 64 6f  t24 } {0 1 0}.do
3930: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3940: 65 78 70 72 2d 39 2e 32 35 20 7b 20 53 45 4c 45  expr-9.25 { SELE
3950: 43 54 20 61 20 3d 20 27 42 42 42 27 20 46 52 4f  CT a = 'BBB' FRO
3960: 4d 20 74 32 34 20 7d 20 7b 30 20 31 20 30 7d 0a  M t24 } {0 1 0}.
3970: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3980: 65 5f 65 78 70 72 2d 39 2e 32 35 20 7b 20 53 45  e_expr-9.25 { SE
3990: 4c 45 43 54 20 27 42 42 42 27 20 3d 20 61 20 43  LECT 'BBB' = a C
39a0: 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 46 52  OLLATE binary FR
39b0: 4f 4d 20 74 32 34 20 7d 20 7b 30 20 30 20 30 7d  OM t24 } {0 0 0}
39c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
39d0: 20 65 5f 65 78 70 72 2d 39 2e 32 35 20 7b 20 53   e_expr-9.25 { S
39e0: 45 4c 45 43 54 20 61 20 43 4f 4c 4c 41 54 45 20  ELECT a COLLATE 
39f0: 62 69 6e 61 72 79 20 3d 20 27 42 42 42 27 20 46  binary = 'BBB' F
3a00: 52 4f 4d 20 74 32 34 20 7d 20 7b 30 20 30 20 30  ROM t24 } {0 0 0
3a10: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
3a60: 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74 73 20  Test statements 
3a70: 72 65 6c 61 74 65 64 20 74 6f 20 6c 69 74 65 72  related to liter
3a80: 61 6c 20 76 61 6c 75 65 73 2e 0a 23 0a 23 20 45  al values..#.# E
3a90: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
3aa0: 35 33 36 2d 33 32 30 30 38 20 4c 69 74 65 72 61  536-32008 Litera
3ab0: 6c 20 76 61 6c 75 65 73 20 6d 61 79 20 62 65 20  l values may be 
3ac0: 69 6e 74 65 67 65 72 73 2c 20 66 6c 6f 61 74 69  integers, floati
3ad0: 6e 67 0a 23 20 70 6f 69 6e 74 20 6e 75 6d 62 65  ng.# point numbe
3ae0: 72 73 2c 20 73 74 72 69 6e 67 73 2c 20 42 4c 4f  rs, strings, BLO
3af0: 42 73 2c 20 6f 72 20 4e 55 4c 4c 73 2e 0a 23 0a  Bs, or NULLs..#.
3b00: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3b10: 65 5f 65 78 70 72 2d 31 30 2e 31 2e 31 20 7b 20  e_expr-10.1.1 { 
3b20: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 35 29  SELECT typeof(5)
3b30: 20 20 20 20 20 20 20 7d 20 7b 69 6e 74 65 67 65         } {intege
3b40: 72 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  r}.do_execsql_te
3b50: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 31 2e 32  st e_expr-10.1.2
3b60: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3b70: 28 35 2e 31 29 20 20 20 20 20 7d 20 7b 72 65 61  (5.1)     } {rea
3b80: 6c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  l}.do_execsql_te
3b90: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 31 2e 33  st e_expr-10.1.3
3ba0: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3bb0: 28 27 35 2e 31 27 29 20 20 20 7d 20 7b 74 65 78  ('5.1')   } {tex
3bc0: 74 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  t}.do_execsql_te
3bd0: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 31 2e 34  st e_expr-10.1.4
3be0: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3bf0: 28 58 27 41 42 43 44 27 29 20 7d 20 7b 62 6c 6f  (X'ABCD') } {blo
3c00: 62 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  b}.do_execsql_te
3c10: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 31 2e 35  st e_expr-10.1.5
3c20: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3c30: 28 4e 55 4c 4c 29 20 20 20 20 7d 20 7b 6e 75 6c  (NULL)    } {nul
3c40: 6c 7d 0a 0a 23 20 22 53 63 69 65 6e 74 69 66 69  l}..# "Scientifi
3c50: 63 20 6e 6f 74 61 74 69 6f 6e 20 69 73 20 73 75  c notation is su
3c60: 70 70 6f 72 74 65 64 20 66 6f 72 20 70 6f 69 6e  pported for poin
3c70: 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73  t literal values
3c80: 2e 22 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  .".#.do_execsql_
3c90: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 32  test e_expr-10.2
3ca0: 2e 31 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65  .1 { SELECT type
3cb0: 6f 66 28 33 2e 34 65 2d 30 32 29 20 20 20 20 7d  of(3.4e-02)    }
3cc0: 20 7b 72 65 61 6c 7d 0a 64 6f 5f 65 78 65 63 73   {real}.do_execs
3cd0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
3ce0: 30 2e 32 2e 32 20 7b 20 53 45 4c 45 43 54 20 74  0.2.2 { SELECT t
3cf0: 79 70 65 6f 66 28 33 65 2b 35 29 20 20 20 20 20  ypeof(3e+5)     
3d00: 20 20 7d 20 7b 72 65 61 6c 7d 0a 64 6f 5f 65 78    } {real}.do_ex
3d10: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3d20: 72 2d 31 30 2e 32 2e 33 20 7b 20 53 45 4c 45 43  r-10.2.3 { SELEC
3d30: 54 20 33 2e 34 65 2d 30 32 20 20 20 20 20 20 20  T 3.4e-02       
3d40: 20 20 20 20 20 7d 20 7b 30 2e 30 33 34 7d 0a 64       } {0.034}.d
3d50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
3d60: 5f 65 78 70 72 2d 31 30 2e 32 2e 34 20 7b 20 53  _expr-10.2.4 { S
3d70: 45 4c 45 43 54 20 33 65 2b 34 20 20 20 20 20 20  ELECT 3e+4      
3d80: 20 20 20 20 20 20 20 20 20 7d 20 7b 33 30 30 30           } {3000
3d90: 30 2e 30 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  0.0}..# EVIDENCE
3da0: 2d 4f 46 3a 20 52 2d 33 35 32 32 39 2d 31 37 38  -OF: R-35229-178
3db0: 33 30 20 41 20 73 74 72 69 6e 67 20 63 6f 6e 73  30 A string cons
3dc0: 74 61 6e 74 20 69 73 20 66 6f 72 6d 65 64 20 62  tant is formed b
3dd0: 79 20 65 6e 63 6c 6f 73 69 6e 67 0a 23 20 74 68  y enclosing.# th
3de0: 65 20 73 74 72 69 6e 67 20 69 6e 20 73 69 6e 67  e string in sing
3df0: 6c 65 20 71 75 6f 74 65 73 20 28 27 29 2e 0a 23  le quotes (')..#
3e00: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
3e10: 52 2d 30 37 31 30 30 2d 30 36 36 30 36 20 41 20  R-07100-06606 A 
3e20: 73 69 6e 67 6c 65 20 71 75 6f 74 65 20 77 69 74  single quote wit
3e30: 68 69 6e 20 74 68 65 20 73 74 72 69 6e 67 20 63  hin the string c
3e40: 61 6e 20 62 65 0a 23 20 65 6e 63 6f 64 65 64 20  an be.# encoded 
3e50: 62 79 20 70 75 74 74 69 6e 67 20 74 77 6f 20 73  by putting two s
3e60: 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 69 6e 20  ingle quotes in 
3e70: 61 20 72 6f 77 20 2d 20 61 73 20 69 6e 20 50 61  a row - as in Pa
3e80: 73 63 61 6c 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  scal..#.do_execs
3e90: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
3ea0: 30 2e 33 2e 31 20 7b 20 53 45 4c 45 43 54 20 27  0.3.1 { SELECT '
3eb0: 69 73 20 6e 6f 74 27 20 7d 20 20 20 20 20 20 20  is not' }       
3ec0: 20 20 7b 7b 69 73 20 6e 6f 74 7d 7d 0a 64 6f 5f    {{is not}}.do_
3ed0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3ee0: 78 70 72 2d 31 30 2e 33 2e 32 20 7b 20 53 45 4c  xpr-10.3.2 { SEL
3ef0: 45 43 54 20 74 79 70 65 6f 66 28 27 69 73 20 6e  ECT typeof('is n
3f00: 6f 74 27 29 20 7d 20 7b 74 65 78 74 7d 0a 64 6f  ot') } {text}.do
3f10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3f20: 65 78 70 72 2d 31 30 2e 33 2e 33 20 7b 20 53 45  expr-10.3.3 { SE
3f30: 4c 45 43 54 20 27 69 73 6e 27 27 74 27 20 7d 20  LECT 'isn''t' } 
3f40: 20 20 20 20 20 20 20 20 7b 69 73 6e 27 74 7d 0a          {isn't}.
3f50: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3f60: 65 5f 65 78 70 72 2d 31 30 2e 33 2e 34 20 7b 20  e_expr-10.3.4 { 
3f70: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 27 69  SELECT typeof('i
3f80: 73 6e 27 27 74 27 29 20 7d 20 7b 74 65 78 74 7d  sn''t') } {text}
3f90: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
3fa0: 20 52 2d 30 39 35 39 33 2d 30 33 33 32 31 20 42   R-09593-03321 B
3fb0: 4c 4f 42 20 6c 69 74 65 72 61 6c 73 20 61 72 65  LOB literals are
3fc0: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   string literals
3fd0: 0a 23 20 63 6f 6e 74 61 69 6e 69 6e 67 20 68 65  .# containing he
3fe0: 78 61 64 65 63 69 6d 61 6c 20 64 61 74 61 20 61  xadecimal data a
3ff0: 6e 64 20 70 72 65 63 65 64 65 64 20 62 79 20 61  nd preceded by a
4000: 20 73 69 6e 67 6c 65 20 22 78 22 20 6f 72 20 22   single "x" or "
4010: 58 22 0a 23 20 63 68 61 72 61 63 74 65 72 2e 0a  X".# character..
4020: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
4030: 20 52 2d 31 39 38 33 36 2d 31 31 32 34 34 20 45   R-19836-11244 E
4040: 78 61 6d 70 6c 65 3a 20 58 27 35 33 35 31 34 43  xample: X'53514C
4050: 36 39 37 34 36 35 27 0a 23 0a 64 6f 5f 65 78 65  697465'.#.do_exe
4060: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
4070: 2d 31 30 2e 34 2e 31 20 7b 20 53 45 4c 45 43 54  -10.4.1 { SELECT
4080: 20 74 79 70 65 6f 66 28 58 27 30 31 32 33 34 35   typeof(X'012345
4090: 36 37 38 39 41 42 43 44 45 46 27 29 20 7d 20 62  6789ABCDEF') } b
40a0: 6c 6f 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  lob.do_execsql_t
40b0: 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e  est e_expr-10.4.
40c0: 32 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f  2 { SELECT typeo
40d0: 66 28 78 27 30 31 32 33 34 35 36 37 38 39 41 42  f(x'0123456789AB
40e0: 43 44 45 46 27 29 20 7d 20 62 6c 6f 62 0a 64 6f  CDEF') } blob.do
40f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
4100: 65 78 70 72 2d 31 30 2e 34 2e 33 20 7b 20 53 45  expr-10.4.3 { SE
4110: 4c 45 43 54 20 74 79 70 65 6f 66 28 58 27 30 31  LECT typeof(X'01
4120: 32 33 34 35 36 37 38 39 61 62 63 64 65 66 27 29  23456789abcdef')
4130: 20 7d 20 62 6c 6f 62 0a 64 6f 5f 65 78 65 63 73   } blob.do_execs
4140: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
4150: 30 2e 34 2e 34 20 7b 20 53 45 4c 45 43 54 20 74  0.4.4 { SELECT t
4160: 79 70 65 6f 66 28 78 27 30 31 32 33 34 35 36 37  ypeof(x'01234567
4170: 38 39 61 62 63 64 65 66 27 29 20 7d 20 62 6c 6f  89abcdef') } blo
4180: 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  b.do_execsql_tes
4190: 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e 35 20  t e_expr-10.4.5 
41a0: 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28  { SELECT typeof(
41b0: 58 27 35 33 35 31 34 43 36 39 37 34 36 35 27 29  X'53514C697465')
41c0: 20 20 20 20 20 7d 20 62 6c 6f 62 0a 0a 23 20 45       } blob..# E
41d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33  VIDENCE-OF: R-23
41e0: 39 31 34 2d 35 31 34 37 36 20 41 20 6c 69 74 65  914-51476 A lite
41f0: 72 61 6c 20 76 61 6c 75 65 20 63 61 6e 20 61 6c  ral value can al
4200: 73 6f 20 62 65 20 74 68 65 20 74 6f 6b 65 6e 0a  so be the token.
4210: 23 20 22 4e 55 4c 4c 22 2e 0a 23 0a 64 6f 5f 65  # "NULL"..#.do_e
4220: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
4230: 70 72 2d 31 30 2e 35 2e 31 20 7b 20 53 45 4c 45  pr-10.5.1 { SELE
4240: 43 54 20 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  CT NULL         
4250: 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  } {{}}.do_execsq
4260: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30  l_test e_expr-10
4270: 2e 35 2e 32 20 7b 20 53 45 4c 45 43 54 20 74 79  .5.2 { SELECT ty
4280: 70 65 6f 66 28 4e 55 4c 4c 29 20 7d 20 7b 6e 75  peof(NULL) } {nu
4290: 6c 6c 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ll}..#----------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
42e0: 23 20 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74  # Test statement
42f0: 73 20 72 65 6c 61 74 65 64 20 74 6f 20 62 6f 75  s related to bou
4300: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 0a 23 0a  nd parameters.#.
4310: 0a 70 72 6f 63 20 70 61 72 61 6d 65 74 65 72 5f  .proc parameter_
4320: 74 65 73 74 20 7b 74 6e 20 73 71 6c 20 70 61 72  test {tn sql par
4330: 61 6d 73 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20  ams result} {.  
4340: 73 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65  set stmt [sqlite
4350: 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20  3_prepare_v2 db 
4360: 24 73 71 6c 20 2d 31 5d 0a 0a 20 20 66 6f 72 65  $sql -1]..  fore
4370: 61 63 68 20 7b 6e 75 6d 62 65 72 20 6e 61 6d 65  ach {number name
4380: 7d 20 24 70 61 72 61 6d 73 20 7b 0a 20 20 20 20  } $params {.    
4390: 73 65 74 20 6e 6d 20 5b 73 71 6c 69 74 65 33 5f  set nm [sqlite3_
43a0: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
43b0: 61 6d 65 20 24 73 74 6d 74 20 24 6e 75 6d 62 65  ame $stmt $numbe
43c0: 72 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24  r].    do_test $
43d0: 74 6e 2e 6e 61 6d 65 2e 24 6e 75 6d 62 65 72 20  tn.name.$number 
43e0: 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 6e 6d  [list set {} $nm
43f0: 5d 20 24 6e 61 6d 65 0a 20 20 20 20 73 71 6c 69  ] $name.    sqli
4400: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 24 73 74  te3_bind_int $st
4410: 6d 74 20 24 6e 75 6d 62 65 72 20 5b 65 78 70 72  mt $number [expr
4420: 20 2d 31 20 2a 20 24 6e 75 6d 62 65 72 5d 0a 20   -1 * $number]. 
4430: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   }..  sqlite3_st
4440: 65 70 20 24 73 74 6d 74 0a 0a 20 20 73 65 74 20  ep $stmt..  set 
4450: 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72  res [list].  for
4460: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
4470: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   [sqlite3_column
4480: 5f 63 6f 75 6e 74 20 24 73 74 6d 74 5d 7d 20 7b  _count $stmt]} {
4490: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61  incr i} {.    la
44a0: 70 70 65 6e 64 20 72 65 73 20 5b 73 71 6c 69 74  ppend res [sqlit
44b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24  e3_column_text $
44c0: 73 74 6d 74 20 24 69 5d 0a 20 20 7d 0a 0a 20 20  stmt $i].  }..  
44d0: 73 65 74 20 72 63 20 5b 73 71 6c 69 74 65 33 5f  set rc [sqlite3_
44e0: 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 5d 0a  finalize $stmt].
44f0: 20 20 64 6f 5f 74 65 73 74 20 24 74 6e 2e 72 63    do_test $tn.rc
4500: 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72   [list set {} $r
4510: 63 5d 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 64  c] SQLITE_OK.  d
4520: 6f 5f 74 65 73 74 20 24 74 6e 2e 72 65 73 20 5b  o_test $tn.res [
4530: 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72 65 73  list set {} $res
4540: 5d 20 24 72 65 73 75 6c 74 0a 7d 0a 0a 23 20 45  ] $result.}..# E
4550: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33  VIDENCE-OF: R-33
4560: 35 30 39 2d 33 39 34 35 38 20 41 20 71 75 65 73  509-39458 A ques
4570: 74 69 6f 6e 20 6d 61 72 6b 20 66 6f 6c 6c 6f 77  tion mark follow
4580: 65 64 20 62 79 20 61 20 6e 75 6d 62 65 72 20 4e  ed by a number N
4590: 4e 4e 0a 23 20 68 6f 6c 64 73 20 61 20 73 70 6f  NN.# holds a spo
45a0: 74 20 66 6f 72 20 74 68 65 20 4e 4e 4e 2d 74 68  t for the NNN-th
45b0: 20 70 61 72 61 6d 65 74 65 72 2e 20 4e 4e 4e 20   parameter. NNN 
45c0: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
45d0: 31 20 61 6e 64 0a 23 20 53 51 4c 49 54 45 5f 4d  1 and.# SQLITE_M
45e0: 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
45f0: 45 52 2e 0a 23 0a 73 65 74 20 6d 76 6e 20 24 53  ER..#.set mvn $S
4600: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
4610: 4c 45 5f 4e 55 4d 42 45 52 0a 70 61 72 61 6d 65  LE_NUMBER.parame
4620: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4630: 31 31 2e 31 20 22 0a 20 20 53 45 4c 45 43 54 20  11.1 ".  SELECT 
4640: 3f 31 2c 20 3f 31 32 33 2c 20 3f 24 53 51 4c 49  ?1, ?123, ?$SQLI
4650: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
4660: 4e 55 4d 42 45 52 2c 20 3f 31 32 33 2c 20 3f 34  NUMBER, ?123, ?4
4670: 0a 22 20 20 20 22 31 20 3f 31 20 20 31 32 33 20  ."   "1 ?1  123 
4680: 3f 31 32 33 20 24 6d 76 6e 20 3f 24 6d 76 6e 20  ?123 $mvn ?$mvn 
4690: 34 20 3f 34 22 20 20 20 22 2d 31 20 2d 31 32 33  4 ?4"   "-1 -123
46a0: 20 2d 24 6d 76 6e 20 2d 31 32 33 20 2d 34 22 0a   -$mvn -123 -4".
46b0: 0a 73 65 74 20 65 72 72 6d 73 67 20 22 76 61 72  .set errmsg "var
46c0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
46d0: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
46e0: 61 6e 64 20 3f 24 53 51 4c 49 54 45 5f 4d 41 58  and ?$SQLITE_MAX
46f0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4700: 22 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 70 61  ".foreach {tn pa
4710: 72 61 6d 5f 6e 75 6d 62 65 72 7d 20 5b 6c 69 73  ram_number} [lis
4720: 74 20 5c 0a 20 20 32 20 20 30 20 20 20 20 20 20  t \.  2  0      
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4750: 20 20 33 20 20 5b 65 78 70 72 20 24 53 51 4c 49    3  [expr $SQLI
4760: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
4770: 4e 55 4d 42 45 52 2b 31 5d 20 5c 0a 20 20 34 20  NUMBER+1] \.  4 
4780: 20 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d   [expr $SQLITE_M
4790: 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
47a0: 45 52 2b 32 5d 20 5c 0a 20 20 35 20 20 31 32 33  ER+2] \.  5  123
47b0: 34 35 36 37 38 39 30 33 34 35 36 37 38 39 30 33  4567890345678903
47c0: 34 35 36 37 38 39 30 32 33 34 35 36 37 38 39 30  4567890234567890
47d0: 20 20 5c 0a 20 20 36 20 20 32 31 34 37 34 38 33    \.  6  2147483
47e0: 36 34 38 20 20 20 20 20 20 20 20 20 20 20 20 20  648             
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4800: 20 20 37 20 20 32 31 34 37 34 38 33 36 34 39 20    7  2147483649 
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 38 20            \.  8 
4830: 20 34 32 39 34 39 36 37 32 39 36 20 20 20 20 20   4294967296     
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 5c 0a 20 20 39 20 20 34 32 39        \.  9  429
4860: 34 39 36 37 32 39 37 20 20 20 20 20 20 20 20 20  4967297         
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 5c 0a 20 20 31 30 20 39 32 32 33 33 37 32    \.  10 9223372
4890: 30 33 36 38 35 34 37 37 35 38 30 38 20 20 20 20  036854775808    
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
48b0: 20 20 31 31 20 39 32 32 33 33 37 32 30 33 36 38    11 92233720368
48c0: 35 34 37 37 35 38 30 39 20 20 20 20 20 20 20 20  54775809        
48d0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 31 32            \.  12
48e0: 20 31 38 34 34 36 37 34 34 30 37 33 37 30 39 35   184467440737095
48f0: 35 31 36 31 36 20 20 20 20 20 20 20 20 20 20 20  51616           
4900: 20 20 20 20 20 20 5c 0a 20 20 31 33 20 31 38 34        \.  13 184
4910: 34 36 37 34 34 30 37 33 37 30 39 35 35 31 36 31  4674407370955161
4920: 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
4930: 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 63 61 74    \.] {.  do_cat
4940: 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  chsql_test e_exp
4950: 72 2d 31 31 2e 31 2e 24 74 6e 20 22 53 45 4c 45  r-11.1.$tn "SELE
4960: 43 54 20 3f 24 70 61 72 61 6d 5f 6e 75 6d 62 65  CT ?$param_numbe
4970: 72 22 20 5b 6c 69 73 74 20 31 20 24 65 72 72 6d  r" [list 1 $errm
4980: 73 67 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  sg].}..# EVIDENC
4990: 45 2d 4f 46 3a 20 52 2d 33 33 36 37 30 2d 33 36  E-OF: R-33670-36
49a0: 30 39 37 20 41 20 71 75 65 73 74 69 6f 6e 20 6d  097 A question m
49b0: 61 72 6b 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ark that is not 
49c0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 0a 23 20  followed by a.# 
49d0: 6e 75 6d 62 65 72 20 63 72 65 61 74 65 73 20 61  number creates a
49e0: 20 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20   parameter with 
49f0: 61 20 6e 75 6d 62 65 72 20 6f 6e 65 20 67 72 65  a number one gre
4a00: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  ater than the la
4a10: 72 67 65 73 74 0a 23 20 70 61 72 61 6d 65 74 65  rgest.# paramete
4a20: 72 20 6e 75 6d 62 65 72 20 61 6c 72 65 61 64 79  r number already
4a30: 20 61 73 73 69 67 6e 65 64 2e 0a 23 0a 23 20 45   assigned..#.# E
4a40: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32  VIDENCE-OF: R-42
4a50: 39 33 38 2d 30 37 30 33 30 20 49 66 20 74 68 69  938-07030 If thi
4a60: 73 20 6d 65 61 6e 73 20 74 68 65 20 70 61 72 61  s means the para
4a70: 6d 65 74 65 72 20 6e 75 6d 62 65 72 20 69 73 0a  meter number is.
4a80: 23 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  # greater than S
4a90: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
4aa0: 4c 45 5f 4e 55 4d 42 45 52 2c 20 69 74 20 69 73  LE_NUMBER, it is
4ab0: 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 70 61 72   an error..#.par
4ac0: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
4ad0: 70 72 2d 31 31 2e 32 2e 31 20 22 53 45 4c 45 43  pr-11.2.1 "SELEC
4ae0: 54 20 3f 22 20 20 20 20 20 20 20 20 20 20 7b 31  T ?"          {1
4af0: 20 7b 7d 7d 20 20 20 20 20 20 20 2d 31 0a 70 61   {}}       -1.pa
4b00: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
4b10: 78 70 72 2d 31 31 2e 32 2e 32 20 22 53 45 4c 45  xpr-11.2.2 "SELE
4b20: 43 54 20 3f 2c 20 3f 22 20 20 20 20 20 20 20 7b  CT ?, ?"       {
4b30: 31 20 7b 7d 20 32 20 7b 7d 7d 20 20 7b 2d 31 20  1 {} 2 {}}  {-1 
4b40: 2d 32 7d 0a 70 61 72 61 6d 65 74 65 72 5f 74 65  -2}.parameter_te
4b50: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 33  st e_expr-11.2.3
4b60: 20 22 53 45 4c 45 43 54 20 3f 35 2c 20 3f 22 20   "SELECT ?5, ?" 
4b70: 20 20 20 20 20 7b 35 20 3f 35 20 36 20 7b 7d 7d       {5 ?5 6 {}}
4b80: 20 20 7b 2d 35 20 2d 36 7d 0a 70 61 72 61 6d 65    {-5 -6}.parame
4b90: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4ba0: 31 31 2e 32 2e 34 20 22 53 45 4c 45 43 54 20 3f  11.2.4 "SELECT ?
4bb0: 2c 20 3f 35 22 20 20 20 20 20 20 7b 31 20 7b 7d  , ?5"      {1 {}
4bc0: 20 35 20 3f 35 7d 20 20 7b 2d 31 20 2d 35 7d 0a   5 ?5}  {-1 -5}.
4bd0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
4be0: 5f 65 78 70 72 2d 31 31 2e 32 2e 35 20 22 53 45  _expr-11.2.5 "SE
4bf0: 4c 45 43 54 20 3f 2c 20 3f 34 35 36 2c 20 3f 22  LECT ?, ?456, ?"
4c00: 20 7b 0a 20 20 31 20 7b 7d 20 34 35 36 20 3f 34   {.  1 {} 456 ?4
4c10: 35 36 20 34 35 37 20 7b 7d 0a 7d 20 20 7b 2d 31  56 457 {}.}  {-1
4c20: 20 2d 34 35 36 20 2d 34 35 37 7d 0a 70 61 72 61   -456 -457}.para
4c30: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
4c40: 72 2d 31 31 2e 32 2e 35 20 22 53 45 4c 45 43 54  r-11.2.5 "SELECT
4c50: 20 3f 2c 20 3f 34 35 36 2c 20 3f 34 2c 20 3f 22   ?, ?456, ?4, ?"
4c60: 20 7b 0a 20 20 31 20 7b 7d 20 34 35 36 20 3f 34   {.  1 {} 456 ?4
4c70: 35 36 20 34 20 3f 34 20 34 35 37 20 7b 7d 0a 7d  56 4 ?4 457 {}.}
4c80: 20 20 7b 2d 31 20 2d 34 35 36 20 2d 34 20 2d 34    {-1 -456 -4 -4
4c90: 35 37 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  57}.foreach {tn 
4ca0: 73 71 6c 7d 20 5b 6c 69 73 74 20 20 20 20 20 20  sql} [list      
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 20 20 20 5c 0a 20 20 31 20 20 22 53 45 4c       \.  1  "SEL
4cd0: 45 43 54 20 3f 24 6d 76 6e 2c 20 3f 22 20 20 20  ECT ?$mvn, ?"   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 20 20 20 20 20 20 20 5c 0a 20 20 32 20 20 22          \.  2  "
4d00: 53 45 4c 45 43 54 20 3f 5b 65 78 70 72 20 24 6d  SELECT ?[expr $m
4d10: 76 6e 2d 35 5d 2c 20 3f 2c 20 3f 2c 20 3f 2c 20  vn-5], ?, ?, ?, 
4d20: 3f 2c 20 3f 2c 20 3f 22 20 20 20 5c 0a 20 20 33  ?, ?, ?"   \.  3
4d30: 20 20 22 53 45 4c 45 43 54 20 3f 5b 65 78 70 72    "SELECT ?[expr
4d40: 20 24 6d 76 6e 5d 2c 20 3f 35 2c 20 3f 36 2c 20   $mvn], ?5, ?6, 
4d50: 3f 22 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  ?"            \.
4d60: 5d 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71  ] {.  do_catchsq
4d70: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  l_test e_expr-11
4d80: 2e 33 2e 24 74 6e 20 24 73 71 6c 20 5b 6c 69 73  .3.$tn $sql [lis
4d90: 74 20 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 53 51  t 1 {too many SQ
4da0: 4c 20 76 61 72 69 61 62 6c 65 73 7d 5d 0a 7d 0a  L variables}].}.
4db0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
4dc0: 52 2d 31 31 36 32 30 2d 32 32 37 34 33 20 41 20  R-11620-22743 A 
4dd0: 63 6f 6c 6f 6e 20 66 6f 6c 6c 6f 77 65 64 20 62  colon followed b
4de0: 79 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  y an identifier 
4df0: 6e 61 6d 65 0a 23 20 68 6f 6c 64 73 20 61 20 73  name.# holds a s
4e00: 70 6f 74 20 66 6f 72 20 61 20 6e 61 6d 65 64 20  pot for a named 
4e10: 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 74  parameter with t
4e20: 68 65 20 6e 61 6d 65 20 3a 41 41 41 41 2e 0a 23  he name :AAAA..#
4e30: 0a 23 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  .# Identifiers i
4e40: 6e 20 53 51 4c 69 74 65 20 63 6f 6e 73 69 73 74  n SQLite consist
4e50: 20 6f 66 20 61 6c 70 68 61 6e 75 6d 65 72 69 63   of alphanumeric
4e60: 2c 20 27 5f 27 20 61 6e 64 20 27 24 27 20 63 68  , '_' and '$' ch
4e70: 61 72 61 63 74 65 72 73 2c 0a 23 20 61 6e 64 20  aracters,.# and 
4e80: 61 6e 79 20 55 54 46 20 63 68 61 72 61 63 74 65  any UTF characte
4e90: 72 73 20 77 69 74 68 20 63 6f 64 65 70 6f 69 6e  rs with codepoin
4ea0: 74 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 31  ts larger than 1
4eb0: 32 37 20 28 6e 6f 6e 2d 41 53 43 49 49 20 0a 23  27 (non-ASCII .#
4ec0: 20 63 68 61 72 61 63 74 65 72 73 29 2e 0a 23 0a   characters)..#.
4ed0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
4ee0: 5f 65 78 70 72 2d 31 31 2e 32 2e 31 20 7b 53 45  _expr-11.2.1 {SE
4ef0: 4c 45 43 54 20 3a 41 41 41 41 7d 20 20 20 20 20  LECT :AAAA}     
4f00: 20 20 20 20 7b 31 20 3a 41 41 41 41 7d 20 20 20      {1 :AAAA}   
4f10: 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72      -1.parameter
4f20: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
4f30: 32 2e 32 20 7b 53 45 4c 45 43 54 20 3a 31 32 33  2.2 {SELECT :123
4f40: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 3a 31  }          {1 :1
4f50: 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61  23}        -1.pa
4f60: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
4f70: 78 70 72 2d 31 31 2e 32 2e 33 20 7b 53 45 4c 45  xpr-11.2.3 {SELE
4f80: 43 54 20 3a 5f 5f 7d 20 20 20 20 20 20 20 20 20  CT :__}         
4f90: 20 20 7b 31 20 3a 5f 5f 7d 20 20 20 20 20 20 20    {1 :__}       
4fa0: 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74    -1.parameter_t
4fb0: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e  est e_expr-11.2.
4fc0: 34 20 7b 53 45 4c 45 43 54 20 3a 5f 24 5f 7d 20  4 {SELECT :_$_} 
4fd0: 20 20 20 20 20 20 20 20 20 7b 31 20 3a 5f 24 5f           {1 :_$_
4fe0: 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61  }        -1.para
4ff0: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
5000: 72 2d 31 31 2e 32 2e 35 20 22 0a 20 20 53 45 4c  r-11.2.5 ".  SEL
5010: 45 43 54 20 3a 5c 75 30 65 34 30 5c 75 30 65 32  ECT :\u0e40\u0e2
5020: 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75 30  d\u0e28\u0e02\u0
5030: 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64 5c  e39\u0e40\u0e2d\
5040: 75 30 65 32 35 0a 22 20 22 31 20 3a 5c 75 30 65  u0e25." "1 :\u0e
5050: 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75  40\u0e2d\u0e28\u
5060: 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30  0e02\u0e39\u0e40
5070: 5c 75 30 65 32 64 5c 75 30 65 32 35 22 20 2d 31  \u0e2d\u0e25" -1
5080: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5090: 65 5f 65 78 70 72 2d 31 31 2e 32 2e 36 20 22 53  e_expr-11.2.6 "S
50a0: 45 4c 45 43 54 20 3a 5c 75 30 30 38 30 22 20 22  ELECT :\u0080" "
50b0: 31 20 3a 5c 75 30 30 38 30 22 20 2d 31 0a 0a 23  1 :\u0080" -1..#
50c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
50d0: 34 39 37 38 33 2d 36 31 32 37 39 20 41 6e 20 22  49783-61279 An "
50e0: 61 74 22 20 73 69 67 6e 20 77 6f 72 6b 73 20 65  at" sign works e
50f0: 78 61 63 74 6c 79 20 6c 69 6b 65 20 61 20 63 6f  xactly like a co
5100: 6c 6f 6e 2c 0a 23 20 65 78 63 65 70 74 20 74 68  lon,.# except th
5110: 61 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  at the name of t
5120: 68 65 20 70 61 72 61 6d 65 74 65 72 20 63 72 65  he parameter cre
5130: 61 74 65 64 20 69 73 20 40 41 41 41 41 2e 0a 23  ated is @AAAA..#
5140: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5150: 65 5f 65 78 70 72 2d 31 31 2e 33 2e 31 20 7b 53  e_expr-11.3.1 {S
5160: 45 4c 45 43 54 20 40 41 41 41 41 7d 20 20 20 20  ELECT @AAAA}    
5170: 20 20 20 20 20 7b 31 20 40 41 41 41 41 7d 20 20       {1 @AAAA}  
5180: 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65       -1.paramete
5190: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
51a0: 2e 33 2e 32 20 7b 53 45 4c 45 43 54 20 40 31 32  .3.2 {SELECT @12
51b0: 33 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 40  3}          {1 @
51c0: 31 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70  123}        -1.p
51d0: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
51e0: 65 78 70 72 2d 31 31 2e 33 2e 33 20 7b 53 45 4c  expr-11.3.3 {SEL
51f0: 45 43 54 20 40 5f 5f 7d 20 20 20 20 20 20 20 20  ECT @__}        
5200: 20 20 20 7b 31 20 40 5f 5f 7d 20 20 20 20 20 20     {1 @__}      
5210: 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f     -1.parameter_
5220: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 33  test e_expr-11.3
5230: 2e 34 20 7b 53 45 4c 45 43 54 20 40 5f 24 5f 7d  .4 {SELECT @_$_}
5240: 20 20 20 20 20 20 20 20 20 20 7b 31 20 40 5f 24            {1 @_$
5250: 5f 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72  _}        -1.par
5260: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
5270: 70 72 2d 31 31 2e 33 2e 35 20 22 0a 20 20 53 45  pr-11.3.5 ".  SE
5280: 4c 45 43 54 20 40 5c 75 30 65 34 30 5c 75 30 65  LECT @\u0e40\u0e
5290: 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75  2d\u0e28\u0e02\u
52a0: 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64  0e39\u0e40\u0e2d
52b0: 5c 75 30 65 32 35 0a 22 20 22 31 20 40 5c 75 30  \u0e25." "1 @\u0
52c0: 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c  e40\u0e2d\u0e28\
52d0: 75 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34  u0e02\u0e39\u0e4
52e0: 30 5c 75 30 65 32 64 5c 75 30 65 32 35 22 20 2d  0\u0e2d\u0e25" -
52f0: 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  1.parameter_test
5300: 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e 36 20 22   e_expr-11.3.6 "
5310: 53 45 4c 45 43 54 20 40 5c 75 30 30 38 30 22 20  SELECT @\u0080" 
5320: 22 31 20 40 5c 75 30 30 38 30 22 20 2d 31 0a 0a  "1 @\u0080" -1..
5330: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
5340: 2d 36 32 36 31 30 2d 35 31 33 32 39 20 41 20 64  -62610-51329 A d
5350: 6f 6c 6c 61 72 2d 73 69 67 6e 20 66 6f 6c 6c 6f  ollar-sign follo
5360: 77 65 64 20 62 79 20 61 6e 20 69 64 65 6e 74 69  wed by an identi
5370: 66 69 65 72 0a 23 20 6e 61 6d 65 20 61 6c 73 6f  fier.# name also
5380: 20 68 6f 6c 64 73 20 61 20 73 70 6f 74 20 66 6f   holds a spot fo
5390: 72 20 61 20 6e 61 6d 65 64 20 70 61 72 61 6d 65  r a named parame
53a0: 74 65 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ter with the nam
53b0: 65 20 24 41 41 41 41 2e 0a 23 0a 23 20 45 56 49  e $AAAA..#.# EVI
53c0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 30 32  DENCE-OF: R-5502
53d0: 35 2d 32 31 30 34 32 20 54 68 65 20 69 64 65 6e  5-21042 The iden
53e0: 74 69 66 69 65 72 20 6e 61 6d 65 20 69 6e 20 74  tifier name in t
53f0: 68 69 73 20 63 61 73 65 20 63 61 6e 0a 23 20 69  his case can.# i
5400: 6e 63 6c 75 64 65 20 6f 6e 65 20 6f 72 20 6d 6f  nclude one or mo
5410: 72 65 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f  re occurrences o
5420: 66 20 22 3a 3a 22 20 61 6e 64 20 61 20 73 75 66  f "::" and a suf
5430: 66 69 78 20 65 6e 63 6c 6f 73 65 64 20 69 6e 0a  fix enclosed in.
5440: 23 20 22 28 2e 2e 2e 29 22 20 63 6f 6e 74 61 69  # "(...)" contai
5450: 6e 69 6e 67 20 61 6e 79 20 74 65 78 74 20 61 74  ning any text at
5460: 20 61 6c 6c 2e 0a 23 0a 23 20 4e 6f 74 65 3a 20   all..#.# Note: 
5470: 4c 6f 6f 6b 73 20 6c 69 6b 65 20 61 6e 20 69 64  Looks like an id
5480: 65 6e 74 69 66 69 65 72 20 63 61 6e 6e 6f 74 20  entifier cannot 
5490: 63 6f 6e 73 69 73 74 20 65 6e 74 69 72 65 6c 79  consist entirely
54a0: 20 6f 66 20 22 3a 3a 22 20 0a 23 20 63 68 61 72   of "::" .# char
54b0: 61 63 74 65 72 73 20 6f 72 20 6a 75 73 74 20 61  acters or just a
54c0: 20 73 75 66 66 69 78 2e 20 41 6c 73 6f 2c 20 74   suffix. Also, t
54d0: 68 65 20 6f 74 68 65 72 20 6e 61 6d 65 64 20 76  he other named v
54e0: 61 72 69 61 62 6c 65 20 63 68 61 72 61 63 74 65  ariable characte
54f0: 72 73 0a 23 20 28 3a 20 61 6e 64 20 40 29 20 77  rs.# (: and @) w
5500: 6f 72 6b 20 74 68 65 20 73 61 6d 65 20 77 61 79  ork the same way
5510: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 20 57 68 79   internally. Why
5520: 20 6e 6f 74 20 6a 75 73 74 20 64 6f 63 75 6d 65   not just docume
5530: 6e 74 20 69 74 20 74 68 61 74 20 77 61 79 3f 0a  nt it that way?.
5540: 23 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  #.parameter_test
5550: 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e 31 20 7b   e_expr-11.4.1 {
5560: 53 45 4c 45 43 54 20 24 41 41 41 41 7d 20 20 20  SELECT $AAAA}   
5570: 20 20 20 20 20 20 7b 31 20 24 41 41 41 41 7d 20        {1 $AAAA} 
5580: 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74        -1.paramet
5590: 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  er_test e_expr-1
55a0: 31 2e 34 2e 32 20 7b 53 45 4c 45 43 54 20 24 31  1.4.2 {SELECT $1
55b0: 32 33 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20  23}          {1 
55c0: 24 31 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a  $123}        -1.
55d0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
55e0: 5f 65 78 70 72 2d 31 31 2e 34 2e 33 20 7b 53 45  _expr-11.4.3 {SE
55f0: 4c 45 43 54 20 24 5f 5f 7d 20 20 20 20 20 20 20  LECT $__}       
5600: 20 20 20 20 7b 31 20 24 5f 5f 7d 20 20 20 20 20      {1 $__}     
5610: 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72      -1.parameter
5620: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5630: 34 2e 34 20 7b 53 45 4c 45 43 54 20 24 5f 24 5f  4.4 {SELECT $_$_
5640: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 24 5f  }          {1 $_
5650: 24 5f 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61  $_}        -1.pa
5660: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
5670: 78 70 72 2d 31 31 2e 34 2e 35 20 22 0a 20 20 53  xpr-11.4.5 ".  S
5680: 45 4c 45 43 54 20 5c 24 5c 75 30 65 34 30 5c 75  ELECT \$\u0e40\u
5690: 30 65 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32  0e2d\u0e28\u0e02
56a0: 5c 75 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65  \u0e39\u0e40\u0e
56b0: 32 64 5c 75 30 65 32 35 0a 22 20 22 31 20 5c 24  2d\u0e25." "1 \$
56c0: 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65  \u0e40\u0e2d\u0e
56d0: 32 38 5c 75 30 65 30 32 5c 75 30 65 33 39 5c 75  28\u0e02\u0e39\u
56e0: 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 35  0e40\u0e2d\u0e25
56f0: 22 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74  " -1.parameter_t
5700: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e  est e_expr-11.4.
5710: 36 20 22 53 45 4c 45 43 54 20 5c 24 5c 75 30 30  6 "SELECT \$\u00
5720: 38 30 22 20 22 31 20 5c 24 5c 75 30 30 38 30 22  80" "1 \$\u0080"
5730: 20 2d 31 0a 0a 70 61 72 61 6d 65 74 65 72 5f 74   -1..parameter_t
5740: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 35 2e  est e_expr-11.5.
5750: 31 20 7b 53 45 4c 45 43 54 20 24 3a 3a 3a 3a 61  1 {SELECT $::::a
5760: 28 2b 2b 2d 2d 2b 2b 29 7d 20 7b 31 20 24 3a 3a  (++--++)} {1 $::
5770: 3a 3a 61 28 2b 2b 2d 2d 2b 2b 29 7d 20 2d 31 0a  ::a(++--++)} -1.
5780: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
5790: 5f 65 78 70 72 2d 31 31 2e 35 2e 32 20 7b 53 45  _expr-11.5.2 {SE
57a0: 4c 45 43 54 20 24 3a 3a 61 28 29 7d 20 7b 31 20  LECT $::a()} {1 
57b0: 24 3a 3a 61 28 29 7d 20 2d 31 0a 70 61 72 61 6d  $::a()} -1.param
57c0: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
57d0: 2d 31 31 2e 35 2e 33 20 7b 53 45 4c 45 43 54 20  -11.5.3 {SELECT 
57e0: 24 3a 3a 31 28 3a 3a 23 24 29 7d 20 7b 31 20 24  $::1(::#$)} {1 $
57f0: 3a 3a 31 28 3a 3a 23 24 29 7d 20 2d 31 0a 20 0a  ::1(::#$)} -1. .
5800: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
5810: 2d 31 31 33 37 30 2d 30 34 35 32 30 20 4e 61 6d  -11370-04520 Nam
5820: 65 64 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ed parameters ar
5830: 65 20 61 6c 73 6f 20 6e 75 6d 62 65 72 65 64 2e  e also numbered.
5840: 20 54 68 65 0a 23 20 6e 75 6d 62 65 72 20 61 73   The.# number as
5850: 73 69 67 6e 65 64 20 69 73 20 6f 6e 65 20 67 72  signed is one gr
5860: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c  eater than the l
5870: 61 72 67 65 73 74 20 70 61 72 61 6d 65 74 65 72  argest parameter
5880: 20 6e 75 6d 62 65 72 0a 23 20 61 6c 72 65 61 64   number.# alread
5890: 79 20 61 73 73 69 67 6e 65 64 2e 0a 23 0a 23 20  y assigned..#.# 
58a0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
58b0: 32 36 32 30 2d 32 32 31 38 34 20 49 66 20 74 68  2620-22184 If th
58c0: 69 73 20 6d 65 61 6e 73 20 74 68 65 20 70 61 72  is means the par
58d0: 61 6d 65 74 65 72 20 77 6f 75 6c 64 20 62 65 0a  ameter would be.
58e0: 23 20 61 73 73 69 67 6e 65 64 20 61 20 6e 75 6d  # assigned a num
58f0: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
5900: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
5910: 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 69 74 20  ABLE_NUMBER, it 
5920: 69 73 20 61 6e 0a 23 20 65 72 72 6f 72 2e 0a 23  is an.# error..#
5930: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5940: 65 5f 65 78 70 72 2d 31 31 2e 36 2e 31 20 22 53  e_expr-11.6.1 "S
5950: 45 4c 45 43 54 20 3f 2c 20 40 61 62 63 22 20 20  ELECT ?, @abc"  
5960: 20 20 7b 31 20 7b 7d 20 32 20 40 61 62 63 7d 20    {1 {} 2 @abc} 
5970: 7b 2d 31 20 2d 32 7d 0a 70 61 72 61 6d 65 74 65  {-1 -2}.paramete
5980: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
5990: 2e 36 2e 32 20 22 53 45 4c 45 43 54 20 3f 31 32  .6.2 "SELECT ?12
59a0: 33 2c 20 3a 61 31 22 20 20 7b 31 32 33 20 3f 31  3, :a1"  {123 ?1
59b0: 32 33 20 31 32 34 20 3a 61 31 7d 20 7b 2d 31 32  23 124 :a1} {-12
59c0: 33 20 2d 31 32 34 7d 0a 70 61 72 61 6d 65 74 65  3 -124}.paramete
59d0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
59e0: 2e 36 2e 33 20 7b 53 45 4c 45 43 54 20 24 61 2c  .6.3 {SELECT $a,
59f0: 20 3f 38 2c 20 3f 2c 20 24 62 2c 20 3f 32 2c 20   ?8, ?, $b, ?2, 
5a00: 24 63 7d 20 7b 0a 20 20 31 20 24 61 20 38 20 3f  $c} {.  1 $a 8 ?
5a10: 38 20 39 20 7b 7d 20 31 30 20 24 62 20 32 20 3f  8 9 {} 10 $b 2 ?
5a20: 32 20 31 31 20 24 63 0a 7d 20 7b 2d 31 20 2d 38  2 11 $c.} {-1 -8
5a30: 20 2d 39 20 2d 31 30 20 2d 32 20 2d 31 31 7d 0a   -9 -10 -2 -11}.
5a40: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d  foreach {tn sql}
5a50: 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20   [list          
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 5c 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20   \.  1  "SELECT 
5a80: 3f 24 6d 76 6e 2c 20 5c 24 3a 3a 61 22 20 20 20  ?$mvn, \$::a"   
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 20 20 20 20 5c 0a 20 20 32 20 20 22 53 45 4c 45      \.  2  "SELE
5ab0: 43 54 20 3f 24 6d 76 6e 2c 20 3f 34 2c 20 40 61  CT ?$mvn, ?4, @a
5ac0: 31 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1"              
5ad0: 20 20 20 20 20 20 20 5c 0a 20 20 33 20 20 22 53         \.  3  "S
5ae0: 45 4c 45 43 54 20 3f 5b 65 78 70 72 20 24 6d 76  ELECT ?[expr $mv
5af0: 6e 2d 32 5d 2c 20 3a 62 61 67 2c 20 40 31 32 33  n-2], :bag, @123
5b00: 2c 20 5c 24 78 22 20 20 20 20 5c 0a 5d 20 7b 0a  , \$x"    \.] {.
5b10: 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65    do_catchsql_te
5b20: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 37 2e 24  st e_expr-11.7.$
5b30: 74 6e 20 24 73 71 6c 20 5b 6c 69 73 74 20 31 20  tn $sql [list 1 
5b40: 7b 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  {too many SQL va
5b50: 72 69 61 62 6c 65 73 7d 5d 0a 7d 0a 0a 23 20 45  riables}].}..# E
5b60: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
5b70: 30 36 38 2d 34 39 36 37 31 20 50 61 72 61 6d 65  068-49671 Parame
5b80: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  ters that are no
5b90: 74 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65  t assigned value
5ba0: 73 0a 23 20 75 73 69 6e 67 20 73 71 6c 69 74 65  s.# using sqlite
5bb0: 33 5f 62 69 6e 64 28 29 20 61 72 65 20 74 72 65  3_bind() are tre
5bc0: 61 74 65 64 20 61 73 20 4e 55 4c 4c 2e 0a 23 0a  ated as NULL..#.
5bd0: 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  do_test e_expr-1
5be0: 31 2e 37 2e 31 20 7b 0a 20 20 73 65 74 20 73 74  1.7.1 {.  set st
5bf0: 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  mt [sqlite3_prep
5c00: 61 72 65 5f 76 32 20 64 62 20 7b 20 53 45 4c 45  are_v2 db { SELE
5c10: 43 54 20 3f 2c 20 3a 61 2c 20 40 62 2c 20 24 64  CT ?, :a, @b, $d
5c20: 20 7d 20 2d 31 5d 0a 20 20 73 71 6c 69 74 65 33   } -1].  sqlite3
5c30: 5f 73 74 65 70 20 24 73 74 6d 74 0a 0a 20 20 6c  _step $stmt..  l
5c40: 69 73 74 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c  ist [sqlite3_col
5c50: 75 6d 6e 5f 74 79 70 65 20 24 73 74 6d 74 20 30  umn_type $stmt 0
5c60: 5d 20 5c 0a 20 20 20 20 20 20 20 5b 73 71 6c 69  ] \.       [sqli
5c70: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20  te3_column_type 
5c80: 24 73 74 6d 74 20 31 5d 20 5c 0a 20 20 20 20 20  $stmt 1] \.     
5c90: 20 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d    [sqlite3_colum
5ca0: 6e 5f 74 79 70 65 20 24 73 74 6d 74 20 32 5d 20  n_type $stmt 2] 
5cb0: 5c 0a 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65  \.       [sqlite
5cc0: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24 73  3_column_type $s
5cd0: 74 6d 74 20 33 5d 20 0a 7d 20 7b 4e 55 4c 4c 20  tmt 3] .} {NULL 
5ce0: 4e 55 4c 4c 20 4e 55 4c 4c 20 4e 55 4c 4c 7d 0a  NULL NULL NULL}.
5cf0: 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  do_test e_expr-1
5d00: 31 2e 37 2e 31 20 7b 20 73 71 6c 69 74 65 33 5f  1.7.1 { sqlite3_
5d10: 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 20 7d  finalize $stmt }
5d20: 20 53 51 4c 49 54 45 5f 4f 4b 0a 0a 23 2d 2d 2d   SQLITE_OK..#---
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d70: 2d 2d 2d 2d 2d 2d 0a 23 20 22 54 65 73 74 22 20  ------.# "Test" 
5d80: 74 68 65 20 73 79 6e 74 61 78 20 64 69 61 67 72  the syntax diagr
5d90: 61 6d 73 20 69 6e 20 6c 61 6e 67 5f 65 78 70 72  ams in lang_expr
5da0: 2e 68 74 6d 6c 2e 0a 23 0a 23 20 2d 2d 20 73 79  .html..#.# -- sy
5db0: 6e 74 61 78 20 64 69 61 67 72 61 6d 20 73 69 67  ntax diagram sig
5dc0: 6e 65 64 2d 6e 75 6d 62 65 72 0a 23 0a 64 6f 5f  ned-number.#.do_
5dd0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
5de0: 78 70 72 2d 31 32 2e 31 2e 31 20 7b 20 53 45 4c  xpr-12.1.1 { SEL
5df0: 45 43 54 20 30 2c 20 2b 30 2c 20 2d 30 20 7d 20  ECT 0, +0, -0 } 
5e00: 7b 30 20 30 20 30 7d 0a 64 6f 5f 65 78 65 63 73  {0 0 0}.do_execs
5e10: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
5e20: 32 2e 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 31  2.1.2 { SELECT 1
5e30: 2c 20 2b 31 2c 20 2d 31 20 7d 20 7b 31 20 31 20  , +1, -1 } {1 1 
5e40: 2d 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  -1}.do_execsql_t
5e50: 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 31 2e  est e_expr-12.1.
5e60: 33 20 7b 20 53 45 4c 45 43 54 20 32 2c 20 2b 32  3 { SELECT 2, +2
5e70: 2c 20 2d 32 20 7d 20 7b 32 20 32 20 2d 32 7d 0a  , -2 } {2 2 -2}.
5e80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5e90: 65 5f 65 78 70 72 2d 31 32 2e 31 2e 34 20 7b 20  e_expr-12.1.4 { 
5ea0: 0a 20 20 53 45 4c 45 43 54 20 31 2e 34 2c 20 2b  .  SELECT 1.4, +
5eb0: 31 2e 34 2c 20 2d 31 2e 34 20 0a 7d 20 7b 31 2e  1.4, -1.4 .} {1.
5ec0: 34 20 31 2e 34 20 2d 31 2e 34 7d 0a 64 6f 5f 65  4 1.4 -1.4}.do_e
5ed0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
5ee0: 70 72 2d 31 32 2e 31 2e 35 20 7b 20 0a 20 20 53  pr-12.1.5 { .  S
5ef0: 45 4c 45 43 54 20 31 2e 35 65 2b 35 2c 20 2b 31  ELECT 1.5e+5, +1
5f00: 2e 35 65 2b 35 2c 20 2d 31 2e 35 65 2b 35 20 0a  .5e+5, -1.5e+5 .
5f10: 7d 20 7b 31 35 30 30 30 30 2e 30 20 31 35 30 30  } {150000.0 1500
5f20: 30 30 2e 30 20 2d 31 35 30 30 30 30 2e 30 7d 0a  00.0 -150000.0}.
5f30: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5f40: 65 5f 65 78 70 72 2d 31 32 2e 31 2e 36 20 7b 20  e_expr-12.1.6 { 
5f50: 0a 20 20 53 45 4c 45 43 54 20 30 2e 30 30 30 31  .  SELECT 0.0001
5f60: 2c 20 2b 30 2e 30 30 30 31 2c 20 2d 30 2e 30 30  , +0.0001, -0.00
5f70: 30 31 20 0a 7d 20 7b 30 2e 30 30 30 31 20 30 2e  01 .} {0.0001 0.
5f80: 30 30 30 31 20 2d 30 2e 30 30 30 31 7d 0a 0a 23  0001 -0.0001}..#
5f90: 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72   -- syntax diagr
5fa0: 61 6d 20 6c 69 74 65 72 61 6c 2d 76 61 6c 75 65  am literal-value
5fb0: 0a 23 0a 73 65 74 20 73 71 6c 69 74 65 5f 63 75  .#.set sqlite_cu
5fc0: 72 72 65 6e 74 5f 74 69 6d 65 20 31 0a 64 6f 5f  rrent_time 1.do_
5fd0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
5fe0: 78 70 72 2d 31 32 2e 32 2e 31 20 7b 53 45 4c 45  xpr-12.2.1 {SELE
5ff0: 43 54 20 31 32 33 7d 20 20 20 20 20 20 20 20 20  CT 123}         
6000: 20 20 20 20 20 20 7b 31 32 33 7d 0a 64 6f 5f 65        {123}.do_e
6010: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
6020: 70 72 2d 31 32 2e 32 2e 32 20 7b 53 45 4c 45 43  pr-12.2.2 {SELEC
6030: 54 20 31 32 33 2e 34 65 30 35 7d 20 20 20 20 20  T 123.4e05}     
6040: 20 20 20 20 20 7b 31 32 33 34 30 30 30 30 2e 30       {12340000.0
6050: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
6060: 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 33 20  t e_expr-12.2.3 
6070: 7b 53 45 4c 45 43 54 20 27 61 62 63 64 65 27 7d  {SELECT 'abcde'}
6080: 20 20 20 20 20 20 20 20 20 20 20 7b 61 62 63 64             {abcd
6090: 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e}.do_execsql_te
60a0: 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 34  st e_expr-12.2.4
60b0: 20 7b 53 45 4c 45 43 54 20 58 27 34 31 34 32 34   {SELECT X'41424
60c0: 33 27 7d 20 20 20 20 20 20 20 20 20 7b 41 42 43  3'}         {ABC
60d0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
60e0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 35 20  t e_expr-12.2.5 
60f0: 7b 53 45 4c 45 43 54 20 4e 55 4c 4c 7d 20 20 20  {SELECT NULL}   
6100: 20 20 20 20 20 20 20 20 20 20 20 7b 7b 7d 7d 0a             {{}}.
6110: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6120: 65 5f 65 78 70 72 2d 31 32 2e 32 2e 36 20 7b 53  e_expr-12.2.6 {S
6130: 45 4c 45 43 54 20 43 55 52 52 45 4e 54 5f 54 49  ELECT CURRENT_TI
6140: 4d 45 7d 20 20 20 20 20 20 7b 30 30 3a 30 30 3a  ME}      {00:00:
6150: 30 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  01}.do_execsql_t
6160: 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e  est e_expr-12.2.
6170: 37 20 7b 53 45 4c 45 43 54 20 43 55 52 52 45 4e  7 {SELECT CURREN
6180: 54 5f 44 41 54 45 7d 20 20 20 20 20 20 7b 31 39  T_DATE}      {19
6190: 37 30 2d 30 31 2d 30 31 7d 0a 64 6f 5f 65 78 65  70-01-01}.do_exe
61a0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
61b0: 2d 31 32 2e 32 2e 38 20 7b 53 45 4c 45 43 54 20  -12.2.8 {SELECT 
61c0: 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d  CURRENT_TIMESTAM
61d0: 50 7d 20 7b 7b 31 39 37 30 2d 30 31 2d 30 31 20  P} {{1970-01-01 
61e0: 30 30 3a 30 30 3a 30 31 7d 7d 0a 73 65 74 20 73  00:00:01}}.set s
61f0: 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69  qlite_current_ti
6200: 6d 65 20 30 0a 0a 23 20 2d 2d 20 73 79 6e 74 61  me 0..# -- synta
6210: 78 20 64 69 61 67 72 61 6d 20 65 78 70 72 0a 23  x diagram expr.#
6220: 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
6230: 74 2e 64 62 32 0a 65 78 65 63 73 71 6c 20 7b 0a  t.db2.execsql {.
6240: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
6250: 62 32 27 20 41 53 20 64 62 6e 61 6d 65 3b 0a 20  b2' AS dbname;. 
6260: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 62   CREATE TABLE db
6270: 6e 61 6d 65 2e 74 62 6c 6e 61 6d 65 28 63 6e 61  name.tblname(cna
6280: 6d 65 29 3b 0a 7d 0a 0a 70 72 6f 63 20 67 6c 6f  me);.}..proc glo
6290: 62 20 7b 61 72 67 73 7d 20 7b 72 65 74 75 72 6e  b {args} {return
62a0: 20 31 7d 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20   1}.db function 
62b0: 67 6c 6f 62 20 67 6c 6f 62 0a 64 62 20 66 75 6e  glob glob.db fun
62c0: 63 74 69 6f 6e 20 6d 61 74 63 68 20 67 6c 6f 62  ction match glob
62d0: 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20 72 65 67  .db function reg
62e0: 65 78 70 20 67 6c 6f 62 0a 0a 66 6f 72 65 61 63  exp glob..foreac
62f0: 68 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20  h {tn expr} {.  
6300: 31 20 31 32 33 0a 20 20 32 20 31 32 33 2e 34 65  1 123.  2 123.4e
6310: 30 35 0a 20 20 33 20 27 61 62 63 64 65 27 0a 20  05.  3 'abcde'. 
6320: 20 34 20 58 27 34 31 34 32 34 33 27 0a 20 20 35   4 X'414243'.  5
6330: 20 4e 55 4c 4c 0a 20 20 36 20 43 55 52 52 45 4e   NULL.  6 CURREN
6340: 54 5f 54 49 4d 45 0a 20 20 37 20 43 55 52 52 45  T_TIME.  7 CURRE
6350: 4e 54 5f 44 41 54 45 0a 20 20 38 20 43 55 52 52  NT_DATE.  8 CURR
6360: 45 4e 54 5f 54 49 4d 45 53 54 41 4d 50 0a 0a 20  ENT_TIMESTAMP.. 
6370: 20 39 20 3f 0a 20 31 30 20 3f 31 32 33 0a 20 31   9 ?. 10 ?123. 1
6380: 31 20 40 68 65 6c 6c 6f 0a 20 31 32 20 3a 77 6f  1 @hello. 12 :wo
6390: 72 6c 64 0a 20 31 33 20 24 74 63 6c 0a 20 31 34  rld. 13 $tcl. 14
63a0: 20 24 74 63 6c 28 61 72 72 61 79 29 0a 20 20 0a   $tcl(array).  .
63b0: 20 20 31 35 20 63 6e 61 6d 65 0a 20 20 31 36 20    15 cname.  16 
63c0: 74 62 6c 6e 61 6d 65 2e 63 6e 61 6d 65 0a 20 20  tblname.cname.  
63d0: 31 37 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61 6d  17 dbname.tblnam
63e0: 65 2e 63 6e 61 6d 65 0a 0a 20 20 31 38 20 22 2b  e.cname..  18 "+
63f0: 20 45 58 50 52 22 0a 20 20 31 39 20 22 2d 20 45   EXPR".  19 "- E
6400: 58 50 52 22 0a 20 20 32 30 20 22 4e 4f 54 20 45  XPR".  20 "NOT E
6410: 58 50 52 22 0a 20 20 32 31 20 22 7e 20 45 58 50  XPR".  21 "~ EXP
6420: 52 22 0a 0a 20 20 32 32 20 22 45 58 50 52 31 20  R"..  22 "EXPR1 
6430: 7c 7c 20 45 58 50 52 32 22 0a 20 20 32 33 20 22  || EXPR2".  23 "
6440: 45 58 50 52 31 20 2a 20 45 58 50 52 32 22 0a 20  EXPR1 * EXPR2". 
6450: 20 32 34 20 22 45 58 50 52 31 20 2f 20 45 58 50   24 "EXPR1 / EXP
6460: 52 32 22 0a 20 20 32 35 20 22 45 58 50 52 31 20  R2".  25 "EXPR1 
6470: 25 20 45 58 50 52 32 22 0a 20 20 32 36 20 22 45  % EXPR2".  26 "E
6480: 58 50 52 31 20 2b 20 45 58 50 52 32 22 0a 20 20  XPR1 + EXPR2".  
6490: 32 37 20 22 45 58 50 52 31 20 2d 20 45 58 50 52  27 "EXPR1 - EXPR
64a0: 32 22 0a 20 20 32 38 20 22 45 58 50 52 31 20 3c  2".  28 "EXPR1 <
64b0: 3c 20 45 58 50 52 32 22 0a 20 20 32 39 20 22 45  < EXPR2".  29 "E
64c0: 58 50 52 31 20 3e 3e 20 45 58 50 52 32 22 0a 20  XPR1 >> EXPR2". 
64d0: 20 33 30 20 22 45 58 50 52 31 20 26 20 45 58 50   30 "EXPR1 & EXP
64e0: 52 32 22 0a 20 20 33 31 20 22 45 58 50 52 31 20  R2".  31 "EXPR1 
64f0: 7c 20 45 58 50 52 32 22 0a 20 20 33 32 20 22 45  | EXPR2".  32 "E
6500: 58 50 52 31 20 3c 20 45 58 50 52 32 22 0a 20 20  XPR1 < EXPR2".  
6510: 33 33 20 22 45 58 50 52 31 20 3c 3d 20 45 58 50  33 "EXPR1 <= EXP
6520: 52 32 22 0a 20 20 33 34 20 22 45 58 50 52 31 20  R2".  34 "EXPR1 
6530: 3e 20 45 58 50 52 32 22 0a 20 20 33 35 20 22 45  > EXPR2".  35 "E
6540: 58 50 52 31 20 3e 3d 20 45 58 50 52 32 22 0a 20  XPR1 >= EXPR2". 
6550: 20 33 36 20 22 45 58 50 52 31 20 3d 20 45 58 50   36 "EXPR1 = EXP
6560: 52 32 22 0a 20 20 33 37 20 22 45 58 50 52 31 20  R2".  37 "EXPR1 
6570: 3d 3d 20 45 58 50 52 32 22 0a 20 20 33 38 20 22  == EXPR2".  38 "
6580: 45 58 50 52 31 20 21 3d 20 45 58 50 52 32 22 0a  EXPR1 != EXPR2".
6590: 20 20 33 39 20 22 45 58 50 52 31 20 3c 3e 20 45    39 "EXPR1 <> E
65a0: 58 50 52 32 22 0a 20 20 34 30 20 22 45 58 50 52  XPR2".  40 "EXPR
65b0: 31 20 49 53 20 45 58 50 52 32 22 0a 20 20 34 31  1 IS EXPR2".  41
65c0: 20 22 45 58 50 52 31 20 49 53 20 4e 4f 54 20 45   "EXPR1 IS NOT E
65d0: 58 50 52 32 22 0a 20 20 34 32 20 22 45 58 50 52  XPR2".  42 "EXPR
65e0: 31 20 41 4e 44 20 45 58 50 52 32 22 0a 20 20 34  1 AND EXPR2".  4
65f0: 33 20 22 45 58 50 52 31 20 4f 52 20 45 58 50 52  3 "EXPR1 OR EXPR
6600: 32 22 0a 20 0a 20 20 34 34 20 22 63 6f 75 6e 74  2". .  44 "count
6610: 28 2a 29 22 0a 20 20 34 35 20 22 63 6f 75 6e 74  (*)".  45 "count
6620: 28 44 49 53 54 49 4e 43 54 20 45 58 50 52 29 22  (DISTINCT EXPR)"
6630: 0a 20 20 34 36 20 22 73 75 62 73 74 72 28 45 58  .  46 "substr(EX
6640: 50 52 2c 20 31 30 2c 20 32 30 29 22 0a 20 20 34  PR, 10, 20)".  4
6650: 37 20 22 63 68 61 6e 67 65 73 28 29 22 0a 20 0a  7 "changes()". .
6660: 20 20 34 38 20 22 28 20 45 58 50 52 20 29 22 0a    48 "( EXPR )".
6670: 20 0a 20 20 34 39 20 22 43 41 53 54 20 28 20 45   .  49 "CAST ( E
6680: 58 50 52 20 41 53 20 69 6e 74 65 67 65 72 20 29  XPR AS integer )
6690: 22 0a 20 20 35 30 20 22 43 41 53 54 20 28 20 45  ".  50 "CAST ( E
66a0: 58 50 52 20 41 53 20 27 61 62 63 64 27 20 29 22  XPR AS 'abcd' )"
66b0: 0a 20 20 35 31 20 22 43 41 53 54 20 28 20 45 58  .  51 "CAST ( EX
66c0: 50 52 20 41 53 20 27 61 62 24 20 24 63 64 27 20  PR AS 'ab$ $cd' 
66d0: 29 22 0a 20 0a 20 20 35 32 20 22 45 58 50 52 20  )". .  52 "EXPR 
66e0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a  COLLATE nocase".
66f0: 20 20 35 33 20 22 45 58 50 52 20 43 4f 4c 4c 41    53 "EXPR COLLA
6700: 54 45 20 62 69 6e 61 72 79 22 0a 20 0a 20 20 35  TE binary". .  5
6710: 34 20 22 45 58 50 52 31 20 4c 49 4b 45 20 45 58  4 "EXPR1 LIKE EX
6720: 50 52 32 22 0a 20 20 35 35 20 22 45 58 50 52 31  PR2".  55 "EXPR1
6730: 20 4c 49 4b 45 20 45 58 50 52 32 20 45 53 43 41   LIKE EXPR2 ESCA
6740: 50 45 20 45 58 50 52 22 0a 20 20 35 36 20 22 45  PE EXPR".  56 "E
6750: 58 50 52 31 20 47 4c 4f 42 20 45 58 50 52 32 22  XPR1 GLOB EXPR2"
6760: 0a 20 20 35 37 20 22 45 58 50 52 31 20 47 4c 4f  .  57 "EXPR1 GLO
6770: 42 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45  B EXPR2 ESCAPE E
6780: 58 50 52 22 0a 20 20 35 38 20 22 45 58 50 52 31  XPR".  58 "EXPR1
6790: 20 52 45 47 45 58 50 20 45 58 50 52 32 22 0a 20   REGEXP EXPR2". 
67a0: 20 35 39 20 22 45 58 50 52 31 20 52 45 47 45 58   59 "EXPR1 REGEX
67b0: 50 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45  P EXPR2 ESCAPE E
67c0: 58 50 52 22 0a 20 20 36 30 20 22 45 58 50 52 31  XPR".  60 "EXPR1
67d0: 20 4d 41 54 43 48 20 45 58 50 52 32 22 0a 20 20   MATCH EXPR2".  
67e0: 36 31 20 22 45 58 50 52 31 20 4d 41 54 43 48 20  61 "EXPR1 MATCH 
67f0: 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50  EXPR2 ESCAPE EXP
6800: 52 22 0a 20 20 36 32 20 22 45 58 50 52 31 20 4e  R".  62 "EXPR1 N
6810: 4f 54 20 4c 49 4b 45 20 45 58 50 52 32 22 0a 20  OT LIKE EXPR2". 
6820: 20 36 33 20 22 45 58 50 52 31 20 4e 4f 54 20 4c   63 "EXPR1 NOT L
6830: 49 4b 45 20 45 58 50 52 32 20 45 53 43 41 50 45  IKE EXPR2 ESCAPE
6840: 20 45 58 50 52 22 0a 20 20 36 34 20 22 45 58 50   EXPR".  64 "EXP
6850: 52 31 20 4e 4f 54 20 47 4c 4f 42 20 45 58 50 52  R1 NOT GLOB EXPR
6860: 32 22 0a 20 20 36 35 20 22 45 58 50 52 31 20 4e  2".  65 "EXPR1 N
6870: 4f 54 20 47 4c 4f 42 20 45 58 50 52 32 20 45 53  OT GLOB EXPR2 ES
6880: 43 41 50 45 20 45 58 50 52 22 0a 20 20 36 36 20  CAPE EXPR".  66 
6890: 22 45 58 50 52 31 20 4e 4f 54 20 52 45 47 45 58  "EXPR1 NOT REGEX
68a0: 50 20 45 58 50 52 32 22 0a 20 20 36 37 20 22 45  P EXPR2".  67 "E
68b0: 58 50 52 31 20 4e 4f 54 20 52 45 47 45 58 50 20  XPR1 NOT REGEXP 
68c0: 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50  EXPR2 ESCAPE EXP
68d0: 52 22 0a 20 20 36 38 20 22 45 58 50 52 31 20 4e  R".  68 "EXPR1 N
68e0: 4f 54 20 4d 41 54 43 48 20 45 58 50 52 32 22 0a  OT MATCH EXPR2".
68f0: 20 20 36 39 20 22 45 58 50 52 31 20 4e 4f 54 20    69 "EXPR1 NOT 
6900: 4d 41 54 43 48 20 45 58 50 52 32 20 45 53 43 41  MATCH EXPR2 ESCA
6910: 50 45 20 45 58 50 52 22 0a 20 0a 20 20 37 30 20  PE EXPR". .  70 
6920: 22 45 58 50 52 20 49 53 4e 55 4c 4c 22 0a 20 20  "EXPR ISNULL".  
6930: 37 31 20 22 45 58 50 52 20 4e 4f 54 4e 55 4c 4c  71 "EXPR NOTNULL
6940: 22 0a 20 20 37 32 20 22 45 58 50 52 20 4e 4f 54  ".  72 "EXPR NOT
6950: 20 4e 55 4c 4c 22 0a 20 0a 20 20 37 33 20 22 45   NULL". .  73 "E
6960: 58 50 52 31 20 49 53 20 45 58 50 52 32 22 0a 20  XPR1 IS EXPR2". 
6970: 20 37 34 20 22 45 58 50 52 31 20 49 53 20 4e 4f   74 "EXPR1 IS NO
6980: 54 20 45 58 50 52 32 22 0a 0a 20 20 37 35 20 22  T EXPR2"..  75 "
6990: 45 58 50 52 20 4e 4f 54 20 42 45 54 57 45 45 4e  EXPR NOT BETWEEN
69a0: 20 45 58 50 52 31 20 41 4e 44 20 45 58 50 52 32   EXPR1 AND EXPR2
69b0: 22 0a 20 20 37 36 20 22 45 58 50 52 20 42 45 54  ".  76 "EXPR BET
69c0: 57 45 45 4e 20 45 58 50 52 31 20 41 4e 44 20 45  WEEN EXPR1 AND E
69d0: 58 50 52 32 22 0a 0a 20 20 37 37 20 22 45 58 50  XPR2"..  77 "EXP
69e0: 52 20 4e 4f 54 20 49 4e 20 28 53 45 4c 45 43 54  R NOT IN (SELECT
69f0: 20 63 6e 61 6d 65 20 46 52 4f 4d 20 74 62 6c 6e   cname FROM tbln
6a00: 61 6d 65 29 22 0a 20 20 37 38 20 22 45 58 50 52  ame)".  78 "EXPR
6a10: 20 4e 4f 54 20 49 4e 20 28 31 29 22 0a 20 20 37   NOT IN (1)".  7
6a20: 39 20 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 28  9 "EXPR NOT IN (
6a30: 31 2c 20 32 2c 20 33 29 22 0a 20 20 38 30 20 22  1, 2, 3)".  80 "
6a40: 45 58 50 52 20 4e 4f 54 20 49 4e 20 74 62 6c 6e  EXPR NOT IN tbln
6a50: 61 6d 65 22 0a 20 20 38 31 20 22 45 58 50 52 20  ame".  81 "EXPR 
6a60: 4e 4f 54 20 49 4e 20 64 62 6e 61 6d 65 2e 74 62  NOT IN dbname.tb
6a70: 6c 6e 61 6d 65 22 0a 20 20 38 32 20 22 45 58 50  lname".  82 "EXP
6a80: 52 20 49 4e 20 28 53 45 4c 45 43 54 20 63 6e 61  R IN (SELECT cna
6a90: 6d 65 20 46 52 4f 4d 20 74 62 6c 6e 61 6d 65 29  me FROM tblname)
6aa0: 22 0a 20 20 38 33 20 22 45 58 50 52 20 49 4e 20  ".  83 "EXPR IN 
6ab0: 28 31 29 22 0a 20 20 38 34 20 22 45 58 50 52 20  (1)".  84 "EXPR 
6ac0: 49 4e 20 28 31 2c 20 32 2c 20 33 29 22 0a 20 20  IN (1, 2, 3)".  
6ad0: 38 35 20 22 45 58 50 52 20 49 4e 20 74 62 6c 6e  85 "EXPR IN tbln
6ae0: 61 6d 65 22 0a 20 20 38 36 20 22 45 58 50 52 20  ame".  86 "EXPR 
6af0: 49 4e 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61 6d  IN dbname.tblnam
6b00: 65 22 0a 0a 20 20 38 37 20 22 45 58 49 53 54 53  e"..  87 "EXISTS
6b10: 20 28 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46   (SELECT cname F
6b20: 52 4f 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 20 20  ROM tblname)".  
6b30: 38 38 20 22 4e 4f 54 20 45 58 49 53 54 53 20 28  88 "NOT EXISTS (
6b40: 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46 52 4f  SELECT cname FRO
6b50: 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 0a 20 20 38  M tblname)"..  8
6b60: 39 20 22 43 41 53 45 20 45 58 50 52 20 57 48 45  9 "CASE EXPR WHE
6b70: 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50  N EXPR1 THEN EXP
6b80: 52 32 20 45 4c 53 45 20 45 58 50 52 20 45 4e 44  R2 ELSE EXPR END
6b90: 22 0a 20 20 39 30 20 22 43 41 53 45 20 45 58 50  ".  90 "CASE EXP
6ba0: 52 20 57 48 45 4e 20 45 58 50 52 31 20 54 48 45  R WHEN EXPR1 THE
6bb0: 4e 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20 39  N EXPR2 END".  9
6bc0: 31 20 22 43 41 53 45 20 45 58 50 52 20 57 48 45  1 "CASE EXPR WHE
6bd0: 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50  N EXPR1 THEN EXP
6be0: 52 32 20 57 48 45 4e 20 45 58 50 52 20 54 48 45  R2 WHEN EXPR THE
6bf0: 4e 20 45 58 50 52 31 20 45 4c 53 45 20 45 58 50  N EXPR1 ELSE EXP
6c00: 52 32 20 45 4e 44 22 0a 20 20 39 32 20 22 43 41  R2 END".  92 "CA
6c10: 53 45 20 45 58 50 52 20 57 48 45 4e 20 45 58 50  SE EXPR WHEN EXP
6c20: 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 57 48  R1 THEN EXPR2 WH
6c30: 45 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58 50  EN EXPR THEN EXP
6c40: 52 31 20 45 4e 44 22 0a 20 20 39 33 20 22 43 41  R1 END".  93 "CA
6c50: 53 45 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  SE WHEN EXPR1 TH
6c60: 45 4e 20 45 58 50 52 32 20 45 4c 53 45 20 45 58  EN EXPR2 ELSE EX
6c70: 50 52 20 45 4e 44 22 0a 20 20 39 34 20 22 43 41  PR END".  94 "CA
6c80: 53 45 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  SE WHEN EXPR1 TH
6c90: 45 4e 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20  EN EXPR2 END".  
6ca0: 39 35 20 22 43 41 53 45 20 57 48 45 4e 20 45 58  95 "CASE WHEN EX
6cb0: 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 57  PR1 THEN EXPR2 W
6cc0: 48 45 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58  HEN EXPR THEN EX
6cd0: 50 52 31 20 45 4c 53 45 20 45 58 50 52 32 20 45  PR1 ELSE EXPR2 E
6ce0: 4e 44 22 0a 20 20 39 36 20 22 43 41 53 45 20 57  ND".  96 "CASE W
6cf0: 48 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45  HEN EXPR1 THEN E
6d00: 58 50 52 32 20 57 48 45 4e 20 45 58 50 52 20 54  XPR2 WHEN EXPR T
6d10: 48 45 4e 20 45 58 50 52 31 20 45 4e 44 22 0a 7d  HEN EXPR1 END".}
6d20: 20 7b 0a 0a 20 20 23 20 49 66 20 74 68 65 20 65   {..  # If the e
6d30: 78 70 72 65 73 73 69 6f 6e 20 73 74 72 69 6e 67  xpression string
6d40: 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 63 6f   being parsed co
6d50: 6e 74 61 69 6e 73 20 22 45 58 50 52 32 22 2c 20  ntains "EXPR2", 
6d60: 74 68 65 6e 20 72 65 70 6c 61 63 65 0a 20 20 23  then replace.  #
6d70: 20 73 74 72 69 6e 67 20 22 45 58 50 52 31 22 20   string "EXPR1" 
6d80: 61 6e 64 20 22 45 58 50 52 32 22 20 77 69 74 68  and "EXPR2" with
6d90: 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 20 65   arbitrary SQL e
6da0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 49 66 20 69  xpressions. If i
6db0: 74 20 0a 20 20 23 20 63 6f 6e 74 61 69 6e 73 20  t .  # contains 
6dc0: 22 45 58 50 52 22 2c 20 74 68 65 6e 20 72 65 70  "EXPR", then rep
6dd0: 6c 61 63 65 20 45 58 50 52 20 77 69 74 68 20 61  lace EXPR with a
6de0: 6e 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 20  n arbitrary SQL 
6df0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 23 20  expression..  # 
6e00: 0a 20 20 73 65 74 20 65 6c 69 73 74 20 5b 6c 69  .  set elist [li
6e10: 73 74 20 24 65 78 70 72 5d 0a 20 20 69 66 20 7b  st $expr].  if {
6e20: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 45  [string match *E
6e30: 58 50 52 32 2a 20 24 65 78 70 72 5d 7d 20 7b 0a  XPR2* $expr]} {.
6e40: 20 20 20 20 73 65 74 20 65 6c 69 73 74 20 5b 6c      set elist [l
6e50: 69 73 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68  ist].    foreach
6e60: 20 7b 65 31 20 65 32 7d 20 7b 20 63 6e 61 6d 65   {e1 e2} { cname
6e70: 20 22 33 34 2b 32 32 22 20 7d 20 7b 0a 20 20 20   "34+22" } {.   
6e80: 20 20 20 6c 61 70 70 65 6e 64 20 65 6c 69 73 74     lappend elist
6e90: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
6ea0: 73 74 20 45 58 50 52 31 20 24 65 31 20 45 58 50  st EXPR1 $e1 EXP
6eb0: 52 32 20 24 65 32 5d 20 24 65 78 70 72 5d 0a 20  R2 $e2] $expr]. 
6ec0: 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 20 7b     }.  } .  if {
6ed0: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 45  [string match *E
6ee0: 58 50 52 2a 20 24 65 78 70 72 5d 7d 20 7b 0a 20  XPR* $expr]} {. 
6ef0: 20 20 20 73 65 74 20 65 6c 69 73 74 32 20 5b 6c     set elist2 [l
6f00: 69 73 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68  ist].    foreach
6f10: 20 65 6c 20 24 65 6c 69 73 74 20 7b 0a 20 20 20   el $elist {.   
6f20: 20 20 20 66 6f 72 65 61 63 68 20 65 20 7b 20 63     foreach e { c
6f30: 6e 61 6d 65 20 22 33 34 2b 32 32 22 20 7d 20 7b  name "34+22" } {
6f40: 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
6f50: 20 65 6c 69 73 74 32 20 5b 73 74 72 69 6e 67 20   elist2 [string 
6f60: 6d 61 70 20 5b 6c 69 73 74 20 45 58 50 52 20 24  map [list EXPR $
6f70: 65 5d 20 24 65 6c 5d 0a 20 20 20 20 20 20 7d 0a  e] $el].      }.
6f80: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 65 6c      }.    set el
6f90: 69 73 74 20 24 65 6c 69 73 74 32 0a 20 20 7d 0a  ist $elist2.  }.
6fa0: 0a 20 20 73 65 74 20 78 20 30 0a 20 20 66 6f 72  .  set x 0.  for
6fb0: 65 61 63 68 20 65 20 24 65 6c 69 73 74 20 7b 0a  each e $elist {.
6fc0: 20 20 20 20 69 6e 63 72 20 78 0a 20 20 20 20 64      incr x.    d
6fd0: 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  o_test e_expr-12
6fe0: 2e 33 2e 24 74 6e 2e 24 78 20 7b 20 0a 20 20 20  .3.$tn.$x { .   
6ff0: 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68     set rc [catch
7000: 20 7b 20 65 78 65 63 73 71 6c 20 22 53 45 4c 45   { execsql "SELE
7010: 43 54 20 24 65 20 46 52 4f 4d 20 74 62 6c 6e 61  CT $e FROM tblna
7020: 6d 65 22 20 7d 20 6d 73 67 5d 0a 20 20 20 20 7d  me" } msg].    }
7030: 20 7b 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 20 2d 2d   {0}.  }.}..# --
7040: 20 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20   syntax diagram 
7050: 72 61 69 73 65 2d 66 75 6e 63 74 69 6f 6e 0a 23  raise-function.#
7060: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 72 61 69  .foreach {tn rai
7070: 73 65 65 78 70 72 7d 20 7b 0a 20 20 31 20 22 52  seexpr} {.  1 "R
7080: 41 49 53 45 28 49 47 4e 4f 52 45 29 22 0a 20 20  AISE(IGNORE)".  
7090: 32 20 22 52 41 49 53 45 28 52 4f 4c 4c 42 41 43  2 "RAISE(ROLLBAC
70a0: 4b 2c 20 27 65 72 72 6f 72 20 6d 65 73 73 61 67  K, 'error messag
70b0: 65 27 29 22 0a 20 20 33 20 22 52 41 49 53 45 28  e')".  3 "RAISE(
70c0: 41 42 4f 52 54 2c 20 27 65 72 72 6f 72 20 6d 65  ABORT, 'error me
70d0: 73 73 61 67 65 27 29 22 0a 20 20 34 20 22 52 41  ssage')".  4 "RA
70e0: 49 53 45 28 46 41 49 4c 2c 20 27 65 72 72 6f 72  ISE(FAIL, 'error
70f0: 20 6d 65 73 73 61 67 65 27 29 22 0a 7d 20 7b 0a   message')".} {.
7100: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
7110: 74 20 65 5f 65 78 70 72 2d 31 32 2e 34 2e 24 74  t e_expr-12.4.$t
7120: 6e 20 22 0a 20 20 20 20 43 52 45 41 54 45 20 54  n ".    CREATE T
7130: 52 49 47 47 45 52 20 64 62 6e 61 6d 65 2e 74 72  RIGGER dbname.tr
7140: 24 74 6e 20 42 45 46 4f 52 45 20 44 45 4c 45 54  $tn BEFORE DELET
7150: 45 20 4f 4e 20 74 62 6c 6e 61 6d 65 20 42 45 47  E ON tblname BEG
7160: 49 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  IN.      SELECT 
7170: 24 72 61 69 73 65 65 78 70 72 20 3b 0a 20 20 20  $raiseexpr ;.   
7180: 20 45 4e 44 3b 0a 20 20 22 20 7b 7d 0a 7d 0a 0a   END;.  " {}.}..
7190: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
71e0: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73  t the statements
71f0: 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
7200: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
7210: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
7220: 46 3a 20 52 2d 34 30 30 37 39 2d 35 34 35 30 33  F: R-40079-54503
7230: 20 54 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65   The BETWEEN ope
7240: 72 61 74 6f 72 20 69 73 20 6c 6f 67 69 63 61 6c  rator is logical
7250: 6c 79 0a 23 20 65 71 75 69 76 61 6c 65 6e 74 20  ly.# equivalent 
7260: 74 6f 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6d  to a pair of com
7270: 70 61 72 69 73 6f 6e 73 2e 20 22 78 20 42 45 54  parisons. "x BET
7280: 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73  WEEN y AND z" is
7290: 20 65 71 75 69 76 61 6c 65 6e 74 0a 23 20 74 6f   equivalent.# to
72a0: 20 22 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 22   "x>=y AND x<=z"
72b0: 20 65 78 63 65 70 74 20 74 68 61 74 20 77 69 74   except that wit
72c0: 68 20 42 45 54 57 45 45 4e 2c 20 74 68 65 20 78  h BETWEEN, the x
72d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 23   expression is.#
72e0: 20 6f 6e 6c 79 20 65 76 61 6c 75 61 74 65 64 20   only evaluated 
72f0: 6f 6e 63 65 2e 0a 23 0a 64 62 20 66 75 6e 63 20  once..#.db func 
7300: 78 20 78 0a 70 72 6f 63 20 78 20 7b 7d 20 7b 20  x x.proc x {} { 
7310: 69 6e 63 72 20 3a 3a 78 63 6f 75 6e 74 20 3b 20  incr ::xcount ; 
7320: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 24 3a 3a  return [expr $::
7330: 78 5d 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  x] }.foreach {tn
7340: 20 78 20 65 78 70 72 20 72 65 73 20 6e 45 76 61   x expr res nEva
7350: 6c 7d 20 7b 0a 20 20 31 20 20 31 30 20 20 22 78  l} {.  1  10  "x
7360: 28 29 20 3e 3d 20 35 20 41 4e 44 20 78 28 29 20  () >= 5 AND x() 
7370: 3c 3d 20 31 35 22 20 20 31 20 20 32 0a 20 20 32  <= 15"  1  2.  2
7380: 20 20 31 30 20 20 22 78 28 29 20 42 45 54 57 45    10  "x() BETWE
7390: 45 4e 20 35 20 41 4e 44 20 31 35 22 20 20 20 20  EN 5 AND 15"    
73a0: 31 20 20 31 0a 0a 20 20 33 20 20 20 35 20 20 22  1  1..  3   5  "
73b0: 78 28 29 20 3e 3d 20 35 20 41 4e 44 20 78 28 29  x() >= 5 AND x()
73c0: 20 3c 3d 20 35 22 20 20 20 31 20 20 32 0a 20 20   <= 5"   1  2.  
73d0: 34 20 20 20 35 20 20 22 78 28 29 20 42 45 54 57  4   5  "x() BETW
73e0: 45 45 4e 20 35 20 41 4e 44 20 35 22 20 20 20 20  EEN 5 AND 5"    
73f0: 20 31 20 20 31 0a 0a 20 20 35 20 20 20 39 20 20   1  1..  5   9  
7400: 22 28 78 28 29 2c 38 29 20 3e 3d 20 28 39 2c 37  "(x(),8) >= (9,7
7410: 29 20 41 4e 44 20 28 78 28 29 2c 38 29 3c 3d 28  ) AND (x(),8)<=(
7420: 39 2c 31 30 29 22 20 20 31 20 32 0a 20 20 36 20  9,10)"  1 2.  6 
7430: 20 20 39 20 20 22 28 78 28 29 2c 38 29 20 42 45    9  "(x(),8) BE
7440: 54 57 45 45 4e 20 28 39 2c 37 29 20 41 4e 44 20  TWEEN (9,7) AND 
7450: 28 39 2c 31 30 29 22 20 20 20 20 20 20 31 20 31  (9,10)"      1 1
7460: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65  .} {.  do_test e
7470: 5f 65 78 70 72 2d 31 33 2e 31 2e 24 74 6e 20 7b  _expr-13.1.$tn {
7480: 0a 20 20 20 20 73 65 74 20 3a 3a 78 63 6f 75 6e  .    set ::xcoun
7490: 74 20 30 0a 20 20 20 20 73 65 74 20 61 20 5b 65  t 0.    set a [e
74a0: 78 65 63 73 71 6c 20 22 53 45 4c 45 43 54 20 24  xecsql "SELECT $
74b0: 65 78 70 72 22 5d 0a 20 20 20 20 6c 69 73 74 20  expr"].    list 
74c0: 24 3a 3a 78 63 6f 75 6e 74 20 24 61 0a 20 20 7d  $::xcount $a.  }
74d0: 20 5b 6c 69 73 74 20 24 6e 45 76 61 6c 20 24 72   [list $nEval $r
74e0: 65 73 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  es].}..# EVIDENC
74f0: 45 2d 4f 46 3a 20 52 2d 30 35 31 35 35 2d 33 34  E-OF: R-05155-34
7500: 34 35 34 20 54 68 65 20 70 72 65 63 65 64 65 6e  454 The preceden
7510: 63 65 20 6f 66 20 74 68 65 20 42 45 54 57 45 45  ce of the BETWEE
7520: 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 0a 23 20  N operator is.# 
7530: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
7540: 70 72 65 63 65 64 65 6e 63 65 20 61 73 20 6f 70  precedence as op
7550: 65 72 61 74 6f 72 73 20 3d 3d 20 61 6e 64 20 21  erators == and !
7560: 3d 20 61 6e 64 20 4c 49 4b 45 20 61 6e 64 20 67  = and LIKE and g
7570: 72 6f 75 70 73 0a 23 20 6c 65 66 74 20 74 6f 20  roups.# left to 
7580: 72 69 67 68 74 2e 0a 23 20 0a 23 20 54 68 65 72  right..# .# Ther
7590: 65 66 6f 72 65 2c 20 42 45 54 57 45 45 4e 20 67  efore, BETWEEN g
75a0: 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74  roups more tight
75b0: 6c 79 20 74 68 61 6e 20 6f 70 65 72 61 74 6f 72  ly than operator
75c0: 20 22 41 4e 44 22 2c 20 62 75 74 20 6c 65 73 73   "AND", but less
75d0: 0a 23 20 73 6f 20 74 68 61 6e 20 22 3c 22 2e 0a  .# so than "<"..
75e0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
75f0: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 20  t e_expr-13.2.1 
7600: 20 7b 20 53 45 4c 45 43 54 20 31 20 3d 3d 20 31   { SELECT 1 == 1
7610: 30 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20  0 BETWEEN 0 AND 
7620: 32 20 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63  2   }  1.do_exec
7630: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
7640: 31 33 2e 32 2e 32 20 20 7b 20 53 45 4c 45 43 54  13.2.2  { SELECT
7650: 20 28 31 20 3d 3d 20 31 30 29 20 42 45 54 57 45   (1 == 10) BETWE
7660: 45 4e 20 30 20 41 4e 44 20 32 20 7d 20 20 31 0a  EN 0 AND 2 }  1.
7670: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7680: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 33 20 20 7b  e_expr-13.2.3  {
7690: 20 53 45 4c 45 43 54 20 31 20 3d 3d 20 28 31 30   SELECT 1 == (10
76a0: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
76b0: 29 20 7d 20 20 30 0a 64 6f 5f 65 78 65 63 73 71  ) }  0.do_execsq
76c0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
76d0: 2e 32 2e 34 20 20 7b 20 53 45 4c 45 43 54 20 20  .2.4  { SELECT  
76e0: 36 20 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20  6 BETWEEN 4 AND 
76f0: 38 20 3d 3d 20 31 20 7d 20 20 20 20 31 0a 64 6f  8 == 1 }    1.do
7700: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7710: 65 78 70 72 2d 31 33 2e 32 2e 35 20 20 7b 20 53  expr-13.2.5  { S
7720: 45 4c 45 43 54 20 28 36 20 42 45 54 57 45 45 4e  ELECT (6 BETWEEN
7730: 20 34 20 41 4e 44 20 38 29 20 3d 3d 20 31 20 7d   4 AND 8) == 1 }
7740: 20 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f     1.do_execsql_
7750: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7760: 2e 36 20 20 7b 20 53 45 4c 45 43 54 20 20 36 20  .6  { SELECT  6 
7770: 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20 28 38  BETWEEN 4 AND (8
7780: 20 3d 3d 20 31 29 20 7d 20 20 30 0a 0a 64 6f 5f   == 1) }  0..do_
7790: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
77a0: 78 70 72 2d 31 33 2e 32 2e 37 20 20 7b 20 53 45  xpr-13.2.7  { SE
77b0: 4c 45 43 54 20 20 35 20 42 45 54 57 45 45 4e 20  LECT  5 BETWEEN 
77c0: 30 20 41 4e 44 20 30 20 20 21 3d 20 31 20 7d 20  0 AND 0  != 1 } 
77d0: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
77e0: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
77f0: 38 20 20 7b 20 53 45 4c 45 43 54 20 28 35 20 42  8  { SELECT (5 B
7800: 45 54 57 45 45 4e 20 30 20 41 4e 44 20 30 29 20  ETWEEN 0 AND 0) 
7810: 21 3d 20 31 20 7d 20 20 20 31 0a 64 6f 5f 65 78  != 1 }   1.do_ex
7820: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7830: 72 2d 31 33 2e 32 2e 39 20 20 7b 20 53 45 4c 45  r-13.2.9  { SELE
7840: 43 54 20 20 35 20 42 45 54 57 45 45 4e 20 30 20  CT  5 BETWEEN 0 
7850: 41 4e 44 20 28 30 20 21 3d 20 31 29 20 7d 20 20  AND (0 != 1) }  
7860: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
7870: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 30  t e_expr-13.2.10
7880: 20 7b 20 53 45 4c 45 43 54 20 20 31 20 21 3d 20   { SELECT  1 != 
7890: 30 20 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44  0  BETWEEN 0 AND
78a0: 20 32 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63   2  }  1.do_exec
78b0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
78c0: 31 33 2e 32 2e 31 31 20 7b 20 53 45 4c 45 43 54  13.2.11 { SELECT
78d0: 20 28 31 20 21 3d 20 30 29 20 42 45 54 57 45 45   (1 != 0) BETWEE
78e0: 4e 20 30 20 41 4e 44 20 32 20 20 7d 20 20 31 0a  N 0 AND 2  }  1.
78f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7900: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 32 20 7b  e_expr-13.2.12 {
7910: 20 53 45 4c 45 43 54 20 20 31 20 21 3d 20 28 30   SELECT  1 != (0
7920: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
7930: 29 20 7d 20 20 30 0a 0a 64 6f 5f 65 78 65 63 73  ) }  0..do_execs
7940: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7950: 33 2e 32 2e 31 33 20 7b 20 53 45 4c 45 43 54 20  3.2.13 { SELECT 
7960: 31 20 4c 49 4b 45 20 31 30 20 42 45 54 57 45 45  1 LIKE 10 BETWEE
7970: 4e 20 30 20 41 4e 44 20 32 20 20 20 7d 20 20 31  N 0 AND 2   }  1
7980: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7990: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 34 20   e_expr-13.2.14 
79a0: 7b 20 53 45 4c 45 43 54 20 28 31 20 4c 49 4b 45  { SELECT (1 LIKE
79b0: 20 31 30 29 20 42 45 54 57 45 45 4e 20 30 20 41   10) BETWEEN 0 A
79c0: 4e 44 20 32 20 7d 20 20 31 0a 64 6f 5f 65 78 65  ND 2 }  1.do_exe
79d0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
79e0: 2d 31 33 2e 32 2e 31 35 20 7b 20 53 45 4c 45 43  -13.2.15 { SELEC
79f0: 54 20 31 20 4c 49 4b 45 20 28 31 30 20 42 45 54  T 1 LIKE (10 BET
7a00: 57 45 45 4e 20 30 20 41 4e 44 20 32 29 20 7d 20  WEEN 0 AND 2) } 
7a10: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
7a20: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31  st e_expr-13.2.1
7a30: 36 20 7b 20 53 45 4c 45 43 54 20 20 36 20 42 45  6 { SELECT  6 BE
7a40: 54 57 45 45 4e 20 34 20 41 4e 44 20 38 20 4c 49  TWEEN 4 AND 8 LI
7a50: 4b 45 20 31 20 20 20 7d 20 20 31 0a 64 6f 5f 65  KE 1   }  1.do_e
7a60: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7a70: 70 72 2d 31 33 2e 32 2e 31 37 20 7b 20 53 45 4c  pr-13.2.17 { SEL
7a80: 45 43 54 20 28 36 20 42 45 54 57 45 45 4e 20 34  ECT (6 BETWEEN 4
7a90: 20 41 4e 44 20 38 29 20 4c 49 4b 45 20 31 20 20   AND 8) LIKE 1  
7aa0: 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  }  1.do_execsql_
7ab0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7ac0: 2e 31 38 20 7b 20 53 45 4c 45 43 54 20 20 36 20  .18 { SELECT  6 
7ad0: 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20 28 38  BETWEEN 4 AND (8
7ae0: 20 4c 49 4b 45 20 31 29 20 7d 20 20 30 0a 0a 64   LIKE 1) }  0..d
7af0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7b00: 5f 65 78 70 72 2d 31 33 2e 32 2e 31 39 20 7b 20  _expr-13.2.19 { 
7b10: 53 45 4c 45 43 54 20 30 20 41 4e 44 20 30 20 42  SELECT 0 AND 0 B
7b20: 45 54 57 45 45 4e 20 30 20 41 4e 44 20 31 20 20  ETWEEN 0 AND 1  
7b30: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
7b40: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7b50: 2e 32 30 20 7b 20 53 45 4c 45 43 54 20 30 20 41  .20 { SELECT 0 A
7b60: 4e 44 20 28 30 20 42 45 54 57 45 45 4e 20 30 20  ND (0 BETWEEN 0 
7b70: 41 4e 44 20 31 29 20 7d 20 30 0a 64 6f 5f 65 78  AND 1) } 0.do_ex
7b80: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7b90: 72 2d 31 33 2e 32 2e 32 31 20 7b 20 53 45 4c 45  r-13.2.21 { SELE
7ba0: 43 54 20 28 30 20 41 4e 44 20 30 29 20 42 45 54  CT (0 AND 0) BET
7bb0: 57 45 45 4e 20 30 20 41 4e 44 20 31 20 7d 20 31  WEEN 0 AND 1 } 1
7bc0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7bd0: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 32 20   e_expr-13.2.22 
7be0: 7b 20 53 45 4c 45 43 54 20 30 20 42 45 54 57 45  { SELECT 0 BETWE
7bf0: 45 4e 20 2d 31 20 41 4e 44 20 31 20 41 4e 44 20  EN -1 AND 1 AND 
7c00: 30 20 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  0   } 0.do_execs
7c10: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7c20: 33 2e 32 2e 32 33 20 7b 20 53 45 4c 45 43 54 20  3.2.23 { SELECT 
7c30: 28 30 20 42 45 54 57 45 45 4e 20 2d 31 20 41 4e  (0 BETWEEN -1 AN
7c40: 44 20 31 29 20 41 4e 44 20 30 20 7d 20 30 0a 64  D 1) AND 0 } 0.d
7c50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7c60: 5f 65 78 70 72 2d 31 33 2e 32 2e 32 34 20 7b 20  _expr-13.2.24 { 
7c70: 53 45 4c 45 43 54 20 30 20 42 45 54 57 45 45 4e  SELECT 0 BETWEEN
7c80: 20 2d 31 20 41 4e 44 20 28 31 20 41 4e 44 20 30   -1 AND (1 AND 0
7c90: 29 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71  ) } 1..do_execsq
7ca0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7cb0: 2e 32 2e 32 35 20 7b 20 53 45 4c 45 43 54 20 32  .2.25 { SELECT 2
7cc0: 20 3c 20 33 20 42 45 54 57 45 45 4e 20 30 20 41   < 3 BETWEEN 0 A
7cd0: 4e 44 20 31 20 20 20 7d 20 31 0a 64 6f 5f 65 78  ND 1   } 1.do_ex
7ce0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7cf0: 72 2d 31 33 2e 32 2e 32 36 20 7b 20 53 45 4c 45  r-13.2.26 { SELE
7d00: 43 54 20 28 32 20 3c 20 33 29 20 42 45 54 57 45  CT (2 < 3) BETWE
7d10: 45 4e 20 30 20 41 4e 44 20 31 20 7d 20 31 0a 64  EN 0 AND 1 } 1.d
7d20: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7d30: 5f 65 78 70 72 2d 31 33 2e 32 2e 32 37 20 7b 20  _expr-13.2.27 { 
7d40: 53 45 4c 45 43 54 20 32 20 3c 20 28 33 20 42 45  SELECT 2 < (3 BE
7d50: 54 57 45 45 4e 20 30 20 41 4e 44 20 31 29 20 7d  TWEEN 0 AND 1) }
7d60: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
7d70: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32  st e_expr-13.2.2
7d80: 38 20 7b 20 53 45 4c 45 43 54 20 32 20 42 45 54  8 { SELECT 2 BET
7d90: 57 45 45 4e 20 31 20 41 4e 44 20 32 20 3c 20 33  WEEN 1 AND 2 < 3
7da0: 20 20 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73      } 0.do_execs
7db0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7dc0: 33 2e 32 2e 32 39 20 7b 20 53 45 4c 45 43 54 20  3.2.29 { SELECT 
7dd0: 32 20 42 45 54 57 45 45 4e 20 31 20 41 4e 44 20  2 BETWEEN 1 AND 
7de0: 28 32 20 3c 20 33 29 20 20 7d 20 30 0a 64 6f 5f  (2 < 3)  } 0.do_
7df0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7e00: 78 70 72 2d 31 33 2e 32 2e 33 30 20 7b 20 53 45  xpr-13.2.30 { SE
7e10: 4c 45 43 54 20 28 32 20 42 45 54 57 45 45 4e 20  LECT (2 BETWEEN 
7e20: 31 20 41 4e 44 20 32 29 20 3c 20 33 20 20 7d 20  1 AND 2) < 3  } 
7e30: 31 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  1..#------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
7e80: 54 65 73 74 20 74 68 65 20 73 74 61 74 65 6d 65  Test the stateme
7e90: 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  nts related to t
7ea0: 68 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  he LIKE and GLOB
7eb0: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 23 0a 23 20   operators..#.# 
7ec0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
7ed0: 36 35 38 34 2d 36 30 31 38 39 20 54 68 65 20 4c  6584-60189 The L
7ee0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 64 6f 65  IKE operator doe
7ef0: 73 20 61 20 70 61 74 74 65 72 6e 20 6d 61 74 63  s a pattern matc
7f00: 68 69 6e 67 0a 23 20 63 6f 6d 70 61 72 69 73 6f  hing.# compariso
7f10: 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  n..#.# EVIDENCE-
7f20: 4f 46 3a 20 52 2d 31 31 32 39 35 2d 30 34 36 35  OF: R-11295-0465
7f30: 37 20 54 68 65 20 6f 70 65 72 61 6e 64 20 74 6f  7 The operand to
7f40: 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
7f50: 65 20 4c 49 4b 45 0a 23 20 6f 70 65 72 61 74 6f  e LIKE.# operato
7f60: 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  r contains the p
7f70: 61 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20 6c  attern and the l
7f80: 65 66 74 20 68 61 6e 64 20 6f 70 65 72 61 6e 64  eft hand operand
7f90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 23 20   contains the.# 
7fa0: 73 74 72 69 6e 67 20 74 6f 20 6d 61 74 63 68 20  string to match 
7fb0: 61 67 61 69 6e 73 74 20 74 68 65 20 70 61 74 74  against the patt
7fc0: 65 72 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ern..#.do_execsq
7fd0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
7fe0: 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61  .1.1 { SELECT 'a
7ff0: 62 63 25 27 20 4c 49 4b 45 20 27 61 62 63 64 65  bc%' LIKE 'abcde
8000: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
8010: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
8020: 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.2 { SELECT 'ab
8030: 63 64 65 27 20 4c 49 4b 45 20 27 61 62 63 25 27  cde' LIKE 'abc%'
8040: 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43 45   } 1..# EVIDENCE
8050: 2d 4f 46 3a 20 52 2d 35 35 34 30 36 2d 33 38 35  -OF: R-55406-385
8060: 32 34 20 41 20 70 65 72 63 65 6e 74 20 73 79 6d  24 A percent sym
8070: 62 6f 6c 20 28 22 25 22 29 20 69 6e 20 74 68 65  bol ("%") in the
8080: 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 0a 23 20   LIKE pattern.# 
8090: 6d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  matches any sequ
80a0: 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20  ence of zero or 
80b0: 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 20  more characters 
80c0: 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 23  in the string..#
80d0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
80e0: 20 65 5f 65 78 70 72 2d 31 34 2e 32 2e 31 20 7b   e_expr-14.2.1 {
80f0: 20 53 45 4c 45 43 54 20 27 61 62 64 65 27 20 20   SELECT 'abde'  
8100: 20 20 4c 49 4b 45 20 27 61 62 25 64 65 27 20 7d    LIKE 'ab%de' }
8110: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
8120: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 32 2e 32  st e_expr-14.2.2
8130: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 58 64 65   { SELECT 'abXde
8140: 27 20 20 20 4c 49 4b 45 20 27 61 62 25 64 65 27  '   LIKE 'ab%de'
8150: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
8160: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 32  test e_expr-14.2
8170: 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62 41  .3 { SELECT 'abA
8180: 42 43 64 65 27 20 4c 49 4b 45 20 27 61 62 25 64  BCde' LIKE 'ab%d
8190: 65 27 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e  e' } 1..# EVIDEN
81a0: 43 45 2d 4f 46 3a 20 52 2d 33 30 34 33 33 2d 32  CE-OF: R-30433-2
81b0: 35 34 34 33 20 41 6e 20 75 6e 64 65 72 73 63 6f  5443 An undersco
81c0: 72 65 20 28 22 5f 22 29 20 69 6e 20 74 68 65 20  re ("_") in the 
81d0: 4c 49 4b 45 20 70 61 74 74 65 72 6e 0a 23 20 6d  LIKE pattern.# m
81e0: 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c  atches any singl
81f0: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74  e character in t
8200: 68 65 20 73 74 72 69 6e 67 2e 0a 23 0a 64 6f 5f  he string..#.do_
8210: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8220: 78 70 72 2d 31 34 2e 33 2e 31 20 7b 20 53 45 4c  xpr-14.3.1 { SEL
8230: 45 43 54 20 27 61 62 64 65 27 20 20 20 20 4c 49  ECT 'abde'    LI
8240: 4b 45 20 27 61 62 5f 64 65 27 20 7d 20 30 0a 64  KE 'ab_de' } 0.d
8250: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8260: 5f 65 78 70 72 2d 31 34 2e 33 2e 32 20 7b 20 53  _expr-14.3.2 { S
8270: 45 4c 45 43 54 20 27 61 62 58 64 65 27 20 20 20  ELECT 'abXde'   
8280: 4c 49 4b 45 20 27 61 62 5f 64 65 27 20 7d 20 31  LIKE 'ab_de' } 1
8290: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
82a0: 20 65 5f 65 78 70 72 2d 31 34 2e 33 2e 33 20 7b   e_expr-14.3.3 {
82b0: 20 53 45 4c 45 43 54 20 27 61 62 41 42 43 64 65   SELECT 'abABCde
82c0: 27 20 4c 49 4b 45 20 27 61 62 5f 64 65 27 20 7d  ' LIKE 'ab_de' }
82d0: 20 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f   0..# EVIDENCE-O
82e0: 46 3a 20 52 2d 35 39 30 30 37 2d 32 30 34 35 34  F: R-59007-20454
82f0: 20 41 6e 79 20 6f 74 68 65 72 20 63 68 61 72 61   Any other chara
8300: 63 74 65 72 20 6d 61 74 63 68 65 73 20 69 74 73  cter matches its
8310: 65 6c 66 20 6f 72 20 69 74 73 0a 23 20 6c 6f 77  elf or its.# low
8320: 65 72 2f 75 70 70 65 72 20 63 61 73 65 20 65 71  er/upper case eq
8330: 75 69 76 61 6c 65 6e 74 20 28 69 2e 65 2e 20 63  uivalent (i.e. c
8340: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
8350: 6d 61 74 63 68 69 6e 67 29 2e 0a 23 0a 64 6f 5f  matching)..#.do_
8360: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8370: 78 70 72 2d 31 34 2e 34 2e 31 20 7b 20 53 45 4c  xpr-14.4.1 { SEL
8380: 45 43 54 20 27 61 62 63 27 20 4c 49 4b 45 20 27  ECT 'abc' LIKE '
8390: 61 42 63 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63  aBc' } 1.do_exec
83a0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
83b0: 31 34 2e 34 2e 32 20 7b 20 53 45 4c 45 43 54 20  14.4.2 { SELECT 
83c0: 27 61 42 63 27 20 4c 49 4b 45 20 27 61 42 63 27  'aBc' LIKE 'aBc'
83d0: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
83e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 34  test e_expr-14.4
83f0: 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 63 27  .3 { SELECT 'ac'
8400: 20 20 4c 49 4b 45 20 27 61 42 63 27 20 7d 20 30    LIKE 'aBc' } 0
8410: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
8420: 20 52 2d 32 33 36 34 38 2d 35 38 35 32 37 20 53   R-23648-58527 S
8430: 51 4c 69 74 65 20 6f 6e 6c 79 20 75 6e 64 65 72  QLite only under
8440: 73 74 61 6e 64 73 20 75 70 70 65 72 2f 6c 6f 77  stands upper/low
8450: 65 72 20 63 61 73 65 0a 23 20 66 6f 72 20 41 53  er case.# for AS
8460: 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20 62  CII characters b
8470: 79 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45  y default..#.# E
8480: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34  VIDENCE-OF: R-04
8490: 35 33 32 2d 31 31 35 32 37 20 54 68 65 20 4c 49  532-11527 The LI
84a0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63  KE operator is c
84b0: 61 73 65 20 73 65 6e 73 69 74 69 76 65 20 62 79  ase sensitive by
84c0: 0a 23 20 64 65 66 61 75 6c 74 20 66 6f 72 20 75  .# default for u
84d0: 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72  nicode character
84e0: 73 20 74 68 61 74 20 61 72 65 20 62 65 79 6f 6e  s that are beyon
84f0: 64 20 74 68 65 20 41 53 43 49 49 20 72 61 6e 67  d the ASCII rang
8500: 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  e..#.# EVIDENCE-
8510: 4f 46 3a 20 52 2d 34 34 33 38 31 2d 31 31 36 36  OF: R-44381-1166
8520: 39 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  9 the expression
8530: 0a 23 20 27 61 27 26 6e 62 73 70 3b 4c 49 4b 45  .# 'a'&nbsp;LIKE
8540: 26 6e 62 73 70 3b 27 41 27 20 69 73 20 54 52 55  &nbsp;'A' is TRU
8550: 45 20 62 75 74 0a 23 20 27 26 61 65 6c 69 67 3b  E but.# '&aelig;
8560: 27 26 6e 62 73 70 3b 4c 49 4b 45 26 6e 62 73 70  '&nbsp;LIKE&nbsp
8570: 3b 27 26 41 45 6c 69 67 3b 27 20 69 73 20 46 41  ;'&AElig;' is FA
8580: 4c 53 45 2e 0a 23 0a 23 20 20 20 54 68 65 20 72  LSE..#.#   The r
8590: 65 73 74 72 69 63 74 69 6f 6e 20 74 6f 20 41 53  estriction to AS
85a0: 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20 64  CII characters d
85b0: 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79 20 69 66  oes not apply if
85c0: 20 74 68 65 20 49 43 55 0a 23 20 20 20 6c 69 62   the ICU.#   lib
85d0: 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64  rary is compiled
85e0: 20 69 6e 2e 20 57 68 65 6e 20 49 43 55 20 69 73   in. When ICU is
85f0: 20 65 6e 61 62 6c 65 64 20 53 51 4c 69 74 65 20   enabled SQLite 
8600: 64 6f 65 73 20 6e 6f 74 20 61 63 74 0a 23 20 20  does not act.#  
8610: 20 61 73 20 69 74 20 64 6f 65 73 20 22 62 79 20   as it does "by 
8620: 64 65 66 61 75 6c 74 22 2e 0a 23 0a 64 6f 5f 65  default"..#.do_e
8630: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8640: 70 72 2d 31 34 2e 35 2e 31 20 7b 20 53 45 4c 45  pr-14.5.1 { SELE
8650: 43 54 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20  CT 'A' LIKE 'a' 
8660: 20 20 20 20 20 20 20 20 7d 20 31 0a 69 66 63 61          } 1.ifca
8670: 70 61 62 6c 65 20 21 69 63 75 20 7b 0a 20 20 64  pable !icu {.  d
8680: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8690: 5f 65 78 70 72 2d 31 34 2e 35 2e 32 20 22 53 45  _expr-14.5.2 "SE
86a0: 4c 45 43 54 20 27 5c 75 30 30 63 36 27 20 4c 49  LECT '\u00c6' LI
86b0: 4b 45 20 27 5c 75 30 30 65 36 27 22 20 30 0a 7d  KE '\u00e6'" 0.}
86c0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
86d0: 20 52 2d 35 36 36 38 33 2d 31 33 37 33 31 20 49   R-56683-13731 I
86e0: 66 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 45  f the optional E
86f0: 53 43 41 50 45 20 63 6c 61 75 73 65 20 69 73 20  SCAPE clause is 
8700: 70 72 65 73 65 6e 74 2c 0a 23 20 74 68 65 6e 20  present,.# then 
8710: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66  the expression f
8720: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 45 53 43  ollowing the ESC
8730: 41 50 45 20 6b 65 79 77 6f 72 64 20 6d 75 73 74  APE keyword must
8740: 20 65 76 61 6c 75 61 74 65 20 74 6f 20 61 0a 23   evaluate to a.#
8750: 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69   string consisti
8760: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63  ng of a single c
8770: 68 61 72 61 63 74 65 72 2e 0a 23 0a 64 6f 5f 63  haracter..#.do_c
8780: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65  atchsql_test e_e
8790: 78 70 72 2d 31 34 2e 36 2e 31 20 7b 20 0a 20 20  xpr-14.6.1 { .  
87a0: 53 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20  SELECT 'A' LIKE 
87b0: 27 61 27 20 45 53 43 41 50 45 20 27 31 32 27 20  'a' ESCAPE '12' 
87c0: 0a 7d 20 7b 31 20 7b 45 53 43 41 50 45 20 65 78  .} {1 {ESCAPE ex
87d0: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
87e0: 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63   a single charac
87f0: 74 65 72 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71  ter}}.do_catchsq
8800: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
8810: 2e 36 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54  .6.2 { .  SELECT
8820: 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53   'A' LIKE 'a' ES
8830: 43 41 50 45 20 27 27 20 0a 7d 20 7b 31 20 7b 45  CAPE '' .} {1 {E
8840: 53 43 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e  SCAPE expression
8850: 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c   must be a singl
8860: 65 20 63 68 61 72 61 63 74 65 72 7d 7d 0a 64 6f  e character}}.do
8870: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
8880: 5f 65 78 70 72 2d 31 34 2e 36 2e 33 20 7b 20 53  _expr-14.6.3 { S
8890: 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20 27  ELECT 'A' LIKE '
88a0: 61 27 20 45 53 43 41 50 45 20 27 78 27 20 7d 20  a' ESCAPE 'x' } 
88b0: 20 20 20 7b 30 20 31 7d 0a 64 6f 5f 63 61 74 63     {0 1}.do_catc
88c0: 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  hsql_test e_expr
88d0: 2d 31 34 2e 36 2e 34 20 22 53 45 4c 45 43 54 20  -14.6.4 "SELECT 
88e0: 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53 43  'A' LIKE 'a' ESC
88f0: 41 50 45 20 27 5c 75 30 30 65 36 27 22 20 7b 30  APE '\u00e6'" {0
8900: 20 31 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   1}..# EVIDENCE-
8910: 4f 46 3a 20 52 2d 30 32 30 34 35 2d 32 33 37 36  OF: R-02045-2376
8920: 32 20 54 68 69 73 20 63 68 61 72 61 63 74 65 72  2 This character
8930: 20 6d 61 79 20 62 65 20 75 73 65 64 20 69 6e 20   may be used in 
8940: 74 68 65 20 4c 49 4b 45 0a 23 20 70 61 74 74 65  the LIKE.# patte
8950: 72 6e 20 74 6f 20 69 6e 63 6c 75 64 65 20 6c 69  rn to include li
8960: 74 65 72 61 6c 20 70 65 72 63 65 6e 74 20 6f 72  teral percent or
8970: 20 75 6e 64 65 72 73 63 6f 72 65 20 63 68 61 72   underscore char
8980: 61 63 74 65 72 73 2e 0a 23 0a 23 20 45 56 49 44  acters..#.# EVID
8990: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 33 34 35  ENCE-OF: R-13345
89a0: 2d 33 31 38 33 30 20 54 68 65 20 65 73 63 61 70  -31830 The escap
89b0: 65 20 63 68 61 72 61 63 74 65 72 20 66 6f 6c 6c  e character foll
89c0: 6f 77 65 64 20 62 79 20 61 20 70 65 72 63 65 6e  owed by a percen
89d0: 74 0a 23 20 73 79 6d 62 6f 6c 20 28 25 29 2c 20  t.# symbol (%), 
89e0: 75 6e 64 65 72 73 63 6f 72 65 20 28 5f 29 2c 20  underscore (_), 
89f0: 6f 72 20 61 20 73 65 63 6f 6e 64 20 69 6e 73 74  or a second inst
8a00: 61 6e 63 65 20 6f 66 20 74 68 65 20 65 73 63 61  ance of the esca
8a10: 70 65 0a 23 20 63 68 61 72 61 63 74 65 72 20 69  pe.# character i
8a20: 74 73 65 6c 66 20 6d 61 74 63 68 65 73 20 61 20  tself matches a 
8a30: 6c 69 74 65 72 61 6c 20 70 65 72 63 65 6e 74 20  literal percent 
8a40: 73 79 6d 62 6f 6c 2c 20 75 6e 64 65 72 73 63 6f  symbol, undersco
8a50: 72 65 2c 20 6f 72 20 61 0a 23 20 73 69 6e 67 6c  re, or a.# singl
8a60: 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74  e escape charact
8a70: 65 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  er, respectively
8a80: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
8a90: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e  est e_expr-14.7.
8aa0: 31 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  1  { SELECT 'abc
8ab0: 25 27 20 20 4c 49 4b 45 20 27 61 62 63 58 25 27  %'  LIKE 'abcX%'
8ac0: 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 31 0a   ESCAPE 'X' } 1.
8ad0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8ae0: 65 5f 65 78 70 72 2d 31 34 2e 37 2e 32 20 20 7b  e_expr-14.7.2  {
8af0: 20 53 45 4c 45 43 54 20 27 61 62 63 35 27 20 20   SELECT 'abc5'  
8b00: 4c 49 4b 45 20 27 61 62 63 58 25 27 20 45 53 43  LIKE 'abcX%' ESC
8b10: 41 50 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65  APE 'X' } 0.do_e
8b20: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8b30: 70 72 2d 31 34 2e 37 2e 33 20 20 7b 20 53 45 4c  pr-14.7.3  { SEL
8b40: 45 43 54 20 27 61 62 63 27 20 20 20 4c 49 4b 45  ECT 'abc'   LIKE
8b50: 20 27 61 62 63 58 25 27 20 45 53 43 41 50 45 20   'abcX%' ESCAPE 
8b60: 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  'X' } 0.do_execs
8b70: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8b80: 34 2e 37 2e 34 20 20 7b 20 53 45 4c 45 43 54 20  4.7.4  { SELECT 
8b90: 27 61 62 63 58 25 27 20 4c 49 4b 45 20 27 61 62  'abcX%' LIKE 'ab
8ba0: 63 58 25 27 20 45 53 43 41 50 45 20 27 58 27 20  cX%' ESCAPE 'X' 
8bb0: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
8bc0: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e  est e_expr-14.7.
8bd0: 35 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  5  { SELECT 'abc
8be0: 25 25 27 20 4c 49 4b 45 20 27 61 62 63 58 25 27  %%' LIKE 'abcX%'
8bf0: 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a   ESCAPE 'X' } 0.
8c00: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8c10: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 36 20 20   e_expr-14.7.6  
8c20: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 5f 27 20  { SELECT 'abc_' 
8c30: 20 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53   LIKE 'abcX_' ES
8c40: 43 41 50 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f  CAPE 'X' } 1.do_
8c50: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8c60: 78 70 72 2d 31 34 2e 37 2e 37 20 20 7b 20 53 45  xpr-14.7.7  { SE
8c70: 4c 45 43 54 20 27 61 62 63 35 27 20 20 4c 49 4b  LECT 'abc5'  LIK
8c80: 45 20 27 61 62 63 58 5f 27 20 45 53 43 41 50 45  E 'abcX_' ESCAPE
8c90: 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63   'X' } 0.do_exec
8ca0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
8cb0: 31 34 2e 37 2e 38 20 20 7b 20 53 45 4c 45 43 54  14.7.8  { SELECT
8cc0: 20 27 61 62 63 27 20 20 20 4c 49 4b 45 20 27 61   'abc'   LIKE 'a
8cd0: 62 63 58 5f 27 20 45 53 43 41 50 45 20 27 58 27  bcX_' ESCAPE 'X'
8ce0: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
8cf0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37  test e_expr-14.7
8d00: 2e 39 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .9  { SELECT 'ab
8d10: 63 58 5f 27 20 4c 49 4b 45 20 27 61 62 63 58 5f  cX_' LIKE 'abcX_
8d20: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30  ' ESCAPE 'X' } 0
8d30: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8d40: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 30 20   e_expr-14.7.10 
8d50: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 5f 5f 27  { SELECT 'abc__'
8d60: 20 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53   LIKE 'abcX_' ES
8d70: 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 64 6f  CAPE 'X' } 0..do
8d80: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8d90: 65 78 70 72 2d 31 34 2e 37 2e 31 31 20 7b 20 53  expr-14.7.11 { S
8da0: 45 4c 45 43 54 20 27 61 62 63 58 27 20 20 4c 49  ELECT 'abcX'  LI
8db0: 4b 45 20 27 61 62 63 58 58 27 20 45 53 43 41 50  KE 'abcXX' ESCAP
8dc0: 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f 65 78 65  E 'X' } 1.do_exe
8dd0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
8de0: 2d 31 34 2e 37 2e 31 32 20 7b 20 53 45 4c 45 43  -14.7.12 { SELEC
8df0: 54 20 27 61 62 63 35 27 20 20 4c 49 4b 45 20 27  T 'abc5'  LIKE '
8e00: 61 62 63 58 58 27 20 45 53 43 41 50 45 20 27 58  abcXX' ESCAPE 'X
8e10: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
8e20: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
8e30: 37 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 27 61  7.13 { SELECT 'a
8e40: 62 63 27 20 20 20 4c 49 4b 45 20 27 61 62 63 58  bc'   LIKE 'abcX
8e50: 58 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20  X' ESCAPE 'X' } 
8e60: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
8e70: 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 34  t e_expr-14.7.14
8e80: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 58 58   { SELECT 'abcXX
8e90: 27 20 4c 49 4b 45 20 27 61 62 63 58 58 27 20 45  ' LIKE 'abcXX' E
8ea0: 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 23  SCAPE 'X' } 0..#
8eb0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
8ec0: 35 31 33 35 39 2d 31 37 34 39 36 20 54 68 65 20  51359-17496 The 
8ed0: 69 6e 66 69 78 20 4c 49 4b 45 20 6f 70 65 72 61  infix LIKE opera
8ee0: 74 6f 72 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  tor is implement
8ef0: 65 64 20 62 79 0a 23 20 63 61 6c 6c 69 6e 67 20  ed by.# calling 
8f00: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d  the application-
8f10: 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63  defined SQL func
8f20: 74 69 6f 6e 73 20 6c 69 6b 65 28 59 2c 58 29 20  tions like(Y,X) 
8f30: 6f 72 20 6c 69 6b 65 28 59 2c 58 2c 5a 29 2e 0a  or like(Y,X,Z)..
8f40: 23 0a 70 72 6f 63 20 6c 69 6b 65 66 75 6e 63 20  #.proc likefunc 
8f50: 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20  {args} {.  eval 
8f60: 6c 61 70 70 65 6e 64 20 3a 3a 6c 69 6b 65 61 72  lappend ::likear
8f70: 67 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72  gs $args.  retur
8f80: 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 6c 69  n 1.}.db func li
8f90: 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 6c  ke -argcount 2 l
8fa0: 69 6b 65 66 75 6e 63 0a 64 62 20 66 75 6e 63 20  ikefunc.db func 
8fb0: 6c 69 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 33  like -argcount 3
8fc0: 20 6c 69 6b 65 66 75 6e 63 0a 73 65 74 20 3a 3a   likefunc.set ::
8fd0: 6c 69 6b 65 61 72 67 73 20 5b 6c 69 73 74 5d 0a  likeargs [list].
8fe0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8ff0: 65 5f 65 78 70 72 2d 31 35 2e 31 2e 31 20 7b 20  e_expr-15.1.1 { 
9000: 53 45 4c 45 43 54 20 27 61 62 63 27 20 4c 49 4b  SELECT 'abc' LIK
9010: 45 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74  E 'def' } 1.do_t
9020: 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78  est         e_ex
9030: 70 72 2d 31 35 2e 31 2e 32 20 7b 20 73 65 74 20  pr-15.1.2 { set 
9040: 6c 69 6b 65 61 72 67 73 20 7d 20 7b 64 65 66 20  likeargs } {def 
9050: 61 62 63 7d 0a 73 65 74 20 3a 3a 6c 69 6b 65 61  abc}.set ::likea
9060: 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  rgs [list].do_ex
9070: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
9080: 72 2d 31 35 2e 31 2e 33 20 7b 20 53 45 4c 45 43  r-15.1.3 { SELEC
9090: 54 20 27 61 62 63 27 20 4c 49 4b 45 20 27 64 65  T 'abc' LIKE 'de
90a0: 66 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20  f' ESCAPE 'X' } 
90b0: 31 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  1.do_test       
90c0: 20 20 65 5f 65 78 70 72 2d 31 35 2e 31 2e 34 20    e_expr-15.1.4 
90d0: 7b 20 73 65 74 20 6c 69 6b 65 61 72 67 73 20 7d  { set likeargs }
90e0: 20 7b 64 65 66 20 61 62 63 20 58 7d 0a 64 62 20   {def abc X}.db 
90f0: 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62  close.sqlite3 db
9100: 20 74 65 73 74 2e 64 62 0a 0a 23 20 45 56 49 44   test.db..# EVID
9110: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 38 36 38  ENCE-OF: R-22868
9120: 2d 32 35 38 38 30 20 54 68 65 20 4c 49 4b 45 20  -25880 The LIKE 
9130: 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65 20  operator can be 
9140: 6d 61 64 65 20 63 61 73 65 0a 23 20 73 65 6e 73  made case.# sens
9150: 69 74 69 76 65 20 75 73 69 6e 67 20 74 68 65 20  itive using the 
9160: 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c  case_sensitive_l
9170: 69 6b 65 20 70 72 61 67 6d 61 2e 0a 23 0a 64 6f  ike pragma..#.do
9180: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9190: 65 78 70 72 2d 31 36 2e 31 2e 31 20 20 7b 20 53  expr-16.1.1  { S
91a0: 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4c  ELECT 'abcxyz' L
91b0: 49 4b 45 20 27 41 42 43 25 27 20 7d 20 31 0a 64  IKE 'ABC%' } 1.d
91c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
91d0: 5f 65 78 70 72 2d 31 36 2e 31 2e 31 62 20 7b 20  _expr-16.1.1b { 
91e0: 53 45 4c 45 43 54 20 27 61 62 63 25 78 79 7a 27  SELECT 'abc%xyz'
91f0: 20 4c 49 4b 45 20 27 41 42 43 5c 25 78 25 27 20   LIKE 'ABC\%x%' 
9200: 45 53 43 41 50 45 20 27 5c 27 20 7d 20 31 0a 64  ESCAPE '\' } 1.d
9210: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
9220: 5f 65 78 70 72 2d 31 36 2e 31 2e 32 20 20 7b 20  _expr-16.1.2  { 
9230: 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73  PRAGMA case_sens
9240: 69 74 69 76 65 5f 6c 69 6b 65 20 3d 20 31 20 7d  itive_like = 1 }
9250: 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   {}.do_execsql_t
9260: 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e  est e_expr-16.1.
9270: 33 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  3  { SELECT 'abc
9280: 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25 27  xyz' LIKE 'ABC%'
9290: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
92a0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
92b0: 2e 33 62 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .3b { SELECT 'ab
92c0: 63 25 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43  c%xyz' LIKE 'ABC
92d0: 5c 25 58 25 27 20 45 53 43 41 50 45 20 27 5c 27  \%X%' ESCAPE '\'
92e0: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
92f0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
9300: 2e 34 20 20 7b 20 53 45 4c 45 43 54 20 27 41 42  .4  { SELECT 'AB
9310: 43 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25  Cxyz' LIKE 'ABC%
9320: 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 1.do_execsql
9330: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e  _test e_expr-16.
9340: 31 2e 34 62 20 7b 20 53 45 4c 45 43 54 20 27 41  1.4b { SELECT 'A
9350: 42 43 25 78 79 7a 27 20 4c 49 4b 45 20 27 41 42  BC%xyz' LIKE 'AB
9360: 43 5c 25 78 25 27 20 45 53 43 41 50 45 20 27 5c  C\%x%' ESCAPE '\
9370: 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 1.do_execsql
9380: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e  _test e_expr-16.
9390: 31 2e 35 20 20 7b 20 50 52 41 47 4d 41 20 63 61  1.5  { PRAGMA ca
93a0: 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b  se_sensitive_lik
93b0: 65 20 3d 20 30 20 7d 20 7b 7d 0a 64 6f 5f 65 78  e = 0 } {}.do_ex
93c0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
93d0: 72 2d 31 36 2e 31 2e 36 20 20 7b 20 53 45 4c 45  r-16.1.6  { SELE
93e0: 43 54 20 27 61 62 63 78 79 7a 27 20 4c 49 4b 45  CT 'abcxyz' LIKE
93f0: 20 27 41 42 43 25 27 20 7d 20 31 0a 64 6f 5f 65   'ABC%' } 1.do_e
9400: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
9410: 70 72 2d 31 36 2e 31 2e 36 62 20 7b 20 53 45 4c  pr-16.1.6b { SEL
9420: 45 43 54 20 27 61 62 63 25 78 79 7a 27 20 4c 49  ECT 'abc%xyz' LI
9430: 4b 45 20 27 41 42 43 5c 25 58 25 27 20 45 53 43  KE 'ABC\%X%' ESC
9440: 41 50 45 20 27 5c 27 20 7d 20 31 0a 64 6f 5f 65  APE '\' } 1.do_e
9450: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
9460: 70 72 2d 31 36 2e 31 2e 37 20 20 7b 20 53 45 4c  pr-16.1.7  { SEL
9470: 45 43 54 20 27 41 42 43 78 79 7a 27 20 4c 49 4b  ECT 'ABCxyz' LIK
9480: 45 20 27 41 42 43 25 27 20 7d 20 31 0a 64 6f 5f  E 'ABC%' } 1.do_
9490: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
94a0: 78 70 72 2d 31 36 2e 31 2e 37 62 20 7b 20 53 45  xpr-16.1.7b { SE
94b0: 4c 45 43 54 20 27 41 42 43 25 78 79 7a 27 20 4c  LECT 'ABC%xyz' L
94c0: 49 4b 45 20 27 41 42 43 5c 25 58 25 27 20 45 53  IKE 'ABC\%X%' ES
94d0: 43 41 50 45 20 27 5c 27 20 7d 20 31 0a 0a 23 20  CAPE '\' } 1..# 
94e0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
94f0: 32 30 38 37 2d 31 32 30 34 33 20 54 68 65 20 47  2087-12043 The G
9500: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 69 73 20  LOB operator is 
9510: 73 69 6d 69 6c 61 72 20 74 6f 20 4c 49 4b 45 20  similar to LIKE 
9520: 62 75 74 0a 23 20 75 73 65 73 20 74 68 65 20 55  but.# uses the U
9530: 6e 69 78 20 66 69 6c 65 20 67 6c 6f 62 62 69 6e  nix file globbin
9540: 67 20 73 79 6e 74 61 78 20 66 6f 72 20 69 74 73  g syntax for its
9550: 20 77 69 6c 64 63 61 72 64 73 2e 0a 23 0a 23 20   wildcards..#.# 
9560: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
9570: 39 38 31 33 2d 31 37 32 37 39 20 41 6c 73 6f 2c  9813-17279 Also,
9580: 20 47 4c 4f 42 20 69 73 20 63 61 73 65 20 73 65   GLOB is case se
9590: 6e 73 69 74 69 76 65 2c 20 75 6e 6c 69 6b 65 20  nsitive, unlike 
95a0: 4c 49 4b 45 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  LIKE..#.do_execs
95b0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
95c0: 37 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 27  7.1.1 { SELECT '
95d0: 61 62 63 78 79 7a 27 20 47 4c 4f 42 20 27 61 62  abcxyz' GLOB 'ab
95e0: 63 25 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  c%' } 0.do_execs
95f0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
9600: 37 2e 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 27  7.1.2 { SELECT '
9610: 61 62 63 78 79 7a 27 20 47 4c 4f 42 20 27 61 62  abcxyz' GLOB 'ab
9620: 63 2a 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73  c*' } 1.do_execs
9630: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
9640: 37 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54 20 27  7.1.3 { SELECT '
9650: 61 62 63 78 79 7a 27 20 47 4c 4f 42 20 27 61 62  abcxyz' GLOB 'ab
9660: 63 5f 5f 5f 27 20 7d 20 30 0a 64 6f 5f 65 78 65  c___' } 0.do_exe
9670: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
9680: 2d 31 37 2e 31 2e 34 20 7b 20 53 45 4c 45 43 54  -17.1.4 { SELECT
9690: 20 27 61 62 63 78 79 7a 27 20 47 4c 4f 42 20 27   'abcxyz' GLOB '
96a0: 61 62 63 3f 3f 3f 27 20 7d 20 31 0a 0a 64 6f 5f  abc???' } 1..do_
96b0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
96c0: 78 70 72 2d 31 37 2e 31 2e 35 20 7b 20 53 45 4c  xpr-17.1.5 { SEL
96d0: 45 43 54 20 27 61 62 63 78 79 7a 27 20 47 4c 4f  ECT 'abcxyz' GLO
96e0: 42 20 27 61 62 63 2a 27 20 7d 20 31 0a 64 6f 5f  B 'abc*' } 1.do_
96f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
9700: 78 70 72 2d 31 37 2e 31 2e 36 20 7b 20 53 45 4c  xpr-17.1.6 { SEL
9710: 45 43 54 20 27 41 42 43 78 79 7a 27 20 47 4c 4f  ECT 'ABCxyz' GLO
9720: 42 20 27 61 62 63 2a 27 20 7d 20 30 0a 64 6f 5f  B 'abc*' } 0.do_
9730: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
9740: 78 70 72 2d 31 37 2e 31 2e 37 20 7b 20 53 45 4c  xpr-17.1.7 { SEL
9750: 45 43 54 20 27 61 62 63 78 79 7a 27 20 47 4c 4f  ECT 'abcxyz' GLO
9760: 42 20 27 41 42 43 2a 27 20 7d 20 30 0a 0a 23 20  B 'ABC*' } 0..# 
9770: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
9780: 39 36 31 36 2d 32 30 35 35 35 20 42 6f 74 68 20  9616-20555 Both 
9790: 47 4c 4f 42 20 61 6e 64 20 4c 49 4b 45 20 6d 61  GLOB and LIKE ma
97a0: 79 20 62 65 20 70 72 65 63 65 64 65 64 20 62 79  y be preceded by
97b0: 20 74 68 65 0a 23 20 4e 4f 54 20 6b 65 79 77 6f   the.# NOT keywo
97c0: 72 64 20 74 6f 20 69 6e 76 65 72 74 20 74 68 65  rd to invert the
97d0: 20 73 65 6e 73 65 20 6f 66 20 74 68 65 20 74 65   sense of the te
97e0: 73 74 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  st..#.do_execsql
97f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9800: 32 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.1 { SELECT 'ab
9810: 63 78 79 7a 27 20 4e 4f 54 20 47 4c 4f 42 20 27  cxyz' NOT GLOB '
9820: 41 42 43 2a 27 20 7d 20 31 0a 64 6f 5f 65 78 65  ABC*' } 1.do_exe
9830: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
9840: 2d 31 37 2e 32 2e 32 20 7b 20 53 45 4c 45 43 54  -17.2.2 { SELECT
9850: 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 47 4c   'abcxyz' NOT GL
9860: 4f 42 20 27 61 62 63 2a 27 20 7d 20 30 0a 64 6f  OB 'abc*' } 0.do
9870: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9880: 65 78 70 72 2d 31 37 2e 32 2e 33 20 7b 20 53 45  expr-17.2.3 { SE
9890: 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e 4f  LECT 'abcxyz' NO
98a0: 54 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20  T LIKE 'ABC%' } 
98b0: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
98c0: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 34 20  t e_expr-17.2.4 
98d0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
98e0: 27 20 4e 4f 54 20 4c 49 4b 45 20 27 61 62 63 25  ' NOT LIKE 'abc%
98f0: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
9900: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9910: 32 2e 35 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.5 { SELECT 'ab
9920: 64 78 79 7a 27 20 4e 4f 54 20 4c 49 4b 45 20 27  dxyz' NOT LIKE '
9930: 61 62 63 25 27 20 7d 20 31 0a 0a 64 62 20 6e 75  abc%' } 1..db nu
9940: 6c 6c 76 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f  llvalue null.do_
9950: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
9960: 78 70 72 2d 31 37 2e 32 2e 36 20 7b 20 53 45 4c  xpr-17.2.6 { SEL
9970: 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e 4f 54  ECT 'abcxyz' NOT
9980: 20 47 4c 4f 42 20 4e 55 4c 4c 20 7d 20 6e 75 6c   GLOB NULL } nul
9990: 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l.do_execsql_tes
99a0: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 37 20  t e_expr-17.2.7 
99b0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
99c0: 27 20 4e 4f 54 20 4c 49 4b 45 20 4e 55 4c 4c 20  ' NOT LIKE NULL 
99d0: 7d 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71  } null.do_execsq
99e0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37  l_test e_expr-17
99f0: 2e 32 2e 38 20 7b 20 53 45 4c 45 43 54 20 4e 55  .2.8 { SELECT NU
9a00: 4c 4c 20 4e 4f 54 20 47 4c 4f 42 20 27 61 62 63  LL NOT GLOB 'abc
9a10: 2a 27 20 7d 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65  *' } null.do_exe
9a20: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
9a30: 2d 31 37 2e 32 2e 39 20 7b 20 53 45 4c 45 43 54  -17.2.9 { SELECT
9a40: 20 4e 55 4c 4c 20 4e 4f 54 20 4c 49 4b 45 20 27   NULL NOT LIKE '
9a50: 41 42 43 25 27 20 7d 20 6e 75 6c 6c 0a 64 62 20  ABC%' } null.db 
9a60: 6e 75 6c 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23 20  nullvalue {}..# 
9a70: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
9a80: 39 34 31 34 2d 33 35 34 38 39 20 54 68 65 20 69  9414-35489 The i
9a90: 6e 66 69 78 20 47 4c 4f 42 20 6f 70 65 72 61 74  nfix GLOB operat
9aa0: 6f 72 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  or is implemente
9ab0: 64 20 62 79 0a 23 20 63 61 6c 6c 69 6e 67 20 74  d by.# calling t
9ac0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 67 6c 6f 62  he function glob
9ad0: 28 59 2c 58 29 20 61 6e 64 20 63 61 6e 20 62 65  (Y,X) and can be
9ae0: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 6f 76 65   modified by ove
9af0: 72 72 69 64 69 6e 67 20 74 68 61 74 0a 23 20 66  rriding that.# f
9b00: 75 6e 63 74 69 6f 6e 2e 0a 70 72 6f 63 20 67 6c  unction..proc gl
9b10: 6f 62 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b 0a  obfunc {args} {.
9b20: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a    eval lappend :
9b30: 3a 67 6c 6f 62 61 72 67 73 20 24 61 72 67 73 0a  :globargs $args.
9b40: 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a 64 62 20    return 1.}.db 
9b50: 66 75 6e 63 20 67 6c 6f 62 20 2d 61 72 67 63 6f  func glob -argco
9b60: 75 6e 74 20 32 20 67 6c 6f 62 66 75 6e 63 0a 73  unt 2 globfunc.s
9b70: 65 74 20 3a 3a 67 6c 6f 62 61 72 67 73 20 5b 6c  et ::globargs [l
9b80: 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ist].do_execsql_
9b90: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 33  test e_expr-17.3
9ba0: 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .1 { SELECT 'abc
9bb0: 27 20 47 4c 4f 42 20 27 64 65 66 27 20 7d 20 31  ' GLOB 'def' } 1
9bc0: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
9bd0: 20 65 5f 65 78 70 72 2d 31 37 2e 33 2e 32 20 7b   e_expr-17.3.2 {
9be0: 20 73 65 74 20 67 6c 6f 62 61 72 67 73 20 7d 20   set globargs } 
9bf0: 7b 64 65 66 20 61 62 63 7d 0a 73 65 74 20 3a 3a  {def abc}.set ::
9c00: 67 6c 6f 62 61 72 67 73 20 5b 6c 69 73 74 5d 0a  globargs [list].
9c10: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9c20: 65 5f 65 78 70 72 2d 31 37 2e 33 2e 33 20 7b 20  e_expr-17.3.3 { 
9c30: 53 45 4c 45 43 54 20 27 58 27 20 4e 4f 54 20 47  SELECT 'X' NOT G
9c40: 4c 4f 42 20 27 59 27 20 7d 20 30 0a 64 6f 5f 74  LOB 'Y' } 0.do_t
9c50: 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78  est         e_ex
9c60: 70 72 2d 31 37 2e 33 2e 34 20 7b 20 73 65 74 20  pr-17.3.4 { set 
9c70: 67 6c 6f 62 61 72 67 73 20 7d 20 7b 59 20 58 7d  globargs } {Y X}
9c80: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
9c90: 2e 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  .db..# EVIDENCE-
9ca0: 4f 46 3a 20 52 2d 34 31 36 35 30 2d 32 30 38 37  OF: R-41650-2087
9cb0: 32 20 4e 6f 20 72 65 67 65 78 70 28 29 20 75 73  2 No regexp() us
9cc0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64  er function is d
9cd0: 65 66 69 6e 65 64 20 62 79 0a 23 20 64 65 66 61  efined by.# defa
9ce0: 75 6c 74 20 61 6e 64 20 73 6f 20 75 73 65 20 6f  ult and so use o
9cf0: 66 20 74 68 65 20 52 45 47 45 58 50 20 6f 70 65  f the REGEXP ope
9d00: 72 61 74 6f 72 20 77 69 6c 6c 20 6e 6f 72 6d 61  rator will norma
9d10: 6c 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  lly result in an
9d20: 0a 23 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  .# error message
9d30: 2e 0a 23 0a 23 20 20 20 54 68 65 72 65 20 69 73  ..#.#   There is
9d40: 20 61 20 72 65 67 65 78 70 20 66 75 6e 63 74 69   a regexp functi
9d50: 6f 6e 20 69 66 20 49 43 55 20 69 73 20 65 6e 61  on if ICU is ena
9d60: 62 6c 65 64 20 74 68 6f 75 67 68 2e 0a 23 0a 69  bled though..#.i
9d70: 66 63 61 70 61 62 6c 65 20 21 69 63 75 20 7b 0a  fcapable !icu {.
9d80: 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65    do_catchsql_te
9d90: 73 74 20 65 5f 65 78 70 72 2d 31 38 2e 31 2e 31  st e_expr-18.1.1
9da0: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 72   { .    SELECT r
9db0: 65 67 65 78 70 28 27 61 62 63 27 2c 20 27 64 65  egexp('abc', 'de
9dc0: 66 27 29 20 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20  f') .  } {1 {no 
9dd0: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 72  such function: r
9de0: 65 67 65 78 70 7d 7d 0a 20 20 64 6f 5f 63 61 74  egexp}}.  do_cat
9df0: 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  chsql_test e_exp
9e00: 72 2d 31 38 2e 31 2e 32 20 7b 20 0a 20 20 20 20  r-18.1.2 { .    
9e10: 53 45 4c 45 43 54 20 27 61 62 63 27 20 52 45 47  SELECT 'abc' REG
9e20: 45 58 50 20 27 64 65 66 27 0a 20 20 7d 20 7b 31  EXP 'def'.  } {1
9e30: 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69   {no such functi
9e40: 6f 6e 3a 20 52 45 47 45 58 50 7d 7d 0a 7d 0a 0a  on: REGEXP}}.}..
9e50: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
9e60: 2d 33 33 36 39 33 2d 35 30 31 38 30 20 54 68 65  -33693-50180 The
9e70: 20 52 45 47 45 58 50 20 6f 70 65 72 61 74 6f 72   REGEXP operator
9e80: 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 73 79   is a special sy
9e90: 6e 74 61 78 20 66 6f 72 0a 23 20 74 68 65 20 72  ntax for.# the r
9ea0: 65 67 65 78 70 28 29 20 75 73 65 72 20 66 75 6e  egexp() user fun
9eb0: 63 74 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45  ction..#.# EVIDE
9ec0: 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 35 32 34 2d  NCE-OF: R-65524-
9ed0: 36 31 38 34 39 20 49 66 20 61 6e 20 61 70 70 6c  61849 If an appl
9ee0: 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  ication-defined 
9ef0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 23 20 6e  SQL function.# n
9f00: 61 6d 65 64 20 22 72 65 67 65 78 70 22 20 69 73  amed "regexp" is
9f10: 20 61 64 64 65 64 20 61 74 20 72 75 6e 2d 74 69   added at run-ti
9f20: 6d 65 2c 20 74 68 65 6e 20 74 68 65 20 22 58 20  me, then the "X 
9f30: 52 45 47 45 58 50 20 59 22 20 6f 70 65 72 61 74  REGEXP Y" operat
9f40: 6f 72 0a 23 20 77 69 6c 6c 20 62 65 20 69 6d 70  or.# will be imp
9f50: 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 61  lemented as a ca
9f60: 6c 6c 20 74 6f 20 22 72 65 67 65 78 70 28 59 2c  ll to "regexp(Y,
9f70: 58 29 22 2e 0a 23 0a 70 72 6f 63 20 72 65 67 65  X)"..#.proc rege
9f80: 78 70 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b 0a  xpfunc {args} {.
9f90: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a    eval lappend :
9fa0: 3a 72 65 67 65 78 70 61 72 67 73 20 24 61 72 67  :regexpargs $arg
9fb0: 73 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a 64  s.  return 1.}.d
9fc0: 62 20 66 75 6e 63 20 72 65 67 65 78 70 20 2d 61  b func regexp -a
9fd0: 72 67 63 6f 75 6e 74 20 32 20 72 65 67 65 78 70  rgcount 2 regexp
9fe0: 66 75 6e 63 0a 73 65 74 20 3a 3a 72 65 67 65 78  func.set ::regex
9ff0: 70 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f  pargs [list].do_
a000: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
a010: 78 70 72 2d 31 38 2e 32 2e 31 20 7b 20 53 45 4c  xpr-18.2.1 { SEL
a020: 45 43 54 20 27 61 62 63 27 20 52 45 47 45 58 50  ECT 'abc' REGEXP
a030: 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65   'def' } 1.do_te
a040: 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78 70  st         e_exp
a050: 72 2d 31 38 2e 32 2e 32 20 7b 20 73 65 74 20 72  r-18.2.2 { set r
a060: 65 67 65 78 70 61 72 67 73 20 7d 20 7b 64 65 66  egexpargs } {def
a070: 20 61 62 63 7d 0a 73 65 74 20 3a 3a 72 65 67 65   abc}.set ::rege
a080: 78 70 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f  xpargs [list].do
a090: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
a0a0: 65 78 70 72 2d 31 38 2e 32 2e 33 20 7b 20 53 45  expr-18.2.3 { SE
a0b0: 4c 45 43 54 20 27 58 27 20 4e 4f 54 20 52 45 47  LECT 'X' NOT REG
a0c0: 45 58 50 20 27 59 27 20 7d 20 30 0a 64 6f 5f 74  EXP 'Y' } 0.do_t
a0d0: 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78  est         e_ex
a0e0: 70 72 2d 31 38 2e 32 2e 34 20 7b 20 73 65 74 20  pr-18.2.4 { set 
a0f0: 72 65 67 65 78 70 61 72 67 73 20 7d 20 7b 59 20  regexpargs } {Y 
a100: 58 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  X}.sqlite3 db te
a110: 73 74 2e 64 62 0a 0a 23 20 45 56 49 44 45 4e 43  st.db..# EVIDENC
a120: 45 2d 4f 46 3a 20 52 2d 34 32 30 33 37 2d 33 37  E-OF: R-42037-37
a130: 38 32 36 20 54 68 65 20 64 65 66 61 75 6c 74 20  826 The default 
a140: 6d 61 74 63 68 28 29 20 66 75 6e 63 74 69 6f 6e  match() function
a150: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
a160: 23 20 72 61 69 73 65 73 20 61 6e 20 65 78 63 65  # raises an exce
a170: 70 74 69 6f 6e 20 61 6e 64 20 69 73 20 6e 6f 74  ption and is not
a180: 20 72 65 61 6c 6c 79 20 75 73 65 66 75 6c 20 66   really useful f
a190: 6f 72 20 61 6e 79 74 68 69 6e 67 2e 0a 23 0a 64  or anything..#.d
a1a0: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
a1b0: 65 5f 65 78 70 72 2d 31 39 2e 31 2e 31 20 7b 20  e_expr-19.1.1 { 
a1c0: 0a 20 20 53 45 4c 45 43 54 20 27 61 62 63 27 20  .  SELECT 'abc' 
a1d0: 4d 41 54 43 48 20 27 64 65 66 27 20 0a 7d 20 7b  MATCH 'def' .} {
a1e0: 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73 65  1 {unable to use
a1f0: 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20   function MATCH 
a200: 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
a210: 20 63 6f 6e 74 65 78 74 7d 7d 0a 64 6f 5f 63 61   context}}.do_ca
a220: 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  tchsql_test e_ex
a230: 70 72 2d 31 39 2e 31 2e 32 20 7b 20 0a 20 20 53  pr-19.1.2 { .  S
a240: 45 4c 45 43 54 20 6d 61 74 63 68 28 27 61 62 63  ELECT match('abc
a250: 27 2c 20 27 64 65 66 27 29 0a 7d 20 7b 31 20 7b  ', 'def').} {1 {
a260: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75  unable to use fu
a270: 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20  nction MATCH in 
a280: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
a290: 6e 74 65 78 74 7d 7d 0a 0a 23 20 45 56 49 44 45  ntext}}..# EVIDE
a2a0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 39 31 36 2d  NCE-OF: R-37916-
a2b0: 34 37 34 30 37 20 54 68 65 20 4d 41 54 43 48 20  47407 The MATCH 
a2c0: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 73 70  operator is a sp
a2d0: 65 63 69 61 6c 20 73 79 6e 74 61 78 20 66 6f 72  ecial syntax for
a2e0: 0a 23 20 74 68 65 20 6d 61 74 63 68 28 29 20 61  .# the match() a
a2f0: 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
a300: 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 23  ed function..#.#
a310: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
a320: 30 36 30 32 31 2d 30 39 33 37 33 20 42 75 74 20  06021-09373 But 
a330: 65 78 74 65 6e 73 69 6f 6e 73 20 63 61 6e 20 6f  extensions can o
a340: 76 65 72 72 69 64 65 20 74 68 65 20 6d 61 74 63  verride the matc
a350: 68 28 29 0a 23 20 66 75 6e 63 74 69 6f 6e 20 77  h().# function w
a360: 69 74 68 20 6d 6f 72 65 20 68 65 6c 70 66 75 6c  ith more helpful
a370: 20 6c 6f 67 69 63 2e 0a 23 0a 70 72 6f 63 20 6d   logic..#.proc m
a380: 61 74 63 68 66 75 6e 63 20 7b 61 72 67 73 7d 20  atchfunc {args} 
a390: 7b 0a 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64  {.  eval lappend
a3a0: 20 3a 3a 6d 61 74 63 68 61 72 67 73 20 24 61 72   ::matchargs $ar
a3b0: 67 73 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a  gs.  return 1.}.
a3c0: 64 62 20 66 75 6e 63 20 6d 61 74 63 68 20 2d 61  db func match -a
a3d0: 72 67 63 6f 75 6e 74 20 32 20 6d 61 74 63 68 66  rgcount 2 matchf
a3e0: 75 6e 63 0a 73 65 74 20 3a 3a 6d 61 74 63 68 61  unc.set ::matcha
a3f0: 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  rgs [list].do_ex
a400: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
a410: 72 2d 31 39 2e 32 2e 31 20 7b 20 53 45 4c 45 43  r-19.2.1 { SELEC
a420: 54 20 27 61 62 63 27 20 4d 41 54 43 48 20 27 64  T 'abc' MATCH 'd
a430: 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73 74 20  ef' } 1.do_test 
a440: 20 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31          e_expr-1
a450: 39 2e 32 2e 32 20 7b 20 73 65 74 20 6d 61 74 63  9.2.2 { set matc
a460: 68 61 72 67 73 20 7d 20 7b 64 65 66 20 61 62 63  hargs } {def abc
a470: 7d 0a 73 65 74 20 3a 3a 6d 61 74 63 68 61 72 67  }.set ::matcharg
a480: 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63  s [list].do_exec
a490: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
a4a0: 31 39 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54 20  19.2.3 { SELECT 
a4b0: 27 58 27 20 4e 4f 54 20 4d 41 54 43 48 20 27 59  'X' NOT MATCH 'Y
a4c0: 27 20 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20 20  ' } 0.do_test   
a4d0: 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31 39 2e        e_expr-19.
a4e0: 32 2e 34 20 7b 20 73 65 74 20 6d 61 74 63 68 61  2.4 { set matcha
a4f0: 72 67 73 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69  rgs } {Y X}.sqli
a500: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a  te3 db test.db..
a510: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
a520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
a560: 74 20 63 61 73 65 73 20 66 6f 72 20 74 68 65 20  t cases for the 
a570: 74 65 73 74 61 62 6c 65 20 73 74 61 74 65 6d 65  testable stateme
a580: 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  nts related to t
a590: 68 65 20 43 41 53 45 20 65 78 70 72 65 73 73 69  he CASE expressi
a5a0: 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  on..#.# EVIDENCE
a5b0: 2d 4f 46 3a 20 52 2d 31 35 31 39 39 2d 36 31 33  -OF: R-15199-613
a5c0: 38 39 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  89 There are two
a5d0: 20 62 61 73 69 63 20 66 6f 72 6d 73 20 6f 66 20   basic forms of 
a5e0: 74 68 65 20 43 41 53 45 0a 23 20 65 78 70 72 65  the CASE.# expre
a5f0: 73 73 69 6f 6e 3a 20 74 68 6f 73 65 20 77 69 74  ssion: those wit
a600: 68 20 61 20 62 61 73 65 20 65 78 70 72 65 73 73  h a base express
a610: 69 6f 6e 20 61 6e 64 20 74 68 6f 73 65 20 77 69  ion and those wi
a620: 74 68 6f 75 74 2e 0a 23 0a 64 6f 5f 65 78 65 63  thout..#.do_exec
a630: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
a640: 32 30 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  20.1 {.  SELECT 
a650: 43 41 53 45 20 57 48 45 4e 20 31 20 54 48 45 4e  CASE WHEN 1 THEN
a660: 20 27 74 72 75 65 27 20 57 48 45 4e 20 30 20 54   'true' WHEN 0 T
a670: 48 45 4e 20 27 66 61 6c 73 65 27 20 45 4c 53 45  HEN 'false' ELSE
a680: 20 27 65 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b   'else' END;.} {
a690: 74 72 75 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  true}.do_execsql
a6a0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 30 2e  _test e_expr-20.
a6b0: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  2 {.  SELECT CAS
a6c0: 45 20 30 20 57 48 45 4e 20 31 20 54 48 45 4e 20  E 0 WHEN 1 THEN 
a6d0: 27 74 72 75 65 27 20 57 48 45 4e 20 30 20 54 48  'true' WHEN 0 TH
a6e0: 45 4e 20 27 66 61 6c 73 65 27 20 45 4c 53 45 20  EN 'false' ELSE 
a6f0: 27 65 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66  'else' END;.} {f
a700: 61 6c 73 65 7d 0a 0a 70 72 6f 63 20 76 61 72 20  alse}..proc var 
a710: 7b 6e 6d 7d 20 7b 0a 20 20 6c 61 70 70 65 6e 64  {nm} {.  lappend
a720: 20 3a 3a 76 61 72 6c 69 73 74 20 24 6e 6d 0a 20   ::varlist $nm. 
a730: 20 72 65 74 75 72 6e 20 5b 73 65 74 20 22 3a 3a   return [set "::
a740: 24 6e 6d 22 5d 0a 7d 0a 64 62 20 66 75 6e 63 20  $nm"].}.db func 
a750: 76 61 72 20 76 61 72 0a 0a 23 20 45 56 49 44 45  var var..# EVIDE
a760: 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 36 33 38 2d  NCE-OF: R-30638-
a770: 35 39 39 35 34 20 49 6e 20 61 20 43 41 53 45 20  59954 In a CASE 
a780: 77 69 74 68 6f 75 74 20 61 20 62 61 73 65 20 65  without a base e
a790: 78 70 72 65 73 73 69 6f 6e 2c 20 65 61 63 68 0a  xpression, each.
a7a0: 23 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f  # WHEN expressio
a7b0: 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
a7c0: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 74 72  nd the result tr
a7d0: 65 61 74 65 64 20 61 73 20 61 20 62 6f 6f 6c 65  eated as a boole
a7e0: 61 6e 2c 0a 23 20 73 74 61 72 74 69 6e 67 20 77  an,.# starting w
a7f0: 69 74 68 20 74 68 65 20 6c 65 66 74 6d 6f 73 74  ith the leftmost
a800: 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
a810: 74 6f 20 74 68 65 20 72 69 67 68 74 2e 0a 23 0a  to the right..#.
a820: 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20  foreach {a b c} 
a830: 7b 30 20 30 20 30 7d 20 62 72 65 61 6b 0a 73 65  {0 0 0} break.se
a840: 74 20 76 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d  t varlist [list]
a850: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
a860: 20 65 5f 65 78 70 72 2d 32 31 2e 31 2e 31 20 7b   e_expr-21.1.1 {
a870: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57  .  SELECT CASE W
a880: 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45  HEN var('a') THE
a890: 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20  N 'A' .         
a8a0: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62       WHEN var('b
a8b0: 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20  ') THEN 'B' .   
a8c0: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
a8d0: 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43  var('c') THEN 'C
a8e0: 27 20 45 4e 44 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f  ' END.} {{}}.do_
a8f0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 31  test e_expr-21.1
a900: 2e 32 20 7b 20 73 65 74 20 76 61 72 6c 69 73 74  .2 { set varlist
a910: 20 7d 20 7b 61 20 62 20 63 7d 0a 73 65 74 20 76   } {a b c}.set v
a920: 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f  arlist [list].do
a930: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
a940: 65 78 70 72 2d 32 31 2e 31 2e 33 20 7b 0a 20 20  expr-21.1.3 {.  
a950: 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
a960: 20 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27   var('c') THEN '
a970: 43 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  C' .            
a980: 20 20 57 48 45 4e 20 76 61 72 28 27 62 27 29 20    WHEN var('b') 
a990: 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20  THEN 'B' .      
a9a0: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
a9b0: 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a  ('a') THEN 'A' .
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c                EL
a9d0: 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20  SE 'no result'. 
a9e0: 20 45 4e 44 0a 7d 20 7b 7b 6e 6f 20 72 65 73 75   END.} {{no resu
a9f0: 6c 74 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65  lt}}.do_test e_e
aa00: 78 70 72 2d 32 31 2e 31 2e 34 20 7b 20 73 65 74  xpr-21.1.4 { set
aa10: 20 76 61 72 6c 69 73 74 20 7d 20 7b 63 20 62 20   varlist } {c b 
aa20: 61 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  a}..# EVIDENCE-O
aa30: 46 3a 20 52 2d 33 39 30 30 39 2d 32 35 35 39 36  F: R-39009-25596
aa40: 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
aa50: 68 65 20 43 41 53 45 20 65 78 70 72 65 73 73 69  he CASE expressi
aa60: 6f 6e 20 69 73 20 74 68 65 0a 23 20 65 76 61 6c  on is the.# eval
aa70: 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 48  uation of the TH
aa80: 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  EN expression th
aa90: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
aaa0: 6f 20 74 68 65 20 66 69 72 73 74 20 57 48 45 4e  o the first WHEN
aab0: 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  .# expression th
aac0: 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  at evaluates to 
aad0: 74 72 75 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20  true..#.foreach 
aae0: 7b 61 20 62 20 63 7d 20 7b 30 20 31 20 30 7d 20  {a b c} {0 1 0} 
aaf0: 62 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c  break.do_execsql
ab00: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e  _test e_expr-21.
ab10: 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  2.1 {.  SELECT C
ab20: 41 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27  ASE WHEN var('a'
ab30: 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20  ) THEN 'A' .    
ab40: 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76            WHEN v
ab50: 61 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27  ar('b') THEN 'B'
ab60: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
ab70: 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48  WHEN var('c') TH
ab80: 45 4e 20 27 43 27 20 0a 20 20 20 20 20 20 20 20  EN 'C' .        
ab90: 20 20 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72        ELSE 'no r
aba0: 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b  esult'.  END.} {
abb0: 42 7d 0a 66 6f 72 65 61 63 68 20 7b 61 20 62 20  B}.foreach {a b 
abc0: 63 7d 20 7b 30 20 31 20 31 7d 20 62 72 65 61 6b  c} {0 1 1} break
abd0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
abe0: 20 65 5f 65 78 70 72 2d 32 31 2e 32 2e 32 20 7b   e_expr-21.2.2 {
abf0: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57  .  SELECT CASE W
ac00: 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45  HEN var('a') THE
ac10: 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20  N 'A' .         
ac20: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62       WHEN var('b
ac30: 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20  ') THEN 'B' .   
ac40: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
ac50: 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43  var('c') THEN 'C
ac60: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  '.              
ac70: 45 4c 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27  ELSE 'no result'
ac80: 0a 20 20 45 4e 44 0a 7d 20 7b 42 7d 0a 66 6f 72  .  END.} {B}.for
ac90: 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20  each {a b c} {0 
aca0: 30 20 31 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78  0 1} break.do_ex
acb0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
acc0: 72 2d 32 31 2e 32 2e 33 20 7b 0a 20 20 53 45 4c  r-21.2.3 {.  SEL
acd0: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61  ECT CASE WHEN va
ace0: 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20  r('a') THEN 'A' 
acf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
ad00: 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45  HEN var('b') THE
ad10: 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20  N 'B' .         
ad20: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63       WHEN var('c
ad30: 27 29 20 54 48 45 4e 20 27 43 27 0a 20 20 20 20  ') THEN 'C'.    
ad40: 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 27            ELSE '
ad50: 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20 45 4e 44  no result'.  END
ad60: 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56 49 44 45 4e  .} {C}..# EVIDEN
ad70: 43 45 2d 4f 46 3a 20 52 2d 32 34 32 32 37 2d 30  CE-OF: R-24227-0
ad80: 34 38 30 37 20 4f 72 2c 20 69 66 20 6e 6f 6e 65  4807 Or, if none
ad90: 20 6f 66 20 74 68 65 20 57 48 45 4e 20 65 78 70   of the WHEN exp
ada0: 72 65 73 73 69 6f 6e 73 0a 23 20 65 76 61 6c 75  ressions.# evalu
adb0: 61 74 65 20 74 6f 20 74 72 75 65 2c 20 74 68 65  ate to true, the
adc0: 20 72 65 73 75 6c 74 20 6f 66 20 65 76 61 6c 75   result of evalu
add0: 61 74 69 6e 67 20 74 68 65 20 45 4c 53 45 20 65  ating the ELSE e
ade0: 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 0a 23 20  xpression, if.# 
adf0: 61 6e 79 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  any..#.foreach {
ae00: 61 20 62 20 63 7d 20 7b 30 20 30 20 30 7d 20 62  a b c} {0 0 0} b
ae10: 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  reak.do_execsql_
ae20: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 33  test e_expr-21.3
ae30: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .1 {.  SELECT CA
ae40: 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27 29  SE WHEN var('a')
ae50: 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20   THEN 'A' .     
ae60: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
ae70: 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20  r('b') THEN 'B' 
ae80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
ae90: 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45  HEN var('c') THE
aea0: 4e 20 27 43 27 0a 20 20 20 20 20 20 20 20 20 20  N 'C'.          
aeb0: 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72 65 73      ELSE 'no res
aec0: 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 7b 6e  ult'.  END.} {{n
aed0: 6f 20 72 65 73 75 6c 74 7d 7d 0a 0a 23 20 45 56  o result}}..# EV
aee0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 31  IDENCE-OF: R-141
aef0: 36 38 2d 30 37 35 37 39 20 49 66 20 74 68 65 72  68-07579 If ther
af00: 65 20 69 73 20 6e 6f 20 45 4c 53 45 20 65 78 70  e is no ELSE exp
af10: 72 65 73 73 69 6f 6e 20 61 6e 64 20 6e 6f 6e 65  ression and none
af20: 20 6f 66 0a 23 20 74 68 65 20 57 48 45 4e 20 65   of.# the WHEN e
af30: 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
af40: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 76  rue, then the ov
af50: 65 72 61 6c 6c 20 72 65 73 75 6c 74 20 69 73 20  erall result is 
af60: 4e 55 4c 4c 2e 0a 23 0a 64 62 20 6e 75 6c 6c 76  NULL..#.db nullv
af70: 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65  alue null.do_exe
af80: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
af90: 2d 32 31 2e 33 2e 32 20 7b 0a 20 20 53 45 4c 45  -21.3.2 {.  SELE
afa0: 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61 72  CT CASE WHEN var
afb0: 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a  ('a') THEN 'A' .
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
afd0: 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e  EN var('b') THEN
afe0: 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20   'B' .          
aff0: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63 27      WHEN var('c'
b000: 29 20 54 48 45 4e 20 27 43 27 0a 20 20 45 4e 44  ) THEN 'C'.  END
b010: 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 62 20 6e 75 6c  .} {null}.db nul
b020: 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23 20 45 56 49  lvalue {}..# EVI
b030: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 39 34  DENCE-OF: R-1394
b040: 33 2d 31 33 35 39 32 20 41 20 4e 55 4c 4c 20 72  3-13592 A NULL r
b050: 65 73 75 6c 74 20 69 73 20 63 6f 6e 73 69 64 65  esult is conside
b060: 72 65 64 20 75 6e 74 72 75 65 20 77 68 65 6e 0a  red untrue when.
b070: 23 20 65 76 61 6c 75 61 74 69 6e 67 20 57 48 45  # evaluating WHE
b080: 4e 20 74 65 72 6d 73 2e 0a 23 0a 64 6f 5f 65 78  N terms..#.do_ex
b090: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
b0a0: 72 2d 32 31 2e 34 2e 31 20 7b 0a 20 20 53 45 4c  r-21.4.1 {.  SEL
b0b0: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 4e 55  ECT CASE WHEN NU
b0c0: 4c 4c 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e  LL THEN 'A' WHEN
b0d0: 20 31 20 54 48 45 4e 20 27 42 27 20 45 4e 44 0a   1 THEN 'B' END.
b0e0: 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {B}.do_execsql
b0f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e  _test e_expr-21.
b100: 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  4.2 {.  SELECT C
b110: 41 53 45 20 57 48 45 4e 20 30 20 54 48 45 4e 20  ASE WHEN 0 THEN 
b120: 27 41 27 20 57 48 45 4e 20 4e 55 4c 4c 20 54 48  'A' WHEN NULL TH
b130: 45 4e 20 27 42 27 20 45 4c 53 45 20 27 43 27 20  EN 'B' ELSE 'C' 
b140: 45 4e 44 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56 49  END.} {C}..# EVI
b150: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 38 36 32  DENCE-OF: R-3862
b160: 30 2d 31 39 34 39 39 20 49 6e 20 61 20 43 41 53  0-19499 In a CAS
b170: 45 20 77 69 74 68 20 61 20 62 61 73 65 20 65 78  E with a base ex
b180: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 62 61  pression, the ba
b190: 73 65 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20  se.# expression 
b1a0: 69 73 20 65 76 61 6c 75 61 74 65 64 20 6a 75 73  is evaluated jus
b1b0: 74 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  t once and the r
b1c0: 65 73 75 6c 74 20 69 73 20 63 6f 6d 70 61 72 65  esult is compare
b1d0: 64 20 61 67 61 69 6e 73 74 0a 23 20 74 68 65 20  d against.# the 
b1e0: 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 65 61  evaluation of ea
b1f0: 63 68 20 57 48 45 4e 20 65 78 70 72 65 73 73 69  ch WHEN expressi
b200: 6f 6e 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  on from left to 
b210: 72 69 67 68 74 2e 0a 23 0a 23 20 4e 6f 74 65 3a  right..#.# Note:
b220: 20 54 68 69 73 20 74 65 73 74 20 63 61 73 65 20   This test case 
b230: 74 65 73 74 73 20 74 68 65 20 22 65 76 61 6c 75  tests the "evalu
b240: 61 74 65 64 20 6a 75 73 74 20 6f 6e 63 65 22 20  ated just once" 
b250: 70 61 72 74 20 6f 66 20 74 68 65 20 61 62 6f 76  part of the abov
b260: 65 0a 23 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  e.# statement. T
b270: 65 73 74 73 20 61 73 73 6f 63 69 61 74 65 64 20  ests associated 
b280: 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 74 77  with the next tw
b290: 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 74 65 73  o statements tes
b2a0: 74 20 74 68 61 74 20 74 68 65 0a 23 20 63 6f 6d  t that the.# com
b2b0: 70 61 72 69 73 6f 6e 73 20 74 61 6b 65 20 70 6c  parisons take pl
b2c0: 61 63 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  ace..#.foreach {
b2d0: 61 20 62 20 63 7d 20 5b 6c 69 73 74 20 5b 65 78  a b c} [list [ex
b2e0: 70 72 20 33 5d 20 5b 65 78 70 72 20 34 5d 20 5b  pr 3] [expr 4] [
b2f0: 65 78 70 72 20 35 5d 5d 20 62 72 65 61 6b 0a 73  expr 5]] break.s
b300: 65 74 20 3a 3a 76 61 72 6c 69 73 74 20 5b 6c 69  et ::varlist [li
b310: 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  st].do_execsql_t
b320: 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 31 2e  est e_expr-22.1.
b330: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  1 {.  SELECT CAS
b340: 45 20 76 61 72 28 27 61 27 29 20 57 48 45 4e 20  E var('a') WHEN 
b350: 31 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20  1 THEN 'A' WHEN 
b360: 32 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20  2 THEN 'B' WHEN 
b370: 33 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d  3 THEN 'C' END.}
b380: 20 7b 43 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65   {C}.do_test e_e
b390: 78 70 72 2d 32 32 2e 31 2e 32 20 7b 20 73 65 74  xpr-22.1.2 { set
b3a0: 20 3a 3a 76 61 72 6c 69 73 74 20 7d 20 7b 61 7d   ::varlist } {a}
b3b0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
b3c0: 20 52 2d 30 37 36 36 37 2d 34 39 35 33 37 20 54   R-07667-49537 T
b3d0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
b3e0: 20 43 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e   CASE expression
b3f0: 20 69 73 20 74 68 65 0a 23 20 65 76 61 6c 75 61   is the.# evalua
b400: 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 48 45 4e  tion of the THEN
b410: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
b420: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
b430: 74 68 65 20 66 69 72 73 74 20 57 48 45 4e 0a 23  the first WHEN.#
b440: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   expression for 
b450: 77 68 69 63 68 20 74 68 65 20 63 6f 6d 70 61 72  which the compar
b460: 69 73 6f 6e 20 69 73 20 74 72 75 65 2e 0a 23 0a  ison is true..#.
b470: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
b480: 65 5f 65 78 70 72 2d 32 32 2e 32 2e 31 20 7b 0a  e_expr-22.2.1 {.
b490: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 32 33    SELECT CASE 23
b4a0: 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27   WHEN 1 THEN 'A'
b4b0: 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42   WHEN 23 THEN 'B
b4c0: 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27  ' WHEN 23 THEN '
b4d0: 43 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f  C' END.} {B}.do_
b4e0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
b4f0: 78 70 72 2d 32 32 2e 32 2e 32 20 7b 0a 20 20 53  xpr-22.2.2 {.  S
b500: 45 4c 45 43 54 20 43 41 53 45 20 31 20 57 48 45  ELECT CASE 1 WHE
b510: 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57 48 45  N 1 THEN 'A' WHE
b520: 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20 57 48  N 23 THEN 'B' WH
b530: 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27 20 45  EN 23 THEN 'C' E
b540: 4e 44 0a 7d 20 7b 41 7d 0a 0a 23 20 45 56 49 44  ND.} {A}..# EVID
b550: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 35 34 33  ENCE-OF: R-47543
b560: 2d 33 32 31 34 35 20 4f 72 2c 20 69 66 20 6e 6f  -32145 Or, if no
b570: 6e 65 20 6f 66 20 74 68 65 20 57 48 45 4e 20 65  ne of the WHEN e
b580: 78 70 72 65 73 73 69 6f 6e 73 0a 23 20 65 76 61  xpressions.# eva
b590: 6c 75 61 74 65 20 74 6f 20 61 20 76 61 6c 75 65  luate to a value
b5a0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 62 61   equal to the ba
b5b0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  se expression, t
b5c0: 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 23 20 65  he result of.# e
b5d0: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 45 4c  valuating the EL
b5e0: 53 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69  SE expression, i
b5f0: 66 20 61 6e 79 2e 0a 23 0a 64 6f 5f 65 78 65 63  f any..#.do_exec
b600: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
b610: 32 32 2e 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43  22.3.1 {.  SELEC
b620: 54 20 43 41 53 45 20 32 34 20 57 48 45 4e 20 31  T CASE 24 WHEN 1
b630: 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32   THEN 'A' WHEN 2
b640: 33 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20  3 THEN 'B' WHEN 
b650: 32 33 20 54 48 45 4e 20 27 43 27 20 45 4c 53 45  23 THEN 'C' ELSE
b660: 20 27 44 27 20 45 4e 44 0a 7d 20 7b 44 7d 0a 0a   'D' END.} {D}..
b670: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
b680: 2d 35 34 37 32 31 2d 34 38 35 35 37 20 49 66 20  -54721-48557 If 
b690: 74 68 65 72 65 20 69 73 20 6e 6f 20 45 4c 53 45  there is no ELSE
b6a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
b6b0: 6e 6f 6e 65 20 6f 66 0a 23 20 74 68 65 20 57 48  none of.# the WH
b6c0: 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 70  EN expressions p
b6d0: 72 6f 64 75 63 65 20 61 20 72 65 73 75 6c 74 20  roduce a result 
b6e0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 62 61 73  equal to the bas
b6f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 0a 23 20  e expression,.# 
b700: 74 68 65 20 6f 76 65 72 61 6c 6c 20 72 65 73 75  the overall resu
b710: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 23 0a 64 6f  lt is NULL..#.do
b720: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
b730: 65 78 70 72 2d 32 32 2e 34 2e 31 20 7b 0a 20 20  expr-22.4.1 {.  
b740: 53 45 4c 45 43 54 20 43 41 53 45 20 32 34 20 57  SELECT CASE 24 W
b750: 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57  HEN 1 THEN 'A' W
b760: 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20  HEN 23 THEN 'B' 
b770: 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27  WHEN 23 THEN 'C'
b780: 20 45 4e 44 0a 7d 20 7b 7b 7d 7d 0a 64 62 20 6e   END.} {{}}.db n
b790: 75 6c 6c 76 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f  ullvalue null.do
b7a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
b7b0: 65 78 70 72 2d 32 32 2e 34 2e 32 20 7b 0a 20 20  expr-22.4.2 {.  
b7c0: 53 45 4c 45 43 54 20 43 41 53 45 20 32 34 20 57  SELECT CASE 24 W
b7d0: 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57  HEN 1 THEN 'A' W
b7e0: 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20  HEN 23 THEN 'B' 
b7f0: 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27  WHEN 23 THEN 'C'
b800: 20 45 4e 44 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 62   END.} {null}.db
b810: 20 6e 75 6c 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23   nullvalue {}..#
b820: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
b830: 31 31 34 37 39 2d 36 32 37 37 34 20 57 68 65 6e  11479-62774 When
b840: 20 63 6f 6d 70 61 72 69 6e 67 20 61 20 62 61 73   comparing a bas
b850: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61  e expression aga
b860: 69 6e 73 74 20 61 0a 23 20 57 48 45 4e 20 65 78  inst a.# WHEN ex
b870: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 73 61  pression, the sa
b880: 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
b890: 75 65 6e 63 65 2c 20 61 66 66 69 6e 69 74 79 2c  uence, affinity,
b8a0: 20 61 6e 64 0a 23 20 4e 55 4c 4c 2d 68 61 6e 64   and.# NULL-hand
b8b0: 6c 69 6e 67 20 72 75 6c 65 73 20 61 70 70 6c 79  ling rules apply
b8c0: 20 61 73 20 69 66 20 74 68 65 20 62 61 73 65 20   as if the base 
b8d0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 57  expression and W
b8e0: 48 45 4e 0a 23 20 65 78 70 72 65 73 73 69 6f 6e  HEN.# expression
b8f0: 20 61 72 65 20 72 65 73 70 65 63 74 69 76 65 6c   are respectivel
b900: 79 20 74 68 65 20 6c 65 66 74 2d 20 61 6e 64 20  y the left- and 
b910: 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61  right-hand opera
b920: 6e 64 73 20 6f 66 20 61 6e 20 3d 0a 23 20 6f 70  nds of an =.# op
b930: 65 72 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 72  erator..#.proc r
b940: 65 76 20 7b 73 74 72 7d 20 7b 0a 20 20 73 65 74  ev {str} {.  set
b950: 20 72 65 74 20 22 22 0a 20 20 73 65 74 20 63 68   ret "".  set ch
b960: 61 72 73 20 5b 73 70 6c 69 74 20 24 73 74 72 5d  ars [split $str]
b970: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 5b 65  .  for {set i [e
b980: 78 70 72 20 5b 6c 6c 65 6e 67 74 68 20 24 63 68  xpr [llength $ch
b990: 61 72 73 5d 2d 31 5d 7d 20 7b 24 69 3e 3d 30 7d  ars]-1]} {$i>=0}
b9a0: 20 7b 69 6e 63 72 20 69 20 2d 31 7d 20 7b 0a 20   {incr i -1} {. 
b9b0: 20 20 20 61 70 70 65 6e 64 20 72 65 74 20 5b 6c     append ret [l
b9c0: 69 6e 64 65 78 20 24 63 68 61 72 73 20 24 69 5d  index $chars $i]
b9d0: 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d  .  }.  set ret.}
b9e0: 0a 70 72 6f 63 20 72 65 76 65 72 73 65 20 7b 6c  .proc reverse {l
b9f0: 68 73 20 72 68 73 7d 20 7b 0a 20 20 73 74 72 69  hs rhs} {.  stri
ba00: 6e 67 20 63 6f 6d 70 61 72 65 20 5b 72 65 76 20  ng compare [rev 
ba10: 24 6c 68 73 5d 20 5b 72 65 76 20 24 72 68 73 5d  $lhs] [rev $rhs]
ba20: 0a 7d 0a 64 62 20 63 6f 6c 6c 61 74 65 20 72 65  .}.db collate re
ba30: 76 65 72 73 65 20 72 65 76 65 72 73 65 0a 64 6f  verse reverse.do
ba40: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
ba50: 65 78 70 72 2d 32 33 2e 31 2e 31 20 7b 0a 20 20  expr-23.1.1 {.  
ba60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
ba70: 0a 20 20 20 20 61 20 54 45 58 54 20 20 20 20 20  .    a TEXT     
ba80: 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c 0a  COLLATE NOCASE,.
ba90: 20 20 20 20 62 20 20 20 20 20 20 20 20 20 20 43      b          C
baa0: 4f 4c 4c 41 54 45 20 52 45 56 45 52 53 45 2c 0a  OLLATE REVERSE,.
bab0: 20 20 20 20 63 20 49 4e 54 45 47 45 52 2c 0a 20      c INTEGER,. 
bac0: 20 20 20 64 20 42 4c 4f 42 0a 20 20 29 3b 0a 20     d BLOB.  );. 
bad0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
bae0: 56 41 4c 55 45 53 28 27 61 62 63 27 2c 20 27 63  VALUES('abc', 'c
baf0: 62 61 27 2c 20 35 35 2c 20 33 34 2e 35 29 3b 0a  ba', 55, 34.5);.
bb00: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
bb10: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31  test e_expr-23.1
bb20: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .2 {.  SELECT CA
bb30: 53 45 20 61 20 57 48 45 4e 20 27 78 79 7a 27 20  SE a WHEN 'xyz' 
bb40: 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 27 41  THEN 'A' WHEN 'A
bb50: 62 43 27 20 54 48 45 4e 20 27 42 27 20 45 4e 44  bC' THEN 'B' END
bb60: 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64   FROM t1.} {B}.d
bb70: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
bb80: 5f 65 78 70 72 2d 32 33 2e 31 2e 33 20 7b 0a 20  _expr-23.1.3 {. 
bb90: 20 53 45 4c 45 43 54 20 43 41 53 45 20 27 41 62   SELECT CASE 'Ab
bba0: 43 27 20 57 48 45 4e 20 27 61 62 63 27 20 54 48  C' WHEN 'abc' TH
bbb0: 45 4e 20 27 41 27 20 57 48 45 4e 20 61 20 54 48  EN 'A' WHEN a TH
bbc0: 45 4e 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20  EN 'B' END FROM 
bbd0: 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63  t1.} {B}.do_exec
bbe0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
bbf0: 32 33 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43  23.1.4 {.  SELEC
bc00: 54 20 43 41 53 45 20 61 20 57 48 45 4e 20 62 20  T CASE a WHEN b 
bc10: 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42  THEN 'A' ELSE 'B
bc20: 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20  ' END FROM t1.} 
bc30: 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {B}.do_execsql_t
bc40: 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e  est e_expr-23.1.
bc50: 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  5 {.  SELECT CAS
bc60: 45 20 62 20 57 48 45 4e 20 61 20 54 48 45 4e 20  E b WHEN a THEN 
bc70: 27 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44  'A' ELSE 'B' END
bc80: 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64   FROM t1.} {B}.d
bc90: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
bca0: 5f 65 78 70 72 2d 32 33 2e 31 2e 36 20 7b 0a 20  _expr-23.1.6 {. 
bcb0: 20 53 45 4c 45 43 54 20 43 41 53 45 20 35 35 20   SELECT CASE 55 
bcc0: 57 48 45 4e 20 27 35 35 27 20 54 48 45 4e 20 27  WHEN '55' THEN '
bcd0: 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 0a  A' ELSE 'B' END.
bce0: 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {B}.do_execsql
bcf0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e  _test e_expr-23.
bd00: 31 2e 37 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.7 {.  SELECT C
bd10: 41 53 45 20 63 20 57 48 45 4e 20 27 35 35 27 20  ASE c WHEN '55' 
bd20: 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42  THEN 'A' ELSE 'B
bd30: 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20  ' END FROM t1.} 
bd40: 7b 41 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {A}.do_execsql_t
bd50: 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e  est e_expr-23.1.
bd60: 38 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  8 {.  SELECT CAS
bd70: 45 20 27 33 34 2e 35 27 20 57 48 45 4e 20 64 20  E '34.5' WHEN d 
bd80: 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42  THEN 'A' ELSE 'B
bd90: 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20  ' END FROM t1.} 
bda0: 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {B}.do_execsql_t
bdb0: 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e  est e_expr-23.1.
bdc0: 39 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  9 {.  SELECT CAS
bdd0: 45 20 4e 55 4c 4c 20 57 48 45 4e 20 4e 55 4c 4c  E NULL WHEN NULL
bde0: 20 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27   THEN 'A' ELSE '
bdf0: 42 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 0a 23 20  B' END.} {B}..# 
be00: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
be10: 37 33 30 34 2d 33 39 34 30 35 20 49 66 20 74 68  7304-39405 If th
be20: 65 20 62 61 73 65 20 65 78 70 72 65 73 73 69 6f  e base expressio
be30: 6e 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74  n is NULL then t
be40: 68 65 0a 23 20 72 65 73 75 6c 74 20 6f 66 20 74  he.# result of t
be50: 68 65 20 43 41 53 45 20 69 73 20 61 6c 77 61 79  he CASE is alway
be60: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
be70: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 45  evaluating the E
be80: 4c 53 45 0a 23 20 65 78 70 72 65 73 73 69 6f 6e  LSE.# expression
be90: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 6f   if it exists, o
bea0: 72 20 4e 55 4c 4c 20 69 66 20 69 74 20 64 6f 65  r NULL if it doe
beb0: 73 20 6e 6f 74 2e 0a 23 0a 64 6f 5f 65 78 65 63  s not..#.do_exec
bec0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
bed0: 32 34 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43  24.1.1 {.  SELEC
bee0: 54 20 43 41 53 45 20 4e 55 4c 4c 20 57 48 45 4e  T CASE NULL WHEN
bef0: 20 27 61 62 63 27 20 54 48 45 4e 20 27 41 27 20   'abc' THEN 'A' 
bf00: 57 48 45 4e 20 27 64 65 66 27 20 54 48 45 4e 20  WHEN 'def' THEN 
bf10: 27 42 27 20 45 4e 44 3b 0a 7d 20 7b 7b 7d 7d 0a  'B' END;.} {{}}.
bf20: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
bf30: 65 5f 65 78 70 72 2d 32 34 2e 31 2e 32 20 7b 0a  e_expr-24.1.2 {.
bf40: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 4e 55    SELECT CASE NU
bf50: 4c 4c 20 57 48 45 4e 20 27 61 62 63 27 20 54 48  LL WHEN 'abc' TH
bf60: 45 4e 20 27 41 27 20 57 48 45 4e 20 27 64 65 66  EN 'A' WHEN 'def
bf70: 27 20 54 48 45 4e 20 27 42 27 20 45 4c 53 45 20  ' THEN 'B' ELSE 
bf80: 27 43 27 20 45 4e 44 3b 0a 7d 20 7b 43 7d 0a 0a  'C' END;.} {C}..
bf90: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
bfa0: 2d 35 36 32 38 30 2d 31 37 33 36 39 20 42 6f 74  -56280-17369 Bot
bfb0: 68 20 66 6f 72 6d 73 20 6f 66 20 74 68 65 20 43  h forms of the C
bfc0: 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20 75  ASE expression u
bfd0: 73 65 20 6c 61 7a 79 2c 0a 23 20 6f 72 20 73 68  se lazy,.# or sh
bfe0: 6f 72 74 2d 63 69 72 63 75 69 74 2c 20 65 76 61  ort-circuit, eva
bff0: 6c 75 61 74 69 6f 6e 2e 0a 23 0a 73 65 74 20 76  luation..#.set v
c000: 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 66 6f  arlist [list].fo
c010: 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30  reach {a b c} {0
c020: 20 31 20 30 7d 20 62 72 65 61 6b 0a 64 6f 5f 65   1 0} break.do_e
c030: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
c040: 70 72 2d 32 35 2e 31 2e 31 20 7b 0a 20 20 53 45  pr-25.1.1 {.  SE
c050: 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76  LECT CASE WHEN v
c060: 61 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27  ar('a') THEN 'A'
c070: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
c080: 57 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48  WHEN var('b') TH
c090: 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20  EN 'B' .        
c0a0: 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27        WHEN var('
c0b0: 63 27 29 20 54 48 45 4e 20 27 43 27 20 0a 20 20  c') THEN 'C' .  
c0c0: 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f 74 65 73  END.} {B}.do_tes
c0d0: 74 20 65 5f 65 78 70 72 2d 32 35 2e 31 2e 32 20  t e_expr-25.1.2 
c0e0: 7b 20 73 65 74 20 3a 3a 76 61 72 6c 69 73 74 20  { set ::varlist 
c0f0: 7d 20 7b 61 20 62 7d 0a 73 65 74 20 76 61 72 6c  } {a b}.set varl
c100: 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  ist [list].do_ex
c110: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
c120: 72 2d 32 35 2e 31 2e 33 20 7b 0a 20 20 53 45 4c  r-25.1.3 {.  SEL
c130: 45 43 54 20 43 41 53 45 20 27 30 27 20 57 48 45  ECT CASE '0' WHE
c140: 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20  N var('a') THEN 
c150: 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'A' .           
c160: 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28         WHEN var(
c170: 27 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20  'b') THEN 'B' . 
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54   WHEN var('c') T
c1a0: 48 45 4e 20 27 43 27 20 0a 20 20 45 4e 44 0a 7d  HEN 'C' .  END.}
c1b0: 20 7b 41 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65   {A}.do_test e_e
c1c0: 78 70 72 2d 32 35 2e 31 2e 34 20 7b 20 73 65 74  xpr-25.1.4 { set
c1d0: 20 3a 3a 76 61 72 6c 69 73 74 20 7d 20 7b 61 7d   ::varlist } {a}
c1e0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
c1f0: 20 52 2d 33 34 37 37 33 2d 36 32 32 35 33 20 54   R-34773-62253 T
c200: 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e  he only differen
c210: 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 66  ce between the f
c220: 6f 6c 6c 6f 77 69 6e 67 0a 23 20 74 77 6f 20 43  ollowing.# two C
c230: 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ASE expressions 
c240: 69 73 20 74 68 61 74 20 74 68 65 20 78 20 65 78  is that the x ex
c250: 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
c260: 75 61 74 65 64 20 65 78 61 63 74 6c 79 0a 23 20  uated exactly.# 
c270: 6f 6e 63 65 20 69 6e 20 74 68 65 20 66 69 72 73  once in the firs
c280: 74 20 65 78 61 6d 70 6c 65 20 62 75 74 20 6d 69  t example but mi
c290: 67 68 74 20 62 65 20 65 76 61 6c 75 61 74 65 64  ght be evaluated
c2a0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
c2b0: 69 6e 20 74 68 65 0a 23 20 73 65 63 6f 6e 64 3a  in the.# second:
c2c0: 20 43 41 53 45 20 78 20 57 48 45 4e 20 77 31 20   CASE x WHEN w1 
c2d0: 54 48 45 4e 20 72 31 20 57 48 45 4e 20 77 32 20  THEN r1 WHEN w2 
c2e0: 54 48 45 4e 20 72 32 20 45 4c 53 45 20 72 33 20  THEN r2 ELSE r3 
c2f0: 45 4e 44 20 43 41 53 45 20 57 48 45 4e 0a 23 20  END CASE WHEN.# 
c300: 78 3d 77 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=w1 THEN r1 WHE
c310: 4e 20 78 3d 77 32 20 54 48 45 4e 20 72 32 20 45  N x=w2 THEN r2 E
c320: 4c 53 45 20 72 33 20 45 4e 44 0a 23 0a 70 72 6f  LSE r3 END.#.pro
c330: 63 20 63 65 76 61 6c 20 7b 78 7d 20 7b 0a 20 20  c ceval {x} {.  
c340: 69 6e 63 72 20 3a 3a 65 76 61 6c 63 6f 75 6e 74  incr ::evalcount
c350: 0a 20 20 72 65 74 75 72 6e 20 24 78 0a 7d 0a 64  .  return $x.}.d
c360: 62 20 66 75 6e 63 20 63 65 76 61 6c 20 63 65 76  b func ceval cev
c370: 61 6c 0a 73 65 74 20 3a 3a 65 76 61 6c 63 6f 75  al.set ::evalcou
c380: 6e 74 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  nt 0..do_execsql
c390: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e  _test e_expr-26.
c3a0: 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1.1 {.  CREATE T
c3b0: 41 42 4c 45 20 74 32 28 78 2c 20 77 31 2c 20 72  ABLE t2(x, w1, r
c3c0: 31 2c 20 77 32 2c 20 72 32 2c 20 72 33 29 3b 0a  1, w2, r2, r3);.
c3d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
c3e0: 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 27 52   VALUES(1, 1, 'R
c3f0: 31 27 2c 20 32 2c 20 27 52 32 27 2c 20 27 52 33  1', 2, 'R2', 'R3
c400: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
c410: 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20 31  O t2 VALUES(2, 1
c420: 2c 20 27 52 31 27 2c 20 32 2c 20 27 52 32 27 2c  , 'R1', 2, 'R2',
c430: 20 27 52 33 27 29 3b 0a 20 20 49 4e 53 45 52 54   'R3');.  INSERT
c440: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
c450: 33 2c 20 31 2c 20 27 52 31 27 2c 20 32 2c 20 27  3, 1, 'R1', 2, '
c460: 52 32 27 2c 20 27 52 33 27 29 3b 0a 7d 20 7b 7d  R2', 'R3');.} {}
c470: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
c480: 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 32 20 7b   e_expr-26.1.2 {
c490: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 78  .  SELECT CASE x
c4a0: 20 57 48 45 4e 20 77 31 20 54 48 45 4e 20 72 31   WHEN w1 THEN r1
c4b0: 20 57 48 45 4e 20 77 32 20 54 48 45 4e 20 72 32   WHEN w2 THEN r2
c4c0: 20 45 4c 53 45 20 72 33 20 45 4e 44 20 46 52 4f   ELSE r3 END FRO
c4d0: 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32 20 52 33  M t2.} {R1 R2 R3
c4e0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
c4f0: 74 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 33 20  t e_expr-26.1.3 
c500: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
c510: 57 48 45 4e 20 78 3d 77 31 20 54 48 45 4e 20 72  WHEN x=w1 THEN r
c520: 31 20 57 48 45 4e 20 78 3d 77 32 20 54 48 45 4e  1 WHEN x=w2 THEN
c530: 20 72 32 20 45 4c 53 45 20 72 33 20 45 4e 44 20   r2 ELSE r3 END 
c540: 46 52 4f 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32  FROM t2.} {R1 R2
c550: 20 52 33 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   R3}..do_execsql
c560: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e  _test e_expr-26.
c570: 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.4 {.  SELECT C
c580: 41 53 45 20 63 65 76 61 6c 28 78 29 20 57 48 45  ASE ceval(x) WHE
c590: 4e 20 77 31 20 54 48 45 4e 20 72 31 20 57 48 45  N w1 THEN r1 WHE
c5a0: 4e 20 77 32 20 54 48 45 4e 20 72 32 20 45 4c 53  N w2 THEN r2 ELS
c5b0: 45 20 72 33 20 45 4e 44 20 46 52 4f 4d 20 74 32  E r3 END FROM t2
c5c0: 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d 0a 64 6f  .} {R1 R2 R3}.do
c5d0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e  _test e_expr-26.
c5e0: 31 2e 35 20 7b 20 73 65 74 20 3a 3a 65 76 61 6c  1.5 { set ::eval
c5f0: 63 6f 75 6e 74 20 7d 20 7b 33 7d 0a 73 65 74 20  count } {3}.set 
c600: 3a 3a 65 76 61 6c 63 6f 75 6e 74 20 30 0a 64 6f  ::evalcount 0.do
c610: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
c620: 65 78 70 72 2d 32 36 2e 31 2e 36 20 7b 0a 20 20  expr-26.1.6 {.  
c630: 53 45 4c 45 43 54 20 43 41 53 45 20 0a 20 20 20  SELECT CASE .   
c640: 20 57 48 45 4e 20 63 65 76 61 6c 28 78 29 3d 77   WHEN ceval(x)=w
c650: 31 20 54 48 45 4e 20 72 31 20 0a 20 20 20 20 57  1 THEN r1 .    W
c660: 48 45 4e 20 63 65 76 61 6c 28 78 29 3d 77 32 20  HEN ceval(x)=w2 
c670: 54 48 45 4e 20 72 32 20 0a 20 20 20 20 45 4c 53  THEN r2 .    ELS
c680: 45 20 72 33 20 45 4e 44 20 0a 20 20 46 52 4f 4d  E r3 END .  FROM
c690: 20 74 32 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d   t2.} {R1 R2 R3}
c6a0: 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  .do_test e_expr-
c6b0: 32 36 2e 31 2e 36 20 7b 20 73 65 74 20 3a 3a 65  26.1.6 { set ::e
c6c0: 76 61 6c 63 6f 75 6e 74 20 7d 20 7b 35 7d 0a 0a  valcount } {5}..
c6d0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
c6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
c720: 73 74 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65  st statements re
c730: 6c 61 74 65 64 20 74 6f 20 43 41 53 54 20 65 78  lated to CAST ex
c740: 70 72 65 73 73 69 6f 6e 73 2e 0a 23 0a 23 20 45  pressions..#.# E
c750: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30  VIDENCE-OF: R-20
c760: 38 35 34 2d 31 37 31 30 39 20 41 20 43 41 53 54  854-17109 A CAST
c770: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 73   conversion is s
c780: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 23 20  imilar to the.# 
c790: 63 6f 6e 76 65 72 73 69 6f 6e 20 74 68 61 74 20  conversion that 
c7a0: 74 61 6b 65 73 20 70 6c 61 63 65 20 77 68 65 6e  takes place when
c7b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69   a column affini
c7c0: 74 79 20 69 73 20 61 70 70 6c 69 65 64 20 74 6f  ty is applied to
c7d0: 20 61 0a 23 20 76 61 6c 75 65 20 65 78 63 65 70   a.# value excep
c7e0: 74 20 74 68 61 74 20 77 69 74 68 20 74 68 65 20  t that with the 
c7f0: 43 41 53 54 20 6f 70 65 72 61 74 6f 72 20 74 68  CAST operator th
c800: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 61 6c 77  e conversion alw
c810: 61 79 73 20 74 61 6b 65 73 0a 23 20 70 6c 61 63  ays takes.# plac
c820: 65 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 6f  e even if the co
c830: 6e 76 65 72 73 69 6f 6e 20 6c 6f 73 73 79 20 61  nversion lossy a
c840: 6e 64 20 69 72 72 65 76 65 72 73 69 62 6c 65 2c  nd irreversible,
c850: 20 77 68 65 72 65 61 73 20 63 6f 6c 75 6d 6e 0a   whereas column.
c860: 23 20 61 66 66 69 6e 69 74 79 20 6f 6e 6c 79 20  # affinity only 
c870: 63 68 61 6e 67 65 73 20 74 68 65 20 64 61 74 61  changes the data
c880: 20 74 79 70 65 20 6f 66 20 61 20 76 61 6c 75 65   type of a value
c890: 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69   if the change i
c8a0: 73 0a 23 20 6c 6f 73 73 6c 65 73 73 20 61 6e 64  s.# lossless and
c8b0: 20 72 65 76 65 72 73 69 62 6c 65 2e 0a 23 0a 64   reversible..#.d
c8c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
c8d0: 5f 65 78 70 72 2d 32 37 2e 31 2e 31 20 7b 0a 20  _expr-27.1.1 {. 
c8e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33   CREATE TABLE t3
c8f0: 28 61 20 54 45 58 54 2c 20 62 20 52 45 41 4c 2c  (a TEXT, b REAL,
c900: 20 63 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 49   c INTEGER);.  I
c910: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
c920: 4c 55 45 53 28 58 27 35 35 35 36 35 35 27 2c 20  LUES(X'555655', 
c930: 27 31 2e 32 33 61 62 63 27 2c 20 34 2e 35 29 3b  '1.23abc', 4.5);
c940: 0a 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66  .  SELECT typeof
c950: 28 61 29 2c 20 61 2c 20 74 79 70 65 6f 66 28 62  (a), a, typeof(b
c960: 29 2c 20 62 2c 20 74 79 70 65 6f 66 28 63 29 2c  ), b, typeof(c),
c970: 20 63 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 62   c FROM t3;.} {b
c980: 6c 6f 62 20 55 56 55 20 74 65 78 74 20 31 2e 32  lob UVU text 1.2
c990: 33 61 62 63 20 72 65 61 6c 20 34 2e 35 7d 0a 64  3abc real 4.5}.d
c9a0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
c9b0: 5f 65 78 70 72 2d 32 37 2e 31 2e 32 20 7b 0a 20  _expr-27.1.2 {. 
c9c0: 20 53 45 4c 45 43 54 20 0a 20 20 20 20 74 79 70   SELECT .    typ
c9d0: 65 6f 66 28 43 41 53 54 28 58 27 35 35 35 36 35  eof(CAST(X'55565
c9e0: 35 27 20 61 73 20 54 45 58 54 29 29 2c 20 43 41  5' as TEXT)), CA
c9f0: 53 54 28 58 27 35 35 35 36 35 35 27 20 61 73 20  ST(X'555655' as 
ca00: 54 45 58 54 29 2c 0a 20 20 20 20 74 79 70 65 6f  TEXT),.    typeo
ca10: 66 28 43 41 53 54 28 27 31 2e 32 33 61 62 63 27  f(CAST('1.23abc'
ca20: 20 61 73 20 52 45 41 4c 29 29 2c 20 43 41 53 54   as REAL)), CAST
ca30: 28 27 31 2e 32 33 61 62 63 27 20 61 73 20 52 45  ('1.23abc' as RE
ca40: 41 4c 29 2c 0a 20 20 20 20 74 79 70 65 6f 66 28  AL),.    typeof(
ca50: 43 41 53 54 28 34 2e 35 20 61 73 20 49 4e 54 45  CAST(4.5 as INTE
ca60: 47 45 52 29 29 2c 20 43 41 53 54 28 34 2e 35 20  GER)), CAST(4.5 
ca70: 61 73 20 49 4e 54 45 47 45 52 29 0a 7d 20 7b 74  as INTEGER).} {t
ca80: 65 78 74 20 55 56 55 20 72 65 61 6c 20 31 2e 32  ext UVU real 1.2
ca90: 33 20 69 6e 74 65 67 65 72 20 34 7d 0a 0a 23 20  3 integer 4}..# 
caa0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
cab0: 32 34 33 34 2d 30 39 30 39 32 20 49 66 20 74 68  2434-09092 If th
cac0: 65 20 76 61 6c 75 65 20 6f 66 20 65 78 70 72 20  e value of expr 
cad0: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
cae0: 65 0a 23 20 72 65 73 75 6c 74 20 6f 66 20 74 68  e.# result of th
caf0: 65 20 43 41 53 54 20 65 78 70 72 65 73 73 69 6f  e CAST expressio
cb00: 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a  n is also NULL..
cb10: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
cb20: 5f 65 78 70 72 2d 32 37 2e 32 2e 31 20 7b 20 43  _expr-27.2.1 { C
cb30: 41 53 54 28 4e 55 4c 4c 20 41 53 20 69 6e 74 65  AST(NULL AS inte
cb40: 67 65 72 29 20 7d 20 6e 75 6c 6c 20 7b 7d 0a 64  ger) } null {}.d
cb50: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
cb60: 70 72 2d 32 37 2e 32 2e 32 20 7b 20 43 41 53 54  pr-27.2.2 { CAST
cb70: 28 4e 55 4c 4c 20 41 53 20 74 65 78 74 29 20 7d  (NULL AS text) }
cb80: 20 20 20 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65      null {}.do_e
cb90: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
cba0: 32 37 2e 32 2e 33 20 7b 20 43 41 53 54 28 4e 55  27.2.3 { CAST(NU
cbb0: 4c 4c 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 20  LL AS blob) }   
cbc0: 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72   null {}.do_expr
cbd0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
cbe0: 32 2e 34 20 7b 20 43 41 53 54 28 4e 55 4c 4c 20  2.4 { CAST(NULL 
cbf0: 41 53 20 6e 75 6d 62 65 72 29 20 7d 20 20 6e 75  AS number) }  nu
cc00: 6c 6c 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43  ll {}..# EVIDENC
cc10: 45 2d 4f 46 3a 20 52 2d 32 39 32 38 33 2d 31 35  E-OF: R-29283-15
cc20: 35 36 31 20 4f 74 68 65 72 77 69 73 65 2c 20 74  561 Otherwise, t
cc30: 68 65 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73  he storage class
cc40: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 23   of the result.#
cc50: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
cc60: 79 20 61 70 70 6c 79 69 6e 67 20 74 68 65 20 72  y applying the r
cc70: 75 6c 65 73 20 66 6f 72 20 64 65 74 65 72 6d 69  ules for determi
cc80: 6e 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 66 66 69  ning column affi
cc90: 6e 69 74 79 20 74 6f 0a 23 20 74 68 65 20 74 79  nity to.# the ty
cca0: 70 65 2d 6e 61 6d 65 2e 0a 23 0a 23 20 54 68 65  pe-name..#.# The
ccb0: 20 52 2d 32 39 32 38 33 2d 31 35 35 36 31 20 72   R-29283-15561 r
ccc0: 65 71 75 69 72 65 6d 65 6e 74 20 61 62 6f 76 65  equirement above
ccd0: 20 69 73 20 64 65 6d 6f 6e 73 74 72 61 74 65 64   is demonstrated
cce0: 20 62 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a   by all of the .
ccf0: 23 20 73 75 62 73 65 71 75 65 6e 74 20 65 5f 65  # subsequent e_e
cd00: 78 70 72 2d 32 36 20 74 65 73 74 73 2e 0a 23 0a  xpr-26 tests..#.
cd10: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
cd20: 2d 34 33 35 32 32 2d 33 35 35 34 38 20 43 61 73  -43522-35548 Cas
cd30: 74 69 6e 67 20 61 20 76 61 6c 75 65 20 74 6f 20  ting a value to 
cd40: 61 20 74 79 70 65 2d 6e 61 6d 65 20 77 69 74 68  a type-name with
cd50: 20 6e 6f 0a 23 20 61 66 66 69 6e 69 74 79 20 63   no.# affinity c
cd60: 61 75 73 65 73 20 74 68 65 20 76 61 6c 75 65 20  auses the value 
cd70: 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  to be converted 
cd80: 69 6e 74 6f 20 61 20 42 4c 4f 42 2e 0a 23 0a 64  into a BLOB..#.d
cd90: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
cda0: 70 72 2d 32 37 2e 33 2e 31 20 7b 20 43 41 53 54  pr-27.3.1 { CAST
cdb0: 28 27 61 62 63 27 20 41 53 20 62 6c 6f 62 29 20  ('abc' AS blob) 
cdc0: 20 20 20 20 20 20 7d 20 62 6c 6f 62 20 61 62 63        } blob abc
cdd0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
cde0: 65 78 70 72 2d 32 37 2e 33 2e 32 20 7b 20 43 41  expr-27.3.2 { CA
cdf0: 53 54 28 27 64 65 66 27 20 41 53 20 73 68 6f 62  ST('def' AS shob
ce00: 62 6c 6f 62 5f 78 29 20 7d 20 62 6c 6f 62 20 64  blob_x) } blob d
ce10: 65 66 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  ef.do_expr_test 
ce20: 65 5f 65 78 70 72 2d 32 37 2e 33 2e 33 20 7b 20  e_expr-27.3.3 { 
ce30: 43 41 53 54 28 27 67 68 69 27 20 41 53 20 61 62  CAST('ghi' AS ab
ce40: 62 4c 4f 62 31 30 29 20 20 20 7d 20 62 6c 6f 62  bLOb10)   } blob
ce50: 20 67 68 69 0a 0a 23 20 45 56 49 44 45 4e 43 45   ghi..# EVIDENCE
ce60: 2d 4f 46 3a 20 52 2d 32 32 39 35 36 2d 33 37 37  -OF: R-22956-377
ce70: 35 34 20 43 61 73 74 69 6e 67 20 74 6f 20 61 20  54 Casting to a 
ce80: 42 4c 4f 42 20 63 6f 6e 73 69 73 74 73 20 6f 66  BLOB consists of
ce90: 20 66 69 72 73 74 20 63 61 73 74 69 6e 67 0a 23   first casting.#
cea0: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 54 45   the value to TE
ceb0: 58 54 20 69 6e 20 74 68 65 20 65 6e 63 6f 64 69  XT in the encodi
cec0: 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
ced0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 74  se connection, t
cee0: 68 65 6e 0a 23 20 69 6e 74 65 72 70 72 65 74 69  hen.# interpreti
cef0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  ng the resulting
cf00: 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 61   byte sequence a
cf10: 73 20 61 20 42 4c 4f 42 20 69 6e 73 74 65 61 64  s a BLOB instead
cf20: 20 6f 66 20 61 73 20 54 45 58 54 2e 0a 23 0a 64   of as TEXT..#.d
cf30: 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65  o_qexpr_test e_e
cf40: 78 70 72 2d 32 37 2e 34 2e 31 20 7b 20 43 41 53  xpr-27.4.1 { CAS
cf50: 54 28 27 67 68 69 27 20 41 53 20 62 6c 6f 62 29  T('ghi' AS blob)
cf60: 20 7d 20 58 27 36 37 36 38 36 39 27 0a 64 6f 5f   } X'676869'.do_
cf70: 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  qexpr_test e_exp
cf80: 72 2d 32 37 2e 34 2e 32 20 7b 20 43 41 53 54 28  r-27.4.2 { CAST(
cf90: 34 35 36 20 41 53 20 62 6c 6f 62 29 20 7d 20 20  456 AS blob) }  
cfa0: 20 58 27 33 34 33 35 33 36 27 0a 64 6f 5f 71 65   X'343536'.do_qe
cfb0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
cfc0: 32 37 2e 34 2e 33 20 7b 20 43 41 53 54 28 31 2e  27.4.3 { CAST(1.
cfd0: 37 38 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 58  78 AS blob) }  X
cfe0: 27 33 31 32 45 33 37 33 38 27 0a 72 65 6e 61 6d  '312E3738'.renam
cff0: 65 20 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33  e db db2.sqlite3
d000: 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 69 66 63   db :memory:.ifc
d010: 61 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b  apable {utf16} {
d020: 0a 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d  .db eval { PRAGM
d030: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74  A encoding = 'ut
d040: 66 2d 31 36 6c 65 27 20 7d 0a 64 6f 5f 71 65 78  f-16le' }.do_qex
d050: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d060: 37 2e 34 2e 34 20 7b 20 43 41 53 54 28 27 67 68  7.4.4 { CAST('gh
d070: 69 27 20 41 53 20 62 6c 6f 62 29 20 7d 20 58 27  i' AS blob) } X'
d080: 36 37 30 30 36 38 30 30 36 39 30 30 27 0a 64 6f  670068006900'.do
d090: 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  _qexpr_test e_ex
d0a0: 70 72 2d 32 37 2e 34 2e 35 20 7b 20 43 41 53 54  pr-27.4.5 { CAST
d0b0: 28 34 35 36 20 41 53 20 62 6c 6f 62 29 20 7d 20  (456 AS blob) } 
d0c0: 20 20 58 27 33 34 30 30 33 35 30 30 33 36 30 30    X'340035003600
d0d0: 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20  '.do_qexpr_test 
d0e0: 65 5f 65 78 70 72 2d 32 37 2e 34 2e 36 20 7b 20  e_expr-27.4.6 { 
d0f0: 43 41 53 54 28 31 2e 37 38 20 41 53 20 62 6c 6f  CAST(1.78 AS blo
d100: 62 29 20 7d 20 20 58 27 33 31 30 30 32 45 30 30  b) }  X'31002E00
d110: 33 37 30 30 33 38 30 30 27 0a 7d 0a 64 62 20 63  37003800'.}.db c
d120: 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20  lose.sqlite3 db 
d130: 3a 6d 65 6d 6f 72 79 3a 0a 64 62 20 65 76 61 6c  :memory:.db eval
d140: 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69   { PRAGMA encodi
d150: 6e 67 20 3d 20 27 75 74 66 2d 31 36 62 65 27 20  ng = 'utf-16be' 
d160: 7d 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66  }.ifcapable {utf
d170: 31 36 7d 20 7b 0a 64 6f 5f 71 65 78 70 72 5f 74  16} {.do_qexpr_t
d180: 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e  est e_expr-27.4.
d190: 37 20 7b 20 43 41 53 54 28 27 67 68 69 27 20 41  7 { CAST('ghi' A
d1a0: 53 20 62 6c 6f 62 29 20 7d 20 58 27 30 30 36 37  S blob) } X'0067
d1b0: 30 30 36 38 30 30 36 39 27 0a 64 6f 5f 71 65 78  00680069'.do_qex
d1c0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d1d0: 37 2e 34 2e 38 20 7b 20 43 41 53 54 28 34 35 36  7.4.8 { CAST(456
d1e0: 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 20 58 27   AS blob) }   X'
d1f0: 30 30 33 34 30 30 33 35 30 30 33 36 27 0a 64 6f  003400350036'.do
d200: 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  _qexpr_test e_ex
d210: 70 72 2d 32 37 2e 34 2e 39 20 7b 20 43 41 53 54  pr-27.4.9 { CAST
d220: 28 31 2e 37 38 20 41 53 20 62 6c 6f 62 29 20 7d  (1.78 AS blob) }
d230: 20 20 58 27 30 30 33 31 30 30 32 45 30 30 33 37    X'0031002E0037
d240: 30 30 33 38 27 0a 7d 0a 64 62 20 63 6c 6f 73 65  0038'.}.db close
d250: 0a 72 65 6e 61 6d 65 20 64 62 32 20 64 62 0a 0a  .rename db2 db..
d260: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
d270: 2d 30 34 32 30 37 2d 33 37 39 38 31 20 54 6f 20  -04207-37981 To 
d280: 63 61 73 74 20 61 20 42 4c 4f 42 20 76 61 6c 75  cast a BLOB valu
d290: 65 20 74 6f 20 54 45 58 54 2c 20 74 68 65 20 73  e to TEXT, the s
d2a0: 65 71 75 65 6e 63 65 0a 23 20 6f 66 20 62 79 74  equence.# of byt
d2b0: 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
d2c0: 74 68 65 20 42 4c 4f 42 20 69 73 20 69 6e 74 65  the BLOB is inte
d2d0: 72 70 72 65 74 65 64 20 61 73 20 74 65 78 74 20  rpreted as text 
d2e0: 65 6e 63 6f 64 65 64 20 75 73 69 6e 67 0a 23 20  encoded using.# 
d2f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63  the database enc
d300: 6f 64 69 6e 67 2e 0a 23 0a 64 6f 5f 65 78 70 72  oding..#.do_expr
d310: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e  _test e_expr-28.
d320: 31 2e 31 20 7b 20 43 41 53 54 20 28 58 27 36 37  1.1 { CAST (X'67
d330: 36 38 36 39 27 20 41 53 20 74 65 78 74 29 20 7d  6869' AS text) }
d340: 20 74 65 78 74 20 67 68 69 0a 64 6f 5f 65 78 70   text ghi.do_exp
d350: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38  r_test e_expr-28
d360: 2e 31 2e 32 20 7b 20 43 41 53 54 20 28 58 27 36  .1.2 { CAST (X'6
d370: 37 30 30 36 38 30 30 36 39 30 30 27 20 41 53 20  70068006900' AS 
d380: 74 65 78 74 29 20 7d 20 74 65 78 74 20 67 0a 72  text) } text g.r
d390: 65 6e 61 6d 65 20 64 62 20 64 62 32 0a 73 71 6c  ename db db2.sql
d3a0: 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a  ite3 db :memory:
d3b0: 0a 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d  .db eval { PRAGM
d3c0: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74  A encoding = 'ut
d3d0: 66 2d 31 36 6c 65 27 20 7d 0a 69 66 63 61 70 61  f-16le' }.ifcapa
d3e0: 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a 64 6f  ble {utf16} {.do
d3f0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d400: 72 2d 32 38 2e 31 2e 33 20 7b 20 43 41 53 54 20  r-28.1.3 { CAST 
d410: 28 58 27 36 37 36 38 36 39 27 20 41 53 20 74 65  (X'676869' AS te
d420: 78 74 29 20 3d 3d 20 27 67 68 69 27 20 7d 20 69  xt) == 'ghi' } i
d430: 6e 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72  nteger 0.do_expr
d440: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e  _test e_expr-28.
d450: 31 2e 34 20 7b 20 43 41 53 54 20 28 58 27 36 37  1.4 { CAST (X'67
d460: 30 30 36 38 30 30 36 39 30 30 27 20 41 53 20 74  0068006900' AS t
d470: 65 78 74 29 20 7d 20 74 65 78 74 20 67 68 69 0a  ext) } text ghi.
d480: 7d 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61 6d  }.db close.renam
d490: 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49 44  e db2 db..# EVID
d4a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 32 33 35  ENCE-OF: R-22235
d4b0: 2d 34 37 30 30 36 20 43 61 73 74 69 6e 67 20 61  -47006 Casting a
d4c0: 6e 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41  n INTEGER or REA
d4d0: 4c 20 76 61 6c 75 65 20 69 6e 74 6f 20 54 45 58  L value into TEX
d4e0: 54 0a 23 20 72 65 6e 64 65 72 73 20 74 68 65 20  T.# renders the 
d4f0: 76 61 6c 75 65 20 61 73 20 69 66 20 76 69 61 20  value as if via 
d500: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
d510: 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 74  () except that t
d520: 68 65 0a 23 20 72 65 73 75 6c 74 69 6e 67 20 54  he.# resulting T
d530: 45 58 54 20 75 73 65 73 20 74 68 65 20 65 6e 63  EXT uses the enc
d540: 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  oding of the dat
d550: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
d560: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
d570: 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 31 20 7b   e_expr-28.2.1 {
d580: 20 43 41 53 54 20 28 31 20 41 53 20 74 65 78 74   CAST (1 AS text
d590: 29 20 20 20 7d 20 20 20 20 20 74 65 78 74 20 31  )   }     text 1
d5a0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d5b0: 65 78 70 72 2d 32 38 2e 32 2e 32 20 7b 20 43 41  expr-28.2.2 { CA
d5c0: 53 54 20 28 34 35 20 41 53 20 74 65 78 74 29 20  ST (45 AS text) 
d5d0: 20 7d 20 20 20 20 20 74 65 78 74 20 34 35 0a 64   }     text 45.d
d5e0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d5f0: 70 72 2d 32 38 2e 32 2e 33 20 7b 20 43 41 53 54  pr-28.2.3 { CAST
d600: 20 28 2d 34 35 20 41 53 20 74 65 78 74 29 20 7d   (-45 AS text) }
d610: 20 20 20 20 20 74 65 78 74 20 2d 34 35 0a 64 6f       text -45.do
d620: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d630: 72 2d 32 38 2e 32 2e 34 20 7b 20 43 41 53 54 20  r-28.2.4 { CAST 
d640: 28 38 2e 38 20 41 53 20 74 65 78 74 29 20 20 20  (8.8 AS text)   
d650: 20 7d 20 20 74 65 78 74 20 38 2e 38 0a 64 6f 5f   }  text 8.8.do_
d660: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d670: 2d 32 38 2e 32 2e 35 20 7b 20 43 41 53 54 20 28  -28.2.5 { CAST (
d680: 32 2e 33 65 2b 35 20 41 53 20 74 65 78 74 29 20  2.3e+5 AS text) 
d690: 7d 20 20 74 65 78 74 20 32 33 30 30 30 30 2e 30  }  text 230000.0
d6a0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d6b0: 65 78 70 72 2d 32 38 2e 32 2e 36 20 7b 20 43 41  expr-28.2.6 { CA
d6c0: 53 54 20 28 2d 32 2e 33 65 2d 35 20 41 53 20 74  ST (-2.3e-5 AS t
d6d0: 65 78 74 29 20 7d 20 74 65 78 74 20 2d 32 2e 33  ext) } text -2.3
d6e0: 65 2d 30 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73  e-05.do_expr_tes
d6f0: 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 37 20  t e_expr-28.2.7 
d700: 7b 20 43 41 53 54 20 28 30 2e 30 20 41 53 20 74  { CAST (0.0 AS t
d710: 65 78 74 29 20 7d 20 20 20 20 20 74 65 78 74 20  ext) }     text 
d720: 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  0.0.do_expr_test
d730: 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 37 20 7b   e_expr-28.2.7 {
d740: 20 43 41 53 54 20 28 30 20 41 53 20 74 65 78 74   CAST (0 AS text
d750: 29 20 7d 20 20 20 20 20 20 20 74 65 78 74 20 30  ) }       text 0
d760: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
d770: 20 52 2d 32 36 33 34 36 2d 33 36 34 34 33 20 57   R-26346-36443 W
d780: 68 65 6e 20 63 61 73 74 69 6e 67 20 61 20 42 4c  hen casting a BL
d790: 4f 42 20 76 61 6c 75 65 20 74 6f 20 61 20 52 45  OB value to a RE
d7a0: 41 4c 2c 20 74 68 65 0a 23 20 76 61 6c 75 65 20  AL, the.# value 
d7b0: 69 73 20 66 69 72 73 74 20 63 6f 6e 76 65 72 74  is first convert
d7c0: 65 64 20 74 6f 20 54 45 58 54 2e 0a 23 0a 64 6f  ed to TEXT..#.do
d7d0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d7e0: 72 2d 32 39 2e 31 2e 31 20 7b 20 43 41 53 54 20  r-29.1.1 { CAST 
d7f0: 28 58 27 33 31 32 45 33 32 33 33 27 20 41 53 20  (X'312E3233' AS 
d800: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32  REAL) } real 1.2
d810: 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  3.do_expr_test e
d820: 5f 65 78 70 72 2d 32 39 2e 31 2e 32 20 7b 20 43  _expr-29.1.2 { C
d830: 41 53 54 20 28 58 27 33 32 33 33 33 30 32 45 33  AST (X'3233302E3
d840: 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  0' AS REAL) } re
d850: 61 6c 20 32 33 30 2e 30 0a 64 6f 5f 65 78 70 72  al 230.0.do_expr
d860: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d870: 31 2e 33 20 7b 20 43 41 53 54 20 28 58 27 32 44  1.3 { CAST (X'2D
d880: 33 39 32 45 33 38 33 37 27 20 41 53 20 52 45 41  392E3837' AS REA
d890: 4c 29 20 7d 20 72 65 61 6c 20 2d 39 2e 38 37 0a  L) } real -9.87.
d8a0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d8b0: 78 70 72 2d 32 39 2e 31 2e 34 20 7b 20 43 41 53  xpr-29.1.4 { CAS
d8c0: 54 20 28 58 27 33 30 32 45 33 30 33 30 33 30 33  T (X'302E3030303
d8d0: 31 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  1' AS REAL) } re
d8e0: 61 6c 20 30 2e 30 30 30 31 0a 72 65 6e 61 6d 65  al 0.0001.rename
d8f0: 20 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33 20   db db2.sqlite3 
d900: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 69 66 63 61  db :memory:.ifca
d910: 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a  pable {utf16} {.
d920: 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  db eval { PRAGMA
d930: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66   encoding = 'utf
d940: 2d 31 36 6c 65 27 20 7d 0a 64 6f 5f 65 78 70 72  -16le' }.do_expr
d950: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d960: 31 2e 35 20 7b 20 0a 20 20 20 20 43 41 53 54 20  1.5 { .    CAST 
d970: 28 58 27 33 31 30 30 32 45 30 30 33 32 30 30 33  (X'31002E0032003
d980: 33 30 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20  300' AS REAL) } 
d990: 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65 78 70  real 1.23.do_exp
d9a0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
d9b0: 2e 31 2e 36 20 7b 20 0a 20 20 20 20 43 41 53 54  .1.6 { .    CAST
d9c0: 20 28 58 27 33 32 30 30 33 33 30 30 33 30 30 30   (X'320033003000
d9d0: 32 45 30 30 33 30 30 30 27 20 41 53 20 52 45 41  2E003000' AS REA
d9e0: 4c 29 20 7d 20 72 65 61 6c 20 32 33 30 2e 30 0a  L) } real 230.0.
d9f0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
da00: 78 70 72 2d 32 39 2e 31 2e 37 20 7b 20 0a 20 20  xpr-29.1.7 { .  
da10: 20 20 43 41 53 54 20 28 58 27 32 44 30 30 33 39    CAST (X'2D0039
da20: 30 30 32 45 30 30 33 38 30 30 33 37 30 30 27 20  002E0038003700' 
da30: 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20  AS REAL) } real 
da40: 2d 39 2e 38 37 0a 64 6f 5f 65 78 70 72 5f 74 65  -9.87.do_expr_te
da50: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e 38  st e_expr-29.1.8
da60: 20 7b 20 0a 20 20 20 20 43 41 53 54 20 28 58 27   { .    CAST (X'
da70: 33 30 30 30 32 45 30 30 33 30 30 30 33 30 30 30  30002E0030003000
da80: 33 30 30 30 33 31 30 30 27 20 41 53 20 52 45 41  30003100' AS REA
da90: 4c 29 20 7d 20 72 65 61 6c 20 30 2e 30 30 30 31  L) } real 0.0001
daa0: 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61  .}.db close.rena
dab0: 6d 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49  me db2 db..# EVI
dac0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 38 39  DENCE-OF: R-5489
dad0: 38 2d 33 34 35 35 34 20 57 68 65 6e 20 63 61 73  8-34554 When cas
dae0: 74 69 6e 67 20 61 20 54 45 58 54 20 76 61 6c 75  ting a TEXT valu
daf0: 65 20 74 6f 20 52 45 41 4c 2c 20 74 68 65 0a 23  e to REAL, the.#
db00: 20 6c 6f 6e 67 65 73 74 20 70 6f 73 73 69 62 6c   longest possibl
db10: 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  e prefix of the 
db20: 76 61 6c 75 65 20 74 68 61 74 20 63 61 6e 20 62  value that can b
db30: 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  e interpreted as
db40: 20 61 20 72 65 61 6c 0a 23 20 6e 75 6d 62 65 72   a real.# number
db50: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
db60: 6f 6d 20 74 68 65 20 54 45 58 54 20 76 61 6c 75  om the TEXT valu
db70: 65 20 61 6e 64 20 74 68 65 20 72 65 6d 61 69 6e  e and the remain
db80: 64 65 72 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64  der ignored..#.d
db90: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
dba0: 70 72 2d 32 39 2e 32 2e 31 20 7b 20 43 41 53 54  pr-29.2.1 { CAST
dbb0: 28 27 31 2e 32 33 61 62 63 64 27 20 41 53 20 52  ('1.23abcd' AS R
dbc0: 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32 33  EAL) } real 1.23
dbd0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
dbe0: 65 78 70 72 2d 32 39 2e 32 2e 32 20 7b 20 43 41  expr-29.2.2 { CA
dbf0: 53 54 28 27 31 2e 34 35 2e 32 33 61 62 63 64 27  ST('1.45.23abcd'
dc00: 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c   AS REAL) } real
dc10: 20 31 2e 34 35 0a 64 6f 5f 65 78 70 72 5f 74 65   1.45.do_expr_te
dc20: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 32 2e 33  st e_expr-29.2.3
dc30: 20 7b 20 43 41 53 54 28 27 2d 32 2e 31 32 65 2d   { CAST('-2.12e-
dc40: 30 31 41 42 43 27 20 41 53 20 52 45 41 4c 29 20  01ABC' AS REAL) 
dc50: 7d 20 72 65 61 6c 20 2d 30 2e 32 31 32 0a 64 6f  } real -0.212.do
dc60: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
dc70: 72 2d 32 39 2e 32 2e 34 20 7b 20 43 41 53 54 28  r-29.2.4 { CAST(
dc80: 27 31 20 32 20 33 20 34 27 20 41 53 20 52 45 41  '1 2 3 4' AS REA
dc90: 4c 29 20 7d 20 72 65 61 6c 20 31 2e 30 0a 0a 23  L) } real 1.0..#
dca0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
dcb0: 31 31 33 32 31 2d 34 37 34 32 37 20 41 6e 79 20  11321-47427 Any 
dcc0: 6c 65 61 64 69 6e 67 20 73 70 61 63 65 73 20 69  leading spaces i
dcd0: 6e 20 74 68 65 20 54 45 58 54 20 76 61 6c 75 65  n the TEXT value
dce0: 20 61 72 65 0a 23 20 69 67 6e 6f 72 65 64 20 77   are.# ignored w
dcf0: 68 65 6e 20 63 6f 6e 76 65 72 67 69 6e 67 20 66  hen converging f
dd00: 72 6f 6d 20 54 45 58 54 20 74 6f 20 52 45 41 4c  rom TEXT to REAL
dd10: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
dd20: 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e 31 20 7b   e_expr-29.3.1 {
dd30: 20 43 41 53 54 28 27 20 31 2e 32 33 61 62 63 64   CAST(' 1.23abcd
dd40: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
dd50: 6c 20 31 2e 32 33 0a 64 6f 5f 65 78 70 72 5f 74  l 1.23.do_expr_t
dd60: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e  est e_expr-29.3.
dd70: 32 20 7b 20 43 41 53 54 28 27 20 20 20 20 31 2e  2 { CAST('    1.
dd80: 34 35 2e 32 33 61 62 63 64 27 20 41 53 20 52 45  45.23abcd' AS RE
dd90: 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 34 35 0a  AL) } real 1.45.
dda0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
ddb0: 78 70 72 2d 32 39 2e 33 2e 33 20 7b 20 43 41 53  xpr-29.3.3 { CAS
ddc0: 54 28 27 20 20 20 2d 32 2e 31 32 65 2d 30 31 41  T('   -2.12e-01A
ddd0: 42 43 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  BC' AS REAL) } r
dde0: 65 61 6c 20 2d 30 2e 32 31 32 0a 64 6f 5f 65 78  eal -0.212.do_ex
ddf0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
de00: 39 2e 33 2e 34 20 7b 20 43 41 53 54 28 27 20 31  9.3.4 { CAST(' 1
de10: 20 32 20 33 20 34 27 20 41 53 20 52 45 41 4c 29   2 3 4' AS REAL)
de20: 20 7d 20 72 65 61 6c 20 31 2e 30 0a 0a 23 20 45   } real 1.0..# E
de30: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32  VIDENCE-OF: R-22
de40: 36 36 32 2d 32 38 32 31 38 20 49 66 20 74 68 65  662-28218 If the
de50: 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20  re is no prefix 
de60: 74 68 61 74 20 63 61 6e 20 62 65 0a 23 20 69 6e  that can be.# in
de70: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 72  terpreted as a r
de80: 65 61 6c 20 6e 75 6d 62 65 72 2c 20 74 68 65 20  eal number, the 
de90: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  result of the co
dea0: 6e 76 65 72 73 69 6f 6e 20 69 73 20 30 2e 30 2e  nversion is 0.0.
deb0: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
dec0: 65 5f 65 78 70 72 2d 32 39 2e 34 2e 31 20 7b 20  e_expr-29.4.1 { 
ded0: 43 41 53 54 28 27 27 20 41 53 20 52 45 41 4c 29  CAST('' AS REAL)
dee0: 20 7d 20 72 65 61 6c 20 30 2e 30 0a 64 6f 5f 65   } real 0.0.do_e
def0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
df00: 32 39 2e 34 2e 32 20 7b 20 43 41 53 54 28 27 6e  29.4.2 { CAST('n
df10: 6f 74 20 61 20 6e 75 6d 62 65 72 27 20 41 53 20  ot a number' AS 
df20: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 30 2e 30  REAL) } real 0.0
df30: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
df40: 65 78 70 72 2d 32 39 2e 34 2e 33 20 7b 20 43 41  expr-29.4.3 { CA
df50: 53 54 28 27 58 58 49 27 20 41 53 20 52 45 41 4c  ST('XXI' AS REAL
df60: 29 20 7d 20 72 65 61 6c 20 30 2e 30 0a 0a 23 20  ) } real 0.0..# 
df70: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
df80: 31 38 32 39 2d 31 34 35 36 33 20 57 68 65 6e 20  1829-14563 When 
df90: 63 61 73 74 69 6e 67 20 61 20 42 4c 4f 42 20 76  casting a BLOB v
dfa0: 61 6c 75 65 20 74 6f 20 49 4e 54 45 47 45 52 2c  alue to INTEGER,
dfb0: 20 74 68 65 0a 23 20 76 61 6c 75 65 20 69 73 20   the.# value is 
dfc0: 66 69 72 73 74 20 63 6f 6e 76 65 72 74 65 64 20  first converted 
dfd0: 74 6f 20 54 45 58 54 2e 0a 23 0a 64 6f 5f 65 78  to TEXT..#.do_ex
dfe0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
dff0: 30 2e 31 2e 31 20 7b 20 43 41 53 54 28 58 27 33  0.1.1 { CAST(X'3
e000: 31 33 32 33 33 27 20 41 53 20 49 4e 54 45 47 45  13233' AS INTEGE
e010: 52 29 20 7d 20 69 6e 74 65 67 65 72 20 31 32 33  R) } integer 123
e020: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e030: 65 78 70 72 2d 33 30 2e 31 2e 32 20 7b 20 43 41  expr-30.1.2 { CA
e040: 53 54 28 58 27 32 44 33 36 33 37 33 38 27 20 41  ST(X'2D363738' A
e050: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e060: 65 67 65 72 20 2d 36 37 38 0a 64 6f 5f 65 78 70  eger -678.do_exp
e070: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
e080: 2e 31 2e 33 20 7b 20 0a 20 20 43 41 53 54 28 58  .1.3 { .  CAST(X
e090: 27 33 31 33 30 33 30 33 30 33 30 33 30 33 30 27  '31303030303030'
e0a0: 20 41 53 20 49 4e 54 45 47 45 52 29 20 0a 7d 20   AS INTEGER) .} 
e0b0: 69 6e 74 65 67 65 72 20 31 30 30 30 30 30 30 0a  integer 1000000.
e0c0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e0d0: 78 70 72 2d 33 30 2e 31 2e 34 20 7b 20 0a 20 20  xpr-30.1.4 { .  
e0e0: 43 41 53 54 28 58 27 32 44 33 31 33 31 33 32 33  CAST(X'2D3131323
e0f0: 35 33 38 33 39 33 39 33 39 33 30 33 36 33 38 33  5383939393036383
e100: 34 33 32 33 36 33 32 33 34 27 20 41 53 20 49 4e  432363234' AS IN
e110: 54 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67 65  TEGER) .} intege
e120: 72 20 2d 31 31 32 35 38 39 39 39 30 36 38 34 32  r -1125899906842
e130: 36 32 34 0a 0a 72 65 6e 61 6d 65 20 64 62 20 64  624..rename db d
e140: 62 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d  b2.sqlite3 db :m
e150: 65 6d 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c 65  emory:.ifcapable
e160: 20 7b 75 74 66 31 36 7d 20 7b 0a 65 78 65 63 73   {utf16} {.execs
e170: 71 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f  ql { PRAGMA enco
e180: 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 62 65  ding = 'utf-16be
e190: 27 20 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ' }.do_expr_test
e1a0: 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 35 20 7b   e_expr-30.1.5 {
e1b0: 20 43 41 53 54 28 58 27 30 30 33 31 30 30 33 32   CAST(X'00310032
e1c0: 30 30 33 33 27 20 41 53 20 49 4e 54 45 47 45 52  0033' AS INTEGER
e1d0: 29 20 7d 20 69 6e 74 65 67 65 72 20 31 32 33 0a  ) } integer 123.
e1e0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e1f0: 78 70 72 2d 33 30 2e 31 2e 36 20 7b 20 43 41 53  xpr-30.1.6 { CAS
e200: 54 28 58 27 30 30 32 44 30 30 33 36 30 30 33 37  T(X'002D00360037
e210: 30 30 33 38 27 20 41 53 20 49 4e 54 45 47 45 52  0038' AS INTEGER
e220: 29 20 7d 20 69 6e 74 65 67 65 72 20 2d 36 37 38  ) } integer -678
e230: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e240: 65 78 70 72 2d 33 30 2e 31 2e 37 20 7b 20 0a 20  expr-30.1.7 { . 
e250: 20 43 41 53 54 28 58 27 30 30 33 31 30 30 33 30   CAST(X'00310030
e260: 30 30 33 30 30 30 33 30 30 30 33 30 30 30 33 30  0030003000300030
e270: 30 30 33 30 27 20 41 53 20 49 4e 54 45 47 45 52  0030' AS INTEGER
e280: 29 20 0a 7d 20 69 6e 74 65 67 65 72 20 31 30 30  ) .} integer 100
e290: 30 30 30 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73  0000.do_expr_tes
e2a0: 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 38 20  t e_expr-30.1.8 
e2b0: 7b 20 0a 20 20 43 41 53 54 28 58 27 30 30 32 44  { .  CAST(X'002D
e2c0: 30 30 33 31 30 30 33 31 30 30 33 32 30 30 33 35  0031003100320035
e2d0: 30 30 33 38 30 30 33 39 30 30 33 39 30 30 33 39  0038003900390039
e2e0: 30 30 33 30 30 30 33 36 30 30 33 38 30 30 33 34  0030003600380034
e2f0: 30 30 33 32 30 30 33 36 30 30 33 32 30 30 33 34  0032003600320034
e300: 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 0a 7d  ' AS INTEGER) .}
e310: 20 69 6e 74 65 67 65 72 20 2d 31 31 32 35 38 39   integer -112589
e320: 39 39 30 36 38 34 32 36 32 34 0a 7d 0a 64 62 20  9906842624.}.db 
e330: 63 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62 32  close.rename db2
e340: 20 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   db..# EVIDENCE-
e350: 4f 46 3a 20 52 2d 34 37 36 31 32 2d 34 35 38 34  OF: R-47612-4584
e360: 32 20 57 68 65 6e 20 63 61 73 74 69 6e 67 20 61  2 When casting a
e370: 20 54 45 58 54 20 76 61 6c 75 65 20 74 6f 20 49   TEXT value to I
e380: 4e 54 45 47 45 52 2c 20 74 68 65 0a 23 20 6c 6f  NTEGER, the.# lo
e390: 6e 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70  ngest possible p
e3a0: 72 65 66 69 78 20 6f 66 20 74 68 65 20 76 61 6c  refix of the val
e3b0: 75 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 69  ue that can be i
e3c0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
e3d0: 0a 23 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  .# integer numbe
e3e0: 72 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  r is extracted f
e3f0: 72 6f 6d 20 74 68 65 20 54 45 58 54 20 76 61 6c  rom the TEXT val
e400: 75 65 20 61 6e 64 20 74 68 65 20 72 65 6d 61 69  ue and the remai
e410: 6e 64 65 72 0a 23 20 69 67 6e 6f 72 65 64 2e 0a  nder.# ignored..
e420: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
e430: 5f 65 78 70 72 2d 33 30 2e 32 2e 31 20 7b 20 43  _expr-30.2.1 { C
e440: 41 53 54 28 27 31 32 33 61 62 63 64 27 20 41 53  AST('123abcd' AS
e450: 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20   INT) } integer 
e460: 31 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  123.do_expr_test
e470: 20 65 5f 65 78 70 72 2d 33 30 2e 32 2e 32 20 7b   e_expr-30.2.2 {
e480: 20 43 41 53 54 28 27 31 34 35 32 33 61 62 63 64   CAST('14523abcd
e490: 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65  ' AS INT) } inte
e4a0: 67 65 72 20 31 34 35 32 33 0a 64 6f 5f 65 78 70  ger 14523.do_exp
e4b0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
e4c0: 2e 32 2e 33 20 7b 20 43 41 53 54 28 27 2d 32 2e  .2.3 { CAST('-2.
e4d0: 31 32 65 2d 30 31 41 42 43 27 20 41 53 20 49 4e  12e-01ABC' AS IN
e4e0: 54 29 20 7d 20 69 6e 74 65 67 65 72 20 2d 32 0a  T) } integer -2.
e4f0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e500: 78 70 72 2d 33 30 2e 32 2e 34 20 7b 20 43 41 53  xpr-30.2.4 { CAS
e510: 54 28 27 31 20 32 20 33 20 34 27 20 41 53 20 49  T('1 2 3 4' AS I
e520: 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31 0a  NT) } integer 1.
e530: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
e540: 52 2d 33 34 34 30 30 2d 33 33 37 37 32 20 41 6e  R-34400-33772 An
e550: 79 20 6c 65 61 64 69 6e 67 20 73 70 61 63 65 73  y leading spaces
e560: 20 69 6e 20 74 68 65 20 54 45 58 54 20 76 61 6c   in the TEXT val
e570: 75 65 20 77 68 65 6e 0a 23 20 63 6f 6e 76 65 72  ue when.# conver
e580: 74 69 6e 67 20 66 72 6f 6d 20 54 45 58 54 20 74  ting from TEXT t
e590: 6f 20 49 4e 54 45 47 45 52 20 61 72 65 20 69 67  o INTEGER are ig
e5a0: 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 70 72  nored..#.do_expr
e5b0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
e5c0: 33 2e 31 20 7b 20 43 41 53 54 28 27 20 20 20 31  3.1 { CAST('   1
e5d0: 32 33 61 62 63 64 27 20 41 53 20 49 4e 54 29 20  23abcd' AS INT) 
e5e0: 7d 20 69 6e 74 65 67 65 72 20 31 32 33 0a 64 6f  } integer 123.do
e5f0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e600: 72 2d 33 30 2e 33 2e 32 20 7b 20 43 41 53 54 28  r-30.3.2 { CAST(
e610: 27 20 20 31 34 35 32 33 61 62 63 64 27 20 41 53  '  14523abcd' AS
e620: 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20   INT) } integer 
e630: 31 34 35 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65  14523.do_expr_te
e640: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 33 2e 33  st e_expr-30.3.3
e650: 20 7b 20 43 41 53 54 28 27 20 2d 32 2e 31 32 65   { CAST(' -2.12e
e660: 2d 30 31 41 42 43 27 20 41 53 20 49 4e 54 29 20  -01ABC' AS INT) 
e670: 7d 20 69 6e 74 65 67 65 72 20 2d 32 0a 64 6f 5f  } integer -2.do_
e680: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e690: 2d 33 30 2e 33 2e 34 20 7b 20 43 41 53 54 28 27  -30.3.4 { CAST('
e6a0: 20 20 20 20 20 31 20 32 20 33 20 34 27 20 41 53       1 2 3 4' AS
e6b0: 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20   INT) } integer 
e6c0: 31 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  1..# EVIDENCE-OF
e6d0: 3a 20 52 2d 34 33 31 36 34 2d 34 34 32 37 36 20  : R-43164-44276 
e6e0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  If there is no p
e6f0: 72 65 66 69 78 20 74 68 61 74 20 63 61 6e 20 62  refix that can b
e700: 65 0a 23 20 69 6e 74 65 72 70 72 65 74 65 64 20  e.# interpreted 
e710: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  as an integer nu
e720: 6d 62 65 72 2c 20 74 68 65 20 72 65 73 75 6c 74  mber, the result
e730: 20 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69   of the conversi
e740: 6f 6e 20 69 73 20 30 2e 0a 23 0a 64 6f 5f 65 78  on is 0..#.do_ex
e750: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e760: 30 2e 34 2e 31 20 7b 20 43 41 53 54 28 27 27 20  0.4.1 { CAST('' 
e770: 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e  AS INTEGER) } in
e780: 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72 5f  teger 0.do_expr_
e790: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 34  test e_expr-30.4
e7a0: 2e 32 20 7b 20 43 41 53 54 28 27 6e 6f 74 20 61  .2 { CAST('not a
e7b0: 20 6e 75 6d 62 65 72 27 20 41 53 20 49 4e 54 45   number' AS INTE
e7c0: 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 30  GER) } integer 0
e7d0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e7e0: 65 78 70 72 2d 33 30 2e 34 2e 33 20 7b 20 43 41  expr-30.4.3 { CA
e7f0: 53 54 28 27 58 58 49 27 20 41 53 20 49 4e 54 45  ST('XXI' AS INTE
e800: 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 30  GER) } integer 0
e810: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
e820: 20 52 2d 30 38 39 38 30 2d 35 33 31 32 34 20 54   R-08980-53124 T
e830: 68 65 20 43 41 53 54 20 6f 70 65 72 61 74 6f 72  he CAST operator
e840: 20 75 6e 64 65 72 73 74 61 6e 64 73 20 64 65 63   understands dec
e850: 69 6d 61 6c 0a 23 20 69 6e 74 65 67 65 72 73 20  imal.# integers 
e860: 6f 6e 6c 79 20 26 6d 64 61 73 68 3b 20 63 6f 6e  only &mdash; con
e870: 76 65 72 73 69 6f 6e 20 6f 66 20 68 65 78 61 64  version of hexad
e880: 65 63 69 6d 61 6c 20 69 6e 74 65 67 65 72 73 20  ecimal integers 
e890: 73 74 6f 70 73 20 61 74 0a 23 20 74 68 65 20 22  stops at.# the "
e8a0: 78 22 20 69 6e 20 74 68 65 20 22 30 78 22 20 70  x" in the "0x" p
e8b0: 72 65 66 69 78 20 6f 66 20 74 68 65 20 68 65 78  refix of the hex
e8c0: 61 64 65 63 69 6d 61 6c 20 69 6e 74 65 67 65 72  adecimal integer
e8d0: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 75 73   string and thus
e8e0: 0a 23 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  .# result of the
e8f0: 20 43 41 53 54 20 69 73 20 61 6c 77 61 79 73 20   CAST is always 
e900: 7a 65 72 6f 2e 0a 64 6f 5f 65 78 70 72 5f 74 65  zero..do_expr_te
e910: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 35 2e 31  st e_expr-30.5.1
e920: 20 7b 20 43 41 53 54 28 27 30 78 31 32 33 34 27   { CAST('0x1234'
e930: 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69   AS INTEGER) } i
e940: 6e 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72  nteger 0.do_expr
e950: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
e960: 35 2e 32 20 7b 20 43 41 53 54 28 27 30 58 31 32  5.2 { CAST('0X12
e970: 33 34 27 20 41 53 20 49 4e 54 45 47 45 52 29 20  34' AS INTEGER) 
e980: 7d 20 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45  } integer 0..# E
e990: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32  VIDENCE-OF: R-02
e9a0: 37 35 32 2d 35 30 30 39 31 20 41 20 63 61 73 74  752-50091 A cast
e9b0: 20 6f 66 20 61 20 52 45 41 4c 20 76 61 6c 75 65   of a REAL value
e9c0: 20 69 6e 74 6f 20 61 6e 20 49 4e 54 45 47 45 52   into an INTEGER
e9d0: 0a 23 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  .# results in th
e9e0: 65 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65  e integer betwee
e9f0: 6e 20 74 68 65 20 52 45 41 4c 20 76 61 6c 75 65  n the REAL value
ea00: 20 61 6e 64 20 7a 65 72 6f 20 74 68 61 74 20 69   and zero that i
ea10: 73 20 63 6c 6f 73 65 73 74 0a 23 20 74 6f 20 74  s closest.# to t
ea20: 68 65 20 52 45 41 4c 20 76 61 6c 75 65 2e 0a 23  he REAL value..#
ea30: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
ea40: 65 78 70 72 2d 33 31 2e 31 2e 31 20 7b 20 43 41  expr-31.1.1 { CA
ea50: 53 54 28 33 2e 31 34 31 35 39 20 41 53 20 49 4e  ST(3.14159 AS IN
ea60: 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72  TEGER) } integer
ea70: 20 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20   3.do_expr_test 
ea80: 65 5f 65 78 70 72 2d 33 31 2e 31 2e 32 20 7b 20  e_expr-31.1.2 { 
ea90: 43 41 53 54 28 31 2e 39 39 39 39 39 20 41 53 20  CAST(1.99999 AS 
eaa0: 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67  INTEGER) } integ
eab0: 65 72 20 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73  er 1.do_expr_tes
eac0: 74 20 65 5f 65 78 70 72 2d 33 31 2e 31 2e 33 20  t e_expr-31.1.3 
ead0: 7b 20 43 41 53 54 28 2d 31 2e 39 39 39 39 39 20  { CAST(-1.99999 
eae0: 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e  AS INTEGER) } in
eaf0: 74 65 67 65 72 20 2d 31 0a 64 6f 5f 65 78 70 72  teger -1.do_expr
eb00: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e  _test e_expr-31.
eb10: 31 2e 34 20 7b 20 43 41 53 54 28 2d 30 2e 39 39  1.4 { CAST(-0.99
eb20: 39 39 39 20 41 53 20 49 4e 54 45 47 45 52 29 20  999 AS INTEGER) 
eb30: 7d 20 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45  } integer 0..# E
eb40: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
eb50: 35 31 37 2d 34 30 38 32 34 20 49 66 20 61 20 52  517-40824 If a R
eb60: 45 41 4c 20 69 73 20 67 72 65 61 74 65 72 20 74  EAL is greater t
eb70: 68 61 6e 20 74 68 65 20 67 72 65 61 74 65 73 74  han the greatest
eb80: 0a 23 20 70 6f 73 73 69 62 6c 65 20 73 69 67 6e  .# possible sign
eb90: 65 64 20 69 6e 74 65 67 65 72 20 28 2b 39 32 32  ed integer (+922
eba0: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
ebb0: 29 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  ) then the resul
ebc0: 74 20 69 73 20 74 68 65 0a 23 20 67 72 65 61 74  t is the.# great
ebd0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 73 69 67  est possible sig
ebe0: 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20  ned integer and 
ebf0: 69 66 20 74 68 65 20 52 45 41 4c 20 69 73 20 6c  if the REAL is l
ec00: 65 73 73 20 74 68 61 6e 20 74 68 65 0a 23 20 6c  ess than the.# l
ec10: 65 61 73 74 20 70 6f 73 73 69 62 6c 65 20 73 69  east possible si
ec20: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 28 2d 39  gned integer (-9
ec30: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
ec40: 30 38 29 20 74 68 65 6e 20 74 68 65 20 72 65 73  08) then the res
ec50: 75 6c 74 0a 23 20 69 73 20 74 68 65 20 6c 65 61  ult.# is the lea
ec60: 73 74 20 70 6f 73 73 69 62 6c 65 20 73 69 67 6e  st possible sign
ec70: 65 64 20 69 6e 74 65 67 65 72 2e 0a 23 0a 64 6f  ed integer..#.do
ec80: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
ec90: 72 2d 33 31 2e 32 2e 31 20 7b 20 43 41 53 54 28  r-31.2.1 { CAST(
eca0: 32 65 2b 35 30 20 41 53 20 49 4e 54 29 20 7d 20  2e+50 AS INT) } 
ecb0: 69 6e 74 65 67 65 72 20 39 32 32 33 33 37 32 30  integer 92233720
ecc0: 33 36 38 35 34 37 37 35 38 30 37 0a 64 6f 5f 65  36854775807.do_e
ecd0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
ece0: 33 31 2e 32 2e 32 20 7b 20 43 41 53 54 28 2d 32  31.2.2 { CAST(-2
ecf0: 65 2b 35 30 20 41 53 20 49 4e 54 29 20 7d 20 69  e+50 AS INT) } i
ed00: 6e 74 65 67 65 72 20 2d 39 32 32 33 33 37 32 30  nteger -92233720
ed10: 33 36 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65  36854775808.do_e
ed20: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
ed30: 33 31 2e 32 2e 33 20 7b 20 0a 20 20 43 41 53 54  31.2.3 { .  CAST
ed40: 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37  (-92233720368547
ed50: 37 35 38 30 39 2e 30 20 41 53 20 49 4e 54 29 0a  75809.0 AS INT).
ed60: 7d 20 69 6e 74 65 67 65 72 20 2d 39 32 32 33 33  } integer -92233
ed70: 37 32 30 33 36 38 35 34 37 37 35 38 30 38 0a 64  72036854775808.d
ed80: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
ed90: 70 72 2d 33 31 2e 32 2e 34 20 7b 20 0a 20 20 43  pr-31.2.4 { .  C
eda0: 41 53 54 28 39 32 32 33 33 37 32 30 33 36 38 35  AST(922337203685
edb0: 34 37 37 35 38 30 39 2e 30 20 41 53 20 49 4e 54  4775809.0 AS INT
edc0: 29 0a 7d 20 69 6e 74 65 67 65 72 20 39 32 32 33  ).} integer 9223
edd0: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 0a  372036854775807.
ede0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
edf0: 20 52 2d 35 35 30 38 34 2d 31 30 35 35 35 20 43   R-55084-10555 C
ee00: 61 73 74 69 6e 67 20 61 20 54 45 58 54 20 6f 72  asting a TEXT or
ee10: 20 42 4c 4f 42 20 76 61 6c 75 65 20 69 6e 74 6f   BLOB value into
ee20: 20 4e 55 4d 45 52 49 43 0a 23 20 79 69 65 6c 64   NUMERIC.# yield
ee30: 73 20 65 69 74 68 65 72 20 61 6e 20 49 4e 54 45  s either an INTE
ee40: 47 45 52 20 6f 72 20 61 20 52 45 41 4c 20 72 65  GER or a REAL re
ee50: 73 75 6c 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e  sult..#.# EVIDEN
ee60: 43 45 2d 4f 46 3a 20 52 2d 34 38 39 34 35 2d 30  CE-OF: R-48945-0
ee70: 34 38 36 36 20 49 66 20 74 68 65 20 69 6e 70 75  4866 If the inpu
ee80: 74 20 74 65 78 74 20 6c 6f 6f 6b 73 20 6c 69 6b  t text looks lik
ee90: 65 20 61 6e 20 69 6e 74 65 67 65 72 0a 23 20 28  e an integer.# (
eea0: 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 63 69  there is no deci
eeb0: 6d 61 6c 20 70 6f 69 6e 74 20 6e 6f 72 20 65 78  mal point nor ex
eec0: 70 6f 6e 65 6e 74 29 20 61 6e 64 20 74 68 65 20  ponent) and the 
eed0: 76 61 6c 75 65 20 69 73 20 73 6d 61 6c 6c 20 65  value is small e
eee0: 6e 6f 75 67 68 0a 23 20 74 6f 20 66 69 74 20 69  nough.# to fit i
eef0: 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65  n a 64-bit signe
ef00: 64 20 69 6e 74 65 67 65 72 2c 20 74 68 65 6e 20  d integer, then 
ef10: 74 68 65 20 72 65 73 75 6c 74 20 77 69 6c 6c 20  the result will 
ef20: 62 65 20 49 4e 54 45 47 45 52 2e 0a 23 0a 23 20  be INTEGER..#.# 
ef30: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
ef40: 37 30 34 35 2d 32 33 31 39 34 20 49 6e 70 75 74  7045-23194 Input
ef50: 20 74 65 78 74 20 74 68 61 74 20 6c 6f 6f 6b 73   text that looks
ef60: 20 6c 69 6b 65 20 66 6c 6f 61 74 69 6e 67 20 70   like floating p
ef70: 6f 69 6e 74 0a 23 20 28 74 68 65 72 65 20 69 73  oint.# (there is
ef80: 20 61 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74   a decimal point
ef90: 20 61 6e 64 2f 6f 72 20 61 6e 20 65 78 70 6f 6e   and/or an expon
efa0: 65 6e 74 29 20 61 6e 64 20 74 68 65 20 74 65 78  ent) and the tex
efb0: 74 20 64 65 73 63 72 69 62 65 73 20 61 0a 23 20  t describes a.# 
efc0: 76 61 6c 75 65 20 74 68 61 74 20 63 61 6e 20 62  value that can b
efd0: 65 20 6c 6f 73 73 6c 65 73 73 6c 79 20 63 6f 6e  e losslessly con
efe0: 76 65 72 74 65 64 20 62 61 63 6b 20 61 6e 64 20  verted back and 
eff0: 66 6f 72 74 68 20 62 65 74 77 65 65 6e 20 49 45  forth between IE
f000: 45 45 20 37 35 34 0a 23 20 36 34 2d 62 69 74 20  EE 754.# 64-bit 
f010: 66 6c 6f 61 74 20 61 6e 64 20 61 20 35 31 2d 62  float and a 51-b
f020: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
f030: 72 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  r, then the resu
f040: 6c 74 20 69 73 20 49 4e 54 45 47 45 52 2e 0a 23  lt is INTEGER..#
f050: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
f060: 65 78 70 72 2d 33 32 2e 31 2e 31 20 7b 20 43 41  expr-32.1.1 { CA
f070: 53 54 28 27 34 35 27 20 20 20 41 53 20 4e 55 4d  ST('45'   AS NUM
f080: 45 52 49 43 29 20 20 7d 20 69 6e 74 65 67 65 72  ERIC)  } integer
f090: 20 34 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74   45.do_expr_test
f0a0: 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e 32 20 7b   e_expr-32.1.2 {
f0b0: 20 43 41 53 54 28 27 34 35 2e 30 27 20 41 53 20   CAST('45.0' AS 
f0c0: 4e 55 4d 45 52 49 43 29 20 20 7d 20 69 6e 74 65  NUMERIC)  } inte
f0d0: 67 65 72 20 34 35 0a 64 6f 5f 65 78 70 72 5f 74  ger 45.do_expr_t
f0e0: 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e  est e_expr-32.1.
f0f0: 33 20 7b 20 43 41 53 54 28 27 34 35 2e 32 27 20  3 { CAST('45.2' 
f100: 41 53 20 4e 55 4d 45 52 49 43 29 20 20 7d 20 72  AS NUMERIC)  } r
f110: 65 61 6c 20 34 35 2e 32 0a 64 6f 5f 65 78 70 72  eal 45.2.do_expr
f120: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e  _test e_expr-32.
f130: 31 2e 34 20 7b 20 43 41 53 54 28 27 31 31 61 62  1.4 { CAST('11ab
f140: 63 27 20 41 53 20 4e 55 4d 45 52 49 43 29 20 7d  c' AS NUMERIC) }
f150: 20 69 6e 74 65 67 65 72 20 31 31 0a 64 6f 5f 65   integer 11.do_e
f160: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
f170: 33 32 2e 31 2e 35 20 7b 20 43 41 53 54 28 27 31  32.1.5 { CAST('1
f180: 31 2e 31 61 62 63 27 20 41 53 20 4e 55 4d 45 52  1.1abc' AS NUMER
f190: 49 43 29 20 7d 20 72 65 61 6c 20 31 31 2e 31 0a  IC) } real 11.1.
f1a0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
f1b0: 78 70 72 2d 33 32 2e 31 2e 36 20 7b 43 41 53 54  xpr-32.1.6 {CAST
f1c0: 28 20 27 39 2e 32 32 33 33 37 32 30 33 36 65 31  ( '9.223372036e1
f1d0: 34 27 20 41 53 20 4e 55 4d 45 52 49 43 29 7d 20  4' AS NUMERIC)} 
f1e0: 69 6e 74 65 67 65 72 20 20 39 32 32 33 33 37 32  integer  9223372
f1f0: 30 33 36 30 30 30 30 30 0a 64 6f 5f 65 78 70 72  03600000.do_expr
f200: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e  _test e_expr-32.
f210: 31 2e 37 20 7b 43 41 53 54 28 27 2d 39 2e 32 32  1.7 {CAST('-9.22
f220: 33 33 37 32 30 33 36 65 31 34 27 20 41 53 20 4e  3372036e14' AS N
f230: 55 4d 45 52 49 43 29 7d 20 69 6e 74 65 67 65 72  UMERIC)} integer
f240: 20 2d 39 32 32 33 33 37 32 30 33 36 30 30 30 30   -92233720360000
f250: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
f260: 5f 65 78 70 72 2d 33 32 2e 31 2e 38 20 7b 43 41  _expr-32.1.8 {CA
f270: 53 54 28 20 27 39 2e 32 32 33 33 37 32 30 33 36  ST( '9.223372036
f280: 65 31 35 27 20 41 53 20 4e 55 4d 45 52 49 43 29  e15' AS NUMERIC)
f290: 7d 20 72 65 61 6c 20 20 20 20 20 39 32 32 33 33  } real     92233
f2a0: 37 32 30 33 36 30 30 30 30 30 30 2e 30 0a 64 6f  72036000000.0.do
f2b0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
f2c0: 72 2d 33 32 2e 31 2e 39 20 7b 43 41 53 54 28 27  r-32.1.9 {CAST('
f2d0: 2d 39 2e 32 32 33 33 37 32 30 33 36 65 31 35 27  -9.223372036e15'
f2e0: 20 41 53 20 4e 55 4d 45 52 49 43 29 7d 20 72 65   AS NUMERIC)} re
f2f0: 61 6c 20 20 20 20 2d 39 32 32 33 33 37 32 30 33  al    -922337203
f300: 36 30 30 30 30 30 30 2e 30 0a 0a 0a 23 20 45 56  6000000.0...# EV
f310: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33  IDENCE-OF: R-503
f320: 30 30 2d 32 36 39 34 31 20 41 6e 79 20 74 65 78  00-26941 Any tex
f330: 74 20 69 6e 70 75 74 20 74 68 61 74 20 64 65 73  t input that des
f340: 63 72 69 62 65 73 20 61 20 76 61 6c 75 65 0a 23  cribes a value.#
f350: 20 6f 75 74 73 69 64 65 20 74 68 65 20 72 61 6e   outside the ran
f360: 67 65 20 6f 66 20 61 20 36 34 2d 62 69 74 20 73  ge of a 64-bit s
f370: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 79 69  igned integer yi
f380: 65 6c 64 73 20 61 20 52 45 41 4c 20 72 65 73 75  elds a REAL resu
f390: 6c 74 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65  lt..#.do_expr_te
f3a0: 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e 32  st e_expr-32.1.2
f3b0: 30 20 7b 20 43 41 53 54 28 27 39 32 32 33 33 37  0 { CAST('922337
f3c0: 32 30 33 36 38 35 34 37 37 35 38 30 37 27 20 41  2036854775807' A
f3d0: 53 20 6e 75 6d 65 72 69 63 29 20 7d 20 5c 0a 20  S numeric) } \. 
f3e0: 20 20 69 6e 74 65 67 65 72 20 39 32 32 33 33 37    integer 922337
f3f0: 32 30 33 36 38 35 34 37 37 35 38 30 37 0a 64 6f  2036854775807.do
f400: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
f410: 72 2d 33 32 2e 31 2e 32 31 20 7b 20 43 41 53 54  r-32.1.21 { CAST
f420: 28 27 39 32 32 33 33 37 32 30 33 36 38 35 34 37  ('92233720368547
f430: 37 35 38 30 38 27 20 41 53 20 6e 75 6d 65 72 69  75808' AS numeri
f440: 63 29 20 7d 20 5c 0a 20 20 20 72 65 61 6c 20 39  c) } \.   real 9
f450: 2e 32 32 33 33 37 32 30 33 36 38 35 34 37 38 65  .22337203685478e
f460: 2b 31 38 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  +18.do_expr_test
f470: 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e 32 32 20   e_expr-32.1.22 
f480: 7b 20 43 41 53 54 28 27 2d 39 32 32 33 33 37 32  { CAST('-9223372
f490: 30 33 36 38 35 34 37 37 35 38 30 38 27 20 41 53  036854775808' AS
f4a0: 20 6e 75 6d 65 72 69 63 29 20 7d 20 5c 0a 20 20   numeric) } \.  
f4b0: 20 69 6e 74 65 67 65 72 20 2d 39 32 32 33 33 37   integer -922337
f4c0: 32 30 33 36 38 35 34 37 37 35 38 30 38 0a 64 6f  2036854775808.do
f4d0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
f4e0: 72 2d 33 32 2e 31 2e 32 33 20 7b 20 43 41 53 54  r-32.1.23 { CAST
f4f0: 28 27 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  ('-9223372036854
f500: 37 37 35 38 30 39 27 20 41 53 20 6e 75 6d 65 72  775809' AS numer
f510: 69 63 29 20 7d 20 5c 0a 20 20 20 72 65 61 6c 20  ic) } \.   real 
f520: 2d 39 2e 32 32 33 33 37 32 30 33 36 38 35 34 37  -9.2233720368547
f530: 38 65 2b 31 38 0a 0a 23 20 45 56 49 44 45 4e 43  8e+18..# EVIDENC
f540: 45 2d 4f 46 3a 20 52 2d 33 30 33 34 37 2d 31 38  E-OF: R-30347-18
f550: 37 30 32 20 43 61 73 74 69 6e 67 20 61 20 52 45  702 Casting a RE
f560: 41 4c 20 6f 72 20 49 4e 54 45 47 45 52 20 76 61  AL or INTEGER va
f570: 6c 75 65 20 74 6f 20 4e 55 4d 45 52 49 43 0a 23  lue to NUMERIC.#
f580: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 65 76 65   is a no-op, eve
f590: 6e 20 69 66 20 61 20 72 65 61 6c 20 76 61 6c 75  n if a real valu
f5a0: 65 20 63 6f 75 6c 64 20 62 65 20 6c 6f 73 73 6c  e could be lossl
f5b0: 65 73 73 6c 79 20 63 6f 6e 76 65 72 74 65 64 20  essly converted 
f5c0: 74 6f 20 61 6e 0a 23 20 69 6e 74 65 67 65 72 2e  to an.# integer.
f5d0: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
f5e0: 65 5f 65 78 70 72 2d 33 32 2e 32 2e 31 20 7b 20  e_expr-32.2.1 { 
f5f0: 43 41 53 54 28 31 33 2e 30 20 41 53 20 4e 55 4d  CAST(13.0 AS NUM
f600: 45 52 49 43 29 20 7d 20 72 65 61 6c 20 31 33 2e  ERIC) } real 13.
f610: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
f620: 5f 65 78 70 72 2d 33 32 2e 32 2e 32 20 7b 20 43  _expr-32.2.2 { C
f630: 41 53 54 28 31 33 2e 35 20 41 53 20 4e 55 4d 45  AST(13.5 AS NUME
f640: 52 49 43 29 20 7d 20 72 65 61 6c 20 31 33 2e 35  RIC) } real 13.5
f650: 0a 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  ..do_expr_test e
f660: 5f 65 78 70 72 2d 33 32 2e 32 2e 33 20 7b 20 0a  _expr-32.2.3 { .
f670: 20 20 43 41 53 54 28 2d 39 32 32 33 33 37 32 30    CAST(-92233720
f680: 33 36 38 35 34 37 37 35 38 30 38 20 41 53 20 4e  36854775808 AS N
f690: 55 4d 45 52 49 43 29 0a 7d 20 69 6e 74 65 67 65  UMERIC).} intege
f6a0: 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  r -9223372036854
f6b0: 37 37 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74  775808.do_expr_t
f6c0: 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e  est e_expr-32.2.
f6d0: 34 20 7b 20 0a 20 20 43 41 53 54 28 39 32 32 33  4 { .  CAST(9223
f6e0: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 20  372036854775807 
f6f0: 41 53 20 4e 55 4d 45 52 49 43 29 0a 7d 20 69 6e  AS NUMERIC).} in
f700: 74 65 67 65 72 20 39 32 32 33 33 37 32 30 33 36  teger 9223372036
f710: 38 35 34 37 37 35 38 30 37 0a 64 6f 5f 65 78 70  854775807.do_exp
f720: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32  r_test e_expr-32
f730: 2e 32 2e 35 20 7b 20 0a 20 20 43 41 53 54 28 27  .2.5 { .  CAST('
f740: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
f750: 38 30 37 20 27 20 41 53 20 4e 55 4d 45 52 49 43  807 ' AS NUMERIC
f760: 29 0a 7d 20 69 6e 74 65 67 65 72 20 39 32 32 33  ).} integer 9223
f770: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 0a  372036854775807.
f780: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
f790: 78 70 72 2d 33 32 2e 32 2e 36 20 7b 20 0a 20 20  xpr-32.2.6 { .  
f7a0: 43 41 53 54 28 27 20 20 20 39 32 32 33 33 37 32  CAST('   9223372
f7b0: 30 33 36 38 35 34 37 37 35 38 30 37 20 20 20 27  036854775807   '
f7c0: 20 41 53 20 4e 55 4d 45 52 49 43 29 0a 7d 20 69   AS NUMERIC).} i
f7d0: 6e 74 65 67 65 72 20 39 32 32 33 33 37 32 30 33  nteger 922337203
f7e0: 36 38 35 34 37 37 35 38 30 37 0a 64 6f 5f 65 78  6854775807.do_ex
f7f0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
f800: 32 2e 32 2e 37 20 7b 20 0a 20 20 43 41 53 54 28  2.2.7 { .  CAST(
f810: 27 20 20 27 20 41 53 20 4e 55 4d 45 52 49 43 29  '  ' AS NUMERIC)
f820: 0a 7d 20 69 6e 74 65 67 65 72 20 30 0a 64 6f 5f  .} integer 0.do_
f830: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
f840: 78 70 72 2d 33 32 2e 32 2e 38 20 7b 0a 20 20 57  xpr-32.2.8 {.  W
f850: 49 54 48 20 74 31 28 78 29 20 41 53 20 28 56 41  ITH t1(x) AS (VA
f860: 4c 55 45 53 0a 20 20 20 20 20 28 27 39 30 30 30  LUES.     ('9000
f870: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 27  000000000000001'
f880: 29 2c 0a 20 20 20 20 20 28 27 39 30 30 30 30 30  ),.     ('900000
f890: 30 30 30 30 30 30 30 30 30 30 30 30 31 78 27 29  0000000000001x')
f8a0: 2c 0a 20 20 20 20 20 28 27 39 30 30 30 30 30 30  ,.     ('9000000
f8b0: 30 30 30 30 30 30 30 30 30 30 30 31 20 27 29 2c  000000000001 '),
f8c0: 0a 20 20 20 20 20 28 27 20 39 30 30 30 30 30 30  .     (' 9000000
f8d0: 30 30 30 30 30 30 30 30 30 30 30 31 20 27 29 2c  000000000001 '),
f8e0: 0a 20 20 20 20 20 28 27 20 39 30 30 30 30 30 30  .     (' 9000000
f8f0: 30 30 30 30 30 30 30 30 30 30 30 31 27 29 2c 0a  000000000001'),.
f900: 20 20 20 20 20 28 27 20 39 30 30 30 30 30 30 30       (' 90000000
f910: 30 30 30 30 30 30 30 30 30 30 31 2e 27 29 2c 0a  00000000001.'),.
f920: 20 20 20 20 20 28 27 39 32 32 33 33 37 32 30 33       ('922337203
f930: 36 38 35 34 37 37 35 38 30 37 27 29 2c 0a 20 20  6854775807'),.  
f940: 20 20 20 28 27 39 32 32 33 33 37 32 30 33 36 38     ('92233720368
f950: 35 34 37 37 35 38 30 37 20 27 29 2c 0a 20 20 20  54775807 '),.   
f960: 20 20 28 27 20 20 20 39 32 32 33 33 37 32 30 33    ('   922337203
f970: 36 38 35 34 37 37 35 38 30 37 20 20 20 27 29 2c  6854775807   '),
f980: 0a 20 20 20 20 20 28 27 39 32 32 33 33 37 32 30  .     ('92233720
f990: 33 36 38 35 34 37 37 35 38 30 38 27 29 2c 0a 20  36854775808'),. 
f9a0: 20 20 20 20 28 27 20 20 20 39 32 32 33 33 37 32      ('   9223372
f9b0: 30 33 36 38 35 34 37 37 35 38 30 38 20 20 20 27  036854775808   '
f9c0: 29 2c 0a 20 20 20 20 20 28 27 39 32 32 33 33 37  ),.     ('922337
f9d0: 32 30 33 36 38 35 34 37 37 35 38 30 37 2e 30 27  2036854775807.0'
f9e0: 29 2c 0a 20 20 20 20 20 28 27 39 32 32 33 33 37  ),.     ('922337
f9f0: 32 30 33 36 38 35 34 37 37 35 38 30 37 65 2b 30  2036854775807e+0
fa00: 27 29 2c 0a 20 20 20 20 20 28 27 2d 35 2e 30 27  '),.     ('-5.0'
fa10: 29 2c 0a 20 20 20 20 20 28 27 2d 35 65 2b 30 27  ),.     ('-5e+0'
fa20: 29 29 0a 20 20 53 45 4c 45 43 54 20 74 79 70 65  )).  SELECT type
fa30: 6f 66 28 43 41 53 54 28 78 20 41 53 20 4e 55 4d  of(CAST(x AS NUM
fa40: 45 52 49 43 29 29 2c 20 43 41 53 54 28 78 20 41  ERIC)), CAST(x A
fa50: 53 20 4e 55 4d 45 52 49 43 29 7c 7c 27 27 20 46  S NUMERIC)||'' F
fa60: 52 4f 4d 20 74 31 3b 0a 7d 20 5b 6c 69 73 74 20  ROM t1;.} [list 
fa70: 5c 0a 20 69 6e 74 65 67 65 72 20 39 30 30 30 30  \. integer 90000
fa80: 30 30 30 30 30 30 30 30 30 30 30 30 30 31 20 5c  00000000000001 \
fa90: 0a 20 69 6e 74 65 67 65 72 20 39 30 30 30 30 30  . integer 900000
faa0: 30 30 30 30 30 30 30 30 30 30 30 30 31 20 5c 0a  0000000000001 \.
fab0: 20 69 6e 74 65 67 65 72 20 39 30 30 30 30 30 30   integer 9000000
fac0: 30 30 30 30 30 30 30 30 30 30 30 31 20 5c 0a 20  000000000001 \. 
fad0: 69 6e 74 65 67 65 72 20 39 30 30 30 30 30 30 30  integer 90000000
fae0: 30 30 30 30 30 30 30 30 30 30 31 20 5c 0a 20 69  00000000001 \. i
faf0: 6e 74 65 67 65 72 20 39 30 30 30 30 30 30 30 30  nteger 900000000
fb00: 30 30 30 30 30 30 30 30 30 31 20 5c 0a 20 72 65  0000000001 \. re
fb10: 61 6c 20 39 2e 30 65 2b 31 38 20 5c 0a 20 69 6e  al 9.0e+18 \. in
fb20: 74 65 67 65 72 20 39 32 32 33 33 37 32 30 33 36  teger 9223372036
fb30: 38 35 34 37 37 35 38 30 37 20 5c 0a 20 69 6e 74  854775807 \. int
fb40: 65 67 65 72 20 39 32 32 33 33 37 32 30 33 36 38  eger 92233720368
fb50: 35 34 37 37 35 38 30 37 20 5c 0a 20 69 6e 74 65  54775807 \. inte
fb60: 67 65 72 20 39 32 32 33 33 37 32 30 33 36 38 35  ger 922337203685
fb70: 34 37 37 35 38 30 37 20 5c 0a 20 72 65 61 6c 20  4775807 \. real 
fb80: 39 2e 32 32 33 33 37 32 30 33 36 38 35 34 37 38  9.22337203685478
fb90: 65 2b 31 38 20 5c 0a 20 72 65 61 6c 20 39 2e 32  e+18 \. real 9.2
fba0: 32 33 33 37 32 30 33 36 38 35 34 37 38 65 2b 31  2337203685478e+1
fbb0: 38 20 5c 0a 20 72 65 61 6c 20 39 2e 32 32 33 33  8 \. real 9.2233
fbc0: 37 32 30 33 36 38 35 34 37 38 65 2b 31 38 20 5c  7203685478e+18 \
fbd0: 0a 20 72 65 61 6c 20 39 2e 32 32 33 33 37 32 30  . real 9.2233720
fbe0: 33 36 38 35 34 37 38 65 2b 31 38 20 5c 0a 20 69  3685478e+18 \. i
fbf0: 6e 74 65 67 65 72 20 2d 35 20 5c 0a 20 69 6e 74  nteger -5 \. int
fc00: 65 67 65 72 20 2d 35 20 5c 0a 5d 0a 0a 23 20 45  eger -5 \.]..# E
fc10: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34  VIDENCE-OF: R-64
fc20: 35 35 30 2d 32 39 31 39 31 20 4e 6f 74 65 20 74  550-29191 Note t
fc30: 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 66  hat the result f
fc40: 72 6f 6d 20 63 61 73 74 69 6e 67 20 61 6e 79 0a  rom casting any.
fc50: 23 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65  # non-BLOB value
fc60: 20 69 6e 74 6f 20 61 20 42 4c 4f 42 20 61 6e 64   into a BLOB and
fc70: 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d   the result from
fc80: 20 63 61 73 74 69 6e 67 20 61 6e 79 20 42 4c 4f   casting any BLO
fc90: 42 20 76 61 6c 75 65 0a 23 20 69 6e 74 6f 20 61  B value.# into a
fca0: 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65 20   non-BLOB value 
fcb0: 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74  may be different
fcc0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
fcd0: 65 74 68 65 72 20 74 68 65 0a 23 20 64 61 74 61  ether the.# data
fce0: 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 69 73  base encoding is
fcf0: 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 62 65   UTF-8, UTF-16be
fd00: 2c 20 6f 72 20 55 54 46 2d 31 36 6c 65 2e 0a 23  , or UTF-16le..#
fd10: 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66 31  .ifcapable {utf1
fd20: 36 7d 20 7b 0a 73 71 6c 69 74 65 33 20 64 62 31  6} {.sqlite3 db1
fd30: 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 31 20   :memory: ; db1 
fd40: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e  eval { PRAGMA en
fd50: 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 38 27  coding = 'utf-8'
fd60: 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 32 20 3a   }.sqlite3 db2 :
fd70: 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 32 20 65 76  memory: ; db2 ev
fd80: 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f  al { PRAGMA enco
fd90: 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65  ding = 'utf-16le
fda0: 27 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 33 20  ' }.sqlite3 db3 
fdb0: 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 33 20 65  :memory: ; db3 e
fdc0: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63  val { PRAGMA enc
fdd0: 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 62  oding = 'utf-16b
fde0: 65 27 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  e' }.foreach {tn
fdf0: 20 63 61 73 74 65 78 70 72 20 64 69 66 66 65 72   castexpr differ
fe00: 73 7d 20 7b 0a 20 20 31 20 7b 20 43 41 53 54 28  s} {.  1 { CAST(
fe10: 31 32 33 20 41 53 20 42 4c 4f 42 29 20 20 20 20  123 AS BLOB)    
fe20: 7d 20 31 0a 20 20 32 20 7b 20 43 41 53 54 28 27  } 1.  2 { CAST('
fe30: 27 20 41 53 20 42 4c 4f 42 29 20 20 20 20 20 7d  ' AS BLOB)     }
fe40: 20 30 0a 20 20 33 20 7b 20 43 41 53 54 28 27 61   0.  3 { CAST('a
fe50: 62 63 64 27 20 41 53 20 42 4c 4f 42 29 20 7d 20  bcd' AS BLOB) } 
fe60: 31 0a 0a 20 20 34 20 7b 20 43 41 53 54 28 58 27  1..  4 { CAST(X'
fe70: 61 62 63 64 27 20 41 53 20 54 45 58 54 29 20 7d  abcd' AS TEXT) }
fe80: 20 31 0a 20 20 35 20 7b 20 43 41 53 54 28 58 27   1.  5 { CAST(X'
fe90: 27 20 41 53 20 54 45 58 54 29 20 20 20 20 20 7d  ' AS TEXT)     }
fea0: 20 30 0a 7d 20 7b 0a 20 20 73 65 74 20 72 31 20   0.} {.  set r1 
feb0: 5b 64 62 31 20 65 76 61 6c 20 22 53 45 4c 45 43  [db1 eval "SELEC
fec0: 54 20 74 79 70 65 6f 66 28 24 63 61 73 74 65 78  T typeof($castex
fed0: 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61 73 74  pr), quote($cast
fee0: 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20 72 32  expr)"].  set r2
fef0: 20 5b 64 62 32 20 65 76 61 6c 20 22 53 45 4c 45   [db2 eval "SELE
ff00: 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74 65  CT typeof($caste
ff10: 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61 73  xpr), quote($cas
ff20: 74 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20 72  texpr)"].  set r
ff30: 33 20 5b 64 62 33 20 65 76 61 6c 20 22 53 45 4c  3 [db3 eval "SEL
ff40: 45 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74  ECT typeof($cast
ff50: 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61  expr), quote($ca
ff60: 73 74 65 78 70 72 29 22 5d 0a 0a 20 20 69 66 20  stexpr)"]..  if 
ff70: 7b 24 64 69 66 66 65 72 73 7d 20 7b 0a 20 20 20  {$differs} {.   
ff80: 20 73 65 74 20 72 65 73 20 5b 65 78 70 72 20 7b   set res [expr {
ff90: 24 72 31 21 3d 24 72 32 20 26 26 20 24 72 32 21  $r1!=$r2 && $r2!
ffa0: 3d 24 72 33 7d 5d 0a 20 20 7d 20 65 6c 73 65 20  =$r3}].  } else 
ffb0: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b 65  {.    set res [e
ffc0: 78 70 72 20 7b 24 72 31 3d 3d 24 72 32 20 26 26  xpr {$r1==$r2 &&
ffd0: 20 24 72 32 3d 3d 24 72 33 7d 5d 0a 20 20 7d 0a   $r2==$r3}].  }.
ffe0: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 65 78 70  .  do_test e_exp
fff0: 72 2d 33 33 2e 31 2e 24 74 6e 20 7b 73 65 74 20  r-33.1.$tn {set 
10000 72 65 73 7d 20 31 0a 7d 0a 64 62 31 20 63 6c 6f  res} 1.}.db1 clo
10010 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 64 62 33  se.db2 close.db3
10020 20 63 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d   close.}..#-----
10030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10070 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74  ----.# Test stat
10080 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74  ements related t
10090 6f 20 74 68 65 20 45 58 49 53 54 53 20 61 6e 64  o the EXISTS and
100a0 20 4e 4f 54 20 45 58 49 53 54 53 20 6f 70 65 72   NOT EXISTS oper
100b0 61 74 6f 72 73 2e 0a 23 0a 63 61 74 63 68 20 7b  ators..#.catch {
100c0 20 64 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63   db close }.forc
100d0 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a  edelete test.db.
100e0 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
100f0 64 62 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  db..do_execsql_t
10100 65 73 74 20 65 5f 65 78 70 72 2d 33 34 2e 31 20  est e_expr-34.1 
10110 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
10120 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53   t1(a, b);.  INS
10130 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
10140 45 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45  ES(1, 2);.  INSE
10150 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
10160 53 28 4e 55 4c 4c 2c 20 32 29 3b 0a 20 20 49 4e  S(NULL, 2);.  IN
10170 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
10180 55 45 53 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20  UES(1, NULL);.  
10190 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
101a0 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c  ALUES(NULL, NULL
101b0 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44 45  );.} {}..# EVIDE
101c0 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 35 38 38 2d  NCE-OF: R-25588-
101d0 32 37 31 38 31 20 54 68 65 20 45 58 49 53 54 53  27181 The EXISTS
101e0 20 6f 70 65 72 61 74 6f 72 20 61 6c 77 61 79 73   operator always
101f0 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 6f 6e   evaluates to on
10200 65 0a 23 20 6f 66 20 74 68 65 20 69 6e 74 65 67  e.# of the integ
10210 65 72 20 76 61 6c 75 65 73 20 30 20 61 6e 64 20  er values 0 and 
10220 31 2e 0a 23 0a 23 20 54 68 69 73 20 73 74 61 74  1..#.# This stat
10230 65 6d 65 6e 74 20 69 73 20 6e 6f 74 20 74 65 73  ement is not tes
10240 74 65 64 20 62 79 20 69 74 73 65 6c 66 2e 20 49  ted by itself. I
10250 6e 73 74 65 61 64 2c 20 61 6c 6c 20 65 5f 65 78  nstead, all e_ex
10260 70 72 2d 33 34 2e 2a 20 74 65 73 74 73 20 0a 23  pr-34.* tests .#
10270 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
10280 70 6f 69 6e 74 20 65 78 70 6c 69 63 69 74 6c 79  point explicitly
10290 20 74 65 73 74 20 74 68 61 74 20 73 70 65 63 69   test that speci
102a0 66 69 63 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  fic invocations 
102b0 6f 66 20 45 58 49 53 54 53 0a 23 20 72 65 74 75  of EXISTS.# retu
102c0 72 6e 20 65 69 74 68 65 72 20 69 6e 74 65 67 65  rn either intege
102d0 72 20 30 20 6f 72 20 69 6e 74 65 67 65 72 20 31  r 0 or integer 1
102e0 2e 0a 23 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  ..#..# EVIDENCE-
102f0 4f 46 3a 20 52 2d 35 38 35 35 33 2d 36 33 37 34  OF: R-58553-6374
10300 30 20 49 66 20 65 78 65 63 75 74 69 6e 67 20 74  0 If executing t
10310 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
10320 65 6e 74 20 73 70 65 63 69 66 69 65 64 0a 23 20  ent specified.# 
10330 61 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  as the right-han
10340 64 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65  d operand of the
10350 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
10360 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e   would return on
10370 65 20 6f 72 0a 23 20 6d 6f 72 65 20 72 6f 77 73  e or.# more rows
10380 2c 20 74 68 65 6e 20 74 68 65 20 45 58 49 53 54  , then the EXIST
10390 53 20 6f 70 65 72 61 74 6f 72 20 65 76 61 6c 75  S operator evalu
103a0 61 74 65 73 20 74 6f 20 31 2e 0a 23 0a 66 6f 72  ates to 1..#.for
103b0 65 61 63 68 20 7b 74 6e 20 65 78 70 72 7d 20 7b  each {tn expr} {
103c0 0a 20 20 20 20 31 20 7b 20 45 58 49 53 54 53 20  .    1 { EXISTS 
103d0 28 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  ( SELECT a FROM 
103e0 74 31 20 29 20 7d 0a 20 20 20 20 32 20 7b 20 45  t1 ) }.    2 { E
103f0 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 62  XISTS ( SELECT b
10400 20 46 52 4f 4d 20 74 31 20 29 20 7d 0a 20 20 20   FROM t1 ) }.   
10410 20 33 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   3 { EXISTS ( SE
10420 4c 45 43 54 20 32 34 20 29 20 7d 0a 20 20 20 20  LECT 24 ) }.    
10430 34 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c  4 { EXISTS ( SEL
10440 45 43 54 20 4e 55 4c 4c 20 29 20 7d 0a 20 20 20  ECT NULL ) }.   
10450 20 35 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   5 { EXISTS ( SE
10460 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57  LECT a FROM t1 W
10470 48 45 52 45 20 61 20 49 53 20 4e 55 4c 4c 20 29  HERE a IS NULL )
10480 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70 72   }.} {.  do_expr
10490 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34 2e  _test e_expr-34.
104a0 32 2e 24 74 6e 20 24 65 78 70 72 20 69 6e 74 65  2.$tn $expr inte
104b0 67 65 72 20 31 0a 7d 0a 0a 23 20 45 56 49 44 45  ger 1.}..# EVIDE
104c0 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 36 37 33 2d  NCE-OF: R-19673-
104d0 34 30 39 37 32 20 49 66 20 65 78 65 63 75 74 69  40972 If executi
104e0 6e 67 20 74 68 65 20 53 45 4c 45 43 54 20 77 6f  ng the SELECT wo
104f0 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f 0a 23 20  uld return no.# 
10500 72 6f 77 73 20 61 74 20 61 6c 6c 2c 20 74 68 65  rows at all, the
10510 6e 20 74 68 65 20 45 58 49 53 54 53 20 6f 70 65  n the EXISTS ope
10520 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73 20  rator evaluates 
10530 74 6f 20 30 2e 0a 23 0a 66 6f 72 65 61 63 68 20  to 0..#.foreach 
10540 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20 20  {tn expr} {.    
10550 31 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c  1 { EXISTS ( SEL
10560 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48  ECT a FROM t1 WH
10570 45 52 45 20 30 29 20 7d 0a 20 20 20 20 32 20 7b  ERE 0) }.    2 {
10580 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54   EXISTS ( SELECT
10590 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   b FROM t1 WHERE
105a0 20 61 20 3d 20 35 29 20 7d 0a 20 20 20 20 33 20   a = 5) }.    3 
105b0 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43  { EXISTS ( SELEC
105c0 54 20 32 34 20 57 48 45 52 45 20 30 29 20 7d 0a  T 24 WHERE 0) }.
105d0 20 20 20 20 34 20 7b 20 45 58 49 53 54 53 20 28      4 { EXISTS (
105e0 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 57 48 45   SELECT NULL WHE
105f0 52 45 20 31 3d 32 29 20 7d 0a 7d 20 7b 0a 20 20  RE 1=2) }.} {.  
10600 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
10610 78 70 72 2d 33 34 2e 33 2e 24 74 6e 20 24 65 78  xpr-34.3.$tn $ex
10620 70 72 20 69 6e 74 65 67 65 72 20 30 0a 7d 0a 0a  pr integer 0.}..
10630 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
10640 2d 33 35 31 30 39 2d 34 39 31 33 39 20 54 68 65  -35109-49139 The
10650 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
10660 6e 73 20 69 6e 20 65 61 63 68 20 72 6f 77 20 72  ns in each row r
10670 65 74 75 72 6e 65 64 0a 23 20 62 79 20 74 68 65  eturned.# by the
10680 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10690 74 20 28 69 66 20 61 6e 79 29 20 61 6e 64 20 74  t (if any) and t
106a0 68 65 20 73 70 65 63 69 66 69 63 20 76 61 6c 75  he specific valu
106b0 65 73 20 72 65 74 75 72 6e 65 64 20 68 61 76 65  es returned have
106c0 0a 23 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20  .# no effect on 
106d0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
106e0 68 65 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  he EXISTS operat
106f0 6f 72 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  or..#.foreach {t
10700 6e 20 65 78 70 72 20 72 65 73 7d 20 7b 0a 20 20  n expr res} {.  
10710 20 20 31 20 7b 20 45 58 49 53 54 53 20 28 20 53    1 { EXISTS ( S
10720 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
10730 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ) }             
10740 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 20               1. 
10750 20 20 20 32 20 7b 20 45 58 49 53 54 53 20 28 20     2 { EXISTS ( 
10760 53 45 4c 45 43 54 20 2a 2c 20 2a 2c 20 2a 20 46  SELECT *, *, * F
10770 52 4f 4d 20 74 31 20 29 20 7d 20 20 20 20 20 20  ROM t1 ) }      
10780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
10790 20 20 20 20 33 20 7b 20 45 58 49 53 54 53 20 28      3 { EXISTS (
107a0 20 53 45 4c 45 43 54 20 32 34 2c 20 32 35 20 29   SELECT 24, 25 )
107b0 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
107d0 0a 20 20 20 20 34 20 7b 20 45 58 49 53 54 53 20  .    4 { EXISTS 
107e0 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 4e  ( SELECT NULL, N
107f0 55 4c 4c 2c 20 4e 55 4c 4c 20 29 20 7d 20 20 20  ULL, NULL ) }   
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 31 0a 20 20 20 20 35 20 7b 20 45 58 49 53 54 53  1.    5 { EXISTS
10820 20 28 20 53 45 4c 45 43 54 20 61 2c 62 2c 61 7c   ( SELECT a,b,a|
10830 7c 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  |b FROM t1 WHERE
10840 20 61 20 49 53 20 4e 55 4c 4c 20 29 20 7d 20 20   a IS NULL ) }  
10850 20 31 0a 0a 20 20 20 20 36 20 7b 20 45 58 49 53   1..    6 { EXIS
10860 54 53 20 28 20 53 45 4c 45 43 54 20 61 2c 20 61  TS ( SELECT a, a
10870 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 30   FROM t1 WHERE 0
10880 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ) }             
10890 20 20 20 30 0a 20 20 20 20 37 20 7b 20 45 58 49     0.    7 { EXI
108a0 53 54 53 20 28 20 53 45 4c 45 43 54 20 62 2c 20  STS ( SELECT b, 
108b0 62 2c 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  b, a FROM t1 WHE
108c0 52 45 20 61 20 3d 20 35 29 20 7d 20 20 20 20 20  RE a = 5) }     
108d0 20 20 20 20 30 0a 20 20 20 20 38 20 7b 20 45 58      0.    8 { EX
108e0 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 32 34  ISTS ( SELECT 24
108f0 2c 20 34 36 2c 20 38 39 20 57 48 45 52 45 20 30  , 46, 89 WHERE 0
10900 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ) }             
10910 20 20 20 20 20 30 0a 20 20 20 20 39 20 7b 20 45       0.    9 { E
10920 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 4e  XISTS ( SELECT N
10930 55 4c 4c 2c 20 4e 55 4c 4c 20 57 48 45 52 45 20  ULL, NULL WHERE 
10940 31 3d 32 29 20 7d 20 20 20 20 20 20 20 20 20 20  1=2) }          
10950 20 20 20 20 20 20 30 0a 7d 20 7b 0a 20 20 64 6f        0.} {.  do
10960 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
10970 72 2d 33 34 2e 34 2e 24 74 6e 20 24 65 78 70 72  r-34.4.$tn $expr
10980 20 69 6e 74 65 67 65 72 20 24 72 65 73 0a 7d 0a   integer $res.}.
10990 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
109a0 52 2d 31 30 36 34 35 2d 31 32 34 33 39 20 49 6e  R-10645-12439 In
109b0 20 70 61 72 74 69 63 75 6c 61 72 2c 20 72 6f 77   particular, row
109c0 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55 4c  s containing NUL
109d0 4c 20 76 61 6c 75 65 73 0a 23 20 61 72 65 20 6e  L values.# are n
109e0 6f 74 20 68 61 6e 64 6c 65 64 20 61 6e 79 20 64  ot handled any d
109f0 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20  ifferently from 
10a00 72 6f 77 73 20 77 69 74 68 6f 75 74 20 4e 55 4c  rows without NUL
10a10 4c 20 76 61 6c 75 65 73 2e 0a 23 0a 66 6f 72 65  L values..#.fore
10a20 61 63 68 20 7b 74 6e 20 65 31 20 65 32 7d 20 7b  ach {tn e1 e2} {
10a30 0a 20 20 31 20 7b 20 45 58 49 53 54 53 20 28 53  .  1 { EXISTS (S
10a40 45 4c 45 43 54 20 27 6e 6f 74 20 6e 75 6c 6c 27  ELECT 'not null'
10a50 29 20 7d 20 20 20 20 7b 20 45 58 49 53 54 53 20  ) }    { EXISTS 
10a60 28 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d 0a  (SELECT NULL) }.
10a70 20 20 32 20 7b 20 45 58 49 53 54 53 20 28 53 45    2 { EXISTS (SE
10a80 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74  LECT NULL FROM t
10a90 31 29 20 7d 20 20 7b 20 45 58 49 53 54 53 20 28  1) }  { EXISTS (
10aa0 53 45 4c 45 43 54 20 27 62 72 65 61 64 27 20 46  SELECT 'bread' F
10ab0 52 4f 4d 20 74 31 29 20 7d 0a 7d 20 7b 0a 20 20  ROM t1) }.} {.  
10ac0 73 65 74 20 72 65 73 20 5b 64 62 20 6f 6e 65 20  set res [db one 
10ad0 22 53 45 4c 45 43 54 20 24 65 31 22 5d 0a 20 20  "SELECT $e1"].  
10ae0 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
10af0 78 70 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d 61 20  xpr-34.5.${tn}a 
10b00 24 65 31 20 69 6e 74 65 67 65 72 20 24 72 65 73  $e1 integer $res
10b10 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .  do_expr_test 
10b20 65 5f 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74 6e  e_expr-34.5.${tn
10b30 7d 62 20 24 65 32 20 69 6e 74 65 67 65 72 20 24  }b $e2 integer $
10b40 72 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  res.}..#--------
10b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b90 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65 6d 65  -.# Test stateme
10ba0 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 73  nts related to s
10bb0 63 61 6c 61 72 20 73 75 62 2d 71 75 65 72 69 65  calar sub-querie
10bc0 73 2e 0a 23 0a 0a 63 61 74 63 68 20 7b 20 64 62  s..#..catch { db
10bd0 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64 65   close }.forcede
10be0 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 73 71 6c  lete test.db.sql
10bf0 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
10c00 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  do_test e_expr-3
10c10 35 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.0 {.  execsql 
10c20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
10c30 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  LE t2(a, b);.   
10c40 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
10c50 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 74  VALUES('one', 't
10c60 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  wo');.    INSERT
10c70 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
10c80 27 74 68 72 65 65 27 2c 20 4e 55 4c 4c 29 3b 0a  'three', NULL);.
10c90 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10ca0 74 32 20 56 41 4c 55 45 53 28 34 2c 20 35 2e 30  t2 VALUES(4, 5.0
10cb0 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 45  );.  }.} {}..# E
10cc0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
10cd0 35 37 33 2d 32 33 34 34 38 20 41 20 53 45 4c 45  573-23448 A SELE
10ce0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 65 6e 63  CT statement enc
10cf0 6c 6f 73 65 64 20 69 6e 20 70 61 72 65 6e 74 68  losed in parenth
10d00 65 73 65 73 0a 23 20 69 73 20 61 20 73 75 62 71  eses.# is a subq
10d10 75 65 72 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e  uery..#.# EVIDEN
10d20 43 45 2d 4f 46 3a 20 52 2d 35 36 32 39 34 2d 30  CE-OF: R-56294-0
10d30 33 39 36 36 20 41 6c 6c 20 74 79 70 65 73 20 6f  3966 All types o
10d40 66 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  f SELECT stateme
10d50 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 0a 23 20  nt, including.# 
10d60 61 67 67 72 65 67 61 74 65 20 61 6e 64 20 63 6f  aggregate and co
10d70 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 71 75  mpound SELECT qu
10d80 65 72 69 65 73 20 28 71 75 65 72 69 65 73 20 77  eries (queries w
10d90 69 74 68 20 6b 65 79 77 6f 72 64 73 20 6c 69 6b  ith keywords lik
10da0 65 0a 23 20 55 4e 49 4f 4e 20 6f 72 20 45 58 43  e.# UNION or EXC
10db0 45 50 54 29 20 61 72 65 20 61 6c 6c 6f 77 65 64  EPT) are allowed
10dc0 20 61 73 20 73 63 61 6c 61 72 20 73 75 62 71 75   as scalar subqu
10dd0 65 72 69 65 73 2e 0a 23 0a 64 6f 5f 65 78 70 72  eries..#.do_expr
10de0 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e  _test e_expr-35.
10df0 31 2e 31 20 7b 20 28 53 45 4c 45 43 54 20 33 35  1.1 { (SELECT 35
10e00 29 20 20 20 7d 20 69 6e 74 65 67 65 72 20 33 35  )   } integer 35
10e10 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
10e20 65 78 70 72 2d 33 35 2e 31 2e 32 20 7b 20 28 53  expr-35.1.2 { (S
10e30 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d 20 6e 75  ELECT NULL) } nu
10e40 6c 6c 20 7b 7d 0a 0a 64 6f 5f 65 78 70 72 5f 74  ll {}..do_expr_t
10e50 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e  est e_expr-35.1.
10e60 33 20 7b 20 28 53 45 4c 45 43 54 20 63 6f 75 6e  3 { (SELECT coun
10e70 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 7d 20  t(*) FROM t2) } 
10e80 69 6e 74 65 67 65 72 20 33 0a 64 6f 5f 65 78 70  integer 3.do_exp
10e90 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35  r_test e_expr-35
10ea0 2e 31 2e 34 20 7b 20 28 53 45 4c 45 43 54 20 34  .1.4 { (SELECT 4
10eb0 20 46 52 4f 4d 20 74 32 29 20 7d 20 69 6e 74 65   FROM t2) } inte
10ec0 67 65 72 20 34 0a 0a 64 6f 5f 65 78 70 72 5f 74  ger 4..do_expr_t
10ed0 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e  est e_expr-35.1.
10ee0 35 20 7b 20 0a 20 20 28 53 45 4c 45 43 54 20 62  5 { .  (SELECT b
10ef0 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
10f00 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 74  ELECT a+1 FROM t
10f10 32 29 0a 7d 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f  2).} null {}.do_
10f20 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
10f30 2d 33 35 2e 31 2e 36 20 7b 20 0a 20 20 28 53 45  -35.1.6 { .  (SE
10f40 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 32 20 55  LECT a FROM t2 U
10f50 4e 49 4f 4e 20 53 45 4c 45 43 54 20 43 4f 41 4c  NION SELECT COAL
10f60 45 53 43 45 28 62 2c 20 35 35 29 20 46 52 4f 4d  ESCE(b, 55) FROM
10f70 20 74 32 20 4f 52 44 45 52 20 42 59 20 31 29 0a   t2 ORDER BY 1).
10f80 7d 20 69 6e 74 65 67 65 72 20 34 0a 0a 23 20 45  } integer 4..# E
10f90 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32  VIDENCE-OF: R-22
10fa0 32 33 39 2d 33 33 37 34 30 20 41 20 73 75 62 71  239-33740 A subq
10fb0 75 65 72 79 20 74 68 61 74 20 72 65 74 75 72 6e  uery that return
10fc0 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f  s two or more co
10fd0 6c 75 6d 6e 73 0a 23 20 69 73 20 61 20 72 6f 77  lumns.# is a row
10fe0 20 76 61 6c 75 65 20 73 75 62 71 75 65 72 79 20   value subquery 
10ff0 61 6e 64 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  and can only be 
11000 75 73 65 64 20 61 73 20 74 68 65 20 6f 70 65 72  used as the oper
11010 61 6e 64 20 6f 66 20 61 0a 23 20 63 6f 6d 70 61  and of a.# compa
11020 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
11030 23 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  #.# The followin
11040 67 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 74 68  g block tests th
11050 61 74 20 65 72 72 6f 72 73 20 61 72 65 20 72 65  at errors are re
11060 74 75 72 6e 65 64 20 69 6e 20 61 20 62 75 6e 63  turned in a bunc
11070 68 20 6f 66 20 63 61 73 65 73 0a 23 20 77 68 65  h of cases.# whe
11080 72 65 20 61 20 73 75 62 71 75 65 72 79 20 72 65  re a subquery re
11090 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  turns more than 
110a0 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 73 65  one column..#.se
110b0 74 20 4d 20 7b 2f 31 20 7b 73 75 62 2d 73 65 6c  t M {/1 {sub-sel
110c0 65 63 74 20 72 65 74 75 72 6e 73 20 5b 32 33 5d  ect returns [23]
110d0 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
110e0 74 65 64 20 31 7d 2f 7d 0a 66 6f 72 65 61 63 68  ted 1}/}.foreach
110f0 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20 31 20   {tn sql} {.  1 
11100 20 20 20 20 7b 20 53 45 4c 45 43 54 20 28 53 45      { SELECT (SE
11110 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 55  LECT * FROM t2 U
11120 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61 2b 31 2c  NION SELECT a+1,
11130 20 62 2b 31 20 46 52 4f 4d 20 74 32 29 20 7d 0a   b+1 FROM t2) }.
11140 20 20 32 20 20 20 20 20 7b 20 53 45 4c 45 43 54    2     { SELECT
11150 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
11160 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
11170 61 2b 31 2c 20 62 2b 31 20 46 52 4f 4d 20 74 32  a+1, b+1 FROM t2
11180 20 4f 52 44 45 52 20 42 59 20 31 29 20 7d 0a 20   ORDER BY 1) }. 
11190 20 33 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20   3     { SELECT 
111a0 28 53 45 4c 45 43 54 20 31 2c 20 32 29 20 7d 0a  (SELECT 1, 2) }.
111b0 20 20 34 20 20 20 20 20 7b 20 53 45 4c 45 43 54    4     { SELECT
111c0 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 4e   (SELECT NULL, N
111d0 55 4c 4c 2c 20 4e 55 4c 4c 29 20 7d 0a 20 20 35  ULL, NULL) }.  5
111e0 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20 28 53       { SELECT (S
111f0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 29  ELECT * FROM t2)
11200 20 7d 0a 20 20 36 20 20 20 20 20 7b 20 53 45 4c   }.  6     { SEL
11210 45 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46 52  ECT (SELECT * FR
11220 4f 4d 20 28 53 45 4c 45 43 54 20 31 2c 20 32 2c  OM (SELECT 1, 2,
11230 20 33 29 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f   3)) }.} {.  do_
11240 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f  catchsql_test e_
11250 65 78 70 72 2d 33 35 2e 32 2e 24 74 6e 20 24 73  expr-35.2.$tn $s
11260 71 6c 20 24 4d 0a 7d 0a 0a 23 20 45 56 49 44 45  ql $M.}..# EVIDE
11270 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 33 31 38 2d  NCE-OF: R-18318-
11280 31 34 39 39 35 20 54 68 65 20 76 61 6c 75 65 20  14995 The value 
11290 6f 66 20 61 20 73 75 62 71 75 65 72 79 20 65 78  of a subquery ex
112a0 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 0a  pression is the.
112b0 23 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 74  # first row of t
112c0 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d 20 74  he result from t
112d0 68 65 20 65 6e 63 6c 6f 73 65 64 20 53 45 4c 45  he enclosed SELE
112e0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a  CT statement..#.
112f0 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
11300 2d 31 35 39 30 30 2d 35 32 31 35 36 20 49 6e 20  -15900-52156 In 
11310 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 6e 20  other words, an 
11320 69 6d 70 6c 69 65 64 20 22 4c 49 4d 49 54 20 31  implied "LIMIT 1
11330 22 20 69 73 0a 23 20 61 64 64 65 64 20 74 6f 20  " is.# added to 
11340 74 68 65 20 73 75 62 71 75 65 72 79 2c 20 6f 76  the subquery, ov
11350 65 72 72 69 64 69 6e 67 20 61 6e 20 65 78 70 6c  erriding an expl
11360 69 63 69 74 6c 79 20 63 6f 64 65 64 20 4c 49 4d  icitly coded LIM
11370 49 54 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  IT..#.do_execsql
11380 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 36 2e  _test e_expr-36.
11390 33 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  3.1 {.  CREATE T
113a0 41 42 4c 45 20 74 34 28 78 2c 20 79 29 3b 0a 20  ABLE t4(x, y);. 
113b0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
113c0 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29  VALUES(1, 'one')
113d0 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
113e0 74 34 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77  t4 VALUES(2, 'tw
113f0 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  o');.  INSERT IN
11400 54 4f 20 74 34 20 56 41 4c 55 45 53 28 33 2c 20  TO t4 VALUES(3, 
11410 27 74 68 72 65 65 27 29 3b 0a 7d 20 7b 7d 0a 0a  'three');.} {}..
11420 66 6f 72 65 61 63 68 20 7b 74 6e 20 65 78 70 72  foreach {tn expr
11430 20 72 65 73 74 79 70 65 20 72 65 73 76 61 6c 7d   restype resval}
11440 20 7b 0a 20 20 20 20 32 20 20 7b 20 28 20 53 45   {.    2  { ( SE
11450 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20 4f  LECT x FROM t4 O
11460 52 44 45 52 20 42 59 20 78 20 29 20 20 20 20 20  RDER BY x )     
11470 20 7d 20 20 20 20 20 20 20 20 69 6e 74 65 67 65   }        intege
11480 72 20 31 0a 20 20 20 20 33 20 20 7b 20 28 20 53  r 1.    3  { ( S
11490 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20  ELECT x FROM t4 
114a0 4f 52 44 45 52 20 42 59 20 79 20 29 20 20 20 20  ORDER BY y )    
114b0 20 20 7d 20 20 20 20 20 20 20 20 69 6e 74 65 67    }        integ
114c0 65 72 20 31 0a 20 20 20 20 34 20 20 7b 20 28 20  er 1.    4  { ( 
114d0 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34  SELECT x FROM t4
114e0 20 4f 52 44 45 52 20 42 59 20 78 20 44 45 53 43   ORDER BY x DESC
114f0 20 29 20 7d 20 20 20 20 20 20 20 20 69 6e 74 65   ) }        inte
11500 67 65 72 20 33 0a 20 20 20 20 35 20 20 7b 20 28  ger 3.    5  { (
11510 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
11520 34 20 4f 52 44 45 52 20 42 59 20 79 20 44 45 53  4 ORDER BY y DES
11530 43 20 29 20 7d 20 20 20 20 20 20 20 20 69 6e 74  C ) }        int
11540 65 67 65 72 20 32 0a 20 20 20 20 36 20 20 7b 20  eger 2.    6  { 
11550 28 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20  ( SELECT y FROM 
11560 74 34 20 4f 52 44 45 52 20 42 59 20 79 20 44 45  t4 ORDER BY y DE
11570 53 43 20 29 20 7d 20 20 20 20 20 20 20 20 74 65  SC ) }        te
11580 78 74 20 20 20 20 74 77 6f 0a 0a 20 20 20 20 37  xt    two..    7
11590 20 20 7b 20 28 20 53 45 4c 45 43 54 20 73 75 6d    { ( SELECT sum
115a0 28 78 29 20 46 52 4f 4d 20 74 34 20 29 20 20 20  (x) FROM t4 )   
115b0 20 20 20 20 20 20 20 20 7d 20 20 20 20 20 20 20          }       
115c0 20 20 69 6e 74 65 67 65 72 20 36 0a 20 20 20 20    integer 6.    
115d0 38 20 20 7b 20 28 20 53 45 4c 45 43 54 20 67 72  8  { ( SELECT gr
115e0 6f 75 70 5f 63 6f 6e 63 61 74 28 79 2c 27 27 29  oup_concat(y,'')
115f0 20 46 52 4f 4d 20 74 34 20 29 20 7d 20 20 20 20   FROM t4 ) }    
11600 20 20 20 74 65 78 74 20 20 20 20 6f 6e 65 74 77     text    onetw
11610 6f 74 68 72 65 65 0a 20 20 20 20 39 20 20 7b 20  othree.    9  { 
11620 28 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20  ( SELECT max(x) 
11630 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 79 20  FROM t4 WHERE y 
11640 4c 49 4b 45 20 27 5f 5f 5f 27 29 20 7d 20 69 6e  LIKE '___') } in
11650 74 65 67 65 72 20 32 20 0a 0a 7d 20 7b 0a 20 20  teger 2 ..} {.  
11660 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
11670 78 70 72 2d 33 36 2e 33 2e 24 74 6e 20 24 65 78  xpr-36.3.$tn $ex
11680 70 72 20 24 72 65 73 74 79 70 65 20 24 72 65 73  pr $restype $res
11690 76 61 6c 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  val.}..# EVIDENC
116a0 45 2d 4f 46 3a 20 52 2d 35 32 33 32 35 2d 32 35  E-OF: R-52325-25
116b0 34 34 39 20 54 68 65 20 76 61 6c 75 65 20 6f 66  449 The value of
116c0 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72   a subquery expr
116d0 65 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 0a 23  ession is NULL.#
116e0 20 69 66 20 74 68 65 20 65 6e 63 6c 6f 73 65 64   if the enclosed
116f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11700 74 20 72 65 74 75 72 6e 73 20 6e 6f 20 72 6f 77  t returns no row
11710 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  s..#.foreach {tn
11720 20 65 78 70 72 7d 20 7b 0a 20 20 20 20 31 20 20   expr} {.    1  
11730 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f  { ( SELECT x FRO
11740 4d 20 74 34 20 57 48 45 52 45 20 78 3e 33 20 4f  M t4 WHERE x>3 O
11750 52 44 45 52 20 42 59 20 78 20 29 20 20 20 20 20  RDER BY x )     
11760 20 7d 0a 20 20 20 20 32 20 20 7b 20 28 20 53 45   }.    2  { ( SE
11770 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20 57  LECT x FROM t4 W
11780 48 45 52 45 20 79 3c 27 6f 6e 65 27 20 4f 52 44  HERE y<'one' ORD
11790 45 52 20 42 59 20 79 20 29 20 20 7d 0a 7d 20 7b  ER BY y )  }.} {
117a0 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .  do_expr_test 
117b0 65 5f 65 78 70 72 2d 33 36 2e 34 2e 24 74 6e 20  e_expr-36.4.$tn 
117c0 24 65 78 70 72 20 6e 75 6c 6c 20 7b 7d 0a 7d 0a  $expr null {}.}.
117d0 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
117e0 52 2d 36 32 34 37 37 2d 30 36 34 37 36 20 46 6f  R-62477-06476 Fo
117f0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 76  r example, the v
11800 61 6c 75 65 73 20 4e 55 4c 4c 2c 20 30 2e 30 2c  alues NULL, 0.0,
11810 20 30 2c 0a 23 20 27 65 6e 67 6c 69 73 68 27 20   0,.# 'english' 
11820 61 6e 64 20 27 30 27 20 61 72 65 20 61 6c 6c 20  and '0' are all 
11830 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
11840 20 66 61 6c 73 65 2e 0a 23 0a 64 6f 5f 65 78 65   false..#.do_exe
11850 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
11860 2d 33 37 2e 31 20 7b 0a 20 20 20 53 45 4c 45 43  -37.1 {.   SELEC
11870 54 20 43 41 53 45 20 57 48 45 4e 20 4e 55 4c 4c  T CASE WHEN NULL
11880 20 54 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53   THEN 'true' ELS
11890 45 20 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d  E 'false' END;.}
118a0 20 7b 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63   {false}.do_exec
118b0 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
118c0 33 37 2e 32 20 7b 0a 20 20 20 53 45 4c 45 43 54  37.2 {.   SELECT
118d0 20 43 41 53 45 20 57 48 45 4e 20 30 2e 30 20 54   CASE WHEN 0.0 T
118e0 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20  HEN 'true' ELSE 
118f0 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b  'false' END;.} {
11900 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63 73 71  false}.do_execsq
11910 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37  l_test e_expr-37
11920 2e 33 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43  .3 {.   SELECT C
11930 41 53 45 20 57 48 45 4e 20 30 20 54 48 45 4e 20  ASE WHEN 0 THEN 
11940 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61 6c  'true' ELSE 'fal
11950 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66 61 6c 73  se' END;.} {fals
11960 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e}.do_execsql_te
11970 73 74 20 65 5f 65 78 70 72 2d 33 37 2e 34 20 7b  st e_expr-37.4 {
11980 0a 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  .   SELECT CASE 
11990 57 48 45 4e 20 27 65 6e 67 6c 69 67 68 27 20 54  WHEN 'engligh' T
119a0 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20  HEN 'true' ELSE 
119b0 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b  'false' END;.} {
119c0 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63 73 71  false}.do_execsq
119d0 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37  l_test e_expr-37
119e0 2e 35 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43  .5 {.   SELECT C
119f0 41 53 45 20 57 48 45 4e 20 27 30 27 20 54 48 45  ASE WHEN '0' THE
11a00 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20 27 66  N 'true' ELSE 'f
11a10 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66 61  alse' END;.} {fa
11a20 6c 73 65 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  lse}..# EVIDENCE
11a30 2d 4f 46 3a 20 52 2d 35 35 35 33 32 2d 31 30 31  -OF: R-55532-101
11a40 30 38 20 56 61 6c 75 65 73 20 31 2c 20 31 2e 30  08 Values 1, 1.0
11a50 2c 20 30 2e 31 2c 20 2d 30 2e 31 20 61 6e 64 20  , 0.1, -0.1 and 
11a60 27 31 65 6e 67 6c 69 73 68 27 20 61 72 65 0a 23  '1english' are.#
11a70 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
11a80 65 20 74 72 75 65 2e 0a 23 0a 64 6f 5f 65 78 65  e true..#.do_exe
11a90 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
11aa0 2d 33 37 2e 36 20 7b 0a 20 20 20 53 45 4c 45 43  -37.6 {.   SELEC
11ab0 54 20 43 41 53 45 20 57 48 45 4e 20 31 20 54 48  T CASE WHEN 1 TH
11ac0 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20 27  EN 'true' ELSE '
11ad0 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74  false' END;.} {t
11ae0 72 75 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  rue}.do_execsql_
11af0 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37 2e 37  test e_expr-37.7
11b00 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43 41 53   {.   SELECT CAS
11b10 45 20 57 48 45 4e 20 31 2e 30 20 54 48 45 4e 20  E WHEN 1.0 THEN 
11b20 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61 6c  'true' ELSE 'fal
11b30 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65  se' END;.} {true
11b40 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
11b50 74 20 65 5f 65 78 70 72 2d 33 37 2e 38 20 7b 0a  t e_expr-37.8 {.
11b60 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57     SELECT CASE W
11b70 48 45 4e 20 30 2e 31 20 54 48 45 4e 20 27 74 72  HEN 0.1 THEN 'tr
11b80 75 65 27 20 45 4c 53 45 20 27 66 61 6c 73 65 27  ue' ELSE 'false'
11b90 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a 64   END;.} {true}.d
11ba0 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
11bb0 5f 65 78 70 72 2d 33 37 2e 39 20 7b 0a 20 20 20  _expr-37.9 {.   
11bc0 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
11bd0 20 2d 30 2e 31 20 54 48 45 4e 20 27 74 72 75 65   -0.1 THEN 'true
11be0 27 20 45 4c 53 45 20 27 66 61 6c 73 65 27 20 45  ' ELSE 'false' E
11bf0 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a 64 6f 5f  ND;.} {true}.do_
11c00 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
11c10 78 70 72 2d 33 37 2e 31 30 20 7b 0a 20 20 20 53  xpr-37.10 {.   S
11c20 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20  ELECT CASE WHEN 
11c30 27 31 65 6e 67 6c 69 73 68 27 20 54 48 45 4e 20  '1english' THEN 
11c40 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61 6c  'true' ELSE 'fal
11c50 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65  se' END;.} {true
11c60 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  }...finish_test.