/ Hex Artifact Content
Login

Artifact 5bc5c9a9eca98ae9a2be449869be7dea5105ed9b:


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 69 66 20   db test.db..if 
9ac0: 30 20 7b 0a 23 20 78 78 78 78 45 56 49 44 45 4e  0 {.# xxxxEVIDEN
9ad0: 43 45 2d 4f 46 3a 20 52 2d 34 31 36 35 30 2d 32  CE-OF: R-41650-2
9ae0: 30 38 37 32 20 4e 6f 20 72 65 67 65 78 70 28 29  0872 No regexp()
9af0: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 69   user function i
9b00: 73 20 64 65 66 69 6e 65 64 20 62 79 0a 23 20 64  s defined by.# d
9b10: 65 66 61 75 6c 74 20 61 6e 64 20 73 6f 20 75 73  efault and so us
9b20: 65 20 6f 66 20 74 68 65 20 52 45 47 45 58 50 20  e of the REGEXP 
9b30: 6f 70 65 72 61 74 6f 72 20 77 69 6c 6c 20 6e 6f  operator will no
9b40: 72 6d 61 6c 6c 79 20 72 65 73 75 6c 74 20 69 6e  rmally result in
9b50: 20 61 6e 0a 23 20 65 72 72 6f 72 20 6d 65 73 73   an.# error mess
9b60: 61 67 65 2e 0a 23 0a 23 20 20 20 54 68 65 72 65  age..#.#   There
9b70: 20 69 73 20 61 20 72 65 67 65 78 70 20 66 75 6e   is a regexp fun
9b80: 63 74 69 6f 6e 20 69 66 20 49 43 55 20 69 73 20  ction if ICU is 
9b90: 65 6e 61 62 6c 65 64 20 74 68 6f 75 67 68 2e 0a  enabled though..
9ba0: 23 0a 69 66 63 61 70 61 62 6c 65 20 21 69 63 75  #.ifcapable !icu
9bb0: 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c   {.  do_catchsql
9bc0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 38 2e  _test e_expr-18.
9bd0: 31 2e 31 20 7b 20 0a 20 20 20 20 53 45 4c 45 43  1.1 { .    SELEC
9be0: 54 20 72 65 67 65 78 70 28 27 61 62 63 27 2c 20  T regexp('abc', 
9bf0: 27 64 65 66 27 29 20 0a 20 20 7d 20 7b 31 20 7b  'def') .  } {1 {
9c00: 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e  no such function
9c10: 3a 20 72 65 67 65 78 70 7d 7d 0a 20 20 64 6f 5f  : regexp}}.  do_
9c20: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f  catchsql_test e_
9c30: 65 78 70 72 2d 31 38 2e 31 2e 32 20 7b 20 0a 20  expr-18.1.2 { . 
9c40: 20 20 20 53 45 4c 45 43 54 20 27 61 62 63 27 20     SELECT 'abc' 
9c50: 52 45 47 45 58 50 20 27 64 65 66 27 0a 20 20 7d  REGEXP 'def'.  }
9c60: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e   {1 {no such fun
9c70: 63 74 69 6f 6e 3a 20 52 45 47 45 58 50 7d 7d 0a  ction: REGEXP}}.
9c80: 7d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  }.}..# EVIDENCE-
9c90: 4f 46 3a 20 52 2d 33 33 36 39 33 2d 35 30 31 38  OF: R-33693-5018
9ca0: 30 20 54 68 65 20 52 45 47 45 58 50 20 6f 70 65  0 The REGEXP ope
9cb0: 72 61 74 6f 72 20 69 73 20 61 20 73 70 65 63 69  rator is a speci
9cc0: 61 6c 20 73 79 6e 74 61 78 20 66 6f 72 0a 23 20  al syntax for.# 
9cd0: 74 68 65 20 72 65 67 65 78 70 28 29 20 75 73 65  the regexp() use
9ce0: 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 23 20  r function..#.# 
9cf0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
9d00: 37 32 38 39 2d 31 33 35 37 38 20 49 66 20 61 20  7289-13578 If a 
9d10: 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69  application-defi
9d20: 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ned SQL function
9d30: 20 6e 61 6d 65 64 0a 23 20 22 72 65 67 65 78 70   named.# "regexp
9d40: 22 20 69 73 20 61 64 64 65 64 20 61 74 20 72 75  " is added at ru
9d50: 6e 2d 74 69 6d 65 2c 20 74 68 61 74 20 66 75 6e  n-time, that fun
9d60: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 61  ction will be ca
9d70: 6c 6c 65 64 20 69 6e 20 6f 72 64 65 72 0a 23 20  lled in order.# 
9d80: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
9d90: 20 52 45 47 45 58 50 20 6f 70 65 72 61 74 6f 72   REGEXP operator
9da0: 2e 0a 23 0a 70 72 6f 63 20 72 65 67 65 78 70 66  ..#.proc regexpf
9db0: 75 6e 63 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65  unc {args} {.  e
9dc0: 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a 3a 72 65  val lappend ::re
9dd0: 67 65 78 70 61 72 67 73 20 24 61 72 67 73 0a 20  gexpargs $args. 
9de0: 20 72 65 74 75 72 6e 20 31 0a 7d 0a 64 62 20 66   return 1.}.db f
9df0: 75 6e 63 20 72 65 67 65 78 70 20 2d 61 72 67 63  unc regexp -argc
9e00: 6f 75 6e 74 20 32 20 72 65 67 65 78 70 66 75 6e  ount 2 regexpfun
9e10: 63 0a 73 65 74 20 3a 3a 72 65 67 65 78 70 61 72  c.set ::regexpar
9e20: 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65  gs [list].do_exe
9e30: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
9e40: 2d 31 38 2e 32 2e 31 20 7b 20 53 45 4c 45 43 54  -18.2.1 { SELECT
9e50: 20 27 61 62 63 27 20 52 45 47 45 58 50 20 27 64   'abc' REGEXP 'd
9e60: 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73 74 20  ef' } 1.do_test 
9e70: 20 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31          e_expr-1
9e80: 38 2e 32 2e 32 20 7b 20 73 65 74 20 72 65 67 65  8.2.2 { set rege
9e90: 78 70 61 72 67 73 20 7d 20 7b 64 65 66 20 61 62  xpargs } {def ab
9ea0: 63 7d 0a 73 65 74 20 3a 3a 72 65 67 65 78 70 61  c}.set ::regexpa
9eb0: 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  rgs [list].do_ex
9ec0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
9ed0: 72 2d 31 38 2e 32 2e 33 20 7b 20 53 45 4c 45 43  r-18.2.3 { SELEC
9ee0: 54 20 27 58 27 20 4e 4f 54 20 52 45 47 45 58 50  T 'X' NOT REGEXP
9ef0: 20 27 59 27 20 7d 20 30 0a 64 6f 5f 74 65 73 74   'Y' } 0.do_test
9f00: 20 20 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d           e_expr-
9f10: 31 38 2e 32 2e 34 20 7b 20 73 65 74 20 72 65 67  18.2.4 { set reg
9f20: 65 78 70 61 72 67 73 20 7d 20 7b 59 20 58 7d 0a  expargs } {Y X}.
9f30: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
9f40: 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  db..# EVIDENCE-O
9f50: 46 3a 20 52 2d 34 32 30 33 37 2d 33 37 38 32 36  F: R-42037-37826
9f60: 20 54 68 65 20 64 65 66 61 75 6c 74 20 6d 61 74   The default mat
9f70: 63 68 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6d  ch() function im
9f80: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 23 20 72  plementation.# r
9f90: 61 69 73 65 73 20 61 6e 20 65 78 63 65 70 74 69  aises an excepti
9fa0: 6f 6e 20 61 6e 64 20 69 73 20 6e 6f 74 20 72 65  on and is not re
9fb0: 61 6c 6c 79 20 75 73 65 66 75 6c 20 66 6f 72 20  ally useful for 
9fc0: 61 6e 79 74 68 69 6e 67 2e 0a 23 0a 64 6f 5f 63  anything..#.do_c
9fd0: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65  atchsql_test e_e
9fe0: 78 70 72 2d 31 39 2e 31 2e 31 20 7b 20 0a 20 20  xpr-19.1.1 { .  
9ff0: 53 45 4c 45 43 54 20 27 61 62 63 27 20 4d 41 54  SELECT 'abc' MAT
a000: 43 48 20 27 64 65 66 27 20 0a 7d 20 7b 31 20 7b  CH 'def' .} {1 {
a010: 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75  unable to use fu
a020: 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20  nction MATCH in 
a030: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
a040: 6e 74 65 78 74 7d 7d 0a 64 6f 5f 63 61 74 63 68  ntext}}.do_catch
a050: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
a060: 31 39 2e 31 2e 32 20 7b 20 0a 20 20 53 45 4c 45  19.1.2 { .  SELE
a070: 43 54 20 6d 61 74 63 68 28 27 61 62 63 27 2c 20  CT match('abc', 
a080: 27 64 65 66 27 29 0a 7d 20 7b 31 20 7b 75 6e 61  'def').} {1 {una
a090: 62 6c 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74  ble to use funct
a0a0: 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74 68 65  ion MATCH in the
a0b0: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6e 74 65   requested conte
a0c0: 78 74 7d 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  xt}}..# EVIDENCE
a0d0: 2d 4f 46 3a 20 52 2d 33 37 39 31 36 2d 34 37 34  -OF: R-37916-474
a0e0: 30 37 20 54 68 65 20 4d 41 54 43 48 20 6f 70 65  07 The MATCH ope
a0f0: 72 61 74 6f 72 20 69 73 20 61 20 73 70 65 63 69  rator is a speci
a100: 61 6c 20 73 79 6e 74 61 78 20 66 6f 72 0a 23 20  al syntax for.# 
a110: 74 68 65 20 6d 61 74 63 68 28 29 20 61 70 70 6c  the match() appl
a120: 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20  ication-defined 
a130: 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 23 20 45 56  function..#.# EV
a140: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 30  IDENCE-OF: R-060
a150: 32 31 2d 30 39 33 37 33 20 42 75 74 20 65 78 74  21-09373 But ext
a160: 65 6e 73 69 6f 6e 73 20 63 61 6e 20 6f 76 65 72  ensions can over
a170: 72 69 64 65 20 74 68 65 20 6d 61 74 63 68 28 29  ride the match()
a180: 0a 23 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  .# function with
a190: 20 6d 6f 72 65 20 68 65 6c 70 66 75 6c 20 6c 6f   more helpful lo
a1a0: 67 69 63 2e 0a 23 0a 70 72 6f 63 20 6d 61 74 63  gic..#.proc matc
a1b0: 68 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b 0a 20  hfunc {args} {. 
a1c0: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a 3a   eval lappend ::
a1d0: 6d 61 74 63 68 61 72 67 73 20 24 61 72 67 73 0a  matchargs $args.
a1e0: 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a 64 62 20    return 1.}.db 
a1f0: 66 75 6e 63 20 6d 61 74 63 68 20 2d 61 72 67 63  func match -argc
a200: 6f 75 6e 74 20 32 20 6d 61 74 63 68 66 75 6e 63  ount 2 matchfunc
a210: 0a 73 65 74 20 3a 3a 6d 61 74 63 68 61 72 67 73  .set ::matchargs
a220: 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73   [list].do_execs
a230: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
a240: 39 2e 32 2e 31 20 7b 20 53 45 4c 45 43 54 20 27  9.2.1 { SELECT '
a250: 61 62 63 27 20 4d 41 54 43 48 20 27 64 65 66 27  abc' MATCH 'def'
a260: 20 7d 20 31 0a 64 6f 5f 74 65 73 74 20 20 20 20   } 1.do_test    
a270: 20 20 20 20 20 65 5f 65 78 70 72 2d 31 39 2e 32       e_expr-19.2
a280: 2e 32 20 7b 20 73 65 74 20 6d 61 74 63 68 61 72  .2 { set matchar
a290: 67 73 20 7d 20 7b 64 65 66 20 61 62 63 7d 0a 73  gs } {def abc}.s
a2a0: 65 74 20 3a 3a 6d 61 74 63 68 61 72 67 73 20 5b  et ::matchargs [
a2b0: 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c  list].do_execsql
a2c0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 39 2e  _test e_expr-19.
a2d0: 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 58 27  2.3 { SELECT 'X'
a2e0: 20 4e 4f 54 20 4d 41 54 43 48 20 27 59 27 20 7d   NOT MATCH 'Y' }
a2f0: 20 30 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20   0.do_test      
a300: 20 20 20 65 5f 65 78 70 72 2d 31 39 2e 32 2e 34     e_expr-19.2.4
a310: 20 7b 20 73 65 74 20 6d 61 74 63 68 61 72 67 73   { set matchargs
a320: 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69 74 65 33   } {Y X}.sqlite3
a330: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 23 2d 2d   db test.db..#--
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 2d 2d 2d 2d 2d 2d  ----------------
a380: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 63  -------.# Test c
a390: 61 73 65 73 20 66 6f 72 20 74 68 65 20 74 65 73  ases for the tes
a3a0: 74 61 62 6c 65 20 73 74 61 74 65 6d 65 6e 74 73  table statements
a3b0: 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
a3c0: 43 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 2e  CASE expression.
a3d0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
a3e0: 3a 20 52 2d 31 35 31 39 39 2d 36 31 33 38 39 20  : R-15199-61389 
a3f0: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 62 61  There are two ba
a400: 73 69 63 20 66 6f 72 6d 73 20 6f 66 20 74 68 65  sic forms of the
a410: 20 43 41 53 45 0a 23 20 65 78 70 72 65 73 73 69   CASE.# expressi
a420: 6f 6e 3a 20 74 68 6f 73 65 20 77 69 74 68 20 61  on: those with a
a430: 20 62 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e   base expression
a440: 20 61 6e 64 20 74 68 6f 73 65 20 77 69 74 68 6f   and those witho
a450: 75 74 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ut..#.do_execsql
a460: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 30 2e  _test e_expr-20.
a470: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  1 {.  SELECT CAS
a480: 45 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27 74  E WHEN 1 THEN 't
a490: 72 75 65 27 20 57 48 45 4e 20 30 20 54 48 45 4e  rue' WHEN 0 THEN
a4a0: 20 27 66 61 6c 73 65 27 20 45 4c 53 45 20 27 65   'false' ELSE 'e
a4b0: 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75  lse' END;.} {tru
a4c0: 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e}.do_execsql_te
a4d0: 73 74 20 65 5f 65 78 70 72 2d 32 30 2e 32 20 7b  st e_expr-20.2 {
a4e0: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 30  .  SELECT CASE 0
a4f0: 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27 74 72   WHEN 1 THEN 'tr
a500: 75 65 27 20 57 48 45 4e 20 30 20 54 48 45 4e 20  ue' WHEN 0 THEN 
a510: 27 66 61 6c 73 65 27 20 45 4c 53 45 20 27 65 6c  'false' ELSE 'el
a520: 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66 61 6c 73  se' END;.} {fals
a530: 65 7d 0a 0a 70 72 6f 63 20 76 61 72 20 7b 6e 6d  e}..proc var {nm
a540: 7d 20 7b 0a 20 20 6c 61 70 70 65 6e 64 20 3a 3a  } {.  lappend ::
a550: 76 61 72 6c 69 73 74 20 24 6e 6d 0a 20 20 72 65  varlist $nm.  re
a560: 74 75 72 6e 20 5b 73 65 74 20 22 3a 3a 24 6e 6d  turn [set "::$nm
a570: 22 5d 0a 7d 0a 64 62 20 66 75 6e 63 20 76 61 72  "].}.db func var
a580: 20 76 61 72 0a 0a 23 20 45 56 49 44 45 4e 43 45   var..# EVIDENCE
a590: 2d 4f 46 3a 20 52 2d 33 30 36 33 38 2d 35 39 39  -OF: R-30638-599
a5a0: 35 34 20 49 6e 20 61 20 43 41 53 45 20 77 69 74  54 In a CASE wit
a5b0: 68 6f 75 74 20 61 20 62 61 73 65 20 65 78 70 72  hout a base expr
a5c0: 65 73 73 69 6f 6e 2c 20 65 61 63 68 0a 23 20 57  ession, each.# W
a5d0: 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  HEN expression i
a5e0: 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  s evaluated and 
a5f0: 74 68 65 20 72 65 73 75 6c 74 20 74 72 65 61 74  the result treat
a600: 65 64 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2c  ed as a boolean,
a610: 0a 23 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  .# starting with
a620: 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 61 6e   the leftmost an
a630: 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
a640: 74 68 65 20 72 69 67 68 74 2e 0a 23 0a 66 6f 72  the right..#.for
a650: 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20  each {a b c} {0 
a660: 30 20 30 7d 20 62 72 65 61 6b 0a 73 65 74 20 76  0 0} break.set v
a670: 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f  arlist [list].do
a680: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
a690: 65 78 70 72 2d 32 31 2e 31 2e 31 20 7b 0a 20 20  expr-21.1.1 {.  
a6a0: 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
a6b0: 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20 27   var('a') THEN '
a6c0: 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  A' .            
a6d0: 20 20 57 48 45 4e 20 76 61 72 28 27 62 27 29 20    WHEN var('b') 
a6e0: 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20  THEN 'B' .      
a6f0: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
a700: 28 27 63 27 29 20 54 48 45 4e 20 27 43 27 20 45  ('c') THEN 'C' E
a710: 4e 44 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f 74 65 73  ND.} {{}}.do_tes
a720: 74 20 65 5f 65 78 70 72 2d 32 31 2e 31 2e 32 20  t e_expr-21.1.2 
a730: 7b 20 73 65 74 20 76 61 72 6c 69 73 74 20 7d 20  { set varlist } 
a740: 7b 61 20 62 20 63 7d 0a 73 65 74 20 76 61 72 6c  {a b c}.set varl
a750: 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  ist [list].do_ex
a760: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
a770: 72 2d 32 31 2e 31 2e 33 20 7b 0a 20 20 53 45 4c  r-21.1.3 {.  SEL
a780: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61  ECT CASE WHEN va
a790: 72 28 27 63 27 29 20 54 48 45 4e 20 27 43 27 20  r('c') THEN 'C' 
a7a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
a7b0: 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45  HEN var('b') THE
a7c0: 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20  N 'B' .         
a7d0: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 61       WHEN var('a
a7e0: 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20  ') THEN 'A' .   
a7f0: 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20             ELSE 
a800: 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20 45 4e  'no result'.  EN
a810: 44 0a 7d 20 7b 7b 6e 6f 20 72 65 73 75 6c 74 7d  D.} {{no result}
a820: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72  }.do_test e_expr
a830: 2d 32 31 2e 31 2e 34 20 7b 20 73 65 74 20 76 61  -21.1.4 { set va
a840: 72 6c 69 73 74 20 7d 20 7b 63 20 62 20 61 7d 0a  rlist } {c b a}.
a850: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
a860: 52 2d 33 39 30 30 39 2d 32 35 35 39 36 20 54 68  R-39009-25596 Th
a870: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
a880: 43 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20  CASE expression 
a890: 69 73 20 74 68 65 0a 23 20 65 76 61 6c 75 61 74  is the.# evaluat
a8a0: 69 6f 6e 20 6f 66 20 74 68 65 20 54 48 45 4e 20  ion of the THEN 
a8b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
a8c0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
a8d0: 68 65 20 66 69 72 73 74 20 57 48 45 4e 0a 23 20  he first WHEN.# 
a8e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
a8f0: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75  evaluates to tru
a900: 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 61 20  e..#.foreach {a 
a910: 62 20 63 7d 20 7b 30 20 31 20 30 7d 20 62 72 65  b c} {0 1 0} bre
a920: 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  ak.do_execsql_te
a930: 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 32 2e 31  st e_expr-21.2.1
a940: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
a950: 20 57 48 45 4e 20 76 61 72 28 27 61 27 29 20 54   WHEN var('a') T
a960: 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20  HEN 'A' .       
a970: 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28         WHEN var(
a980: 27 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20  'b') THEN 'B' . 
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
a9a0: 4e 20 76 61 72 28 27 63 27 29 20 54 48 45 4e 20  N var('c') THEN 
a9b0: 27 43 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'C' .           
a9c0: 20 20 20 45 4c 53 45 20 27 6e 6f 20 72 65 73 75     ELSE 'no resu
a9d0: 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 42 7d 0a  lt'.  END.} {B}.
a9e0: 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20  foreach {a b c} 
a9f0: 7b 30 20 31 20 31 7d 20 62 72 65 61 6b 0a 64 6f  {0 1 1} break.do
aa00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
aa10: 65 78 70 72 2d 32 31 2e 32 2e 32 20 7b 0a 20 20  expr-21.2.2 {.  
aa20: 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
aa30: 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20 27   var('a') THEN '
aa40: 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  A' .            
aa50: 20 20 57 48 45 4e 20 76 61 72 28 27 62 27 29 20    WHEN var('b') 
aa60: 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20  THEN 'B' .      
aa70: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
aa80: 28 27 63 27 29 20 54 48 45 4e 20 27 43 27 0a 20  ('c') THEN 'C'. 
aa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c 53               ELS
aaa0: 45 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20  E 'no result'.  
aab0: 45 4e 44 0a 7d 20 7b 42 7d 0a 66 6f 72 65 61 63  END.} {B}.foreac
aac0: 68 20 7b 61 20 62 20 63 7d 20 7b 30 20 30 20 31  h {a b c} {0 0 1
aad0: 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73  } break.do_execs
aae0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
aaf0: 31 2e 32 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  1.2.3 {.  SELECT
ab00: 20 43 41 53 45 20 57 48 45 4e 20 76 61 72 28 27   CASE WHEN var('
ab10: 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20  a') THEN 'A' .  
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e              WHEN
ab30: 20 76 61 72 28 27 62 27 29 20 54 48 45 4e 20 27   var('b') THEN '
ab40: 42 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  B' .            
ab50: 20 20 57 48 45 4e 20 76 61 72 28 27 63 27 29 20    WHEN var('c') 
ab60: 54 48 45 4e 20 27 43 27 0a 20 20 20 20 20 20 20  THEN 'C'.       
ab70: 20 20 20 20 20 20 20 45 4c 53 45 20 27 6e 6f 20         ELSE 'no 
ab80: 72 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20  result'.  END.} 
ab90: 7b 43 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  {C}..# EVIDENCE-
aba0: 4f 46 3a 20 52 2d 32 34 32 32 37 2d 30 34 38 30  OF: R-24227-0480
abb0: 37 20 4f 72 2c 20 69 66 20 6e 6f 6e 65 20 6f 66  7 Or, if none of
abc0: 20 74 68 65 20 57 48 45 4e 20 65 78 70 72 65 73   the WHEN expres
abd0: 73 69 6f 6e 73 0a 23 20 65 76 61 6c 75 61 74 65  sions.# evaluate
abe0: 20 74 6f 20 74 72 75 65 2c 20 74 68 65 20 72 65   to true, the re
abf0: 73 75 6c 74 20 6f 66 20 65 76 61 6c 75 61 74 69  sult of evaluati
ac00: 6e 67 20 74 68 65 20 45 4c 53 45 20 65 78 70 72  ng the ELSE expr
ac10: 65 73 73 69 6f 6e 2c 20 69 66 0a 23 20 61 6e 79  ession, if.# any
ac20: 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 61 20 62  ..#.foreach {a b
ac30: 20 63 7d 20 7b 30 20 30 20 30 7d 20 62 72 65 61   c} {0 0 0} brea
ac40: 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  k.do_execsql_tes
ac50: 74 20 65 5f 65 78 70 72 2d 32 31 2e 33 2e 31 20  t e_expr-21.3.1 
ac60: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
ac70: 57 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48  WHEN var('a') TH
ac80: 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20  EN 'A' .        
ac90: 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27        WHEN var('
aca0: 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20  b') THEN 'B' .  
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e              WHEN
acc0: 20 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27   var('c') THEN '
acd0: 43 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C'.             
ace0: 20 45 4c 53 45 20 27 6e 6f 20 72 65 73 75 6c 74   ELSE 'no result
acf0: 27 0a 20 20 45 4e 44 0a 7d 20 7b 7b 6e 6f 20 72  '.  END.} {{no r
ad00: 65 73 75 6c 74 7d 7d 0a 0a 23 20 45 56 49 44 45  esult}}..# EVIDE
ad10: 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 31 36 38 2d  NCE-OF: R-14168-
ad20: 30 37 35 37 39 20 49 66 20 74 68 65 72 65 20 69  07579 If there i
ad30: 73 20 6e 6f 20 45 4c 53 45 20 65 78 70 72 65 73  s no ELSE expres
ad40: 73 69 6f 6e 20 61 6e 64 20 6e 6f 6e 65 20 6f 66  sion and none of
ad50: 0a 23 20 74 68 65 20 57 48 45 4e 20 65 78 70 72  .# the WHEN expr
ad60: 65 73 73 69 6f 6e 73 20 61 72 65 20 74 72 75 65  essions are true
ad70: 2c 20 74 68 65 6e 20 74 68 65 20 6f 76 65 72 61  , then the overa
ad80: 6c 6c 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c  ll result is NUL
ad90: 4c 2e 0a 23 0a 64 62 20 6e 75 6c 6c 76 61 6c 75  L..#.db nullvalu
ada0: 65 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71  e null.do_execsq
adb0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31  l_test e_expr-21
adc0: 2e 33 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .3.2 {.  SELECT 
add0: 43 41 53 45 20 57 48 45 4e 20 76 61 72 28 27 61  CASE WHEN var('a
ade0: 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20  ') THEN 'A' .   
adf0: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
ae00: 76 61 72 28 27 62 27 29 20 54 48 45 4e 20 27 42  var('b') THEN 'B
ae10: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
ae20: 20 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54   WHEN var('c') T
ae30: 48 45 4e 20 27 43 27 0a 20 20 45 4e 44 0a 7d 20  HEN 'C'.  END.} 
ae40: 7b 6e 75 6c 6c 7d 0a 64 62 20 6e 75 6c 6c 76 61  {null}.db nullva
ae50: 6c 75 65 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e  lue {}..# EVIDEN
ae60: 43 45 2d 4f 46 3a 20 52 2d 31 33 39 34 33 2d 31  CE-OF: R-13943-1
ae70: 33 35 39 32 20 41 20 4e 55 4c 4c 20 72 65 73 75  3592 A NULL resu
ae80: 6c 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  lt is considered
ae90: 20 75 6e 74 72 75 65 20 77 68 65 6e 0a 23 20 65   untrue when.# e
aea0: 76 61 6c 75 61 74 69 6e 67 20 57 48 45 4e 20 74  valuating WHEN t
aeb0: 65 72 6d 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  erms..#.do_execs
aec0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
aed0: 31 2e 34 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  1.4.1 {.  SELECT
aee0: 20 43 41 53 45 20 57 48 45 4e 20 4e 55 4c 4c 20   CASE WHEN NULL 
aef0: 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 31 20  THEN 'A' WHEN 1 
af00: 54 48 45 4e 20 27 42 27 20 45 4e 44 0a 7d 20 7b  THEN 'B' END.} {
af10: 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  B}.do_execsql_te
af20: 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 34 2e 32  st e_expr-21.4.2
af30: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
af40: 20 57 48 45 4e 20 30 20 54 48 45 4e 20 27 41 27   WHEN 0 THEN 'A'
af50: 20 57 48 45 4e 20 4e 55 4c 4c 20 54 48 45 4e 20   WHEN NULL THEN 
af60: 27 42 27 20 45 4c 53 45 20 27 43 27 20 45 4e 44  'B' ELSE 'C' END
af70: 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56 49 44 45 4e  .} {C}..# EVIDEN
af80: 43 45 2d 4f 46 3a 20 52 2d 33 38 36 32 30 2d 31  CE-OF: R-38620-1
af90: 39 34 39 39 20 49 6e 20 61 20 43 41 53 45 20 77  9499 In a CASE w
afa0: 69 74 68 20 61 20 62 61 73 65 20 65 78 70 72 65  ith a base expre
afb0: 73 73 69 6f 6e 2c 20 74 68 65 20 62 61 73 65 0a  ssion, the base.
afc0: 23 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  # expression is 
afd0: 65 76 61 6c 75 61 74 65 64 20 6a 75 73 74 20 6f  evaluated just o
afe0: 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65 73 75  nce and the resu
aff0: 6c 74 20 69 73 20 63 6f 6d 70 61 72 65 64 20 61  lt is compared a
b000: 67 61 69 6e 73 74 0a 23 20 74 68 65 20 65 76 61  gainst.# the eva
b010: 6c 75 61 74 69 6f 6e 20 6f 66 20 65 61 63 68 20  luation of each 
b020: 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  WHEN expression 
b030: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
b040: 68 74 2e 0a 23 0a 23 20 4e 6f 74 65 3a 20 54 68  ht..#.# Note: Th
b050: 69 73 20 74 65 73 74 20 63 61 73 65 20 74 65 73  is test case tes
b060: 74 73 20 74 68 65 20 22 65 76 61 6c 75 61 74 65  ts the "evaluate
b070: 64 20 6a 75 73 74 20 6f 6e 63 65 22 20 70 61 72  d just once" par
b080: 74 20 6f 66 20 74 68 65 20 61 62 6f 76 65 0a 23  t of the above.#
b090: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 65 73 74   statement. Test
b0a0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
b0b0: 68 20 74 68 65 20 6e 65 78 74 20 74 77 6f 20 73  h the next two s
b0c0: 74 61 74 65 6d 65 6e 74 73 20 74 65 73 74 20 74  tatements test t
b0d0: 68 61 74 20 74 68 65 0a 23 20 63 6f 6d 70 61 72  hat the.# compar
b0e0: 69 73 6f 6e 73 20 74 61 6b 65 20 70 6c 61 63 65  isons take place
b0f0: 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 61 20 62  ..#.foreach {a b
b100: 20 63 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20   c} [list [expr 
b110: 33 5d 20 5b 65 78 70 72 20 34 5d 20 5b 65 78 70  3] [expr 4] [exp
b120: 72 20 35 5d 5d 20 62 72 65 61 6b 0a 73 65 74 20  r 5]] break.set 
b130: 3a 3a 76 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d  ::varlist [list]
b140: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
b150: 20 65 5f 65 78 70 72 2d 32 32 2e 31 2e 31 20 7b   e_expr-22.1.1 {
b160: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 76  .  SELECT CASE v
b170: 61 72 28 27 61 27 29 20 57 48 45 4e 20 31 20 54  ar('a') WHEN 1 T
b180: 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32 20 54  HEN 'A' WHEN 2 T
b190: 48 45 4e 20 27 42 27 20 57 48 45 4e 20 33 20 54  HEN 'B' WHEN 3 T
b1a0: 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20 7b 43  HEN 'C' END.} {C
b1b0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72  }.do_test e_expr
b1c0: 2d 32 32 2e 31 2e 32 20 7b 20 73 65 74 20 3a 3a  -22.1.2 { set ::
b1d0: 76 61 72 6c 69 73 74 20 7d 20 7b 61 7d 0a 0a 23  varlist } {a}..#
b1e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
b1f0: 30 37 36 36 37 2d 34 39 35 33 37 20 54 68 65 20  07667-49537 The 
b200: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 43 41  result of the CA
b210: 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  SE expression is
b220: 20 74 68 65 0a 23 20 65 76 61 6c 75 61 74 69 6f   the.# evaluatio
b230: 6e 20 6f 66 20 74 68 65 20 54 48 45 4e 20 65 78  n of the THEN ex
b240: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
b250: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
b260: 20 66 69 72 73 74 20 57 48 45 4e 0a 23 20 65 78   first WHEN.# ex
b270: 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 77 68 69  pression for whi
b280: 63 68 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ch the compariso
b290: 6e 20 69 73 20 74 72 75 65 2e 0a 23 0a 64 6f 5f  n is true..#.do_
b2a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
b2b0: 78 70 72 2d 32 32 2e 32 2e 31 20 7b 0a 20 20 53  xpr-22.2.1 {.  S
b2c0: 45 4c 45 43 54 20 43 41 53 45 20 32 33 20 57 48  ELECT CASE 23 WH
b2d0: 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57 48  EN 1 THEN 'A' WH
b2e0: 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20 57  EN 23 THEN 'B' W
b2f0: 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27 20  HEN 23 THEN 'C' 
b300: 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65  END.} {B}.do_exe
b310: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
b320: 2d 32 32 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45  -22.2.2 {.  SELE
b330: 43 54 20 43 41 53 45 20 31 20 57 48 45 4e 20 31  CT CASE 1 WHEN 1
b340: 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32   THEN 'A' WHEN 2
b350: 33 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20  3 THEN 'B' WHEN 
b360: 32 33 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a  23 THEN 'C' END.
b370: 7d 20 7b 41 7d 0a 0a 23 20 45 56 49 44 45 4e 43  } {A}..# EVIDENC
b380: 45 2d 4f 46 3a 20 52 2d 34 37 35 34 33 2d 33 32  E-OF: R-47543-32
b390: 31 34 35 20 4f 72 2c 20 69 66 20 6e 6f 6e 65 20  145 Or, if none 
b3a0: 6f 66 20 74 68 65 20 57 48 45 4e 20 65 78 70 72  of the WHEN expr
b3b0: 65 73 73 69 6f 6e 73 0a 23 20 65 76 61 6c 75 61  essions.# evalua
b3c0: 74 65 20 74 6f 20 61 20 76 61 6c 75 65 20 65 71  te to a value eq
b3d0: 75 61 6c 20 74 6f 20 74 68 65 20 62 61 73 65 20  ual to the base 
b3e0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
b3f0: 72 65 73 75 6c 74 20 6f 66 0a 23 20 65 76 61 6c  result of.# eval
b400: 75 61 74 69 6e 67 20 74 68 65 20 45 4c 53 45 20  uating the ELSE 
b410: 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 61  expression, if a
b420: 6e 79 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ny..#.do_execsql
b430: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e  _test e_expr-22.
b440: 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  3.1 {.  SELECT C
b450: 41 53 45 20 32 34 20 57 48 45 4e 20 31 20 54 48  ASE 24 WHEN 1 TH
b460: 45 4e 20 27 41 27 20 57 48 45 4e 20 32 33 20 54  EN 'A' WHEN 23 T
b470: 48 45 4e 20 27 42 27 20 57 48 45 4e 20 32 33 20  HEN 'B' WHEN 23 
b480: 54 48 45 4e 20 27 43 27 20 45 4c 53 45 20 27 44  THEN 'C' ELSE 'D
b490: 27 20 45 4e 44 0a 7d 20 7b 44 7d 0a 0a 23 20 45  ' END.} {D}..# E
b4a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34  VIDENCE-OF: R-54
b4b0: 37 32 31 2d 34 38 35 35 37 20 49 66 20 74 68 65  721-48557 If the
b4c0: 72 65 20 69 73 20 6e 6f 20 45 4c 53 45 20 65 78  re is no ELSE ex
b4d0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6e 6f 6e  pression and non
b4e0: 65 20 6f 66 0a 23 20 74 68 65 20 57 48 45 4e 20  e of.# the WHEN 
b4f0: 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 64  expressions prod
b500: 75 63 65 20 61 20 72 65 73 75 6c 74 20 65 71 75  uce a result equ
b510: 61 6c 20 74 6f 20 74 68 65 20 62 61 73 65 20 65  al to the base e
b520: 78 70 72 65 73 73 69 6f 6e 2c 0a 23 20 74 68 65  xpression,.# the
b530: 20 6f 76 65 72 61 6c 6c 20 72 65 73 75 6c 74 20   overall result 
b540: 69 73 20 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f 65 78  is NULL..#.do_ex
b550: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
b560: 72 2d 32 32 2e 34 2e 31 20 7b 0a 20 20 53 45 4c  r-22.4.1 {.  SEL
b570: 45 43 54 20 43 41 53 45 20 32 34 20 57 48 45 4e  ECT CASE 24 WHEN
b580: 20 31 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e   1 THEN 'A' WHEN
b590: 20 32 33 20 54 48 45 4e 20 27 42 27 20 57 48 45   23 THEN 'B' WHE
b5a0: 4e 20 32 33 20 54 48 45 4e 20 27 43 27 20 45 4e  N 23 THEN 'C' EN
b5b0: 44 0a 7d 20 7b 7b 7d 7d 0a 64 62 20 6e 75 6c 6c  D.} {{}}.db null
b5c0: 76 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f 65 78  value null.do_ex
b5d0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
b5e0: 72 2d 32 32 2e 34 2e 32 20 7b 0a 20 20 53 45 4c  r-22.4.2 {.  SEL
b5f0: 45 43 54 20 43 41 53 45 20 32 34 20 57 48 45 4e  ECT CASE 24 WHEN
b600: 20 31 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e   1 THEN 'A' WHEN
b610: 20 32 33 20 54 48 45 4e 20 27 42 27 20 57 48 45   23 THEN 'B' WHE
b620: 4e 20 32 33 20 54 48 45 4e 20 27 43 27 20 45 4e  N 23 THEN 'C' EN
b630: 44 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 62 20 6e 75  D.} {null}.db nu
b640: 6c 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23 20 45 56  llvalue {}..# EV
b650: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34  IDENCE-OF: R-114
b660: 37 39 2d 36 32 37 37 34 20 57 68 65 6e 20 63 6f  79-62774 When co
b670: 6d 70 61 72 69 6e 67 20 61 20 62 61 73 65 20 65  mparing a base e
b680: 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73  xpression agains
b690: 74 20 61 0a 23 20 57 48 45 4e 20 65 78 70 72 65  t a.# WHEN expre
b6a0: 73 73 69 6f 6e 2c 20 74 68 65 20 73 61 6d 65 20  ssion, the same 
b6b0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
b6c0: 63 65 2c 20 61 66 66 69 6e 69 74 79 2c 20 61 6e  ce, affinity, an
b6d0: 64 0a 23 20 4e 55 4c 4c 2d 68 61 6e 64 6c 69 6e  d.# NULL-handlin
b6e0: 67 20 72 75 6c 65 73 20 61 70 70 6c 79 20 61 73  g rules apply as
b6f0: 20 69 66 20 74 68 65 20 62 61 73 65 20 65 78 70   if the base exp
b700: 72 65 73 73 69 6f 6e 20 61 6e 64 20 57 48 45 4e  ression and WHEN
b710: 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72  .# expression ar
b720: 65 20 72 65 73 70 65 63 74 69 76 65 6c 79 20 74  e respectively t
b730: 68 65 20 6c 65 66 74 2d 20 61 6e 64 20 72 69 67  he left- and rig
b740: 68 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e 64 73  ht-hand operands
b750: 20 6f 66 20 61 6e 20 3d 0a 23 20 6f 70 65 72 61   of an =.# opera
b760: 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 72 65 76 20  tor..#.proc rev 
b770: 7b 73 74 72 7d 20 7b 0a 20 20 73 65 74 20 72 65  {str} {.  set re
b780: 74 20 22 22 0a 20 20 73 65 74 20 63 68 61 72 73  t "".  set chars
b790: 20 5b 73 70 6c 69 74 20 24 73 74 72 5d 0a 20 20   [split $str].  
b7a0: 66 6f 72 20 7b 73 65 74 20 69 20 5b 65 78 70 72  for {set i [expr
b7b0: 20 5b 6c 6c 65 6e 67 74 68 20 24 63 68 61 72 73   [llength $chars
b7c0: 5d 2d 31 5d 7d 20 7b 24 69 3e 3d 30 7d 20 7b 69  ]-1]} {$i>=0} {i
b7d0: 6e 63 72 20 69 20 2d 31 7d 20 7b 0a 20 20 20 20  ncr i -1} {.    
b7e0: 61 70 70 65 6e 64 20 72 65 74 20 5b 6c 69 6e 64  append ret [lind
b7f0: 65 78 20 24 63 68 61 72 73 20 24 69 5d 0a 20 20  ex $chars $i].  
b800: 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d 0a 70 72  }.  set ret.}.pr
b810: 6f 63 20 72 65 76 65 72 73 65 20 7b 6c 68 73 20  oc reverse {lhs 
b820: 72 68 73 7d 20 7b 0a 20 20 73 74 72 69 6e 67 20  rhs} {.  string 
b830: 63 6f 6d 70 61 72 65 20 5b 72 65 76 20 24 6c 68  compare [rev $lh
b840: 73 5d 20 5b 72 65 66 20 24 72 68 73 5d 0a 7d 0a  s] [ref $rhs].}.
b850: 64 62 20 63 6f 6c 6c 61 74 65 20 72 65 76 65 72  db collate rever
b860: 73 65 20 72 65 76 65 72 73 65 0a 64 6f 5f 65 78  se reverse.do_ex
b870: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
b880: 72 2d 32 33 2e 31 2e 31 20 7b 0a 20 20 43 52 45  r-23.1.1 {.  CRE
b890: 41 54 45 20 54 41 42 4c 45 20 74 31 28 0a 20 20  ATE TABLE t1(.  
b8a0: 20 20 61 20 54 45 58 54 20 20 20 20 20 43 4f 4c    a TEXT     COL
b8b0: 4c 41 54 45 20 4e 4f 43 41 53 45 2c 0a 20 20 20  LATE NOCASE,.   
b8c0: 20 62 20 20 20 20 20 20 20 20 20 20 43 4f 4c 4c   b          COLL
b8d0: 41 54 45 20 52 45 56 45 52 53 45 2c 0a 20 20 20  ATE REVERSE,.   
b8e0: 20 63 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20   c INTEGER,.    
b8f0: 64 20 42 4c 4f 42 0a 20 20 29 3b 0a 20 20 49 4e  d BLOB.  );.  IN
b900: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
b910: 55 45 53 28 27 61 62 63 27 2c 20 27 63 62 61 27  UES('abc', 'cba'
b920: 2c 20 35 35 2c 20 33 34 2e 35 29 3b 0a 7d 20 7b  , 55, 34.5);.} {
b930: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
b940: 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 32 20  t e_expr-23.1.2 
b950: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
b960: 61 20 57 48 45 4e 20 27 78 79 7a 27 20 54 48 45  a WHEN 'xyz' THE
b970: 4e 20 27 41 27 20 57 48 45 4e 20 27 41 62 43 27  N 'A' WHEN 'AbC'
b980: 20 54 48 45 4e 20 27 42 27 20 45 4e 44 20 46 52   THEN 'B' END FR
b990: 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65  OM t1.} {B}.do_e
b9a0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
b9b0: 70 72 2d 32 33 2e 31 2e 33 20 7b 0a 20 20 53 45  pr-23.1.3 {.  SE
b9c0: 4c 45 43 54 20 43 41 53 45 20 27 41 62 43 27 20  LECT CASE 'AbC' 
b9d0: 57 48 45 4e 20 27 61 62 63 27 20 54 48 45 4e 20  WHEN 'abc' THEN 
b9e0: 27 41 27 20 57 48 45 4e 20 61 20 54 48 45 4e 20  'A' WHEN a THEN 
b9f0: 27 42 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a  'B' END FROM t1.
ba00: 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {B}.do_execsql
ba10: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e  _test e_expr-23.
ba20: 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.4 {.  SELECT C
ba30: 41 53 45 20 61 20 57 48 45 4e 20 62 20 54 48 45  ASE a WHEN b THE
ba40: 4e 20 27 41 27 20 45 4c 53 45 20 27 42 27 20 45  N 'A' ELSE 'B' E
ba50: 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d  ND FROM t1.} {B}
ba60: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
ba70: 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 35 20 7b   e_expr-23.1.5 {
ba80: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 62  .  SELECT CASE b
ba90: 20 57 48 45 4e 20 61 20 54 48 45 4e 20 27 41 27   WHEN a THEN 'A'
baa0: 20 45 4c 53 45 20 27 42 27 20 45 4e 44 20 46 52   ELSE 'B' END FR
bab0: 4f 4d 20 74 31 0a 7d 20 7b 41 7d 0a 64 6f 5f 65  OM t1.} {A}.do_e
bac0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
bad0: 70 72 2d 32 33 2e 31 2e 36 20 7b 0a 20 20 53 45  pr-23.1.6 {.  SE
bae0: 4c 45 43 54 20 43 41 53 45 20 35 35 20 57 48 45  LECT CASE 55 WHE
baf0: 4e 20 27 35 35 27 20 54 48 45 4e 20 27 41 27 20  N '55' THEN 'A' 
bb00: 45 4c 53 45 20 27 42 27 20 45 4e 44 0a 7d 20 7b  ELSE 'B' END.} {
bb10: 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  B}.do_execsql_te
bb20: 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 37  st e_expr-23.1.7
bb30: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
bb40: 20 63 20 57 48 45 4e 20 27 35 35 27 20 54 48 45   c WHEN '55' THE
bb50: 4e 20 27 41 27 20 45 4c 53 45 20 27 42 27 20 45  N 'A' ELSE 'B' E
bb60: 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 41 7d  ND FROM t1.} {A}
bb70: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
bb80: 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 38 20 7b   e_expr-23.1.8 {
bb90: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 27  .  SELECT CASE '
bba0: 33 34 2e 35 27 20 57 48 45 4e 20 64 20 54 48 45  34.5' WHEN d THE
bbb0: 4e 20 27 41 27 20 45 4c 53 45 20 27 42 27 20 45  N 'A' ELSE 'B' E
bbc0: 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d  ND FROM t1.} {B}
bbd0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
bbe0: 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 39 20 7b   e_expr-23.1.9 {
bbf0: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 4e  .  SELECT CASE N
bc00: 55 4c 4c 20 57 48 45 4e 20 4e 55 4c 4c 20 54 48  ULL WHEN NULL TH
bc10: 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42 27 20  EN 'A' ELSE 'B' 
bc20: 45 4e 44 0a 7d 20 7b 42 7d 0a 0a 23 20 45 56 49  END.} {B}..# EVI
bc30: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 33 30  DENCE-OF: R-3730
bc40: 34 2d 33 39 34 30 35 20 49 66 20 74 68 65 20 62  4-39405 If the b
bc50: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ase expression i
bc60: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a  s NULL then the.
bc70: 23 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  # result of the 
bc80: 43 41 53 45 20 69 73 20 61 6c 77 61 79 73 20 74  CASE is always t
bc90: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 61  he result of eva
bca0: 6c 75 61 74 69 6e 67 20 74 68 65 20 45 4c 53 45  luating the ELSE
bcb0: 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20 69 66  .# expression if
bcc0: 20 69 74 20 65 78 69 73 74 73 2c 20 6f 72 20 4e   it exists, or N
bcd0: 55 4c 4c 20 69 66 20 69 74 20 64 6f 65 73 20 6e  ULL if it does n
bce0: 6f 74 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ot..#.do_execsql
bcf0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 34 2e  _test e_expr-24.
bd00: 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.1 {.  SELECT C
bd10: 41 53 45 20 4e 55 4c 4c 20 57 48 45 4e 20 27 61  ASE NULL WHEN 'a
bd20: 62 63 27 20 54 48 45 4e 20 27 41 27 20 57 48 45  bc' THEN 'A' WHE
bd30: 4e 20 27 64 65 66 27 20 54 48 45 4e 20 27 42 27  N 'def' THEN 'B'
bd40: 20 45 4e 44 3b 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f   END;.} {{}}.do_
bd50: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
bd60: 78 70 72 2d 32 34 2e 31 2e 32 20 7b 0a 20 20 53  xpr-24.1.2 {.  S
bd70: 45 4c 45 43 54 20 43 41 53 45 20 4e 55 4c 4c 20  ELECT CASE NULL 
bd80: 57 48 45 4e 20 27 61 62 63 27 20 54 48 45 4e 20  WHEN 'abc' THEN 
bd90: 27 41 27 20 57 48 45 4e 20 27 64 65 66 27 20 54  'A' WHEN 'def' T
bda0: 48 45 4e 20 27 42 27 20 45 4c 53 45 20 27 43 27  HEN 'B' ELSE 'C'
bdb0: 20 45 4e 44 3b 0a 7d 20 7b 43 7d 0a 0a 23 20 45   END;.} {C}..# E
bdc0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 36  VIDENCE-OF: R-56
bdd0: 32 38 30 2d 31 37 33 36 39 20 42 6f 74 68 20 66  280-17369 Both f
bde0: 6f 72 6d 73 20 6f 66 20 74 68 65 20 43 41 53 45  orms of the CASE
bdf0: 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65 20   expression use 
be00: 6c 61 7a 79 2c 0a 23 20 6f 72 20 73 68 6f 72 74  lazy,.# or short
be10: 2d 63 69 72 63 75 69 74 2c 20 65 76 61 6c 75 61  -circuit, evalua
be20: 74 69 6f 6e 2e 0a 23 0a 73 65 74 20 76 61 72 6c  tion..#.set varl
be30: 69 73 74 20 5b 6c 69 73 74 5d 0a 66 6f 72 65 61  ist [list].forea
be40: 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20 31 20  ch {a b c} {0 1 
be50: 30 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78 65 63  0} break.do_exec
be60: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
be70: 32 35 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43  25.1.1 {.  SELEC
be80: 54 20 43 41 53 45 20 57 48 45 4e 20 76 61 72 28  T CASE WHEN var(
be90: 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20  'a') THEN 'A' . 
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
beb0: 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e 20  N var('b') THEN 
bec0: 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'B' .           
bed0: 20 20 20 57 48 45 4e 20 76 61 72 28 27 63 27 29     WHEN var('c')
bee0: 20 54 48 45 4e 20 27 43 27 20 0a 20 20 45 4e 44   THEN 'C' .  END
bef0: 0a 7d 20 7b 42 7d 0a 64 6f 5f 74 65 73 74 20 65  .} {B}.do_test e
bf00: 5f 65 78 70 72 2d 32 35 2e 31 2e 32 20 7b 20 73  _expr-25.1.2 { s
bf10: 65 74 20 3a 3a 76 61 72 6c 69 73 74 20 7d 20 7b  et ::varlist } {
bf20: 61 20 62 7d 0a 73 65 74 20 76 61 72 6c 69 73 74  a b}.set varlist
bf30: 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73   [list].do_execs
bf40: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
bf50: 35 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  5.1.3 {.  SELECT
bf60: 20 43 41 53 45 20 27 30 27 20 57 48 45 4e 20 76   CASE '0' WHEN v
bf70: 61 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27  ar('a') THEN 'A'
bf80: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
bf90: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62 27      WHEN var('b'
bfa0: 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20  ) THEN 'B' .    
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
bfc0: 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45 4e  EN var('c') THEN
bfd0: 20 27 43 27 20 0a 20 20 45 4e 44 0a 7d 20 7b 41   'C' .  END.} {A
bfe0: 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72  }.do_test e_expr
bff0: 2d 32 35 2e 31 2e 34 20 7b 20 73 65 74 20 3a 3a  -25.1.4 { set ::
c000: 76 61 72 6c 69 73 74 20 7d 20 7b 61 7d 0a 0a 23  varlist } {a}..#
c010: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c020: 33 34 37 37 33 2d 36 32 32 35 33 20 54 68 65 20  34773-62253 The 
c030: 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20  only difference 
c040: 62 65 74 77 65 65 6e 20 74 68 65 20 66 6f 6c 6c  between the foll
c050: 6f 77 69 6e 67 0a 23 20 74 77 6f 20 43 41 53 45  owing.# two CASE
c060: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 73 20   expressions is 
c070: 74 68 61 74 20 74 68 65 20 78 20 65 78 70 72 65  that the x expre
c080: 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
c090: 65 64 20 65 78 61 63 74 6c 79 0a 23 20 6f 6e 63  ed exactly.# onc
c0a0: 65 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 65  e in the first e
c0b0: 78 61 6d 70 6c 65 20 62 75 74 20 6d 69 67 68 74  xample but might
c0c0: 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 6d 75   be evaluated mu
c0d0: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 69 6e 20  ltiple times in 
c0e0: 74 68 65 0a 23 20 73 65 63 6f 6e 64 3a 20 43 41  the.# second: CA
c0f0: 53 45 20 78 20 57 48 45 4e 20 77 31 20 54 48 45  SE x WHEN w1 THE
c100: 4e 20 72 31 20 57 48 45 4e 20 77 32 20 54 48 45  N r1 WHEN w2 THE
c110: 4e 20 72 32 20 45 4c 53 45 20 72 33 20 45 4e 44  N r2 ELSE r3 END
c120: 20 43 41 53 45 20 57 48 45 4e 0a 23 20 78 3d 77   CASE WHEN.# x=w
c130: 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78  1 THEN r1 WHEN x
c140: 3d 77 32 20 54 48 45 4e 20 72 32 20 45 4c 53 45  =w2 THEN r2 ELSE
c150: 20 72 33 20 45 4e 44 0a 23 0a 70 72 6f 63 20 63   r3 END.#.proc c
c160: 65 76 61 6c 20 7b 78 7d 20 7b 0a 20 20 69 6e 63  eval {x} {.  inc
c170: 72 20 3a 3a 65 76 61 6c 63 6f 75 6e 74 0a 20 20  r ::evalcount.  
c180: 72 65 74 75 72 6e 20 24 78 0a 7d 0a 64 62 20 66  return $x.}.db f
c190: 75 6e 63 20 63 65 76 61 6c 20 63 65 76 61 6c 0a  unc ceval ceval.
c1a0: 73 65 74 20 3a 3a 65 76 61 6c 63 6f 75 6e 74 20  set ::evalcount 
c1b0: 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0..do_execsql_te
c1c0: 73 74 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 31  st e_expr-26.1.1
c1d0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
c1e0: 45 20 74 32 28 78 2c 20 77 31 2c 20 72 31 2c 20  E t2(x, w1, r1, 
c1f0: 77 32 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20 49  w2, r2, r3);.  I
c200: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
c210: 4c 55 45 53 28 31 2c 20 31 2c 20 27 52 31 27 2c  LUES(1, 1, 'R1',
c220: 20 32 2c 20 27 52 32 27 2c 20 27 52 33 27 29 3b   2, 'R2', 'R3');
c230: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
c240: 32 20 56 41 4c 55 45 53 28 32 2c 20 31 2c 20 27  2 VALUES(2, 1, '
c250: 52 31 27 2c 20 32 2c 20 27 52 32 27 2c 20 27 52  R1', 2, 'R2', 'R
c260: 33 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  3');.  INSERT IN
c270: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20  TO t2 VALUES(3, 
c280: 31 2c 20 27 52 31 27 2c 20 32 2c 20 27 52 32 27  1, 'R1', 2, 'R2'
c290: 2c 20 27 52 33 27 29 3b 0a 7d 20 7b 7d 0a 64 6f  , 'R3');.} {}.do
c2a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
c2b0: 65 78 70 72 2d 32 36 2e 31 2e 32 20 7b 0a 20 20  expr-26.1.2 {.  
c2c0: 53 45 4c 45 43 54 20 43 41 53 45 20 78 20 57 48  SELECT CASE x WH
c2d0: 45 4e 20 77 31 20 54 48 45 4e 20 72 31 20 57 48  EN w1 THEN r1 WH
c2e0: 45 4e 20 77 32 20 54 48 45 4e 20 72 32 20 45 4c  EN w2 THEN r2 EL
c2f0: 53 45 20 72 33 20 45 4e 44 20 46 52 4f 4d 20 74  SE r3 END FROM t
c300: 32 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d 0a 64  2.} {R1 R2 R3}.d
c310: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
c320: 5f 65 78 70 72 2d 32 36 2e 31 2e 33 20 7b 0a 20  _expr-26.1.3 {. 
c330: 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
c340: 4e 20 78 3d 77 31 20 54 48 45 4e 20 72 31 20 57  N x=w1 THEN r1 W
c350: 48 45 4e 20 78 3d 77 32 20 54 48 45 4e 20 72 32  HEN x=w2 THEN r2
c360: 20 45 4c 53 45 20 72 33 20 45 4e 44 20 46 52 4f   ELSE r3 END FRO
c370: 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32 20 52 33  M t2.} {R1 R2 R3
c380: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
c390: 73 74 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 34  st e_expr-26.1.4
c3a0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
c3b0: 20 63 65 76 61 6c 28 78 29 20 57 48 45 4e 20 77   ceval(x) WHEN w
c3c0: 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 77  1 THEN r1 WHEN w
c3d0: 32 20 54 48 45 4e 20 72 32 20 45 4c 53 45 20 72  2 THEN r2 ELSE r
c3e0: 33 20 45 4e 44 20 46 52 4f 4d 20 74 32 0a 7d 20  3 END FROM t2.} 
c3f0: 7b 52 31 20 52 32 20 52 33 7d 0a 64 6f 5f 74 65  {R1 R2 R3}.do_te
c400: 73 74 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 35  st e_expr-26.1.5
c410: 20 7b 20 73 65 74 20 3a 3a 65 76 61 6c 63 6f 75   { set ::evalcou
c420: 6e 74 20 7d 20 7b 33 7d 0a 73 65 74 20 3a 3a 65  nt } {3}.set ::e
c430: 76 61 6c 63 6f 75 6e 74 20 30 0a 64 6f 5f 65 78  valcount 0.do_ex
c440: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
c450: 72 2d 32 36 2e 31 2e 36 20 7b 0a 20 20 53 45 4c  r-26.1.6 {.  SEL
c460: 45 43 54 20 43 41 53 45 20 0a 20 20 20 20 57 48  ECT CASE .    WH
c470: 45 4e 20 63 65 76 61 6c 28 78 29 3d 77 31 20 54  EN ceval(x)=w1 T
c480: 48 45 4e 20 72 31 20 0a 20 20 20 20 57 48 45 4e  HEN r1 .    WHEN
c490: 20 63 65 76 61 6c 28 78 29 3d 77 32 20 54 48 45   ceval(x)=w2 THE
c4a0: 4e 20 72 32 20 0a 20 20 20 20 45 4c 53 45 20 72  N r2 .    ELSE r
c4b0: 33 20 45 4e 44 20 0a 20 20 46 52 4f 4d 20 74 32  3 END .  FROM t2
c4c0: 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d 0a 64 6f  .} {R1 R2 R3}.do
c4d0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e  _test e_expr-26.
c4e0: 31 2e 36 20 7b 20 73 65 74 20 3a 3a 65 76 61 6c  1.6 { set ::eval
c4f0: 63 6f 75 6e 74 20 7d 20 7b 35 7d 0a 0a 0a 23 2d  count } {5}...#-
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 2d 2d 2d 2d 2d  ----------------
c540: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
c550: 73 74 61 74 65 6d 65 6e 74 73 20 72 65 6c 61 74  statements relat
c560: 65 64 20 74 6f 20 43 41 53 54 20 65 78 70 72 65  ed to CAST expre
c570: 73 73 69 6f 6e 73 2e 0a 23 0a 23 20 45 56 49 44  ssions..#.# EVID
c580: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 30 37 39  ENCE-OF: R-65079
c590: 2d 33 31 37 35 38 20 41 70 70 6c 69 63 61 74 69  -31758 Applicati
c5a0: 6f 6e 20 6f 66 20 61 20 43 41 53 54 20 65 78 70  on of a CAST exp
c5b0: 72 65 73 73 69 6f 6e 20 69 73 0a 23 20 64 69 66  ression is.# dif
c5c0: 66 65 72 65 6e 74 20 74 6f 20 61 70 70 6c 69 63  ferent to applic
c5d0: 61 74 69 6f 6e 20 6f 66 20 61 20 63 6f 6c 75 6d  ation of a colum
c5e0: 6e 20 61 66 66 69 6e 69 74 79 2c 20 61 73 20 77  n affinity, as w
c5f0: 69 74 68 20 61 20 43 41 53 54 0a 23 20 65 78 70  ith a CAST.# exp
c600: 72 65 73 73 69 6f 6e 20 74 68 65 20 73 74 6f 72  ression the stor
c610: 61 67 65 20 63 6c 61 73 73 20 63 6f 6e 76 65 72  age class conver
c620: 73 69 6f 6e 20 69 73 20 66 6f 72 63 65 64 20 65  sion is forced e
c630: 76 65 6e 20 69 66 20 69 74 20 69 73 20 6c 6f 73  ven if it is los
c640: 73 79 0a 23 20 61 6e 64 20 69 72 72 72 65 76 65  sy.# and irrreve
c650: 72 73 69 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65  rsible..#.do_exe
c660: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
c670: 2d 32 37 2e 31 2e 31 20 7b 0a 20 20 43 52 45 41  -27.1.1 {.  CREA
c680: 54 45 20 54 41 42 4c 45 20 74 33 28 61 20 54 45  TE TABLE t3(a TE
c690: 58 54 2c 20 62 20 52 45 41 4c 2c 20 63 20 49 4e  XT, b REAL, c IN
c6a0: 54 45 47 45 52 29 3b 0a 20 20 49 4e 53 45 52 54  TEGER);.  INSERT
c6b0: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
c6c0: 58 27 35 35 35 36 35 35 27 2c 20 27 31 2e 32 33  X'555655', '1.23
c6d0: 61 62 63 27 2c 20 34 2e 35 29 3b 0a 20 20 53 45  abc', 4.5);.  SE
c6e0: 4c 45 43 54 20 74 79 70 65 6f 66 28 61 29 2c 20  LECT typeof(a), 
c6f0: 61 2c 20 74 79 70 65 6f 66 28 62 29 2c 20 62 2c  a, typeof(b), b,
c700: 20 74 79 70 65 6f 66 28 63 29 2c 20 63 20 46 52   typeof(c), c FR
c710: 4f 4d 20 74 33 3b 0a 7d 20 7b 62 6c 6f 62 20 55  OM t3;.} {blob U
c720: 56 55 20 74 65 78 74 20 31 2e 32 33 61 62 63 20  VU text 1.23abc 
c730: 72 65 61 6c 20 34 2e 35 7d 0a 64 6f 5f 65 78 65  real 4.5}.do_exe
c740: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
c750: 2d 32 37 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45  -27.1.2 {.  SELE
c760: 43 54 20 0a 20 20 20 20 74 79 70 65 6f 66 28 43  CT .    typeof(C
c770: 41 53 54 28 58 27 35 35 35 36 35 35 27 20 61 73  AST(X'555655' as
c780: 20 54 45 58 54 29 29 2c 20 43 41 53 54 28 58 27   TEXT)), CAST(X'
c790: 35 35 35 36 35 35 27 20 61 73 20 54 45 58 54 29  555655' as TEXT)
c7a0: 2c 0a 20 20 20 20 74 79 70 65 6f 66 28 43 41 53  ,.    typeof(CAS
c7b0: 54 28 27 31 2e 32 33 61 62 63 27 20 61 73 20 52  T('1.23abc' as R
c7c0: 45 41 4c 29 29 2c 20 43 41 53 54 28 27 31 2e 32  EAL)), CAST('1.2
c7d0: 33 61 62 63 27 20 61 73 20 52 45 41 4c 29 2c 0a  3abc' as REAL),.
c7e0: 20 20 20 20 74 79 70 65 6f 66 28 43 41 53 54 28      typeof(CAST(
c7f0: 34 2e 35 20 61 73 20 49 4e 54 45 47 45 52 29 29  4.5 as INTEGER))
c800: 2c 20 43 41 53 54 28 34 2e 35 20 61 73 20 49 4e  , CAST(4.5 as IN
c810: 54 45 47 45 52 29 0a 7d 20 7b 74 65 78 74 20 55  TEGER).} {text U
c820: 56 55 20 72 65 61 6c 20 31 2e 32 33 20 69 6e 74  VU real 1.23 int
c830: 65 67 65 72 20 34 7d 0a 0a 23 20 45 56 49 44 45  eger 4}..# EVIDE
c840: 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d  NCE-OF: R-27225-
c850: 36 35 30 35 30 20 49 66 20 74 68 65 20 76 61 6c  65050 If the val
c860: 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 69 73 20  ue of <expr> is 
c870: 4e 55 4c 4c 2c 20 74 68 65 6e 0a 23 20 74 68 65  NULL, then.# the
c880: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 43   result of the C
c890: 41 53 54 20 65 78 70 72 65 73 73 69 6f 6e 20 69  AST expression i
c8a0: 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 23 0a 64  s also NULL..#.d
c8b0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
c8c0: 70 72 2d 32 37 2e 32 2e 31 20 7b 20 43 41 53 54  pr-27.2.1 { CAST
c8d0: 28 4e 55 4c 4c 20 41 53 20 69 6e 74 65 67 65 72  (NULL AS integer
c8e0: 29 20 7d 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65  ) } null {}.do_e
c8f0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
c900: 32 37 2e 32 2e 32 20 7b 20 43 41 53 54 28 4e 55  27.2.2 { CAST(NU
c910: 4c 4c 20 41 53 20 74 65 78 74 29 20 7d 20 20 20  LL AS text) }   
c920: 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72   null {}.do_expr
c930: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
c940: 32 2e 33 20 7b 20 43 41 53 54 28 4e 55 4c 4c 20  2.3 { CAST(NULL 
c950: 41 53 20 62 6c 6f 62 29 20 7d 20 20 20 20 6e 75  AS blob) }    nu
c960: 6c 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72 5f 74 65  ll {}.do_expr_te
c970: 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 32 2e 34  st e_expr-27.2.4
c980: 20 7b 20 43 41 53 54 28 4e 55 4c 4c 20 41 53 20   { CAST(NULL AS 
c990: 6e 75 6d 62 65 72 29 20 7d 20 20 6e 75 6c 6c 20  number) }  null 
c9a0: 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  {}..# EVIDENCE-O
c9b0: 46 3a 20 52 2d 33 31 30 37 36 2d 32 33 35 37 35  F: R-31076-23575
c9c0: 20 43 61 73 74 69 6e 67 20 61 20 76 61 6c 75 65   Casting a value
c9d0: 20 74 6f 20 61 20 3c 74 79 70 65 2d 6e 61 6d 65   to a <type-name
c9e0: 3e 20 77 69 74 68 0a 23 20 6e 6f 20 61 66 66 69  > with.# no affi
c9f0: 6e 69 74 79 20 63 61 75 73 65 73 20 74 68 65 20  nity causes the 
ca00: 76 61 6c 75 65 20 74 6f 20 62 65 20 63 6f 6e 76  value to be conv
ca10: 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 4c 4f  erted into a BLO
ca20: 42 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73  B..#.do_expr_tes
ca30: 74 20 65 5f 65 78 70 72 2d 32 37 2e 33 2e 31 20  t e_expr-27.3.1 
ca40: 7b 20 43 41 53 54 28 27 61 62 63 27 20 41 53 20  { CAST('abc' AS 
ca50: 62 6c 6f 62 29 20 20 20 20 20 20 20 7d 20 62 6c  blob)       } bl
ca60: 6f 62 20 61 62 63 0a 64 6f 5f 65 78 70 72 5f 74  ob abc.do_expr_t
ca70: 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 33 2e  est e_expr-27.3.
ca80: 32 20 7b 20 43 41 53 54 28 27 64 65 66 27 20 41  2 { CAST('def' A
ca90: 53 20 73 68 6f 62 62 6c 6f 62 5f 78 29 20 7d 20  S shobblob_x) } 
caa0: 62 6c 6f 62 20 64 65 66 0a 64 6f 5f 65 78 70 72  blob def.do_expr
cab0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
cac0: 33 2e 33 20 7b 20 43 41 53 54 28 27 67 68 69 27  3.3 { CAST('ghi'
cad0: 20 41 53 20 61 62 62 4c 4f 62 31 30 29 20 20 20   AS abbLOb10)   
cae0: 7d 20 62 6c 6f 62 20 67 68 69 0a 0a 23 20 45 56  } blob ghi..# EV
caf0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 39  IDENCE-OF: R-229
cb00: 35 36 2d 33 37 37 35 34 20 43 61 73 74 69 6e 67  56-37754 Casting
cb10: 20 74 6f 20 61 20 42 4c 4f 42 20 63 6f 6e 73 69   to a BLOB consi
cb20: 73 74 73 20 6f 66 20 66 69 72 73 74 20 63 61 73  sts of first cas
cb30: 74 69 6e 67 0a 23 20 74 68 65 20 76 61 6c 75 65  ting.# the value
cb40: 20 74 6f 20 54 45 58 54 20 69 6e 20 74 68 65 20   to TEXT in the 
cb50: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  encoding of the 
cb60: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
cb70: 69 6f 6e 2c 20 74 68 65 6e 0a 23 20 69 6e 74 65  ion, then.# inte
cb80: 72 70 72 65 74 69 6e 67 20 74 68 65 20 72 65 73  rpreting the res
cb90: 75 6c 74 69 6e 67 20 62 79 74 65 20 73 65 71 75  ulting byte sequ
cba0: 65 6e 63 65 20 61 73 20 61 20 42 4c 4f 42 20 69  ence as a BLOB i
cbb0: 6e 73 74 65 61 64 20 6f 66 20 61 73 20 54 45 58  nstead of as TEX
cbc0: 54 2e 0a 23 0a 64 6f 5f 71 65 78 70 72 5f 74 65  T..#.do_qexpr_te
cbd0: 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 31  st e_expr-27.4.1
cbe0: 20 7b 20 43 41 53 54 28 27 67 68 69 27 20 41 53   { CAST('ghi' AS
cbf0: 20 62 6c 6f 62 29 20 7d 20 58 27 36 37 36 38 36   blob) } X'67686
cc00: 39 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74  9'.do_qexpr_test
cc10: 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 32 20 7b   e_expr-27.4.2 {
cc20: 20 43 41 53 54 28 34 35 36 20 41 53 20 62 6c 6f   CAST(456 AS blo
cc30: 62 29 20 7d 20 20 20 58 27 33 34 33 35 33 36 27  b) }   X'343536'
cc40: 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65  .do_qexpr_test e
cc50: 5f 65 78 70 72 2d 32 37 2e 34 2e 33 20 7b 20 43  _expr-27.4.3 { C
cc60: 41 53 54 28 31 2e 37 38 20 41 53 20 62 6c 6f 62  AST(1.78 AS blob
cc70: 29 20 7d 20 20 58 27 33 31 32 45 33 37 33 38 27  ) }  X'312E3738'
cc80: 0a 72 65 6e 61 6d 65 20 64 62 20 64 62 32 0a 73  .rename db db2.s
cc90: 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72  qlite3 db :memor
cca0: 79 3a 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74  y:.ifcapable {ut
ccb0: 66 31 36 7d 20 7b 0a 64 62 20 65 76 61 6c 20 7b  f16} {.db eval {
ccc0: 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67   PRAGMA encoding
ccd0: 20 3d 20 27 75 74 66 2d 31 36 6c 65 27 20 7d 0a   = 'utf-16le' }.
cce0: 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f  do_qexpr_test e_
ccf0: 65 78 70 72 2d 32 37 2e 34 2e 34 20 7b 20 43 41  expr-27.4.4 { CA
cd00: 53 54 28 27 67 68 69 27 20 41 53 20 62 6c 6f 62  ST('ghi' AS blob
cd10: 29 20 7d 20 58 27 36 37 30 30 36 38 30 30 36 39  ) } X'6700680069
cd20: 30 30 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73  00'.do_qexpr_tes
cd30: 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 35 20  t e_expr-27.4.5 
cd40: 7b 20 43 41 53 54 28 34 35 36 20 41 53 20 62 6c  { CAST(456 AS bl
cd50: 6f 62 29 20 7d 20 20 20 58 27 33 34 30 30 33 35  ob) }   X'340035
cd60: 30 30 33 36 30 30 27 0a 64 6f 5f 71 65 78 70 72  003600'.do_qexpr
cd70: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
cd80: 34 2e 36 20 7b 20 43 41 53 54 28 31 2e 37 38 20  4.6 { CAST(1.78 
cd90: 41 53 20 62 6c 6f 62 29 20 7d 20 20 58 27 33 31  AS blob) }  X'31
cda0: 30 30 32 45 30 30 33 37 30 30 33 38 30 30 27 0a  002E0037003800'.
cdb0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74  }.db close.sqlit
cdc0: 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 64  e3 db :memory:.d
cdd0: 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  b eval { PRAGMA 
cde0: 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d  encoding = 'utf-
cdf0: 31 36 62 65 27 20 7d 0a 69 66 63 61 70 61 62 6c  16be' }.ifcapabl
ce00: 65 20 7b 75 74 66 31 36 7d 20 7b 0a 64 6f 5f 71  e {utf16} {.do_q
ce10: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
ce20: 2d 32 37 2e 34 2e 37 20 7b 20 43 41 53 54 28 27  -27.4.7 { CAST('
ce30: 67 68 69 27 20 41 53 20 62 6c 6f 62 29 20 7d 20  ghi' AS blob) } 
ce40: 58 27 30 30 36 37 30 30 36 38 30 30 36 39 27 0a  X'006700680069'.
ce50: 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f  do_qexpr_test e_
ce60: 65 78 70 72 2d 32 37 2e 34 2e 38 20 7b 20 43 41  expr-27.4.8 { CA
ce70: 53 54 28 34 35 36 20 41 53 20 62 6c 6f 62 29 20  ST(456 AS blob) 
ce80: 7d 20 20 20 58 27 30 30 33 34 30 30 33 35 30 30  }   X'0034003500
ce90: 33 36 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73  36'.do_qexpr_tes
cea0: 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 39 20  t e_expr-27.4.9 
ceb0: 7b 20 43 41 53 54 28 31 2e 37 38 20 41 53 20 62  { CAST(1.78 AS b
cec0: 6c 6f 62 29 20 7d 20 20 58 27 30 30 33 31 30 30  lob) }  X'003100
ced0: 32 45 30 30 33 37 30 30 33 38 27 0a 7d 0a 64 62  2E00370038'.}.db
cee0: 20 63 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62   close.rename db
cef0: 32 20 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45  2 db..# EVIDENCE
cf00: 2d 4f 46 3a 20 52 2d 30 34 32 30 37 2d 33 37 39  -OF: R-04207-379
cf10: 38 31 20 54 6f 20 63 61 73 74 20 61 20 42 4c 4f  81 To cast a BLO
cf20: 42 20 76 61 6c 75 65 20 74 6f 20 54 45 58 54 2c  B value to TEXT,
cf30: 20 74 68 65 20 73 65 71 75 65 6e 63 65 0a 23 20   the sequence.# 
cf40: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 6d 61  of bytes that ma
cf50: 6b 65 20 75 70 20 74 68 65 20 42 4c 4f 42 20 69  ke up the BLOB i
cf60: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
cf70: 20 74 65 78 74 20 65 6e 63 6f 64 65 64 20 75 73   text encoded us
cf80: 69 6e 67 0a 23 20 74 68 65 20 64 61 74 61 62 61  ing.# the databa
cf90: 73 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 23 0a 64  se encoding..#.d
cfa0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
cfb0: 70 72 2d 32 38 2e 31 2e 31 20 7b 20 43 41 53 54  pr-28.1.1 { CAST
cfc0: 20 28 58 27 36 37 36 38 36 39 27 20 41 53 20 74   (X'676869' AS t
cfd0: 65 78 74 29 20 7d 20 74 65 78 74 20 67 68 69 0a  ext) } text ghi.
cfe0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
cff0: 78 70 72 2d 32 38 2e 31 2e 32 20 7b 20 43 41 53  xpr-28.1.2 { CAS
d000: 54 20 28 58 27 36 37 30 30 36 38 30 30 36 39 30  T (X'67006800690
d010: 30 27 20 41 53 20 74 65 78 74 29 20 7d 20 74 65  0' AS text) } te
d020: 78 74 20 67 0a 72 65 6e 61 6d 65 20 64 62 20 64  xt g.rename db d
d030: 62 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d  b2.sqlite3 db :m
d040: 65 6d 6f 72 79 3a 0a 64 62 20 65 76 61 6c 20 7b  emory:.db eval {
d050: 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67   PRAGMA encoding
d060: 20 3d 20 27 75 74 66 2d 31 36 6c 65 27 20 7d 0a   = 'utf-16le' }.
d070: 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66 31 36  ifcapable {utf16
d080: 7d 20 7b 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  } {.do_expr_test
d090: 20 65 5f 65 78 70 72 2d 32 38 2e 31 2e 33 20 7b   e_expr-28.1.3 {
d0a0: 20 43 41 53 54 20 28 58 27 36 37 36 38 36 39 27   CAST (X'676869'
d0b0: 20 41 53 20 74 65 78 74 29 20 3d 3d 20 27 67 68   AS text) == 'gh
d0c0: 69 27 20 7d 20 69 6e 74 65 67 65 72 20 30 0a 64  i' } integer 0.d
d0d0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d0e0: 70 72 2d 32 38 2e 31 2e 34 20 7b 20 43 41 53 54  pr-28.1.4 { CAST
d0f0: 20 28 58 27 36 37 30 30 36 38 30 30 36 39 30 30   (X'670068006900
d100: 27 20 41 53 20 74 65 78 74 29 20 7d 20 74 65 78  ' AS text) } tex
d110: 74 20 67 68 69 0a 7d 0a 64 62 20 63 6c 6f 73 65  t ghi.}.db close
d120: 0a 72 65 6e 61 6d 65 20 64 62 32 20 64 62 0a 0a  .rename db2 db..
d130: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
d140: 2d 32 32 32 33 35 2d 34 37 30 30 36 20 43 61 73  -22235-47006 Cas
d150: 74 69 6e 67 20 61 6e 20 49 4e 54 45 47 45 52 20  ting an INTEGER 
d160: 6f 72 20 52 45 41 4c 20 76 61 6c 75 65 20 69 6e  or REAL value in
d170: 74 6f 20 54 45 58 54 0a 23 20 72 65 6e 64 65 72  to TEXT.# render
d180: 73 20 74 68 65 20 76 61 6c 75 65 20 61 73 20 69  s the value as i
d190: 66 20 76 69 61 20 73 71 6c 69 74 65 33 5f 73 6e  f via sqlite3_sn
d1a0: 70 72 69 6e 74 66 28 29 20 65 78 63 65 70 74 20  printf() except 
d1b0: 74 68 61 74 20 74 68 65 0a 23 20 72 65 73 75 6c  that the.# resul
d1c0: 74 69 6e 67 20 54 45 58 54 20 75 73 65 73 20 74  ting TEXT uses t
d1d0: 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  he encoding of t
d1e0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
d1f0: 65 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 65 78 70  ection..#.do_exp
d200: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38  r_test e_expr-28
d210: 2e 32 2e 31 20 7b 20 43 41 53 54 20 28 31 20 41  .2.1 { CAST (1 A
d220: 53 20 74 65 78 74 29 20 20 20 7d 20 20 20 20 20  S text)   }     
d230: 74 65 78 74 20 31 0a 64 6f 5f 65 78 70 72 5f 74  text 1.do_expr_t
d240: 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e  est e_expr-28.2.
d250: 32 20 7b 20 43 41 53 54 20 28 34 35 20 41 53 20  2 { CAST (45 AS 
d260: 74 65 78 74 29 20 20 7d 20 20 20 20 20 74 65 78  text)  }     tex
d270: 74 20 34 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73  t 45.do_expr_tes
d280: 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 33 20  t e_expr-28.2.3 
d290: 7b 20 43 41 53 54 20 28 2d 34 35 20 41 53 20 74  { CAST (-45 AS t
d2a0: 65 78 74 29 20 7d 20 20 20 20 20 74 65 78 74 20  ext) }     text 
d2b0: 2d 34 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  -45.do_expr_test
d2c0: 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 34 20 7b   e_expr-28.2.4 {
d2d0: 20 43 41 53 54 20 28 38 2e 38 20 41 53 20 74 65   CAST (8.8 AS te
d2e0: 78 74 29 20 20 20 20 7d 20 20 74 65 78 74 20 38  xt)    }  text 8
d2f0: 2e 38 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .8.do_expr_test 
d300: 65 5f 65 78 70 72 2d 32 38 2e 32 2e 35 20 7b 20  e_expr-28.2.5 { 
d310: 43 41 53 54 20 28 32 2e 33 65 2b 35 20 41 53 20  CAST (2.3e+5 AS 
d320: 74 65 78 74 29 20 7d 20 20 74 65 78 74 20 32 33  text) }  text 23
d330: 30 30 30 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74  0000.0.do_expr_t
d340: 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e  est e_expr-28.2.
d350: 36 20 7b 20 43 41 53 54 20 28 2d 32 2e 33 65 2d  6 { CAST (-2.3e-
d360: 35 20 41 53 20 74 65 78 74 29 20 7d 20 74 65 78  5 AS text) } tex
d370: 74 20 2d 32 2e 33 65 2d 30 35 0a 64 6f 5f 65 78  t -2.3e-05.do_ex
d380: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d390: 38 2e 32 2e 37 20 7b 20 43 41 53 54 20 28 30 2e  8.2.7 { CAST (0.
d3a0: 30 20 41 53 20 74 65 78 74 29 20 7d 20 20 20 20  0 AS text) }    
d3b0: 20 74 65 78 74 20 30 2e 30 0a 64 6f 5f 65 78 70   text 0.0.do_exp
d3c0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38  r_test e_expr-28
d3d0: 2e 32 2e 37 20 7b 20 43 41 53 54 20 28 30 20 41  .2.7 { CAST (0 A
d3e0: 53 20 74 65 78 74 29 20 7d 20 20 20 20 20 20 20  S text) }       
d3f0: 74 65 78 74 20 30 0a 0a 23 20 45 56 49 44 45 4e  text 0..# EVIDEN
d400: 43 45 2d 4f 46 3a 20 52 2d 32 36 33 34 36 2d 33  CE-OF: R-26346-3
d410: 36 34 34 33 20 57 68 65 6e 20 63 61 73 74 69 6e  6443 When castin
d420: 67 20 61 20 42 4c 4f 42 20 76 61 6c 75 65 20 74  g a BLOB value t
d430: 6f 20 61 20 52 45 41 4c 2c 20 74 68 65 0a 23 20  o a REAL, the.# 
d440: 76 61 6c 75 65 20 69 73 20 66 69 72 73 74 20 63  value is first c
d450: 6f 6e 76 65 72 74 65 64 20 74 6f 20 54 45 58 54  onverted to TEXT
d460: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
d470: 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e 31 20 7b   e_expr-29.1.1 {
d480: 20 43 41 53 54 20 28 58 27 33 31 32 45 33 32 33   CAST (X'312E323
d490: 33 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  3' AS REAL) } re
d4a0: 61 6c 20 31 2e 32 33 0a 64 6f 5f 65 78 70 72 5f  al 1.23.do_expr_
d4b0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31  test e_expr-29.1
d4c0: 2e 32 20 7b 20 43 41 53 54 20 28 58 27 33 32 33  .2 { CAST (X'323
d4d0: 33 33 30 32 45 33 30 27 20 41 53 20 52 45 41 4c  3302E30' AS REAL
d4e0: 29 20 7d 20 72 65 61 6c 20 32 33 30 2e 30 0a 64  ) } real 230.0.d
d4f0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d500: 70 72 2d 32 39 2e 31 2e 33 20 7b 20 43 41 53 54  pr-29.1.3 { CAST
d510: 20 28 58 27 32 44 33 39 32 45 33 38 33 37 27 20   (X'2D392E3837' 
d520: 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20  AS REAL) } real 
d530: 2d 39 2e 38 37 0a 64 6f 5f 65 78 70 72 5f 74 65  -9.87.do_expr_te
d540: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e 34  st e_expr-29.1.4
d550: 20 7b 20 43 41 53 54 20 28 58 27 33 30 32 45 33   { CAST (X'302E3
d560: 30 33 30 33 30 33 31 27 20 41 53 20 52 45 41 4c  0303031' AS REAL
d570: 29 20 7d 20 72 65 61 6c 20 30 2e 30 30 30 31 0a  ) } real 0.0001.
d580: 72 65 6e 61 6d 65 20 64 62 20 64 62 32 0a 73 71  rename db db2.sq
d590: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
d5a0: 3a 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66  :.ifcapable {utf
d5b0: 31 36 7d 20 7b 0a 64 62 20 65 76 61 6c 20 7b 20  16} {.db eval { 
d5c0: 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20  PRAGMA encoding 
d5d0: 3d 20 27 75 74 66 2d 31 36 6c 65 27 20 7d 0a 64  = 'utf-16le' }.d
d5e0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d5f0: 70 72 2d 32 39 2e 31 2e 35 20 7b 20 0a 20 20 20  pr-29.1.5 { .   
d600: 20 43 41 53 54 20 28 58 27 33 31 30 30 32 45 30   CAST (X'31002E0
d610: 30 33 32 30 30 33 33 30 30 27 20 41 53 20 52 45  032003300' AS RE
d620: 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32 33 0a  AL) } real 1.23.
d630: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d640: 78 70 72 2d 32 39 2e 31 2e 36 20 7b 20 0a 20 20  xpr-29.1.6 { .  
d650: 20 20 43 41 53 54 20 28 58 27 33 32 30 30 33 33    CAST (X'320033
d660: 30 30 33 30 30 30 32 45 30 30 33 30 30 30 27 20  0030002E003000' 
d670: 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20  AS REAL) } real 
d680: 32 33 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65  230.0.do_expr_te
d690: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e 37  st e_expr-29.1.7
d6a0: 20 7b 20 0a 20 20 20 20 43 41 53 54 20 28 58 27   { .    CAST (X'
d6b0: 32 44 30 30 33 39 30 30 32 45 30 30 33 38 30 30  2D0039002E003800
d6c0: 33 37 30 30 27 20 41 53 20 52 45 41 4c 29 20 7d  3700' AS REAL) }
d6d0: 20 72 65 61 6c 20 2d 39 2e 38 37 0a 64 6f 5f 65   real -9.87.do_e
d6e0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
d6f0: 32 39 2e 31 2e 38 20 7b 20 0a 20 20 20 20 43 41  29.1.8 { .    CA
d700: 53 54 20 28 58 27 33 30 30 30 32 45 30 30 33 30  ST (X'30002E0030
d710: 30 30 33 30 30 30 33 30 30 30 33 31 30 30 27 20  00300030003100' 
d720: 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20  AS REAL) } real 
d730: 30 2e 30 30 30 31 0a 7d 0a 64 62 20 63 6c 6f 73  0.0001.}.db clos
d740: 65 0a 72 65 6e 61 6d 65 20 64 62 32 20 64 62 0a  e.rename db2 db.
d750: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
d760: 52 2d 35 34 38 39 38 2d 33 34 35 35 34 20 57 68  R-54898-34554 Wh
d770: 65 6e 20 63 61 73 74 69 6e 67 20 61 20 54 45 58  en casting a TEX
d780: 54 20 76 61 6c 75 65 20 74 6f 20 52 45 41 4c 2c  T value to REAL,
d790: 20 74 68 65 0a 23 20 6c 6f 6e 67 65 73 74 20 70   the.# longest p
d7a0: 6f 73 73 69 62 6c 65 20 70 72 65 66 69 78 20 6f  ossible prefix o
d7b0: 66 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  f the value that
d7c0: 20 63 61 6e 20 62 65 20 69 6e 74 65 72 70 72 65   can be interpre
d7d0: 74 65 64 20 61 73 20 61 20 72 65 61 6c 0a 23 20  ted as a real.# 
d7e0: 6e 75 6d 62 65 72 20 69 73 20 65 78 74 72 61 63  number is extrac
d7f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 54 45 58  ted from the TEX
d800: 54 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  T value and the 
d810: 72 65 6d 61 69 6e 64 65 72 20 69 67 6e 6f 72 65  remainder ignore
d820: 64 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73  d..#.do_expr_tes
d830: 74 20 65 5f 65 78 70 72 2d 32 39 2e 32 2e 31 20  t e_expr-29.2.1 
d840: 7b 20 43 41 53 54 28 27 31 2e 32 33 61 62 63 64  { CAST('1.23abcd
d850: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
d860: 6c 20 31 2e 32 33 0a 64 6f 5f 65 78 70 72 5f 74  l 1.23.do_expr_t
d870: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 32 2e  est e_expr-29.2.
d880: 32 20 7b 20 43 41 53 54 28 27 31 2e 34 35 2e 32  2 { CAST('1.45.2
d890: 33 61 62 63 64 27 20 41 53 20 52 45 41 4c 29 20  3abcd' AS REAL) 
d8a0: 7d 20 72 65 61 6c 20 31 2e 34 35 0a 64 6f 5f 65  } real 1.45.do_e
d8b0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
d8c0: 32 39 2e 32 2e 33 20 7b 20 43 41 53 54 28 27 2d  29.2.3 { CAST('-
d8d0: 32 2e 31 32 65 2d 30 31 41 42 43 27 20 41 53 20  2.12e-01ABC' AS 
d8e0: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 2d 30 2e  REAL) } real -0.
d8f0: 32 31 32 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  212.do_expr_test
d900: 20 65 5f 65 78 70 72 2d 32 39 2e 32 2e 34 20 7b   e_expr-29.2.4 {
d910: 20 43 41 53 54 28 27 31 20 32 20 33 20 34 27 20   CAST('1 2 3 4' 
d920: 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20  AS REAL) } real 
d930: 31 2e 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  1.0..# EVIDENCE-
d940: 4f 46 3a 20 52 2d 31 31 33 32 31 2d 34 37 34 32  OF: R-11321-4742
d950: 37 20 41 6e 79 20 6c 65 61 64 69 6e 67 20 73 70  7 Any leading sp
d960: 61 63 65 73 20 69 6e 20 74 68 65 20 54 45 58 54  aces in the TEXT
d970: 20 76 61 6c 75 65 20 61 72 65 0a 23 20 69 67 6e   value are.# ign
d980: 6f 72 65 64 20 77 68 65 6e 20 63 6f 6e 76 65 72  ored when conver
d990: 67 69 6e 67 20 66 72 6f 6d 20 54 45 58 54 20 74  ging from TEXT t
d9a0: 6f 20 52 45 41 4c 2e 0a 23 0a 64 6f 5f 65 78 70  o REAL..#.do_exp
d9b0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
d9c0: 2e 33 2e 31 20 7b 20 43 41 53 54 28 27 20 31 2e  .3.1 { CAST(' 1.
d9d0: 32 33 61 62 63 64 27 20 41 53 20 52 45 41 4c 29  23abcd' AS REAL)
d9e0: 20 7d 20 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f   } real 1.23.do_
d9f0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
da00: 2d 32 39 2e 33 2e 32 20 7b 20 43 41 53 54 28 27  -29.3.2 { CAST('
da10: 20 20 20 20 31 2e 34 35 2e 32 33 61 62 63 64 27      1.45.23abcd'
da20: 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c   AS REAL) } real
da30: 20 31 2e 34 35 0a 64 6f 5f 65 78 70 72 5f 74 65   1.45.do_expr_te
da40: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e 33  st e_expr-29.3.3
da50: 20 7b 20 43 41 53 54 28 27 20 20 20 2d 32 2e 31   { CAST('   -2.1
da60: 32 65 2d 30 31 41 42 43 27 20 41 53 20 52 45 41  2e-01ABC' AS REA
da70: 4c 29 20 7d 20 72 65 61 6c 20 2d 30 2e 32 31 32  L) } real -0.212
da80: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
da90: 65 78 70 72 2d 32 39 2e 33 2e 34 20 7b 20 43 41  expr-29.3.4 { CA
daa0: 53 54 28 27 20 31 20 32 20 33 20 34 27 20 41 53  ST(' 1 2 3 4' AS
dab0: 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e   REAL) } real 1.
dac0: 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  0..# EVIDENCE-OF
dad0: 3a 20 52 2d 32 32 36 36 32 2d 32 38 32 31 38 20  : R-22662-28218 
dae0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  If there is no p
daf0: 72 65 66 69 78 20 74 68 61 74 20 63 61 6e 20 62  refix that can b
db00: 65 0a 23 20 69 6e 74 65 72 70 72 65 74 65 64 20  e.# interpreted 
db10: 61 73 20 61 20 72 65 61 6c 20 6e 75 6d 62 65 72  as a real number
db20: 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  , the result of 
db30: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69  the conversion i
db40: 73 20 30 2e 30 2e 0a 23 0a 64 6f 5f 65 78 70 72  s 0.0..#.do_expr
db50: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
db60: 34 2e 31 20 7b 20 43 41 53 54 28 27 27 20 41 53  4.1 { CAST('' AS
db70: 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 30 2e   REAL) } real 0.
db80: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
db90: 5f 65 78 70 72 2d 32 39 2e 34 2e 32 20 7b 20 43  _expr-29.4.2 { C
dba0: 41 53 54 28 27 6e 6f 74 20 61 20 6e 75 6d 62 65  AST('not a numbe
dbb0: 72 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  r' AS REAL) } re
dbc0: 61 6c 20 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74  al 0.0.do_expr_t
dbd0: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 34 2e  est e_expr-29.4.
dbe0: 33 20 7b 20 43 41 53 54 28 27 58 58 49 27 20 41  3 { CAST('XXI' A
dbf0: 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 30  S REAL) } real 0
dc00: 2e 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .0..# EVIDENCE-O
dc10: 46 3a 20 52 2d 32 31 38 32 39 2d 31 34 35 36 33  F: R-21829-14563
dc20: 20 57 68 65 6e 20 63 61 73 74 69 6e 67 20 61 20   When casting a 
dc30: 42 4c 4f 42 20 76 61 6c 75 65 20 74 6f 20 49 4e  BLOB value to IN
dc40: 54 45 47 45 52 2c 20 74 68 65 0a 23 20 76 61 6c  TEGER, the.# val
dc50: 75 65 20 69 73 20 66 69 72 73 74 20 63 6f 6e 76  ue is first conv
dc60: 65 72 74 65 64 20 74 6f 20 54 45 58 54 2e 0a 23  erted to TEXT..#
dc70: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
dc80: 65 78 70 72 2d 33 30 2e 31 2e 31 20 7b 20 43 41  expr-30.1.1 { CA
dc90: 53 54 28 58 27 33 31 33 32 33 33 27 20 41 53 20  ST(X'313233' AS 
dca0: 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67  INTEGER) } integ
dcb0: 65 72 20 31 32 33 0a 64 6f 5f 65 78 70 72 5f 74  er 123.do_expr_t
dcc0: 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e  est e_expr-30.1.
dcd0: 32 20 7b 20 43 41 53 54 28 58 27 32 44 33 36 33  2 { CAST(X'2D363
dce0: 37 33 38 27 20 41 53 20 49 4e 54 45 47 45 52 29  738' AS INTEGER)
dcf0: 20 7d 20 69 6e 74 65 67 65 72 20 2d 36 37 38 0a   } integer -678.
dd00: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
dd10: 78 70 72 2d 33 30 2e 31 2e 33 20 7b 20 0a 20 20  xpr-30.1.3 { .  
dd20: 43 41 53 54 28 58 27 33 31 33 30 33 30 33 30 33  CAST(X'313030303
dd30: 30 33 30 33 30 27 20 41 53 20 49 4e 54 45 47 45  03030' AS INTEGE
dd40: 52 29 20 0a 7d 20 69 6e 74 65 67 65 72 20 31 30  R) .} integer 10
dd50: 30 30 30 30 30 0a 64 6f 5f 65 78 70 72 5f 74 65  00000.do_expr_te
dd60: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 34  st e_expr-30.1.4
dd70: 20 7b 20 0a 20 20 43 41 53 54 28 58 27 32 44 33   { .  CAST(X'2D3
dd80: 31 33 31 33 32 33 35 33 38 33 39 33 39 33 39 33  1313235383939393
dd90: 30 33 36 33 38 33 34 33 32 33 36 33 32 33 34 27  036383432363234'
dda0: 20 41 53 20 49 4e 54 45 47 45 52 29 20 0a 7d 20   AS INTEGER) .} 
ddb0: 69 6e 74 65 67 65 72 20 2d 31 31 32 35 38 39 39  integer -1125899
ddc0: 39 30 36 38 34 32 36 32 34 0a 0a 72 65 6e 61 6d  906842624..renam
ddd0: 65 20 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33  e db db2.sqlite3
dde0: 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 69 66 63   db :memory:.ifc
ddf0: 61 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b  apable {utf16} {
de00: 0a 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d  .execsql { PRAGM
de10: 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74  A encoding = 'ut
de20: 66 2d 31 36 62 65 27 20 7d 0a 64 6f 5f 65 78 70  f-16be' }.do_exp
de30: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
de40: 2e 31 2e 35 20 7b 20 43 41 53 54 28 58 27 30 30  .1.5 { CAST(X'00
de50: 33 31 30 30 33 32 30 30 33 33 27 20 41 53 20 49  3100320033' AS I
de60: 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65  NTEGER) } intege
de70: 72 20 31 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65  r 123.do_expr_te
de80: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 36  st e_expr-30.1.6
de90: 20 7b 20 43 41 53 54 28 58 27 30 30 32 44 30 30   { CAST(X'002D00
dea0: 33 36 30 30 33 37 30 30 33 38 27 20 41 53 20 49  3600370038' AS I
deb0: 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65  NTEGER) } intege
dec0: 72 20 2d 36 37 38 0a 64 6f 5f 65 78 70 72 5f 74  r -678.do_expr_t
ded0: 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e  est e_expr-30.1.
dee0: 37 20 7b 20 0a 20 20 43 41 53 54 28 58 27 30 30  7 { .  CAST(X'00
def0: 33 31 30 30 33 30 30 30 33 30 30 30 33 30 30 30  3100300030003000
df00: 33 30 30 30 33 30 30 30 33 30 27 20 41 53 20 49  3000300030' AS I
df10: 4e 54 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67  NTEGER) .} integ
df20: 65 72 20 31 30 30 30 30 30 30 0a 64 6f 5f 65 78  er 1000000.do_ex
df30: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
df40: 30 2e 31 2e 38 20 7b 20 0a 20 20 43 41 53 54 28  0.1.8 { .  CAST(
df50: 58 27 30 30 32 44 30 30 33 31 30 30 33 31 30 30  X'002D0031003100
df60: 33 32 30 30 33 35 30 30 33 38 30 30 33 39 30 30  3200350038003900
df70: 33 39 30 30 33 39 30 30 33 30 30 30 33 36 30 30  3900390030003600
df80: 33 38 30 30 33 34 30 30 33 32 30 30 33 36 30 30  3800340032003600
df90: 33 32 30 30 33 34 27 20 41 53 20 49 4e 54 45 47  320034' AS INTEG
dfa0: 45 52 29 20 0a 7d 20 69 6e 74 65 67 65 72 20 2d  ER) .} integer -
dfb0: 31 31 32 35 38 39 39 39 30 36 38 34 32 36 32 34  1125899906842624
dfc0: 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61  .}.db close.rena
dfd0: 6d 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49  me db2 db..# EVI
dfe0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 31  DENCE-OF: R-4761
dff0: 32 2d 34 35 38 34 32 20 57 68 65 6e 20 63 61 73  2-45842 When cas
e000: 74 69 6e 67 20 61 20 54 45 58 54 20 76 61 6c 75  ting a TEXT valu
e010: 65 20 74 6f 20 49 4e 54 45 47 45 52 2c 20 74 68  e to INTEGER, th
e020: 65 0a 23 20 6c 6f 6e 67 65 73 74 20 70 6f 73 73  e.# longest poss
e030: 69 62 6c 65 20 70 72 65 66 69 78 20 6f 66 20 74  ible prefix of t
e040: 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 63 61  he value that ca
e050: 6e 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64  n be interpreted
e060: 20 61 73 20 61 6e 0a 23 20 69 6e 74 65 67 65 72   as an.# integer
e070: 20 6e 75 6d 62 65 72 20 69 73 20 65 78 74 72 61   number is extra
e080: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 54 45  cted from the TE
e090: 58 54 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  XT value and the
e0a0: 20 72 65 6d 61 69 6e 64 65 72 0a 23 20 69 67 6e   remainder.# ign
e0b0: 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  ored..#.do_expr_
e0c0: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 32  test e_expr-30.2
e0d0: 2e 31 20 7b 20 43 41 53 54 28 27 31 32 33 61 62  .1 { CAST('123ab
e0e0: 63 64 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e  cd' AS INT) } in
e0f0: 74 65 67 65 72 20 31 32 33 0a 64 6f 5f 65 78 70  teger 123.do_exp
e100: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
e110: 2e 32 2e 32 20 7b 20 43 41 53 54 28 27 31 34 35  .2.2 { CAST('145
e120: 32 33 61 62 63 64 27 20 41 53 20 49 4e 54 29 20  23abcd' AS INT) 
e130: 7d 20 69 6e 74 65 67 65 72 20 31 34 35 32 33 0a  } integer 14523.
e140: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e150: 78 70 72 2d 33 30 2e 32 2e 33 20 7b 20 43 41 53  xpr-30.2.3 { CAS
e160: 54 28 27 2d 32 2e 31 32 65 2d 30 31 41 42 43 27  T('-2.12e-01ABC'
e170: 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67   AS INT) } integ
e180: 65 72 20 2d 32 0a 64 6f 5f 65 78 70 72 5f 74 65  er -2.do_expr_te
e190: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 32 2e 34  st e_expr-30.2.4
e1a0: 20 7b 20 43 41 53 54 28 27 31 20 32 20 33 20 34   { CAST('1 2 3 4
e1b0: 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65  ' AS INT) } inte
e1c0: 67 65 72 20 31 0a 0a 23 20 45 56 49 44 45 4e 43  ger 1..# EVIDENC
e1d0: 45 2d 4f 46 3a 20 52 2d 33 34 34 30 30 2d 33 33  E-OF: R-34400-33
e1e0: 37 37 32 20 41 6e 79 20 6c 65 61 64 69 6e 67 20  772 Any leading 
e1f0: 73 70 61 63 65 73 20 69 6e 20 74 68 65 20 54 45  spaces in the TE
e200: 58 54 20 76 61 6c 75 65 20 77 68 65 6e 0a 23 20  XT value when.# 
e210: 63 6f 6e 76 65 72 74 69 6e 67 20 66 72 6f 6d 20  converting from 
e220: 54 45 58 54 20 74 6f 20 49 4e 54 45 47 45 52 20  TEXT to INTEGER 
e230: 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64  are ignored..#.d
e240: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
e250: 70 72 2d 33 30 2e 33 2e 31 20 7b 20 43 41 53 54  pr-30.3.1 { CAST
e260: 28 27 20 20 20 31 32 33 61 62 63 64 27 20 41 53  ('   123abcd' AS
e270: 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20   INT) } integer 
e280: 31 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  123.do_expr_test
e290: 20 65 5f 65 78 70 72 2d 33 30 2e 33 2e 32 20 7b   e_expr-30.3.2 {
e2a0: 20 43 41 53 54 28 27 20 20 31 34 35 32 33 61 62   CAST('  14523ab
e2b0: 63 64 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e  cd' AS INT) } in
e2c0: 74 65 67 65 72 20 31 34 35 32 33 0a 64 6f 5f 65  teger 14523.do_e
e2d0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
e2e0: 33 30 2e 33 2e 33 20 7b 20 43 41 53 54 28 27 20  30.3.3 { CAST(' 
e2f0: 2d 32 2e 31 32 65 2d 30 31 41 42 43 27 20 41 53  -2.12e-01ABC' AS
e300: 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20   INT) } integer 
e310: 2d 32 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  -2.do_expr_test 
e320: 65 5f 65 78 70 72 2d 33 30 2e 33 2e 34 20 7b 20  e_expr-30.3.4 { 
e330: 43 41 53 54 28 27 20 20 20 20 20 31 20 32 20 33  CAST('     1 2 3
e340: 20 34 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e   4' AS INT) } in
e350: 74 65 67 65 72 20 31 0a 0a 23 20 45 56 49 44 45  teger 1..# EVIDE
e360: 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 31 36 34 2d  NCE-OF: R-43164-
e370: 34 34 32 37 36 20 49 66 20 74 68 65 72 65 20 69  44276 If there i
e380: 73 20 6e 6f 20 70 72 65 66 69 78 20 74 68 61 74  s no prefix that
e390: 20 63 61 6e 20 62 65 0a 23 20 69 6e 74 65 72 70   can be.# interp
e3a0: 72 65 74 65 64 20 61 73 20 61 6e 20 69 6e 74 65  reted as an inte
e3b0: 67 65 72 20 6e 75 6d 62 65 72 2c 20 74 68 65 20  ger number, the 
e3c0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f  result of the co
e3d0: 6e 76 65 72 73 69 6f 6e 20 69 73 20 30 2e 0a 23  nversion is 0..#
e3e0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e3f0: 65 78 70 72 2d 33 30 2e 34 2e 31 20 7b 20 43 41  expr-30.4.1 { CA
e400: 53 54 28 27 27 20 41 53 20 49 4e 54 45 47 45 52  ST('' AS INTEGER
e410: 29 20 7d 20 69 6e 74 65 67 65 72 20 30 0a 64 6f  ) } integer 0.do
e420: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e430: 72 2d 33 30 2e 34 2e 32 20 7b 20 43 41 53 54 28  r-30.4.2 { CAST(
e440: 27 6e 6f 74 20 61 20 6e 75 6d 62 65 72 27 20 41  'not a number' A
e450: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e460: 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72 5f 74  eger 0.do_expr_t
e470: 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 34 2e  est e_expr-30.4.
e480: 33 20 7b 20 43 41 53 54 28 27 58 58 49 27 20 41  3 { CAST('XXI' A
e490: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e4a0: 65 67 65 72 20 30 0a 0a 23 20 45 56 49 44 45 4e  eger 0..# EVIDEN
e4b0: 43 45 2d 4f 46 3a 20 52 2d 30 30 37 34 31 2d 33  CE-OF: R-00741-3
e4c0: 38 37 37 36 20 41 20 63 61 73 74 20 6f 66 20 61  8776 A cast of a
e4d0: 20 52 45 41 4c 20 76 61 6c 75 65 20 69 6e 74 6f   REAL value into
e4e0: 20 61 6e 20 49 4e 54 45 47 45 52 20 77 69 6c 6c   an INTEGER will
e4f0: 0a 23 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  .# truncate the 
e500: 66 72 61 63 74 69 6f 6e 61 6c 20 70 61 72 74 20  fractional part 
e510: 6f 66 20 74 68 65 20 52 45 41 4c 2e 0a 23 0a 64  of the REAL..#.d
e520: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
e530: 70 72 2d 33 31 2e 31 2e 31 20 7b 20 43 41 53 54  pr-31.1.1 { CAST
e540: 28 33 2e 31 34 31 35 39 20 41 53 20 49 4e 54 45  (3.14159 AS INTE
e550: 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 33  GER) } integer 3
e560: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e570: 65 78 70 72 2d 33 31 2e 31 2e 32 20 7b 20 43 41  expr-31.1.2 { CA
e580: 53 54 28 31 2e 39 39 39 39 39 20 41 53 20 49 4e  ST(1.99999 AS IN
e590: 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72  TEGER) } integer
e5a0: 20 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20   1.do_expr_test 
e5b0: 65 5f 65 78 70 72 2d 33 31 2e 31 2e 33 20 7b 20  e_expr-31.1.3 { 
e5c0: 43 41 53 54 28 2d 31 2e 39 39 39 39 39 20 41 53  CAST(-1.99999 AS
e5d0: 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65   INTEGER) } inte
e5e0: 67 65 72 20 2d 31 0a 64 6f 5f 65 78 70 72 5f 74  ger -1.do_expr_t
e5f0: 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 31 2e  est e_expr-31.1.
e600: 34 20 7b 20 43 41 53 54 28 2d 30 2e 39 39 39 39  4 { CAST(-0.9999
e610: 39 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20  9 AS INTEGER) } 
e620: 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45 56 49  integer 0..# EVI
e630: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 35 30  DENCE-OF: R-4950
e640: 33 2d 32 38 31 30 35 20 49 66 20 61 20 52 45 41  3-28105 If a REA
e650: 4c 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  L is too large t
e660: 6f 20 62 65 20 72 65 70 72 65 73 65 6e 74 65 64  o be represented
e670: 20 61 73 0a 23 20 61 6e 20 49 4e 54 45 47 45 52   as.# an INTEGER
e680: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
e690: 20 6f 66 20 74 68 65 20 63 61 73 74 20 69 73 20   of the cast is 
e6a0: 74 68 65 20 6c 61 72 67 65 73 74 20 6e 65 67 61  the largest nega
e6b0: 74 69 76 65 0a 23 20 69 6e 74 65 67 65 72 3a 20  tive.# integer: 
e6c0: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
e6d0: 35 38 30 38 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  5808..#.do_expr_
e6e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 32  test e_expr-31.2
e6f0: 2e 31 20 7b 20 43 41 53 54 28 32 65 2b 35 30 20  .1 { CAST(2e+50 
e700: 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65  AS INT) } intege
e710: 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  r -9223372036854
e720: 37 37 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74  775808.do_expr_t
e730: 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 32 2e  est e_expr-31.2.
e740: 32 20 7b 20 43 41 53 54 28 2d 32 65 2b 35 30 20  2 { CAST(-2e+50 
e750: 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65  AS INT) } intege
e760: 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  r -9223372036854
e770: 37 37 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74  775808.do_expr_t
e780: 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 32 2e  est e_expr-31.2.
e790: 33 20 7b 20 0a 20 20 43 41 53 54 28 2d 39 32 32  3 { .  CAST(-922
e7a0: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 39  3372036854775809
e7b0: 2e 30 20 41 53 20 49 4e 54 29 0a 7d 20 69 6e 74  .0 AS INT).} int
e7c0: 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33 36  eger -9223372036
e7d0: 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78 70  854775808.do_exp
e7e0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31  r_test e_expr-31
e7f0: 2e 32 2e 34 20 7b 20 0a 20 20 43 41 53 54 28 39  .2.4 { .  CAST(9
e800: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
e810: 30 39 2e 30 20 41 53 20 49 4e 54 29 0a 7d 20 69  09.0 AS INT).} i
e820: 6e 74 65 67 65 72 20 2d 39 32 32 33 33 37 32 30  nteger -92233720
e830: 33 36 38 35 34 37 37 35 38 30 38 0a 0a 0a 23 20  36854775808...# 
e840: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
e850: 39 32 39 35 2d 36 31 33 33 37 20 43 61 73 74 69  9295-61337 Casti
e860: 6e 67 20 61 20 54 45 58 54 20 6f 72 20 42 4c 4f  ng a TEXT or BLO
e870: 42 20 76 61 6c 75 65 20 69 6e 74 6f 20 4e 55 4d  B value into NUM
e880: 45 52 49 43 0a 23 20 66 69 72 73 74 20 64 6f 65  ERIC.# first doe
e890: 73 20 61 20 66 6f 72 63 65 64 20 63 6f 6e 76 65  s a forced conve
e8a0: 72 73 69 6f 6e 20 69 6e 74 6f 20 52 45 41 4c 20  rsion into REAL 
e8b0: 62 75 74 20 74 68 65 6e 20 66 75 72 74 68 65 72  but then further
e8c0: 20 63 6f 6e 76 65 72 74 73 20 74 68 65 0a 23 20   converts the.# 
e8d0: 72 65 73 75 6c 74 20 69 6e 74 6f 20 49 4e 54 45  result into INTE
e8e0: 47 45 52 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  GER if and only 
e8f0: 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  if the conversio
e900: 6e 20 66 72 6f 6d 20 52 45 41 4c 20 74 6f 20 49  n from REAL to I
e910: 4e 54 45 47 45 52 0a 23 20 69 73 20 6c 6f 73 73  NTEGER.# is loss
e920: 6c 65 73 73 20 61 6e 64 20 72 65 76 65 72 73 69  less and reversi
e930: 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74  ble..#.do_expr_t
e940: 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e  est e_expr-32.1.
e950: 31 20 7b 20 43 41 53 54 28 27 34 35 27 20 20 20  1 { CAST('45'   
e960: 41 53 20 4e 55 4d 45 52 49 43 29 20 20 7d 20 69  AS NUMERIC)  } i
e970: 6e 74 65 67 65 72 20 34 35 0a 64 6f 5f 65 78 70  nteger 45.do_exp
e980: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32  r_test e_expr-32
e990: 2e 31 2e 32 20 7b 20 43 41 53 54 28 27 34 35 2e  .1.2 { CAST('45.
e9a0: 30 27 20 41 53 20 4e 55 4d 45 52 49 43 29 20 20  0' AS NUMERIC)  
e9b0: 7d 20 69 6e 74 65 67 65 72 20 34 35 0a 64 6f 5f  } integer 45.do_
e9c0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e9d0: 2d 33 32 2e 31 2e 33 20 7b 20 43 41 53 54 28 27  -32.1.3 { CAST('
e9e0: 34 35 2e 32 27 20 41 53 20 4e 55 4d 45 52 49 43  45.2' AS NUMERIC
e9f0: 29 20 20 7d 20 72 65 61 6c 20 34 35 2e 32 0a 64  )  } real 45.2.d
ea00: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
ea10: 70 72 2d 33 32 2e 31 2e 34 20 7b 20 43 41 53 54  pr-32.1.4 { CAST
ea20: 28 27 31 31 61 62 63 27 20 41 53 20 4e 55 4d 45  ('11abc' AS NUME
ea30: 52 49 43 29 20 7d 20 69 6e 74 65 67 65 72 20 31  RIC) } integer 1
ea40: 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  1.do_expr_test e
ea50: 5f 65 78 70 72 2d 33 32 2e 31 2e 35 20 7b 20 43  _expr-32.1.5 { C
ea60: 41 53 54 28 27 31 31 2e 31 61 62 63 27 20 41 53  AST('11.1abc' AS
ea70: 20 4e 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c   NUMERIC) } real
ea80: 20 31 31 2e 31 0a 0a 23 20 45 56 49 44 45 4e 43   11.1..# EVIDENC
ea90: 45 2d 4f 46 3a 20 52 2d 33 30 33 34 37 2d 31 38  E-OF: R-30347-18
eaa0: 37 30 32 20 43 61 73 74 69 6e 67 20 61 20 52 45  702 Casting a RE
eab0: 41 4c 20 6f 72 20 49 4e 54 45 47 45 52 20 76 61  AL or INTEGER va
eac0: 6c 75 65 20 74 6f 20 4e 55 4d 45 52 49 43 0a 23  lue to NUMERIC.#
ead0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 65 76 65   is a no-op, eve
eae0: 6e 20 69 66 20 61 20 72 65 61 6c 20 76 61 6c 75  n if a real valu
eaf0: 65 20 63 6f 75 6c 64 20 62 65 20 6c 6f 73 73 6c  e could be lossl
eb00: 65 73 73 6c 79 20 63 6f 6e 76 65 72 74 65 64 20  essly converted 
eb10: 74 6f 20 61 6e 0a 23 20 69 6e 74 65 67 65 72 2e  to an.# integer.
eb20: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
eb30: 65 5f 65 78 70 72 2d 33 32 2e 32 2e 31 20 7b 20  e_expr-32.2.1 { 
eb40: 43 41 53 54 28 31 33 2e 30 20 41 53 20 4e 55 4d  CAST(13.0 AS NUM
eb50: 45 52 49 43 29 20 7d 20 72 65 61 6c 20 31 33 2e  ERIC) } real 13.
eb60: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
eb70: 5f 65 78 70 72 2d 33 32 2e 32 2e 32 20 7b 20 43  _expr-32.2.2 { C
eb80: 41 53 54 28 31 33 2e 35 20 41 53 20 4e 55 4d 45  AST(13.5 AS NUME
eb90: 52 49 43 29 20 7d 20 72 65 61 6c 20 31 33 2e 35  RIC) } real 13.5
eba0: 0a 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  ..do_expr_test e
ebb0: 5f 65 78 70 72 2d 33 32 2e 32 2e 33 20 7b 20 0a  _expr-32.2.3 { .
ebc0: 20 20 43 41 53 54 28 2d 39 32 32 33 33 37 32 30    CAST(-92233720
ebd0: 33 36 38 35 34 37 37 35 38 30 38 20 41 53 20 4e  36854775808 AS N
ebe0: 55 4d 45 52 49 43 29 0a 7d 20 69 6e 74 65 67 65  UMERIC).} intege
ebf0: 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  r -9223372036854
ec00: 37 37 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74  775808.do_expr_t
ec10: 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e  est e_expr-32.2.
ec20: 34 20 7b 20 0a 20 20 43 41 53 54 28 39 32 32 33  4 { .  CAST(9223
ec30: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 20  372036854775807 
ec40: 41 53 20 4e 55 4d 45 52 49 43 29 0a 7d 20 69 6e  AS NUMERIC).} in
ec50: 74 65 67 65 72 20 39 32 32 33 33 37 32 30 33 36  teger 9223372036
ec60: 38 35 34 37 37 35 38 30 37 0a 0a 23 20 45 56 49  854775807..# EVI
ec70: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34 35 35  DENCE-OF: R-6455
ec80: 30 2d 32 39 31 39 31 20 4e 6f 74 65 20 74 68 61  0-29191 Note tha
ec90: 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f  t the result fro
eca0: 6d 20 63 61 73 74 69 6e 67 20 61 6e 79 0a 23 20  m casting any.# 
ecb0: 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65 20 69  non-BLOB value i
ecc0: 6e 74 6f 20 61 20 42 4c 4f 42 20 61 6e 64 20 74  nto a BLOB and t
ecd0: 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d 20 63  he result from c
ece0: 61 73 74 69 6e 67 20 61 6e 79 20 42 4c 4f 42 20  asting any BLOB 
ecf0: 76 61 6c 75 65 0a 23 20 69 6e 74 6f 20 61 20 6e  value.# into a n
ed00: 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65 20 6d 61  on-BLOB value ma
ed10: 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 64  y be different d
ed20: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
ed30: 68 65 72 20 74 68 65 0a 23 20 64 61 74 61 62 61  her the.# databa
ed40: 73 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 55  se encoding is U
ed50: 54 46 2d 38 2c 20 55 54 46 2d 31 36 62 65 2c 20  TF-8, UTF-16be, 
ed60: 6f 72 20 55 54 46 2d 31 36 6c 65 2e 0a 23 0a 69  or UTF-16le..#.i
ed70: 66 63 61 70 61 62 6c 65 20 7b 75 74 66 31 36 7d  fcapable {utf16}
ed80: 20 7b 0a 73 71 6c 69 74 65 33 20 64 62 31 20 3a   {.sqlite3 db1 :
ed90: 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 31 20 65 76  memory: ; db1 ev
eda0: 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f  al { PRAGMA enco
edb0: 64 69 6e 67 20 3d 20 27 75 74 66 2d 38 27 20 7d  ding = 'utf-8' }
edc0: 0a 73 71 6c 69 74 65 33 20 64 62 32 20 3a 6d 65  .sqlite3 db2 :me
edd0: 6d 6f 72 79 3a 20 3b 20 64 62 32 20 65 76 61 6c  mory: ; db2 eval
ede0: 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69   { PRAGMA encodi
edf0: 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65 27 20  ng = 'utf-16le' 
ee00: 7d 0a 73 71 6c 69 74 65 33 20 64 62 33 20 3a 6d  }.sqlite3 db3 :m
ee10: 65 6d 6f 72 79 3a 20 3b 20 64 62 33 20 65 76 61  emory: ; db3 eva
ee20: 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  l { PRAGMA encod
ee30: 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 62 65 27  ing = 'utf-16be'
ee40: 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 63   }.foreach {tn c
ee50: 61 73 74 65 78 70 72 20 64 69 66 66 65 72 73 7d  astexpr differs}
ee60: 20 7b 0a 20 20 31 20 7b 20 43 41 53 54 28 31 32   {.  1 { CAST(12
ee70: 33 20 41 53 20 42 4c 4f 42 29 20 20 20 20 7d 20  3 AS BLOB)    } 
ee80: 31 0a 20 20 32 20 7b 20 43 41 53 54 28 27 27 20  1.  2 { CAST('' 
ee90: 41 53 20 42 4c 4f 42 29 20 20 20 20 20 7d 20 30  AS BLOB)     } 0
eea0: 0a 20 20 33 20 7b 20 43 41 53 54 28 27 61 62 63  .  3 { CAST('abc
eeb0: 64 27 20 41 53 20 42 4c 4f 42 29 20 7d 20 31 0a  d' AS BLOB) } 1.
eec0: 0a 20 20 34 20 7b 20 43 41 53 54 28 58 27 61 62  .  4 { CAST(X'ab
eed0: 63 64 27 20 41 53 20 54 45 58 54 29 20 7d 20 31  cd' AS TEXT) } 1
eee0: 0a 20 20 35 20 7b 20 43 41 53 54 28 58 27 27 20  .  5 { CAST(X'' 
eef0: 41 53 20 54 45 58 54 29 20 20 20 20 20 7d 20 30  AS TEXT)     } 0
ef00: 0a 7d 20 7b 0a 20 20 73 65 74 20 72 31 20 5b 64  .} {.  set r1 [d
ef10: 62 31 20 65 76 61 6c 20 22 53 45 4c 45 43 54 20  b1 eval "SELECT 
ef20: 74 79 70 65 6f 66 28 24 63 61 73 74 65 78 70 72  typeof($castexpr
ef30: 29 2c 20 71 75 6f 74 65 28 24 63 61 73 74 65 78  ), quote($castex
ef40: 70 72 29 22 5d 0a 20 20 73 65 74 20 72 32 20 5b  pr)"].  set r2 [
ef50: 64 62 32 20 65 76 61 6c 20 22 53 45 4c 45 43 54  db2 eval "SELECT
ef60: 20 74 79 70 65 6f 66 28 24 63 61 73 74 65 78 70   typeof($castexp
ef70: 72 29 2c 20 71 75 6f 74 65 28 24 63 61 73 74 65  r), quote($caste
ef80: 78 70 72 29 22 5d 0a 20 20 73 65 74 20 72 33 20  xpr)"].  set r3 
ef90: 5b 64 62 33 20 65 76 61 6c 20 22 53 45 4c 45 43  [db3 eval "SELEC
efa0: 54 20 74 79 70 65 6f 66 28 24 63 61 73 74 65 78  T typeof($castex
efb0: 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61 73 74  pr), quote($cast
efc0: 65 78 70 72 29 22 5d 0a 0a 20 20 69 66 20 7b 24  expr)"]..  if {$
efd0: 64 69 66 66 65 72 73 7d 20 7b 0a 20 20 20 20 73  differs} {.    s
efe0: 65 74 20 72 65 73 20 5b 65 78 70 72 20 7b 24 72  et res [expr {$r
eff0: 31 21 3d 24 72 32 20 26 26 20 24 72 32 21 3d 24  1!=$r2 && $r2!=$
f000: 72 33 7d 5d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  r3}].  } else {.
f010: 20 20 20 20 73 65 74 20 72 65 73 20 5b 65 78 70      set res [exp
f020: 72 20 7b 24 72 31 3d 3d 24 72 32 20 26 26 20 24  r {$r1==$r2 && $
f030: 72 32 3d 3d 24 72 33 7d 5d 0a 20 20 7d 0a 0a 20  r2==$r3}].  }.. 
f040: 20 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d   do_test e_expr-
f050: 33 33 2e 31 2e 24 74 6e 20 7b 73 65 74 20 72 65  33.1.$tn {set re
f060: 73 7d 20 31 0a 7d 0a 64 62 31 20 63 6c 6f 73 65  s} 1.}.db1 close
f070: 0a 64 62 32 20 63 6c 6f 73 65 0a 64 62 33 20 63  .db2 close.db3 c
f080: 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  lose.}..#-------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0d0: 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65 6d  --.# Test statem
f0e0: 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20  ents related to 
f0f0: 74 68 65 20 45 58 49 53 54 53 20 61 6e 64 20 4e  the EXISTS and N
f100: 4f 54 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  OT EXISTS operat
f110: 6f 72 73 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64  ors..#.catch { d
f120: 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64  b close }.forced
f130: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 73 71  elete test.db.sq
f140: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
f150: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
f160: 74 20 65 5f 65 78 70 72 2d 33 34 2e 31 20 7b 0a  t e_expr-34.1 {.
f170: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
f180: 31 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52  1(a, b);.  INSER
f190: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
f1a0: 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54  (1, 2);.  INSERT
f1b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
f1c0: 4e 55 4c 4c 2c 20 32 29 3b 0a 20 20 49 4e 53 45  NULL, 2);.  INSE
f1d0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
f1e0: 53 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20 49 4e  S(1, NULL);.  IN
f1f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
f200: 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  UES(NULL, NULL);
f210: 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43  .} {}..# EVIDENC
f220: 45 2d 4f 46 3a 20 52 2d 32 35 35 38 38 2d 32 37  E-OF: R-25588-27
f230: 31 38 31 20 54 68 65 20 45 58 49 53 54 53 20 6f  181 The EXISTS o
f240: 70 65 72 61 74 6f 72 20 61 6c 77 61 79 73 20 65  perator always e
f250: 76 61 6c 75 61 74 65 73 20 74 6f 20 6f 6e 65 0a  valuates to one.
f260: 23 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  # of the integer
f270: 20 76 61 6c 75 65 73 20 30 20 61 6e 64 20 31 2e   values 0 and 1.
f280: 0a 23 0a 23 20 54 68 69 73 20 73 74 61 74 65 6d  .#.# This statem
f290: 65 6e 74 20 69 73 20 6e 6f 74 20 74 65 73 74 65  ent is not teste
f2a0: 64 20 62 79 20 69 74 73 65 6c 66 2e 20 49 6e 73  d by itself. Ins
f2b0: 74 65 61 64 2c 20 61 6c 6c 20 65 5f 65 78 70 72  tead, all e_expr
f2c0: 2d 33 34 2e 2a 20 74 65 73 74 73 20 0a 23 20 66  -34.* tests .# f
f2d0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 70 6f  ollowing this po
f2e0: 69 6e 74 20 65 78 70 6c 69 63 69 74 6c 79 20 74  int explicitly t
f2f0: 65 73 74 20 74 68 61 74 20 73 70 65 63 69 66 69  est that specifi
f300: 63 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6f 66  c invocations of
f310: 20 45 58 49 53 54 53 0a 23 20 72 65 74 75 72 6e   EXISTS.# return
f320: 20 65 69 74 68 65 72 20 69 6e 74 65 67 65 72 20   either integer 
f330: 30 20 6f 72 20 69 6e 74 65 67 65 72 20 31 2e 0a  0 or integer 1..
f340: 23 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  #..# EVIDENCE-OF
f350: 3a 20 52 2d 35 38 35 35 33 2d 36 33 37 34 30 20  : R-58553-63740 
f360: 49 66 20 65 78 65 63 75 74 69 6e 67 20 74 68 65  If executing the
f370: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f380: 74 20 73 70 65 63 69 66 69 65 64 0a 23 20 61 73  t specified.# as
f390: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
f3a0: 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 45  operand of the E
f3b0: 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20 77  XISTS operator w
f3c0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e 65 20  ould return one 
f3d0: 6f 72 0a 23 20 6d 6f 72 65 20 72 6f 77 73 2c 20  or.# more rows, 
f3e0: 74 68 65 6e 20 74 68 65 20 45 58 49 53 54 53 20  then the EXISTS 
f3f0: 6f 70 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74  operator evaluat
f400: 65 73 20 74 6f 20 31 2e 0a 23 0a 66 6f 72 65 61  es to 1..#.forea
f410: 63 68 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20  ch {tn expr} {. 
f420: 20 20 20 31 20 7b 20 45 58 49 53 54 53 20 28 20     1 { EXISTS ( 
f430: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
f440: 20 29 20 7d 0a 20 20 20 20 32 20 7b 20 45 58 49   ) }.    2 { EXI
f450: 53 54 53 20 28 20 53 45 4c 45 43 54 20 62 20 46  STS ( SELECT b F
f460: 52 4f 4d 20 74 31 20 29 20 7d 0a 20 20 20 20 33  ROM t1 ) }.    3
f470: 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45   { EXISTS ( SELE
f480: 43 54 20 32 34 20 29 20 7d 0a 20 20 20 20 34 20  CT 24 ) }.    4 
f490: 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43  { EXISTS ( SELEC
f4a0: 54 20 4e 55 4c 4c 20 29 20 7d 0a 20 20 20 20 35  T NULL ) }.    5
f4b0: 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45   { EXISTS ( SELE
f4c0: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  CT a FROM t1 WHE
f4d0: 52 45 20 61 20 49 53 20 4e 55 4c 4c 20 29 20 7d  RE a IS NULL ) }
f4e0: 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70 72 5f 74  .} {.  do_expr_t
f4f0: 65 73 74 20 65 5f 65 78 70 72 2d 33 34 2e 32 2e  est e_expr-34.2.
f500: 24 74 6e 20 24 65 78 70 72 20 69 6e 74 65 67 65  $tn $expr intege
f510: 72 20 31 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  r 1.}..# EVIDENC
f520: 45 2d 4f 46 3a 20 52 2d 31 39 36 37 33 2d 34 30  E-OF: R-19673-40
f530: 39 37 32 20 49 66 20 65 78 65 63 75 74 69 6e 67  972 If executing
f540: 20 74 68 65 20 53 45 4c 45 43 54 20 77 6f 75 6c   the SELECT woul
f550: 64 20 72 65 74 75 72 6e 20 6e 6f 0a 23 20 72 6f  d return no.# ro
f560: 77 73 20 61 74 20 61 6c 6c 2c 20 74 68 65 6e 20  ws at all, then 
f570: 74 68 65 20 45 58 49 53 54 53 20 6f 70 65 72 61  the EXISTS opera
f580: 74 6f 72 20 65 76 61 6c 75 61 74 65 73 20 74 6f  tor evaluates to
f590: 20 30 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74   0..#.foreach {t
f5a0: 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20 20 31 20  n expr} {.    1 
f5b0: 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43  { EXISTS ( SELEC
f5c0: 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T a FROM t1 WHER
f5d0: 45 20 30 29 20 7d 0a 20 20 20 20 32 20 7b 20 45  E 0) }.    2 { E
f5e0: 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 62  XISTS ( SELECT b
f5f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
f600: 20 3d 20 35 29 20 7d 0a 20 20 20 20 33 20 7b 20   = 5) }.    3 { 
f610: 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
f620: 32 34 20 57 48 45 52 45 20 30 29 20 7d 0a 20 20  24 WHERE 0) }.  
f630: 20 20 34 20 7b 20 45 58 49 53 54 53 20 28 20 53    4 { EXISTS ( S
f640: 45 4c 45 43 54 20 4e 55 4c 4c 20 57 48 45 52 45  ELECT NULL WHERE
f650: 20 31 3d 32 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f   1=2) }.} {.  do
f660: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
f670: 72 2d 33 34 2e 33 2e 24 74 6e 20 24 65 78 70 72  r-34.3.$tn $expr
f680: 20 69 6e 74 65 67 65 72 20 30 0a 7d 0a 0a 23 20   integer 0.}..# 
f690: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
f6a0: 35 31 30 39 2d 34 39 31 33 39 20 54 68 65 20 6e  5109-49139 The n
f6b0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
f6c0: 20 69 6e 20 65 61 63 68 20 72 6f 77 20 72 65 74   in each row ret
f6d0: 75 72 6e 65 64 0a 23 20 62 79 20 74 68 65 20 53  urned.# by the S
f6e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
f6f0: 28 69 66 20 61 6e 79 29 20 61 6e 64 20 74 68 65  (if any) and the
f700: 20 73 70 65 63 69 66 69 63 20 76 61 6c 75 65 73   specific values
f710: 20 72 65 74 75 72 6e 65 64 20 68 61 76 65 0a 23   returned have.#
f720: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 74 68   no effect on th
f730: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
f740: 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
f750: 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  ..#.foreach {tn 
f760: 65 78 70 72 20 72 65 73 7d 20 7b 0a 20 20 20 20  expr res} {.    
f770: 31 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c  1 { EXISTS ( SEL
f780: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 29 20  ECT * FROM t1 ) 
f790: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
f7a0: 20 20 20 20 20 20 20 20 20 20 20 31 0a 20 20 20             1.   
f7b0: 20 32 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   2 { EXISTS ( SE
f7c0: 4c 45 43 54 20 2a 2c 20 2a 2c 20 2a 20 46 52 4f  LECT *, *, * FRO
f7d0: 4d 20 74 31 20 29 20 7d 20 20 20 20 20 20 20 20  M t1 ) }        
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 20 20              1.  
f7f0: 20 20 33 20 7b 20 45 58 49 53 54 53 20 28 20 53    3 { EXISTS ( S
f800: 45 4c 45 43 54 20 32 34 2c 20 32 35 20 29 20 7d  ELECT 24, 25 ) }
f810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 20               1. 
f830: 20 20 20 34 20 7b 20 45 58 49 53 54 53 20 28 20     4 { EXISTS ( 
f840: 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 4e 55 4c  SELECT NULL, NUL
f850: 4c 2c 20 4e 55 4c 4c 20 29 20 7d 20 20 20 20 20  L, NULL ) }     
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
f870: 20 20 20 20 35 20 7b 20 45 58 49 53 54 53 20 28      5 { EXISTS (
f880: 20 53 45 4c 45 43 54 20 61 2c 62 2c 61 7c 7c 62   SELECT a,b,a||b
f890: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
f8a0: 20 49 53 20 4e 55 4c 4c 20 29 20 7d 20 20 20 31   IS NULL ) }   1
f8b0: 0a 0a 20 20 20 20 36 20 7b 20 45 58 49 53 54 53  ..    6 { EXISTS
f8c0: 20 28 20 53 45 4c 45 43 54 20 61 2c 20 61 20 46   ( SELECT a, a F
f8d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 30 29 20  ROM t1 WHERE 0) 
f8e0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
f8f0: 20 30 0a 20 20 20 20 37 20 7b 20 45 58 49 53 54   0.    7 { EXIST
f900: 53 20 28 20 53 45 4c 45 43 54 20 62 2c 20 62 2c  S ( SELECT b, b,
f910: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
f920: 20 61 20 3d 20 35 29 20 7d 20 20 20 20 20 20 20   a = 5) }       
f930: 20 20 30 0a 20 20 20 20 38 20 7b 20 45 58 49 53    0.    8 { EXIS
f940: 54 53 20 28 20 53 45 4c 45 43 54 20 32 34 2c 20  TS ( SELECT 24, 
f950: 34 36 2c 20 38 39 20 57 48 45 52 45 20 30 29 20  46, 89 WHERE 0) 
f960: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
f970: 20 20 20 30 0a 20 20 20 20 39 20 7b 20 45 58 49     0.    9 { EXI
f980: 53 54 53 20 28 20 53 45 4c 45 43 54 20 4e 55 4c  STS ( SELECT NUL
f990: 4c 2c 20 4e 55 4c 4c 20 57 48 45 52 45 20 31 3d  L, NULL WHERE 1=
f9a0: 32 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  2) }            
f9b0: 20 20 20 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 65      0.} {.  do_e
f9c0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
f9d0: 33 34 2e 34 2e 24 74 6e 20 24 65 78 70 72 20 69  34.4.$tn $expr i
f9e0: 6e 74 65 67 65 72 20 24 72 65 73 0a 7d 0a 0a 23  nteger $res.}..#
f9f0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fa00: 31 30 36 34 35 2d 31 32 34 33 39 20 49 6e 20 70  10645-12439 In p
fa10: 61 72 74 69 63 75 6c 61 72 2c 20 72 6f 77 73 20  articular, rows 
fa20: 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55 4c 4c 20  containing NULL 
fa30: 76 61 6c 75 65 73 0a 23 20 61 72 65 20 6e 6f 74  values.# are not
fa40: 20 68 61 6e 64 6c 65 64 20 61 6e 79 20 64 69 66   handled any dif
fa50: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 72 6f  ferently from ro
fa60: 77 73 20 77 69 74 68 6f 75 74 20 4e 55 4c 4c 20  ws without NULL 
fa70: 76 61 6c 75 65 73 2e 0a 23 0a 66 6f 72 65 61 63  values..#.foreac
fa80: 68 20 7b 74 6e 20 65 31 20 65 32 7d 20 7b 0a 20  h {tn e1 e2} {. 
fa90: 20 31 20 7b 20 45 58 49 53 54 53 20 28 53 45 4c   1 { EXISTS (SEL
faa0: 45 43 54 20 27 6e 6f 74 20 6e 75 6c 6c 27 29 20  ECT 'not null') 
fab0: 7d 20 20 20 20 7b 20 45 58 49 53 54 53 20 28 53  }    { EXISTS (S
fac0: 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d 0a 20 20  ELECT NULL) }.  
fad0: 32 20 7b 20 45 58 49 53 54 53 20 28 53 45 4c 45  2 { EXISTS (SELE
fae0: 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74 31 29  CT NULL FROM t1)
faf0: 20 7d 20 20 7b 20 45 58 49 53 54 53 20 28 53 45   }  { EXISTS (SE
fb00: 4c 45 43 54 20 27 62 72 65 61 64 27 20 46 52 4f  LECT 'bread' FRO
fb10: 4d 20 74 31 29 20 7d 0a 7d 20 7b 0a 20 20 73 65  M t1) }.} {.  se
fb20: 74 20 72 65 73 20 5b 64 62 20 6f 6e 65 20 22 53  t res [db one "S
fb30: 45 4c 45 43 54 20 24 65 31 22 5d 0a 20 20 64 6f  ELECT $e1"].  do
fb40: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
fb50: 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d 61 20 24 65  r-34.5.${tn}a $e
fb60: 31 20 69 6e 74 65 67 65 72 20 24 72 65 73 0a 20  1 integer $res. 
fb70: 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f   do_expr_test e_
fb80: 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d 62  expr-34.5.${tn}b
fb90: 20 24 65 32 20 69 6e 74 65 67 65 72 20 24 72 65   $e2 integer $re
fba0: 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.}..#----------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
fbf0: 23 20 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74  # Test statement
fc00: 73 20 72 65 6c 61 74 65 64 20 74 6f 20 73 63 61  s related to sca
fc10: 6c 61 72 20 73 75 62 2d 71 75 65 72 69 65 73 2e  lar sub-queries.
fc20: 0a 23 0a 0a 63 61 74 63 68 20 7b 20 64 62 20 63  .#..catch { db c
fc30: 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64 65 6c 65  lose }.forcedele
fc40: 74 65 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74  te test.db.sqlit
fc50: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f  e3 db test.db.do
fc60: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e  _test e_expr-35.
fc70: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
fc80: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
fc90: 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t2(a, b);.    I
fca0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
fcb0: 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 74 77 6f  LUES('one', 'two
fcc0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
fcd0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 74  NTO t2 VALUES('t
fce0: 68 72 65 65 27 2c 20 4e 55 4c 4c 29 3b 0a 20 20  hree', NULL);.  
fcf0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
fd00: 20 56 41 4c 55 45 53 28 34 2c 20 35 2e 30 29 3b   VALUES(4, 5.0);
fd10: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49  .  }.} {}..# EVI
fd20: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 30 39 38  DENCE-OF: R-0098
fd30: 30 2d 33 39 32 35 36 20 41 20 53 45 4c 45 43 54  0-39256 A SELECT
fd40: 20 73 74 61 74 65 6d 65 6e 74 20 65 6e 63 6c 6f   statement enclo
fd50: 73 65 64 20 69 6e 20 70 61 72 65 6e 74 68 65 73  sed in parenthes
fd60: 65 73 0a 23 20 6d 61 79 20 61 70 70 65 61 72 20  es.# may appear 
fd70: 61 73 20 61 20 73 63 61 6c 61 72 20 71 75 61 6e  as a scalar quan
fd80: 74 69 74 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e  tity..#.# EVIDEN
fd90: 43 45 2d 4f 46 3a 20 52 2d 35 36 32 39 34 2d 30  CE-OF: R-56294-0
fda0: 33 39 36 36 20 41 6c 6c 20 74 79 70 65 73 20 6f  3966 All types o
fdb0: 66 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  f SELECT stateme
fdc0: 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 0a 23 20  nt, including.# 
fdd0: 61 67 67 72 65 67 61 74 65 20 61 6e 64 20 63 6f  aggregate and co
fde0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 71 75  mpound SELECT qu
fdf0: 65 72 69 65 73 20 28 71 75 65 72 69 65 73 20 77  eries (queries w
fe00: 69 74 68 20 6b 65 79 77 6f 72 64 73 20 6c 69 6b  ith keywords lik
fe10: 65 0a 23 20 55 4e 49 4f 4e 20 6f 72 20 45 58 43  e.# UNION or EXC
fe20: 45 50 54 29 20 61 72 65 20 61 6c 6c 6f 77 65 64  EPT) are allowed
fe30: 20 61 73 20 73 63 61 6c 61 72 20 73 75 62 71 75   as scalar subqu
fe40: 65 72 69 65 73 2e 0a 23 0a 64 6f 5f 65 78 70 72  eries..#.do_expr
fe50: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e  _test e_expr-35.
fe60: 31 2e 31 20 7b 20 28 53 45 4c 45 43 54 20 33 35  1.1 { (SELECT 35
fe70: 29 20 20 20 7d 20 69 6e 74 65 67 65 72 20 33 35  )   } integer 35
fe80: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
fe90: 65 78 70 72 2d 33 35 2e 31 2e 32 20 7b 20 28 53  expr-35.1.2 { (S
fea0: 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d 20 6e 75  ELECT NULL) } nu
feb0: 6c 6c 20 7b 7d 0a 0a 64 6f 5f 65 78 70 72 5f 74  ll {}..do_expr_t
fec0: 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e  est e_expr-35.1.
fed0: 33 20 7b 20 28 53 45 4c 45 43 54 20 63 6f 75 6e  3 { (SELECT coun
fee0: 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 7d 20  t(*) FROM t2) } 
fef0: 69 6e 74 65 67 65 72 20 33 0a 64 6f 5f 65 78 70  integer 3.do_exp
ff00: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35  r_test e_expr-35
ff10: 2e 31 2e 34 20 7b 20 28 53 45 4c 45 43 54 20 34  .1.4 { (SELECT 4
ff20: 20 46 52 4f 4d 20 74 32 29 20 7d 20 69 6e 74 65   FROM t2) } inte
ff30: 67 65 72 20 34 0a 0a 64 6f 5f 65 78 70 72 5f 74  ger 4..do_expr_t
ff40: 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e  est e_expr-35.1.
ff50: 35 20 7b 20 0a 20 20 28 53 45 4c 45 43 54 20 62  5 { .  (SELECT b
ff60: 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
ff70: 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 74  ELECT a+1 FROM t
ff80: 32 29 0a 7d 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f  2).} null {}.do_
ff90: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
ffa0: 2d 33 35 2e 31 2e 36 20 7b 20 0a 20 20 28 53 45  -35.1.6 { .  (SE
ffb0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 32 20 55  LECT a FROM t2 U
ffc0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 43 4f 41 4c  NION SELECT COAL
ffd0: 45 53 43 45 28 62 2c 20 35 35 29 20 46 52 4f 4d  ESCE(b, 55) FROM
ffe0: 20 74 32 20 4f 52 44 45 52 20 42 59 20 31 29 0a   t2 ORDER BY 1).
fff0: 7d 20 69 6e 74 65 67 65 72 20 34 0a 0a 23 20 45  } integer 4..# E
10000 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 36  VIDENCE-OF: R-46
10010 38 39 39 2d 35 33 37 36 35 20 41 20 53 45 4c 45  899-53765 A SELE
10020 43 54 20 75 73 65 64 20 61 73 20 61 20 73 63 61  CT used as a sca
10030 6c 61 72 20 71 75 61 6e 74 69 74 79 20 6d 75 73  lar quantity mus
10040 74 0a 23 20 72 65 74 75 72 6e 20 61 20 72 65 73  t.# return a res
10050 75 6c 74 20 73 65 74 20 77 69 74 68 20 61 20 73  ult set with a s
10060 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 23 0a  ingle column..#.
10070 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
10080 62 6c 6f 63 6b 20 74 65 73 74 73 20 74 68 61 74  block tests that
10090 20 65 72 72 6f 72 73 20 61 72 65 20 72 65 74 75   errors are retu
100a0 72 6e 65 64 20 69 6e 20 61 20 62 75 6e 63 68 20  rned in a bunch 
100b0 6f 66 20 63 61 73 65 73 0a 23 20 77 68 65 72 65  of cases.# where
100c0 20 61 20 73 75 62 71 75 65 72 79 20 72 65 74 75   a subquery retu
100d0 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  rns more than on
100e0 65 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 73 65 74 20  e column..#.set 
100f0 4d 20 7b 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  M {only a single
10100 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20   result allowed 
10110 66 6f 72 20 61 20 53 45 4c 45 43 54 20 74 68 61  for a SELECT tha
10120 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
10130 65 78 70 72 65 73 73 69 6f 6e 7d 0a 66 6f 72 65  expression}.fore
10140 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20  ach {tn sql} {. 
10150 20 31 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20   1     { SELECT 
10160 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
10170 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61  2 UNION SELECT a
10180 2b 31 2c 20 62 2b 31 20 46 52 4f 4d 20 74 32 29  +1, b+1 FROM t2)
10190 20 7d 0a 20 20 32 20 20 20 20 20 7b 20 53 45 4c   }.  2     { SEL
101a0 45 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46 52  ECT (SELECT * FR
101b0 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
101c0 43 54 20 61 2b 31 2c 20 62 2b 31 20 46 52 4f 4d  CT a+1, b+1 FROM
101d0 20 74 32 20 4f 52 44 45 52 20 42 59 20 31 29 20   t2 ORDER BY 1) 
101e0 7d 0a 20 20 33 20 20 20 20 20 7b 20 53 45 4c 45  }.  3     { SELE
101f0 43 54 20 28 53 45 4c 45 43 54 20 31 2c 20 32 29  CT (SELECT 1, 2)
10200 20 7d 0a 20 20 34 20 20 20 20 20 7b 20 53 45 4c   }.  4     { SEL
10210 45 43 54 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c  ECT (SELECT NULL
10220 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 20 7d 0a  , NULL, NULL) }.
10230 20 20 35 20 20 20 20 20 7b 20 53 45 4c 45 43 54    5     { SELECT
10240 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
10250 74 32 29 20 7d 0a 20 20 36 20 20 20 20 20 7b 20  t2) }.  6     { 
10260 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 2a  SELECT (SELECT *
10270 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 2c   FROM (SELECT 1,
10280 20 32 2c 20 33 29 29 20 7d 0a 7d 20 7b 0a 20 20   2, 3)) }.} {.  
10290 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
102a0 20 65 5f 65 78 70 72 2d 33 35 2e 32 2e 24 74 6e   e_expr-35.2.$tn
102b0 20 24 73 71 6c 20 5b 6c 69 73 74 20 31 20 24 4d   $sql [list 1 $M
102c0 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  ].}..# EVIDENCE-
102d0 4f 46 3a 20 52 2d 33 35 37 36 34 2d 32 38 30 34  OF: R-35764-2804
102e0 31 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  1 The result of 
102f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
10300 73 20 74 68 65 20 76 61 6c 75 65 0a 23 20 6f 66  s the value.# of
10310 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e   the only column
10320 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 72 6f   in the first ro
10330 77 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  w returned by th
10340 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
10350 6e 74 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  nt..#.# EVIDENCE
10360 2d 4f 46 3a 20 52 2d 34 31 38 39 38 2d 30 36 36  -OF: R-41898-066
10370 38 36 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  86 If the SELECT
10380 20 79 69 65 6c 64 73 20 6d 6f 72 65 20 74 68 61   yields more tha
10390 6e 20 6f 6e 65 20 72 65 73 75 6c 74 0a 23 20 72  n one result.# r
103a0 6f 77 2c 20 61 6c 6c 20 72 6f 77 73 20 61 66 74  ow, all rows aft
103b0 65 72 20 74 68 65 20 66 69 72 73 74 20 61 72 65  er the first are
103c0 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65   ignored..#.do_e
103d0 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
103e0 70 72 2d 33 36 2e 33 2e 31 20 7b 0a 20 20 43 52  pr-36.3.1 {.  CR
103f0 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 78 2c  EATE TABLE t4(x,
10400 20 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   y);.  INSERT IN
10410 54 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c 20  TO t4 VALUES(1, 
10420 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53 45 52 54  'one');.  INSERT
10430 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
10440 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 49 4e 53  2, 'two');.  INS
10450 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
10460 45 53 28 33 2c 20 27 74 68 72 65 65 27 29 3b 0a  ES(3, 'three');.
10470 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  } {}..foreach {t
10480 6e 20 65 78 70 72 20 72 65 73 74 79 70 65 20 72  n expr restype r
10490 65 73 76 61 6c 7d 20 7b 0a 20 20 20 20 32 20 20  esval} {.    2  
104a0 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f  { ( SELECT x FRO
104b0 4d 20 74 34 20 4f 52 44 45 52 20 42 59 20 78 20  M t4 ORDER BY x 
104c0 29 20 20 20 20 20 20 7d 20 20 20 20 20 20 20 20  )      }        
104d0 69 6e 74 65 67 65 72 20 31 0a 20 20 20 20 33 20  integer 1.    3 
104e0 20 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46 52   { ( SELECT x FR
104f0 4f 4d 20 74 34 20 4f 52 44 45 52 20 42 59 20 79  OM t4 ORDER BY y
10500 20 29 20 20 20 20 20 20 7d 20 20 20 20 20 20 20   )      }       
10510 20 69 6e 74 65 67 65 72 20 31 0a 20 20 20 20 34   integer 1.    4
10520 20 20 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46    { ( SELECT x F
10530 52 4f 4d 20 74 34 20 4f 52 44 45 52 20 42 59 20  ROM t4 ORDER BY 
10540 78 20 44 45 53 43 20 29 20 7d 20 20 20 20 20 20  x DESC ) }      
10550 20 20 69 6e 74 65 67 65 72 20 33 0a 20 20 20 20    integer 3.    
10560 35 20 20 7b 20 28 20 53 45 4c 45 43 54 20 78 20  5  { ( SELECT x 
10570 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20 42 59  FROM t4 ORDER BY
10580 20 79 20 44 45 53 43 20 29 20 7d 20 20 20 20 20   y DESC ) }     
10590 20 20 20 69 6e 74 65 67 65 72 20 32 0a 20 20 20     integer 2.   
105a0 20 36 20 20 7b 20 28 20 53 45 4c 45 43 54 20 79   6  { ( SELECT y
105b0 20 46 52 4f 4d 20 74 34 20 4f 52 44 45 52 20 42   FROM t4 ORDER B
105c0 59 20 79 20 44 45 53 43 20 29 20 7d 20 20 20 20  Y y DESC ) }    
105d0 20 20 20 20 74 65 78 74 20 20 20 20 74 77 6f 0a      text    two.
105e0 0a 20 20 20 20 37 20 20 7b 20 28 20 53 45 4c 45  .    7  { ( SELE
105f0 43 54 20 73 75 6d 28 78 29 20 46 52 4f 4d 20 74  CT sum(x) FROM t
10600 34 20 29 20 20 20 20 20 20 20 20 20 20 20 7d 20  4 )           } 
10610 20 20 20 20 20 20 20 20 69 6e 74 65 67 65 72 20          integer 
10620 36 0a 20 20 20 20 38 20 20 7b 20 28 20 53 45 4c  6.    8  { ( SEL
10630 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ECT group_concat
10640 28 79 2c 27 27 29 20 46 52 4f 4d 20 74 34 20 29  (y,'') FROM t4 )
10650 20 7d 20 20 20 20 20 20 20 74 65 78 74 20 20 20   }       text   
10660 20 6f 6e 65 74 77 6f 74 68 72 65 65 0a 20 20 20   onetwothree.   
10670 20 39 20 20 7b 20 28 20 53 45 4c 45 43 54 20 6d   9  { ( SELECT m
10680 61 78 28 78 29 20 46 52 4f 4d 20 74 34 20 57 48  ax(x) FROM t4 WH
10690 45 52 45 20 79 20 4c 49 4b 45 20 27 5f 5f 5f 27  ERE y LIKE '___'
106a0 29 20 7d 20 69 6e 74 65 67 65 72 20 32 20 0a 0a  ) } integer 2 ..
106b0 7d 20 7b 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65  } {.  do_expr_te
106c0 73 74 20 65 5f 65 78 70 72 2d 33 36 2e 33 2e 24  st e_expr-36.3.$
106d0 74 6e 20 24 65 78 70 72 20 24 72 65 73 74 79 70  tn $expr $restyp
106e0 65 20 24 72 65 73 76 61 6c 0a 7d 0a 0a 23 20 45  e $resval.}..# E
106f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
10700 34 39 32 2d 34 31 35 37 32 20 49 66 20 74 68 65  492-41572 If the
10710 20 53 45 4c 45 43 54 20 79 69 65 6c 64 73 20 6e   SELECT yields n
10720 6f 20 72 6f 77 73 2c 20 74 68 65 6e 20 74 68 65  o rows, then the
10730 0a 23 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  .# value of the 
10740 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 4e 55  expression is NU
10750 4c 4c 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  LL..#.foreach {t
10760 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20 20 31 20  n expr} {.    1 
10770 20 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46 52   { ( SELECT x FR
10780 4f 4d 20 74 34 20 57 48 45 52 45 20 78 3e 33 20  OM t4 WHERE x>3 
10790 4f 52 44 45 52 20 42 59 20 78 20 29 20 20 20 20  ORDER BY x )    
107a0 20 20 7d 0a 20 20 20 20 32 20 20 7b 20 28 20 53    }.    2  { ( S
107b0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20  ELECT x FROM t4 
107c0 57 48 45 52 45 20 79 3c 27 6f 6e 65 27 20 4f 52  WHERE y<'one' OR
107d0 44 45 52 20 42 59 20 79 20 29 20 20 7d 0a 7d 20  DER BY y )  }.} 
107e0 7b 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  {.  do_expr_test
107f0 20 65 5f 65 78 70 72 2d 33 36 2e 34 2e 24 74 6e   e_expr-36.4.$tn
10800 20 24 65 78 70 72 20 6e 75 6c 6c 20 7b 7d 0a 7d   $expr null {}.}
10810 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     ...finish_test.