/ Hex Artifact Content
Login

Artifact 2a599f40f37ee9e853c4396c28ff13c2c50f6628:


0000: 23 20 32 30 31 30 20 4a 75 6c 79 20 31 36 0a 23  # 2010 July 16.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 23 20 54 68 69 73 20 66 69  ****.#.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65  le implements te
0180: 73 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  sts to verify th
0190: 61 74 20 74 68 65 20 22 74 65 73 74 61 62 6c 65  at the "testable
01a0: 20 73 74 61 74 65 6d 65 6e 74 73 22 20 69 6e 20   statements" in 
01b0: 0a 23 20 74 68 65 20 6c 61 6e 67 5f 65 78 70 72  .# the lang_expr
01c0: 2e 68 74 6d 6c 20 64 6f 63 75 6d 65 6e 74 20 61  .html document a
01d0: 72 65 20 63 6f 72 72 65 63 74 2e 0a 23 0a 0a 73  re correct..#..s
01e0: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
01f0: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
0200: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0210: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72  /tester.tcl.sour
0220: 63 65 20 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c  ce $testdir/mall
0230: 6f 63 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 69  oc_common.tcl..i
0240: 66 63 61 70 61 62 6c 65 20 21 63 6f 6d 70 6f 75  fcapable !compou
0250: 6e 64 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  nd {.  finish_te
0260: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70  st.  return.}..p
0270: 72 6f 63 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  roc do_expr_test
0280: 20 7b 74 6e 20 65 78 70 72 20 74 79 70 65 20 76   {tn expr type v
0290: 61 6c 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65  alue} {.  upleve
02a0: 6c 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l do_execsql_tes
02b0: 74 20 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c  t $tn [list "SEL
02c0: 45 43 54 20 74 79 70 65 6f 66 28 24 65 78 70 72  ECT typeof($expr
02d0: 29 2c 20 24 65 78 70 72 22 5d 20 5b 0a 20 20 20  ), $expr"] [.   
02e0: 20 6c 69 73 74 20 5b 6c 69 73 74 20 24 74 79 70   list [list $typ
02f0: 65 20 24 76 61 6c 75 65 5d 0a 20 20 5d 0a 7d 0a  e $value].  ].}.
0300: 0a 70 72 6f 63 20 64 6f 5f 71 65 78 70 72 5f 74  .proc do_qexpr_t
0310: 65 73 74 20 7b 74 6e 20 65 78 70 72 20 76 61 6c  est {tn expr val
0320: 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20  ue} {.  uplevel 
0330: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0340: 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c 45 43  $tn [list "SELEC
0350: 54 20 71 75 6f 74 65 28 24 65 78 70 72 29 22 5d  T quote($expr)"]
0360: 20 5b 6c 69 73 74 20 24 76 61 6c 75 65 5d 0a 7d   [list $value].}
0370: 0a 0a 23 20 53 65 74 20 75 70 20 74 68 72 65 65  ..# Set up three
0380: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0390: 73 3a 0a 23 0a 23 20 20 20 3a 3a 6f 70 6e 61 6d  s:.#.#   ::opnam
03a0: 65 20 20 20 20 20 20 20 20 20 41 6e 20 61 72 72  e         An arr
03b0: 61 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20  ay mapping from 
03c0: 53 51 4c 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  SQL operator to 
03d0: 61 6e 20 65 61 73 79 20 74 6f 20 70 61 72 73 65  an easy to parse
03e0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
03f0: 20 20 20 20 20 20 6e 61 6d 65 2e 20 54 68 65 20        name. The 
0400: 6e 61 6d 65 73 20 61 72 65 20 75 73 65 64 20 61  names are used a
0410: 73 20 70 61 72 74 20 6f 66 20 74 65 73 74 20 63  s part of test c
0420: 61 73 65 20 6e 61 6d 65 73 2e 0a 23 0a 23 20 20  ase names..#.#  
0430: 20 3a 3a 6f 70 70 72 65 63 20 20 20 20 20 20 20   ::opprec       
0440: 20 20 41 6e 20 61 72 72 61 79 20 6d 61 70 70 69    An array mappi
0450: 6e 67 20 66 72 6f 6d 20 53 51 4c 20 6f 70 65 72  ng from SQL oper
0460: 61 74 6f 72 20 74 6f 20 61 20 6e 75 6d 65 72 69  ator to a numeri
0470: 63 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  c.#             
0480: 20 20 20 20 20 20 20 70 72 65 63 65 64 65 6e 63         precedenc
0490: 65 20 76 61 6c 75 65 2e 20 4f 70 65 72 61 74 6f  e value. Operato
04a0: 72 73 20 74 68 61 74 20 67 72 6f 75 70 20 6d 6f  rs that group mo
04b0: 72 65 20 74 69 67 68 74 6c 79 0a 23 20 20 20 20  re tightly.#    
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 68 61 76 65 20 6c 6f 77 65 72 20 6e 75 6d 65 72  have lower numer
04e0: 69 63 20 70 72 65 63 65 64 65 6e 63 65 73 2e 0a  ic precedences..
04f0: 23 0a 23 20 20 20 3a 3a 6f 70 6c 69 73 74 20 20  #.#   ::oplist  
0500: 20 20 20 20 20 20 20 41 20 6c 69 73 74 20 6f 66         A list of
0510: 20 61 6c 6c 20 53 51 4c 20 6f 70 65 72 61 74 6f   all SQL operato
0520: 72 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  rs supported by 
0530: 53 51 4c 69 74 65 2e 0a 23 0a 66 6f 72 65 61 63  SQLite..#.foreac
0540: 68 20 7b 6f 70 20 6f 70 6e 7d 20 7b 0a 20 20 20  h {op opn} {.   
0550: 20 20 20 7c 7c 20 20 20 63 61 74 20 20 20 20 20     ||   cat     
0560: 2a 20 20 20 6d 75 6c 20 20 20 20 20 20 20 2f 20  *   mul       / 
0570: 20 64 69 76 20 20 20 20 20 20 20 25 20 20 20 20   div       %    
0580: 20 6d 6f 64 20 20 20 20 20 20 20 2b 20 20 20 20   mod       +    
0590: 20 20 61 64 64 0a 20 20 20 20 20 20 2d 20 20 20    add.      -   
05a0: 20 73 75 62 20 20 20 20 20 3c 3c 20 20 6c 73 68   sub     <<  lsh
05b0: 69 66 74 20 20 20 20 3e 3e 20 72 73 68 69 66 74  ift    >> rshift
05c0: 20 20 20 20 26 20 20 20 20 20 62 69 74 61 6e 64      &     bitand
05d0: 20 20 20 20 7c 20 20 20 20 20 20 62 69 74 6f 72      |      bitor
05e0: 0a 20 20 20 20 20 20 3c 20 20 20 20 6c 65 73 73  .      <    less
05f0: 20 20 20 20 3c 3d 20 20 6c 65 73 73 65 71 20 20      <=  lesseq  
0600: 20 20 3e 20 20 6d 6f 72 65 20 20 20 20 20 20 3e    >  more      >
0610: 3d 20 20 20 20 6d 6f 72 65 65 71 20 20 20 20 3d  =    moreeq    =
0620: 20 20 20 20 20 20 65 71 31 0a 20 20 20 20 20 20        eq1.      
0630: 3d 3d 20 20 20 65 71 32 20 20 20 20 20 3c 3e 20  ==   eq2     <> 
0640: 20 6e 65 31 20 20 20 20 20 20 20 21 3d 20 6e 65   ne1       != ne
0650: 32 20 20 20 20 20 20 20 49 53 20 20 20 20 69 73  2       IS    is
0660: 20 20 20 20 20 20 20 20 4c 49 4b 45 20 20 20 6c          LIKE   l
0670: 69 6b 65 0a 20 20 20 20 20 20 47 4c 4f 42 20 67  ike.      GLOB g
0680: 6c 6f 62 20 20 20 20 41 4e 44 20 61 6e 64 20 20  lob    AND and  
0690: 20 20 20 20 20 4f 52 20 6f 72 20 20 20 20 20 20       OR or      
06a0: 20 20 4d 41 54 43 48 20 6d 61 74 63 68 20 20 20    MATCH match   
06b0: 20 20 52 45 47 45 58 50 20 72 65 67 65 78 70 0a    REGEXP regexp.
06c0: 20 20 20 20 20 20 7b 49 53 20 4e 4f 54 7d 20 69        {IS NOT} i
06d0: 73 6e 74 0a 7d 20 7b 0a 20 20 73 65 74 20 3a 3a  snt.} {.  set ::
06e0: 6f 70 6e 61 6d 65 28 24 6f 70 29 20 24 6f 70 6e  opname($op) $opn
06f0: 0a 7d 0a 73 65 74 20 6f 70 6c 69 73 74 20 5b 6c  .}.set oplist [l
0700: 69 73 74 5d 0a 66 6f 72 65 61 63 68 20 7b 70 72  ist].foreach {pr
0710: 65 63 20 6f 70 6c 7d 20 7b 0a 20 20 31 20 20 20  ec opl} {.  1   
0720: 7c 7c 0a 20 20 32 20 20 20 7b 2a 20 2f 20 25 7d  ||.  2   {* / %}
0730: 0a 20 20 33 20 20 20 7b 2b 20 2d 7d 0a 20 20 34  .  3   {+ -}.  4
0740: 20 20 20 7b 3c 3c 20 3e 3e 20 26 20 7c 7d 0a 20     {<< >> & |}. 
0750: 20 35 20 20 20 7b 3c 20 3c 3d 20 3e 20 3e 3d 7d   5   {< <= > >=}
0760: 0a 20 20 36 20 20 20 7b 3d 20 3d 3d 20 21 3d 20  .  6   {= == != 
0770: 3c 3e 20 49 53 20 7b 49 53 20 4e 4f 54 7d 20 4c  <> IS {IS NOT} L
0780: 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48 20 52  IKE GLOB MATCH R
0790: 45 47 45 58 50 7d 0a 20 20 37 20 20 20 41 4e 44  EGEXP}.  7   AND
07a0: 0a 20 20 38 20 20 20 4f 52 0a 7d 20 7b 0a 20 20  .  8   OR.} {.  
07b0: 66 6f 72 65 61 63 68 20 6f 70 20 24 6f 70 6c 20  foreach op $opl 
07c0: 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6f 70 70  { .    set ::opp
07d0: 72 65 63 28 24 6f 70 29 20 24 70 72 65 63 20 0a  rec($op) $prec .
07e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 6f 70 6c 69      lappend opli
07f0: 73 74 20 24 6f 70 0a 20 20 7d 0a 7d 0a 0a 0a 23  st $op.  }.}...#
0800: 20 48 6f 6f 6b 20 69 6e 20 64 65 66 69 6e 69 74   Hook in definit
0810: 69 6f 6e 73 20 6f 66 20 4d 41 54 43 48 20 61 6e  ions of MATCH an
0820: 64 20 52 45 47 45 58 2e 20 54 68 65 20 66 6f 6c  d REGEX. The fol
0830: 6c 6f 77 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  lowing implement
0840: 61 74 69 6f 6e 73 0a 23 20 63 61 75 73 65 20 4d  ations.# cause M
0850: 41 54 43 48 20 61 6e 64 20 52 45 47 45 58 20 74  ATCH and REGEX t
0860: 6f 20 62 65 68 61 76 65 20 73 69 6d 69 6c 61 72  o behave similar
0870: 6c 79 20 74 6f 20 74 68 65 20 3d 3d 20 6f 70 65  ly to the == ope
0880: 72 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 6d 61  rator..#.proc ma
0890: 74 63 68 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20  tchfunc {a b} { 
08a0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 61  return [expr {$a
08b0: 3d 3d 24 62 7d 5d 20 7d 0a 70 72 6f 63 20 72 65  ==$b}] }.proc re
08c0: 67 65 78 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20  gexfunc {a b} { 
08d0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 61  return [expr {$a
08e0: 3d 3d 24 62 7d 5d 20 7d 0a 64 62 20 66 75 6e 63  ==$b}] }.db func
08f0: 20 6d 61 74 63 68 20 20 2d 61 72 67 63 6f 75 6e   match  -argcoun
0900: 74 20 32 20 6d 61 74 63 68 66 75 6e 63 0a 64 62  t 2 matchfunc.db
0910: 20 66 75 6e 63 20 72 65 67 65 78 70 20 2d 61 72   func regexp -ar
0920: 67 63 6f 75 6e 74 20 32 20 72 65 67 65 78 66 75  gcount 2 regexfu
0930: 6e 63 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  nc..#-----------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0980: 20 54 65 73 74 20 63 61 73 65 73 20 65 5f 65 78   Test cases e_ex
0990: 70 72 2d 31 2e 2a 20 61 74 74 65 6d 70 74 20 74  pr-1.* attempt t
09a0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61 6c  o verify that al
09b0: 6c 20 62 69 6e 61 72 79 20 6f 70 65 72 61 74 6f  l binary operato
09c0: 72 73 20 6c 69 73 74 65 64 0a 23 20 69 6e 20 74  rs listed.# in t
09d0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
09e0: 20 65 78 69 73 74 20 61 6e 64 20 74 68 61 74 20   exist and that 
09f0: 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 72 65  the relative pre
0a00: 63 65 64 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  cedences of the.
0a10: 23 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  # operators are 
0a20: 61 6c 73 6f 20 61 73 20 74 68 65 20 64 6f 63 75  also as the docu
0a30: 6d 65 6e 74 61 74 69 6f 6e 20 73 75 67 67 65 73  mentation sugges
0a40: 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ts..#.# EVIDENCE
0a50: 2d 4f 46 3a 20 52 2d 31 35 35 31 34 2d 36 35 31  -OF: R-15514-651
0a60: 36 33 20 53 51 4c 69 74 65 20 75 6e 64 65 72 73  63 SQLite unders
0a70: 74 61 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f 77  tands the follow
0a80: 69 6e 67 20 62 69 6e 61 72 79 0a 23 20 6f 70 65  ing binary.# ope
0a90: 72 61 74 6f 72 73 2c 20 69 6e 20 6f 72 64 65 72  rators, in order
0aa0: 20 66 72 6f 6d 20 68 69 67 68 65 73 74 20 74 6f   from highest to
0ab0: 20 6c 6f 77 65 73 74 20 70 72 65 63 65 64 65 6e   lowest preceden
0ac0: 63 65 3a 20 7c 7c 20 2a 20 2f 20 25 20 2b 20 2d  ce: || * / % + -
0ad0: 0a 23 20 3c 3c 20 3e 3e 20 26 20 7c 20 3c 20 3c  .# << >> & | < <
0ae0: 3d 20 3e 20 3e 3d 20 3d 20 3d 3d 20 21 3d 20 3c  = > >= = == != <
0af0: 3e 20 49 53 20 49 53 0a 23 20 4e 4f 54 20 49 4e  > IS IS.# NOT IN
0b00: 20 4c 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48   LIKE GLOB MATCH
0b10: 20 52 45 47 45 58 50 20 41 4e 44 20 4f 52 0a 23   REGEXP AND OR.#
0b20: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
0b30: 52 2d 33 38 37 35 39 2d 33 38 37 38 39 20 4f 70  R-38759-38789 Op
0b40: 65 72 61 74 6f 72 73 20 49 53 20 61 6e 64 20 49  erators IS and I
0b50: 53 20 4e 4f 54 20 68 61 76 65 20 74 68 65 20 73  S NOT have the s
0b60: 61 6d 65 0a 23 20 70 72 65 63 65 64 65 6e 63 65  ame.# precedence
0b70: 20 61 73 20 3d 2e 0a 23 0a 0a 75 6e 73 65 74 20   as =..#..unset 
0b80: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 75 6e 74 65  -nocomplain unte
0b90: 73 74 65 64 0a 66 6f 72 65 61 63 68 20 6f 70 31  sted.foreach op1
0ba0: 20 24 6f 70 6c 69 73 74 20 7b 0a 20 20 66 6f 72   $oplist {.  for
0bb0: 65 61 63 68 20 6f 70 32 20 24 6f 70 6c 69 73 74  each op2 $oplist
0bc0: 20 7b 0a 20 20 20 20 73 65 74 20 75 6e 74 65 73   {.    set untes
0bd0: 74 65 64 28 24 6f 70 31 2c 24 6f 70 32 29 20 31  ted($op1,$op2) 1
0be0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 74 6e  .    foreach {tn
0bf0: 20 41 20 42 20 43 7d 20 7b 0a 20 20 20 20 20 20   A B C} {.      
0c00: 20 31 20 20 20 20 20 32 32 20 20 20 34 35 20 20   1     22   45  
0c10: 20 20 36 36 0a 20 20 20 20 20 20 20 32 20 20 20    66.       2   
0c20: 20 20 20 30 20 20 20 20 30 20 20 20 20 20 30 0a     0    0     0.
0c30: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 30 20         3      0 
0c40: 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20 20     0     1.     
0c50: 20 20 34 20 20 20 20 20 20 30 20 20 20 20 31 20    4      0    1 
0c60: 20 20 20 20 30 0a 20 20 20 20 20 20 20 35 20 20      0.       5  
0c70: 20 20 20 20 30 20 20 20 20 31 20 20 20 20 20 31      0    1     1
0c80: 0a 20 20 20 20 20 20 20 36 20 20 20 20 20 20 31  .       6      1
0c90: 20 20 20 20 30 20 20 20 20 20 30 0a 20 20 20 20      0     0.    
0ca0: 20 20 20 37 20 20 20 20 20 20 31 20 20 20 20 30     7      1    0
0cb0: 20 20 20 20 20 31 0a 20 20 20 20 20 20 20 38 20       1.       8 
0cc0: 20 20 20 20 20 31 20 20 20 20 31 20 20 20 20 20       1    1     
0cd0: 30 0a 20 20 20 20 20 20 20 39 20 20 20 20 20 20  0.       9      
0ce0: 31 20 20 20 20 31 20 20 20 20 20 31 0a 20 20 20  1    1     1.   
0cf0: 20 20 20 31 30 20 20 20 20 20 20 35 20 20 20 20     10      5    
0d00: 36 20 20 20 20 20 31 0a 20 20 20 20 20 20 31 31  6     1.      11
0d10: 20 20 20 20 20 20 31 20 20 20 20 35 20 20 20 20        1    5    
0d20: 20 36 0a 20 20 20 20 20 20 31 32 20 20 20 20 20   6.      12     
0d30: 20 31 20 20 20 20 35 20 20 20 20 20 35 0a 20 20   1    5     5.  
0d40: 20 20 20 20 31 33 20 20 20 20 20 20 35 20 20 20      13      5   
0d50: 20 35 20 20 20 20 20 31 0a 0a 20 20 20 20 20 20   5     1..      
0d60: 31 34 20 20 20 20 20 20 35 20 20 20 20 32 20 20  14      5    2  
0d70: 20 20 20 31 0a 20 20 20 20 20 20 31 35 20 20 20     1.      15   
0d80: 20 20 20 31 20 20 20 20 34 20 20 20 20 20 31 0a     1    4     1.
0d90: 20 20 20 20 20 20 31 36 20 20 20 20 20 2d 31 20        16     -1 
0da0: 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20 20     0     1.     
0db0: 20 31 37 20 20 20 20 20 20 30 20 20 20 20 31 20   17      0    1 
0dc0: 20 20 20 2d 31 0a 0a 20 20 20 20 7d 20 7b 0a 20     -1..    } {. 
0dd0: 20 20 20 20 20 73 65 74 20 74 65 73 74 6e 61 6d       set testnam
0de0: 65 20 22 65 5f 65 78 70 72 2d 31 2e 24 6f 70 6e  e "e_expr-1.$opn
0df0: 61 6d 65 28 24 6f 70 31 29 2e 24 6f 70 6e 61 6d  ame($op1).$opnam
0e00: 65 28 24 6f 70 32 29 2e 24 74 6e 22 0a 0a 20 20  e($op2).$tn"..  
0e10: 20 20 20 20 23 20 49 66 20 24 6f 70 32 20 67 72      # If $op2 gr
0e20: 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74 6c  oups more tightl
0e30: 79 20 74 68 61 6e 20 24 6f 70 31 2c 20 74 68 65  y than $op1, the
0e40: 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  n the result.   
0e50: 20 20 20 23 20 6f 66 20 65 78 65 63 75 74 69 6e     # of executin
0e60: 67 20 24 73 71 6c 31 20 77 68 6f 75 6c 64 20 62  g $sql1 whould b
0e70: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78  e the same as ex
0e80: 65 63 75 74 69 6e 67 20 24 73 71 6c 33 2e 0a 20  ecuting $sql3.. 
0e90: 20 20 20 20 20 23 20 49 66 20 24 6f 70 31 20 67       # If $op1 g
0ea0: 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74  roups more tight
0eb0: 6c 79 2c 20 6f 72 20 69 66 20 24 6f 70 31 20 61  ly, or if $op1 a
0ec0: 6e 64 20 24 6f 70 32 20 68 61 76 65 20 0a 20 20  nd $op2 have .  
0ed0: 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20 70      # the same p
0ee0: 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 6e 20  recedence, then 
0ef0: 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c 31 20  executing $sql1 
0f00: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20 20  should return.  
0f10: 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20 76      # the same v
0f20: 61 6c 75 65 20 61 73 20 24 73 71 6c 32 2e 0a 20  alue as $sql2.. 
0f30: 20 20 20 20 20 23 0a 20 20 20 20 20 20 73 65 74       #.      set
0f40: 20 73 71 6c 31 20 22 53 45 4c 45 43 54 20 24 41   sql1 "SELECT $A
0f50: 20 24 6f 70 31 20 24 42 20 24 6f 70 32 20 24 43   $op1 $B $op2 $C
0f60: 22 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 32  ".      set sql2
0f70: 20 22 53 45 4c 45 43 54 20 28 24 41 20 24 6f 70   "SELECT ($A $op
0f80: 31 20 24 42 29 20 24 6f 70 32 20 24 43 22 0a 20  1 $B) $op2 $C". 
0f90: 20 20 20 20 20 73 65 74 20 73 71 6c 33 20 22 53       set sql3 "S
0fa0: 45 4c 45 43 54 20 24 41 20 24 6f 70 31 20 28 24  ELECT $A $op1 ($
0fb0: 42 20 24 6f 70 32 20 24 43 29 22 0a 0a 20 20 20  B $op2 $C)"..   
0fc0: 20 20 20 73 65 74 20 61 32 20 5b 64 62 20 6f 6e     set a2 [db on
0fd0: 65 20 24 73 71 6c 32 5d 0a 20 20 20 20 20 20 73  e $sql2].      s
0fe0: 65 74 20 61 33 20 5b 64 62 20 6f 6e 65 20 24 73  et a3 [db one $s
0ff0: 71 6c 33 5d 0a 0a 20 20 20 20 20 20 64 6f 5f 65  ql3]..      do_e
1000: 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 65 73  xecsql_test $tes
1010: 74 6e 61 6d 65 20 24 73 71 6c 31 20 5b 6c 69 73  tname $sql1 [lis
1020: 74 20 5b 0a 20 20 20 20 20 20 20 20 69 66 20 7b  t [.        if {
1030: 24 6f 70 70 72 65 63 28 24 6f 70 32 29 20 3c 20  $opprec($op2) < 
1040: 24 6f 70 70 72 65 63 28 24 6f 70 31 29 7d 20 7b  $opprec($op1)} {
1050: 73 65 74 20 61 33 7d 20 7b 73 65 74 20 61 32 7d  set a3} {set a2}
1060: 0a 20 20 20 20 20 20 5d 5d 0a 20 20 20 20 20 20  .      ]].      
1070: 69 66 20 7b 24 61 32 20 21 3d 20 24 61 33 7d 20  if {$a2 != $a3} 
1080: 7b 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  { unset -nocompl
1090: 61 69 6e 20 75 6e 74 65 73 74 65 64 28 24 6f 70  ain untested($op
10a0: 31 2c 24 6f 70 32 29 20 7d 0a 20 20 20 20 7d 0a  1,$op2) }.    }.
10b0: 20 20 7d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 6f    }.}..foreach o
10c0: 70 20 7b 2a 20 41 4e 44 20 4f 52 20 2b 20 7c 7c  p {* AND OR + ||
10d0: 20 26 20 7c 7d 20 7b 20 75 6e 73 65 74 20 75 6e   & |} { unset un
10e0: 74 65 73 74 65 64 28 24 6f 70 2c 24 6f 70 29 20  tested($op,$op) 
10f0: 7d 0a 75 6e 73 65 74 20 75 6e 74 65 73 74 65 64  }.unset untested
1100: 28 2b 2c 2d 29 20 20 3b 23 20 20 20 20 20 20 20  (+,-)  ;#       
1110: 53 69 6e 63 65 20 20 20 20 28 61 2b 62 29 2d 63  Since    (a+b)-c
1120: 20 3d 3d 20 61 2b 28 62 2d 63 29 0a 75 6e 73 65   == a+(b-c).unse
1130: 74 20 75 6e 74 65 73 74 65 64 28 2a 2c 3c 3c 29  t untested(*,<<)
1140: 20 3b 23 20 20 20 20 20 20 20 53 69 6e 63 65 20   ;#       Since 
1150: 20 20 20 28 61 2a 62 29 3c 3c 63 20 3d 3d 20 61     (a*b)<<c == a
1160: 2a 28 62 3c 3c 63 29 0a 0a 64 6f 5f 74 65 73 74  *(b<<c)..do_test
1170: 20 65 5f 65 78 70 72 2d 31 2e 31 20 7b 20 61 72   e_expr-1.1 { ar
1180: 72 61 79 20 6e 61 6d 65 73 20 75 6e 74 65 73 74  ray names untest
1190: 65 64 20 7d 20 7b 7d 0a 0a 23 20 41 74 20 6f 6e  ed } {}..# At on
11a0: 65 20 70 6f 69 6e 74 2c 20 74 65 73 74 20 31 2e  e point, test 1.
11b0: 32 2e 32 20 77 61 73 20 66 61 69 6c 69 6e 67 2e  2.2 was failing.
11c0: 20 49 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   Instead of the 
11d0: 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 2c 20  correct result, 
11e0: 69 74 0a 23 20 77 61 73 20 72 65 74 75 72 6e 69  it.# was returni
11f0: 6e 67 20 7b 31 20 31 20 30 7d 2e 20 54 68 69 73  ng {1 1 0}. This
1200: 20 77 6f 75 6c 64 20 73 65 65 6d 20 74 6f 20 69   would seem to i
1210: 6e 64 69 63 61 74 65 20 74 68 61 74 20 4c 49 4b  ndicate that LIK
1220: 45 20 68 61 73 20 74 68 65 0a 23 20 73 61 6d 65  E has the.# same
1230: 20 70 72 65 63 65 64 65 6e 63 65 20 61 73 20 27   precedence as '
1240: 3c 27 2e 20 57 68 69 63 68 20 69 73 20 69 6e 63  <'. Which is inc
1250: 6f 72 72 65 63 74 2e 20 49 74 20 68 61 73 20 6c  orrect. It has l
1260: 6f 77 65 72 20 70 72 65 63 65 64 65 6e 63 65 2e  ower precedence.
1270: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1280: 73 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 31 20  st e_expr-1.2.1 
1290: 7b 20 0a 20 20 53 45 4c 45 43 54 20 30 20 3c 20  { .  SELECT 0 < 
12a0: 32 20 4c 49 4b 45 20 31 2c 20 20 20 28 30 20 3c  2 LIKE 1,   (0 <
12b0: 20 32 29 20 4c 49 4b 45 20 31 2c 20 20 20 30 20   2) LIKE 1,   0 
12c0: 3c 20 28 32 20 4c 49 4b 45 20 31 29 0a 7d 20 7b  < (2 LIKE 1).} {
12d0: 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71  1 1 0}.do_execsq
12e0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 2e  l_test e_expr-1.
12f0: 32 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  2.2 { .  SELECT 
1300: 30 20 4c 49 4b 45 20 30 20 3c 20 32 2c 20 20 20  0 LIKE 0 < 2,   
1310: 28 30 20 4c 49 4b 45 20 30 29 20 3c 20 32 2c 20  (0 LIKE 0) < 2, 
1320: 20 20 30 20 4c 49 4b 45 20 28 30 20 3c 20 32 29    0 LIKE (0 < 2)
1330: 0a 7d 20 7b 30 20 31 20 30 7d 0a 0a 23 20 53 68  .} {0 1 0}..# Sh
1340: 6f 77 69 6e 67 20 74 68 61 74 20 4c 49 4b 45 20  owing that LIKE 
1350: 61 6e 64 20 3d 3d 20 68 61 76 65 20 74 68 65 20  and == have the 
1360: 73 61 6d 65 20 70 72 65 63 65 64 65 6e 63 65 0a  same precedence.
1370: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
1380: 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 33 20 7b  t e_expr-1.2.3 {
1390: 20 0a 20 20 53 45 4c 45 43 54 20 32 20 4c 49 4b   .  SELECT 2 LIK
13a0: 45 20 32 20 3d 3d 20 31 2c 20 20 20 28 32 20 4c  E 2 == 1,   (2 L
13b0: 49 4b 45 20 32 29 20 3d 3d 20 31 2c 20 20 20 20  IKE 2) == 1,    
13c0: 32 20 4c 49 4b 45 20 28 32 20 3d 3d 20 31 29 0a  2 LIKE (2 == 1).
13d0: 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65  } {1 1 0}.do_exe
13e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
13f0: 2d 31 2e 32 2e 34 20 7b 20 0a 20 20 53 45 4c 45  -1.2.4 { .  SELE
1400: 43 54 20 32 20 3d 3d 20 32 20 4c 49 4b 45 20 31  CT 2 == 2 LIKE 1
1410: 2c 20 20 20 28 32 20 3d 3d 20 32 29 20 4c 49 4b  ,   (2 == 2) LIK
1420: 45 20 31 2c 20 20 20 20 32 20 3d 3d 20 28 32 20  E 1,    2 == (2 
1430: 4c 49 4b 45 20 31 29 0a 7d 20 7b 31 20 31 20 30  LIKE 1).} {1 1 0
1440: 7d 0a 0a 23 20 53 68 6f 77 69 6e 67 20 74 68 61  }..# Showing tha
1450: 74 20 3c 20 67 72 6f 75 70 73 20 6d 6f 72 65 20  t < groups more 
1460: 74 69 67 68 74 6c 79 20 74 68 61 6e 20 3d 3d 20  tightly than == 
1470: 28 3c 20 68 61 73 20 68 69 67 68 65 72 20 70 72  (< has higher pr
1480: 65 63 65 64 65 6e 63 65 29 2e 20 0a 23 0a 64 6f  ecedence). .#.do
1490: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
14a0: 65 78 70 72 2d 31 2e 32 2e 35 20 7b 20 0a 20 20  expr-1.2.5 { .  
14b0: 53 45 4c 45 43 54 20 30 20 3c 20 32 20 3d 3d 20  SELECT 0 < 2 == 
14c0: 31 2c 20 20 20 28 30 20 3c 20 32 29 20 3d 3d 20  1,   (0 < 2) == 
14d0: 31 2c 20 20 20 30 20 3c 20 28 32 20 3d 3d 20 31  1,   0 < (2 == 1
14e0: 29 0a 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65  ).} {1 1 0}.do_e
14f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
1500: 70 72 2d 31 2e 36 20 7b 20 0a 20 20 53 45 4c 45  pr-1.6 { .  SELE
1510: 43 54 20 30 20 3d 3d 20 30 20 3c 20 32 2c 20 20  CT 0 == 0 < 2,  
1520: 20 28 30 20 3d 3d 20 30 29 20 3c 20 32 2c 20 20   (0 == 0) < 2,  
1530: 20 30 20 3d 3d 20 28 30 20 3c 20 32 29 0a 7d 20   0 == (0 < 2).} 
1540: 7b 30 20 31 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  {0 1 0}..#------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
15a0: 20 74 68 65 20 66 6f 75 72 20 75 6e 61 72 79 20   the four unary 
15b0: 70 72 65 66 69 78 20 6f 70 65 72 61 74 6f 72 73  prefix operators
15c0: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
15d0: 65 20 0a 23 20 64 6f 63 75 6d 65 6e 74 61 74 69  e .# documentati
15e0: 6f 6e 20 65 78 69 73 74 2e 0a 23 0a 23 20 45 56  on exist..#.# EV
15f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 39  IDENCE-OF: R-139
1600: 35 38 2d 35 33 34 31 39 20 53 75 70 70 6f 72 74  58-53419 Support
1610: 65 64 20 75 6e 61 72 79 20 70 72 65 66 69 78 20  ed unary prefix 
1620: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 74 68  operators are th
1630: 65 73 65 3a 0a 23 20 2d 20 2b 20 7e 20 4e 4f 54  ese:.# - + ~ NOT
1640: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1650: 73 74 20 65 5f 65 78 70 72 2d 32 2e 31 20 7b 20  st e_expr-2.1 { 
1660: 53 45 4c 45 43 54 20 2d 20 20 20 31 30 20 20 20  SELECT -   10   
1670: 7d 20 7b 2d 31 30 7d 0a 64 6f 5f 65 78 65 63 73  } {-10}.do_execs
1680: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
1690: 2e 32 20 7b 20 53 45 4c 45 43 54 20 2b 20 20 20  .2 { SELECT +   
16a0: 31 30 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65  10   } {10}.do_e
16b0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
16c0: 70 72 2d 32 2e 33 20 7b 20 53 45 4c 45 43 54 20  pr-2.3 { SELECT 
16d0: 7e 20 20 20 31 30 20 20 20 7d 20 7b 2d 31 31 7d  ~   10   } {-11}
16e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
16f0: 20 65 5f 65 78 70 72 2d 32 2e 34 20 7b 20 53 45   e_expr-2.4 { SE
1700: 4c 45 43 54 20 4e 4f 54 20 31 30 20 20 20 7d 20  LECT NOT 10   } 
1710: 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {0}..#----------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1760: 23 20 54 65 73 74 73 20 66 6f 72 20 74 68 65 20  # Tests for the 
1770: 74 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 6d  two statements m
1780: 61 64 65 20 72 65 67 61 72 64 69 6e 67 20 74 68  ade regarding th
1790: 65 20 75 6e 61 72 79 20 2b 20 6f 70 65 72 61 74  e unary + operat
17a0: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
17b0: 2d 4f 46 3a 20 52 2d 35 33 36 37 30 2d 30 33 33  -OF: R-53670-033
17c0: 37 33 20 54 68 65 20 75 6e 61 72 79 20 6f 70 65  73 The unary ope
17d0: 72 61 74 6f 72 20 2b 20 69 73 20 61 20 6e 6f 2d  rator + is a no-
17e0: 6f 70 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  op..#.# EVIDENCE
17f0: 2d 4f 46 3a 20 52 2d 31 39 34 38 30 2d 33 30 39  -OF: R-19480-309
1800: 36 38 20 49 74 20 63 61 6e 20 62 65 20 61 70 70  68 It can be app
1810: 6c 69 65 64 20 74 6f 20 73 74 72 69 6e 67 73 2c  lied to strings,
1820: 20 6e 75 6d 62 65 72 73 2c 0a 23 20 62 6c 6f 62   numbers,.# blob
1830: 73 20 6f 72 20 4e 55 4c 4c 20 61 6e 64 20 69 74  s or NULL and it
1840: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1850: 61 20 72 65 73 75 6c 74 20 77 69 74 68 20 74 68  a result with th
1860: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 0a  e same value as.
1870: 23 20 74 68 65 20 6f 70 65 72 61 6e 64 2e 0a 23  # the operand..#
1880: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6c 69 74  .foreach {tn lit
1890: 65 72 61 6c 20 74 79 70 65 7d 20 7b 0a 20 20 31  eral type} {.  1
18a0: 20 20 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c 64       'helloworld
18b0: 27 20 20 20 74 65 78 74 0a 20 20 32 20 20 20 20  '   text.  2    
18c0: 20 34 35 20 20 20 20 20 20 20 20 20 20 20 20 20   45             
18d0: 69 6e 74 65 67 65 72 0a 20 20 33 20 20 20 20 20  integer.  3     
18e0: 34 35 2e 32 20 20 20 20 20 20 20 20 20 20 20 72  45.2           r
18f0: 65 61 6c 0a 20 20 34 20 20 20 20 20 34 35 2e 30  eal.  4     45.0
1900: 20 20 20 20 20 20 20 20 20 20 20 72 65 61 6c 0a             real.
1910: 20 20 35 20 20 20 20 20 58 27 41 42 43 44 45 46    5     X'ABCDEF
1920: 27 20 20 20 20 20 20 62 6c 6f 62 0a 20 20 36 20  '      blob.  6 
1930: 20 20 20 20 4e 55 4c 4c 20 20 20 20 20 20 20 20      NULL        
1940: 20 20 20 6e 75 6c 6c 0a 7d 20 7b 0a 20 20 73 65     null.} {.  se
1950: 74 20 73 71 6c 20 22 20 53 45 4c 45 43 54 20 71  t sql " SELECT q
1960: 75 6f 74 65 28 20 2b 20 24 6c 69 74 65 72 61 6c  uote( + $literal
1970: 20 29 2c 20 74 79 70 65 6f 66 28 20 2b 20 24 6c   ), typeof( + $l
1980: 69 74 65 72 61 6c 29 20 22 0a 20 20 64 6f 5f 65  iteral) ".  do_e
1990: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
19a0: 70 72 2d 33 2e 24 74 6e 20 24 73 71 6c 20 5b 6c  pr-3.$tn $sql [l
19b0: 69 73 74 20 24 6c 69 74 65 72 61 6c 20 24 74 79  ist $literal $ty
19c0: 70 65 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  pe].}..#--------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a10: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 62  -.# Check that b
1a20: 6f 74 68 20 3d 20 61 6e 64 20 3d 3d 20 61 72 65  oth = and == are
1a30: 20 62 6f 74 68 20 61 63 63 65 70 74 61 62 6c 65   both acceptable
1a40: 20 61 73 20 74 68 65 20 22 65 71 75 61 6c 73 22   as the "equals"
1a50: 20 6f 70 65 72 61 74 6f 72 2e 0a 23 20 53 69 6d   operator..# Sim
1a60: 69 6c 61 72 6c 79 2c 20 65 69 74 68 65 72 20 21  ilarly, either !
1a70: 3d 20 6f 72 20 3c 3e 20 77 6f 72 6b 20 61 73 20  = or <> work as 
1a80: 74 68 65 20 6e 6f 74 2d 65 71 75 61 6c 73 20 6f  the not-equals o
1a90: 70 65 72 61 74 6f 72 2e 0a 23 0a 23 20 45 56 49  perator..#.# EVI
1aa0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 37  DENCE-OF: R-0367
1ab0: 39 2d 36 30 36 33 39 20 45 71 75 61 6c 73 20 63  9-60639 Equals c
1ac0: 61 6e 20 62 65 20 65 69 74 68 65 72 20 3d 20 6f  an be either = o
1ad0: 72 20 3d 3d 2e 0a 23 0a 23 20 45 56 49 44 45 4e  r ==..#.# EVIDEN
1ae0: 43 45 2d 4f 46 3a 20 52 2d 33 30 30 38 32 2d 33  CE-OF: R-30082-3
1af0: 38 39 39 36 20 54 68 65 20 6e 6f 6e 2d 65 71 75  8996 The non-equ
1b00: 61 6c 73 20 6f 70 65 72 61 74 6f 72 20 63 61 6e  als operator can
1b10: 20 62 65 20 65 69 74 68 65 72 20 21 3d 20 6f 72   be either != or
1b20: 0a 23 20 3c 3e 2e 0a 23 0a 66 6f 72 65 61 63 68  .# <>..#.foreach
1b30: 20 7b 74 6e 20 6c 69 74 65 72 61 6c 20 64 69 66   {tn literal dif
1b40: 66 65 72 65 6e 74 7d 20 7b 0a 20 20 31 20 20 20  ferent} {.  1   
1b50: 27 68 65 6c 6c 6f 77 6f 72 6c 64 27 20 20 27 31  'helloworld'  '1
1b60: 32 33 34 35 27 0a 20 20 32 20 20 20 32 32 20 20  2345'.  2   22  
1b70: 20 20 20 20 20 20 20 20 20 20 32 33 0a 20 20 33            23.  3
1b80: 20 20 20 27 78 79 7a 27 20 20 20 20 20 20 20 20     'xyz'        
1b90: 20 58 27 37 38 37 39 37 41 27 0a 20 20 34 20 20   X'78797A'.  4  
1ba0: 20 58 27 37 38 37 39 37 41 30 30 27 20 20 20 27   X'78797A00'   '
1bb0: 78 79 7a 27 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78  xyz'.} {.  do_ex
1bc0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
1bd0: 72 2d 34 2e 24 74 6e 20 22 0a 20 20 20 20 53 45  r-4.$tn ".    SE
1be0: 4c 45 43 54 20 24 6c 69 74 65 72 61 6c 20 20 3d  LECT $literal  =
1bf0: 20 24 6c 69 74 65 72 61 6c 2c 20 20 20 24 6c 69   $literal,   $li
1c00: 74 65 72 61 6c 20 3d 3d 20 24 6c 69 74 65 72 61  teral == $litera
1c10: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24 6c  l,.           $l
1c20: 69 74 65 72 61 6c 20 20 3d 20 24 64 69 66 66 65  iteral  = $diffe
1c30: 72 65 6e 74 2c 20 24 6c 69 74 65 72 61 6c 20 3d  rent, $literal =
1c40: 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 0a 20 20  = $different,.  
1c50: 20 20 20 20 20 20 20 20 20 24 6c 69 74 65 72 61           $litera
1c60: 6c 20 20 3d 20 4e 55 4c 4c 2c 20 20 20 20 20 20  l  = NULL,      
1c70: 20 24 6c 69 74 65 72 61 6c 20 3d 3d 20 4e 55 4c   $literal == NUL
1c80: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24 6c  L,.           $l
1c90: 69 74 65 72 61 6c 20 21 3d 20 24 6c 69 74 65 72  iteral != $liter
1ca0: 61 6c 2c 20 20 20 24 6c 69 74 65 72 61 6c 20 3c  al,   $literal <
1cb0: 3e 20 24 6c 69 74 65 72 61 6c 2c 0a 20 20 20 20  > $literal,.    
1cc0: 20 20 20 20 20 20 20 24 6c 69 74 65 72 61 6c 20         $literal 
1cd0: 21 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 20 24  != $different, $
1ce0: 6c 69 74 65 72 61 6c 20 3c 3e 20 24 64 69 66 66  literal <> $diff
1cf0: 65 72 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  erent,.         
1d00: 20 20 24 6c 69 74 65 72 61 6c 20 21 3d 20 4e 55    $literal != NU
1d10: 4c 4c 2c 20 20 20 20 20 20 20 24 6c 69 74 65 72  LL,       $liter
1d20: 61 6c 20 21 3d 20 4e 55 4c 4c 0a 0a 20 20 22 20  al != NULL..  " 
1d30: 7b 31 20 31 20 30 20 30 20 7b 7d 20 7b 7d 20 30  {1 1 0 0 {} {} 0
1d40: 20 30 20 31 20 31 20 7b 7d 20 7b 7d 7d 0a 7d 0a   0 1 1 {} {}}.}.
1d50: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
1da0: 73 74 20 74 68 65 20 7c 7c 20 6f 70 65 72 61 74  st the || operat
1db0: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
1dc0: 2d 4f 46 3a 20 52 2d 34 34 34 30 39 2d 36 32 36  -OF: R-44409-626
1dd0: 34 31 20 54 68 65 20 7c 7c 20 6f 70 65 72 61 74  41 The || operat
1de0: 6f 72 20 69 73 20 22 63 6f 6e 63 61 74 65 6e 61  or is "concatena
1df0: 74 65 22 20 2d 20 69 74 20 6a 6f 69 6e 73 0a 23  te" - it joins.#
1e00: 20 74 6f 67 65 74 68 65 72 20 74 68 65 20 74 77   together the tw
1e10: 6f 20 73 74 72 69 6e 67 73 20 6f 66 20 69 74 73  o strings of its
1e20: 20 6f 70 65 72 61 6e 64 73 2e 0a 23 0a 66 6f 72   operands..#.for
1e30: 65 61 63 68 20 7b 74 6e 20 61 20 62 7d 20 7b 0a  each {tn a b} {.
1e40: 20 20 31 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c    1   'helloworl
1e50: 64 27 20 20 27 31 32 33 34 35 27 0a 20 20 32 20  d'  '12345'.  2 
1e60: 20 20 32 32 20 20 20 20 20 20 20 20 20 20 20 20    22            
1e70: 32 33 0a 7d 20 7b 0a 20 20 73 65 74 20 61 73 20  23.} {.  set as 
1e80: 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20  [db one "SELECT 
1e90: 24 61 22 5d 0a 20 20 73 65 74 20 62 73 20 5b 64  $a"].  set bs [d
1ea0: 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 24 62  b one "SELECT $b
1eb0: 22 5d 0a 20 20 0a 20 20 64 6f 5f 65 78 65 63 73  "].  .  do_execs
1ec0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 35  ql_test e_expr-5
1ed0: 2e 24 74 6e 20 22 53 45 4c 45 43 54 20 24 61 20  .$tn "SELECT $a 
1ee0: 7c 7c 20 24 62 22 20 5b 6c 69 73 74 20 22 24 7b  || $b" [list "${
1ef0: 61 73 7d 24 7b 62 73 7d 22 5d 0a 7d 0a 0a 23 2d  as}${bs}"].}..#-
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
1f50: 74 68 65 20 25 20 6f 70 65 72 61 74 6f 72 2e 0a  the % operator..
1f60: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
1f70: 20 52 2d 30 38 39 31 34 2d 36 33 37 39 30 20 54   R-08914-63790 T
1f80: 68 65 20 6f 70 65 72 61 74 6f 72 20 25 20 6f 75  he operator % ou
1f90: 74 70 75 74 73 20 74 68 65 20 76 61 6c 75 65 20  tputs the value 
1fa0: 6f 66 20 69 74 73 0a 23 20 6c 65 66 74 20 6f 70  of its.# left op
1fb0: 65 72 61 6e 64 20 6d 6f 64 75 6c 6f 20 69 74 73  erand modulo its
1fc0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 0a   right operand..
1fd0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
1fe0: 74 20 65 5f 65 78 70 72 2d 36 2e 31 20 7b 53 45  t e_expr-6.1 {SE
1ff0: 4c 45 43 54 20 20 37 32 25 35 7d 20 20 7b 32 7d  LECT  72%5}  {2}
2000: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2010: 20 65 5f 65 78 70 72 2d 36 2e 32 20 7b 53 45 4c   e_expr-6.2 {SEL
2020: 45 43 54 20 20 37 32 25 2d 35 7d 20 7b 32 7d 0a  ECT  72%-5} {2}.
2030: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2040: 65 5f 65 78 70 72 2d 36 2e 33 20 7b 53 45 4c 45  e_expr-6.3 {SELE
2050: 43 54 20 2d 37 32 25 2d 35 7d 20 7b 2d 32 7d 0a  CT -72%-5} {-2}.
2060: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2070: 65 5f 65 78 70 72 2d 36 2e 34 20 7b 53 45 4c 45  e_expr-6.4 {SELE
2080: 43 54 20 2d 37 32 25 35 7d 20 20 7b 2d 32 7d 0a  CT -72%5}  {-2}.
2090: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
20e0: 73 74 20 74 68 61 74 20 74 68 65 20 72 65 73 75  st that the resu
20f0: 6c 74 73 20 6f 66 20 61 6c 6c 20 62 69 6e 61 72  lts of all binar
2100: 79 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  y operators are 
2110: 65 69 74 68 65 72 20 6e 75 6d 65 72 69 63 20 6f  either numeric o
2120: 72 20 0a 23 20 4e 55 4c 4c 2c 20 65 78 63 65 70  r .# NULL, excep
2130: 74 20 66 6f 72 20 74 68 65 20 7c 7c 20 6f 70 65  t for the || ope
2140: 72 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79  rator, which may
2150: 20 65 76 61 6c 75 61 74 65 20 74 6f 20 65 69 74   evaluate to eit
2160: 68 65 72 20 61 20 74 65 78 74 0a 23 20 76 61 6c  her a text.# val
2170: 75 65 20 6f 72 20 4e 55 4c 4c 2e 0a 23 0a 23 20  ue or NULL..#.# 
2180: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
2190: 30 36 36 35 2d 31 37 37 39 32 20 54 68 65 20 72  0665-17792 The r
21a0: 65 73 75 6c 74 20 6f 66 20 61 6e 79 20 62 69 6e  esult of any bin
21b0: 61 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ary operator is 
21c0: 65 69 74 68 65 72 0a 23 20 61 20 6e 75 6d 65 72  either.# a numer
21d0: 69 63 20 76 61 6c 75 65 20 6f 72 20 4e 55 4c 4c  ic value or NULL
21e0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  , except for the
21f0: 20 7c 7c 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f   || concatenatio
2200: 6e 20 6f 70 65 72 61 74 6f 72 0a 23 20 77 68 69  n operator.# whi
2210: 63 68 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  ch always evalua
2220: 74 65 73 20 74 6f 20 65 69 74 68 65 72 20 4e 55  tes to either NU
2230: 4c 4c 20 6f 72 20 61 20 74 65 78 74 20 76 61 6c  LL or a text val
2240: 75 65 2e 0a 23 0a 73 65 74 20 6c 69 74 65 72 61  ue..#.set litera
2250: 6c 73 20 7b 0a 20 20 31 20 27 61 62 63 27 20 20  ls {.  1 'abc'  
2260: 20 20 20 20 20 20 32 20 27 68 65 78 61 64 65 63        2 'hexadec
2270: 69 6d 61 6c 27 20 20 20 20 20 20 20 33 20 27 27  imal'       3 ''
2280: 0a 20 20 34 20 31 32 33 20 20 20 20 20 20 20 20  .  4 123        
2290: 20 20 35 20 2d 31 32 33 20 20 20 20 20 20 20 20    5 -123        
22a0: 20 20 20 20 20 20 20 20 36 20 30 0a 20 20 37 20          6 0.  7 
22b0: 31 32 33 2e 34 20 20 20 20 20 20 20 20 38 20 30  123.4        8 0
22c0: 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
22d0: 20 20 20 39 20 2d 31 32 33 2e 34 0a 20 31 30 20     9 -123.4. 10 
22e0: 58 27 41 42 43 44 45 46 27 20 20 20 31 31 20 58  X'ABCDEF'   11 X
22f0: 27 27 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ''              
2300: 20 20 31 32 20 58 27 30 30 30 30 27 0a 20 31 33    12 X'0000'. 13
2310: 20 20 20 20 20 4e 55 4c 4c 0a 7d 0a 66 6f 72 65       NULL.}.fore
2320: 61 63 68 20 6f 70 20 24 6f 70 6c 69 73 74 20 7b  ach op $oplist {
2330: 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 31 20 72  .  foreach {n1 r
2340: 68 73 7d 20 24 6c 69 74 65 72 61 6c 73 20 7b 20  hs} $literals { 
2350: 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 32 20 6c  .  foreach {n2 l
2360: 68 73 7d 20 24 6c 69 74 65 72 61 6c 73 20 7b 0a  hs} $literals {.
2370: 0a 20 20 20 20 73 65 74 20 74 20 5b 64 62 20 6f  .    set t [db o
2380: 6e 65 20 22 20 53 45 4c 45 43 54 20 74 79 70 65  ne " SELECT type
2390: 6f 66 28 24 6c 68 73 20 24 6f 70 20 24 72 68 73  of($lhs $op $rhs
23a0: 29 20 22 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74  ) "].    do_test
23b0: 20 65 5f 65 78 70 72 2d 37 2e 24 6f 70 6e 61 6d   e_expr-7.$opnam
23c0: 65 28 24 6f 70 29 2e 24 6e 31 2e 24 6e 32 20 7b  e($op).$n1.$n2 {
23d0: 0a 20 20 20 20 20 20 65 78 70 72 20 7b 0a 20 20  .      expr {.  
23e0: 20 20 20 20 20 20 20 20 20 28 24 6f 70 3d 3d 22           ($op=="
23f0: 7c 7c 22 20 26 26 20 28 24 74 20 3d 3d 20 22 74  ||" && ($t == "t
2400: 65 78 74 22 20 7c 7c 20 24 74 20 3d 3d 20 22 6e  ext" || $t == "n
2410: 75 6c 6c 22 29 29 0a 20 20 20 20 20 20 20 20 7c  ull")).        |
2420: 7c 20 28 24 6f 70 21 3d 22 7c 7c 22 20 26 26 20  | ($op!="||" && 
2430: 28 24 74 20 3d 3d 20 22 69 6e 74 65 67 65 72 22  ($t == "integer"
2440: 20 7c 7c 20 24 74 20 3d 3d 20 22 72 65 61 6c 22   || $t == "real"
2450: 20 7c 7c 20 24 74 20 3d 3d 20 22 6e 75 6c 6c 22   || $t == "null"
2460: 29 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  )).      }.    }
2470: 20 31 0a 0a 20 20 7d 7d 0a 7d 0a 0a 23 2d 2d 2d   1..  }}.}..#---
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
24d0: 65 20 49 53 20 61 6e 64 20 49 53 20 4e 4f 54 20  e IS and IS NOT 
24e0: 6f 70 65 72 61 74 6f 72 73 2e 0a 23 0a 23 20 45  operators..#.# E
24f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
2500: 37 33 31 2d 34 35 37 37 33 20 54 68 65 20 49 53  731-45773 The IS
2510: 20 61 6e 64 20 49 53 20 4e 4f 54 20 6f 70 65 72   and IS NOT oper
2520: 61 74 6f 72 73 20 77 6f 72 6b 20 6c 69 6b 65 20  ators work like 
2530: 3d 20 61 6e 64 0a 23 20 21 3d 20 65 78 63 65 70  = and.# != excep
2540: 74 20 77 68 65 6e 20 6f 6e 65 20 6f 72 20 62 6f  t when one or bo
2550: 74 68 20 6f 66 20 74 68 65 20 6f 70 65 72 61 6e  th of the operan
2560: 64 73 20 61 72 65 20 4e 55 4c 4c 2e 0a 23 0a 23  ds are NULL..#.#
2570: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2580: 30 36 33 32 35 2d 31 35 33 31 35 20 49 6e 20 74  06325-15315 In t
2590: 68 69 73 20 63 61 73 65 2c 20 69 66 20 62 6f 74  his case, if bot
25a0: 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e  h operands are N
25b0: 55 4c 4c 2c 0a 23 20 74 68 65 6e 20 74 68 65 20  ULL,.# then the 
25c0: 49 53 20 6f 70 65 72 61 74 6f 72 20 65 76 61 6c  IS operator eval
25d0: 75 61 74 65 73 20 74 6f 20 31 20 28 74 72 75 65  uates to 1 (true
25e0: 29 20 61 6e 64 20 74 68 65 20 49 53 20 4e 4f 54  ) and the IS NOT
25f0: 20 6f 70 65 72 61 74 6f 72 0a 23 20 65 76 61 6c   operator.# eval
2600: 75 61 74 65 73 20 74 6f 20 30 20 28 66 61 6c 73  uates to 0 (fals
2610: 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  e)..#.# EVIDENCE
2620: 2d 4f 46 3a 20 52 2d 31 39 38 31 32 2d 33 36 37  -OF: R-19812-367
2630: 37 39 20 49 66 20 6f 6e 65 20 6f 70 65 72 61 6e  79 If one operan
2640: 64 20 69 73 20 4e 55 4c 4c 20 61 6e 64 20 74 68  d is NULL and th
2650: 65 20 6f 74 68 65 72 20 69 73 0a 23 20 6e 6f 74  e other is.# not
2660: 2c 20 74 68 65 6e 20 74 68 65 20 49 53 20 6f 70  , then the IS op
2670: 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73  erator evaluates
2680: 20 74 6f 20 30 20 28 66 61 6c 73 65 29 20 61 6e   to 0 (false) an
2690: 64 20 74 68 65 20 49 53 20 4e 4f 54 0a 23 20 6f  d the IS NOT.# o
26a0: 70 65 72 61 74 6f 72 20 69 73 20 31 20 28 74 72  perator is 1 (tr
26b0: 75 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ue)..#.# EVIDENC
26c0: 45 2d 4f 46 3a 20 52 2d 36 31 39 37 35 2d 31 33  E-OF: R-61975-13
26d0: 34 31 30 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  410 It is not po
26e0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 49 53  ssible for an IS
26f0: 20 6f 72 20 49 53 20 4e 4f 54 0a 23 20 65 78 70   or IS NOT.# exp
2700: 72 65 73 73 69 6f 6e 20 74 6f 20 65 76 61 6c 75  ression to evalu
2710: 61 74 65 20 74 6f 20 4e 55 4c 4c 2e 0a 23 0a 64  ate to NULL..#.d
2720: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
2730: 5f 65 78 70 72 2d 38 2e 31 2e 31 20 20 7b 20 53  _expr-8.1.1  { S
2740: 45 4c 45 43 54 20 4e 55 4c 4c 20 49 53 20 20 20  ELECT NULL IS   
2750: 20 20 4e 55 4c 4c 20 7d 20 7b 31 7d 0a 64 6f 5f    NULL } {1}.do_
2760: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
2770: 78 70 72 2d 38 2e 31 2e 32 20 20 7b 20 53 45 4c  xpr-8.1.2  { SEL
2780: 45 43 54 20 27 61 62 27 20 49 53 20 20 20 20 20  ECT 'ab' IS     
2790: 4e 55 4c 4c 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78  NULL } {0}.do_ex
27a0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
27b0: 72 2d 38 2e 31 2e 33 20 20 7b 20 53 45 4c 45 43  r-8.1.3  { SELEC
27c0: 54 20 4e 55 4c 4c 20 49 53 20 20 20 20 20 27 61  T NULL IS     'a
27d0: 62 27 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63  b' } {0}.do_exec
27e0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
27f0: 38 2e 31 2e 34 20 20 7b 20 53 45 4c 45 43 54 20  8.1.4  { SELECT 
2800: 27 61 62 27 20 49 53 20 20 20 20 20 27 61 62 27  'ab' IS     'ab'
2810: 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71   } {1}.do_execsq
2820: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
2830: 31 2e 35 20 20 7b 20 53 45 4c 45 43 54 20 4e 55  1.5  { SELECT NU
2840: 4c 4c 20 3d 3d 20 20 20 20 20 4e 55 4c 4c 20 7d  LL ==     NULL }
2850: 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {{}}.do_execsql
2860: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31  _test e_expr-8.1
2870: 2e 36 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .6  { SELECT 'ab
2880: 27 20 3d 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20  ' ==     NULL } 
2890: 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {{}}.do_execsql_
28a0: 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e  test e_expr-8.1.
28b0: 37 20 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c  7  { SELECT NULL
28c0: 20 3d 3d 20 20 20 20 20 27 61 62 27 20 7d 20 7b   ==     'ab' } {
28d0: 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}}.do_execsql_t
28e0: 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 38  est e_expr-8.1.8
28f0: 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27 20    { SELECT 'ab' 
2900: 3d 3d 20 20 20 20 20 27 61 62 27 20 7d 20 7b 31  ==     'ab' } {1
2910: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
2920: 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 39 20 20  t e_expr-8.1.9  
2930: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 49 53  { SELECT NULL IS
2940: 20 4e 4f 54 20 4e 55 4c 4c 20 7d 20 7b 30 7d 0a   NOT NULL } {0}.
2950: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2960: 65 5f 65 78 70 72 2d 38 2e 31 2e 31 30 20 7b 20  e_expr-8.1.10 { 
2970: 53 45 4c 45 43 54 20 27 61 62 27 20 49 53 20 4e  SELECT 'ab' IS N
2980: 4f 54 20 4e 55 4c 4c 20 7d 20 7b 31 7d 0a 64 6f  OT NULL } {1}.do
2990: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
29a0: 65 78 70 72 2d 38 2e 31 2e 31 31 20 7b 20 53 45  expr-8.1.11 { SE
29b0: 4c 45 43 54 20 4e 55 4c 4c 20 49 53 20 4e 4f 54  LECT NULL IS NOT
29c0: 20 27 61 62 27 20 7d 20 7b 31 7d 0a 64 6f 5f 65   'ab' } {1}.do_e
29d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
29e0: 70 72 2d 38 2e 31 2e 31 32 20 7b 20 53 45 4c 45  pr-8.1.12 { SELE
29f0: 43 54 20 27 61 62 27 20 49 53 20 4e 4f 54 20 27  CT 'ab' IS NOT '
2a00: 61 62 27 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65  ab' } {0}.do_exe
2a10: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
2a20: 2d 38 2e 31 2e 31 33 20 7b 20 53 45 4c 45 43 54  -8.1.13 { SELECT
2a30: 20 4e 55 4c 4c 20 21 3d 20 20 20 20 20 4e 55 4c   NULL !=     NUL
2a40: 4c 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63  L } {{}}.do_exec
2a50: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
2a60: 38 2e 31 2e 31 34 20 7b 20 53 45 4c 45 43 54 20  8.1.14 { SELECT 
2a70: 27 61 62 27 20 21 3d 20 20 20 20 20 4e 55 4c 4c  'ab' !=     NULL
2a80: 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73   } {{}}.do_execs
2a90: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38  ql_test e_expr-8
2aa0: 2e 31 2e 31 35 20 7b 20 53 45 4c 45 43 54 20 4e  .1.15 { SELECT N
2ab0: 55 4c 4c 20 21 3d 20 20 20 20 20 27 61 62 27 20  ULL !=     'ab' 
2ac0: 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  } {{}}.do_execsq
2ad0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
2ae0: 31 2e 31 36 20 7b 20 53 45 4c 45 43 54 20 27 61  1.16 { SELECT 'a
2af0: 62 27 20 21 3d 20 20 20 20 20 27 61 62 27 20 7d  b' !=     'ab' }
2b00: 20 7b 30 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 6e   {0}..foreach {n
2b10: 31 20 72 68 73 7d 20 24 6c 69 74 65 72 61 6c 73  1 rhs} $literals
2b20: 20 7b 20 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e   { .  foreach {n
2b30: 32 20 6c 68 73 7d 20 24 6c 69 74 65 72 61 6c 73  2 lhs} $literals
2b40: 20 7b 0a 20 20 20 20 69 66 20 7b 24 72 68 73 21   {.    if {$rhs!
2b50: 3d 22 4e 55 4c 4c 22 20 26 26 20 24 6c 68 73 21  ="NULL" && $lhs!
2b60: 3d 22 4e 55 4c 4c 22 7d 20 7b 0a 20 20 20 20 20  ="NULL"} {.     
2b70: 20 73 65 74 20 65 71 20 5b 65 78 65 63 73 71 6c   set eq [execsql
2b80: 20 22 53 45 4c 45 43 54 20 24 6c 68 73 20 3d 20   "SELECT $lhs = 
2b90: 24 72 68 73 2c 20 24 6c 68 73 20 21 3d 20 24 72  $rhs, $lhs != $r
2ba0: 68 73 22 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20  hs"].    } else 
2bb0: 7b 0a 20 20 20 20 20 20 73 65 74 20 65 71 20 5b  {.      set eq [
2bc0: 6c 69 73 74 20 5b 65 78 70 72 20 7b 24 6c 68 73  list [expr {$lhs
2bd0: 3d 3d 22 4e 55 4c 4c 22 20 26 26 20 24 72 68 73  =="NULL" && $rhs
2be0: 3d 3d 22 4e 55 4c 4c 22 7d 5d 20 5c 0a 20 20 20  =="NULL"}] \.   
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 5b 65 78 70 72 20 7b 24 6c 68 73 21 3d 22 4e 55  [expr {$lhs!="NU
2c10: 4c 4c 22 20 7c 7c 20 24 72 68 73 21 3d 22 4e 55  LL" || $rhs!="NU
2c20: 4c 4c 22 7d 5d 0a 20 20 20 20 20 20 5d 0a 20 20  LL"}].      ].  
2c30: 20 20 7d 0a 20 20 20 20 73 65 74 20 74 65 73 74    }.    set test
2c40: 20 65 5f 65 78 70 72 2d 38 2e 32 2e 24 6e 31 2e   e_expr-8.2.$n1.
2c50: 24 6e 32 0a 20 20 20 20 64 6f 5f 65 78 65 63 73  $n2.    do_execs
2c60: 71 6c 5f 74 65 73 74 20 24 74 65 73 74 2e 31 20  ql_test $test.1 
2c70: 22 53 45 4c 45 43 54 20 24 6c 68 73 20 49 53 20  "SELECT $lhs IS 
2c80: 24 72 68 73 2c 20 24 6c 68 73 20 49 53 20 4e 4f  $rhs, $lhs IS NO
2c90: 54 20 24 72 68 73 22 20 24 65 71 0a 20 20 20 20  T $rhs" $eq.    
2ca0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2cb0: 24 74 65 73 74 2e 32 20 22 0a 20 20 20 20 20 20  $test.2 ".      
2cc0: 53 45 4c 45 43 54 20 28 24 6c 68 73 20 49 53 20  SELECT ($lhs IS 
2cd0: 24 72 68 73 29 20 49 53 20 4e 55 4c 4c 2c 20 28  $rhs) IS NULL, (
2ce0: 24 6c 68 73 20 49 53 20 4e 4f 54 20 24 72 68 73  $lhs IS NOT $rhs
2cf0: 29 20 49 53 20 4e 55 4c 4c 0a 20 20 20 20 22 20  ) IS NULL.    " 
2d00: 7b 30 20 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d  {0 0}.  }.}..#--
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d50: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 75 6e 20 73 6f  -------.# Run so
2d60: 6d 65 20 74 65 73 74 73 20 6f 6e 20 74 68 65 20  me tests on the 
2d70: 43 4f 4c 4c 41 54 45 20 22 75 6e 61 72 79 20 70  COLLATE "unary p
2d80: 6f 73 74 66 69 78 20 6f 70 65 72 61 74 6f 72 22  ostfix operator"
2d90: 2e 0a 23 0a 23 20 54 68 69 73 20 63 6f 6c 6c 61  ..#.# This colla
2da0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65  tion sequence re
2db0: 76 65 72 73 65 73 20 62 6f 74 68 20 61 72 67 75  verses both argu
2dc0: 6d 65 6e 74 73 20 62 65 66 6f 72 65 20 75 73 69  ments before usi
2dd0: 6e 67 20 0a 23 20 5b 73 74 72 69 6e 67 20 63 6f  ng .# [string co
2de0: 6d 70 61 72 65 5d 20 74 6f 20 63 6f 6d 70 61 72  mpare] to compar
2df0: 65 20 74 68 65 6d 2e 20 46 6f 72 20 65 78 61 6d  e them. For exam
2e00: 70 6c 65 2c 20 77 68 65 6e 20 63 6f 6d 70 61 72  ple, when compar
2e10: 69 6e 67 20 74 68 65 0a 23 20 73 74 72 69 6e 67  ing the.# string
2e20: 73 20 27 6f 6e 65 27 20 61 6e 64 20 27 66 6f 75  s 'one' and 'fou
2e30: 72 27 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72  r', return the r
2e40: 65 73 75 6c 74 20 6f 66 3a 0a 23 20 20 20 0a 23  esult of:.#   .#
2e50: 20 20 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72     string compar
2e60: 65 20 65 6e 6f 20 72 75 6f 66 0a 23 0a 70 72 6f  e eno ruof.#.pro
2e70: 63 20 72 65 76 65 72 73 65 5f 73 74 72 20 7b 7a  c reverse_str {z
2e80: 53 74 72 7d 20 7b 0a 20 20 73 65 74 20 6f 75 74  Str} {.  set out
2e90: 20 22 22 0a 20 20 66 6f 72 65 61 63 68 20 63 20   "".  foreach c 
2ea0: 5b 73 70 6c 69 74 20 24 7a 53 74 72 20 7b 7d 5d  [split $zStr {}]
2eb0: 20 7b 20 73 65 74 20 6f 75 74 20 22 24 7b 63 7d   { set out "${c}
2ec0: 24 7b 6f 75 74 7d 22 20 7d 0a 20 20 73 65 74 20  ${out}" }.  set 
2ed0: 6f 75 74 0a 7d 0a 70 72 6f 63 20 72 65 76 65 72  out.}.proc rever
2ee0: 73 65 5f 63 6f 6c 6c 61 74 65 20 7b 7a 4c 65 66  se_collate {zLef
2ef0: 74 20 7a 52 69 67 68 74 7d 20 7b 0a 20 20 73 74  t zRight} {.  st
2f00: 72 69 6e 67 20 63 6f 6d 70 61 72 65 20 5b 72 65  ring compare [re
2f10: 76 65 72 73 65 5f 73 74 72 20 24 7a 4c 65 66 74  verse_str $zLeft
2f20: 5d 20 5b 72 65 76 65 72 73 65 5f 73 74 72 20 24  ] [reverse_str $
2f30: 7a 52 69 67 68 74 5d 0a 7d 0a 64 62 20 63 6f 6c  zRight].}.db col
2f40: 6c 61 74 65 20 72 65 76 65 72 73 65 20 72 65 76  late reverse rev
2f50: 65 72 73 65 5f 63 6f 6c 6c 61 74 65 0a 0a 23 20  erse_collate..# 
2f60: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
2f70: 39 35 37 37 2d 33 33 34 37 31 20 54 68 65 20 43  9577-33471 The C
2f80: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
2f90: 69 73 20 61 20 75 6e 61 72 79 20 70 6f 73 74 66  is a unary postf
2fa0: 69 78 0a 23 20 6f 70 65 72 61 74 6f 72 20 74 68  ix.# operator th
2fb0: 61 74 20 61 73 73 69 67 6e 73 20 61 20 63 6f 6c  at assigns a col
2fc0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
2fd0: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
2fe0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
2ff0: 46 3a 20 52 2d 32 33 34 34 31 2d 32 32 35 34 31  F: R-23441-22541
3000: 20 54 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   The COLLATE ope
3010: 72 61 74 6f 72 20 68 61 73 20 61 20 68 69 67 68  rator has a high
3020: 65 72 0a 23 20 70 72 65 63 65 64 65 6e 63 65 20  er.# precedence 
3030: 28 62 69 6e 64 73 20 6d 6f 72 65 20 74 69 67 68  (binds more tigh
3040: 74 6c 79 29 20 74 68 61 6e 20 61 6e 79 20 70 72  tly) than any pr
3050: 65 66 69 78 20 75 6e 61 72 79 20 6f 70 65 72 61  efix unary opera
3060: 74 6f 72 20 6f 72 20 61 6e 79 0a 23 20 62 69 6e  tor or any.# bin
3070: 61 72 79 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a  ary operator..#.
3080: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3090: 65 5f 65 78 70 72 2d 39 2e 31 20 7b 20 53 45 4c  e_expr-9.1 { SEL
30a0: 45 43 54 20 20 27 61 62 63 64 27 20 3c 20 27 62  ECT  'abcd' < 'b
30b0: 62 62 62 27 20 20 20 20 43 4f 4c 4c 41 54 45 20  bbb'    COLLATE 
30c0: 72 65 76 65 72 73 65 20 7d 20 30 0a 64 6f 5f 65  reverse } 0.do_e
30d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
30e0: 70 72 2d 39 2e 32 20 7b 20 53 45 4c 45 43 54 20  pr-9.2 { SELECT 
30f0: 28 27 61 62 63 64 27 20 3c 20 27 62 62 62 62 27  ('abcd' < 'bbbb'
3100: 29 20 20 20 43 4f 4c 4c 41 54 45 20 72 65 76 65  )   COLLATE reve
3110: 72 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73  rse } 1.do_execs
3120: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
3130: 2e 33 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62  .3 { SELECT  'ab
3140: 63 64 27 20 3c 3d 20 27 62 62 62 62 27 20 20 20  cd' <= 'bbbb'   
3150: 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65 20  COLLATE reverse 
3160: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
3170: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 34 20 7b  est e_expr-9.4 {
3180: 20 53 45 4c 45 43 54 20 28 27 61 62 63 64 27 20   SELECT ('abcd' 
3190: 3c 3d 20 27 62 62 62 62 27 29 20 20 43 4f 4c 4c  <= 'bbbb')  COLL
31a0: 41 54 45 20 72 65 76 65 72 73 65 20 7d 20 31 0a  ATE reverse } 1.
31b0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
31c0: 20 65 5f 65 78 70 72 2d 39 2e 35 20 7b 20 53 45   e_expr-9.5 { SE
31d0: 4c 45 43 54 20 20 27 61 62 63 64 27 20 3e 20 27  LECT  'abcd' > '
31e0: 62 62 62 62 27 20 20 20 20 43 4f 4c 4c 41 54 45  bbbb'    COLLATE
31f0: 20 72 65 76 65 72 73 65 20 7d 20 31 0a 64 6f 5f   reverse } 1.do_
3200: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3210: 78 70 72 2d 39 2e 36 20 7b 20 53 45 4c 45 43 54  xpr-9.6 { SELECT
3220: 20 28 27 61 62 63 64 27 20 3e 20 27 62 62 62 62   ('abcd' > 'bbbb
3230: 27 29 20 20 20 43 4f 4c 4c 41 54 45 20 72 65 76  ')   COLLATE rev
3240: 65 72 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63  erse } 0.do_exec
3250: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3260: 39 2e 37 20 7b 20 53 45 4c 45 43 54 20 20 27 61  9.7 { SELECT  'a
3270: 62 63 64 27 20 3e 3d 20 27 62 62 62 62 27 20 20  bcd' >= 'bbbb'  
3280: 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65   COLLATE reverse
3290: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
32a0: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 38 20  test e_expr-9.8 
32b0: 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63 64 27  { SELECT ('abcd'
32c0: 20 3e 3d 20 27 62 62 62 62 27 29 20 20 43 4f 4c   >= 'bbbb')  COL
32d0: 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d 20 30  LATE reverse } 0
32e0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
32f0: 74 20 65 5f 65 78 70 72 2d 39 2e 31 30 20 7b 20  t e_expr-9.10 { 
3300: 53 45 4c 45 43 54 20 20 27 61 62 63 64 27 20 3d  SELECT  'abcd' =
3310: 20 20 27 41 42 43 44 27 20 20 43 4f 4c 4c 41 54    'ABCD'  COLLAT
3320: 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64 6f 5f  E nocase } 1.do_
3330: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3340: 78 70 72 2d 39 2e 31 31 20 7b 20 53 45 4c 45 43  xpr-9.11 { SELEC
3350: 54 20 28 27 61 62 63 64 27 20 3d 20 20 27 41 42  T ('abcd' =  'AB
3360: 43 44 27 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  CD') COLLATE noc
3370: 61 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  ase } 0.do_execs
3380: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
3390: 2e 31 32 20 7b 20 53 45 4c 45 43 54 20 20 27 61  .12 { SELECT  'a
33a0: 62 63 64 27 20 3d 3d 20 27 41 42 43 44 27 20 20  bcd' == 'ABCD'  
33b0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d  COLLATE nocase }
33c0: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
33d0: 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 33 20 7b  st e_expr-9.13 {
33e0: 20 53 45 4c 45 43 54 20 28 27 61 62 63 64 27 20   SELECT ('abcd' 
33f0: 3d 3d 20 27 41 42 43 44 27 29 20 43 4f 4c 4c 41  == 'ABCD') COLLA
3400: 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64 6f  TE nocase } 0.do
3410: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3420: 65 78 70 72 2d 39 2e 31 34 20 7b 20 53 45 4c 45  expr-9.14 { SELE
3430: 43 54 20 20 27 61 62 63 64 27 20 49 53 20 27 41  CT  'abcd' IS 'A
3440: 42 43 44 27 20 20 43 4f 4c 4c 41 54 45 20 6e 6f  BCD'  COLLATE no
3450: 63 61 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  case } 1.do_exec
3460: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3470: 39 2e 31 35 20 7b 20 53 45 4c 45 43 54 20 28 27  9.15 { SELECT ('
3480: 61 62 63 64 27 20 49 53 20 27 41 42 43 44 27 29  abcd' IS 'ABCD')
3490: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
34a0: 7d 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } 0..do_execsql_
34b0: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 36  test e_expr-9.16
34c0: 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64   { SELECT  'abcd
34d0: 27 20 21 3d 20 27 41 42 43 44 27 20 20 20 20 20  ' != 'ABCD'     
34e0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
34f0: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
3500: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 37 20  est e_expr-9.17 
3510: 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63 64 27  { SELECT ('abcd'
3520: 20 21 3d 20 27 41 42 43 44 27 29 20 20 20 20 20   != 'ABCD')     
3530: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d  COLLATE nocase }
3540: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
3550: 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 38 20 7b  st e_expr-9.18 {
3560: 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27 20   SELECT  'abcd' 
3570: 3c 3e 20 27 41 42 43 44 27 20 20 20 20 20 20 43  <> 'ABCD'      C
3580: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20  OLLATE nocase } 
3590: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
35a0: 74 20 65 5f 65 78 70 72 2d 39 2e 31 39 20 7b 20  t e_expr-9.19 { 
35b0: 53 45 4c 45 43 54 20 28 27 61 62 63 64 27 20 3c  SELECT ('abcd' <
35c0: 3e 20 27 41 42 43 44 27 29 20 20 20 20 20 43 4f  > 'ABCD')     CO
35d0: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31  LLATE nocase } 1
35e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
35f0: 20 65 5f 65 78 70 72 2d 39 2e 32 30 20 7b 20 53   e_expr-9.20 { S
3600: 45 4c 45 43 54 20 20 27 61 62 63 64 27 20 49 53  ELECT  'abcd' IS
3610: 20 4e 4f 54 20 27 41 42 43 44 27 20 20 43 4f 4c   NOT 'ABCD'  COL
3620: 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a  LATE nocase } 0.
3630: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3640: 65 5f 65 78 70 72 2d 39 2e 32 31 20 7b 20 53 45  e_expr-9.21 { SE
3650: 4c 45 43 54 20 28 27 61 62 63 64 27 20 49 53 20  LECT ('abcd' IS 
3660: 4e 4f 54 20 27 41 42 43 44 27 29 20 43 4f 4c 4c  NOT 'ABCD') COLL
3670: 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 0a  ATE nocase } 1..
3680: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3690: 65 5f 65 78 70 72 2d 39 2e 32 32 20 7b 20 0a 20  e_expr-9.22 { . 
36a0: 20 53 45 4c 45 43 54 20 27 62 62 62 27 20 42 45   SELECT 'bbb' BE
36b0: 54 57 45 45 4e 20 27 41 41 41 27 20 41 4e 44 20  TWEEN 'AAA' AND 
36c0: 27 43 43 43 27 20 43 4f 4c 4c 41 54 45 20 6e 6f  'CCC' COLLATE no
36d0: 63 61 73 65 20 0a 7d 20 31 0a 64 6f 5f 65 78 65  case .} 1.do_exe
36e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
36f0: 2d 39 2e 32 33 20 7b 20 0a 20 20 53 45 4c 45 43  -9.23 { .  SELEC
3700: 54 20 28 27 62 62 62 27 20 42 45 54 57 45 45 4e  T ('bbb' BETWEEN
3710: 20 27 41 41 41 27 20 41 4e 44 20 27 43 43 43 27   'AAA' AND 'CCC'
3720: 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ) COLLATE nocase
3730: 20 0a 7d 20 30 0a 0a 23 20 45 56 49 44 45 4e 43   .} 0..# EVIDENC
3740: 45 2d 4f 46 3a 20 52 2d 35 38 37 33 31 2d 32 35  E-OF: R-58731-25
3750: 34 33 39 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  439 The collatin
3760: 67 20 73 65 71 75 65 6e 63 65 20 73 65 74 20 62  g sequence set b
3770: 79 20 74 68 65 20 43 4f 4c 4c 41 54 45 0a 23 20  y the COLLATE.# 
3780: 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 72 69 64  operator overrid
3790: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
37a0: 20 73 65 71 75 65 6e 63 65 20 64 65 74 65 72 6d   sequence determ
37b0: 69 6e 65 64 20 62 79 20 74 68 65 20 43 4f 4c 4c  ined by the COLL
37c0: 41 54 45 0a 23 20 63 6c 61 75 73 65 20 69 6e 20  ATE.# clause in 
37d0: 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 64  a table column d
37e0: 65 66 69 6e 69 74 69 6f 6e 2e 0a 23 0a 64 6f 5f  efinition..#.do_
37f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3800: 78 70 72 2d 39 2e 32 34 20 7b 20 0a 20 20 43 52  xpr-9.24 { .  CR
3810: 45 41 54 45 20 54 41 42 4c 45 20 74 32 34 28 61  EATE TABLE t24(a
3820: 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c   COLLATE NOCASE,
3830: 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   b);.  INSERT IN
3840: 54 4f 20 74 32 34 20 56 41 4c 55 45 53 28 27 61  TO t24 VALUES('a
3850: 61 61 27 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52  aa', 1);.  INSER
3860: 54 20 49 4e 54 4f 20 74 32 34 20 56 41 4c 55 45  T INTO t24 VALUE
3870: 53 28 27 62 62 62 27 2c 20 32 29 3b 0a 20 20 49  S('bbb', 2);.  I
3880: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 34 20 56  NSERT INTO t24 V
3890: 41 4c 55 45 53 28 27 63 63 63 27 2c 20 33 29 3b  ALUES('ccc', 3);
38a0: 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  .} {}.do_execsql
38b0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
38c0: 35 20 7b 20 53 45 4c 45 43 54 20 27 42 42 42 27  5 { SELECT 'BBB'
38d0: 20 3d 20 61 20 46 52 4f 4d 20 74 32 34 20 7d 20   = a FROM t24 } 
38e0: 7b 30 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73  {0 1 0}.do_execs
38f0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
3900: 2e 32 35 20 7b 20 53 45 4c 45 43 54 20 61 20 3d  .25 { SELECT a =
3910: 20 27 42 42 42 27 20 46 52 4f 4d 20 74 32 34 20   'BBB' FROM t24 
3920: 7d 20 7b 30 20 31 20 30 7d 0a 64 6f 5f 65 78 65  } {0 1 0}.do_exe
3930: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3940: 2d 39 2e 32 35 20 7b 20 53 45 4c 45 43 54 20 27  -9.25 { SELECT '
3950: 42 42 42 27 20 3d 20 61 20 43 4f 4c 4c 41 54 45  BBB' = a COLLATE
3960: 20 62 69 6e 61 72 79 20 46 52 4f 4d 20 74 32 34   binary FROM t24
3970: 20 7d 20 7b 30 20 30 20 30 7d 0a 64 6f 5f 65 78   } {0 0 0}.do_ex
3980: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3990: 72 2d 39 2e 32 35 20 7b 20 53 45 4c 45 43 54 20  r-9.25 { SELECT 
39a0: 61 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79  a COLLATE binary
39b0: 20 3d 20 27 42 42 42 27 20 46 52 4f 4d 20 74 32   = 'BBB' FROM t2
39c0: 34 20 7d 20 7b 30 20 30 20 30 7d 0a 0a 23 2d 2d  4 } {0 0 0}..#--
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73  -------.# Test s
3a20: 74 61 74 65 6d 65 6e 74 73 20 72 65 6c 61 74 65  tatements relate
3a30: 64 20 74 6f 20 6c 69 74 65 72 61 6c 20 76 61 6c  d to literal val
3a40: 75 65 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ues..#.# EVIDENC
3a50: 45 2d 4f 46 3a 20 52 2d 33 31 35 33 36 2d 33 32  E-OF: R-31536-32
3a60: 30 30 38 20 4c 69 74 65 72 61 6c 20 76 61 6c 75  008 Literal valu
3a70: 65 73 20 6d 61 79 20 62 65 20 69 6e 74 65 67 65  es may be intege
3a80: 72 73 2c 20 66 6c 6f 61 74 69 6e 67 0a 23 20 70  rs, floating.# p
3a90: 6f 69 6e 74 20 6e 75 6d 62 65 72 73 2c 20 73 74  oint numbers, st
3aa0: 72 69 6e 67 73 2c 20 42 4c 4f 42 73 2c 20 6f 72  rings, BLOBs, or
3ab0: 20 4e 55 4c 4c 73 2e 0a 23 0a 64 6f 5f 65 78 65   NULLs..#.do_exe
3ac0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3ad0: 2d 31 30 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54  -10.1.1 { SELECT
3ae0: 20 74 79 70 65 6f 66 28 35 29 20 20 20 20 20 20   typeof(5)      
3af0: 20 7d 20 7b 69 6e 74 65 67 65 72 7d 0a 64 6f 5f   } {integer}.do_
3b00: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3b10: 78 70 72 2d 31 30 2e 31 2e 32 20 7b 20 53 45 4c  xpr-10.1.2 { SEL
3b20: 45 43 54 20 74 79 70 65 6f 66 28 35 2e 31 29 20  ECT typeof(5.1) 
3b30: 20 20 20 20 7d 20 7b 72 65 61 6c 7d 0a 64 6f 5f      } {real}.do_
3b40: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3b50: 78 70 72 2d 31 30 2e 31 2e 33 20 7b 20 53 45 4c  xpr-10.1.3 { SEL
3b60: 45 43 54 20 74 79 70 65 6f 66 28 27 35 2e 31 27  ECT typeof('5.1'
3b70: 29 20 20 20 7d 20 7b 74 65 78 74 7d 0a 64 6f 5f  )   } {text}.do_
3b80: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3b90: 78 70 72 2d 31 30 2e 31 2e 34 20 7b 20 53 45 4c  xpr-10.1.4 { SEL
3ba0: 45 43 54 20 74 79 70 65 6f 66 28 58 27 41 42 43  ECT typeof(X'ABC
3bb0: 44 27 29 20 7d 20 7b 62 6c 6f 62 7d 0a 64 6f 5f  D') } {blob}.do_
3bc0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3bd0: 78 70 72 2d 31 30 2e 31 2e 35 20 7b 20 53 45 4c  xpr-10.1.5 { SEL
3be0: 45 43 54 20 74 79 70 65 6f 66 28 4e 55 4c 4c 29  ECT typeof(NULL)
3bf0: 20 20 20 20 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 20      } {null}..# 
3c00: 22 53 63 69 65 6e 74 69 66 69 63 20 6e 6f 74 61  "Scientific nota
3c10: 74 69 6f 6e 20 69 73 20 73 75 70 70 6f 72 74 65  tion is supporte
3c20: 64 20 66 6f 72 20 70 6f 69 6e 74 20 6c 69 74 65  d for point lite
3c30: 72 61 6c 20 76 61 6c 75 65 73 2e 22 0a 23 0a 64  ral values.".#.d
3c40: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
3c50: 5f 65 78 70 72 2d 31 30 2e 32 2e 31 20 7b 20 53  _expr-10.2.1 { S
3c60: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 33 2e 34  ELECT typeof(3.4
3c70: 65 2d 30 32 29 20 20 20 20 7d 20 7b 72 65 61 6c  e-02)    } {real
3c80: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
3c90: 74 20 65 5f 65 78 70 72 2d 31 30 2e 32 2e 32 20  t e_expr-10.2.2 
3ca0: 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28  { SELECT typeof(
3cb0: 33 65 2b 35 29 20 20 20 20 20 20 20 7d 20 7b 72  3e+5)       } {r
3cc0: 65 61 6c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  eal}.do_execsql_
3cd0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 32  test e_expr-10.2
3ce0: 2e 33 20 7b 20 53 45 4c 45 43 54 20 33 2e 34 65  .3 { SELECT 3.4e
3cf0: 2d 30 32 20 20 20 20 20 20 20 20 20 20 20 20 7d  -02            }
3d00: 20 7b 30 2e 30 33 34 7d 0a 64 6f 5f 65 78 65 63   {0.034}.do_exec
3d10: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3d20: 31 30 2e 32 2e 34 20 7b 20 53 45 4c 45 43 54 20  10.2.4 { SELECT 
3d30: 33 65 2b 34 20 20 20 20 20 20 20 20 20 20 20 20  3e+4            
3d40: 20 20 20 7d 20 7b 33 30 30 30 30 2e 30 7d 0a 0a     } {30000.0}..
3d50: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
3d60: 2d 33 35 32 32 39 2d 31 37 38 33 30 20 41 20 73  -35229-17830 A s
3d70: 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 69  tring constant i
3d80: 73 20 66 6f 72 6d 65 64 20 62 79 20 65 6e 63 6c  s formed by encl
3d90: 6f 73 69 6e 67 0a 23 20 74 68 65 20 73 74 72 69  osing.# the stri
3da0: 6e 67 20 69 6e 20 73 69 6e 67 6c 65 20 71 75 6f  ng in single quo
3db0: 74 65 73 20 28 27 29 2e 0a 23 0a 23 20 45 56 49  tes (')..#.# EVI
3dc0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 31 30  DENCE-OF: R-0710
3dd0: 30 2d 30 36 36 30 36 20 41 20 73 69 6e 67 6c 65  0-06606 A single
3de0: 20 71 75 6f 74 65 20 77 69 74 68 69 6e 20 74 68   quote within th
3df0: 65 20 73 74 72 69 6e 67 20 63 61 6e 20 62 65 0a  e string can be.
3e00: 23 20 65 6e 63 6f 64 65 64 20 62 79 20 70 75 74  # encoded by put
3e10: 74 69 6e 67 20 74 77 6f 20 73 69 6e 67 6c 65 20  ting two single 
3e20: 71 75 6f 74 65 73 20 69 6e 20 61 20 72 6f 77 20  quotes in a row 
3e30: 2d 20 61 73 20 69 6e 20 50 61 73 63 61 6c 2e 0a  - as in Pascal..
3e40: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
3e50: 74 20 65 5f 65 78 70 72 2d 31 30 2e 33 2e 31 20  t e_expr-10.3.1 
3e60: 7b 20 53 45 4c 45 43 54 20 27 69 73 20 6e 6f 74  { SELECT 'is not
3e70: 27 20 7d 20 20 20 20 20 20 20 20 20 7b 7b 69 73  ' }         {{is
3e80: 20 6e 6f 74 7d 7d 0a 64 6f 5f 65 78 65 63 73 71   not}}.do_execsq
3e90: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30  l_test e_expr-10
3ea0: 2e 33 2e 32 20 7b 20 53 45 4c 45 43 54 20 74 79  .3.2 { SELECT ty
3eb0: 70 65 6f 66 28 27 69 73 20 6e 6f 74 27 29 20 7d  peof('is not') }
3ec0: 20 7b 74 65 78 74 7d 0a 64 6f 5f 65 78 65 63 73   {text}.do_execs
3ed0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
3ee0: 30 2e 33 2e 33 20 7b 20 53 45 4c 45 43 54 20 27  0.3.3 { SELECT '
3ef0: 69 73 6e 27 27 74 27 20 7d 20 20 20 20 20 20 20  isn''t' }       
3f00: 20 20 7b 69 73 6e 27 74 7d 0a 64 6f 5f 65 78 65    {isn't}.do_exe
3f10: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3f20: 2d 31 30 2e 33 2e 34 20 7b 20 53 45 4c 45 43 54  -10.3.4 { SELECT
3f30: 20 74 79 70 65 6f 66 28 27 69 73 6e 27 27 74 27   typeof('isn''t'
3f40: 29 20 7d 20 7b 74 65 78 74 7d 0a 0a 23 20 45 56  ) } {text}..# EV
3f50: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39 35  IDENCE-OF: R-095
3f60: 39 33 2d 30 33 33 32 31 20 42 4c 4f 42 20 6c 69  93-03321 BLOB li
3f70: 74 65 72 61 6c 73 20 61 72 65 20 73 74 72 69 6e  terals are strin
3f80: 67 20 6c 69 74 65 72 61 6c 73 0a 23 20 63 6f 6e  g literals.# con
3f90: 74 61 69 6e 69 6e 67 20 68 65 78 61 64 65 63 69  taining hexadeci
3fa0: 6d 61 6c 20 64 61 74 61 20 61 6e 64 20 70 72 65  mal data and pre
3fb0: 63 65 64 65 64 20 62 79 20 61 20 73 69 6e 67 6c  ceded by a singl
3fc0: 65 20 22 78 22 20 6f 72 20 22 58 22 0a 23 20 63  e "x" or "X".# c
3fd0: 68 61 72 61 63 74 65 72 2e 0a 23 0a 23 20 45 56  haracter..#.# EV
3fe0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 33  IDENCE-OF: R-393
3ff0: 34 34 2d 35 39 37 38 37 20 46 6f 72 20 65 78 61  44-59787 For exa
4000: 6d 70 6c 65 3a 20 58 27 35 33 35 31 34 43 36 39  mple: X'53514C69
4010: 37 34 36 35 27 0a 23 0a 64 6f 5f 65 78 65 63 73  7465'.#.do_execs
4020: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
4030: 30 2e 34 2e 31 20 7b 20 53 45 4c 45 43 54 20 74  0.4.1 { SELECT t
4040: 79 70 65 6f 66 28 58 27 30 31 32 33 34 35 36 37  ypeof(X'01234567
4050: 38 39 41 42 43 44 45 46 27 29 20 7d 20 62 6c 6f  89ABCDEF') } blo
4060: 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  b.do_execsql_tes
4070: 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e 32 20  t e_expr-10.4.2 
4080: 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28  { SELECT typeof(
4090: 78 27 30 31 32 33 34 35 36 37 38 39 41 42 43 44  x'0123456789ABCD
40a0: 45 46 27 29 20 7d 20 62 6c 6f 62 0a 64 6f 5f 65  EF') } blob.do_e
40b0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
40c0: 70 72 2d 31 30 2e 34 2e 33 20 7b 20 53 45 4c 45  pr-10.4.3 { SELE
40d0: 43 54 20 74 79 70 65 6f 66 28 58 27 30 31 32 33  CT typeof(X'0123
40e0: 34 35 36 37 38 39 61 62 63 64 65 66 27 29 20 7d  456789abcdef') }
40f0: 20 62 6c 6f 62 0a 64 6f 5f 65 78 65 63 73 71 6c   blob.do_execsql
4100: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e  _test e_expr-10.
4110: 34 2e 34 20 7b 20 53 45 4c 45 43 54 20 74 79 70  4.4 { SELECT typ
4120: 65 6f 66 28 78 27 30 31 32 33 34 35 36 37 38 39  eof(x'0123456789
4130: 61 62 63 64 65 66 27 29 20 7d 20 62 6c 6f 62 0a  abcdef') } blob.
4140: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
4150: 65 5f 65 78 70 72 2d 31 30 2e 34 2e 35 20 7b 20  e_expr-10.4.5 { 
4160: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 58 27  SELECT typeof(X'
4170: 35 33 35 31 34 43 36 39 37 34 36 35 27 29 20 20  53514C697465')  
4180: 20 20 20 7d 20 62 6c 6f 62 0a 0a 23 20 45 56 49     } blob..# EVI
4190: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 39 31  DENCE-OF: R-2391
41a0: 34 2d 35 31 34 37 36 20 41 20 6c 69 74 65 72 61  4-51476 A litera
41b0: 6c 20 76 61 6c 75 65 20 63 61 6e 20 61 6c 73 6f  l value can also
41c0: 20 62 65 20 74 68 65 20 74 6f 6b 65 6e 0a 23 20   be the token.# 
41d0: 22 4e 55 4c 4c 22 2e 0a 23 0a 64 6f 5f 65 78 65  "NULL"..#.do_exe
41e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
41f0: 2d 31 30 2e 35 2e 31 20 7b 20 53 45 4c 45 43 54  -10.5.1 { SELECT
4200: 20 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 7d 20   NULL         } 
4210: 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {{}}.do_execsql_
4220: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 35  test e_expr-10.5
4230: 2e 32 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65  .2 { SELECT type
4240: 6f 66 28 4e 55 4c 4c 29 20 7d 20 7b 6e 75 6c 6c  of(NULL) } {null
4250: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
42a0: 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74 73 20  Test statements 
42b0: 72 65 6c 61 74 65 64 20 74 6f 20 62 6f 75 6e 64  related to bound
42c0: 20 70 61 72 61 6d 65 74 65 72 73 0a 23 0a 0a 70   parameters.#..p
42d0: 72 6f 63 20 70 61 72 61 6d 65 74 65 72 5f 74 65  roc parameter_te
42e0: 73 74 20 7b 74 6e 20 73 71 6c 20 70 61 72 61 6d  st {tn sql param
42f0: 73 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 73 65  s result} {.  se
4300: 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65 33 5f  t stmt [sqlite3_
4310: 70 72 65 70 61 72 65 5f 76 32 20 64 62 20 24 73  prepare_v2 db $s
4320: 71 6c 20 2d 31 5d 0a 0a 20 20 66 6f 72 65 61 63  ql -1]..  foreac
4330: 68 20 7b 6e 75 6d 62 65 72 20 6e 61 6d 65 7d 20  h {number name} 
4340: 24 70 61 72 61 6d 73 20 7b 0a 20 20 20 20 73 65  $params {.    se
4350: 74 20 6e 6d 20 5b 73 71 6c 69 74 65 33 5f 62 69  t nm [sqlite3_bi
4360: 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
4370: 65 20 24 73 74 6d 74 20 24 6e 75 6d 62 65 72 5d  e $stmt $number]
4380: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74 6e  .    do_test $tn
4390: 2e 6e 61 6d 65 2e 24 6e 75 6d 62 65 72 20 5b 6c  .name.$number [l
43a0: 69 73 74 20 73 65 74 20 7b 7d 20 24 6e 6d 5d 20  ist set {} $nm] 
43b0: 24 6e 61 6d 65 0a 20 20 20 20 73 71 6c 69 74 65  $name.    sqlite
43c0: 33 5f 62 69 6e 64 5f 69 6e 74 20 24 73 74 6d 74  3_bind_int $stmt
43d0: 20 24 6e 75 6d 62 65 72 20 5b 65 78 70 72 20 2d   $number [expr -
43e0: 31 20 2a 20 24 6e 75 6d 62 65 72 5d 0a 20 20 7d  1 * $number].  }
43f0: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ..  sqlite3_step
4400: 20 24 73 74 6d 74 0a 0a 20 20 73 65 74 20 72 65   $stmt..  set re
4410: 73 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 20 7b  s [list].  for {
4420: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 5b  set i 0} {$i < [
4430: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
4440: 6f 75 6e 74 20 24 73 74 6d 74 5d 7d 20 7b 69 6e  ount $stmt]} {in
4450: 63 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61 70 70  cr i} {.    lapp
4460: 65 6e 64 20 72 65 73 20 5b 73 71 6c 69 74 65 33  end res [sqlite3
4470: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 73 74  _column_text $st
4480: 6d 74 20 24 69 5d 0a 20 20 7d 0a 0a 20 20 73 65  mt $i].  }..  se
4490: 74 20 72 63 20 5b 73 71 6c 69 74 65 33 5f 66 69  t rc [sqlite3_fi
44a0: 6e 61 6c 69 7a 65 20 24 73 74 6d 74 5d 0a 20 20  nalize $stmt].  
44b0: 64 6f 5f 74 65 73 74 20 24 74 6e 2e 72 63 20 5b  do_test $tn.rc [
44c0: 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72 63 5d  list set {} $rc]
44d0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 64 6f 5f   SQLITE_OK.  do_
44e0: 74 65 73 74 20 24 74 6e 2e 72 65 73 20 5b 6c 69  test $tn.res [li
44f0: 73 74 20 73 65 74 20 7b 7d 20 24 72 65 73 5d 20  st set {} $res] 
4500: 24 72 65 73 75 6c 74 0a 7d 0a 0a 23 20 45 56 49  $result.}..# EVI
4510: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 35 30  DENCE-OF: R-3350
4520: 39 2d 33 39 34 35 38 20 41 20 71 75 65 73 74 69  9-39458 A questi
4530: 6f 6e 20 6d 61 72 6b 20 66 6f 6c 6c 6f 77 65 64  on mark followed
4540: 20 62 79 20 61 20 6e 75 6d 62 65 72 20 4e 4e 4e   by a number NNN
4550: 0a 23 20 68 6f 6c 64 73 20 61 20 73 70 6f 74 20  .# holds a spot 
4560: 66 6f 72 20 74 68 65 20 4e 4e 4e 2d 74 68 20 70  for the NNN-th p
4570: 61 72 61 6d 65 74 65 72 2e 20 4e 4e 4e 20 6d 75  arameter. NNN mu
4580: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  st be between 1 
4590: 61 6e 64 0a 23 20 53 51 4c 49 54 45 5f 4d 41 58  and.# SQLITE_MAX
45a0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
45b0: 2e 0a 23 0a 73 65 74 20 6d 76 6e 20 24 53 51 4c  ..#.set mvn $SQL
45c0: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
45d0: 5f 4e 55 4d 42 45 52 0a 70 61 72 61 6d 65 74 65  _NUMBER.paramete
45e0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
45f0: 2e 31 20 22 0a 20 20 53 45 4c 45 43 54 20 3f 31  .1 ".  SELECT ?1
4600: 2c 20 3f 31 32 33 2c 20 3f 24 53 51 4c 49 54 45  , ?123, ?$SQLITE
4610: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
4620: 4d 42 45 52 2c 20 3f 31 32 33 2c 20 3f 34 0a 22  MBER, ?123, ?4."
4630: 20 20 20 22 31 20 3f 31 20 20 31 32 33 20 3f 31     "1 ?1  123 ?1
4640: 32 33 20 24 6d 76 6e 20 3f 24 6d 76 6e 20 34 20  23 $mvn ?$mvn 4 
4650: 3f 34 22 20 20 20 22 2d 31 20 2d 31 32 33 20 2d  ?4"   "-1 -123 -
4660: 24 6d 76 6e 20 2d 31 32 33 20 2d 34 22 0a 0a 73  $mvn -123 -4"..s
4670: 65 74 20 65 72 72 6d 73 67 20 22 76 61 72 69 61  et errmsg "varia
4680: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
4690: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
46a0: 64 20 3f 24 53 51 4c 49 54 45 5f 4d 41 58 5f 56  d ?$SQLITE_MAX_V
46b0: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22 0a  ARIABLE_NUMBER".
46c0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 70 61 72 61  foreach {tn para
46d0: 6d 5f 6e 75 6d 62 65 72 7d 20 5b 6c 69 73 74 20  m_number} [list 
46e0: 5c 0a 20 20 32 20 20 30 20 20 20 20 20 20 20 20  \.  2  0        
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
4710: 33 20 20 5b 65 78 70 72 20 24 53 51 4c 49 54 45  3  [expr $SQLITE
4720: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
4730: 4d 42 45 52 2b 31 5d 20 5c 0a 20 20 34 20 20 5b  MBER+1] \.  4  [
4740: 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58  expr $SQLITE_MAX
4750: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4760: 2b 32 5d 20 5c 0a 20 20 35 20 20 31 32 33 34 35  +2] \.  5  12345
4770: 36 37 38 39 30 33 34 35 36 37 38 39 30 33 34 35  6789034567890345
4780: 36 37 38 39 30 32 33 34 35 36 37 38 39 30 20 20  67890234567890  
4790: 5c 0a 20 20 36 20 20 32 31 34 37 34 38 33 36 34  \.  6  214748364
47a0: 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
47c0: 37 20 20 32 31 34 37 34 38 33 36 34 39 20 20 20  7  2147483649   
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 20 20 20 20 20 5c 0a 20 20 38 20 20 34          \.  8  4
47f0: 32 39 34 39 36 37 32 39 36 20 20 20 20 20 20 20  294967296       
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4810: 20 20 20 20 5c 0a 20 20 39 20 20 34 32 39 34 39      \.  9  42949
4820: 36 37 32 39 37 20 20 20 20 20 20 20 20 20 20 20  67297           
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 5c 0a 20 20 31 30 20 39 32 32 33 33 37 32 30 33  \.  10 922337203
4850: 36 38 35 34 37 37 35 38 30 38 20 20 20 20 20 20  6854775808      
4860: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
4870: 31 31 20 39 32 32 33 33 37 32 30 33 36 38 35 34  11 9223372036854
4880: 37 37 35 38 30 39 20 20 20 20 20 20 20 20 20 20  775809          
4890: 20 20 20 20 20 20 20 20 5c 0a 20 20 31 32 20 31          \.  12 1
48a0: 38 34 34 36 37 34 34 30 37 33 37 30 39 35 35 31  8446744073709551
48b0: 36 31 36 20 20 20 20 20 20 20 20 20 20 20 20 20  616             
48c0: 20 20 20 20 5c 0a 20 20 31 33 20 31 38 34 34 36      \.  13 18446
48d0: 37 34 34 30 37 33 37 30 39 35 35 31 36 31 37 20  744073709551617 
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48f0: 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68  \.] {.  do_catch
4900: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
4910: 31 31 2e 31 2e 24 74 6e 20 22 53 45 4c 45 43 54  11.1.$tn "SELECT
4920: 20 3f 24 70 61 72 61 6d 5f 6e 75 6d 62 65 72 22   ?$param_number"
4930: 20 5b 6c 69 73 74 20 31 20 24 65 72 72 6d 73 67   [list 1 $errmsg
4940: 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  ].}..# EVIDENCE-
4950: 4f 46 3a 20 52 2d 33 33 36 37 30 2d 33 36 30 39  OF: R-33670-3609
4960: 37 20 41 20 71 75 65 73 74 69 6f 6e 20 6d 61 72  7 A question mar
4970: 6b 20 74 68 61 74 20 69 73 20 6e 6f 74 20 66 6f  k that is not fo
4980: 6c 6c 6f 77 65 64 20 62 79 20 61 0a 23 20 6e 75  llowed by a.# nu
4990: 6d 62 65 72 20 63 72 65 61 74 65 73 20 61 20 70  mber creates a p
49a0: 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 61 20  arameter with a 
49b0: 6e 75 6d 62 65 72 20 6f 6e 65 20 67 72 65 61 74  number one great
49c0: 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
49d0: 65 73 74 0a 23 20 70 61 72 61 6d 65 74 65 72 20  est.# parameter 
49e0: 6e 75 6d 62 65 72 20 61 6c 72 65 61 64 79 20 61  number already a
49f0: 73 73 69 67 6e 65 64 2e 0a 23 0a 23 20 45 56 49  ssigned..#.# EVI
4a00: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32 39 33  DENCE-OF: R-4293
4a10: 38 2d 30 37 30 33 30 20 49 66 20 74 68 69 73 20  8-07030 If this 
4a20: 6d 65 61 6e 73 20 74 68 65 20 70 61 72 61 6d 65  means the parame
4a30: 74 65 72 20 6e 75 6d 62 65 72 20 69 73 0a 23 20  ter number is.# 
4a40: 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c  greater than SQL
4a50: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
4a60: 5f 4e 55 4d 42 45 52 2c 20 69 74 20 69 73 20 61  _NUMBER, it is a
4a70: 6e 20 65 72 72 6f 72 2e 0a 23 0a 70 61 72 61 6d  n error..#.param
4a80: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
4a90: 2d 31 31 2e 32 2e 31 20 22 53 45 4c 45 43 54 20  -11.2.1 "SELECT 
4aa0: 3f 22 20 20 20 20 20 20 20 20 20 20 7b 31 20 7b  ?"          {1 {
4ab0: 7d 7d 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61  }}       -1.para
4ac0: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
4ad0: 72 2d 31 31 2e 32 2e 32 20 22 53 45 4c 45 43 54  r-11.2.2 "SELECT
4ae0: 20 3f 2c 20 3f 22 20 20 20 20 20 20 20 7b 31 20   ?, ?"       {1 
4af0: 7b 7d 20 32 20 7b 7d 7d 20 20 7b 2d 31 20 2d 32  {} 2 {}}  {-1 -2
4b00: 7d 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  }.parameter_test
4b10: 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 33 20 22   e_expr-11.2.3 "
4b20: 53 45 4c 45 43 54 20 3f 35 2c 20 3f 22 20 20 20  SELECT ?5, ?"   
4b30: 20 20 20 7b 35 20 3f 35 20 36 20 7b 7d 7d 20 20     {5 ?5 6 {}}  
4b40: 7b 2d 35 20 2d 36 7d 0a 70 61 72 61 6d 65 74 65  {-5 -6}.paramete
4b50: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
4b60: 2e 32 2e 34 20 22 53 45 4c 45 43 54 20 3f 2c 20  .2.4 "SELECT ?, 
4b70: 3f 35 22 20 20 20 20 20 20 7b 31 20 7b 7d 20 35  ?5"      {1 {} 5
4b80: 20 3f 35 7d 20 20 7b 2d 31 20 2d 35 7d 0a 70 61   ?5}  {-1 -5}.pa
4b90: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
4ba0: 78 70 72 2d 31 31 2e 32 2e 35 20 22 53 45 4c 45  xpr-11.2.5 "SELE
4bb0: 43 54 20 3f 2c 20 3f 34 35 36 2c 20 3f 22 20 7b  CT ?, ?456, ?" {
4bc0: 0a 20 20 31 20 7b 7d 20 34 35 36 20 3f 34 35 36  .  1 {} 456 ?456
4bd0: 20 34 35 37 20 7b 7d 0a 7d 20 20 7b 2d 31 20 2d   457 {}.}  {-1 -
4be0: 34 35 36 20 2d 34 35 37 7d 0a 70 61 72 61 6d 65  456 -457}.parame
4bf0: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4c00: 31 31 2e 32 2e 35 20 22 53 45 4c 45 43 54 20 3f  11.2.5 "SELECT ?
4c10: 2c 20 3f 34 35 36 2c 20 3f 34 2c 20 3f 22 20 7b  , ?456, ?4, ?" {
4c20: 0a 20 20 31 20 7b 7d 20 34 35 36 20 3f 34 35 36  .  1 {} 456 ?456
4c30: 20 34 20 3f 34 20 34 35 37 20 7b 7d 0a 7d 20 20   4 ?4 457 {}.}  
4c40: 7b 2d 31 20 2d 34 35 36 20 2d 34 20 2d 34 35 37  {-1 -456 -4 -457
4c50: 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71  }.foreach {tn sq
4c60: 6c 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20  l} [list        
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 5c 0a 20 20 31 20 20 22 53 45 4c 45 43     \.  1  "SELEC
4c90: 54 20 3f 24 6d 76 6e 2c 20 3f 22 20 20 20 20 20  T ?$mvn, ?"     
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 20 20 20 5c 0a 20 20 32 20 20 22 53 45        \.  2  "SE
4cc0: 4c 45 43 54 20 3f 5b 65 78 70 72 20 24 6d 76 6e  LECT ?[expr $mvn
4cd0: 2d 35 5d 2c 20 3f 2c 20 3f 2c 20 3f 2c 20 3f 2c  -5], ?, ?, ?, ?,
4ce0: 20 3f 2c 20 3f 22 20 20 20 5c 0a 20 20 33 20 20   ?, ?"   \.  3  
4cf0: 22 53 45 4c 45 43 54 20 3f 5b 65 78 70 72 20 24  "SELECT ?[expr $
4d00: 6d 76 6e 5d 2c 20 3f 35 2c 20 3f 36 2c 20 3f 22  mvn], ?5, ?6, ?"
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 5d 20              \.] 
4d20: 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f  {.  do_catchsql_
4d30: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 33  test e_expr-11.3
4d40: 2e 24 74 6e 20 24 73 71 6c 20 5b 6c 69 73 74 20  .$tn $sql [list 
4d50: 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  1 {too many SQL 
4d60: 76 61 72 69 61 62 6c 65 73 7d 5d 0a 7d 0a 0a 23  variables}].}..#
4d70: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
4d80: 31 31 36 32 30 2d 32 32 37 34 33 20 41 20 63 6f  11620-22743 A co
4d90: 6c 6f 6e 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  lon followed by 
4da0: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  an identifier na
4db0: 6d 65 0a 23 20 68 6f 6c 64 73 20 61 20 73 70 6f  me.# holds a spo
4dc0: 74 20 66 6f 72 20 61 20 6e 61 6d 65 64 20 70 61  t for a named pa
4dd0: 72 61 6d 65 74 65 72 20 77 69 74 68 20 74 68 65  rameter with the
4de0: 20 6e 61 6d 65 20 3a 41 41 41 41 2e 0a 23 0a 23   name :AAAA..#.#
4df0: 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   Identifiers in 
4e00: 53 51 4c 69 74 65 20 63 6f 6e 73 69 73 74 20 6f  SQLite consist o
4e10: 66 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 2c 20  f alphanumeric, 
4e20: 27 5f 27 20 61 6e 64 20 27 24 27 20 63 68 61 72  '_' and '$' char
4e30: 61 63 74 65 72 73 2c 0a 23 20 61 6e 64 20 61 6e  acters,.# and an
4e40: 79 20 55 54 46 20 63 68 61 72 61 63 74 65 72 73  y UTF characters
4e50: 20 77 69 74 68 20 63 6f 64 65 70 6f 69 6e 74 73   with codepoints
4e60: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 31 32 37   larger than 127
4e70: 20 28 6e 6f 6e 2d 41 53 43 49 49 20 0a 23 20 63   (non-ASCII .# c
4e80: 68 61 72 61 63 74 65 72 73 29 2e 0a 23 0a 70 61  haracters)..#.pa
4e90: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
4ea0: 78 70 72 2d 31 31 2e 32 2e 31 20 7b 53 45 4c 45  xpr-11.2.1 {SELE
4eb0: 43 54 20 3a 41 41 41 41 7d 20 20 20 20 20 20 20  CT :AAAA}       
4ec0: 20 20 7b 31 20 3a 41 41 41 41 7d 20 20 20 20 20    {1 :AAAA}     
4ed0: 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74    -1.parameter_t
4ee0: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e  est e_expr-11.2.
4ef0: 32 20 7b 53 45 4c 45 43 54 20 3a 31 32 33 7d 20  2 {SELECT :123} 
4f00: 20 20 20 20 20 20 20 20 20 7b 31 20 3a 31 32 33           {1 :123
4f10: 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61  }        -1.para
4f20: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
4f30: 72 2d 31 31 2e 32 2e 33 20 7b 53 45 4c 45 43 54  r-11.2.3 {SELECT
4f40: 20 3a 5f 5f 7d 20 20 20 20 20 20 20 20 20 20 20   :__}           
4f50: 7b 31 20 3a 5f 5f 7d 20 20 20 20 20 20 20 20 20  {1 :__}         
4f60: 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  -1.parameter_tes
4f70: 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 34 20  t e_expr-11.2.4 
4f80: 7b 53 45 4c 45 43 54 20 3a 5f 24 5f 7d 20 20 20  {SELECT :_$_}   
4f90: 20 20 20 20 20 20 20 7b 31 20 3a 5f 24 5f 7d 20         {1 :_$_} 
4fa0: 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65         -1.parame
4fb0: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4fc0: 31 31 2e 32 2e 35 20 22 0a 20 20 53 45 4c 45 43  11.2.5 ".  SELEC
4fd0: 54 20 3a 5c 75 30 65 34 30 5c 75 30 65 32 64 5c  T :\u0e40\u0e2d\
4fe0: 75 30 65 32 38 5c 75 30 65 30 32 5c 75 30 65 33  u0e28\u0e02\u0e3
4ff0: 39 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30  9\u0e40\u0e2d\u0
5000: 65 32 35 0a 22 20 22 31 20 3a 5c 75 30 65 34 30  e25." "1 :\u0e40
5010: 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75 30 65  \u0e2d\u0e28\u0e
5020: 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30 5c 75  02\u0e39\u0e40\u
5030: 30 65 32 64 5c 75 30 65 32 35 22 20 2d 31 0a 70  0e2d\u0e25" -1.p
5040: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
5050: 65 78 70 72 2d 31 31 2e 32 2e 36 20 22 53 45 4c  expr-11.2.6 "SEL
5060: 45 43 54 20 3a 5c 75 30 30 38 30 22 20 22 31 20  ECT :\u0080" "1 
5070: 3a 5c 75 30 30 38 30 22 20 2d 31 0a 0a 23 20 45  :\u0080" -1..# E
5080: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39  VIDENCE-OF: R-49
5090: 37 38 33 2d 36 31 32 37 39 20 41 6e 20 22 61 74  783-61279 An "at
50a0: 22 20 73 69 67 6e 20 77 6f 72 6b 73 20 65 78 61  " sign works exa
50b0: 63 74 6c 79 20 6c 69 6b 65 20 61 20 63 6f 6c 6f  ctly like a colo
50c0: 6e 2c 0a 23 20 65 78 63 65 70 74 20 74 68 61 74  n,.# except that
50d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
50e0: 20 70 61 72 61 6d 65 74 65 72 20 63 72 65 61 74   parameter creat
50f0: 65 64 20 69 73 20 40 41 41 41 41 2e 0a 23 0a 70  ed is @AAAA..#.p
5100: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
5110: 65 78 70 72 2d 31 31 2e 33 2e 31 20 7b 53 45 4c  expr-11.3.1 {SEL
5120: 45 43 54 20 40 41 41 41 41 7d 20 20 20 20 20 20  ECT @AAAA}      
5130: 20 20 20 7b 31 20 40 41 41 41 41 7d 20 20 20 20     {1 @AAAA}    
5140: 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f     -1.parameter_
5150: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 33  test e_expr-11.3
5160: 2e 32 20 7b 53 45 4c 45 43 54 20 40 31 32 33 7d  .2 {SELECT @123}
5170: 20 20 20 20 20 20 20 20 20 20 7b 31 20 40 31 32            {1 @12
5180: 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72  3}        -1.par
5190: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
51a0: 70 72 2d 31 31 2e 33 2e 33 20 7b 53 45 4c 45 43  pr-11.3.3 {SELEC
51b0: 54 20 40 5f 5f 7d 20 20 20 20 20 20 20 20 20 20  T @__}          
51c0: 20 7b 31 20 40 5f 5f 7d 20 20 20 20 20 20 20 20   {1 @__}        
51d0: 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65   -1.parameter_te
51e0: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e 34  st e_expr-11.3.4
51f0: 20 7b 53 45 4c 45 43 54 20 40 5f 24 5f 7d 20 20   {SELECT @_$_}  
5200: 20 20 20 20 20 20 20 20 7b 31 20 40 5f 24 5f 7d          {1 @_$_}
5210: 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d          -1.param
5220: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
5230: 2d 31 31 2e 33 2e 35 20 22 0a 20 20 53 45 4c 45  -11.3.5 ".  SELE
5240: 43 54 20 40 5c 75 30 65 34 30 5c 75 30 65 32 64  CT @\u0e40\u0e2d
5250: 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75 30 65  \u0e28\u0e02\u0e
5260: 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75  39\u0e40\u0e2d\u
5270: 30 65 32 35 0a 22 20 22 31 20 40 5c 75 30 65 34  0e25." "1 @\u0e4
5280: 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75 30  0\u0e2d\u0e28\u0
5290: 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30 5c  e02\u0e39\u0e40\
52a0: 75 30 65 32 64 5c 75 30 65 32 35 22 20 2d 31 0a  u0e2d\u0e25" -1.
52b0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
52c0: 5f 65 78 70 72 2d 31 31 2e 33 2e 36 20 22 53 45  _expr-11.3.6 "SE
52d0: 4c 45 43 54 20 40 5c 75 30 30 38 30 22 20 22 31  LECT @\u0080" "1
52e0: 20 40 5c 75 30 30 38 30 22 20 2d 31 0a 0a 23 20   @\u0080" -1..# 
52f0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
5300: 32 36 31 30 2d 35 31 33 32 39 20 41 20 64 6f 6c  2610-51329 A dol
5310: 6c 61 72 2d 73 69 67 6e 20 66 6f 6c 6c 6f 77 65  lar-sign followe
5320: 64 20 62 79 20 61 6e 20 69 64 65 6e 74 69 66 69  d by an identifi
5330: 65 72 0a 23 20 6e 61 6d 65 20 61 6c 73 6f 20 68  er.# name also h
5340: 6f 6c 64 73 20 61 20 73 70 6f 74 20 66 6f 72 20  olds a spot for 
5350: 61 20 6e 61 6d 65 64 20 70 61 72 61 6d 65 74 65  a named paramete
5360: 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  r with the name 
5370: 24 41 41 41 41 2e 0a 23 0a 23 20 45 56 49 44 45  $AAAA..#.# EVIDE
5380: 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 30 32 35 2d  NCE-OF: R-55025-
5390: 32 31 30 34 32 20 54 68 65 20 69 64 65 6e 74 69  21042 The identi
53a0: 66 69 65 72 20 6e 61 6d 65 20 69 6e 20 74 68 69  fier name in thi
53b0: 73 20 63 61 73 65 20 63 61 6e 0a 23 20 69 6e 63  s case can.# inc
53c0: 6c 75 64 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  lude one or more
53d0: 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66 20   occurrences of 
53e0: 22 3a 3a 22 20 61 6e 64 20 61 20 73 75 66 66 69  "::" and a suffi
53f0: 78 20 65 6e 63 6c 6f 73 65 64 20 69 6e 0a 23 20  x enclosed in.# 
5400: 22 28 2e 2e 2e 29 22 20 63 6f 6e 74 61 69 6e 69  "(...)" containi
5410: 6e 67 20 61 6e 79 20 74 65 78 74 20 61 74 20 61  ng any text at a
5420: 6c 6c 2e 0a 23 0a 23 20 4e 6f 74 65 3a 20 4c 6f  ll..#.# Note: Lo
5430: 6f 6b 73 20 6c 69 6b 65 20 61 6e 20 69 64 65 6e  oks like an iden
5440: 74 69 66 69 65 72 20 63 61 6e 6e 6f 74 20 63 6f  tifier cannot co
5450: 6e 73 69 73 74 20 65 6e 74 69 72 65 6c 79 20 6f  nsist entirely o
5460: 66 20 22 3a 3a 22 20 0a 23 20 63 68 61 72 61 63  f "::" .# charac
5470: 74 65 72 73 20 6f 72 20 6a 75 73 74 20 61 20 73  ters or just a s
5480: 75 66 66 69 78 2e 20 41 6c 73 6f 2c 20 74 68 65  uffix. Also, the
5490: 20 6f 74 68 65 72 20 6e 61 6d 65 64 20 76 61 72   other named var
54a0: 69 61 62 6c 65 20 63 68 61 72 61 63 74 65 72 73  iable characters
54b0: 0a 23 20 28 3a 20 61 6e 64 20 40 29 20 77 6f 72  .# (: and @) wor
54c0: 6b 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 69  k the same way i
54d0: 6e 74 65 72 6e 61 6c 6c 79 2e 20 57 68 79 20 6e  nternally. Why n
54e0: 6f 74 20 6a 75 73 74 20 64 6f 63 75 6d 65 6e 74  ot just document
54f0: 20 69 74 20 74 68 61 74 20 77 61 79 3f 0a 23 0a   it that way?.#.
5500: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
5510: 5f 65 78 70 72 2d 31 31 2e 34 2e 31 20 7b 53 45  _expr-11.4.1 {SE
5520: 4c 45 43 54 20 24 41 41 41 41 7d 20 20 20 20 20  LECT $AAAA}     
5530: 20 20 20 20 7b 31 20 24 41 41 41 41 7d 20 20 20      {1 $AAAA}   
5540: 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72      -1.parameter
5550: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5560: 34 2e 32 20 7b 53 45 4c 45 43 54 20 24 31 32 33  4.2 {SELECT $123
5570: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 24 31  }          {1 $1
5580: 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61  23}        -1.pa
5590: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
55a0: 78 70 72 2d 31 31 2e 34 2e 33 20 7b 53 45 4c 45  xpr-11.4.3 {SELE
55b0: 43 54 20 24 5f 5f 7d 20 20 20 20 20 20 20 20 20  CT $__}         
55c0: 20 20 7b 31 20 24 5f 5f 7d 20 20 20 20 20 20 20    {1 $__}       
55d0: 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74    -1.parameter_t
55e0: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e  est e_expr-11.4.
55f0: 34 20 7b 53 45 4c 45 43 54 20 24 5f 24 5f 7d 20  4 {SELECT $_$_} 
5600: 20 20 20 20 20 20 20 20 20 7b 31 20 24 5f 24 5f           {1 $_$_
5610: 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61  }        -1.para
5620: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
5630: 72 2d 31 31 2e 34 2e 35 20 22 0a 20 20 53 45 4c  r-11.4.5 ".  SEL
5640: 45 43 54 20 5c 24 5c 75 30 65 34 30 5c 75 30 65  ECT \$\u0e40\u0e
5650: 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75  2d\u0e28\u0e02\u
5660: 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64  0e39\u0e40\u0e2d
5670: 5c 75 30 65 32 35 0a 22 20 22 31 20 5c 24 5c 75  \u0e25." "1 \$\u
5680: 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38  0e40\u0e2d\u0e28
5690: 5c 75 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65  \u0e02\u0e39\u0e
56a0: 34 30 5c 75 30 65 32 64 5c 75 30 65 32 35 22 20  40\u0e2d\u0e25" 
56b0: 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  -1.parameter_tes
56c0: 74 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e 36 20  t e_expr-11.4.6 
56d0: 22 53 45 4c 45 43 54 20 5c 24 5c 75 30 30 38 30  "SELECT \$\u0080
56e0: 22 20 22 31 20 5c 24 5c 75 30 30 38 30 22 20 2d  " "1 \$\u0080" -
56f0: 31 0a 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  1..parameter_tes
5700: 74 20 65 5f 65 78 70 72 2d 31 31 2e 35 2e 31 20  t e_expr-11.5.1 
5710: 7b 53 45 4c 45 43 54 20 24 3a 3a 3a 3a 61 28 2b  {SELECT $::::a(+
5720: 2b 2d 2d 2b 2b 29 7d 20 7b 31 20 24 3a 3a 3a 3a  +--++)} {1 $::::
5730: 61 28 2b 2b 2d 2d 2b 2b 29 7d 20 2d 31 0a 70 61  a(++--++)} -1.pa
5740: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
5750: 78 70 72 2d 31 31 2e 35 2e 32 20 7b 53 45 4c 45  xpr-11.5.2 {SELE
5760: 43 54 20 24 3a 3a 61 28 29 7d 20 7b 31 20 24 3a  CT $::a()} {1 $:
5770: 3a 61 28 29 7d 20 2d 31 0a 70 61 72 61 6d 65 74  :a()} -1.paramet
5780: 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  er_test e_expr-1
5790: 31 2e 35 2e 33 20 7b 53 45 4c 45 43 54 20 24 3a  1.5.3 {SELECT $:
57a0: 3a 31 28 3a 3a 23 24 29 7d 20 7b 31 20 24 3a 3a  :1(::#$)} {1 $::
57b0: 31 28 3a 3a 23 24 29 7d 20 2d 31 0a 20 0a 23 20  1(::#$)} -1. .# 
57c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
57d0: 31 33 37 30 2d 30 34 35 32 30 20 4e 61 6d 65 64  1370-04520 Named
57e0: 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
57f0: 61 6c 73 6f 20 6e 75 6d 62 65 72 65 64 2e 20 54  also numbered. T
5800: 68 65 0a 23 20 6e 75 6d 62 65 72 20 61 73 73 69  he.# number assi
5810: 67 6e 65 64 20 69 73 20 6f 6e 65 20 67 72 65 61  gned is one grea
5820: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ter than the lar
5830: 67 65 73 74 20 70 61 72 61 6d 65 74 65 72 20 6e  gest parameter n
5840: 75 6d 62 65 72 0a 23 20 61 6c 72 65 61 64 79 20  umber.# already 
5850: 61 73 73 69 67 6e 65 64 2e 0a 23 0a 23 20 45 56  assigned..#.# EV
5860: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32 36  IDENCE-OF: R-426
5870: 32 30 2d 32 32 31 38 34 20 49 66 20 74 68 69 73  20-22184 If this
5880: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 72 61 6d   means the param
5890: 65 74 65 72 20 77 6f 75 6c 64 20 62 65 0a 23 20  eter would be.# 
58a0: 61 73 73 69 67 6e 65 64 20 61 20 6e 75 6d 62 65  assigned a numbe
58b0: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  r greater than S
58c0: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
58d0: 4c 45 5f 4e 55 4d 42 45 52 2c 20 69 74 20 69 73  LE_NUMBER, it is
58e0: 20 61 6e 0a 23 20 65 72 72 6f 72 2e 0a 23 0a 70   an.# error..#.p
58f0: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
5900: 65 78 70 72 2d 31 31 2e 36 2e 31 20 22 53 45 4c  expr-11.6.1 "SEL
5910: 45 43 54 20 3f 2c 20 40 61 62 63 22 20 20 20 20  ECT ?, @abc"    
5920: 7b 31 20 7b 7d 20 32 20 40 61 62 63 7d 20 7b 2d  {1 {} 2 @abc} {-
5930: 31 20 2d 32 7d 0a 70 61 72 61 6d 65 74 65 72 5f  1 -2}.parameter_
5940: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 36  test e_expr-11.6
5950: 2e 32 20 22 53 45 4c 45 43 54 20 3f 31 32 33 2c  .2 "SELECT ?123,
5960: 20 3a 61 31 22 20 20 7b 31 32 33 20 3f 31 32 33   :a1"  {123 ?123
5970: 20 31 32 34 20 3a 61 31 7d 20 7b 2d 31 32 33 20   124 :a1} {-123 
5980: 2d 31 32 34 7d 0a 70 61 72 61 6d 65 74 65 72 5f  -124}.parameter_
5990: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 36  test e_expr-11.6
59a0: 2e 33 20 7b 53 45 4c 45 43 54 20 24 61 2c 20 3f  .3 {SELECT $a, ?
59b0: 38 2c 20 3f 2c 20 24 62 2c 20 3f 32 2c 20 24 63  8, ?, $b, ?2, $c
59c0: 7d 20 7b 0a 20 20 31 20 24 61 20 38 20 3f 38 20  } {.  1 $a 8 ?8 
59d0: 39 20 7b 7d 20 31 30 20 24 62 20 32 20 3f 32 20  9 {} 10 $b 2 ?2 
59e0: 31 31 20 24 63 0a 7d 20 7b 2d 31 20 2d 38 20 2d  11 $c.} {-1 -8 -
59f0: 39 20 2d 31 30 20 2d 32 20 2d 31 31 7d 0a 66 6f  9 -10 -2 -11}.fo
5a00: 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20 5b  reach {tn sql} [
5a10: 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
5a30: 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 3f 24  .  1  "SELECT ?$
5a40: 6d 76 6e 2c 20 5c 24 3a 3a 61 22 20 20 20 20 20  mvn, \$::a"     
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 20 5c 0a 20 20 32 20 20 22 53 45 4c 45 43 54    \.  2  "SELECT
5a70: 20 3f 24 6d 76 6e 2c 20 3f 34 2c 20 40 61 31 22   ?$mvn, ?4, @a1"
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a90: 20 20 20 20 20 5c 0a 20 20 33 20 20 22 53 45 4c       \.  3  "SEL
5aa0: 45 43 54 20 3f 5b 65 78 70 72 20 24 6d 76 6e 2d  ECT ?[expr $mvn-
5ab0: 32 5d 2c 20 3a 62 61 67 2c 20 40 31 32 33 2c 20  2], :bag, @123, 
5ac0: 5c 24 78 22 20 20 20 20 5c 0a 5d 20 7b 0a 20 20  \$x"    \.] {.  
5ad0: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
5ae0: 20 65 5f 65 78 70 72 2d 31 31 2e 37 2e 24 74 6e   e_expr-11.7.$tn
5af0: 20 24 73 71 6c 20 5b 6c 69 73 74 20 31 20 7b 74   $sql [list 1 {t
5b00: 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72 69  oo many SQL vari
5b10: 61 62 6c 65 73 7d 5d 0a 7d 0a 0a 23 20 45 56 49  ables}].}..# EVI
5b20: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 30 36  DENCE-OF: R-1406
5b30: 38 2d 34 39 36 37 31 20 50 61 72 61 6d 65 74 65  8-49671 Paramete
5b40: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
5b50: 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65 73 0a  assigned values.
5b60: 23 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  # using sqlite3_
5b70: 62 69 6e 64 28 29 20 61 72 65 20 74 72 65 61 74  bind() are treat
5b80: 65 64 20 61 73 20 4e 55 4c 4c 2e 0a 23 0a 64 6f  ed as NULL..#.do
5b90: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5ba0: 37 2e 31 20 7b 0a 20 20 73 65 74 20 73 74 6d 74  7.1 {.  set stmt
5bb0: 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   [sqlite3_prepar
5bc0: 65 5f 76 32 20 64 62 20 7b 20 53 45 4c 45 43 54  e_v2 db { SELECT
5bd0: 20 3f 2c 20 3a 61 2c 20 40 62 2c 20 24 64 20 7d   ?, :a, @b, $d }
5be0: 20 2d 31 5d 0a 20 20 73 71 6c 69 74 65 33 5f 73   -1].  sqlite3_s
5bf0: 74 65 70 20 24 73 74 6d 74 0a 0a 20 20 6c 69 73  tep $stmt..  lis
5c00: 74 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  t [sqlite3_colum
5c10: 6e 5f 74 79 70 65 20 24 73 74 6d 74 20 30 5d 20  n_type $stmt 0] 
5c20: 5c 0a 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65  \.       [sqlite
5c30: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24 73  3_column_type $s
5c40: 74 6d 74 20 31 5d 20 5c 0a 20 20 20 20 20 20 20  tmt 1] \.       
5c50: 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  [sqlite3_column_
5c60: 74 79 70 65 20 24 73 74 6d 74 20 32 5d 20 5c 0a  type $stmt 2] \.
5c70: 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33 5f         [sqlite3_
5c80: 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24 73 74 6d  column_type $stm
5c90: 74 20 33 5d 20 0a 7d 20 7b 4e 55 4c 4c 20 4e 55  t 3] .} {NULL NU
5ca0: 4c 4c 20 4e 55 4c 4c 20 4e 55 4c 4c 7d 0a 64 6f  LL NULL NULL}.do
5cb0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5cc0: 37 2e 31 20 7b 20 73 71 6c 69 74 65 33 5f 66 69  7.1 { sqlite3_fi
5cd0: 6e 61 6c 69 7a 65 20 24 73 74 6d 74 20 7d 20 53  nalize $stmt } S
5ce0: 51 4c 49 54 45 5f 4f 4b 0a 0a 23 2d 2d 2d 2d 2d  QLITE_OK..#-----
5cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d30: 2d 2d 2d 2d 0a 23 20 22 54 65 73 74 22 20 74 68  ----.# "Test" th
5d40: 65 20 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d  e syntax diagram
5d50: 73 20 69 6e 20 6c 61 6e 67 5f 65 78 70 72 2e 68  s in lang_expr.h
5d60: 74 6d 6c 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  tml..#.# EVIDENC
5d70: 45 2d 4f 46 3a 20 52 2d 30 32 39 38 39 2d 32 31  E-OF: R-02989-21
5d80: 30 35 30 20 2d 2d 20 73 79 6e 74 61 78 20 64 69  050 -- syntax di
5d90: 61 67 72 61 6d 20 73 69 67 6e 65 64 2d 6e 75 6d  agram signed-num
5da0: 62 65 72 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ber.#.do_execsql
5db0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
5dc0: 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 30 2c 20  1.1 { SELECT 0, 
5dd0: 2b 30 2c 20 2d 30 20 7d 20 7b 30 20 30 20 30 7d  +0, -0 } {0 0 0}
5de0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
5df0: 20 65 5f 65 78 70 72 2d 31 32 2e 31 2e 32 20 7b   e_expr-12.1.2 {
5e00: 20 53 45 4c 45 43 54 20 31 2c 20 2b 31 2c 20 2d   SELECT 1, +1, -
5e10: 31 20 7d 20 7b 31 20 31 20 2d 31 7d 0a 64 6f 5f  1 } {1 1 -1}.do_
5e20: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
5e30: 78 70 72 2d 31 32 2e 31 2e 33 20 7b 20 53 45 4c  xpr-12.1.3 { SEL
5e40: 45 43 54 20 32 2c 20 2b 32 2c 20 2d 32 20 7d 20  ECT 2, +2, -2 } 
5e50: 7b 32 20 32 20 2d 32 7d 0a 64 6f 5f 65 78 65 63  {2 2 -2}.do_exec
5e60: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
5e70: 31 32 2e 31 2e 34 20 7b 20 0a 20 20 53 45 4c 45  12.1.4 { .  SELE
5e80: 43 54 20 31 2e 34 2c 20 2b 31 2e 34 2c 20 2d 31  CT 1.4, +1.4, -1
5e90: 2e 34 20 0a 7d 20 7b 31 2e 34 20 31 2e 34 20 2d  .4 .} {1.4 1.4 -
5ea0: 31 2e 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  1.4}.do_execsql_
5eb0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 31  test e_expr-12.1
5ec0: 2e 35 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 31  .5 { .  SELECT 1
5ed0: 2e 35 65 2b 35 2c 20 2b 31 2e 35 65 2b 35 2c 20  .5e+5, +1.5e+5, 
5ee0: 2d 31 2e 35 65 2b 35 20 0a 7d 20 7b 31 35 30 30  -1.5e+5 .} {1500
5ef0: 30 30 2e 30 20 31 35 30 30 30 30 2e 30 20 2d 31  00.0 150000.0 -1
5f00: 35 30 30 30 30 2e 30 7d 0a 64 6f 5f 65 78 65 63  50000.0}.do_exec
5f10: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
5f20: 31 32 2e 31 2e 36 20 7b 20 0a 20 20 53 45 4c 45  12.1.6 { .  SELE
5f30: 43 54 20 30 2e 30 30 30 31 2c 20 2b 30 2e 30 30  CT 0.0001, +0.00
5f40: 30 31 2c 20 2d 30 2e 30 30 30 31 20 0a 7d 20 7b  01, -0.0001 .} {
5f50: 30 2e 30 30 30 31 20 30 2e 30 30 30 31 20 2d 30  0.0001 0.0001 -0
5f60: 2e 30 30 30 31 7d 0a 0a 23 20 45 56 49 44 45 4e  .0001}..# EVIDEN
5f70: 43 45 2d 4f 46 3a 20 52 2d 34 33 31 38 38 2d 36  CE-OF: R-43188-6
5f80: 30 38 35 32 20 2d 2d 20 73 79 6e 74 61 78 20 64  0852 -- syntax d
5f90: 69 61 67 72 61 6d 20 6c 69 74 65 72 61 6c 2d 76  iagram literal-v
5fa0: 61 6c 75 65 0a 23 0a 73 65 74 20 73 71 6c 69 74  alue.#.set sqlit
5fb0: 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 31  e_current_time 1
5fc0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
5fd0: 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 31 20 7b   e_expr-12.2.1 {
5fe0: 53 45 4c 45 43 54 20 31 32 33 7d 20 20 20 20 20  SELECT 123}     
5ff0: 20 20 20 20 20 20 20 20 20 20 7b 31 32 33 7d 0a            {123}.
6000: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6010: 65 5f 65 78 70 72 2d 31 32 2e 32 2e 32 20 7b 53  e_expr-12.2.2 {S
6020: 45 4c 45 43 54 20 31 32 33 2e 34 65 30 35 7d 20  ELECT 123.4e05} 
6030: 20 20 20 20 20 20 20 20 20 7b 31 32 33 34 30 30           {123400
6040: 30 30 2e 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  00.0}.do_execsql
6050: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
6060: 32 2e 33 20 7b 53 45 4c 45 43 54 20 27 61 62 63  2.3 {SELECT 'abc
6070: 64 65 27 7d 20 20 20 20 20 20 20 20 20 20 20 7b  de'}           {
6080: 61 62 63 64 65 7d 0a 64 6f 5f 65 78 65 63 73 71  abcde}.do_execsq
6090: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  l_test e_expr-12
60a0: 2e 32 2e 34 20 7b 53 45 4c 45 43 54 20 58 27 34  .2.4 {SELECT X'4
60b0: 31 34 32 34 33 27 7d 20 20 20 20 20 20 20 20 20  14243'}         
60c0: 7b 41 42 43 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  {ABC}.do_execsql
60d0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
60e0: 32 2e 35 20 7b 53 45 4c 45 43 54 20 4e 55 4c 4c  2.5 {SELECT NULL
60f0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  }              {
6100: 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}}.do_execsql_t
6110: 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e  est e_expr-12.2.
6120: 36 20 7b 53 45 4c 45 43 54 20 43 55 52 52 45 4e  6 {SELECT CURREN
6130: 54 5f 54 49 4d 45 7d 20 20 20 20 20 20 7b 30 30  T_TIME}      {00
6140: 3a 30 30 3a 30 31 7d 0a 64 6f 5f 65 78 65 63 73  :00:01}.do_execs
6150: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
6160: 32 2e 32 2e 37 20 7b 53 45 4c 45 43 54 20 43 55  2.2.7 {SELECT CU
6170: 52 52 45 4e 54 5f 44 41 54 45 7d 20 20 20 20 20  RRENT_DATE}     
6180: 20 7b 31 39 37 30 2d 30 31 2d 30 31 7d 0a 64 6f   {1970-01-01}.do
6190: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
61a0: 65 78 70 72 2d 31 32 2e 32 2e 38 20 7b 53 45 4c  expr-12.2.8 {SEL
61b0: 45 43 54 20 43 55 52 52 45 4e 54 5f 54 49 4d 45  ECT CURRENT_TIME
61c0: 53 54 41 4d 50 7d 20 7b 7b 31 39 37 30 2d 30 31  STAMP} {{1970-01
61d0: 2d 30 31 20 30 30 3a 30 30 3a 30 31 7d 7d 0a 73  -01 00:00:01}}.s
61e0: 65 74 20 73 71 6c 69 74 65 5f 63 75 72 72 65 6e  et sqlite_curren
61f0: 74 5f 74 69 6d 65 20 30 0a 0a 23 20 45 56 49 44  t_time 0..# EVID
6200: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 35 34 34  ENCE-OF: R-50544
6210: 2d 33 32 31 35 39 20 2d 2d 20 73 79 6e 74 61 78  -32159 -- syntax
6220: 20 64 69 61 67 72 61 6d 20 65 78 70 72 0a 23 0a   diagram expr.#.
6230: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
6240: 2e 64 62 32 0a 65 78 65 63 73 71 6c 20 7b 0a 20  .db2.execsql {. 
6250: 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64 62   ATTACH 'test.db
6260: 32 27 20 41 53 20 64 62 6e 61 6d 65 3b 0a 20 20  2' AS dbname;.  
6270: 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 62 6e  CREATE TABLE dbn
6280: 61 6d 65 2e 74 62 6c 6e 61 6d 65 28 63 6e 61 6d  ame.tblname(cnam
6290: 65 29 3b 0a 7d 0a 0a 70 72 6f 63 20 67 6c 6f 62  e);.}..proc glob
62a0: 20 7b 61 72 67 73 7d 20 7b 72 65 74 75 72 6e 20   {args} {return 
62b0: 31 7d 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20 67  1}.db function g
62c0: 6c 6f 62 20 67 6c 6f 62 0a 64 62 20 66 75 6e 63  lob glob.db func
62d0: 74 69 6f 6e 20 6d 61 74 63 68 20 67 6c 6f 62 0a  tion match glob.
62e0: 64 62 20 66 75 6e 63 74 69 6f 6e 20 72 65 67 65  db function rege
62f0: 78 70 20 67 6c 6f 62 0a 0a 66 6f 72 65 61 63 68  xp glob..foreach
6300: 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20 31   {tn expr} {.  1
6310: 20 31 32 33 0a 20 20 32 20 31 32 33 2e 34 65 30   123.  2 123.4e0
6320: 35 0a 20 20 33 20 27 61 62 63 64 65 27 0a 20 20  5.  3 'abcde'.  
6330: 34 20 58 27 34 31 34 32 34 33 27 0a 20 20 35 20  4 X'414243'.  5 
6340: 4e 55 4c 4c 0a 20 20 36 20 43 55 52 52 45 4e 54  NULL.  6 CURRENT
6350: 5f 54 49 4d 45 0a 20 20 37 20 43 55 52 52 45 4e  _TIME.  7 CURREN
6360: 54 5f 44 41 54 45 0a 20 20 38 20 43 55 52 52 45  T_DATE.  8 CURRE
6370: 4e 54 5f 54 49 4d 45 53 54 41 4d 50 0a 0a 20 20  NT_TIMESTAMP..  
6380: 39 20 3f 0a 20 31 30 20 3f 31 32 33 0a 20 31 31  9 ?. 10 ?123. 11
6390: 20 40 68 65 6c 6c 6f 0a 20 31 32 20 3a 77 6f 72   @hello. 12 :wor
63a0: 6c 64 0a 20 31 33 20 24 74 63 6c 0a 20 31 34 20  ld. 13 $tcl. 14 
63b0: 24 74 63 6c 28 61 72 72 61 79 29 0a 20 20 0a 20  $tcl(array).  . 
63c0: 20 31 35 20 63 6e 61 6d 65 0a 20 20 31 36 20 74   15 cname.  16 t
63d0: 62 6c 6e 61 6d 65 2e 63 6e 61 6d 65 0a 20 20 31  blname.cname.  1
63e0: 37 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61 6d 65  7 dbname.tblname
63f0: 2e 63 6e 61 6d 65 0a 0a 20 20 31 38 20 22 2b 20  .cname..  18 "+ 
6400: 45 58 50 52 22 0a 20 20 31 39 20 22 2d 20 45 58  EXPR".  19 "- EX
6410: 50 52 22 0a 20 20 32 30 20 22 4e 4f 54 20 45 58  PR".  20 "NOT EX
6420: 50 52 22 0a 20 20 32 31 20 22 7e 20 45 58 50 52  PR".  21 "~ EXPR
6430: 22 0a 0a 20 20 32 32 20 22 45 58 50 52 31 20 7c  "..  22 "EXPR1 |
6440: 7c 20 45 58 50 52 32 22 0a 20 20 32 33 20 22 45  | EXPR2".  23 "E
6450: 58 50 52 31 20 2a 20 45 58 50 52 32 22 0a 20 20  XPR1 * EXPR2".  
6460: 32 34 20 22 45 58 50 52 31 20 2f 20 45 58 50 52  24 "EXPR1 / EXPR
6470: 32 22 0a 20 20 32 35 20 22 45 58 50 52 31 20 25  2".  25 "EXPR1 %
6480: 20 45 58 50 52 32 22 0a 20 20 32 36 20 22 45 58   EXPR2".  26 "EX
6490: 50 52 31 20 2b 20 45 58 50 52 32 22 0a 20 20 32  PR1 + EXPR2".  2
64a0: 37 20 22 45 58 50 52 31 20 2d 20 45 58 50 52 32  7 "EXPR1 - EXPR2
64b0: 22 0a 20 20 32 38 20 22 45 58 50 52 31 20 3c 3c  ".  28 "EXPR1 <<
64c0: 20 45 58 50 52 32 22 0a 20 20 32 39 20 22 45 58   EXPR2".  29 "EX
64d0: 50 52 31 20 3e 3e 20 45 58 50 52 32 22 0a 20 20  PR1 >> EXPR2".  
64e0: 33 30 20 22 45 58 50 52 31 20 26 20 45 58 50 52  30 "EXPR1 & EXPR
64f0: 32 22 0a 20 20 33 31 20 22 45 58 50 52 31 20 7c  2".  31 "EXPR1 |
6500: 20 45 58 50 52 32 22 0a 20 20 33 32 20 22 45 58   EXPR2".  32 "EX
6510: 50 52 31 20 3c 20 45 58 50 52 32 22 0a 20 20 33  PR1 < EXPR2".  3
6520: 33 20 22 45 58 50 52 31 20 3c 3d 20 45 58 50 52  3 "EXPR1 <= EXPR
6530: 32 22 0a 20 20 33 34 20 22 45 58 50 52 31 20 3e  2".  34 "EXPR1 >
6540: 20 45 58 50 52 32 22 0a 20 20 33 35 20 22 45 58   EXPR2".  35 "EX
6550: 50 52 31 20 3e 3d 20 45 58 50 52 32 22 0a 20 20  PR1 >= EXPR2".  
6560: 33 36 20 22 45 58 50 52 31 20 3d 20 45 58 50 52  36 "EXPR1 = EXPR
6570: 32 22 0a 20 20 33 37 20 22 45 58 50 52 31 20 3d  2".  37 "EXPR1 =
6580: 3d 20 45 58 50 52 32 22 0a 20 20 33 38 20 22 45  = EXPR2".  38 "E
6590: 58 50 52 31 20 21 3d 20 45 58 50 52 32 22 0a 20  XPR1 != EXPR2". 
65a0: 20 33 39 20 22 45 58 50 52 31 20 3c 3e 20 45 58   39 "EXPR1 <> EX
65b0: 50 52 32 22 0a 20 20 34 30 20 22 45 58 50 52 31  PR2".  40 "EXPR1
65c0: 20 49 53 20 45 58 50 52 32 22 0a 20 20 34 31 20   IS EXPR2".  41 
65d0: 22 45 58 50 52 31 20 49 53 20 4e 4f 54 20 45 58  "EXPR1 IS NOT EX
65e0: 50 52 32 22 0a 20 20 34 32 20 22 45 58 50 52 31  PR2".  42 "EXPR1
65f0: 20 41 4e 44 20 45 58 50 52 32 22 0a 20 20 34 33   AND EXPR2".  43
6600: 20 22 45 58 50 52 31 20 4f 52 20 45 58 50 52 32   "EXPR1 OR EXPR2
6610: 22 0a 20 0a 20 20 34 34 20 22 63 6f 75 6e 74 28  ". .  44 "count(
6620: 2a 29 22 0a 20 20 34 35 20 22 63 6f 75 6e 74 28  *)".  45 "count(
6630: 44 49 53 54 49 4e 43 54 20 45 58 50 52 29 22 0a  DISTINCT EXPR)".
6640: 20 20 34 36 20 22 73 75 62 73 74 72 28 45 58 50    46 "substr(EXP
6650: 52 2c 20 31 30 2c 20 32 30 29 22 0a 20 20 34 37  R, 10, 20)".  47
6660: 20 22 63 68 61 6e 67 65 73 28 29 22 0a 20 0a 20   "changes()". . 
6670: 20 34 38 20 22 28 20 45 58 50 52 20 29 22 0a 20   48 "( EXPR )". 
6680: 0a 20 20 34 39 20 22 43 41 53 54 20 28 20 45 58  .  49 "CAST ( EX
6690: 50 52 20 41 53 20 69 6e 74 65 67 65 72 20 29 22  PR AS integer )"
66a0: 0a 20 20 35 30 20 22 43 41 53 54 20 28 20 45 58  .  50 "CAST ( EX
66b0: 50 52 20 41 53 20 27 61 62 63 64 27 20 29 22 0a  PR AS 'abcd' )".
66c0: 20 20 35 31 20 22 43 41 53 54 20 28 20 45 58 50    51 "CAST ( EXP
66d0: 52 20 41 53 20 27 61 62 24 20 24 63 64 27 20 29  R AS 'ab$ $cd' )
66e0: 22 0a 20 0a 20 20 35 32 20 22 45 58 50 52 20 43  ". .  52 "EXPR C
66f0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a 20  OLLATE nocase". 
6700: 20 35 33 20 22 45 58 50 52 20 43 4f 4c 4c 41 54   53 "EXPR COLLAT
6710: 45 20 62 69 6e 61 72 79 22 0a 20 0a 20 20 35 34  E binary". .  54
6720: 20 22 45 58 50 52 31 20 4c 49 4b 45 20 45 58 50   "EXPR1 LIKE EXP
6730: 52 32 22 0a 20 20 35 35 20 22 45 58 50 52 31 20  R2".  55 "EXPR1 
6740: 4c 49 4b 45 20 45 58 50 52 32 20 45 53 43 41 50  LIKE EXPR2 ESCAP
6750: 45 20 45 58 50 52 22 0a 20 20 35 36 20 22 45 58  E EXPR".  56 "EX
6760: 50 52 31 20 47 4c 4f 42 20 45 58 50 52 32 22 0a  PR1 GLOB EXPR2".
6770: 20 20 35 37 20 22 45 58 50 52 31 20 47 4c 4f 42    57 "EXPR1 GLOB
6780: 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58   EXPR2 ESCAPE EX
6790: 50 52 22 0a 20 20 35 38 20 22 45 58 50 52 31 20  PR".  58 "EXPR1 
67a0: 52 45 47 45 58 50 20 45 58 50 52 32 22 0a 20 20  REGEXP EXPR2".  
67b0: 35 39 20 22 45 58 50 52 31 20 52 45 47 45 58 50  59 "EXPR1 REGEXP
67c0: 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58   EXPR2 ESCAPE EX
67d0: 50 52 22 0a 20 20 36 30 20 22 45 58 50 52 31 20  PR".  60 "EXPR1 
67e0: 4d 41 54 43 48 20 45 58 50 52 32 22 0a 20 20 36  MATCH EXPR2".  6
67f0: 31 20 22 45 58 50 52 31 20 4d 41 54 43 48 20 45  1 "EXPR1 MATCH E
6800: 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50 52  XPR2 ESCAPE EXPR
6810: 22 0a 20 20 36 32 20 22 45 58 50 52 31 20 4e 4f  ".  62 "EXPR1 NO
6820: 54 20 4c 49 4b 45 20 45 58 50 52 32 22 0a 20 20  T LIKE EXPR2".  
6830: 36 33 20 22 45 58 50 52 31 20 4e 4f 54 20 4c 49  63 "EXPR1 NOT LI
6840: 4b 45 20 45 58 50 52 32 20 45 53 43 41 50 45 20  KE EXPR2 ESCAPE 
6850: 45 58 50 52 22 0a 20 20 36 34 20 22 45 58 50 52  EXPR".  64 "EXPR
6860: 31 20 4e 4f 54 20 47 4c 4f 42 20 45 58 50 52 32  1 NOT GLOB EXPR2
6870: 22 0a 20 20 36 35 20 22 45 58 50 52 31 20 4e 4f  ".  65 "EXPR1 NO
6880: 54 20 47 4c 4f 42 20 45 58 50 52 32 20 45 53 43  T GLOB EXPR2 ESC
6890: 41 50 45 20 45 58 50 52 22 0a 20 20 36 36 20 22  APE EXPR".  66 "
68a0: 45 58 50 52 31 20 4e 4f 54 20 52 45 47 45 58 50  EXPR1 NOT REGEXP
68b0: 20 45 58 50 52 32 22 0a 20 20 36 37 20 22 45 58   EXPR2".  67 "EX
68c0: 50 52 31 20 4e 4f 54 20 52 45 47 45 58 50 20 45  PR1 NOT REGEXP E
68d0: 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50 52  XPR2 ESCAPE EXPR
68e0: 22 0a 20 20 36 38 20 22 45 58 50 52 31 20 4e 4f  ".  68 "EXPR1 NO
68f0: 54 20 4d 41 54 43 48 20 45 58 50 52 32 22 0a 20  T MATCH EXPR2". 
6900: 20 36 39 20 22 45 58 50 52 31 20 4e 4f 54 20 4d   69 "EXPR1 NOT M
6910: 41 54 43 48 20 45 58 50 52 32 20 45 53 43 41 50  ATCH EXPR2 ESCAP
6920: 45 20 45 58 50 52 22 0a 20 0a 20 20 37 30 20 22  E EXPR". .  70 "
6930: 45 58 50 52 20 49 53 4e 55 4c 4c 22 0a 20 20 37  EXPR ISNULL".  7
6940: 31 20 22 45 58 50 52 20 4e 4f 54 4e 55 4c 4c 22  1 "EXPR NOTNULL"
6950: 0a 20 20 37 32 20 22 45 58 50 52 20 4e 4f 54 20  .  72 "EXPR NOT 
6960: 4e 55 4c 4c 22 0a 20 0a 20 20 37 33 20 22 45 58  NULL". .  73 "EX
6970: 50 52 31 20 49 53 20 45 58 50 52 32 22 0a 20 20  PR1 IS EXPR2".  
6980: 37 34 20 22 45 58 50 52 31 20 49 53 20 4e 4f 54  74 "EXPR1 IS NOT
6990: 20 45 58 50 52 32 22 0a 0a 20 20 37 35 20 22 45   EXPR2"..  75 "E
69a0: 58 50 52 20 4e 4f 54 20 42 45 54 57 45 45 4e 20  XPR NOT BETWEEN 
69b0: 45 58 50 52 31 20 41 4e 44 20 45 58 50 52 32 22  EXPR1 AND EXPR2"
69c0: 0a 20 20 37 36 20 22 45 58 50 52 20 42 45 54 57  .  76 "EXPR BETW
69d0: 45 45 4e 20 45 58 50 52 31 20 41 4e 44 20 45 58  EEN EXPR1 AND EX
69e0: 50 52 32 22 0a 0a 20 20 37 37 20 22 45 58 50 52  PR2"..  77 "EXPR
69f0: 20 4e 4f 54 20 49 4e 20 28 53 45 4c 45 43 54 20   NOT IN (SELECT 
6a00: 63 6e 61 6d 65 20 46 52 4f 4d 20 74 62 6c 6e 61  cname FROM tblna
6a10: 6d 65 29 22 0a 20 20 37 38 20 22 45 58 50 52 20  me)".  78 "EXPR 
6a20: 4e 4f 54 20 49 4e 20 28 31 29 22 0a 20 20 37 39  NOT IN (1)".  79
6a30: 20 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 28 31   "EXPR NOT IN (1
6a40: 2c 20 32 2c 20 33 29 22 0a 20 20 38 30 20 22 45  , 2, 3)".  80 "E
6a50: 58 50 52 20 4e 4f 54 20 49 4e 20 74 62 6c 6e 61  XPR NOT IN tblna
6a60: 6d 65 22 0a 20 20 38 31 20 22 45 58 50 52 20 4e  me".  81 "EXPR N
6a70: 4f 54 20 49 4e 20 64 62 6e 61 6d 65 2e 74 62 6c  OT IN dbname.tbl
6a80: 6e 61 6d 65 22 0a 20 20 38 32 20 22 45 58 50 52  name".  82 "EXPR
6a90: 20 49 4e 20 28 53 45 4c 45 43 54 20 63 6e 61 6d   IN (SELECT cnam
6aa0: 65 20 46 52 4f 4d 20 74 62 6c 6e 61 6d 65 29 22  e FROM tblname)"
6ab0: 0a 20 20 38 33 20 22 45 58 50 52 20 49 4e 20 28  .  83 "EXPR IN (
6ac0: 31 29 22 0a 20 20 38 34 20 22 45 58 50 52 20 49  1)".  84 "EXPR I
6ad0: 4e 20 28 31 2c 20 32 2c 20 33 29 22 0a 20 20 38  N (1, 2, 3)".  8
6ae0: 35 20 22 45 58 50 52 20 49 4e 20 74 62 6c 6e 61  5 "EXPR IN tblna
6af0: 6d 65 22 0a 20 20 38 36 20 22 45 58 50 52 20 49  me".  86 "EXPR I
6b00: 4e 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61 6d 65  N dbname.tblname
6b10: 22 0a 0a 20 20 38 37 20 22 45 58 49 53 54 53 20  "..  87 "EXISTS 
6b20: 28 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46 52  (SELECT cname FR
6b30: 4f 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 20 20 38  OM tblname)".  8
6b40: 38 20 22 4e 4f 54 20 45 58 49 53 54 53 20 28 53  8 "NOT EXISTS (S
6b50: 45 4c 45 43 54 20 63 6e 61 6d 65 20 46 52 4f 4d  ELECT cname FROM
6b60: 20 74 62 6c 6e 61 6d 65 29 22 0a 0a 20 20 38 39   tblname)"..  89
6b70: 20 22 43 41 53 45 20 45 58 50 52 20 57 48 45 4e   "CASE EXPR WHEN
6b80: 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50 52   EXPR1 THEN EXPR
6b90: 32 20 45 4c 53 45 20 45 58 50 52 20 45 4e 44 22  2 ELSE EXPR END"
6ba0: 0a 20 20 39 30 20 22 43 41 53 45 20 45 58 50 52  .  90 "CASE EXPR
6bb0: 20 57 48 45 4e 20 45 58 50 52 31 20 54 48 45 4e   WHEN EXPR1 THEN
6bc0: 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20 39 31   EXPR2 END".  91
6bd0: 20 22 43 41 53 45 20 45 58 50 52 20 57 48 45 4e   "CASE EXPR WHEN
6be0: 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50 52   EXPR1 THEN EXPR
6bf0: 32 20 57 48 45 4e 20 45 58 50 52 20 54 48 45 4e  2 WHEN EXPR THEN
6c00: 20 45 58 50 52 31 20 45 4c 53 45 20 45 58 50 52   EXPR1 ELSE EXPR
6c10: 32 20 45 4e 44 22 0a 20 20 39 32 20 22 43 41 53  2 END".  92 "CAS
6c20: 45 20 45 58 50 52 20 57 48 45 4e 20 45 58 50 52  E EXPR WHEN EXPR
6c30: 31 20 54 48 45 4e 20 45 58 50 52 32 20 57 48 45  1 THEN EXPR2 WHE
6c40: 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58 50 52  N EXPR THEN EXPR
6c50: 31 20 45 4e 44 22 0a 20 20 39 33 20 22 43 41 53  1 END".  93 "CAS
6c60: 45 20 57 48 45 4e 20 45 58 50 52 31 20 54 48 45  E WHEN EXPR1 THE
6c70: 4e 20 45 58 50 52 32 20 45 4c 53 45 20 45 58 50  N EXPR2 ELSE EXP
6c80: 52 20 45 4e 44 22 0a 20 20 39 34 20 22 43 41 53  R END".  94 "CAS
6c90: 45 20 57 48 45 4e 20 45 58 50 52 31 20 54 48 45  E WHEN EXPR1 THE
6ca0: 4e 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20 39  N EXPR2 END".  9
6cb0: 35 20 22 43 41 53 45 20 57 48 45 4e 20 45 58 50  5 "CASE WHEN EXP
6cc0: 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 57 48  R1 THEN EXPR2 WH
6cd0: 45 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58 50  EN EXPR THEN EXP
6ce0: 52 31 20 45 4c 53 45 20 45 58 50 52 32 20 45 4e  R1 ELSE EXPR2 EN
6cf0: 44 22 0a 20 20 39 36 20 22 43 41 53 45 20 57 48  D".  96 "CASE WH
6d00: 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58  EN EXPR1 THEN EX
6d10: 50 52 32 20 57 48 45 4e 20 45 58 50 52 20 54 48  PR2 WHEN EXPR TH
6d20: 45 4e 20 45 58 50 52 31 20 45 4e 44 22 0a 7d 20  EN EXPR1 END".} 
6d30: 7b 0a 0a 20 20 23 20 49 66 20 74 68 65 20 65 78  {..  # If the ex
6d40: 70 72 65 73 73 69 6f 6e 20 73 74 72 69 6e 67 20  pression string 
6d50: 62 65 69 6e 67 20 70 61 72 73 65 64 20 63 6f 6e  being parsed con
6d60: 74 61 69 6e 73 20 22 45 58 50 52 32 22 2c 20 74  tains "EXPR2", t
6d70: 68 65 6e 20 72 65 70 6c 61 63 65 0a 20 20 23 20  hen replace.  # 
6d80: 73 74 72 69 6e 67 20 22 45 58 50 52 31 22 20 61  string "EXPR1" a
6d90: 6e 64 20 22 45 58 50 52 32 22 20 77 69 74 68 20  nd "EXPR2" with 
6da0: 61 72 62 69 74 72 61 72 79 20 53 51 4c 20 65 78  arbitrary SQL ex
6db0: 70 72 65 73 73 69 6f 6e 73 2e 20 49 66 20 69 74  pressions. If it
6dc0: 20 0a 20 20 23 20 63 6f 6e 74 61 69 6e 73 20 22   .  # contains "
6dd0: 45 58 50 52 22 2c 20 74 68 65 6e 20 72 65 70 6c  EXPR", then repl
6de0: 61 63 65 20 45 58 50 52 20 77 69 74 68 20 61 6e  ace EXPR with an
6df0: 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 20 65   arbitrary SQL e
6e00: 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 23 20 0a  xpression..  # .
6e10: 20 20 73 65 74 20 65 6c 69 73 74 20 5b 6c 69 73    set elist [lis
6e20: 74 20 24 65 78 70 72 5d 0a 20 20 69 66 20 7b 5b  t $expr].  if {[
6e30: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 45 58  string match *EX
6e40: 50 52 32 2a 20 24 65 78 70 72 5d 7d 20 7b 0a 20  PR2* $expr]} {. 
6e50: 20 20 20 73 65 74 20 65 6c 69 73 74 20 5b 6c 69     set elist [li
6e60: 73 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68 20  st].    foreach 
6e70: 7b 65 31 20 65 32 7d 20 7b 20 63 6e 61 6d 65 20  {e1 e2} { cname 
6e80: 22 33 34 2b 32 32 22 20 7d 20 7b 0a 20 20 20 20  "34+22" } {.    
6e90: 20 20 6c 61 70 70 65 6e 64 20 65 6c 69 73 74 20    lappend elist 
6ea0: 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73  [string map [lis
6eb0: 74 20 45 58 50 52 31 20 24 65 31 20 45 58 50 52  t EXPR1 $e1 EXPR
6ec0: 32 20 24 65 32 5d 20 24 65 78 70 72 5d 0a 20 20  2 $e2] $expr].  
6ed0: 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 20 7b 5b    }.  } .  if {[
6ee0: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 45 58  string match *EX
6ef0: 50 52 2a 20 24 65 78 70 72 5d 7d 20 7b 0a 20 20  PR* $expr]} {.  
6f00: 20 20 73 65 74 20 65 6c 69 73 74 32 20 5b 6c 69    set elist2 [li
6f10: 73 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68 20  st].    foreach 
6f20: 65 6c 20 24 65 6c 69 73 74 20 7b 0a 20 20 20 20  el $elist {.    
6f30: 20 20 66 6f 72 65 61 63 68 20 65 20 7b 20 63 6e    foreach e { cn
6f40: 61 6d 65 20 22 33 34 2b 32 32 22 20 7d 20 7b 0a  ame "34+22" } {.
6f50: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
6f60: 65 6c 69 73 74 32 20 5b 73 74 72 69 6e 67 20 6d  elist2 [string m
6f70: 61 70 20 5b 6c 69 73 74 20 45 58 50 52 20 24 65  ap [list EXPR $e
6f80: 5d 20 24 65 6c 5d 0a 20 20 20 20 20 20 7d 0a 20  ] $el].      }. 
6f90: 20 20 20 7d 0a 20 20 20 20 73 65 74 20 65 6c 69     }.    set eli
6fa0: 73 74 20 24 65 6c 69 73 74 32 0a 20 20 7d 0a 0a  st $elist2.  }..
6fb0: 20 20 73 65 74 20 78 20 30 0a 20 20 66 6f 72 65    set x 0.  fore
6fc0: 61 63 68 20 65 20 24 65 6c 69 73 74 20 7b 0a 20  ach e $elist {. 
6fd0: 20 20 20 69 6e 63 72 20 78 0a 20 20 20 20 64 6f     incr x.    do
6fe0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
6ff0: 33 2e 24 74 6e 2e 24 78 20 7b 20 0a 20 20 20 20  3.$tn.$x { .    
7000: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
7010: 7b 20 65 78 65 63 73 71 6c 20 22 53 45 4c 45 43  { execsql "SELEC
7020: 54 20 24 65 20 46 52 4f 4d 20 74 62 6c 6e 61 6d  T $e FROM tblnam
7030: 65 22 20 7d 20 6d 73 67 5d 0a 20 20 20 20 7d 20  e" } msg].    } 
7040: 7b 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 20 45 56 49  {0}.  }.}..# EVI
7050: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 38 32  DENCE-OF: R-3982
7060: 30 2d 36 33 39 31 36 20 2d 2d 20 73 79 6e 74 61  0-63916 -- synta
7070: 78 20 64 69 61 67 72 61 6d 20 72 61 69 73 65 2d  x diagram raise-
7080: 66 75 6e 63 74 69 6f 6e 0a 23 0a 66 6f 72 65 61  function.#.forea
7090: 63 68 20 7b 74 6e 20 72 61 69 73 65 65 78 70 72  ch {tn raiseexpr
70a0: 7d 20 7b 0a 20 20 31 20 22 52 41 49 53 45 28 49  } {.  1 "RAISE(I
70b0: 47 4e 4f 52 45 29 22 0a 20 20 32 20 22 52 41 49  GNORE)".  2 "RAI
70c0: 53 45 28 52 4f 4c 4c 42 41 43 4b 2c 20 27 65 72  SE(ROLLBACK, 'er
70d0: 72 6f 72 20 6d 65 73 73 61 67 65 27 29 22 0a 20  ror message')". 
70e0: 20 33 20 22 52 41 49 53 45 28 41 42 4f 52 54 2c   3 "RAISE(ABORT,
70f0: 20 27 65 72 72 6f 72 20 6d 65 73 73 61 67 65 27   'error message'
7100: 29 22 0a 20 20 34 20 22 52 41 49 53 45 28 46 41  )".  4 "RAISE(FA
7110: 49 4c 2c 20 27 65 72 72 6f 72 20 6d 65 73 73 61  IL, 'error messa
7120: 67 65 27 29 22 0a 7d 20 7b 0a 20 20 64 6f 5f 65  ge')".} {.  do_e
7130: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7140: 70 72 2d 31 32 2e 34 2e 24 74 6e 20 22 0a 20 20  pr-12.4.$tn ".  
7150: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
7160: 20 64 62 6e 61 6d 65 2e 74 72 24 74 6e 20 42 45   dbname.tr$tn BE
7170: 46 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 74  FORE DELETE ON t
7180: 62 6c 6e 61 6d 65 20 42 45 47 49 4e 0a 20 20 20  blname BEGIN.   
7190: 20 20 20 53 45 4c 45 43 54 20 24 72 61 69 73 65     SELECT $raise
71a0: 65 78 70 72 20 3b 0a 20 20 20 20 45 4e 44 3b 0a  expr ;.    END;.
71b0: 20 20 22 20 7b 7d 0a 7d 0a 0a 23 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 2d 2d 2d 2d 2d 2d  ----------------
71e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7200: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20  ----.# Test the 
7210: 73 74 61 74 65 6d 65 6e 74 73 20 72 65 6c 61 74  statements relat
7220: 65 64 20 74 6f 20 74 68 65 20 42 45 54 57 45 45  ed to the BETWEE
7230: 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 23 20  N operator..#.# 
7240: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
7250: 30 30 37 39 2d 35 34 35 30 33 20 54 68 65 20 42  0079-54503 The B
7260: 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72 20  ETWEEN operator 
7270: 69 73 20 6c 6f 67 69 63 61 6c 6c 79 0a 23 20 65  is logically.# e
7280: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 20 70  quivalent to a p
7290: 61 69 72 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  air of compariso
72a0: 6e 73 2e 20 22 78 20 42 45 54 57 45 45 4e 20 79  ns. "x BETWEEN y
72b0: 20 41 4e 44 20 7a 22 20 69 73 20 65 71 75 69 76   AND z" is equiv
72c0: 61 6c 65 6e 74 0a 23 20 74 6f 20 22 78 3e 3d 79  alent.# to "x>=y
72d0: 20 41 4e 44 20 78 3c 3d 7a 22 20 65 78 63 65 70   AND x<=z" excep
72e0: 74 20 74 68 61 74 20 77 69 74 68 20 42 45 54 57  t that with BETW
72f0: 45 45 4e 2c 20 74 68 65 20 78 20 65 78 70 72 65  EEN, the x expre
7300: 73 73 69 6f 6e 20 69 73 0a 23 20 6f 6e 6c 79 20  ssion is.# only 
7310: 65 76 61 6c 75 61 74 65 64 20 6f 6e 63 65 2e 0a  evaluated once..
7320: 23 0a 64 62 20 66 75 6e 63 20 78 20 78 0a 70 72  #.db func x x.pr
7330: 6f 63 20 78 20 7b 7d 20 7b 20 69 6e 63 72 20 3a  oc x {} { incr :
7340: 3a 78 63 6f 75 6e 74 20 3b 20 72 65 74 75 72 6e  :xcount ; return
7350: 20 5b 65 78 70 72 20 24 3a 3a 78 5d 20 7d 0a 66   [expr $::x] }.f
7360: 6f 72 65 61 63 68 20 7b 74 6e 20 78 20 65 78 70  oreach {tn x exp
7370: 72 20 72 65 73 20 6e 45 76 61 6c 7d 20 7b 0a 20  r res nEval} {. 
7380: 20 31 20 20 31 30 20 20 22 78 28 29 20 3e 3d 20   1  10  "x() >= 
7390: 35 20 41 4e 44 20 78 28 29 20 3c 3d 20 31 35 22  5 AND x() <= 15"
73a0: 20 20 31 20 20 32 0a 20 20 32 20 20 31 30 20 20    1  2.  2  10  
73b0: 22 78 28 29 20 42 45 54 57 45 45 4e 20 35 20 41  "x() BETWEEN 5 A
73c0: 4e 44 20 31 35 22 20 20 20 20 31 20 20 31 0a 0a  ND 15"    1  1..
73d0: 20 20 33 20 20 20 35 20 20 22 78 28 29 20 3e 3d    3   5  "x() >=
73e0: 20 35 20 41 4e 44 20 78 28 29 20 3c 3d 20 35 22   5 AND x() <= 5"
73f0: 20 20 20 31 20 20 32 0a 20 20 34 20 20 20 35 20     1  2.  4   5 
7400: 20 22 78 28 29 20 42 45 54 57 45 45 4e 20 35 20   "x() BETWEEN 5 
7410: 41 4e 44 20 35 22 20 20 20 20 20 31 20 20 31 0a  AND 5"     1  1.
7420: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f  } {.  do_test e_
7430: 65 78 70 72 2d 31 33 2e 31 2e 24 74 6e 20 7b 0a  expr-13.1.$tn {.
7440: 20 20 20 20 73 65 74 20 3a 3a 78 63 6f 75 6e 74      set ::xcount
7450: 20 30 0a 20 20 20 20 73 65 74 20 61 20 5b 65 78   0.    set a [ex
7460: 65 63 73 71 6c 20 22 53 45 4c 45 43 54 20 24 65  ecsql "SELECT $e
7470: 78 70 72 22 5d 0a 20 20 20 20 6c 69 73 74 20 24  xpr"].    list $
7480: 3a 3a 78 63 6f 75 6e 74 20 24 61 0a 20 20 7d 20  ::xcount $a.  } 
7490: 5b 6c 69 73 74 20 24 6e 45 76 61 6c 20 24 72 65  [list $nEval $re
74a0: 73 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  s].}..# EVIDENCE
74b0: 2d 4f 46 3a 20 52 2d 30 35 31 35 35 2d 33 34 34  -OF: R-05155-344
74c0: 35 34 20 54 68 65 20 70 72 65 63 65 64 65 6e 63  54 The precedenc
74d0: 65 20 6f 66 20 74 68 65 20 42 45 54 57 45 45 4e  e of the BETWEEN
74e0: 20 6f 70 65 72 61 74 6f 72 20 69 73 0a 23 20 74   operator is.# t
74f0: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
7500: 72 65 63 65 64 65 6e 63 65 20 61 73 20 6f 70 65  recedence as ope
7510: 72 61 74 6f 72 73 20 3d 3d 20 61 6e 64 20 21 3d  rators == and !=
7520: 20 61 6e 64 20 4c 49 4b 45 20 61 6e 64 20 67 72   and LIKE and gr
7530: 6f 75 70 73 0a 23 20 6c 65 66 74 20 74 6f 20 72  oups.# left to r
7540: 69 67 68 74 2e 0a 23 20 0a 23 20 54 68 65 72 65  ight..# .# There
7550: 66 6f 72 65 2c 20 42 45 54 57 45 45 4e 20 67 72  fore, BETWEEN gr
7560: 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74 6c  oups more tightl
7570: 79 20 74 68 61 6e 20 6f 70 65 72 61 74 6f 72 20  y than operator 
7580: 22 41 4e 44 22 2c 20 62 75 74 20 6c 65 73 73 0a  "AND", but less.
7590: 23 20 73 6f 20 74 68 61 6e 20 22 3c 22 2e 0a 23  # so than "<"..#
75a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
75b0: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 20 20   e_expr-13.2.1  
75c0: 7b 20 53 45 4c 45 43 54 20 31 20 3d 3d 20 31 30  { SELECT 1 == 10
75d0: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
75e0: 20 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73     }  1.do_execs
75f0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7600: 33 2e 32 2e 32 20 20 7b 20 53 45 4c 45 43 54 20  3.2.2  { SELECT 
7610: 28 31 20 3d 3d 20 31 30 29 20 42 45 54 57 45 45  (1 == 10) BETWEE
7620: 4e 20 30 20 41 4e 44 20 32 20 7d 20 20 31 0a 64  N 0 AND 2 }  1.d
7630: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7640: 5f 65 78 70 72 2d 31 33 2e 32 2e 33 20 20 7b 20  _expr-13.2.3  { 
7650: 53 45 4c 45 43 54 20 31 20 3d 3d 20 28 31 30 20  SELECT 1 == (10 
7660: 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32 29  BETWEEN 0 AND 2)
7670: 20 7d 20 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c   }  0.do_execsql
7680: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7690: 32 2e 34 20 20 7b 20 53 45 4c 45 43 54 20 20 36  2.4  { SELECT  6
76a0: 20 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20 38   BETWEEN 4 AND 8
76b0: 20 3d 3d 20 31 20 7d 20 20 20 20 31 0a 64 6f 5f   == 1 }    1.do_
76c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
76d0: 78 70 72 2d 31 33 2e 32 2e 35 20 20 7b 20 53 45  xpr-13.2.5  { SE
76e0: 4c 45 43 54 20 28 36 20 42 45 54 57 45 45 4e 20  LECT (6 BETWEEN 
76f0: 34 20 41 4e 44 20 38 29 20 3d 3d 20 31 20 7d 20  4 AND 8) == 1 } 
7700: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
7710: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
7720: 36 20 20 7b 20 53 45 4c 45 43 54 20 20 36 20 42  6  { SELECT  6 B
7730: 45 54 57 45 45 4e 20 34 20 41 4e 44 20 28 38 20  ETWEEN 4 AND (8 
7740: 3d 3d 20 31 29 20 7d 20 20 30 0a 0a 64 6f 5f 65  == 1) }  0..do_e
7750: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7760: 70 72 2d 31 33 2e 32 2e 37 20 20 7b 20 53 45 4c  pr-13.2.7  { SEL
7770: 45 43 54 20 20 35 20 42 45 54 57 45 45 4e 20 30  ECT  5 BETWEEN 0
7780: 20 41 4e 44 20 30 20 20 21 3d 20 31 20 7d 20 20   AND 0  != 1 }  
7790: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
77a0: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 38  st e_expr-13.2.8
77b0: 20 20 7b 20 53 45 4c 45 43 54 20 28 35 20 42 45    { SELECT (5 BE
77c0: 54 57 45 45 4e 20 30 20 41 4e 44 20 30 29 20 21  TWEEN 0 AND 0) !
77d0: 3d 20 31 20 7d 20 20 20 31 0a 64 6f 5f 65 78 65  = 1 }   1.do_exe
77e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
77f0: 2d 31 33 2e 32 2e 39 20 20 7b 20 53 45 4c 45 43  -13.2.9  { SELEC
7800: 54 20 20 35 20 42 45 54 57 45 45 4e 20 30 20 41  T  5 BETWEEN 0 A
7810: 4e 44 20 28 30 20 21 3d 20 31 29 20 7d 20 20 30  ND (0 != 1) }  0
7820: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7830: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 30 20   e_expr-13.2.10 
7840: 7b 20 53 45 4c 45 43 54 20 20 31 20 21 3d 20 30  { SELECT  1 != 0
7850: 20 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20    BETWEEN 0 AND 
7860: 32 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73  2  }  1.do_execs
7870: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7880: 33 2e 32 2e 31 31 20 7b 20 53 45 4c 45 43 54 20  3.2.11 { SELECT 
7890: 28 31 20 21 3d 20 30 29 20 42 45 54 57 45 45 4e  (1 != 0) BETWEEN
78a0: 20 30 20 41 4e 44 20 32 20 20 7d 20 20 31 0a 64   0 AND 2  }  1.d
78b0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
78c0: 5f 65 78 70 72 2d 31 33 2e 32 2e 31 32 20 7b 20  _expr-13.2.12 { 
78d0: 53 45 4c 45 43 54 20 20 31 20 21 3d 20 28 30 20  SELECT  1 != (0 
78e0: 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32 29  BETWEEN 0 AND 2)
78f0: 20 7d 20 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71   }  0..do_execsq
7900: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7910: 2e 32 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 31  .2.13 { SELECT 1
7920: 20 4c 49 4b 45 20 31 30 20 42 45 54 57 45 45 4e   LIKE 10 BETWEEN
7930: 20 30 20 41 4e 44 20 32 20 20 20 7d 20 20 31 0a   0 AND 2   }  1.
7940: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7950: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 34 20 7b  e_expr-13.2.14 {
7960: 20 53 45 4c 45 43 54 20 28 31 20 4c 49 4b 45 20   SELECT (1 LIKE 
7970: 31 30 29 20 42 45 54 57 45 45 4e 20 30 20 41 4e  10) BETWEEN 0 AN
7980: 44 20 32 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63  D 2 }  1.do_exec
7990: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
79a0: 31 33 2e 32 2e 31 35 20 7b 20 53 45 4c 45 43 54  13.2.15 { SELECT
79b0: 20 31 20 4c 49 4b 45 20 28 31 30 20 42 45 54 57   1 LIKE (10 BETW
79c0: 45 45 4e 20 30 20 41 4e 44 20 32 29 20 7d 20 20  EEN 0 AND 2) }  
79d0: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
79e0: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 36  t e_expr-13.2.16
79f0: 20 7b 20 53 45 4c 45 43 54 20 20 36 20 42 45 54   { SELECT  6 BET
7a00: 57 45 45 4e 20 34 20 41 4e 44 20 38 20 4c 49 4b  WEEN 4 AND 8 LIK
7a10: 45 20 31 20 20 20 7d 20 20 31 0a 64 6f 5f 65 78  E 1   }  1.do_ex
7a20: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7a30: 72 2d 31 33 2e 32 2e 31 37 20 7b 20 53 45 4c 45  r-13.2.17 { SELE
7a40: 43 54 20 28 36 20 42 45 54 57 45 45 4e 20 34 20  CT (6 BETWEEN 4 
7a50: 41 4e 44 20 38 29 20 4c 49 4b 45 20 31 20 20 7d  AND 8) LIKE 1  }
7a60: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
7a70: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
7a80: 31 38 20 7b 20 53 45 4c 45 43 54 20 20 36 20 42  18 { SELECT  6 B
7a90: 45 54 57 45 45 4e 20 34 20 41 4e 44 20 28 38 20  ETWEEN 4 AND (8 
7aa0: 4c 49 4b 45 20 31 29 20 7d 20 20 30 0a 0a 64 6f  LIKE 1) }  0..do
7ab0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7ac0: 65 78 70 72 2d 31 33 2e 32 2e 31 39 20 7b 20 53  expr-13.2.19 { S
7ad0: 45 4c 45 43 54 20 30 20 41 4e 44 20 30 20 42 45  ELECT 0 AND 0 BE
7ae0: 54 57 45 45 4e 20 30 20 41 4e 44 20 31 20 20 20  TWEEN 0 AND 1   
7af0: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
7b00: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
7b10: 32 30 20 7b 20 53 45 4c 45 43 54 20 30 20 41 4e  20 { SELECT 0 AN
7b20: 44 20 28 30 20 42 45 54 57 45 45 4e 20 30 20 41  D (0 BETWEEN 0 A
7b30: 4e 44 20 31 29 20 7d 20 30 0a 64 6f 5f 65 78 65  ND 1) } 0.do_exe
7b40: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7b50: 2d 31 33 2e 32 2e 32 31 20 7b 20 53 45 4c 45 43  -13.2.21 { SELEC
7b60: 54 20 28 30 20 41 4e 44 20 30 29 20 42 45 54 57  T (0 AND 0) BETW
7b70: 45 45 4e 20 30 20 41 4e 44 20 31 20 7d 20 31 0a  EEN 0 AND 1 } 1.
7b80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7b90: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 32 20 7b  e_expr-13.2.22 {
7ba0: 20 53 45 4c 45 43 54 20 30 20 42 45 54 57 45 45   SELECT 0 BETWEE
7bb0: 4e 20 2d 31 20 41 4e 44 20 31 20 41 4e 44 20 30  N -1 AND 1 AND 0
7bc0: 20 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71     } 0.do_execsq
7bd0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7be0: 2e 32 2e 32 33 20 7b 20 53 45 4c 45 43 54 20 28  .2.23 { SELECT (
7bf0: 30 20 42 45 54 57 45 45 4e 20 2d 31 20 41 4e 44  0 BETWEEN -1 AND
7c00: 20 31 29 20 41 4e 44 20 30 20 7d 20 30 0a 64 6f   1) AND 0 } 0.do
7c10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7c20: 65 78 70 72 2d 31 33 2e 32 2e 32 34 20 7b 20 53  expr-13.2.24 { S
7c30: 45 4c 45 43 54 20 30 20 42 45 54 57 45 45 4e 20  ELECT 0 BETWEEN 
7c40: 2d 31 20 41 4e 44 20 28 31 20 41 4e 44 20 30 29  -1 AND (1 AND 0)
7c50: 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   } 1..do_execsql
7c60: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7c70: 32 2e 32 35 20 7b 20 53 45 4c 45 43 54 20 32 20  2.25 { SELECT 2 
7c80: 3c 20 33 20 42 45 54 57 45 45 4e 20 30 20 41 4e  < 3 BETWEEN 0 AN
7c90: 44 20 31 20 20 20 7d 20 31 0a 64 6f 5f 65 78 65  D 1   } 1.do_exe
7ca0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7cb0: 2d 31 33 2e 32 2e 32 36 20 7b 20 53 45 4c 45 43  -13.2.26 { SELEC
7cc0: 54 20 28 32 20 3c 20 33 29 20 42 45 54 57 45 45  T (2 < 3) BETWEE
7cd0: 4e 20 30 20 41 4e 44 20 31 20 7d 20 31 0a 64 6f  N 0 AND 1 } 1.do
7ce0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7cf0: 65 78 70 72 2d 31 33 2e 32 2e 32 37 20 7b 20 53  expr-13.2.27 { S
7d00: 45 4c 45 43 54 20 32 20 3c 20 28 33 20 42 45 54  ELECT 2 < (3 BET
7d10: 57 45 45 4e 20 30 20 41 4e 44 20 31 29 20 7d 20  WEEN 0 AND 1) } 
7d20: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
7d30: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 38  t e_expr-13.2.28
7d40: 20 7b 20 53 45 4c 45 43 54 20 32 20 42 45 54 57   { SELECT 2 BETW
7d50: 45 45 4e 20 31 20 41 4e 44 20 32 20 3c 20 33 20  EEN 1 AND 2 < 3 
7d60: 20 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71     } 0.do_execsq
7d70: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7d80: 2e 32 2e 32 39 20 7b 20 53 45 4c 45 43 54 20 32  .2.29 { SELECT 2
7d90: 20 42 45 54 57 45 45 4e 20 31 20 41 4e 44 20 28   BETWEEN 1 AND (
7da0: 32 20 3c 20 33 29 20 20 7d 20 30 0a 64 6f 5f 65  2 < 3)  } 0.do_e
7db0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7dc0: 70 72 2d 31 33 2e 32 2e 33 30 20 7b 20 53 45 4c  pr-13.2.30 { SEL
7dd0: 45 43 54 20 28 32 20 42 45 54 57 45 45 4e 20 31  ECT (2 BETWEEN 1
7de0: 20 41 4e 44 20 32 29 20 3c 20 33 20 20 7d 20 31   AND 2) < 3  } 1
7df0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
7e40: 65 73 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  est the statemen
7e50: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68  ts related to th
7e60: 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20  e LIKE and GLOB 
7e70: 6f 70 65 72 61 74 6f 72 73 2e 0a 23 0a 23 20 45  operators..#.# E
7e80: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36  VIDENCE-OF: R-16
7e90: 35 38 34 2d 36 30 31 38 39 20 54 68 65 20 4c 49  584-60189 The LI
7ea0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 64 6f 65 73  KE operator does
7eb0: 20 61 20 70 61 74 74 65 72 6e 20 6d 61 74 63 68   a pattern match
7ec0: 69 6e 67 0a 23 20 63 6f 6d 70 61 72 69 73 6f 6e  ing.# comparison
7ed0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
7ee0: 46 3a 20 52 2d 31 31 32 39 35 2d 30 34 36 35 37  F: R-11295-04657
7ef0: 20 54 68 65 20 6f 70 65 72 61 6e 64 20 74 6f 20   The operand to 
7f00: 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
7f10: 20 4c 49 4b 45 0a 23 20 6f 70 65 72 61 74 6f 72   LIKE.# operator
7f20: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 61   contains the pa
7f30: 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20 6c 65  ttern and the le
7f40: 66 74 20 68 61 6e 64 20 6f 70 65 72 61 6e 64 20  ft hand operand 
7f50: 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 23 20 73  contains the.# s
7f60: 74 72 69 6e 67 20 74 6f 20 6d 61 74 63 68 20 61  tring to match a
7f70: 67 61 69 6e 73 74 20 74 68 65 20 70 61 74 74 65  gainst the patte
7f80: 72 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  rn..#.do_execsql
7f90: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
7fa0: 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.1 { SELECT 'ab
7fb0: 63 25 27 20 4c 49 4b 45 20 27 61 62 63 64 65 27  c%' LIKE 'abcde'
7fc0: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
7fd0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 31  test e_expr-14.1
7fe0: 2e 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .2 { SELECT 'abc
7ff0: 64 65 27 20 4c 49 4b 45 20 27 61 62 63 25 27 20  de' LIKE 'abc%' 
8000: 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  } 1..# EVIDENCE-
8010: 4f 46 3a 20 52 2d 35 35 34 30 36 2d 33 38 35 32  OF: R-55406-3852
8020: 34 20 41 20 70 65 72 63 65 6e 74 20 73 79 6d 62  4 A percent symb
8030: 6f 6c 20 28 22 25 22 29 20 69 6e 20 74 68 65 20  ol ("%") in the 
8040: 4c 49 4b 45 20 70 61 74 74 65 72 6e 0a 23 20 6d  LIKE pattern.# m
8050: 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
8060: 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d  nce of zero or m
8070: 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 20 69  ore characters i
8080: 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 23 0a  n the string..#.
8090: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
80a0: 65 5f 65 78 70 72 2d 31 34 2e 32 2e 31 20 7b 20  e_expr-14.2.1 { 
80b0: 53 45 4c 45 43 54 20 27 61 62 64 65 27 20 20 20  SELECT 'abde'   
80c0: 20 4c 49 4b 45 20 27 61 62 25 64 65 27 20 7d 20   LIKE 'ab%de' } 
80d0: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
80e0: 74 20 65 5f 65 78 70 72 2d 31 34 2e 32 2e 32 20  t e_expr-14.2.2 
80f0: 7b 20 53 45 4c 45 43 54 20 27 61 62 58 64 65 27  { SELECT 'abXde'
8100: 20 20 20 4c 49 4b 45 20 27 61 62 25 64 65 27 20     LIKE 'ab%de' 
8110: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
8120: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 32 2e  est e_expr-14.2.
8130: 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62 41 42  3 { SELECT 'abAB
8140: 43 64 65 27 20 4c 49 4b 45 20 27 61 62 25 64 65  Cde' LIKE 'ab%de
8150: 27 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43  ' } 1..# EVIDENC
8160: 45 2d 4f 46 3a 20 52 2d 33 30 34 33 33 2d 32 35  E-OF: R-30433-25
8170: 34 34 33 20 41 6e 20 75 6e 64 65 72 73 63 6f 72  443 An underscor
8180: 65 20 28 22 5f 22 29 20 69 6e 20 74 68 65 20 4c  e ("_") in the L
8190: 49 4b 45 20 70 61 74 74 65 72 6e 0a 23 20 6d 61  IKE pattern.# ma
81a0: 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c 65  tches any single
81b0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74 68   character in th
81c0: 65 20 73 74 72 69 6e 67 2e 0a 23 0a 64 6f 5f 65  e string..#.do_e
81d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
81e0: 70 72 2d 31 34 2e 33 2e 31 20 7b 20 53 45 4c 45  pr-14.3.1 { SELE
81f0: 43 54 20 27 61 62 64 65 27 20 20 20 20 4c 49 4b  CT 'abde'    LIK
8200: 45 20 27 61 62 5f 64 65 27 20 7d 20 30 0a 64 6f  E 'ab_de' } 0.do
8210: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8220: 65 78 70 72 2d 31 34 2e 33 2e 32 20 7b 20 53 45  expr-14.3.2 { SE
8230: 4c 45 43 54 20 27 61 62 58 64 65 27 20 20 20 4c  LECT 'abXde'   L
8240: 49 4b 45 20 27 61 62 5f 64 65 27 20 7d 20 31 0a  IKE 'ab_de' } 1.
8250: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8260: 65 5f 65 78 70 72 2d 31 34 2e 33 2e 33 20 7b 20  e_expr-14.3.3 { 
8270: 53 45 4c 45 43 54 20 27 61 62 41 42 43 64 65 27  SELECT 'abABCde'
8280: 20 4c 49 4b 45 20 27 61 62 5f 64 65 27 20 7d 20   LIKE 'ab_de' } 
8290: 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  0..# EVIDENCE-OF
82a0: 3a 20 52 2d 35 39 30 30 37 2d 32 30 34 35 34 20  : R-59007-20454 
82b0: 41 6e 79 20 6f 74 68 65 72 20 63 68 61 72 61 63  Any other charac
82c0: 74 65 72 20 6d 61 74 63 68 65 73 20 69 74 73 65  ter matches itse
82d0: 6c 66 20 6f 72 20 69 74 73 0a 23 20 6c 6f 77 65  lf or its.# lowe
82e0: 72 2f 75 70 70 65 72 20 63 61 73 65 20 65 71 75  r/upper case equ
82f0: 69 76 61 6c 65 6e 74 20 28 69 2e 65 2e 20 63 61  ivalent (i.e. ca
8300: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d  se-insensitive m
8310: 61 74 63 68 69 6e 67 29 2e 0a 23 0a 64 6f 5f 65  atching)..#.do_e
8320: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8330: 70 72 2d 31 34 2e 34 2e 31 20 7b 20 53 45 4c 45  pr-14.4.1 { SELE
8340: 43 54 20 27 61 62 63 27 20 4c 49 4b 45 20 27 61  CT 'abc' LIKE 'a
8350: 42 63 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73  Bc' } 1.do_execs
8360: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8370: 34 2e 34 2e 32 20 7b 20 53 45 4c 45 43 54 20 27  4.4.2 { SELECT '
8380: 61 42 63 27 20 4c 49 4b 45 20 27 61 42 63 27 20  aBc' LIKE 'aBc' 
8390: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
83a0: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 34 2e  est e_expr-14.4.
83b0: 33 20 7b 20 53 45 4c 45 43 54 20 27 61 63 27 20  3 { SELECT 'ac' 
83c0: 20 4c 49 4b 45 20 27 61 42 63 27 20 7d 20 30 0a   LIKE 'aBc' } 0.
83d0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
83e0: 52 2d 32 33 36 34 38 2d 35 38 35 32 37 20 53 51  R-23648-58527 SQ
83f0: 4c 69 74 65 20 6f 6e 6c 79 20 75 6e 64 65 72 73  Lite only unders
8400: 74 61 6e 64 73 20 75 70 70 65 72 2f 6c 6f 77 65  tands upper/lowe
8410: 72 20 63 61 73 65 0a 23 20 66 6f 72 20 41 53 43  r case.# for ASC
8420: 49 49 20 63 68 61 72 61 63 74 65 72 73 20 62 79  II characters by
8430: 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45 56   default..#.# EV
8440: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 35  IDENCE-OF: R-045
8450: 33 32 2d 31 31 35 32 37 20 54 68 65 20 4c 49 4b  32-11527 The LIK
8460: 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63 61  E operator is ca
8470: 73 65 20 73 65 6e 73 69 74 69 76 65 20 62 79 0a  se sensitive by.
8480: 23 20 64 65 66 61 75 6c 74 20 66 6f 72 20 75 6e  # default for un
8490: 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73  icode characters
84a0: 20 74 68 61 74 20 61 72 65 20 62 65 79 6f 6e 64   that are beyond
84b0: 20 74 68 65 20 41 53 43 49 49 20 72 61 6e 67 65   the ASCII range
84c0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
84d0: 46 3a 20 52 2d 34 34 33 38 31 2d 31 31 36 36 39  F: R-44381-11669
84e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
84f0: 23 20 27 61 27 26 6e 62 73 70 3b 4c 49 4b 45 26  # 'a'&nbsp;LIKE&
8500: 6e 62 73 70 3b 27 41 27 20 69 73 20 54 52 55 45  nbsp;'A' is TRUE
8510: 20 62 75 74 0a 23 20 27 26 61 65 6c 69 67 3b 27   but.# '&aelig;'
8520: 26 6e 62 73 70 3b 4c 49 4b 45 26 6e 62 73 70 3b  &nbsp;LIKE&nbsp;
8530: 27 26 41 45 6c 69 67 3b 27 20 69 73 20 46 41 4c  '&AElig;' is FAL
8540: 53 45 2e 0a 23 0a 23 20 20 20 54 68 65 20 72 65  SE..#.#   The re
8550: 73 74 72 69 63 74 69 6f 6e 20 74 6f 20 41 53 43  striction to ASC
8560: 49 49 20 63 68 61 72 61 63 74 65 72 73 20 64 6f  II characters do
8570: 65 73 20 6e 6f 74 20 61 70 70 6c 79 20 69 66 20  es not apply if 
8580: 74 68 65 20 49 43 55 0a 23 20 20 20 6c 69 62 72  the ICU.#   libr
8590: 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20  ary is compiled 
85a0: 69 6e 2e 20 57 68 65 6e 20 49 43 55 20 69 73 20  in. When ICU is 
85b0: 65 6e 61 62 6c 65 64 20 53 51 4c 69 74 65 20 64  enabled SQLite d
85c0: 6f 65 73 20 6e 6f 74 20 61 63 74 0a 23 20 20 20  oes not act.#   
85d0: 61 73 20 69 74 20 64 6f 65 73 20 22 62 79 20 64  as it does "by d
85e0: 65 66 61 75 6c 74 22 2e 0a 23 0a 64 6f 5f 65 78  efault"..#.do_ex
85f0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
8600: 72 2d 31 34 2e 35 2e 31 20 7b 20 53 45 4c 45 43  r-14.5.1 { SELEC
8610: 54 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20 20  T 'A' LIKE 'a'  
8620: 20 20 20 20 20 20 20 7d 20 31 0a 69 66 63 61 70         } 1.ifcap
8630: 61 62 6c 65 20 21 69 63 75 20 7b 0a 20 20 64 6f  able !icu {.  do
8640: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8650: 65 78 70 72 2d 31 34 2e 35 2e 32 20 22 53 45 4c  expr-14.5.2 "SEL
8660: 45 43 54 20 27 5c 75 30 30 63 36 27 20 4c 49 4b  ECT '\u00c6' LIK
8670: 45 20 27 5c 75 30 30 65 36 27 22 20 30 0a 7d 0a  E '\u00e6'" 0.}.
8680: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
8690: 52 2d 35 36 36 38 33 2d 31 33 37 33 31 20 49 66  R-56683-13731 If
86a0: 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 45 53   the optional ES
86b0: 43 41 50 45 20 63 6c 61 75 73 65 20 69 73 20 70  CAPE clause is p
86c0: 72 65 73 65 6e 74 2c 0a 23 20 74 68 65 6e 20 74  resent,.# then t
86d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f  he expression fo
86e0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 45 53 43 41  llowing the ESCA
86f0: 50 45 20 6b 65 79 77 6f 72 64 20 6d 75 73 74 20  PE keyword must 
8700: 65 76 61 6c 75 61 74 65 20 74 6f 20 61 0a 23 20  evaluate to a.# 
8710: 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69 6e  string consistin
8720: 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 68  g of a single ch
8730: 61 72 61 63 74 65 72 2e 0a 23 0a 64 6f 5f 63 61  aracter..#.do_ca
8740: 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  tchsql_test e_ex
8750: 70 72 2d 31 34 2e 36 2e 31 20 7b 20 0a 20 20 53  pr-14.6.1 { .  S
8760: 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20 27  ELECT 'A' LIKE '
8770: 61 27 20 45 53 43 41 50 45 20 27 31 32 27 20 0a  a' ESCAPE '12' .
8780: 7d 20 7b 31 20 7b 45 53 43 41 50 45 20 65 78 70  } {1 {ESCAPE exp
8790: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
87a0: 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74  a single charact
87b0: 65 72 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  er}}.do_catchsql
87c0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
87d0: 36 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  6.2 { .  SELECT 
87e0: 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53 43  'A' LIKE 'a' ESC
87f0: 41 50 45 20 27 27 20 0a 7d 20 7b 31 20 7b 45 53  APE '' .} {1 {ES
8800: 43 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20  CAPE expression 
8810: 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65  must be a single
8820: 20 63 68 61 72 61 63 74 65 72 7d 7d 0a 64 6f 5f   character}}.do_
8830: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f  catchsql_test e_
8840: 65 78 70 72 2d 31 34 2e 36 2e 33 20 7b 20 53 45  expr-14.6.3 { SE
8850: 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20 27 61  LECT 'A' LIKE 'a
8860: 27 20 45 53 43 41 50 45 20 27 78 27 20 7d 20 20  ' ESCAPE 'x' }  
8870: 20 20 7b 30 20 31 7d 0a 64 6f 5f 63 61 74 63 68    {0 1}.do_catch
8880: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
8890: 31 34 2e 36 2e 34 20 22 53 45 4c 45 43 54 20 27  14.6.4 "SELECT '
88a0: 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53 43 41  A' LIKE 'a' ESCA
88b0: 50 45 20 27 5c 75 30 30 65 36 27 22 20 7b 30 20  PE '\u00e6'" {0 
88c0: 31 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  1}..# EVIDENCE-O
88d0: 46 3a 20 52 2d 30 32 30 34 35 2d 32 33 37 36 32  F: R-02045-23762
88e0: 20 54 68 69 73 20 63 68 61 72 61 63 74 65 72 20   This character 
88f0: 6d 61 79 20 62 65 20 75 73 65 64 20 69 6e 20 74  may be used in t
8900: 68 65 20 4c 49 4b 45 0a 23 20 70 61 74 74 65 72  he LIKE.# patter
8910: 6e 20 74 6f 20 69 6e 63 6c 75 64 65 20 6c 69 74  n to include lit
8920: 65 72 61 6c 20 70 65 72 63 65 6e 74 20 6f 72 20  eral percent or 
8930: 75 6e 64 65 72 73 63 6f 72 65 20 63 68 61 72 61  underscore chara
8940: 63 74 65 72 73 2e 0a 23 0a 23 20 45 56 49 44 45  cters..#.# EVIDE
8950: 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 33 34 35 2d  NCE-OF: R-13345-
8960: 33 31 38 33 30 20 54 68 65 20 65 73 63 61 70 65  31830 The escape
8970: 20 63 68 61 72 61 63 74 65 72 20 66 6f 6c 6c 6f   character follo
8980: 77 65 64 20 62 79 20 61 20 70 65 72 63 65 6e 74  wed by a percent
8990: 0a 23 20 73 79 6d 62 6f 6c 20 28 25 29 2c 20 75  .# symbol (%), u
89a0: 6e 64 65 72 73 63 6f 72 65 20 28 5f 29 2c 20 6f  nderscore (_), o
89b0: 72 20 61 20 73 65 63 6f 6e 64 20 69 6e 73 74 61  r a second insta
89c0: 6e 63 65 20 6f 66 20 74 68 65 20 65 73 63 61 70  nce of the escap
89d0: 65 0a 23 20 63 68 61 72 61 63 74 65 72 20 69 74  e.# character it
89e0: 73 65 6c 66 20 6d 61 74 63 68 65 73 20 61 20 6c  self matches a l
89f0: 69 74 65 72 61 6c 20 70 65 72 63 65 6e 74 20 73  iteral percent s
8a00: 79 6d 62 6f 6c 2c 20 75 6e 64 65 72 73 63 6f 72  ymbol, underscor
8a10: 65 2c 20 6f 72 20 61 0a 23 20 73 69 6e 67 6c 65  e, or a.# single
8a20: 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65   escape characte
8a30: 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  r, respectively.
8a40: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
8a50: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31  st e_expr-14.7.1
8a60: 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 25    { SELECT 'abc%
8a70: 27 20 20 4c 49 4b 45 20 27 61 62 63 58 25 27 20  '  LIKE 'abcX%' 
8a80: 45 53 43 41 50 45 20 27 58 27 20 7d 20 31 0a 64  ESCAPE 'X' } 1.d
8a90: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8aa0: 5f 65 78 70 72 2d 31 34 2e 37 2e 32 20 20 7b 20  _expr-14.7.2  { 
8ab0: 53 45 4c 45 43 54 20 27 61 62 63 35 27 20 20 4c  SELECT 'abc5'  L
8ac0: 49 4b 45 20 27 61 62 63 58 25 27 20 45 53 43 41  IKE 'abcX%' ESCA
8ad0: 50 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78  PE 'X' } 0.do_ex
8ae0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
8af0: 72 2d 31 34 2e 37 2e 33 20 20 7b 20 53 45 4c 45  r-14.7.3  { SELE
8b00: 43 54 20 27 61 62 63 27 20 20 20 4c 49 4b 45 20  CT 'abc'   LIKE 
8b10: 27 61 62 63 58 25 27 20 45 53 43 41 50 45 20 27  'abcX%' ESCAPE '
8b20: 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71  X' } 0.do_execsq
8b30: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
8b40: 2e 37 2e 34 20 20 7b 20 53 45 4c 45 43 54 20 27  .7.4  { SELECT '
8b50: 61 62 63 58 25 27 20 4c 49 4b 45 20 27 61 62 63  abcX%' LIKE 'abc
8b60: 58 25 27 20 45 53 43 41 50 45 20 27 58 27 20 7d  X%' ESCAPE 'X' }
8b70: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
8b80: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 35  st e_expr-14.7.5
8b90: 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 25    { SELECT 'abc%
8ba0: 25 27 20 4c 49 4b 45 20 27 61 62 63 58 25 27 20  %' LIKE 'abcX%' 
8bb0: 45 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a  ESCAPE 'X' } 0..
8bc0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8bd0: 65 5f 65 78 70 72 2d 31 34 2e 37 2e 36 20 20 7b  e_expr-14.7.6  {
8be0: 20 53 45 4c 45 43 54 20 27 61 62 63 5f 27 20 20   SELECT 'abc_'  
8bf0: 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53 43  LIKE 'abcX_' ESC
8c00: 41 50 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f 65  APE 'X' } 1.do_e
8c10: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8c20: 70 72 2d 31 34 2e 37 2e 37 20 20 7b 20 53 45 4c  pr-14.7.7  { SEL
8c30: 45 43 54 20 27 61 62 63 35 27 20 20 4c 49 4b 45  ECT 'abc5'  LIKE
8c40: 20 27 61 62 63 58 5f 27 20 45 53 43 41 50 45 20   'abcX_' ESCAPE 
8c50: 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  'X' } 0.do_execs
8c60: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8c70: 34 2e 37 2e 38 20 20 7b 20 53 45 4c 45 43 54 20  4.7.8  { SELECT 
8c80: 27 61 62 63 27 20 20 20 4c 49 4b 45 20 27 61 62  'abc'   LIKE 'ab
8c90: 63 58 5f 27 20 45 53 43 41 50 45 20 27 58 27 20  cX_' ESCAPE 'X' 
8ca0: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
8cb0: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e  est e_expr-14.7.
8cc0: 39 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  9  { SELECT 'abc
8cd0: 58 5f 27 20 4c 49 4b 45 20 27 61 62 63 58 5f 27  X_' LIKE 'abcX_'
8ce0: 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a   ESCAPE 'X' } 0.
8cf0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8d00: 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 30 20 7b  e_expr-14.7.10 {
8d10: 20 53 45 4c 45 43 54 20 27 61 62 63 5f 5f 27 20   SELECT 'abc__' 
8d20: 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53 43  LIKE 'abcX_' ESC
8d30: 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 64 6f 5f  APE 'X' } 0..do_
8d40: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8d50: 78 70 72 2d 31 34 2e 37 2e 31 31 20 7b 20 53 45  xpr-14.7.11 { SE
8d60: 4c 45 43 54 20 27 61 62 63 58 27 20 20 4c 49 4b  LECT 'abcX'  LIK
8d70: 45 20 27 61 62 63 58 58 27 20 45 53 43 41 50 45  E 'abcXX' ESCAPE
8d80: 20 27 58 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63   'X' } 1.do_exec
8d90: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
8da0: 31 34 2e 37 2e 31 32 20 7b 20 53 45 4c 45 43 54  14.7.12 { SELECT
8db0: 20 27 61 62 63 35 27 20 20 4c 49 4b 45 20 27 61   'abc5'  LIKE 'a
8dc0: 62 63 58 58 27 20 45 53 43 41 50 45 20 27 58 27  bcXX' ESCAPE 'X'
8dd0: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
8de0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37  test e_expr-14.7
8df0: 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .13 { SELECT 'ab
8e00: 63 27 20 20 20 4c 49 4b 45 20 27 61 62 63 58 58  c'   LIKE 'abcXX
8e10: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30  ' ESCAPE 'X' } 0
8e20: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8e30: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 34 20   e_expr-14.7.14 
8e40: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 58 58 27  { SELECT 'abcXX'
8e50: 20 4c 49 4b 45 20 27 61 62 63 58 58 27 20 45 53   LIKE 'abcXX' ES
8e60: 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 23 20  CAPE 'X' } 0..# 
8e70: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
8e80: 31 33 35 39 2d 31 37 34 39 36 20 54 68 65 20 69  1359-17496 The i
8e90: 6e 66 69 78 20 4c 49 4b 45 20 6f 70 65 72 61 74  nfix LIKE operat
8ea0: 6f 72 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  or is implemente
8eb0: 64 20 62 79 0a 23 20 63 61 6c 6c 69 6e 67 20 74  d by.# calling t
8ec0: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64  he application-d
8ed0: 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74  efined SQL funct
8ee0: 69 6f 6e 73 20 6c 69 6b 65 28 59 2c 58 29 20 6f  ions like(Y,X) o
8ef0: 72 20 6c 69 6b 65 28 59 2c 58 2c 5a 29 2e 0a 23  r like(Y,X,Z)..#
8f00: 0a 70 72 6f 63 20 6c 69 6b 65 66 75 6e 63 20 7b  .proc likefunc {
8f10: 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20 6c  args} {.  eval l
8f20: 61 70 70 65 6e 64 20 3a 3a 6c 69 6b 65 61 72 67  append ::likearg
8f30: 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72 6e  s $args.  return
8f40: 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 6c 69 6b   1.}.db func lik
8f50: 65 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 6c 69  e -argcount 2 li
8f60: 6b 65 66 75 6e 63 0a 64 62 20 66 75 6e 63 20 6c  kefunc.db func l
8f70: 69 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 33 20  ike -argcount 3 
8f80: 6c 69 6b 65 66 75 6e 63 0a 73 65 74 20 3a 3a 6c  likefunc.set ::l
8f90: 69 6b 65 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64  ikeargs [list].d
8fa0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8fb0: 5f 65 78 70 72 2d 31 35 2e 31 2e 31 20 7b 20 53  _expr-15.1.1 { S
8fc0: 45 4c 45 43 54 20 27 61 62 63 27 20 4c 49 4b 45  ELECT 'abc' LIKE
8fd0: 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65   'def' } 1.do_te
8fe0: 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78 70  st         e_exp
8ff0: 72 2d 31 35 2e 31 2e 32 20 7b 20 73 65 74 20 6c  r-15.1.2 { set l
9000: 69 6b 65 61 72 67 73 20 7d 20 7b 64 65 66 20 61  ikeargs } {def a
9010: 62 63 7d 0a 73 65 74 20 3a 3a 6c 69 6b 65 61 72  bc}.set ::likear
9020: 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65  gs [list].do_exe
9030: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
9040: 2d 31 35 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54  -15.1.3 { SELECT
9050: 20 27 61 62 63 27 20 4c 49 4b 45 20 27 64 65 66   'abc' LIKE 'def
9060: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 31  ' ESCAPE 'X' } 1
9070: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
9080: 20 65 5f 65 78 70 72 2d 31 35 2e 31 2e 34 20 7b   e_expr-15.1.4 {
9090: 20 73 65 74 20 6c 69 6b 65 61 72 67 73 20 7d 20   set likeargs } 
90a0: 7b 64 65 66 20 61 62 63 20 58 7d 0a 64 62 20 63  {def abc X}.db c
90b0: 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20  lose.sqlite3 db 
90c0: 74 65 73 74 2e 64 62 0a 0a 23 20 45 56 49 44 45  test.db..# EVIDE
90d0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 38 36 38 2d  NCE-OF: R-22868-
90e0: 32 35 38 38 30 20 54 68 65 20 4c 49 4b 45 20 6f  25880 The LIKE o
90f0: 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65 20 6d  perator can be m
9100: 61 64 65 20 63 61 73 65 0a 23 20 73 65 6e 73 69  ade case.# sensi
9110: 74 69 76 65 20 75 73 69 6e 67 20 74 68 65 20 63  tive using the c
9120: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
9130: 6b 65 20 70 72 61 67 6d 61 2e 0a 23 0a 64 6f 5f  ke pragma..#.do_
9140: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
9150: 78 70 72 2d 31 36 2e 31 2e 31 20 7b 20 53 45 4c  xpr-16.1.1 { SEL
9160: 45 43 54 20 27 61 62 63 78 79 7a 27 20 4c 49 4b  ECT 'abcxyz' LIK
9170: 45 20 27 41 42 43 25 27 20 7d 20 31 0a 64 6f 5f  E 'ABC%' } 1.do_
9180: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
9190: 78 70 72 2d 31 36 2e 31 2e 32 20 7b 20 50 52 41  xpr-16.1.2 { PRA
91a0: 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69  GMA case_sensiti
91b0: 76 65 5f 6c 69 6b 65 20 3d 20 31 20 7d 20 7b 7d  ve_like = 1 } {}
91c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
91d0: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 33 20 7b   e_expr-16.1.3 {
91e0: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
91f0: 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20 30   LIKE 'ABC%' } 0
9200: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9210: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 34 20 7b   e_expr-16.1.4 {
9220: 20 53 45 4c 45 43 54 20 27 41 42 43 78 79 7a 27   SELECT 'ABCxyz'
9230: 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20 31   LIKE 'ABC%' } 1
9240: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9250: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 35 20 7b   e_expr-16.1.5 {
9260: 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e   PRAGMA case_sen
9270: 73 69 74 69 76 65 5f 6c 69 6b 65 20 3d 20 30 20  sitive_like = 0 
9280: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
9290: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
92a0: 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .6 { SELECT 'abc
92b0: 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25 27  xyz' LIKE 'ABC%'
92c0: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
92d0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
92e0: 2e 37 20 7b 20 53 45 4c 45 43 54 20 27 41 42 43  .7 { SELECT 'ABC
92f0: 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25 27  xyz' LIKE 'ABC%'
9300: 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43 45   } 1..# EVIDENCE
9310: 2d 4f 46 3a 20 52 2d 35 32 30 38 37 2d 31 32 30  -OF: R-52087-120
9320: 34 33 20 54 68 65 20 47 4c 4f 42 20 6f 70 65 72  43 The GLOB oper
9330: 61 74 6f 72 20 69 73 20 73 69 6d 69 6c 61 72 20  ator is similar 
9340: 74 6f 20 4c 49 4b 45 20 62 75 74 0a 23 20 75 73  to LIKE but.# us
9350: 65 73 20 74 68 65 20 55 6e 69 78 20 66 69 6c 65  es the Unix file
9360: 20 67 6c 6f 62 62 69 6e 67 20 73 79 6e 74 61 78   globbing syntax
9370: 20 66 6f 72 20 69 74 73 20 77 69 6c 64 63 61 72   for its wildcar
9380: 64 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ds..#.# EVIDENCE
9390: 2d 4f 46 3a 20 52 2d 30 39 38 31 33 2d 31 37 32  -OF: R-09813-172
93a0: 37 39 20 41 6c 73 6f 2c 20 47 4c 4f 42 20 69 73  79 Also, GLOB is
93b0: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 2c   case sensitive,
93c0: 20 75 6e 6c 69 6b 65 20 4c 49 4b 45 2e 0a 23 0a   unlike LIKE..#.
93d0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
93e0: 65 5f 65 78 70 72 2d 31 37 2e 31 2e 31 20 7b 20  e_expr-17.1.1 { 
93f0: 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20  SELECT 'abcxyz' 
9400: 47 4c 4f 42 20 27 61 62 63 25 27 20 7d 20 30 0a  GLOB 'abc%' } 0.
9410: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9420: 65 5f 65 78 70 72 2d 31 37 2e 31 2e 32 20 7b 20  e_expr-17.1.2 { 
9430: 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20  SELECT 'abcxyz' 
9440: 47 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20 31 0a  GLOB 'abc*' } 1.
9450: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9460: 65 5f 65 78 70 72 2d 31 37 2e 31 2e 33 20 7b 20  e_expr-17.1.3 { 
9470: 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20  SELECT 'abcxyz' 
9480: 47 4c 4f 42 20 27 61 62 63 5f 5f 5f 27 20 7d 20  GLOB 'abc___' } 
9490: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
94a0: 74 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 34 20  t e_expr-17.1.4 
94b0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
94c0: 27 20 47 4c 4f 42 20 27 61 62 63 3f 3f 3f 27 20  ' GLOB 'abc???' 
94d0: 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } 1..do_execsql_
94e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31  test e_expr-17.1
94f0: 2e 35 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .5 { SELECT 'abc
9500: 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 2a 27  xyz' GLOB 'abc*'
9510: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
9520: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31  test e_expr-17.1
9530: 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 41 42 43  .6 { SELECT 'ABC
9540: 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 2a 27  xyz' GLOB 'abc*'
9550: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
9560: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31  test e_expr-17.1
9570: 2e 37 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .7 { SELECT 'abc
9580: 78 79 7a 27 20 47 4c 4f 42 20 27 41 42 43 2a 27  xyz' GLOB 'ABC*'
9590: 20 7d 20 30 0a 0a 23 20 45 56 49 44 45 4e 43 45   } 0..# EVIDENCE
95a0: 2d 4f 46 3a 20 52 2d 33 39 36 31 36 2d 32 30 35  -OF: R-39616-205
95b0: 35 35 20 42 6f 74 68 20 47 4c 4f 42 20 61 6e 64  55 Both GLOB and
95c0: 20 4c 49 4b 45 20 6d 61 79 20 62 65 20 70 72 65   LIKE may be pre
95d0: 63 65 64 65 64 20 62 79 20 74 68 65 0a 23 20 4e  ceded by the.# N
95e0: 4f 54 20 6b 65 79 77 6f 72 64 20 74 6f 20 69 6e  OT keyword to in
95f0: 76 65 72 74 20 74 68 65 20 73 65 6e 73 65 20 6f  vert the sense o
9600: 66 20 74 68 65 20 74 65 73 74 2e 0a 23 0a 64 6f  f the test..#.do
9610: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9620: 65 78 70 72 2d 31 37 2e 32 2e 31 20 7b 20 53 45  expr-17.2.1 { SE
9630: 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e 4f  LECT 'abcxyz' NO
9640: 54 20 47 4c 4f 42 20 27 41 42 43 2a 27 20 7d 20  T GLOB 'ABC*' } 
9650: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
9660: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 32 20  t e_expr-17.2.2 
9670: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
9680: 27 20 4e 4f 54 20 47 4c 4f 42 20 27 61 62 63 2a  ' NOT GLOB 'abc*
9690: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
96a0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
96b0: 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.3 { SELECT 'ab
96c0: 63 78 79 7a 27 20 4e 4f 54 20 4c 49 4b 45 20 27  cxyz' NOT LIKE '
96d0: 41 42 43 25 27 20 7d 20 30 0a 64 6f 5f 65 78 65  ABC%' } 0.do_exe
96e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
96f0: 2d 31 37 2e 32 2e 34 20 7b 20 53 45 4c 45 43 54  -17.2.4 { SELECT
9700: 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 4c 49   'abcxyz' NOT LI
9710: 4b 45 20 27 61 62 63 25 27 20 7d 20 30 0a 64 6f  KE 'abc%' } 0.do
9720: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9730: 65 78 70 72 2d 31 37 2e 32 2e 35 20 7b 20 53 45  expr-17.2.5 { SE
9740: 4c 45 43 54 20 27 61 62 64 78 79 7a 27 20 4e 4f  LECT 'abdxyz' NO
9750: 54 20 4c 49 4b 45 20 27 61 62 63 25 27 20 7d 20  T LIKE 'abc%' } 
9760: 31 0a 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20  1..db nullvalue 
9770: 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  null.do_execsql_
9780: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 32  test e_expr-17.2
9790: 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .6 { SELECT 'abc
97a0: 78 79 7a 27 20 4e 4f 54 20 47 4c 4f 42 20 4e 55  xyz' NOT GLOB NU
97b0: 4c 4c 20 7d 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65  LL } null.do_exe
97c0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
97d0: 2d 31 37 2e 32 2e 37 20 7b 20 53 45 4c 45 43 54  -17.2.7 { SELECT
97e0: 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 4c 49   'abcxyz' NOT LI
97f0: 4b 45 20 4e 55 4c 4c 20 7d 20 6e 75 6c 6c 0a 64  KE NULL } null.d
9800: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
9810: 5f 65 78 70 72 2d 31 37 2e 32 2e 38 20 7b 20 53  _expr-17.2.8 { S
9820: 45 4c 45 43 54 20 4e 55 4c 4c 20 4e 4f 54 20 47  ELECT NULL NOT G
9830: 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20 6e 75 6c  LOB 'abc*' } nul
9840: 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l.do_execsql_tes
9850: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 39 20  t e_expr-17.2.9 
9860: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 4e 4f  { SELECT NULL NO
9870: 54 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20  T LIKE 'ABC%' } 
9880: 6e 75 6c 6c 0a 64 62 20 6e 75 6c 6c 76 61 6c 75  null.db nullvalu
9890: 65 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  e {}..# EVIDENCE
98a0: 2d 4f 46 3a 20 52 2d 33 39 34 31 34 2d 33 35 34  -OF: R-39414-354
98b0: 38 39 20 54 68 65 20 69 6e 66 69 78 20 47 4c 4f  89 The infix GLO
98c0: 42 20 6f 70 65 72 61 74 6f 72 20 69 73 20 69 6d  B operator is im
98d0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 23 20 63  plemented by.# c
98e0: 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74  alling the funct
98f0: 69 6f 6e 20 67 6c 6f 62 28 59 2c 58 29 20 61 6e  ion glob(Y,X) an
9900: 64 20 63 61 6e 20 62 65 20 6d 6f 64 69 66 69 65  d can be modifie
9910: 64 20 62 79 20 6f 76 65 72 72 69 64 69 6e 67 20  d by overriding 
9920: 74 68 61 74 0a 23 20 66 75 6e 63 74 69 6f 6e 2e  that.# function.
9930: 0a 70 72 6f 63 20 67 6c 6f 62 66 75 6e 63 20 7b  .proc globfunc {
9940: 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20 6c  args} {.  eval l
9950: 61 70 70 65 6e 64 20 3a 3a 67 6c 6f 62 61 72 67  append ::globarg
9960: 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72 6e  s $args.  return
9970: 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 67 6c 6f   1.}.db func glo
9980: 62 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 67 6c  b -argcount 2 gl
9990: 6f 62 66 75 6e 63 0a 73 65 74 20 3a 3a 67 6c 6f  obfunc.set ::glo
99a0: 62 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f  bargs [list].do_
99b0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
99c0: 78 70 72 2d 31 37 2e 33 2e 31 20 7b 20 53 45 4c  xpr-17.3.1 { SEL
99d0: 45 43 54 20 27 61 62 63 27 20 47 4c 4f 42 20 27  ECT 'abc' GLOB '
99e0: 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73 74  def' } 1.do_test
99f0: 20 20 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d           e_expr-
9a00: 31 37 2e 33 2e 32 20 7b 20 73 65 74 20 67 6c 6f  17.3.2 { set glo
9a10: 62 61 72 67 73 20 7d 20 7b 64 65 66 20 61 62 63  bargs } {def abc
9a20: 7d 0a 73 65 74 20 3a 3a 67 6c 6f 62 61 72 67 73  }.set ::globargs
9a30: 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73   [list].do_execs
9a40: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
9a50: 37 2e 33 2e 33 20 7b 20 53 45 4c 45 43 54 20 27  7.3.3 { SELECT '
9a60: 58 27 20 4e 4f 54 20 47 4c 4f 42 20 27 59 27 20  X' NOT GLOB 'Y' 
9a70: 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20 20 20 20  } 0.do_test     
9a80: 20 20 20 20 65 5f 65 78 70 72 2d 31 37 2e 33 2e      e_expr-17.3.
9a90: 34 20 7b 20 73 65 74 20 67 6c 6f 62 61 72 67 73  4 { set globargs
9aa0: 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69 74 65 33   } {Y X}.sqlite3
9ab0: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 23 20 45   db test.db..# E
9ac0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31  VIDENCE-OF: R-41
9ad0: 36 35 30 2d 32 30 38 37 32 20 4e 6f 20 72 65 67  650-20872 No reg
9ae0: 65 78 70 28 29 20 75 73 65 72 20 66 75 6e 63 74  exp() user funct
9af0: 69 6f 6e 20 69 73 20 64 65 66 69 6e 65 64 20 62  ion is defined b
9b00: 79 0a 23 20 64 65 66 61 75 6c 74 20 61 6e 64 20  y.# default and 
9b10: 73 6f 20 75 73 65 20 6f 66 20 74 68 65 20 52 45  so use of the RE
9b20: 47 45 58 50 20 6f 70 65 72 61 74 6f 72 20 77 69  GEXP operator wi
9b30: 6c 6c 20 6e 6f 72 6d 61 6c 6c 79 20 72 65 73 75  ll normally resu
9b40: 6c 74 20 69 6e 20 61 6e 0a 23 20 65 72 72 6f 72  lt in an.# error
9b50: 20 6d 65 73 73 61 67 65 2e 0a 23 0a 23 20 20 20   message..#.#   
9b60: 54 68 65 72 65 20 69 73 20 61 20 72 65 67 65 78  There is a regex
9b70: 70 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 49 43  p function if IC
9b80: 55 20 69 73 20 65 6e 61 62 6c 65 64 20 74 68 6f  U is enabled tho
9b90: 75 67 68 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  ugh..#.ifcapable
9ba0: 20 21 69 63 75 20 7b 0a 20 20 64 6f 5f 63 61 74   !icu {.  do_cat
9bb0: 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  chsql_test e_exp
9bc0: 72 2d 31 38 2e 31 2e 31 20 7b 20 0a 20 20 20 20  r-18.1.1 { .    
9bd0: 53 45 4c 45 43 54 20 72 65 67 65 78 70 28 27 61  SELECT regexp('a
9be0: 62 63 27 2c 20 27 64 65 66 27 29 20 0a 20 20 7d  bc', 'def') .  }
9bf0: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e   {1 {no such fun
9c00: 63 74 69 6f 6e 3a 20 72 65 67 65 78 70 7d 7d 0a  ction: regexp}}.
9c10: 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65    do_catchsql_te
9c20: 73 74 20 65 5f 65 78 70 72 2d 31 38 2e 31 2e 32  st e_expr-18.1.2
9c30: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 27   { .    SELECT '
9c40: 61 62 63 27 20 52 45 47 45 58 50 20 27 64 65 66  abc' REGEXP 'def
9c50: 27 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  '.  } {1 {no suc
9c60: 68 20 66 75 6e 63 74 69 6f 6e 3a 20 52 45 47 45  h function: REGE
9c70: 58 50 7d 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  XP}}.}..# EVIDEN
9c80: 43 45 2d 4f 46 3a 20 52 2d 33 33 36 39 33 2d 35  CE-OF: R-33693-5
9c90: 30 31 38 30 20 54 68 65 20 52 45 47 45 58 50 20  0180 The REGEXP 
9ca0: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 73 70  operator is a sp
9cb0: 65 63 69 61 6c 20 73 79 6e 74 61 78 20 66 6f 72  ecial syntax for
9cc0: 0a 23 20 74 68 65 20 72 65 67 65 78 70 28 29 20  .# the regexp() 
9cd0: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 23  user function..#
9ce0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
9cf0: 52 2d 35 37 32 38 39 2d 31 33 35 37 38 20 49 66  R-57289-13578 If
9d00: 20 61 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64   a application-d
9d10: 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74  efined SQL funct
9d20: 69 6f 6e 20 6e 61 6d 65 64 0a 23 20 22 72 65 67  ion named.# "reg
9d30: 65 78 70 22 20 69 73 20 61 64 64 65 64 20 61 74  exp" is added at
9d40: 20 72 75 6e 2d 74 69 6d 65 2c 20 74 68 61 74 20   run-time, that 
9d50: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  function will be
9d60: 20 63 61 6c 6c 65 64 20 69 6e 20 6f 72 64 65 72   called in order
9d70: 0a 23 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  .# to implement 
9d80: 74 68 65 20 52 45 47 45 58 50 20 6f 70 65 72 61  the REGEXP opera
9d90: 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 72 65 67 65  tor..#.proc rege
9da0: 78 70 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b 0a  xpfunc {args} {.
9db0: 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a    eval lappend :
9dc0: 3a 72 65 67 65 78 70 61 72 67 73 20 24 61 72 67  :regexpargs $arg
9dd0: 73 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a 64  s.  return 1.}.d
9de0: 62 20 66 75 6e 63 20 72 65 67 65 78 70 20 2d 61  b func regexp -a
9df0: 72 67 63 6f 75 6e 74 20 32 20 72 65 67 65 78 70  rgcount 2 regexp
9e00: 66 75 6e 63 0a 73 65 74 20 3a 3a 72 65 67 65 78  func.set ::regex
9e10: 70 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f  pargs [list].do_
9e20: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
9e30: 78 70 72 2d 31 38 2e 32 2e 31 20 7b 20 53 45 4c  xpr-18.2.1 { SEL
9e40: 45 43 54 20 27 61 62 63 27 20 52 45 47 45 58 50  ECT 'abc' REGEXP
9e50: 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65   'def' } 1.do_te
9e60: 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78 70  st         e_exp
9e70: 72 2d 31 38 2e 32 2e 32 20 7b 20 73 65 74 20 72  r-18.2.2 { set r
9e80: 65 67 65 78 70 61 72 67 73 20 7d 20 7b 64 65 66  egexpargs } {def
9e90: 20 61 62 63 7d 0a 73 65 74 20 3a 3a 72 65 67 65   abc}.set ::rege
9ea0: 78 70 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f  xpargs [list].do
9eb0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9ec0: 65 78 70 72 2d 31 38 2e 32 2e 33 20 7b 20 53 45  expr-18.2.3 { SE
9ed0: 4c 45 43 54 20 27 58 27 20 4e 4f 54 20 52 45 47  LECT 'X' NOT REG
9ee0: 45 58 50 20 27 59 27 20 7d 20 30 0a 64 6f 5f 74  EXP 'Y' } 0.do_t
9ef0: 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78  est         e_ex
9f00: 70 72 2d 31 38 2e 32 2e 34 20 7b 20 73 65 74 20  pr-18.2.4 { set 
9f10: 72 65 67 65 78 70 61 72 67 73 20 7d 20 7b 59 20  regexpargs } {Y 
9f20: 58 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65  X}.sqlite3 db te
9f30: 73 74 2e 64 62 0a 0a 23 20 45 56 49 44 45 4e 43  st.db..# EVIDENC
9f40: 45 2d 4f 46 3a 20 52 2d 34 32 30 33 37 2d 33 37  E-OF: R-42037-37
9f50: 38 32 36 20 54 68 65 20 64 65 66 61 75 6c 74 20  826 The default 
9f60: 6d 61 74 63 68 28 29 20 66 75 6e 63 74 69 6f 6e  match() function
9f70: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
9f80: 23 20 72 61 69 73 65 73 20 61 6e 20 65 78 63 65  # raises an exce
9f90: 70 74 69 6f 6e 20 61 6e 64 20 69 73 20 6e 6f 74  ption and is not
9fa0: 20 72 65 61 6c 6c 79 20 75 73 65 66 75 6c 20 66   really useful f
9fb0: 6f 72 20 61 6e 79 74 68 69 6e 67 2e 0a 23 0a 64  or anything..#.d
9fc0: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
9fd0: 65 5f 65 78 70 72 2d 31 39 2e 31 2e 31 20 7b 20  e_expr-19.1.1 { 
9fe0: 0a 20 20 53 45 4c 45 43 54 20 27 61 62 63 27 20  .  SELECT 'abc' 
9ff0: 4d 41 54 43 48 20 27 64 65 66 27 20 0a 7d 20 7b  MATCH 'def' .} {
a000: 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73 65  1 {unable to use
a010: 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20   function MATCH 
a020: 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
a030: 20 63 6f 6e 74 65 78 74 7d 7d 0a 64 6f 5f 63 61   context}}.do_ca
a040: 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  tchsql_test e_ex
a050: 70 72 2d 31 39 2e 31 2e 32 20 7b 20 0a 20 20 53  pr-19.1.2 { .  S
a060: 45 4c 45 43 54 20 6d 61 74 63 68 28 27 61 62 63  ELECT match('abc
a070: 27 2c 20 27 64 65 66 27 29 0a 7d 20 7b 31 20 7b  ', 'def').} {1 {
a080: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75  unable to use fu
a090: 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20  nction MATCH in 
a0a0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
a0b0: 6e 74 65 78 74 7d 7d 0a 0a 23 20 45 56 49 44 45  ntext}}..# EVIDE
a0c0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 39 31 36 2d  NCE-OF: R-37916-
a0d0: 34 37 34 30 37 20 54 68 65 20 4d 41 54 43 48 20  47407 The MATCH 
a0e0: 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 73 70  operator is a sp
a0f0: 65 63 69 61 6c 20 73 79 6e 74 61 78 20 66 6f 72  ecial syntax for
a100: 0a 23 20 74 68 65 20 6d 61 74 63 68 28 29 20 61  .# the match() a
a110: 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
a120: 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 23  ed function..#.#
a130: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
a140: 30 36 30 32 31 2d 30 39 33 37 33 20 42 75 74 20  06021-09373 But 
a150: 65 78 74 65 6e 73 69 6f 6e 73 20 63 61 6e 20 6f  extensions can o
a160: 76 65 72 72 69 64 65 20 74 68 65 20 6d 61 74 63  verride the matc
a170: 68 28 29 0a 23 20 66 75 6e 63 74 69 6f 6e 20 77  h().# function w
a180: 69 74 68 20 6d 6f 72 65 20 68 65 6c 70 66 75 6c  ith more helpful
a190: 20 6c 6f 67 69 63 2e 0a 23 0a 70 72 6f 63 20 6d   logic..#.proc m
a1a0: 61 74 63 68 66 75 6e 63 20 7b 61 72 67 73 7d 20  atchfunc {args} 
a1b0: 7b 0a 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64  {.  eval lappend
a1c0: 20 3a 3a 6d 61 74 63 68 61 72 67 73 20 24 61 72   ::matchargs $ar
a1d0: 67 73 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a  gs.  return 1.}.
a1e0: 64 62 20 66 75 6e 63 20 6d 61 74 63 68 20 2d 61  db func match -a
a1f0: 72 67 63 6f 75 6e 74 20 32 20 6d 61 74 63 68 66  rgcount 2 matchf
a200: 75 6e 63 0a 73 65 74 20 3a 3a 6d 61 74 63 68 61  unc.set ::matcha
a210: 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  rgs [list].do_ex
a220: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
a230: 72 2d 31 39 2e 32 2e 31 20 7b 20 53 45 4c 45 43  r-19.2.1 { SELEC
a240: 54 20 27 61 62 63 27 20 4d 41 54 43 48 20 27 64  T 'abc' MATCH 'd
a250: 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73 74 20  ef' } 1.do_test 
a260: 20 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31          e_expr-1
a270: 39 2e 32 2e 32 20 7b 20 73 65 74 20 6d 61 74 63  9.2.2 { set matc
a280: 68 61 72 67 73 20 7d 20 7b 64 65 66 20 61 62 63  hargs } {def abc
a290: 7d 0a 73 65 74 20 3a 3a 6d 61 74 63 68 61 72 67  }.set ::matcharg
a2a0: 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63  s [list].do_exec
a2b0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
a2c0: 31 39 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54 20  19.2.3 { SELECT 
a2d0: 27 58 27 20 4e 4f 54 20 4d 41 54 43 48 20 27 59  'X' NOT MATCH 'Y
a2e0: 27 20 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20 20  ' } 0.do_test   
a2f0: 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31 39 2e        e_expr-19.
a300: 32 2e 34 20 7b 20 73 65 74 20 6d 61 74 63 68 61  2.4 { set matcha
a310: 72 67 73 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69  rgs } {Y X}.sqli
a320: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a  te3 db test.db..
a330: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
a340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
a380: 74 20 63 61 73 65 73 20 66 6f 72 20 74 68 65 20  t cases for the 
a390: 74 65 73 74 61 62 6c 65 20 73 74 61 74 65 6d 65  testable stateme
a3a0: 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  nts related to t
a3b0: 68 65 20 43 41 53 45 20 65 78 70 72 65 73 73 69  he CASE expressi
a3c0: 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  on..#.# EVIDENCE
a3d0: 2d 4f 46 3a 20 52 2d 31 35 31 39 39 2d 36 31 33  -OF: R-15199-613
a3e0: 38 39 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  89 There are two
a3f0: 20 62 61 73 69 63 20 66 6f 72 6d 73 20 6f 66 20   basic forms of 
a400: 74 68 65 20 43 41 53 45 0a 23 20 65 78 70 72 65  the CASE.# expre
a410: 73 73 69 6f 6e 3a 20 74 68 6f 73 65 20 77 69 74  ssion: those wit
a420: 68 20 61 20 62 61 73 65 20 65 78 70 72 65 73 73  h a base express
a430: 69 6f 6e 20 61 6e 64 20 74 68 6f 73 65 20 77 69  ion and those wi
a440: 74 68 6f 75 74 2e 0a 23 0a 64 6f 5f 65 78 65 63  thout..#.do_exec
a450: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
a460: 32 30 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  20.1 {.  SELECT 
a470: 43 41 53 45 20 57 48 45 4e 20 31 20 54 48 45 4e  CASE WHEN 1 THEN
a480: 20 27 74 72 75 65 27 20 57 48 45 4e 20 30 20 54   'true' WHEN 0 T
a490: 48 45 4e 20 27 66 61 6c 73 65 27 20 45 4c 53 45  HEN 'false' ELSE
a4a0: 20 27 65 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b   'else' END;.} {
a4b0: 74 72 75 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  true}.do_execsql
a4c0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 30 2e  _test e_expr-20.
a4d0: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  2 {.  SELECT CAS
a4e0: 45 20 30 20 57 48 45 4e 20 31 20 54 48 45 4e 20  E 0 WHEN 1 THEN 
a4f0: 27 74 72 75 65 27 20 57 48 45 4e 20 30 20 54 48  'true' WHEN 0 TH
a500: 45 4e 20 27 66 61 6c 73 65 27 20 45 4c 53 45 20  EN 'false' ELSE 
a510: 27 65 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66  'else' END;.} {f
a520: 61 6c 73 65 7d 0a 0a 70 72 6f 63 20 76 61 72 20  alse}..proc var 
a530: 7b 6e 6d 7d 20 7b 0a 20 20 6c 61 70 70 65 6e 64  {nm} {.  lappend
a540: 20 3a 3a 76 61 72 6c 69 73 74 20 24 6e 6d 0a 20   ::varlist $nm. 
a550: 20 72 65 74 75 72 6e 20 5b 73 65 74 20 22 3a 3a   return [set "::
a560: 24 6e 6d 22 5d 0a 7d 0a 64 62 20 66 75 6e 63 20  $nm"].}.db func 
a570: 76 61 72 20 76 61 72 0a 0a 23 20 45 56 49 44 45  var var..# EVIDE
a580: 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 36 33 38 2d  NCE-OF: R-30638-
a590: 35 39 39 35 34 20 49 6e 20 61 20 43 41 53 45 20  59954 In a CASE 
a5a0: 77 69 74 68 6f 75 74 20 61 20 62 61 73 65 20 65  without a base e
a5b0: 78 70 72 65 73 73 69 6f 6e 2c 20 65 61 63 68 0a  xpression, each.
a5c0: 23 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f  # WHEN expressio
a5d0: 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61  n is evaluated a
a5e0: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 74 72  nd the result tr
a5f0: 65 61 74 65 64 20 61 73 20 61 20 62 6f 6f 6c 65  eated as a boole
a600: 61 6e 2c 0a 23 20 73 74 61 72 74 69 6e 67 20 77  an,.# starting w
a610: 69 74 68 20 74 68 65 20 6c 65 66 74 6d 6f 73 74  ith the leftmost
a620: 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
a630: 74 6f 20 74 68 65 20 72 69 67 68 74 2e 0a 23 0a  to the right..#.
a640: 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20  foreach {a b c} 
a650: 7b 30 20 30 20 30 7d 20 62 72 65 61 6b 0a 73 65  {0 0 0} break.se
a660: 74 20 76 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d  t varlist [list]
a670: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
a680: 20 65 5f 65 78 70 72 2d 32 31 2e 31 2e 31 20 7b   e_expr-21.1.1 {
a690: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57  .  SELECT CASE W
a6a0: 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45  HEN var('a') THE
a6b0: 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20  N 'A' .         
a6c0: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62       WHEN var('b
a6d0: 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20  ') THEN 'B' .   
a6e0: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
a6f0: 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43  var('c') THEN 'C
a700: 27 20 45 4e 44 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f  ' END.} {{}}.do_
a710: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 31  test e_expr-21.1
a720: 2e 32 20 7b 20 73 65 74 20 76 61 72 6c 69 73 74  .2 { set varlist
a730: 20 7d 20 7b 61 20 62 20 63 7d 0a 73 65 74 20 76   } {a b c}.set v
a740: 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f  arlist [list].do
a750: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
a760: 65 78 70 72 2d 32 31 2e 31 2e 33 20 7b 0a 20 20  expr-21.1.3 {.  
a770: 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
a780: 20 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27   var('c') THEN '
a790: 43 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  C' .            
a7a0: 20 20 57 48 45 4e 20 76 61 72 28 27 62 27 29 20    WHEN var('b') 
a7b0: 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20  THEN 'B' .      
a7c0: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
a7d0: 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a  ('a') THEN 'A' .
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c                EL
a7f0: 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20  SE 'no result'. 
a800: 20 45 4e 44 0a 7d 20 7b 7b 6e 6f 20 72 65 73 75   END.} {{no resu
a810: 6c 74 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65  lt}}.do_test e_e
a820: 78 70 72 2d 32 31 2e 31 2e 34 20 7b 20 73 65 74  xpr-21.1.4 { set
a830: 20 76 61 72 6c 69 73 74 20 7d 20 7b 63 20 62 20   varlist } {c b 
a840: 61 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  a}..# EVIDENCE-O
a850: 46 3a 20 52 2d 33 39 30 30 39 2d 32 35 35 39 36  F: R-39009-25596
a860: 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
a870: 68 65 20 43 41 53 45 20 65 78 70 72 65 73 73 69  he CASE expressi
a880: 6f 6e 20 69 73 20 74 68 65 0a 23 20 65 76 61 6c  on is the.# eval
a890: 75 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 48  uation of the TH
a8a0: 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  EN expression th
a8b0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
a8c0: 6f 20 74 68 65 20 66 69 72 73 74 20 57 48 45 4e  o the first WHEN
a8d0: 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  .# expression th
a8e0: 61 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  at evaluates to 
a8f0: 74 72 75 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20  true..#.foreach 
a900: 7b 61 20 62 20 63 7d 20 7b 30 20 31 20 30 7d 20  {a b c} {0 1 0} 
a910: 62 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c  break.do_execsql
a920: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e  _test e_expr-21.
a930: 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  2.1 {.  SELECT C
a940: 41 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27  ASE WHEN var('a'
a950: 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20  ) THEN 'A' .    
a960: 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76            WHEN v
a970: 61 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27  ar('b') THEN 'B'
a980: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
a990: 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48  WHEN var('c') TH
a9a0: 45 4e 20 27 43 27 20 0a 20 20 20 20 20 20 20 20  EN 'C' .        
a9b0: 20 20 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72        ELSE 'no r
a9c0: 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b  esult'.  END.} {
a9d0: 42 7d 0a 66 6f 72 65 61 63 68 20 7b 61 20 62 20  B}.foreach {a b 
a9e0: 63 7d 20 7b 30 20 31 20 31 7d 20 62 72 65 61 6b  c} {0 1 1} break
a9f0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
aa00: 20 65 5f 65 78 70 72 2d 32 31 2e 32 2e 32 20 7b   e_expr-21.2.2 {
aa10: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57  .  SELECT CASE W
aa20: 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45  HEN var('a') THE
aa30: 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20  N 'A' .         
aa40: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62       WHEN var('b
aa50: 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20  ') THEN 'B' .   
aa60: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
aa70: 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43  var('c') THEN 'C
aa80: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  '.              
aa90: 45 4c 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27  ELSE 'no result'
aaa0: 0a 20 20 45 4e 44 0a 7d 20 7b 42 7d 0a 66 6f 72  .  END.} {B}.for
aab0: 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20  each {a b c} {0 
aac0: 30 20 31 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78  0 1} break.do_ex
aad0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
aae0: 72 2d 32 31 2e 32 2e 33 20 7b 0a 20 20 53 45 4c  r-21.2.3 {.  SEL
aaf0: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61  ECT CASE WHEN va
ab00: 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20  r('a') THEN 'A' 
ab10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
ab20: 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45  HEN var('b') THE
ab30: 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20  N 'B' .         
ab40: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63       WHEN var('c
ab50: 27 29 20 54 48 45 4e 20 27 43 27 0a 20 20 20 20  ') THEN 'C'.    
ab60: 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 27            ELSE '
ab70: 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20 45 4e 44  no result'.  END
ab80: 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56 49 44 45 4e  .} {C}..# EVIDEN
ab90: 43 45 2d 4f 46 3a 20 52 2d 32 34 32 32 37 2d 30  CE-OF: R-24227-0
aba0: 34 38 30 37 20 4f 72 2c 20 69 66 20 6e 6f 6e 65  4807 Or, if none
abb0: 20 6f 66 20 74 68 65 20 57 48 45 4e 20 65 78 70   of the WHEN exp
abc0: 72 65 73 73 69 6f 6e 73 0a 23 20 65 76 61 6c 75  ressions.# evalu
abd0: 61 74 65 20 74 6f 20 74 72 75 65 2c 20 74 68 65  ate to true, the
abe0: 20 72 65 73 75 6c 74 20 6f 66 20 65 76 61 6c 75   result of evalu
abf0: 61 74 69 6e 67 20 74 68 65 20 45 4c 53 45 20 65  ating the ELSE e
ac00: 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 0a 23 20  xpression, if.# 
ac10: 61 6e 79 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  any..#.foreach {
ac20: 61 20 62 20 63 7d 20 7b 30 20 30 20 30 7d 20 62  a b c} {0 0 0} b
ac30: 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  reak.do_execsql_
ac40: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 33  test e_expr-21.3
ac50: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .1 {.  SELECT CA
ac60: 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27 29  SE WHEN var('a')
ac70: 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20   THEN 'A' .     
ac80: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
ac90: 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20  r('b') THEN 'B' 
aca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
acb0: 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45  HEN var('c') THE
acc0: 4e 20 27 43 27 0a 20 20 20 20 20 20 20 20 20 20  N 'C'.          
acd0: 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72 65 73      ELSE 'no res
ace0: 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 7b 6e  ult'.  END.} {{n
acf0: 6f 20 72 65 73 75 6c 74 7d 7d 0a 0a 23 20 45 56  o result}}..# EV
ad00: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 31  IDENCE-OF: R-141
ad10: 36 38 2d 30 37 35 37 39 20 49 66 20 74 68 65 72  68-07579 If ther
ad20: 65 20 69 73 20 6e 6f 20 45 4c 53 45 20 65 78 70  e is no ELSE exp
ad30: 72 65 73 73 69 6f 6e 20 61 6e 64 20 6e 6f 6e 65  ression and none
ad40: 20 6f 66 0a 23 20 74 68 65 20 57 48 45 4e 20 65   of.# the WHEN e
ad50: 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74  xpressions are t
ad60: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 76  rue, then the ov
ad70: 65 72 61 6c 6c 20 72 65 73 75 6c 74 20 69 73 20  erall result is 
ad80: 4e 55 4c 4c 2e 0a 23 0a 64 62 20 6e 75 6c 6c 76  NULL..#.db nullv
ad90: 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65  alue null.do_exe
ada0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
adb0: 2d 32 31 2e 33 2e 32 20 7b 0a 20 20 53 45 4c 45  -21.3.2 {.  SELE
adc0: 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61 72  CT CASE WHEN var
add0: 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a  ('a') THEN 'A' .
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
adf0: 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e  EN var('b') THEN
ae00: 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20   'B' .          
ae10: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63 27      WHEN var('c'
ae20: 29 20 54 48 45 4e 20 27 43 27 0a 20 20 45 4e 44  ) THEN 'C'.  END
ae30: 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 62 20 6e 75 6c  .} {null}.db nul
ae40: 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23 20 45 56 49  lvalue {}..# EVI
ae50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 39 34  DENCE-OF: R-1394
ae60: 33 2d 31 33 35 39 32 20 41 20 4e 55 4c 4c 20 72  3-13592 A NULL r
ae70: 65 73 75 6c 74 20 69 73 20 63 6f 6e 73 69 64 65  esult is conside
ae80: 72 65 64 20 75 6e 74 72 75 65 20 77 68 65 6e 0a  red untrue when.
ae90: 23 20 65 76 61 6c 75 61 74 69 6e 67 20 57 48 45  # evaluating WHE
aea0: 4e 20 74 65 72 6d 73 2e 0a 23 0a 64 6f 5f 65 78  N terms..#.do_ex
aeb0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
aec0: 72 2d 32 31 2e 34 2e 31 20 7b 0a 20 20 53 45 4c  r-21.4.1 {.  SEL
aed0: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 4e 55  ECT CASE WHEN NU
aee0: 4c 4c 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e  LL THEN 'A' WHEN
aef0: 20 31 20 54 48 45 4e 20 27 42 27 20 45 4e 44 0a   1 THEN 'B' END.
af00: 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {B}.do_execsql
af10: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e  _test e_expr-21.
af20: 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  4.2 {.  SELECT C
af30: 41 53 45 20 57 48 45 4e 20 30 20 54 48 45 4e 20  ASE WHEN 0 THEN 
af40: 27 41 27 20 57 48 45 4e 20 4e 55 4c 4c 20 54 48  'A' WHEN NULL TH
af50: 45 4e 20 27 42 27 20 45 4c 53 45 20 27 43 27 20  EN 'B' ELSE 'C' 
af60: 45 4e 44 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56 49  END.} {C}..# EVI
af70: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 38 36 32  DENCE-OF: R-3862
af80: 30 2d 31 39 34 39 39 20 49 6e 20 61 20 43 41 53  0-19499 In a CAS
af90: 45 20 77 69 74 68 20 61 20 62 61 73 65 20 65 78  E with a base ex
afa0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 62 61  pression, the ba
afb0: 73 65 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20  se.# expression 
afc0: 69 73 20 65 76 61 6c 75 61 74 65 64 20 6a 75 73  is evaluated jus
afd0: 74 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72  t once and the r
afe0: 65 73 75 6c 74 20 69 73 20 63 6f 6d 70 61 72 65  esult is compare
aff0: 64 20 61 67 61 69 6e 73 74 0a 23 20 74 68 65 20  d against.# the 
b000: 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 65 61  evaluation of ea
b010: 63 68 20 57 48 45 4e 20 65 78 70 72 65 73 73 69  ch WHEN expressi
b020: 6f 6e 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  on from left to 
b030: 72 69 67 68 74 2e 0a 23 0a 23 20 4e 6f 74 65 3a  right..#.# Note:
b040: 20 54 68 69 73 20 74 65 73 74 20 63 61 73 65 20   This test case 
b050: 74 65 73 74 73 20 74 68 65 20 22 65 76 61 6c 75  tests the "evalu
b060: 61 74 65 64 20 6a 75 73 74 20 6f 6e 63 65 22 20  ated just once" 
b070: 70 61 72 74 20 6f 66 20 74 68 65 20 61 62 6f 76  part of the abov
b080: 65 0a 23 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  e.# statement. T
b090: 65 73 74 73 20 61 73 73 6f 63 69 61 74 65 64 20  ests associated 
b0a0: 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 74 77  with the next tw
b0b0: 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 74 65 73  o statements tes
b0c0: 74 20 74 68 61 74 20 74 68 65 0a 23 20 63 6f 6d  t that the.# com
b0d0: 70 61 72 69 73 6f 6e 73 20 74 61 6b 65 20 70 6c  parisons take pl
b0e0: 61 63 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  ace..#.foreach {
b0f0: 61 20 62 20 63 7d 20 5b 6c 69 73 74 20 5b 65 78  a b c} [list [ex
b100: 70 72 20 33 5d 20 5b 65 78 70 72 20 34 5d 20 5b  pr 3] [expr 4] [
b110: 65 78 70 72 20 35 5d 5d 20 62 72 65 61 6b 0a 73  expr 5]] break.s
b120: 65 74 20 3a 3a 76 61 72 6c 69 73 74 20 5b 6c 69  et ::varlist [li
b130: 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  st].do_execsql_t
b140: 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 31 2e  est e_expr-22.1.
b150: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  1 {.  SELECT CAS
b160: 45 20 76 61 72 28 27 61 27 29 20 57 48 45 4e 20  E var('a') WHEN 
b170: 31 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20  1 THEN 'A' WHEN 
b180: 32 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20  2 THEN 'B' WHEN 
b190: 33 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d  3 THEN 'C' END.}
b1a0: 20 7b 43 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65   {C}.do_test e_e
b1b0: 78 70 72 2d 32 32 2e 31 2e 32 20 7b 20 73 65 74  xpr-22.1.2 { set
b1c0: 20 3a 3a 76 61 72 6c 69 73 74 20 7d 20 7b 61 7d   ::varlist } {a}
b1d0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
b1e0: 20 52 2d 30 37 36 36 37 2d 34 39 35 33 37 20 54   R-07667-49537 T
b1f0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
b200: 20 43 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e   CASE expression
b210: 20 69 73 20 74 68 65 0a 23 20 65 76 61 6c 75 61   is the.# evalua
b220: 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 48 45 4e  tion of the THEN
b230: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
b240: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
b250: 74 68 65 20 66 69 72 73 74 20 57 48 45 4e 0a 23  the first WHEN.#
b260: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   expression for 
b270: 77 68 69 63 68 20 74 68 65 20 63 6f 6d 70 61 72  which the compar
b280: 69 73 6f 6e 20 69 73 20 74 72 75 65 2e 0a 23 0a  ison is true..#.
b290: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
b2a0: 65 5f 65 78 70 72 2d 32 32 2e 32 2e 31 20 7b 0a  e_expr-22.2.1 {.
b2b0: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 32 33    SELECT CASE 23
b2c0: 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27   WHEN 1 THEN 'A'
b2d0: 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42   WHEN 23 THEN 'B
b2e0: 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27  ' WHEN 23 THEN '
b2f0: 43 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f  C' END.} {B}.do_
b300: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
b310: 78 70 72 2d 32 32 2e 32 2e 32 20 7b 0a 20 20 53  xpr-22.2.2 {.  S
b320: 45 4c 45 43 54 20 43 41 53 45 20 31 20 57 48 45  ELECT CASE 1 WHE
b330: 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57 48 45  N 1 THEN 'A' WHE
b340: 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20 57 48  N 23 THEN 'B' WH
b350: 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27 20 45  EN 23 THEN 'C' E
b360: 4e 44 0a 7d 20 7b 41 7d 0a 0a 23 20 45 56 49 44  ND.} {A}..# EVID
b370: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 35 34 33  ENCE-OF: R-47543
b380: 2d 33 32 31 34 35 20 4f 72 2c 20 69 66 20 6e 6f  -32145 Or, if no
b390: 6e 65 20 6f 66 20 74 68 65 20 57 48 45 4e 20 65  ne of the WHEN e
b3a0: 78 70 72 65 73 73 69 6f 6e 73 0a 23 20 65 76 61  xpressions.# eva
b3b0: 6c 75 61 74 65 20 74 6f 20 61 20 76 61 6c 75 65  luate to a value
b3c0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 62 61   equal to the ba
b3d0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  se expression, t
b3e0: 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 23 20 65  he result of.# e
b3f0: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 45 4c  valuating the EL
b400: 53 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69  SE expression, i
b410: 66 20 61 6e 79 2e 0a 23 0a 64 6f 5f 65 78 65 63  f any..#.do_exec
b420: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
b430: 32 32 2e 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43  22.3.1 {.  SELEC
b440: 54 20 43 41 53 45 20 32 34 20 57 48 45 4e 20 31  T CASE 24 WHEN 1
b450: 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32   THEN 'A' WHEN 2
b460: 33 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20  3 THEN 'B' WHEN 
b470: 32 33 20 54 48 45 4e 20 27 43 27 20 45 4c 53 45  23 THEN 'C' ELSE
b480: 20 27 44 27 20 45 4e 44 0a 7d 20 7b 44 7d 0a 0a   'D' END.} {D}..
b490: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
b4a0: 2d 35 34 37 32 31 2d 34 38 35 35 37 20 49 66 20  -54721-48557 If 
b4b0: 74 68 65 72 65 20 69 73 20 6e 6f 20 45 4c 53 45  there is no ELSE
b4c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
b4d0: 6e 6f 6e 65 20 6f 66 0a 23 20 74 68 65 20 57 48  none of.# the WH
b4e0: 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 70  EN expressions p
b4f0: 72 6f 64 75 63 65 20 61 20 72 65 73 75 6c 74 20  roduce a result 
b500: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 62 61 73  equal to the bas
b510: 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 0a 23 20  e expression,.# 
b520: 74 68 65 20 6f 76 65 72 61 6c 6c 20 72 65 73 75  the overall resu
b530: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 23 0a 64 6f  lt is NULL..#.do
b540: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
b550: 65 78 70 72 2d 32 32 2e 34 2e 31 20 7b 0a 20 20  expr-22.4.1 {.  
b560: 53 45 4c 45 43 54 20 43 41 53 45 20 32 34 20 57  SELECT CASE 24 W
b570: 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57  HEN 1 THEN 'A' W
b580: 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20  HEN 23 THEN 'B' 
b590: 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27  WHEN 23 THEN 'C'
b5a0: 20 45 4e 44 0a 7d 20 7b 7b 7d 7d 0a 64 62 20 6e   END.} {{}}.db n
b5b0: 75 6c 6c 76 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f  ullvalue null.do
b5c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
b5d0: 65 78 70 72 2d 32 32 2e 34 2e 32 20 7b 0a 20 20  expr-22.4.2 {.  
b5e0: 53 45 4c 45 43 54 20 43 41 53 45 20 32 34 20 57  SELECT CASE 24 W
b5f0: 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57  HEN 1 THEN 'A' W
b600: 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20  HEN 23 THEN 'B' 
b610: 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27  WHEN 23 THEN 'C'
b620: 20 45 4e 44 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 62   END.} {null}.db
b630: 20 6e 75 6c 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23   nullvalue {}..#
b640: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
b650: 31 31 34 37 39 2d 36 32 37 37 34 20 57 68 65 6e  11479-62774 When
b660: 20 63 6f 6d 70 61 72 69 6e 67 20 61 20 62 61 73   comparing a bas
b670: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61  e expression aga
b680: 69 6e 73 74 20 61 0a 23 20 57 48 45 4e 20 65 78  inst a.# WHEN ex
b690: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 73 61  pression, the sa
b6a0: 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
b6b0: 75 65 6e 63 65 2c 20 61 66 66 69 6e 69 74 79 2c  uence, affinity,
b6c0: 20 61 6e 64 0a 23 20 4e 55 4c 4c 2d 68 61 6e 64   and.# NULL-hand
b6d0: 6c 69 6e 67 20 72 75 6c 65 73 20 61 70 70 6c 79  ling rules apply
b6e0: 20 61 73 20 69 66 20 74 68 65 20 62 61 73 65 20   as if the base 
b6f0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 57  expression and W
b700: 48 45 4e 0a 23 20 65 78 70 72 65 73 73 69 6f 6e  HEN.# expression
b710: 20 61 72 65 20 72 65 73 70 65 63 74 69 76 65 6c   are respectivel
b720: 79 20 74 68 65 20 6c 65 66 74 2d 20 61 6e 64 20  y the left- and 
b730: 72 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61  right-hand opera
b740: 6e 64 73 20 6f 66 20 61 6e 20 3d 0a 23 20 6f 70  nds of an =.# op
b750: 65 72 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 72  erator..#.proc r
b760: 65 76 20 7b 73 74 72 7d 20 7b 0a 20 20 73 65 74  ev {str} {.  set
b770: 20 72 65 74 20 22 22 0a 20 20 73 65 74 20 63 68   ret "".  set ch
b780: 61 72 73 20 5b 73 70 6c 69 74 20 24 73 74 72 5d  ars [split $str]
b790: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 5b 65  .  for {set i [e
b7a0: 78 70 72 20 5b 6c 6c 65 6e 67 74 68 20 24 63 68  xpr [llength $ch
b7b0: 61 72 73 5d 2d 31 5d 7d 20 7b 24 69 3e 3d 30 7d  ars]-1]} {$i>=0}
b7c0: 20 7b 69 6e 63 72 20 69 20 2d 31 7d 20 7b 0a 20   {incr i -1} {. 
b7d0: 20 20 20 61 70 70 65 6e 64 20 72 65 74 20 5b 6c     append ret [l
b7e0: 69 6e 64 65 78 20 24 63 68 61 72 73 20 24 69 5d  index $chars $i]
b7f0: 0a 20 20 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d  .  }.  set ret.}
b800: 0a 70 72 6f 63 20 72 65 76 65 72 73 65 20 7b 6c  .proc reverse {l
b810: 68 73 20 72 68 73 7d 20 7b 0a 20 20 73 74 72 69  hs rhs} {.  stri
b820: 6e 67 20 63 6f 6d 70 61 72 65 20 5b 72 65 76 20  ng compare [rev 
b830: 24 6c 68 73 5d 20 5b 72 65 76 20 24 72 68 73 5d  $lhs] [rev $rhs]
b840: 0a 7d 0a 64 62 20 63 6f 6c 6c 61 74 65 20 72 65  .}.db collate re
b850: 76 65 72 73 65 20 72 65 76 65 72 73 65 0a 64 6f  verse reverse.do
b860: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
b870: 65 78 70 72 2d 32 33 2e 31 2e 31 20 7b 0a 20 20  expr-23.1.1 {.  
b880: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
b890: 0a 20 20 20 20 61 20 54 45 58 54 20 20 20 20 20  .    a TEXT     
b8a0: 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c 0a  COLLATE NOCASE,.
b8b0: 20 20 20 20 62 20 20 20 20 20 20 20 20 20 20 43      b          C
b8c0: 4f 4c 4c 41 54 45 20 52 45 56 45 52 53 45 2c 0a  OLLATE REVERSE,.
b8d0: 20 20 20 20 63 20 49 4e 54 45 47 45 52 2c 0a 20      c INTEGER,. 
b8e0: 20 20 20 64 20 42 4c 4f 42 0a 20 20 29 3b 0a 20     d BLOB.  );. 
b8f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
b900: 56 41 4c 55 45 53 28 27 61 62 63 27 2c 20 27 63  VALUES('abc', 'c
b910: 62 61 27 2c 20 35 35 2c 20 33 34 2e 35 29 3b 0a  ba', 55, 34.5);.
b920: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
b930: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31  test e_expr-23.1
b940: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .2 {.  SELECT CA
b950: 53 45 20 61 20 57 48 45 4e 20 27 78 79 7a 27 20  SE a WHEN 'xyz' 
b960: 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 27 41  THEN 'A' WHEN 'A
b970: 62 43 27 20 54 48 45 4e 20 27 42 27 20 45 4e 44  bC' THEN 'B' END
b980: 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64   FROM t1.} {B}.d
b990: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
b9a0: 5f 65 78 70 72 2d 32 33 2e 31 2e 33 20 7b 0a 20  _expr-23.1.3 {. 
b9b0: 20 53 45 4c 45 43 54 20 43 41 53 45 20 27 41 62   SELECT CASE 'Ab
b9c0: 43 27 20 57 48 45 4e 20 27 61 62 63 27 20 54 48  C' WHEN 'abc' TH
b9d0: 45 4e 20 27 41 27 20 57 48 45 4e 20 61 20 54 48  EN 'A' WHEN a TH
b9e0: 45 4e 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20  EN 'B' END FROM 
b9f0: 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63  t1.} {B}.do_exec
ba00: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
ba10: 32 33 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43  23.1.4 {.  SELEC
ba20: 54 20 43 41 53 45 20 61 20 57 48 45 4e 20 62 20  T CASE a WHEN b 
ba30: 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42  THEN 'A' ELSE 'B
ba40: 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20  ' END FROM t1.} 
ba50: 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {B}.do_execsql_t
ba60: 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e  est e_expr-23.1.
ba70: 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  5 {.  SELECT CAS
ba80: 45 20 62 20 57 48 45 4e 20 61 20 54 48 45 4e 20  E b WHEN a THEN 
ba90: 27 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44  'A' ELSE 'B' END
baa0: 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64   FROM t1.} {B}.d
bab0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
bac0: 5f 65 78 70 72 2d 32 33 2e 31 2e 36 20 7b 0a 20  _expr-23.1.6 {. 
bad0: 20 53 45 4c 45 43 54 20 43 41 53 45 20 35 35 20   SELECT CASE 55 
bae0: 57 48 45 4e 20 27 35 35 27 20 54 48 45 4e 20 27  WHEN '55' THEN '
baf0: 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 0a  A' ELSE 'B' END.
bb00: 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {B}.do_execsql
bb10: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e  _test e_expr-23.
bb20: 31 2e 37 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.7 {.  SELECT C
bb30: 41 53 45 20 63 20 57 48 45 4e 20 27 35 35 27 20  ASE c WHEN '55' 
bb40: 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42  THEN 'A' ELSE 'B
bb50: 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20  ' END FROM t1.} 
bb60: 7b 41 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {A}.do_execsql_t
bb70: 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e  est e_expr-23.1.
bb80: 38 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  8 {.  SELECT CAS
bb90: 45 20 27 33 34 2e 35 27 20 57 48 45 4e 20 64 20  E '34.5' WHEN d 
bba0: 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42  THEN 'A' ELSE 'B
bbb0: 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20  ' END FROM t1.} 
bbc0: 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {B}.do_execsql_t
bbd0: 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e  est e_expr-23.1.
bbe0: 39 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  9 {.  SELECT CAS
bbf0: 45 20 4e 55 4c 4c 20 57 48 45 4e 20 4e 55 4c 4c  E NULL WHEN NULL
bc00: 20 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27   THEN 'A' ELSE '
bc10: 42 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 0a 23 20  B' END.} {B}..# 
bc20: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
bc30: 37 33 30 34 2d 33 39 34 30 35 20 49 66 20 74 68  7304-39405 If th
bc40: 65 20 62 61 73 65 20 65 78 70 72 65 73 73 69 6f  e base expressio
bc50: 6e 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74  n is NULL then t
bc60: 68 65 0a 23 20 72 65 73 75 6c 74 20 6f 66 20 74  he.# result of t
bc70: 68 65 20 43 41 53 45 20 69 73 20 61 6c 77 61 79  he CASE is alway
bc80: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
bc90: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 45  evaluating the E
bca0: 4c 53 45 0a 23 20 65 78 70 72 65 73 73 69 6f 6e  LSE.# expression
bcb0: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 6f   if it exists, o
bcc0: 72 20 4e 55 4c 4c 20 69 66 20 69 74 20 64 6f 65  r NULL if it doe
bcd0: 73 20 6e 6f 74 2e 0a 23 0a 64 6f 5f 65 78 65 63  s not..#.do_exec
bce0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
bcf0: 32 34 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43  24.1.1 {.  SELEC
bd00: 54 20 43 41 53 45 20 4e 55 4c 4c 20 57 48 45 4e  T CASE NULL WHEN
bd10: 20 27 61 62 63 27 20 54 48 45 4e 20 27 41 27 20   'abc' THEN 'A' 
bd20: 57 48 45 4e 20 27 64 65 66 27 20 54 48 45 4e 20  WHEN 'def' THEN 
bd30: 27 42 27 20 45 4e 44 3b 0a 7d 20 7b 7b 7d 7d 0a  'B' END;.} {{}}.
bd40: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
bd50: 65 5f 65 78 70 72 2d 32 34 2e 31 2e 32 20 7b 0a  e_expr-24.1.2 {.
bd60: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 4e 55    SELECT CASE NU
bd70: 4c 4c 20 57 48 45 4e 20 27 61 62 63 27 20 54 48  LL WHEN 'abc' TH
bd80: 45 4e 20 27 41 27 20 57 48 45 4e 20 27 64 65 66  EN 'A' WHEN 'def
bd90: 27 20 54 48 45 4e 20 27 42 27 20 45 4c 53 45 20  ' THEN 'B' ELSE 
bda0: 27 43 27 20 45 4e 44 3b 0a 7d 20 7b 43 7d 0a 0a  'C' END;.} {C}..
bdb0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
bdc0: 2d 35 36 32 38 30 2d 31 37 33 36 39 20 42 6f 74  -56280-17369 Bot
bdd0: 68 20 66 6f 72 6d 73 20 6f 66 20 74 68 65 20 43  h forms of the C
bde0: 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20 75  ASE expression u
bdf0: 73 65 20 6c 61 7a 79 2c 0a 23 20 6f 72 20 73 68  se lazy,.# or sh
be00: 6f 72 74 2d 63 69 72 63 75 69 74 2c 20 65 76 61  ort-circuit, eva
be10: 6c 75 61 74 69 6f 6e 2e 0a 23 0a 73 65 74 20 76  luation..#.set v
be20: 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 66 6f  arlist [list].fo
be30: 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30  reach {a b c} {0
be40: 20 31 20 30 7d 20 62 72 65 61 6b 0a 64 6f 5f 65   1 0} break.do_e
be50: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
be60: 70 72 2d 32 35 2e 31 2e 31 20 7b 0a 20 20 53 45  pr-25.1.1 {.  SE
be70: 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76  LECT CASE WHEN v
be80: 61 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27  ar('a') THEN 'A'
be90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
bea0: 57 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48  WHEN var('b') TH
beb0: 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20  EN 'B' .        
bec0: 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27        WHEN var('
bed0: 63 27 29 20 54 48 45 4e 20 27 43 27 20 0a 20 20  c') THEN 'C' .  
bee0: 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f 74 65 73  END.} {B}.do_tes
bef0: 74 20 65 5f 65 78 70 72 2d 32 35 2e 31 2e 32 20  t e_expr-25.1.2 
bf00: 7b 20 73 65 74 20 3a 3a 76 61 72 6c 69 73 74 20  { set ::varlist 
bf10: 7d 20 7b 61 20 62 7d 0a 73 65 74 20 76 61 72 6c  } {a b}.set varl
bf20: 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  ist [list].do_ex
bf30: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
bf40: 72 2d 32 35 2e 31 2e 33 20 7b 0a 20 20 53 45 4c  r-25.1.3 {.  SEL
bf50: 45 43 54 20 43 41 53 45 20 27 30 27 20 57 48 45  ECT CASE '0' WHE
bf60: 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20  N var('a') THEN 
bf70: 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'A' .           
bf80: 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28         WHEN var(
bf90: 27 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20  'b') THEN 'B' . 
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54   WHEN var('c') T
bfc0: 48 45 4e 20 27 43 27 20 0a 20 20 45 4e 44 0a 7d  HEN 'C' .  END.}
bfd0: 20 7b 41 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65   {A}.do_test e_e
bfe0: 78 70 72 2d 32 35 2e 31 2e 34 20 7b 20 73 65 74  xpr-25.1.4 { set
bff0: 20 3a 3a 76 61 72 6c 69 73 74 20 7d 20 7b 61 7d   ::varlist } {a}
c000: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
c010: 20 52 2d 33 34 37 37 33 2d 36 32 32 35 33 20 54   R-34773-62253 T
c020: 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e  he only differen
c030: 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 66  ce between the f
c040: 6f 6c 6c 6f 77 69 6e 67 0a 23 20 74 77 6f 20 43  ollowing.# two C
c050: 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ASE expressions 
c060: 69 73 20 74 68 61 74 20 74 68 65 20 78 20 65 78  is that the x ex
c070: 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
c080: 75 61 74 65 64 20 65 78 61 63 74 6c 79 0a 23 20  uated exactly.# 
c090: 6f 6e 63 65 20 69 6e 20 74 68 65 20 66 69 72 73  once in the firs
c0a0: 74 20 65 78 61 6d 70 6c 65 20 62 75 74 20 6d 69  t example but mi
c0b0: 67 68 74 20 62 65 20 65 76 61 6c 75 61 74 65 64  ght be evaluated
c0c0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
c0d0: 69 6e 20 74 68 65 0a 23 20 73 65 63 6f 6e 64 3a  in the.# second:
c0e0: 20 43 41 53 45 20 78 20 57 48 45 4e 20 77 31 20   CASE x WHEN w1 
c0f0: 54 48 45 4e 20 72 31 20 57 48 45 4e 20 77 32 20  THEN r1 WHEN w2 
c100: 54 48 45 4e 20 72 32 20 45 4c 53 45 20 72 33 20  THEN r2 ELSE r3 
c110: 45 4e 44 20 43 41 53 45 20 57 48 45 4e 0a 23 20  END CASE WHEN.# 
c120: 78 3d 77 31 20 54 48 45 4e 20 72 31 20 57 48 45  x=w1 THEN r1 WHE
c130: 4e 20 78 3d 77 32 20 54 48 45 4e 20 72 32 20 45  N x=w2 THEN r2 E
c140: 4c 53 45 20 72 33 20 45 4e 44 0a 23 0a 70 72 6f  LSE r3 END.#.pro
c150: 63 20 63 65 76 61 6c 20 7b 78 7d 20 7b 0a 20 20  c ceval {x} {.  
c160: 69 6e 63 72 20 3a 3a 65 76 61 6c 63 6f 75 6e 74  incr ::evalcount
c170: 0a 20 20 72 65 74 75 72 6e 20 24 78 0a 7d 0a 64  .  return $x.}.d
c180: 62 20 66 75 6e 63 20 63 65 76 61 6c 20 63 65 76  b func ceval cev
c190: 61 6c 0a 73 65 74 20 3a 3a 65 76 61 6c 63 6f 75  al.set ::evalcou
c1a0: 6e 74 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  nt 0..do_execsql
c1b0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e  _test e_expr-26.
c1c0: 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1.1 {.  CREATE T
c1d0: 41 42 4c 45 20 74 32 28 78 2c 20 77 31 2c 20 72  ABLE t2(x, w1, r
c1e0: 31 2c 20 77 32 2c 20 72 32 2c 20 72 33 29 3b 0a  1, w2, r2, r3);.
c1f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
c200: 20 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 27 52   VALUES(1, 1, 'R
c210: 31 27 2c 20 32 2c 20 27 52 32 27 2c 20 27 52 33  1', 2, 'R2', 'R3
c220: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
c230: 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20 31  O t2 VALUES(2, 1
c240: 2c 20 27 52 31 27 2c 20 32 2c 20 27 52 32 27 2c  , 'R1', 2, 'R2',
c250: 20 27 52 33 27 29 3b 0a 20 20 49 4e 53 45 52 54   'R3');.  INSERT
c260: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
c270: 33 2c 20 31 2c 20 27 52 31 27 2c 20 32 2c 20 27  3, 1, 'R1', 2, '
c280: 52 32 27 2c 20 27 52 33 27 29 3b 0a 7d 20 7b 7d  R2', 'R3');.} {}
c290: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
c2a0: 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 32 20 7b   e_expr-26.1.2 {
c2b0: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 78  .  SELECT CASE x
c2c0: 20 57 48 45 4e 20 77 31 20 54 48 45 4e 20 72 31   WHEN w1 THEN r1
c2d0: 20 57 48 45 4e 20 77 32 20 54 48 45 4e 20 72 32   WHEN w2 THEN r2
c2e0: 20 45 4c 53 45 20 72 33 20 45 4e 44 20 46 52 4f   ELSE r3 END FRO
c2f0: 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32 20 52 33  M t2.} {R1 R2 R3
c300: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
c310: 74 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 33 20  t e_expr-26.1.3 
c320: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
c330: 57 48 45 4e 20 78 3d 77 31 20 54 48 45 4e 20 72  WHEN x=w1 THEN r
c340: 31 20 57 48 45 4e 20 78 3d 77 32 20 54 48 45 4e  1 WHEN x=w2 THEN
c350: 20 72 32 20 45 4c 53 45 20 72 33 20 45 4e 44 20   r2 ELSE r3 END 
c360: 46 52 4f 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32  FROM t2.} {R1 R2
c370: 20 52 33 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   R3}..do_execsql
c380: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e  _test e_expr-26.
c390: 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.4 {.  SELECT C
c3a0: 41 53 45 20 63 65 76 61 6c 28 78 29 20 57 48 45  ASE ceval(x) WHE
c3b0: 4e 20 77 31 20 54 48 45 4e 20 72 31 20 57 48 45  N w1 THEN r1 WHE
c3c0: 4e 20 77 32 20 54 48 45 4e 20 72 32 20 45 4c 53  N w2 THEN r2 ELS
c3d0: 45 20 72 33 20 45 4e 44 20 46 52 4f 4d 20 74 32  E r3 END FROM t2
c3e0: 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d 0a 64 6f  .} {R1 R2 R3}.do
c3f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e  _test e_expr-26.
c400: 31 2e 35 20 7b 20 73 65 74 20 3a 3a 65 76 61 6c  1.5 { set ::eval
c410: 63 6f 75 6e 74 20 7d 20 7b 33 7d 0a 73 65 74 20  count } {3}.set 
c420: 3a 3a 65 76 61 6c 63 6f 75 6e 74 20 30 0a 64 6f  ::evalcount 0.do
c430: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
c440: 65 78 70 72 2d 32 36 2e 31 2e 36 20 7b 0a 20 20  expr-26.1.6 {.  
c450: 53 45 4c 45 43 54 20 43 41 53 45 20 0a 20 20 20  SELECT CASE .   
c460: 20 57 48 45 4e 20 63 65 76 61 6c 28 78 29 3d 77   WHEN ceval(x)=w
c470: 31 20 54 48 45 4e 20 72 31 20 0a 20 20 20 20 57  1 THEN r1 .    W
c480: 48 45 4e 20 63 65 76 61 6c 28 78 29 3d 77 32 20  HEN ceval(x)=w2 
c490: 54 48 45 4e 20 72 32 20 0a 20 20 20 20 45 4c 53  THEN r2 .    ELS
c4a0: 45 20 72 33 20 45 4e 44 20 0a 20 20 46 52 4f 4d  E r3 END .  FROM
c4b0: 20 74 32 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d   t2.} {R1 R2 R3}
c4c0: 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  .do_test e_expr-
c4d0: 32 36 2e 31 2e 36 20 7b 20 73 65 74 20 3a 3a 65  26.1.6 { set ::e
c4e0: 76 61 6c 63 6f 75 6e 74 20 7d 20 7b 35 7d 0a 0a  valcount } {5}..
c4f0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
c500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
c540: 73 74 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65  st statements re
c550: 6c 61 74 65 64 20 74 6f 20 43 41 53 54 20 65 78  lated to CAST ex
c560: 70 72 65 73 73 69 6f 6e 73 2e 0a 23 0a 23 20 45  pressions..#.# E
c570: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35  VIDENCE-OF: R-65
c580: 30 37 39 2d 33 31 37 35 38 20 41 70 70 6c 69 63  079-31758 Applic
c590: 61 74 69 6f 6e 20 6f 66 20 61 20 43 41 53 54 20  ation of a CAST 
c5a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 23 20  expression is.# 
c5b0: 64 69 66 66 65 72 65 6e 74 20 74 6f 20 61 70 70  different to app
c5c0: 6c 69 63 61 74 69 6f 6e 20 6f 66 20 61 20 63 6f  lication of a co
c5d0: 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 2c 20 61  lumn affinity, a
c5e0: 73 20 77 69 74 68 20 61 20 43 41 53 54 0a 23 20  s with a CAST.# 
c5f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 65 20 73  expression the s
c600: 74 6f 72 61 67 65 20 63 6c 61 73 73 20 63 6f 6e  torage class con
c610: 76 65 72 73 69 6f 6e 20 69 73 20 66 6f 72 63 65  version is force
c620: 64 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20  d even if it is 
c630: 6c 6f 73 73 79 0a 23 20 61 6e 64 20 69 72 72 72  lossy.# and irrr
c640: 65 76 65 72 73 69 62 6c 65 2e 0a 23 0a 64 6f 5f  eversible..#.do_
c650: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
c660: 78 70 72 2d 32 37 2e 31 2e 31 20 7b 0a 20 20 43  xpr-27.1.1 {.  C
c670: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
c680: 20 54 45 58 54 2c 20 62 20 52 45 41 4c 2c 20 63   TEXT, b REAL, c
c690: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 49 4e 53   INTEGER);.  INS
c6a0: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
c6b0: 45 53 28 58 27 35 35 35 36 35 35 27 2c 20 27 31  ES(X'555655', '1
c6c0: 2e 32 33 61 62 63 27 2c 20 34 2e 35 29 3b 0a 20  .23abc', 4.5);. 
c6d0: 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 61   SELECT typeof(a
c6e0: 29 2c 20 61 2c 20 74 79 70 65 6f 66 28 62 29 2c  ), a, typeof(b),
c6f0: 20 62 2c 20 74 79 70 65 6f 66 28 63 29 2c 20 63   b, typeof(c), c
c700: 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 62 6c 6f   FROM t3;.} {blo
c710: 62 20 55 56 55 20 74 65 78 74 20 31 2e 32 33 61  b UVU text 1.23a
c720: 62 63 20 72 65 61 6c 20 34 2e 35 7d 0a 64 6f 5f  bc real 4.5}.do_
c730: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
c740: 78 70 72 2d 32 37 2e 31 2e 32 20 7b 0a 20 20 53  xpr-27.1.2 {.  S
c750: 45 4c 45 43 54 20 0a 20 20 20 20 74 79 70 65 6f  ELECT .    typeo
c760: 66 28 43 41 53 54 28 58 27 35 35 35 36 35 35 27  f(CAST(X'555655'
c770: 20 61 73 20 54 45 58 54 29 29 2c 20 43 41 53 54   as TEXT)), CAST
c780: 28 58 27 35 35 35 36 35 35 27 20 61 73 20 54 45  (X'555655' as TE
c790: 58 54 29 2c 0a 20 20 20 20 74 79 70 65 6f 66 28  XT),.    typeof(
c7a0: 43 41 53 54 28 27 31 2e 32 33 61 62 63 27 20 61  CAST('1.23abc' a
c7b0: 73 20 52 45 41 4c 29 29 2c 20 43 41 53 54 28 27  s REAL)), CAST('
c7c0: 31 2e 32 33 61 62 63 27 20 61 73 20 52 45 41 4c  1.23abc' as REAL
c7d0: 29 2c 0a 20 20 20 20 74 79 70 65 6f 66 28 43 41  ),.    typeof(CA
c7e0: 53 54 28 34 2e 35 20 61 73 20 49 4e 54 45 47 45  ST(4.5 as INTEGE
c7f0: 52 29 29 2c 20 43 41 53 54 28 34 2e 35 20 61 73  R)), CAST(4.5 as
c800: 20 49 4e 54 45 47 45 52 29 0a 7d 20 7b 74 65 78   INTEGER).} {tex
c810: 74 20 55 56 55 20 72 65 61 6c 20 31 2e 32 33 20  t UVU real 1.23 
c820: 69 6e 74 65 67 65 72 20 34 7d 0a 0a 23 20 45 56  integer 4}..# EV
c830: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32  IDENCE-OF: R-272
c840: 32 35 2d 36 35 30 35 30 20 49 66 20 74 68 65 20  25-65050 If the 
c850: 76 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20  value of <expr> 
c860: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 0a 23 20  is NULL, then.# 
c870: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
c880: 65 20 43 41 53 54 20 65 78 70 72 65 73 73 69 6f  e CAST expressio
c890: 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a  n is also NULL..
c8a0: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
c8b0: 5f 65 78 70 72 2d 32 37 2e 32 2e 31 20 7b 20 43  _expr-27.2.1 { C
c8c0: 41 53 54 28 4e 55 4c 4c 20 41 53 20 69 6e 74 65  AST(NULL AS inte
c8d0: 67 65 72 29 20 7d 20 6e 75 6c 6c 20 7b 7d 0a 64  ger) } null {}.d
c8e0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
c8f0: 70 72 2d 32 37 2e 32 2e 32 20 7b 20 43 41 53 54  pr-27.2.2 { CAST
c900: 28 4e 55 4c 4c 20 41 53 20 74 65 78 74 29 20 7d  (NULL AS text) }
c910: 20 20 20 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65      null {}.do_e
c920: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
c930: 32 37 2e 32 2e 33 20 7b 20 43 41 53 54 28 4e 55  27.2.3 { CAST(NU
c940: 4c 4c 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 20  LL AS blob) }   
c950: 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72   null {}.do_expr
c960: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
c970: 32 2e 34 20 7b 20 43 41 53 54 28 4e 55 4c 4c 20  2.4 { CAST(NULL 
c980: 41 53 20 6e 75 6d 62 65 72 29 20 7d 20 20 6e 75  AS number) }  nu
c990: 6c 6c 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43  ll {}..# EVIDENC
c9a0: 45 2d 4f 46 3a 20 52 2d 33 31 30 37 36 2d 32 33  E-OF: R-31076-23
c9b0: 35 37 35 20 43 61 73 74 69 6e 67 20 61 20 76 61  575 Casting a va
c9c0: 6c 75 65 20 74 6f 20 61 20 3c 74 79 70 65 2d 6e  lue to a <type-n
c9d0: 61 6d 65 3e 20 77 69 74 68 0a 23 20 6e 6f 20 61  ame> with.# no a
c9e0: 66 66 69 6e 69 74 79 20 63 61 75 73 65 73 20 74  ffinity causes t
c9f0: 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 63  he value to be c
ca00: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
ca10: 42 4c 4f 42 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  BLOB..#.do_expr_
ca20: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 33  test e_expr-27.3
ca30: 2e 31 20 7b 20 43 41 53 54 28 27 61 62 63 27 20  .1 { CAST('abc' 
ca40: 41 53 20 62 6c 6f 62 29 20 20 20 20 20 20 20 7d  AS blob)       }
ca50: 20 62 6c 6f 62 20 61 62 63 0a 64 6f 5f 65 78 70   blob abc.do_exp
ca60: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
ca70: 2e 33 2e 32 20 7b 20 43 41 53 54 28 27 64 65 66  .3.2 { CAST('def
ca80: 27 20 41 53 20 73 68 6f 62 62 6c 6f 62 5f 78 29  ' AS shobblob_x)
ca90: 20 7d 20 62 6c 6f 62 20 64 65 66 0a 64 6f 5f 65   } blob def.do_e
caa0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
cab0: 32 37 2e 33 2e 33 20 7b 20 43 41 53 54 28 27 67  27.3.3 { CAST('g
cac0: 68 69 27 20 41 53 20 61 62 62 4c 4f 62 31 30 29  hi' AS abbLOb10)
cad0: 20 20 20 7d 20 62 6c 6f 62 20 67 68 69 0a 0a 23     } blob ghi..#
cae0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
caf0: 32 32 39 35 36 2d 33 37 37 35 34 20 43 61 73 74  22956-37754 Cast
cb00: 69 6e 67 20 74 6f 20 61 20 42 4c 4f 42 20 63 6f  ing to a BLOB co
cb10: 6e 73 69 73 74 73 20 6f 66 20 66 69 72 73 74 20  nsists of first 
cb20: 63 61 73 74 69 6e 67 0a 23 20 74 68 65 20 76 61  casting.# the va
cb30: 6c 75 65 20 74 6f 20 54 45 58 54 20 69 6e 20 74  lue to TEXT in t
cb40: 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  he encoding of t
cb50: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
cb60: 65 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 23 20 69  ection, then.# i
cb70: 6e 74 65 72 70 72 65 74 69 6e 67 20 74 68 65 20  nterpreting the 
cb80: 72 65 73 75 6c 74 69 6e 67 20 62 79 74 65 20 73  resulting byte s
cb90: 65 71 75 65 6e 63 65 20 61 73 20 61 20 42 4c 4f  equence as a BLO
cba0: 42 20 69 6e 73 74 65 61 64 20 6f 66 20 61 73 20  B instead of as 
cbb0: 54 45 58 54 2e 0a 23 0a 64 6f 5f 71 65 78 70 72  TEXT..#.do_qexpr
cbc0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
cbd0: 34 2e 31 20 7b 20 43 41 53 54 28 27 67 68 69 27  4.1 { CAST('ghi'
cbe0: 20 41 53 20 62 6c 6f 62 29 20 7d 20 58 27 36 37   AS blob) } X'67
cbf0: 36 38 36 39 27 0a 64 6f 5f 71 65 78 70 72 5f 74  6869'.do_qexpr_t
cc00: 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e  est e_expr-27.4.
cc10: 32 20 7b 20 43 41 53 54 28 34 35 36 20 41 53 20  2 { CAST(456 AS 
cc20: 62 6c 6f 62 29 20 7d 20 20 20 58 27 33 34 33 35  blob) }   X'3435
cc30: 33 36 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73  36'.do_qexpr_tes
cc40: 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 33 20  t e_expr-27.4.3 
cc50: 7b 20 43 41 53 54 28 31 2e 37 38 20 41 53 20 62  { CAST(1.78 AS b
cc60: 6c 6f 62 29 20 7d 20 20 58 27 33 31 32 45 33 37  lob) }  X'312E37
cc70: 33 38 27 0a 72 65 6e 61 6d 65 20 64 62 20 64 62  38'.rename db db
cc80: 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65  2.sqlite3 db :me
cc90: 6d 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c 65 20  mory:.ifcapable 
cca0: 7b 75 74 66 31 36 7d 20 7b 0a 64 62 20 65 76 61  {utf16} {.db eva
ccb0: 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  l { PRAGMA encod
ccc0: 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65 27  ing = 'utf-16le'
ccd0: 20 7d 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74   }.do_qexpr_test
cce0: 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 34 20 7b   e_expr-27.4.4 {
ccf0: 20 43 41 53 54 28 27 67 68 69 27 20 41 53 20 62   CAST('ghi' AS b
cd00: 6c 6f 62 29 20 7d 20 58 27 36 37 30 30 36 38 30  lob) } X'6700680
cd10: 30 36 39 30 30 27 0a 64 6f 5f 71 65 78 70 72 5f  06900'.do_qexpr_
cd20: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34  test e_expr-27.4
cd30: 2e 35 20 7b 20 43 41 53 54 28 34 35 36 20 41 53  .5 { CAST(456 AS
cd40: 20 62 6c 6f 62 29 20 7d 20 20 20 58 27 33 34 30   blob) }   X'340
cd50: 30 33 35 30 30 33 36 30 30 27 0a 64 6f 5f 71 65  035003600'.do_qe
cd60: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
cd70: 32 37 2e 34 2e 36 20 7b 20 43 41 53 54 28 31 2e  27.4.6 { CAST(1.
cd80: 37 38 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 58  78 AS blob) }  X
cd90: 27 33 31 30 30 32 45 30 30 33 37 30 30 33 38 30  '31002E003700380
cda0: 30 27 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 73 71  0'.}.db close.sq
cdb0: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
cdc0: 3a 0a 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47  :.db eval { PRAG
cdd0: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75  MA encoding = 'u
cde0: 74 66 2d 31 36 62 65 27 20 7d 0a 69 66 63 61 70  tf-16be' }.ifcap
cdf0: 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a 64  able {utf16} {.d
ce00: 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65  o_qexpr_test e_e
ce10: 78 70 72 2d 32 37 2e 34 2e 37 20 7b 20 43 41 53  xpr-27.4.7 { CAS
ce20: 54 28 27 67 68 69 27 20 41 53 20 62 6c 6f 62 29  T('ghi' AS blob)
ce30: 20 7d 20 58 27 30 30 36 37 30 30 36 38 30 30 36   } X'00670068006
ce40: 39 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74  9'.do_qexpr_test
ce50: 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 38 20 7b   e_expr-27.4.8 {
ce60: 20 43 41 53 54 28 34 35 36 20 41 53 20 62 6c 6f   CAST(456 AS blo
ce70: 62 29 20 7d 20 20 20 58 27 30 30 33 34 30 30 33  b) }   X'0034003
ce80: 35 30 30 33 36 27 0a 64 6f 5f 71 65 78 70 72 5f  50036'.do_qexpr_
ce90: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34  test e_expr-27.4
cea0: 2e 39 20 7b 20 43 41 53 54 28 31 2e 37 38 20 41  .9 { CAST(1.78 A
ceb0: 53 20 62 6c 6f 62 29 20 7d 20 20 58 27 30 30 33  S blob) }  X'003
cec0: 31 30 30 32 45 30 30 33 37 30 30 33 38 27 0a 7d  1002E00370038'.}
ced0: 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61 6d 65  .db close.rename
cee0: 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49 44 45   db2 db..# EVIDE
cef0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 32 30 37 2d  NCE-OF: R-04207-
cf00: 33 37 39 38 31 20 54 6f 20 63 61 73 74 20 61 20  37981 To cast a 
cf10: 42 4c 4f 42 20 76 61 6c 75 65 20 74 6f 20 54 45  BLOB value to TE
cf20: 58 54 2c 20 74 68 65 20 73 65 71 75 65 6e 63 65  XT, the sequence
cf30: 0a 23 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  .# of bytes that
cf40: 20 6d 61 6b 65 20 75 70 20 74 68 65 20 42 4c 4f   make up the BLO
cf50: 42 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  B is interpreted
cf60: 20 61 73 20 74 65 78 74 20 65 6e 63 6f 64 65 64   as text encoded
cf70: 20 75 73 69 6e 67 0a 23 20 74 68 65 20 64 61 74   using.# the dat
cf80: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 2e 0a  abase encoding..
cf90: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
cfa0: 5f 65 78 70 72 2d 32 38 2e 31 2e 31 20 7b 20 43  _expr-28.1.1 { C
cfb0: 41 53 54 20 28 58 27 36 37 36 38 36 39 27 20 41  AST (X'676869' A
cfc0: 53 20 74 65 78 74 29 20 7d 20 74 65 78 74 20 67  S text) } text g
cfd0: 68 69 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  hi.do_expr_test 
cfe0: 65 5f 65 78 70 72 2d 32 38 2e 31 2e 32 20 7b 20  e_expr-28.1.2 { 
cff0: 43 41 53 54 20 28 58 27 36 37 30 30 36 38 30 30  CAST (X'67006800
d000: 36 39 30 30 27 20 41 53 20 74 65 78 74 29 20 7d  6900' AS text) }
d010: 20 74 65 78 74 20 67 0a 72 65 6e 61 6d 65 20 64   text g.rename d
d020: 62 20 64 62 32 0a 73 71 6c 69 74 65 33 20 64 62  b db2.sqlite3 db
d030: 20 3a 6d 65 6d 6f 72 79 3a 0a 64 62 20 65 76 61   :memory:.db eva
d040: 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  l { PRAGMA encod
d050: 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65 27  ing = 'utf-16le'
d060: 20 7d 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74   }.ifcapable {ut
d070: 66 31 36 7d 20 7b 0a 64 6f 5f 65 78 70 72 5f 74  f16} {.do_expr_t
d080: 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 31 2e  est e_expr-28.1.
d090: 33 20 7b 20 43 41 53 54 20 28 58 27 36 37 36 38  3 { CAST (X'6768
d0a0: 36 39 27 20 41 53 20 74 65 78 74 29 20 3d 3d 20  69' AS text) == 
d0b0: 27 67 68 69 27 20 7d 20 69 6e 74 65 67 65 72 20  'ghi' } integer 
d0c0: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
d0d0: 5f 65 78 70 72 2d 32 38 2e 31 2e 34 20 7b 20 43  _expr-28.1.4 { C
d0e0: 41 53 54 20 28 58 27 36 37 30 30 36 38 30 30 36  AST (X'670068006
d0f0: 39 30 30 27 20 41 53 20 74 65 78 74 29 20 7d 20  900' AS text) } 
d100: 74 65 78 74 20 67 68 69 0a 7d 0a 64 62 20 63 6c  text ghi.}.db cl
d110: 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62 32 20 64  ose.rename db2 d
d120: 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  b..# EVIDENCE-OF
d130: 3a 20 52 2d 32 32 32 33 35 2d 34 37 30 30 36 20  : R-22235-47006 
d140: 43 61 73 74 69 6e 67 20 61 6e 20 49 4e 54 45 47  Casting an INTEG
d150: 45 52 20 6f 72 20 52 45 41 4c 20 76 61 6c 75 65  ER or REAL value
d160: 20 69 6e 74 6f 20 54 45 58 54 0a 23 20 72 65 6e   into TEXT.# ren
d170: 64 65 72 73 20 74 68 65 20 76 61 6c 75 65 20 61  ders the value a
d180: 73 20 69 66 20 76 69 61 20 73 71 6c 69 74 65 33  s if via sqlite3
d190: 5f 73 6e 70 72 69 6e 74 66 28 29 20 65 78 63 65  _snprintf() exce
d1a0: 70 74 20 74 68 61 74 20 74 68 65 0a 23 20 72 65  pt that the.# re
d1b0: 73 75 6c 74 69 6e 67 20 54 45 58 54 20 75 73 65  sulting TEXT use
d1c0: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f  s the encoding o
d1d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
d1e0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f  onnection..#.do_
d1f0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d200: 2d 32 38 2e 32 2e 31 20 7b 20 43 41 53 54 20 28  -28.2.1 { CAST (
d210: 31 20 41 53 20 74 65 78 74 29 20 20 20 7d 20 20  1 AS text)   }  
d220: 20 20 20 74 65 78 74 20 31 0a 64 6f 5f 65 78 70     text 1.do_exp
d230: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38  r_test e_expr-28
d240: 2e 32 2e 32 20 7b 20 43 41 53 54 20 28 34 35 20  .2.2 { CAST (45 
d250: 41 53 20 74 65 78 74 29 20 20 7d 20 20 20 20 20  AS text)  }     
d260: 74 65 78 74 20 34 35 0a 64 6f 5f 65 78 70 72 5f  text 45.do_expr_
d270: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32  test e_expr-28.2
d280: 2e 33 20 7b 20 43 41 53 54 20 28 2d 34 35 20 41  .3 { CAST (-45 A
d290: 53 20 74 65 78 74 29 20 7d 20 20 20 20 20 74 65  S text) }     te
d2a0: 78 74 20 2d 34 35 0a 64 6f 5f 65 78 70 72 5f 74  xt -45.do_expr_t
d2b0: 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e  est e_expr-28.2.
d2c0: 34 20 7b 20 43 41 53 54 20 28 38 2e 38 20 41 53  4 { CAST (8.8 AS
d2d0: 20 74 65 78 74 29 20 20 20 20 7d 20 20 74 65 78   text)    }  tex
d2e0: 74 20 38 2e 38 0a 64 6f 5f 65 78 70 72 5f 74 65  t 8.8.do_expr_te
d2f0: 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 35  st e_expr-28.2.5
d300: 20 7b 20 43 41 53 54 20 28 32 2e 33 65 2b 35 20   { CAST (2.3e+5 
d310: 41 53 20 74 65 78 74 29 20 7d 20 20 74 65 78 74  AS text) }  text
d320: 20 32 33 30 30 30 30 2e 30 0a 64 6f 5f 65 78 70   230000.0.do_exp
d330: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38  r_test e_expr-28
d340: 2e 32 2e 36 20 7b 20 43 41 53 54 20 28 2d 32 2e  .2.6 { CAST (-2.
d350: 33 65 2d 35 20 41 53 20 74 65 78 74 29 20 7d 20  3e-5 AS text) } 
d360: 74 65 78 74 20 2d 32 2e 33 65 2d 30 35 0a 64 6f  text -2.3e-05.do
d370: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d380: 72 2d 32 38 2e 32 2e 37 20 7b 20 43 41 53 54 20  r-28.2.7 { CAST 
d390: 28 30 2e 30 20 41 53 20 74 65 78 74 29 20 7d 20  (0.0 AS text) } 
d3a0: 20 20 20 20 74 65 78 74 20 30 2e 30 0a 64 6f 5f      text 0.0.do_
d3b0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d3c0: 2d 32 38 2e 32 2e 37 20 7b 20 43 41 53 54 20 28  -28.2.7 { CAST (
d3d0: 30 20 41 53 20 74 65 78 74 29 20 7d 20 20 20 20  0 AS text) }    
d3e0: 20 20 20 74 65 78 74 20 30 0a 0a 23 20 45 56 49     text 0..# EVI
d3f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 33 34  DENCE-OF: R-2634
d400: 36 2d 33 36 34 34 33 20 57 68 65 6e 20 63 61 73  6-36443 When cas
d410: 74 69 6e 67 20 61 20 42 4c 4f 42 20 76 61 6c 75  ting a BLOB valu
d420: 65 20 74 6f 20 61 20 52 45 41 4c 2c 20 74 68 65  e to a REAL, the
d430: 0a 23 20 76 61 6c 75 65 20 69 73 20 66 69 72 73  .# value is firs
d440: 74 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 54  t converted to T
d450: 45 58 54 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74  EXT..#.do_expr_t
d460: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e  est e_expr-29.1.
d470: 31 20 7b 20 43 41 53 54 20 28 58 27 33 31 32 45  1 { CAST (X'312E
d480: 33 32 33 33 27 20 41 53 20 52 45 41 4c 29 20 7d  3233' AS REAL) }
d490: 20 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65 78   real 1.23.do_ex
d4a0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d4b0: 39 2e 31 2e 32 20 7b 20 43 41 53 54 20 28 58 27  9.1.2 { CAST (X'
d4c0: 33 32 33 33 33 30 32 45 33 30 27 20 41 53 20 52  3233302E30' AS R
d4d0: 45 41 4c 29 20 7d 20 72 65 61 6c 20 32 33 30 2e  EAL) } real 230.
d4e0: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
d4f0: 5f 65 78 70 72 2d 32 39 2e 31 2e 33 20 7b 20 43  _expr-29.1.3 { C
d500: 41 53 54 20 28 58 27 32 44 33 39 32 45 33 38 33  AST (X'2D392E383
d510: 37 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  7' AS REAL) } re
d520: 61 6c 20 2d 39 2e 38 37 0a 64 6f 5f 65 78 70 72  al -9.87.do_expr
d530: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d540: 31 2e 34 20 7b 20 43 41 53 54 20 28 58 27 33 30  1.4 { CAST (X'30
d550: 32 45 33 30 33 30 33 30 33 31 27 20 41 53 20 52  2E30303031' AS R
d560: 45 41 4c 29 20 7d 20 72 65 61 6c 20 30 2e 30 30  EAL) } real 0.00
d570: 30 31 0a 72 65 6e 61 6d 65 20 64 62 20 64 62 32  01.rename db db2
d580: 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d  .sqlite3 db :mem
d590: 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c 65 20 7b  ory:.ifcapable {
d5a0: 75 74 66 31 36 7d 20 7b 0a 64 62 20 65 76 61 6c  utf16} {.db eval
d5b0: 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69   { PRAGMA encodi
d5c0: 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65 27 20  ng = 'utf-16le' 
d5d0: 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  }.do_expr_test e
d5e0: 5f 65 78 70 72 2d 32 39 2e 31 2e 35 20 7b 20 0a  _expr-29.1.5 { .
d5f0: 20 20 20 20 43 41 53 54 20 28 58 27 33 31 30 30      CAST (X'3100
d600: 32 45 30 30 33 32 30 30 33 33 30 30 27 20 41 53  2E0032003300' AS
d610: 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e   REAL) } real 1.
d620: 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  23.do_expr_test 
d630: 65 5f 65 78 70 72 2d 32 39 2e 31 2e 36 20 7b 20  e_expr-29.1.6 { 
d640: 0a 20 20 20 20 43 41 53 54 20 28 58 27 33 32 30  .    CAST (X'320
d650: 30 33 33 30 30 33 30 30 30 32 45 30 30 33 30 30  0330030002E00300
d660: 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  0' AS REAL) } re
d670: 61 6c 20 32 33 30 2e 30 0a 64 6f 5f 65 78 70 72  al 230.0.do_expr
d680: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d690: 31 2e 37 20 7b 20 0a 20 20 20 20 43 41 53 54 20  1.7 { .    CAST 
d6a0: 28 58 27 32 44 30 30 33 39 30 30 32 45 30 30 33  (X'2D0039002E003
d6b0: 38 30 30 33 37 30 30 27 20 41 53 20 52 45 41 4c  8003700' AS REAL
d6c0: 29 20 7d 20 72 65 61 6c 20 2d 39 2e 38 37 0a 64  ) } real -9.87.d
d6d0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d6e0: 70 72 2d 32 39 2e 31 2e 38 20 7b 20 0a 20 20 20  pr-29.1.8 { .   
d6f0: 20 43 41 53 54 20 28 58 27 33 30 30 30 32 45 30   CAST (X'30002E0
d700: 30 33 30 30 30 33 30 30 30 33 30 30 30 33 31 30  0300030003000310
d710: 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  0' AS REAL) } re
d720: 61 6c 20 30 2e 30 30 30 31 0a 7d 0a 64 62 20 63  al 0.0001.}.db c
d730: 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62 32 20  lose.rename db2 
d740: 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  db..# EVIDENCE-O
d750: 46 3a 20 52 2d 35 34 38 39 38 2d 33 34 35 35 34  F: R-54898-34554
d760: 20 57 68 65 6e 20 63 61 73 74 69 6e 67 20 61 20   When casting a 
d770: 54 45 58 54 20 76 61 6c 75 65 20 74 6f 20 52 45  TEXT value to RE
d780: 41 4c 2c 20 74 68 65 0a 23 20 6c 6f 6e 67 65 73  AL, the.# longes
d790: 74 20 70 6f 73 73 69 62 6c 65 20 70 72 65 66 69  t possible prefi
d7a0: 78 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 74  x of the value t
d7b0: 68 61 74 20 63 61 6e 20 62 65 20 69 6e 74 65 72  hat can be inter
d7c0: 70 72 65 74 65 64 20 61 73 20 61 20 72 65 61 6c  preted as a real
d7d0: 0a 23 20 6e 75 6d 62 65 72 20 69 73 20 65 78 74  .# number is ext
d7e0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
d7f0: 54 45 58 54 20 76 61 6c 75 65 20 61 6e 64 20 74  TEXT value and t
d800: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69 67 6e  he remainder ign
d810: 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  ored..#.do_expr_
d820: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 32  test e_expr-29.2
d830: 2e 31 20 7b 20 43 41 53 54 28 27 31 2e 32 33 61  .1 { CAST('1.23a
d840: 62 63 64 27 20 41 53 20 52 45 41 4c 29 20 7d 20  bcd' AS REAL) } 
d850: 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65 78 70  real 1.23.do_exp
d860: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
d870: 2e 32 2e 32 20 7b 20 43 41 53 54 28 27 31 2e 34  .2.2 { CAST('1.4
d880: 35 2e 32 33 61 62 63 64 27 20 41 53 20 52 45 41  5.23abcd' AS REA
d890: 4c 29 20 7d 20 72 65 61 6c 20 31 2e 34 35 0a 64  L) } real 1.45.d
d8a0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d8b0: 70 72 2d 32 39 2e 32 2e 33 20 7b 20 43 41 53 54  pr-29.2.3 { CAST
d8c0: 28 27 2d 32 2e 31 32 65 2d 30 31 41 42 43 27 20  ('-2.12e-01ABC' 
d8d0: 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20  AS REAL) } real 
d8e0: 2d 30 2e 32 31 32 0a 64 6f 5f 65 78 70 72 5f 74  -0.212.do_expr_t
d8f0: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 32 2e  est e_expr-29.2.
d900: 34 20 7b 20 43 41 53 54 28 27 31 20 32 20 33 20  4 { CAST('1 2 3 
d910: 34 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  4' AS REAL) } re
d920: 61 6c 20 31 2e 30 0a 0a 23 20 45 56 49 44 45 4e  al 1.0..# EVIDEN
d930: 43 45 2d 4f 46 3a 20 52 2d 31 31 33 32 31 2d 34  CE-OF: R-11321-4
d940: 37 34 32 37 20 41 6e 79 20 6c 65 61 64 69 6e 67  7427 Any leading
d950: 20 73 70 61 63 65 73 20 69 6e 20 74 68 65 20 54   spaces in the T
d960: 45 58 54 20 76 61 6c 75 65 20 61 72 65 0a 23 20  EXT value are.# 
d970: 69 67 6e 6f 72 65 64 20 77 68 65 6e 20 63 6f 6e  ignored when con
d980: 76 65 72 67 69 6e 67 20 66 72 6f 6d 20 54 45 58  verging from TEX
d990: 54 20 74 6f 20 52 45 41 4c 2e 0a 23 0a 64 6f 5f  T to REAL..#.do_
d9a0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d9b0: 2d 32 39 2e 33 2e 31 20 7b 20 43 41 53 54 28 27  -29.3.1 { CAST('
d9c0: 20 31 2e 32 33 61 62 63 64 27 20 41 53 20 52 45   1.23abcd' AS RE
d9d0: 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32 33 0a  AL) } real 1.23.
d9e0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d9f0: 78 70 72 2d 32 39 2e 33 2e 32 20 7b 20 43 41 53  xpr-29.3.2 { CAS
da00: 54 28 27 20 20 20 20 31 2e 34 35 2e 32 33 61 62  T('    1.45.23ab
da10: 63 64 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  cd' AS REAL) } r
da20: 65 61 6c 20 31 2e 34 35 0a 64 6f 5f 65 78 70 72  eal 1.45.do_expr
da30: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
da40: 33 2e 33 20 7b 20 43 41 53 54 28 27 20 20 20 2d  3.3 { CAST('   -
da50: 32 2e 31 32 65 2d 30 31 41 42 43 27 20 41 53 20  2.12e-01ABC' AS 
da60: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 2d 30 2e  REAL) } real -0.
da70: 32 31 32 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  212.do_expr_test
da80: 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e 34 20 7b   e_expr-29.3.4 {
da90: 20 43 41 53 54 28 27 20 31 20 32 20 33 20 34 27   CAST(' 1 2 3 4'
daa0: 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c   AS REAL) } real
dab0: 20 31 2e 30 0a 0a 23 20 45 56 49 44 45 4e 43 45   1.0..# EVIDENCE
dac0: 2d 4f 46 3a 20 52 2d 32 32 36 36 32 2d 32 38 32  -OF: R-22662-282
dad0: 31 38 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  18 If there is n
dae0: 6f 20 70 72 65 66 69 78 20 74 68 61 74 20 63 61  o prefix that ca
daf0: 6e 20 62 65 0a 23 20 69 6e 74 65 72 70 72 65 74  n be.# interpret
db00: 65 64 20 61 73 20 61 20 72 65 61 6c 20 6e 75 6d  ed as a real num
db10: 62 65 72 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ber, the result 
db20: 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  of the conversio
db30: 6e 20 69 73 20 30 2e 30 2e 0a 23 0a 64 6f 5f 65  n is 0.0..#.do_e
db40: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
db50: 32 39 2e 34 2e 31 20 7b 20 43 41 53 54 28 27 27  29.4.1 { CAST(''
db60: 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c   AS REAL) } real
db70: 20 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73   0.0.do_expr_tes
db80: 74 20 65 5f 65 78 70 72 2d 32 39 2e 34 2e 32 20  t e_expr-29.4.2 
db90: 7b 20 43 41 53 54 28 27 6e 6f 74 20 61 20 6e 75  { CAST('not a nu
dba0: 6d 62 65 72 27 20 41 53 20 52 45 41 4c 29 20 7d  mber' AS REAL) }
dbb0: 20 72 65 61 6c 20 30 2e 30 0a 64 6f 5f 65 78 70   real 0.0.do_exp
dbc0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
dbd0: 2e 34 2e 33 20 7b 20 43 41 53 54 28 27 58 58 49  .4.3 { CAST('XXI
dbe0: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
dbf0: 6c 20 30 2e 30 0a 0a 23 20 45 56 49 44 45 4e 43  l 0.0..# EVIDENC
dc00: 45 2d 4f 46 3a 20 52 2d 32 31 38 32 39 2d 31 34  E-OF: R-21829-14
dc10: 35 36 33 20 57 68 65 6e 20 63 61 73 74 69 6e 67  563 When casting
dc20: 20 61 20 42 4c 4f 42 20 76 61 6c 75 65 20 74 6f   a BLOB value to
dc30: 20 49 4e 54 45 47 45 52 2c 20 74 68 65 0a 23 20   INTEGER, the.# 
dc40: 76 61 6c 75 65 20 69 73 20 66 69 72 73 74 20 63  value is first c
dc50: 6f 6e 76 65 72 74 65 64 20 74 6f 20 54 45 58 54  onverted to TEXT
dc60: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
dc70: 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 31 20 7b   e_expr-30.1.1 {
dc80: 20 43 41 53 54 28 58 27 33 31 33 32 33 33 27 20   CAST(X'313233' 
dc90: 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e  AS INTEGER) } in
dca0: 74 65 67 65 72 20 31 32 33 0a 64 6f 5f 65 78 70  teger 123.do_exp
dcb0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
dcc0: 2e 31 2e 32 20 7b 20 43 41 53 54 28 58 27 32 44  .1.2 { CAST(X'2D
dcd0: 33 36 33 37 33 38 27 20 41 53 20 49 4e 54 45 47  363738' AS INTEG
dce0: 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 2d 36  ER) } integer -6
dcf0: 37 38 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  78.do_expr_test 
dd00: 65 5f 65 78 70 72 2d 33 30 2e 31 2e 33 20 7b 20  e_expr-30.1.3 { 
dd10: 0a 20 20 43 41 53 54 28 58 27 33 31 33 30 33 30  .  CAST(X'313030
dd20: 33 30 33 30 33 30 33 30 27 20 41 53 20 49 4e 54  30303030' AS INT
dd30: 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67 65 72  EGER) .} integer
dd40: 20 31 30 30 30 30 30 30 0a 64 6f 5f 65 78 70 72   1000000.do_expr
dd50: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
dd60: 31 2e 34 20 7b 20 0a 20 20 43 41 53 54 28 58 27  1.4 { .  CAST(X'
dd70: 32 44 33 31 33 31 33 32 33 35 33 38 33 39 33 39  2D31313235383939
dd80: 33 39 33 30 33 36 33 38 33 34 33 32 33 36 33 32  3930363834323632
dd90: 33 34 27 20 41 53 20 49 4e 54 45 47 45 52 29 20  34' AS INTEGER) 
dda0: 0a 7d 20 69 6e 74 65 67 65 72 20 2d 31 31 32 35  .} integer -1125
ddb0: 38 39 39 39 30 36 38 34 32 36 32 34 0a 0a 72 65  899906842624..re
ddc0: 6e 61 6d 65 20 64 62 20 64 62 32 0a 73 71 6c 69  name db db2.sqli
ddd0: 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a  te3 db :memory:.
dde0: 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66 31 36  ifcapable {utf16
ddf0: 7d 20 7b 0a 65 78 65 63 73 71 6c 20 7b 20 50 52  } {.execsql { PR
de00: 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20  AGMA encoding = 
de10: 27 75 74 66 2d 31 36 62 65 27 20 7d 0a 64 6f 5f  'utf-16be' }.do_
de20: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
de30: 2d 33 30 2e 31 2e 35 20 7b 20 43 41 53 54 28 58  -30.1.5 { CAST(X
de40: 27 30 30 33 31 30 30 33 32 30 30 33 33 27 20 41  '003100320033' A
de50: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
de60: 65 67 65 72 20 31 32 33 0a 64 6f 5f 65 78 70 72  eger 123.do_expr
de70: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
de80: 31 2e 36 20 7b 20 43 41 53 54 28 58 27 30 30 32  1.6 { CAST(X'002
de90: 44 30 30 33 36 30 30 33 37 30 30 33 38 27 20 41  D003600370038' A
dea0: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
deb0: 65 67 65 72 20 2d 36 37 38 0a 64 6f 5f 65 78 70  eger -678.do_exp
dec0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
ded0: 2e 31 2e 37 20 7b 20 0a 20 20 43 41 53 54 28 58  .1.7 { .  CAST(X
dee0: 27 30 30 33 31 30 30 33 30 30 30 33 30 30 30 33  '003100300030003
def0: 30 30 30 33 30 30 30 33 30 30 30 33 30 27 20 41  0003000300030' A
df00: 53 20 49 4e 54 45 47 45 52 29 20 0a 7d 20 69 6e  S INTEGER) .} in
df10: 74 65 67 65 72 20 31 30 30 30 30 30 30 0a 64 6f  teger 1000000.do
df20: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
df30: 72 2d 33 30 2e 31 2e 38 20 7b 20 0a 20 20 43 41  r-30.1.8 { .  CA
df40: 53 54 28 58 27 30 30 32 44 30 30 33 31 30 30 33  ST(X'002D0031003
df50: 31 30 30 33 32 30 30 33 35 30 30 33 38 30 30 33  1003200350038003
df60: 39 30 30 33 39 30 30 33 39 30 30 33 30 30 30 33  9003900390030003
df70: 36 30 30 33 38 30 30 33 34 30 30 33 32 30 30 33  6003800340032003
df80: 36 30 30 33 32 30 30 33 34 27 20 41 53 20 49 4e  600320034' AS IN
df90: 54 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67 65  TEGER) .} intege
dfa0: 72 20 2d 31 31 32 35 38 39 39 39 30 36 38 34 32  r -1125899906842
dfb0: 36 32 34 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 72  624.}.db close.r
dfc0: 65 6e 61 6d 65 20 64 62 32 20 64 62 0a 0a 23 20  ename db2 db..# 
dfd0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
dfe0: 37 36 31 32 2d 34 35 38 34 32 20 57 68 65 6e 20  7612-45842 When 
dff0: 63 61 73 74 69 6e 67 20 61 20 54 45 58 54 20 76  casting a TEXT v
e000: 61 6c 75 65 20 74 6f 20 49 4e 54 45 47 45 52 2c  alue to INTEGER,
e010: 20 74 68 65 0a 23 20 6c 6f 6e 67 65 73 74 20 70   the.# longest p
e020: 6f 73 73 69 62 6c 65 20 70 72 65 66 69 78 20 6f  ossible prefix o
e030: 66 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  f the value that
e040: 20 63 61 6e 20 62 65 20 69 6e 74 65 72 70 72 65   can be interpre
e050: 74 65 64 20 61 73 20 61 6e 0a 23 20 69 6e 74 65  ted as an.# inte
e060: 67 65 72 20 6e 75 6d 62 65 72 20 69 73 20 65 78  ger number is ex
e070: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
e080: 20 54 45 58 54 20 76 61 6c 75 65 20 61 6e 64 20   TEXT value and 
e090: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 0a 23 20  the remainder.# 
e0a0: 69 67 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78  ignored..#.do_ex
e0b0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e0c0: 30 2e 32 2e 31 20 7b 20 43 41 53 54 28 27 31 32  0.2.1 { CAST('12
e0d0: 33 61 62 63 64 27 20 41 53 20 49 4e 54 29 20 7d  3abcd' AS INT) }
e0e0: 20 69 6e 74 65 67 65 72 20 31 32 33 0a 64 6f 5f   integer 123.do_
e0f0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e100: 2d 33 30 2e 32 2e 32 20 7b 20 43 41 53 54 28 27  -30.2.2 { CAST('
e110: 31 34 35 32 33 61 62 63 64 27 20 41 53 20 49 4e  14523abcd' AS IN
e120: 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31 34 35  T) } integer 145
e130: 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  23.do_expr_test 
e140: 65 5f 65 78 70 72 2d 33 30 2e 32 2e 33 20 7b 20  e_expr-30.2.3 { 
e150: 43 41 53 54 28 27 2d 32 2e 31 32 65 2d 30 31 41  CAST('-2.12e-01A
e160: 42 43 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e  BC' AS INT) } in
e170: 74 65 67 65 72 20 2d 32 0a 64 6f 5f 65 78 70 72  teger -2.do_expr
e180: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
e190: 32 2e 34 20 7b 20 43 41 53 54 28 27 31 20 32 20  2.4 { CAST('1 2 
e1a0: 33 20 34 27 20 41 53 20 49 4e 54 29 20 7d 20 69  3 4' AS INT) } i
e1b0: 6e 74 65 67 65 72 20 31 0a 0a 23 20 45 56 49 44  nteger 1..# EVID
e1c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 34 30 30  ENCE-OF: R-34400
e1d0: 2d 33 33 37 37 32 20 41 6e 79 20 6c 65 61 64 69  -33772 Any leadi
e1e0: 6e 67 20 73 70 61 63 65 73 20 69 6e 20 74 68 65  ng spaces in the
e1f0: 20 54 45 58 54 20 76 61 6c 75 65 20 77 68 65 6e   TEXT value when
e200: 0a 23 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72  .# converting fr
e210: 6f 6d 20 54 45 58 54 20 74 6f 20 49 4e 54 45 47  om TEXT to INTEG
e220: 45 52 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  ER are ignored..
e230: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
e240: 5f 65 78 70 72 2d 33 30 2e 33 2e 31 20 7b 20 43  _expr-30.3.1 { C
e250: 41 53 54 28 27 20 20 20 31 32 33 61 62 63 64 27  AST('   123abcd'
e260: 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67   AS INT) } integ
e270: 65 72 20 31 32 33 0a 64 6f 5f 65 78 70 72 5f 74  er 123.do_expr_t
e280: 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 33 2e  est e_expr-30.3.
e290: 32 20 7b 20 43 41 53 54 28 27 20 20 31 34 35 32  2 { CAST('  1452
e2a0: 33 61 62 63 64 27 20 41 53 20 49 4e 54 29 20 7d  3abcd' AS INT) }
e2b0: 20 69 6e 74 65 67 65 72 20 31 34 35 32 33 0a 64   integer 14523.d
e2c0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
e2d0: 70 72 2d 33 30 2e 33 2e 33 20 7b 20 43 41 53 54  pr-30.3.3 { CAST
e2e0: 28 27 20 2d 32 2e 31 32 65 2d 30 31 41 42 43 27  (' -2.12e-01ABC'
e2f0: 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67   AS INT) } integ
e300: 65 72 20 2d 32 0a 64 6f 5f 65 78 70 72 5f 74 65  er -2.do_expr_te
e310: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 33 2e 34  st e_expr-30.3.4
e320: 20 7b 20 43 41 53 54 28 27 20 20 20 20 20 31 20   { CAST('     1 
e330: 32 20 33 20 34 27 20 41 53 20 49 4e 54 29 20 7d  2 3 4' AS INT) }
e340: 20 69 6e 74 65 67 65 72 20 31 0a 0a 23 20 45 56   integer 1..# EV
e350: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 31  IDENCE-OF: R-431
e360: 36 34 2d 34 34 32 37 36 20 49 66 20 74 68 65 72  64-44276 If ther
e370: 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20 74  e is no prefix t
e380: 68 61 74 20 63 61 6e 20 62 65 0a 23 20 69 6e 74  hat can be.# int
e390: 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 69  erpreted as an i
e3a0: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 2c 20 74  nteger number, t
e3b0: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
e3c0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 30   conversion is 0
e3d0: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
e3e0: 20 65 5f 65 78 70 72 2d 33 30 2e 34 2e 31 20 7b   e_expr-30.4.1 {
e3f0: 20 43 41 53 54 28 27 27 20 41 53 20 49 4e 54 45   CAST('' AS INTE
e400: 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 30  GER) } integer 0
e410: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e420: 65 78 70 72 2d 33 30 2e 34 2e 32 20 7b 20 43 41  expr-30.4.2 { CA
e430: 53 54 28 27 6e 6f 74 20 61 20 6e 75 6d 62 65 72  ST('not a number
e440: 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20  ' AS INTEGER) } 
e450: 69 6e 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70  integer 0.do_exp
e460: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
e470: 2e 34 2e 33 20 7b 20 43 41 53 54 28 27 58 58 49  .4.3 { CAST('XXI
e480: 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20  ' AS INTEGER) } 
e490: 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45 56 49  integer 0..# EVI
e4a0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 30 37 34  DENCE-OF: R-0074
e4b0: 31 2d 33 38 37 37 36 20 41 20 63 61 73 74 20 6f  1-38776 A cast o
e4c0: 66 20 61 20 52 45 41 4c 20 76 61 6c 75 65 20 69  f a REAL value i
e4d0: 6e 74 6f 20 61 6e 20 49 4e 54 45 47 45 52 20 77  nto an INTEGER w
e4e0: 69 6c 6c 0a 23 20 74 72 75 6e 63 61 74 65 20 74  ill.# truncate t
e4f0: 68 65 20 66 72 61 63 74 69 6f 6e 61 6c 20 70 61  he fractional pa
e500: 72 74 20 6f 66 20 74 68 65 20 52 45 41 4c 2e 0a  rt of the REAL..
e510: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
e520: 5f 65 78 70 72 2d 33 31 2e 31 2e 31 20 7b 20 43  _expr-31.1.1 { C
e530: 41 53 54 28 33 2e 31 34 31 35 39 20 41 53 20 49  AST(3.14159 AS I
e540: 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65  NTEGER) } intege
e550: 72 20 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  r 3.do_expr_test
e560: 20 65 5f 65 78 70 72 2d 33 31 2e 31 2e 32 20 7b   e_expr-31.1.2 {
e570: 20 43 41 53 54 28 31 2e 39 39 39 39 39 20 41 53   CAST(1.99999 AS
e580: 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65   INTEGER) } inte
e590: 67 65 72 20 31 0a 64 6f 5f 65 78 70 72 5f 74 65  ger 1.do_expr_te
e5a0: 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 31 2e 33  st e_expr-31.1.3
e5b0: 20 7b 20 43 41 53 54 28 2d 31 2e 39 39 39 39 39   { CAST(-1.99999
e5c0: 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69   AS INTEGER) } i
e5d0: 6e 74 65 67 65 72 20 2d 31 0a 64 6f 5f 65 78 70  nteger -1.do_exp
e5e0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31  r_test e_expr-31
e5f0: 2e 31 2e 34 20 7b 20 43 41 53 54 28 2d 30 2e 39  .1.4 { CAST(-0.9
e600: 39 39 39 39 20 41 53 20 49 4e 54 45 47 45 52 29  9999 AS INTEGER)
e610: 20 7d 20 69 6e 74 65 67 65 72 20 30 0a 0a 23 20   } integer 0..# 
e620: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
e630: 39 35 30 33 2d 32 38 31 30 35 20 49 66 20 61 20  9503-28105 If a 
e640: 52 45 41 4c 20 69 73 20 74 6f 6f 20 6c 61 72 67  REAL is too larg
e650: 65 20 74 6f 20 62 65 20 72 65 70 72 65 73 65 6e  e to be represen
e660: 74 65 64 20 61 73 0a 23 20 61 6e 20 49 4e 54 45  ted as.# an INTE
e670: 47 45 52 20 74 68 65 6e 20 74 68 65 20 72 65 73  GER then the res
e680: 75 6c 74 20 6f 66 20 74 68 65 20 63 61 73 74 20  ult of the cast 
e690: 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 6e  is the largest n
e6a0: 65 67 61 74 69 76 65 0a 23 20 69 6e 74 65 67 65  egative.# intege
e6b0: 72 3a 20 2d 39 32 32 33 33 37 32 30 33 36 38 35  r: -922337203685
e6c0: 34 37 37 35 38 30 38 2e 0a 23 0a 64 6f 5f 65 78  4775808..#.do_ex
e6d0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e6e0: 31 2e 32 2e 31 20 7b 20 43 41 53 54 28 32 65 2b  1.2.1 { CAST(2e+
e6f0: 35 30 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74  50 AS INT) } int
e700: 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33 36  eger -9223372036
e710: 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78 70  854775808.do_exp
e720: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31  r_test e_expr-31
e730: 2e 32 2e 32 20 7b 20 43 41 53 54 28 2d 32 65 2b  .2.2 { CAST(-2e+
e740: 35 30 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74  50 AS INT) } int
e750: 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33 36  eger -9223372036
e760: 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78 70  854775808.do_exp
e770: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31  r_test e_expr-31
e780: 2e 32 2e 33 20 7b 20 0a 20 20 43 41 53 54 28 2d  .2.3 { .  CAST(-
e790: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
e7a0: 38 30 39 2e 30 20 41 53 20 49 4e 54 29 0a 7d 20  809.0 AS INT).} 
e7b0: 69 6e 74 65 67 65 72 20 2d 39 32 32 33 33 37 32  integer -9223372
e7c0: 30 33 36 38 35 34 37 37 35 38 30 38 0a 64 6f 5f  036854775808.do_
e7d0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e7e0: 2d 33 31 2e 32 2e 34 20 7b 20 0a 20 20 43 41 53  -31.2.4 { .  CAS
e7f0: 54 28 39 32 32 33 33 37 32 30 33 36 38 35 34 37  T(92233720368547
e800: 37 35 38 30 39 2e 30 20 41 53 20 49 4e 54 29 0a  75809.0 AS INT).
e810: 7d 20 69 6e 74 65 67 65 72 20 2d 39 32 32 33 33  } integer -92233
e820: 37 32 30 33 36 38 35 34 37 37 35 38 30 38 0a 0a  72036854775808..
e830: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
e840: 52 2d 30 39 32 39 35 2d 36 31 33 33 37 20 43 61  R-09295-61337 Ca
e850: 73 74 69 6e 67 20 61 20 54 45 58 54 20 6f 72 20  sting a TEXT or 
e860: 42 4c 4f 42 20 76 61 6c 75 65 20 69 6e 74 6f 20  BLOB value into 
e870: 4e 55 4d 45 52 49 43 0a 23 20 66 69 72 73 74 20  NUMERIC.# first 
e880: 64 6f 65 73 20 61 20 66 6f 72 63 65 64 20 63 6f  does a forced co
e890: 6e 76 65 72 73 69 6f 6e 20 69 6e 74 6f 20 52 45  nversion into RE
e8a0: 41 4c 20 62 75 74 20 74 68 65 6e 20 66 75 72 74  AL but then furt
e8b0: 68 65 72 20 63 6f 6e 76 65 72 74 73 20 74 68 65  her converts the
e8c0: 0a 23 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 49  .# result into I
e8d0: 4e 54 45 47 45 52 20 69 66 20 61 6e 64 20 6f 6e  NTEGER if and on
e8e0: 6c 79 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72  ly if the conver
e8f0: 73 69 6f 6e 20 66 72 6f 6d 20 52 45 41 4c 20 74  sion from REAL t
e900: 6f 20 49 4e 54 45 47 45 52 0a 23 20 69 73 20 6c  o INTEGER.# is l
e910: 6f 73 73 6c 65 73 73 20 61 6e 64 20 72 65 76 65  ossless and reve
e920: 72 73 69 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 70  rsible..#.do_exp
e930: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32  r_test e_expr-32
e940: 2e 31 2e 31 20 7b 20 43 41 53 54 28 27 34 35 27  .1.1 { CAST('45'
e950: 20 20 20 41 53 20 4e 55 4d 45 52 49 43 29 20 20     AS NUMERIC)  
e960: 7d 20 69 6e 74 65 67 65 72 20 34 35 0a 64 6f 5f  } integer 45.do_
e970: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e980: 2d 33 32 2e 31 2e 32 20 7b 20 43 41 53 54 28 27  -32.1.2 { CAST('
e990: 34 35 2e 30 27 20 41 53 20 4e 55 4d 45 52 49 43  45.0' AS NUMERIC
e9a0: 29 20 20 7d 20 69 6e 74 65 67 65 72 20 34 35 0a  )  } integer 45.
e9b0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e9c0: 78 70 72 2d 33 32 2e 31 2e 33 20 7b 20 43 41 53  xpr-32.1.3 { CAS
e9d0: 54 28 27 34 35 2e 32 27 20 41 53 20 4e 55 4d 45  T('45.2' AS NUME
e9e0: 52 49 43 29 20 20 7d 20 72 65 61 6c 20 34 35 2e  RIC)  } real 45.
e9f0: 32 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  2.do_expr_test e
ea00: 5f 65 78 70 72 2d 33 32 2e 31 2e 34 20 7b 20 43  _expr-32.1.4 { C
ea10: 41 53 54 28 27 31 31 61 62 63 27 20 41 53 20 4e  AST('11abc' AS N
ea20: 55 4d 45 52 49 43 29 20 7d 20 69 6e 74 65 67 65  UMERIC) } intege
ea30: 72 20 31 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73  r 11.do_expr_tes
ea40: 74 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e 35 20  t e_expr-32.1.5 
ea50: 7b 20 43 41 53 54 28 27 31 31 2e 31 61 62 63 27  { CAST('11.1abc'
ea60: 20 41 53 20 4e 55 4d 45 52 49 43 29 20 7d 20 72   AS NUMERIC) } r
ea70: 65 61 6c 20 31 31 2e 31 0a 0a 23 20 45 56 49 44  eal 11.1..# EVID
ea80: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 33 34 37  ENCE-OF: R-30347
ea90: 2d 31 38 37 30 32 20 43 61 73 74 69 6e 67 20 61  -18702 Casting a
eaa0: 20 52 45 41 4c 20 6f 72 20 49 4e 54 45 47 45 52   REAL or INTEGER
eab0: 20 76 61 6c 75 65 20 74 6f 20 4e 55 4d 45 52 49   value to NUMERI
eac0: 43 0a 23 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20  C.# is a no-op, 
ead0: 65 76 65 6e 20 69 66 20 61 20 72 65 61 6c 20 76  even if a real v
eae0: 61 6c 75 65 20 63 6f 75 6c 64 20 62 65 20 6c 6f  alue could be lo
eaf0: 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74  sslessly convert
eb00: 65 64 20 74 6f 20 61 6e 0a 23 20 69 6e 74 65 67  ed to an.# integ
eb10: 65 72 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65  er..#.do_expr_te
eb20: 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 31  st e_expr-32.2.1
eb30: 20 7b 20 43 41 53 54 28 31 33 2e 30 20 41 53 20   { CAST(13.0 AS 
eb40: 4e 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c 20  NUMERIC) } real 
eb50: 31 33 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73  13.0.do_expr_tes
eb60: 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 32 20  t e_expr-32.2.2 
eb70: 7b 20 43 41 53 54 28 31 33 2e 35 20 41 53 20 4e  { CAST(13.5 AS N
eb80: 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c 20 31  UMERIC) } real 1
eb90: 33 2e 35 0a 0a 64 6f 5f 65 78 70 72 5f 74 65 73  3.5..do_expr_tes
eba0: 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 33 20  t e_expr-32.2.3 
ebb0: 7b 20 0a 20 20 43 41 53 54 28 2d 39 32 32 33 33  { .  CAST(-92233
ebc0: 37 32 30 33 36 38 35 34 37 37 35 38 30 38 20 41  72036854775808 A
ebd0: 53 20 4e 55 4d 45 52 49 43 29 0a 7d 20 69 6e 74  S NUMERIC).} int
ebe0: 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33 36  eger -9223372036
ebf0: 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78 70  854775808.do_exp
ec00: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32  r_test e_expr-32
ec10: 2e 32 2e 34 20 7b 20 0a 20 20 43 41 53 54 28 39  .2.4 { .  CAST(9
ec20: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
ec30: 30 37 20 41 53 20 4e 55 4d 45 52 49 43 29 0a 7d  07 AS NUMERIC).}
ec40: 20 69 6e 74 65 67 65 72 20 39 32 32 33 33 37 32   integer 9223372
ec50: 30 33 36 38 35 34 37 37 35 38 30 37 0a 0a 23 20  036854775807..# 
ec60: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
ec70: 34 35 35 30 2d 32 39 31 39 31 20 4e 6f 74 65 20  4550-29191 Note 
ec80: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
ec90: 66 72 6f 6d 20 63 61 73 74 69 6e 67 20 61 6e 79  from casting any
eca0: 0a 23 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75  .# non-BLOB valu
ecb0: 65 20 69 6e 74 6f 20 61 20 42 4c 4f 42 20 61 6e  e into a BLOB an
ecc0: 64 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f  d the result fro
ecd0: 6d 20 63 61 73 74 69 6e 67 20 61 6e 79 20 42 4c  m casting any BL
ece0: 4f 42 20 76 61 6c 75 65 0a 23 20 69 6e 74 6f 20  OB value.# into 
ecf0: 61 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65  a non-BLOB value
ed00: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
ed10: 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  t depending on w
ed20: 68 65 74 68 65 72 20 74 68 65 0a 23 20 64 61 74  hether the.# dat
ed30: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 69  abase encoding i
ed40: 73 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 62  s UTF-8, UTF-16b
ed50: 65 2c 20 6f 72 20 55 54 46 2d 31 36 6c 65 2e 0a  e, or UTF-16le..
ed60: 23 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66  #.ifcapable {utf
ed70: 31 36 7d 20 7b 0a 73 71 6c 69 74 65 33 20 64 62  16} {.sqlite3 db
ed80: 31 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 31  1 :memory: ; db1
ed90: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65   eval { PRAGMA e
eda0: 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 38  ncoding = 'utf-8
edb0: 27 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 32 20  ' }.sqlite3 db2 
edc0: 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 32 20 65  :memory: ; db2 e
edd0: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63  val { PRAGMA enc
ede0: 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c  oding = 'utf-16l
edf0: 65 27 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 33  e' }.sqlite3 db3
ee00: 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 33 20   :memory: ; db3 
ee10: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e  eval { PRAGMA en
ee20: 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36  coding = 'utf-16
ee30: 62 65 27 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74  be' }.foreach {t
ee40: 6e 20 63 61 73 74 65 78 70 72 20 64 69 66 66 65  n castexpr diffe
ee50: 72 73 7d 20 7b 0a 20 20 31 20 7b 20 43 41 53 54  rs} {.  1 { CAST
ee60: 28 31 32 33 20 41 53 20 42 4c 4f 42 29 20 20 20  (123 AS BLOB)   
ee70: 20 7d 20 31 0a 20 20 32 20 7b 20 43 41 53 54 28   } 1.  2 { CAST(
ee80: 27 27 20 41 53 20 42 4c 4f 42 29 20 20 20 20 20  '' AS BLOB)     
ee90: 7d 20 30 0a 20 20 33 20 7b 20 43 41 53 54 28 27  } 0.  3 { CAST('
eea0: 61 62 63 64 27 20 41 53 20 42 4c 4f 42 29 20 7d  abcd' AS BLOB) }
eeb0: 20 31 0a 0a 20 20 34 20 7b 20 43 41 53 54 28 58   1..  4 { CAST(X
eec0: 27 61 62 63 64 27 20 41 53 20 54 45 58 54 29 20  'abcd' AS TEXT) 
eed0: 7d 20 31 0a 20 20 35 20 7b 20 43 41 53 54 28 58  } 1.  5 { CAST(X
eee0: 27 27 20 41 53 20 54 45 58 54 29 20 20 20 20 20  '' AS TEXT)     
eef0: 7d 20 30 0a 7d 20 7b 0a 20 20 73 65 74 20 72 31  } 0.} {.  set r1
ef00: 20 5b 64 62 31 20 65 76 61 6c 20 22 53 45 4c 45   [db1 eval "SELE
ef10: 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74 65  CT typeof($caste
ef20: 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61 73  xpr), quote($cas
ef30: 74 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20 72  texpr)"].  set r
ef40: 32 20 5b 64 62 32 20 65 76 61 6c 20 22 53 45 4c  2 [db2 eval "SEL
ef50: 45 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74  ECT typeof($cast
ef60: 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61  expr), quote($ca
ef70: 73 74 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20  stexpr)"].  set 
ef80: 72 33 20 5b 64 62 33 20 65 76 61 6c 20 22 53 45  r3 [db3 eval "SE
ef90: 4c 45 43 54 20 74 79 70 65 6f 66 28 24 63 61 73  LECT typeof($cas
efa0: 74 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63  texpr), quote($c
efb0: 61 73 74 65 78 70 72 29 22 5d 0a 0a 20 20 69 66  astexpr)"]..  if
efc0: 20 7b 24 64 69 66 66 65 72 73 7d 20 7b 0a 20 20   {$differs} {.  
efd0: 20 20 73 65 74 20 72 65 73 20 5b 65 78 70 72 20    set res [expr 
efe0: 7b 24 72 31 21 3d 24 72 32 20 26 26 20 24 72 32  {$r1!=$r2 && $r2
eff0: 21 3d 24 72 33 7d 5d 0a 20 20 7d 20 65 6c 73 65  !=$r3}].  } else
f000: 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b   {.    set res [
f010: 65 78 70 72 20 7b 24 72 31 3d 3d 24 72 32 20 26  expr {$r1==$r2 &
f020: 26 20 24 72 32 3d 3d 24 72 33 7d 5d 0a 20 20 7d  & $r2==$r3}].  }
f030: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 65 78  ..  do_test e_ex
f040: 70 72 2d 33 33 2e 31 2e 24 74 6e 20 7b 73 65 74  pr-33.1.$tn {set
f050: 20 72 65 73 7d 20 31 0a 7d 0a 64 62 31 20 63 6c   res} 1.}.db1 cl
f060: 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 64 62  ose.db2 close.db
f070: 33 20 63 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d 2d  3 close.}..#----
f080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0c0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61  -----.# Test sta
f0d0: 74 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20  tements related 
f0e0: 74 6f 20 74 68 65 20 45 58 49 53 54 53 20 61 6e  to the EXISTS an
f0f0: 64 20 4e 4f 54 20 45 58 49 53 54 53 20 6f 70 65  d NOT EXISTS ope
f100: 72 61 74 6f 72 73 2e 0a 23 0a 63 61 74 63 68 20  rators..#.catch 
f110: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72  { db close }.for
f120: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
f130: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
f140: 2e 64 62 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  .db..do_execsql_
f150: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34 2e 31  test e_expr-34.1
f160: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
f170: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 49 4e  E t1(a, b);.  IN
f180: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
f190: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53  UES(1, 2);.  INS
f1a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
f1b0: 45 53 28 4e 55 4c 4c 2c 20 32 29 3b 0a 20 20 49  ES(NULL, 2);.  I
f1c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
f1d0: 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20  LUES(1, NULL);. 
f1e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
f1f0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c  VALUES(NULL, NUL
f200: 4c 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44  L);.} {}..# EVID
f210: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 35 38 38  ENCE-OF: R-25588
f220: 2d 32 37 31 38 31 20 54 68 65 20 45 58 49 53 54  -27181 The EXIST
f230: 53 20 6f 70 65 72 61 74 6f 72 20 61 6c 77 61 79  S operator alway
f240: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 6f  s evaluates to o
f250: 6e 65 0a 23 20 6f 66 20 74 68 65 20 69 6e 74 65  ne.# of the inte
f260: 67 65 72 20 76 61 6c 75 65 73 20 30 20 61 6e 64  ger values 0 and
f270: 20 31 2e 0a 23 0a 23 20 54 68 69 73 20 73 74 61   1..#.# This sta
f280: 74 65 6d 65 6e 74 20 69 73 20 6e 6f 74 20 74 65  tement is not te
f290: 73 74 65 64 20 62 79 20 69 74 73 65 6c 66 2e 20  sted by itself. 
f2a0: 49 6e 73 74 65 61 64 2c 20 61 6c 6c 20 65 5f 65  Instead, all e_e
f2b0: 78 70 72 2d 33 34 2e 2a 20 74 65 73 74 73 20 0a  xpr-34.* tests .
f2c0: 23 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  # following this
f2d0: 20 70 6f 69 6e 74 20 65 78 70 6c 69 63 69 74 6c   point explicitl
f2e0: 79 20 74 65 73 74 20 74 68 61 74 20 73 70 65 63  y test that spec
f2f0: 69 66 69 63 20 69 6e 76 6f 63 61 74 69 6f 6e 73  ific invocations
f300: 20 6f 66 20 45 58 49 53 54 53 0a 23 20 72 65 74   of EXISTS.# ret
f310: 75 72 6e 20 65 69 74 68 65 72 20 69 6e 74 65 67  urn either integ
f320: 65 72 20 30 20 6f 72 20 69 6e 74 65 67 65 72 20  er 0 or integer 
f330: 31 2e 0a 23 0a 0a 23 20 45 56 49 44 45 4e 43 45  1..#..# EVIDENCE
f340: 2d 4f 46 3a 20 52 2d 35 38 35 35 33 2d 36 33 37  -OF: R-58553-637
f350: 34 30 20 49 66 20 65 78 65 63 75 74 69 6e 67 20  40 If executing 
f360: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
f370: 6d 65 6e 74 20 73 70 65 63 69 66 69 65 64 0a 23  ment specified.#
f380: 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 68 61   as the right-ha
f390: 6e 64 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  nd operand of th
f3a0: 65 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  e EXISTS operato
f3b0: 72 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f  r would return o
f3c0: 6e 65 20 6f 72 0a 23 20 6d 6f 72 65 20 72 6f 77  ne or.# more row
f3d0: 73 2c 20 74 68 65 6e 20 74 68 65 20 45 58 49 53  s, then the EXIS
f3e0: 54 53 20 6f 70 65 72 61 74 6f 72 20 65 76 61 6c  TS operator eval
f3f0: 75 61 74 65 73 20 74 6f 20 31 2e 0a 23 0a 66 6f  uates to 1..#.fo
f400: 72 65 61 63 68 20 7b 74 6e 20 65 78 70 72 7d 20  reach {tn expr} 
f410: 7b 0a 20 20 20 20 31 20 7b 20 45 58 49 53 54 53  {.    1 { EXISTS
f420: 20 28 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   ( SELECT a FROM
f430: 20 74 31 20 29 20 7d 0a 20 20 20 20 32 20 7b 20   t1 ) }.    2 { 
f440: 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
f450: 62 20 46 52 4f 4d 20 74 31 20 29 20 7d 0a 20 20  b FROM t1 ) }.  
f460: 20 20 33 20 7b 20 45 58 49 53 54 53 20 28 20 53    3 { EXISTS ( S
f470: 45 4c 45 43 54 20 32 34 20 29 20 7d 0a 20 20 20  ELECT 24 ) }.   
f480: 20 34 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   4 { EXISTS ( SE
f490: 4c 45 43 54 20 4e 55 4c 4c 20 29 20 7d 0a 20 20  LECT NULL ) }.  
f4a0: 20 20 35 20 7b 20 45 58 49 53 54 53 20 28 20 53    5 { EXISTS ( S
f4b0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
f4c0: 57 48 45 52 45 20 61 20 49 53 20 4e 55 4c 4c 20  WHERE a IS NULL 
f4d0: 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70  ) }.} {.  do_exp
f4e0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34  r_test e_expr-34
f4f0: 2e 32 2e 24 74 6e 20 24 65 78 70 72 20 69 6e 74  .2.$tn $expr int
f500: 65 67 65 72 20 31 0a 7d 0a 0a 23 20 45 56 49 44  eger 1.}..# EVID
f510: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 36 37 33  ENCE-OF: R-19673
f520: 2d 34 30 39 37 32 20 49 66 20 65 78 65 63 75 74  -40972 If execut
f530: 69 6e 67 20 74 68 65 20 53 45 4c 45 43 54 20 77  ing the SELECT w
f540: 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f 0a 23  ould return no.#
f550: 20 72 6f 77 73 20 61 74 20 61 6c 6c 2c 20 74 68   rows at all, th
f560: 65 6e 20 74 68 65 20 45 58 49 53 54 53 20 6f 70  en the EXISTS op
f570: 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73  erator evaluates
f580: 20 74 6f 20 30 2e 0a 23 0a 66 6f 72 65 61 63 68   to 0..#.foreach
f590: 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20   {tn expr} {.   
f5a0: 20 31 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   1 { EXISTS ( SE
f5b0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57  LECT a FROM t1 W
f5c0: 48 45 52 45 20 30 29 20 7d 0a 20 20 20 20 32 20  HERE 0) }.    2 
f5d0: 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43  { EXISTS ( SELEC
f5e0: 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T b FROM t1 WHER
f5f0: 45 20 61 20 3d 20 35 29 20 7d 0a 20 20 20 20 33  E a = 5) }.    3
f600: 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45   { EXISTS ( SELE
f610: 43 54 20 32 34 20 57 48 45 52 45 20 30 29 20 7d  CT 24 WHERE 0) }
f620: 0a 20 20 20 20 34 20 7b 20 45 58 49 53 54 53 20  .    4 { EXISTS 
f630: 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 57 48  ( SELECT NULL WH
f640: 45 52 45 20 31 3d 32 29 20 7d 0a 7d 20 7b 0a 20  ERE 1=2) }.} {. 
f650: 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f   do_expr_test e_
f660: 65 78 70 72 2d 33 34 2e 33 2e 24 74 6e 20 24 65  expr-34.3.$tn $e
f670: 78 70 72 20 69 6e 74 65 67 65 72 20 30 0a 7d 0a  xpr integer 0.}.
f680: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
f690: 52 2d 33 35 31 30 39 2d 34 39 31 33 39 20 54 68  R-35109-49139 Th
f6a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
f6b0: 6d 6e 73 20 69 6e 20 65 61 63 68 20 72 6f 77 20  mns in each row 
f6c0: 72 65 74 75 72 6e 65 64 0a 23 20 62 79 20 74 68  returned.# by th
f6d0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
f6e0: 6e 74 20 28 69 66 20 61 6e 79 29 20 61 6e 64 20  nt (if any) and 
f6f0: 74 68 65 20 73 70 65 63 69 66 69 63 20 76 61 6c  the specific val
f700: 75 65 73 20 72 65 74 75 72 6e 65 64 20 68 61 76  ues returned hav
f710: 65 0a 23 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e  e.# no effect on
f720: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
f730: 74 68 65 20 45 58 49 53 54 53 20 6f 70 65 72 61  the EXISTS opera
f740: 74 6f 72 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  tor..#.foreach {
f750: 74 6e 20 65 78 70 72 20 72 65 73 7d 20 7b 0a 20  tn expr res} {. 
f760: 20 20 20 31 20 7b 20 45 58 49 53 54 53 20 28 20     1 { EXISTS ( 
f770: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
f780: 20 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20   ) }            
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
f7a0: 20 20 20 20 32 20 7b 20 45 58 49 53 54 53 20 28      2 { EXISTS (
f7b0: 20 53 45 4c 45 43 54 20 2a 2c 20 2a 2c 20 2a 20   SELECT *, *, * 
f7c0: 46 52 4f 4d 20 74 31 20 29 20 7d 20 20 20 20 20  FROM t1 ) }     
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
f7e0: 0a 20 20 20 20 33 20 7b 20 45 58 49 53 54 53 20  .    3 { EXISTS 
f7f0: 28 20 53 45 4c 45 43 54 20 32 34 2c 20 32 35 20  ( SELECT 24, 25 
f800: 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ) }             
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 31 0a 20 20 20 20 34 20 7b 20 45 58 49 53 54 53  1.    4 { EXISTS
f830: 20 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   ( SELECT NULL, 
f840: 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 29 20 7d 20 20  NULL, NULL ) }  
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 31 0a 20 20 20 20 35 20 7b 20 45 58 49 53 54   1.    5 { EXIST
f870: 53 20 28 20 53 45 4c 45 43 54 20 61 2c 62 2c 61  S ( SELECT a,b,a
f880: 7c 7c 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ||b FROM t1 WHER
f890: 45 20 61 20 49 53 20 4e 55 4c 4c 20 29 20 7d 20  E a IS NULL ) } 
f8a0: 20 20 31 0a 0a 20 20 20 20 36 20 7b 20 45 58 49    1..    6 { EXI
f8b0: 53 54 53 20 28 20 53 45 4c 45 43 54 20 61 2c 20  STS ( SELECT a, 
f8c0: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
f8d0: 30 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0) }            
f8e0: 20 20 20 20 30 0a 20 20 20 20 37 20 7b 20 45 58      0.    7 { EX
f8f0: 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 62 2c  ISTS ( SELECT b,
f900: 20 62 2c 20 61 20 46 52 4f 4d 20 74 31 20 57 48   b, a FROM t1 WH
f910: 45 52 45 20 61 20 3d 20 35 29 20 7d 20 20 20 20  ERE a = 5) }    
f920: 20 20 20 20 20 30 0a 20 20 20 20 38 20 7b 20 45       0.    8 { E
f930: 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 32  XISTS ( SELECT 2
f940: 34 2c 20 34 36 2c 20 38 39 20 57 48 45 52 45 20  4, 46, 89 WHERE 
f950: 30 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0) }            
f960: 20 20 20 20 20 20 30 0a 20 20 20 20 39 20 7b 20        0.    9 { 
f970: 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
f980: 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 57 48 45 52 45  NULL, NULL WHERE
f990: 20 31 3d 32 29 20 7d 20 20 20 20 20 20 20 20 20   1=2) }         
f9a0: 20 20 20 20 20 20 20 30 0a 7d 20 7b 0a 20 20 64         0.} {.  d
f9b0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
f9c0: 70 72 2d 33 34 2e 34 2e 24 74 6e 20 24 65 78 70  pr-34.4.$tn $exp
f9d0: 72 20 69 6e 74 65 67 65 72 20 24 72 65 73 0a 7d  r integer $res.}
f9e0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
f9f0: 20 52 2d 31 30 36 34 35 2d 31 32 34 33 39 20 49   R-10645-12439 I
fa00: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 72 6f  n particular, ro
fa10: 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55  ws containing NU
fa20: 4c 4c 20 76 61 6c 75 65 73 0a 23 20 61 72 65 20  LL values.# are 
fa30: 6e 6f 74 20 68 61 6e 64 6c 65 64 20 61 6e 79 20  not handled any 
fa40: 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
fa50: 20 72 6f 77 73 20 77 69 74 68 6f 75 74 20 4e 55   rows without NU
fa60: 4c 4c 20 76 61 6c 75 65 73 2e 0a 23 0a 66 6f 72  LL values..#.for
fa70: 65 61 63 68 20 7b 74 6e 20 65 31 20 65 32 7d 20  each {tn e1 e2} 
fa80: 7b 0a 20 20 31 20 7b 20 45 58 49 53 54 53 20 28  {.  1 { EXISTS (
fa90: 53 45 4c 45 43 54 20 27 6e 6f 74 20 6e 75 6c 6c  SELECT 'not null
faa0: 27 29 20 7d 20 20 20 20 7b 20 45 58 49 53 54 53  ') }    { EXISTS
fab0: 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d   (SELECT NULL) }
fac0: 0a 20 20 32 20 7b 20 45 58 49 53 54 53 20 28 53  .  2 { EXISTS (S
fad0: 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20  ELECT NULL FROM 
fae0: 74 31 29 20 7d 20 20 7b 20 45 58 49 53 54 53 20  t1) }  { EXISTS 
faf0: 28 53 45 4c 45 43 54 20 27 62 72 65 61 64 27 20  (SELECT 'bread' 
fb00: 46 52 4f 4d 20 74 31 29 20 7d 0a 7d 20 7b 0a 20  FROM t1) }.} {. 
fb10: 20 73 65 74 20 72 65 73 20 5b 64 62 20 6f 6e 65   set res [db one
fb20: 20 22 53 45 4c 45 43 54 20 24 65 31 22 5d 0a 20   "SELECT $e1"]. 
fb30: 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f   do_expr_test e_
fb40: 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d 61  expr-34.5.${tn}a
fb50: 20 24 65 31 20 69 6e 74 65 67 65 72 20 24 72 65   $e1 integer $re
fb60: 73 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  s.  do_expr_test
fb70: 20 65 5f 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74   e_expr-34.5.${t
fb80: 6e 7d 62 20 24 65 32 20 69 6e 74 65 67 65 72 20  n}b $e2 integer 
fb90: 24 72 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  $res.}..#-------
fba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbe0: 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65 6d  --.# Test statem
fbf0: 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20  ents related to 
fc00: 73 63 61 6c 61 72 20 73 75 62 2d 71 75 65 72 69  scalar sub-queri
fc10: 65 73 2e 0a 23 0a 0a 63 61 74 63 68 20 7b 20 64  es..#..catch { d
fc20: 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64  b close }.forced
fc30: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 73 71  elete test.db.sq
fc40: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
fc50: 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  .do_test e_expr-
fc60: 33 35 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  35.0 {.  execsql
fc70: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
fc80: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
fc90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
fca0: 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27   VALUES('one', '
fcb0: 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  two');.    INSER
fcc0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
fcd0: 28 27 74 68 72 65 65 27 2c 20 4e 55 4c 4c 29 3b  ('three', NULL);
fce0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
fcf0: 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20 35 2e   t2 VALUES(4, 5.
fd00: 30 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20  0);.  }.} {}..# 
fd10: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
fd20: 30 39 38 30 2d 33 39 32 35 36 20 41 20 53 45 4c  0980-39256 A SEL
fd30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 65 6e  ECT statement en
fd40: 63 6c 6f 73 65 64 20 69 6e 20 70 61 72 65 6e 74  closed in parent
fd50: 68 65 73 65 73 0a 23 20 6d 61 79 20 61 70 70 65  heses.# may appe
fd60: 61 72 20 61 73 20 61 20 73 63 61 6c 61 72 20 71  ar as a scalar q
fd70: 75 61 6e 74 69 74 79 2e 0a 23 0a 23 20 45 56 49  uantity..#.# EVI
fd80: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 32 39  DENCE-OF: R-5629
fd90: 34 2d 30 33 39 36 36 20 41 6c 6c 20 74 79 70 65  4-03966 All type
fda0: 73 20 6f 66 20 53 45 4c 45 43 54 20 73 74 61 74  s of SELECT stat
fdb0: 65 6d 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  ement, including
fdc0: 0a 23 20 61 67 67 72 65 67 61 74 65 20 61 6e 64  .# aggregate and
fdd0: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
fde0: 20 71 75 65 72 69 65 73 20 28 71 75 65 72 69 65   queries (querie
fdf0: 73 20 77 69 74 68 20 6b 65 79 77 6f 72 64 73 20  s with keywords 
fe00: 6c 69 6b 65 0a 23 20 55 4e 49 4f 4e 20 6f 72 20  like.# UNION or 
fe10: 45 58 43 45 50 54 29 20 61 72 65 20 61 6c 6c 6f  EXCEPT) are allo
fe20: 77 65 64 20 61 73 20 73 63 61 6c 61 72 20 73 75  wed as scalar su
fe30: 62 71 75 65 72 69 65 73 2e 0a 23 0a 64 6f 5f 65  bqueries..#.do_e
fe40: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
fe50: 33 35 2e 31 2e 31 20 7b 20 28 53 45 4c 45 43 54  35.1.1 { (SELECT
fe60: 20 33 35 29 20 20 20 7d 20 69 6e 74 65 67 65 72   35)   } integer
fe70: 20 33 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74   35.do_expr_test
fe80: 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e 32 20 7b   e_expr-35.1.2 {
fe90: 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d   (SELECT NULL) }
fea0: 20 6e 75 6c 6c 20 7b 7d 0a 0a 64 6f 5f 65 78 70   null {}..do_exp
feb0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35  r_test e_expr-35
fec0: 2e 31 2e 33 20 7b 20 28 53 45 4c 45 43 54 20 63  .1.3 { (SELECT c
fed0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
fee0: 20 7d 20 69 6e 74 65 67 65 72 20 33 0a 64 6f 5f   } integer 3.do_
fef0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
ff00: 2d 33 35 2e 31 2e 34 20 7b 20 28 53 45 4c 45 43  -35.1.4 { (SELEC
ff10: 54 20 34 20 46 52 4f 4d 20 74 32 29 20 7d 20 69  T 4 FROM t2) } i
ff20: 6e 74 65 67 65 72 20 34 0a 0a 64 6f 5f 65 78 70  nteger 4..do_exp
ff30: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35  r_test e_expr-35
ff40: 2e 31 2e 35 20 7b 20 0a 20 20 28 53 45 4c 45 43  .1.5 { .  (SELEC
ff50: 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
ff60: 4e 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f  N SELECT a+1 FRO
ff70: 4d 20 74 32 29 0a 7d 20 6e 75 6c 6c 20 7b 7d 0a  M t2).} null {}.
ff80: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
ff90: 78 70 72 2d 33 35 2e 31 2e 36 20 7b 20 0a 20 20  xpr-35.1.6 { .  
ffa0: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74  (SELECT a FROM t
ffb0: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 43  2 UNION SELECT C
ffc0: 4f 41 4c 45 53 43 45 28 62 2c 20 35 35 29 20 46  OALESCE(b, 55) F
ffd0: 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
ffe0: 31 29 0a 7d 20 69 6e 74 65 67 65 72 20 34 0a 0a  1).} integer 4..
fff0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
10000 2d 34 36 38 39 39 2d 35 33 37 36 35 20 41 20 53  -46899-53765 A S
10010 45 4c 45 43 54 20 75 73 65 64 20 61 73 20 61 20  ELECT used as a 
10020 73 63 61 6c 61 72 20 71 75 61 6e 74 69 74 79 20  scalar quantity 
10030 6d 75 73 74 0a 23 20 72 65 74 75 72 6e 20 61 20  must.# return a 
10040 72 65 73 75 6c 74 20 73 65 74 20 77 69 74 68 20  result set with 
10050 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
10060 0a 23 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  .#.# The followi
10070 6e 67 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 74  ng block tests t
10080 68 61 74 20 65 72 72 6f 72 73 20 61 72 65 20 72  hat errors are r
10090 65 74 75 72 6e 65 64 20 69 6e 20 61 20 62 75 6e  eturned in a bun
100a0 63 68 20 6f 66 20 63 61 73 65 73 0a 23 20 77 68  ch of cases.# wh
100b0 65 72 65 20 61 20 73 75 62 71 75 65 72 79 20 72  ere a subquery r
100c0 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
100d0 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 73   one column..#.s
100e0 65 74 20 4d 20 7b 6f 6e 6c 79 20 61 20 73 69 6e  et M {only a sin
100f0 67 6c 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77  gle result allow
10100 65 64 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  ed for a SELECT 
10110 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
10120 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 7d 0a 66  an expression}.f
10130 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20  oreach {tn sql} 
10140 7b 0a 20 20 31 20 20 20 20 20 7b 20 53 45 4c 45  {.  1     { SELE
10150 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  CT (SELECT * FRO
10160 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t2 UNION SELEC
10170 54 20 61 2b 31 2c 20 62 2b 31 20 46 52 4f 4d 20  T a+1, b+1 FROM 
10180 74 32 29 20 7d 0a 20 20 32 20 20 20 20 20 7b 20  t2) }.  2     { 
10190 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 2a  SELECT (SELECT *
101a0 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
101b0 45 4c 45 43 54 20 61 2b 31 2c 20 62 2b 31 20 46  ELECT a+1, b+1 F
101c0 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
101d0 31 29 20 7d 0a 20 20 33 20 20 20 20 20 7b 20 53  1) }.  3     { S
101e0 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 31 2c  ELECT (SELECT 1,
101f0 20 32 29 20 7d 0a 20 20 34 20 20 20 20 20 7b 20   2) }.  4     { 
10200 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 4e  SELECT (SELECT N
10210 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
10220 20 7d 0a 20 20 35 20 20 20 20 20 7b 20 53 45 4c   }.  5     { SEL
10230 45 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46 52  ECT (SELECT * FR
10240 4f 4d 20 74 32 29 20 7d 0a 20 20 36 20 20 20 20  OM t2) }.  6    
10250 20 7b 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43   { SELECT (SELEC
10260 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
10270 20 31 2c 20 32 2c 20 33 29 29 20 7d 0a 7d 20 7b   1, 2, 3)) }.} {
10280 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  .  do_catchsql_t
10290 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 32 2e  est e_expr-35.2.
102a0 24 74 6e 20 24 73 71 6c 20 5b 6c 69 73 74 20 31  $tn $sql [list 1
102b0 20 24 4d 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e   $M].}..# EVIDEN
102c0 43 45 2d 4f 46 3a 20 52 2d 33 35 37 36 34 2d 32  CE-OF: R-35764-2
102d0 38 30 34 31 20 54 68 65 20 72 65 73 75 6c 74 20  8041 The result 
102e0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
102f0 6e 20 69 73 20 74 68 65 20 76 61 6c 75 65 0a 23  n is the value.#
10300 20 6f 66 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c   of the only col
10310 75 6d 6e 20 69 6e 20 74 68 65 20 66 69 72 73 74  umn in the first
10320 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79   row returned by
10330 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
10340 65 6d 65 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45  ement..#.# EVIDE
10350 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 38 39 38 2d  NCE-OF: R-41898-
10360 30 36 36 38 36 20 49 66 20 74 68 65 20 53 45 4c  06686 If the SEL
10370 45 43 54 20 79 69 65 6c 64 73 20 6d 6f 72 65 20  ECT yields more 
10380 74 68 61 6e 20 6f 6e 65 20 72 65 73 75 6c 74 0a  than one result.
10390 23 20 72 6f 77 2c 20 61 6c 6c 20 72 6f 77 73 20  # row, all rows 
103a0 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
103b0 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64  are ignored..#.d
103c0 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
103d0 5f 65 78 70 72 2d 33 36 2e 33 2e 31 20 7b 0a 20  _expr-36.3.1 {. 
103e0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34   CREATE TABLE t4
103f0 28 78 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52 54  (x, y);.  INSERT
10400 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
10410 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53  1, 'one');.  INS
10420 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
10430 45 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20  ES(2, 'two');.  
10440 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
10450 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65 27  ALUES(3, 'three'
10460 29 3b 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68  );.} {}..foreach
10470 20 7b 74 6e 20 65 78 70 72 20 72 65 73 74 79 70   {tn expr restyp
10480 65 20 72 65 73 76 61 6c 7d 20 7b 0a 20 20 20 20  e resval} {.    
10490 32 20 20 7b 20 28 20 53 45 4c 45 43 54 20 78 20  2  { ( SELECT x 
104a0 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20 42 59  FROM t4 ORDER BY
104b0 20 78 20 29 20 20 20 20 20 20 7d 20 20 20 20 20   x )      }     
104c0 20 20 20 69 6e 74 65 67 65 72 20 31 0a 20 20 20     integer 1.   
104d0 20 33 20 20 7b 20 28 20 53 45 4c 45 43 54 20 78   3  { ( SELECT x
104e0 20 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20 42   FROM t4 ORDER B
104f0 59 20 79 20 29 20 20 20 20 20 20 7d 20 20 20 20  Y y )      }    
10500 20 20 20 20 69 6e 74 65 67 65 72 20 31 0a 20 20      integer 1.  
10510 20 20 34 20 20 7b 20 28 20 53 45 4c 45 43 54 20    4  { ( SELECT 
10520 78 20 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20  x FROM t4 ORDER 
10530 42 59 20 78 20 44 45 53 43 20 29 20 7d 20 20 20  BY x DESC ) }   
10540 20 20 20 20 20 69 6e 74 65 67 65 72 20 33 0a 20       integer 3. 
10550 20 20 20 35 20 20 7b 20 28 20 53 45 4c 45 43 54     5  { ( SELECT
10560 20 78 20 46 52 4f 4d 20 74 34 20 4f 52 44 45 52   x FROM t4 ORDER
10570 20 42 59 20 79 20 44 45 53 43 20 29 20 7d 20 20   BY y DESC ) }  
10580 20 20 20 20 20 20 69 6e 74 65 67 65 72 20 32 0a        integer 2.
10590 20 20 20 20 36 20 20 7b 20 28 20 53 45 4c 45 43      6  { ( SELEC
105a0 54 20 79 20 46 52 4f 4d 20 74 34 20 4f 52 44 45  T y FROM t4 ORDE
105b0 52 20 42 59 20 79 20 44 45 53 43 20 29 20 7d 20  R BY y DESC ) } 
105c0 20 20 20 20 20 20 20 74 65 78 74 20 20 20 20 74         text    t
105d0 77 6f 0a 0a 20 20 20 20 37 20 20 7b 20 28 20 53  wo..    7  { ( S
105e0 45 4c 45 43 54 20 73 75 6d 28 78 29 20 46 52 4f  ELECT sum(x) FRO
105f0 4d 20 74 34 20 29 20 20 20 20 20 20 20 20 20 20  M t4 )          
10600 20 7d 20 20 20 20 20 20 20 20 20 69 6e 74 65 67   }         integ
10610 65 72 20 36 0a 20 20 20 20 38 20 20 7b 20 28 20  er 6.    8  { ( 
10620 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
10630 63 61 74 28 79 2c 27 27 29 20 46 52 4f 4d 20 74  cat(y,'') FROM t
10640 34 20 29 20 7d 20 20 20 20 20 20 20 74 65 78 74  4 ) }       text
10650 20 20 20 20 6f 6e 65 74 77 6f 74 68 72 65 65 0a      onetwothree.
10660 20 20 20 20 39 20 20 7b 20 28 20 53 45 4c 45 43      9  { ( SELEC
10670 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 74 34  T max(x) FROM t4
10680 20 57 48 45 52 45 20 79 20 4c 49 4b 45 20 27 5f   WHERE y LIKE '_
10690 5f 5f 27 29 20 7d 20 69 6e 74 65 67 65 72 20 32  __') } integer 2
106a0 20 0a 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70 72   ..} {.  do_expr
106b0 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 36 2e  _test e_expr-36.
106c0 33 2e 24 74 6e 20 24 65 78 70 72 20 24 72 65 73  3.$tn $expr $res
106d0 74 79 70 65 20 24 72 65 73 76 61 6c 0a 7d 0a 0a  type $resval.}..
106e0 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
106f0 2d 32 35 34 39 32 2d 34 31 35 37 32 20 49 66 20  -25492-41572 If 
10700 74 68 65 20 53 45 4c 45 43 54 20 79 69 65 6c 64  the SELECT yield
10710 73 20 6e 6f 20 72 6f 77 73 2c 20 74 68 65 6e 20  s no rows, then 
10720 74 68 65 0a 23 20 76 61 6c 75 65 20 6f 66 20 74  the.# value of t
10730 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
10740 20 4e 55 4c 4c 2e 0a 23 0a 66 6f 72 65 61 63 68   NULL..#.foreach
10750 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20   {tn expr} {.   
10760 20 31 20 20 7b 20 28 20 53 45 4c 45 43 54 20 78   1  { ( SELECT x
10770 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 78   FROM t4 WHERE x
10780 3e 33 20 4f 52 44 45 52 20 42 59 20 78 20 29 20  >3 ORDER BY x ) 
10790 20 20 20 20 20 7d 0a 20 20 20 20 32 20 20 7b 20       }.    2  { 
107a0 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20  ( SELECT x FROM 
107b0 74 34 20 57 48 45 52 45 20 79 3c 27 6f 6e 65 27  t4 WHERE y<'one'
107c0 20 4f 52 44 45 52 20 42 59 20 79 20 29 20 20 7d   ORDER BY y )  }
107d0 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70 72 5f 74  .} {.  do_expr_t
107e0 65 73 74 20 65 5f 65 78 70 72 2d 33 36 2e 34 2e  est e_expr-36.4.
107f0 24 74 6e 20 24 65 78 70 72 20 6e 75 6c 6c 20 7b  $tn $expr null {
10800 7d 0a 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73  }.}...finish_tes
10810 74 0a                                            t.