/ Hex Artifact Content
Login

Artifact ca8896601ade1e27c6559614c7f32c63d44636fdfa720436a160f09b8bf66c89:


0000: 23 20 32 30 31 30 20 4a 75 6c 79 20 31 36 0a 23  # 2010 July 16.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 23 20 54 68 69 73 20 66 69  ****.#.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65  le implements te
0180: 73 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  sts to verify th
0190: 61 74 20 74 68 65 20 22 74 65 73 74 61 62 6c 65  at the "testable
01a0: 20 73 74 61 74 65 6d 65 6e 74 73 22 20 69 6e 20   statements" in 
01b0: 0a 23 20 74 68 65 20 6c 61 6e 67 5f 65 78 70 72  .# the lang_expr
01c0: 2e 68 74 6d 6c 20 64 6f 63 75 6d 65 6e 74 20 61  .html document a
01d0: 72 65 20 63 6f 72 72 65 63 74 2e 0a 23 0a 0a 73  re correct..#..s
01e0: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
01f0: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
0200: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0210: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72  /tester.tcl.sour
0220: 63 65 20 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c  ce $testdir/mall
0230: 6f 63 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 69  oc_common.tcl..i
0240: 66 63 61 70 61 62 6c 65 20 21 63 6f 6d 70 6f 75  fcapable !compou
0250: 6e 64 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  nd {.  finish_te
0260: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70  st.  return.}..p
0270: 72 6f 63 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  roc do_expr_test
0280: 20 7b 74 6e 20 65 78 70 72 20 74 79 70 65 20 76   {tn expr type v
0290: 61 6c 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65  alue} {.  upleve
02a0: 6c 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l do_execsql_tes
02b0: 74 20 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c  t $tn [list "SEL
02c0: 45 43 54 20 74 79 70 65 6f 66 28 24 65 78 70 72  ECT typeof($expr
02d0: 29 2c 20 24 65 78 70 72 22 5d 20 5b 0a 20 20 20  ), $expr"] [.   
02e0: 20 6c 69 73 74 20 5b 6c 69 73 74 20 24 74 79 70   list [list $typ
02f0: 65 20 24 76 61 6c 75 65 5d 0a 20 20 5d 0a 7d 0a  e $value].  ].}.
0300: 0a 70 72 6f 63 20 64 6f 5f 71 65 78 70 72 5f 74  .proc do_qexpr_t
0310: 65 73 74 20 7b 74 6e 20 65 78 70 72 20 76 61 6c  est {tn expr val
0320: 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20  ue} {.  uplevel 
0330: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0340: 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c 45 43  $tn [list "SELEC
0350: 54 20 71 75 6f 74 65 28 24 65 78 70 72 29 22 5d  T quote($expr)"]
0360: 20 5b 6c 69 73 74 20 24 76 61 6c 75 65 5d 0a 7d   [list $value].}
0370: 0a 0a 23 20 53 65 74 20 75 70 20 74 68 72 65 65  ..# Set up three
0380: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0390: 73 3a 0a 23 0a 23 20 20 20 3a 3a 6f 70 6e 61 6d  s:.#.#   ::opnam
03a0: 65 20 20 20 20 20 20 20 20 20 41 6e 20 61 72 72  e         An arr
03b0: 61 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20  ay mapping from 
03c0: 53 51 4c 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  SQL operator to 
03d0: 61 6e 20 65 61 73 79 20 74 6f 20 70 61 72 73 65  an easy to parse
03e0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
03f0: 20 20 20 20 20 20 6e 61 6d 65 2e 20 54 68 65 20        name. The 
0400: 6e 61 6d 65 73 20 61 72 65 20 75 73 65 64 20 61  names are used a
0410: 73 20 70 61 72 74 20 6f 66 20 74 65 73 74 20 63  s part of test c
0420: 61 73 65 20 6e 61 6d 65 73 2e 0a 23 0a 23 20 20  ase names..#.#  
0430: 20 3a 3a 6f 70 70 72 65 63 20 20 20 20 20 20 20   ::opprec       
0440: 20 20 41 6e 20 61 72 72 61 79 20 6d 61 70 70 69    An array mappi
0450: 6e 67 20 66 72 6f 6d 20 53 51 4c 20 6f 70 65 72  ng from SQL oper
0460: 61 74 6f 72 20 74 6f 20 61 20 6e 75 6d 65 72 69  ator to a numeri
0470: 63 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  c.#             
0480: 20 20 20 20 20 20 20 70 72 65 63 65 64 65 6e 63         precedenc
0490: 65 20 76 61 6c 75 65 2e 20 4f 70 65 72 61 74 6f  e value. Operato
04a0: 72 73 20 74 68 61 74 20 67 72 6f 75 70 20 6d 6f  rs that group mo
04b0: 72 65 20 74 69 67 68 74 6c 79 0a 23 20 20 20 20  re tightly.#    
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 68 61 76 65 20 6c 6f 77 65 72 20 6e 75 6d 65 72  have lower numer
04e0: 69 63 20 70 72 65 63 65 64 65 6e 63 65 73 2e 0a  ic precedences..
04f0: 23 0a 23 20 20 20 3a 3a 6f 70 6c 69 73 74 20 20  #.#   ::oplist  
0500: 20 20 20 20 20 20 20 41 20 6c 69 73 74 20 6f 66         A list of
0510: 20 61 6c 6c 20 53 51 4c 20 6f 70 65 72 61 74 6f   all SQL operato
0520: 72 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  rs supported by 
0530: 53 51 4c 69 74 65 2e 0a 23 0a 66 6f 72 65 61 63  SQLite..#.foreac
0540: 68 20 7b 6f 70 20 6f 70 6e 7d 20 7b 0a 20 20 20  h {op opn} {.   
0550: 20 20 20 7c 7c 20 20 20 63 61 74 20 20 20 20 20     ||   cat     
0560: 2a 20 20 20 6d 75 6c 20 20 20 20 20 20 20 2f 20  *   mul       / 
0570: 20 64 69 76 20 20 20 20 20 20 20 25 20 20 20 20   div       %    
0580: 20 6d 6f 64 20 20 20 20 20 20 20 2b 20 20 20 20   mod       +    
0590: 20 20 61 64 64 0a 20 20 20 20 20 20 2d 20 20 20    add.      -   
05a0: 20 73 75 62 20 20 20 20 20 3c 3c 20 20 6c 73 68   sub     <<  lsh
05b0: 69 66 74 20 20 20 20 3e 3e 20 72 73 68 69 66 74  ift    >> rshift
05c0: 20 20 20 20 26 20 20 20 20 20 62 69 74 61 6e 64      &     bitand
05d0: 20 20 20 20 7c 20 20 20 20 20 20 62 69 74 6f 72      |      bitor
05e0: 0a 20 20 20 20 20 20 3c 20 20 20 20 6c 65 73 73  .      <    less
05f0: 20 20 20 20 3c 3d 20 20 6c 65 73 73 65 71 20 20      <=  lesseq  
0600: 20 20 3e 20 20 6d 6f 72 65 20 20 20 20 20 20 3e    >  more      >
0610: 3d 20 20 20 20 6d 6f 72 65 65 71 20 20 20 20 3d  =    moreeq    =
0620: 20 20 20 20 20 20 65 71 31 0a 20 20 20 20 20 20        eq1.      
0630: 3d 3d 20 20 20 65 71 32 20 20 20 20 20 3c 3e 20  ==   eq2     <> 
0640: 20 6e 65 31 20 20 20 20 20 20 20 21 3d 20 6e 65   ne1       != ne
0650: 32 20 20 20 20 20 20 20 49 53 20 20 20 20 69 73  2       IS    is
0660: 20 20 20 20 20 20 20 20 4c 49 4b 45 20 20 20 6c          LIKE   l
0670: 69 6b 65 0a 20 20 20 20 20 20 47 4c 4f 42 20 67  ike.      GLOB g
0680: 6c 6f 62 20 20 20 20 41 4e 44 20 61 6e 64 20 20  lob    AND and  
0690: 20 20 20 20 20 4f 52 20 6f 72 20 20 20 20 20 20       OR or      
06a0: 20 20 4d 41 54 43 48 20 6d 61 74 63 68 20 20 20    MATCH match   
06b0: 20 20 52 45 47 45 58 50 20 72 65 67 65 78 70 0a    REGEXP regexp.
06c0: 20 20 20 20 20 20 7b 49 53 20 4e 4f 54 7d 20 69        {IS NOT} i
06d0: 73 6e 74 0a 7d 20 7b 0a 20 20 73 65 74 20 3a 3a  snt.} {.  set ::
06e0: 6f 70 6e 61 6d 65 28 24 6f 70 29 20 24 6f 70 6e  opname($op) $opn
06f0: 0a 7d 0a 73 65 74 20 6f 70 6c 69 73 74 20 5b 6c  .}.set oplist [l
0700: 69 73 74 5d 0a 66 6f 72 65 61 63 68 20 7b 70 72  ist].foreach {pr
0710: 65 63 20 6f 70 6c 7d 20 7b 0a 20 20 31 20 20 20  ec opl} {.  1   
0720: 7c 7c 0a 20 20 32 20 20 20 7b 2a 20 2f 20 25 7d  ||.  2   {* / %}
0730: 0a 20 20 33 20 20 20 7b 2b 20 2d 7d 0a 20 20 34  .  3   {+ -}.  4
0740: 20 20 20 7b 3c 3c 20 3e 3e 20 26 20 7c 7d 0a 20     {<< >> & |}. 
0750: 20 35 20 20 20 7b 3c 20 3c 3d 20 3e 20 3e 3d 7d   5   {< <= > >=}
0760: 0a 20 20 36 20 20 20 7b 3d 20 3d 3d 20 21 3d 20  .  6   {= == != 
0770: 3c 3e 20 49 53 20 7b 49 53 20 4e 4f 54 7d 20 4c  <> IS {IS NOT} L
0780: 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48 20 52  IKE GLOB MATCH R
0790: 45 47 45 58 50 7d 0a 20 20 37 20 20 20 41 4e 44  EGEXP}.  7   AND
07a0: 0a 20 20 38 20 20 20 4f 52 0a 7d 20 7b 0a 20 20  .  8   OR.} {.  
07b0: 66 6f 72 65 61 63 68 20 6f 70 20 24 6f 70 6c 20  foreach op $opl 
07c0: 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6f 70 70  { .    set ::opp
07d0: 72 65 63 28 24 6f 70 29 20 24 70 72 65 63 20 0a  rec($op) $prec .
07e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 6f 70 6c 69      lappend opli
07f0: 73 74 20 24 6f 70 0a 20 20 7d 0a 7d 0a 0a 0a 23  st $op.  }.}...#
0800: 20 48 6f 6f 6b 20 69 6e 20 64 65 66 69 6e 69 74   Hook in definit
0810: 69 6f 6e 73 20 6f 66 20 4d 41 54 43 48 20 61 6e  ions of MATCH an
0820: 64 20 52 45 47 45 58 2e 20 54 68 65 20 66 6f 6c  d REGEX. The fol
0830: 6c 6f 77 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  lowing implement
0840: 61 74 69 6f 6e 73 0a 23 20 63 61 75 73 65 20 4d  ations.# cause M
0850: 41 54 43 48 20 61 6e 64 20 52 45 47 45 58 20 74  ATCH and REGEX t
0860: 6f 20 62 65 68 61 76 65 20 73 69 6d 69 6c 61 72  o behave similar
0870: 6c 79 20 74 6f 20 74 68 65 20 3d 3d 20 6f 70 65  ly to the == ope
0880: 72 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 6d 61  rator..#.proc ma
0890: 74 63 68 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20  tchfunc {a b} { 
08a0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 61  return [expr {$a
08b0: 3d 3d 24 62 7d 5d 20 7d 0a 70 72 6f 63 20 72 65  ==$b}] }.proc re
08c0: 67 65 78 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20  gexfunc {a b} { 
08d0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 61  return [expr {$a
08e0: 3d 3d 24 62 7d 5d 20 7d 0a 64 62 20 66 75 6e 63  ==$b}] }.db func
08f0: 20 6d 61 74 63 68 20 20 2d 61 72 67 63 6f 75 6e   match  -argcoun
0900: 74 20 32 20 6d 61 74 63 68 66 75 6e 63 0a 64 62  t 2 matchfunc.db
0910: 20 66 75 6e 63 20 72 65 67 65 78 70 20 2d 61 72   func regexp -ar
0920: 67 63 6f 75 6e 74 20 32 20 72 65 67 65 78 66 75  gcount 2 regexfu
0930: 6e 63 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  nc..#-----------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0980: 20 54 65 73 74 20 63 61 73 65 73 20 65 5f 65 78   Test cases e_ex
0990: 70 72 2d 31 2e 2a 20 61 74 74 65 6d 70 74 20 74  pr-1.* attempt t
09a0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61 6c  o verify that al
09b0: 6c 20 62 69 6e 61 72 79 20 6f 70 65 72 61 74 6f  l binary operato
09c0: 72 73 20 6c 69 73 74 65 64 0a 23 20 69 6e 20 74  rs listed.# in t
09d0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
09e0: 20 65 78 69 73 74 20 61 6e 64 20 74 68 61 74 20   exist and that 
09f0: 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 72 65  the relative pre
0a00: 63 65 64 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  cedences of the.
0a10: 23 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  # operators are 
0a20: 61 6c 73 6f 20 61 73 20 74 68 65 20 64 6f 63 75  also as the docu
0a30: 6d 65 6e 74 61 74 69 6f 6e 20 73 75 67 67 65 73  mentation sugges
0a40: 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ts..#.# EVIDENCE
0a50: 2d 4f 46 3a 20 52 2d 31 35 35 31 34 2d 36 35 31  -OF: R-15514-651
0a60: 36 33 20 53 51 4c 69 74 65 20 75 6e 64 65 72 73  63 SQLite unders
0a70: 74 61 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f 77  tands the follow
0a80: 69 6e 67 20 62 69 6e 61 72 79 0a 23 20 6f 70 65  ing binary.# ope
0a90: 72 61 74 6f 72 73 2c 20 69 6e 20 6f 72 64 65 72  rators, in order
0aa0: 20 66 72 6f 6d 20 68 69 67 68 65 73 74 20 74 6f   from highest to
0ab0: 20 6c 6f 77 65 73 74 20 70 72 65 63 65 64 65 6e   lowest preceden
0ac0: 63 65 3a 20 7c 7c 20 2a 20 2f 20 25 20 2b 20 2d  ce: || * / % + -
0ad0: 0a 23 20 3c 3c 20 3e 3e 20 26 20 7c 20 3c 20 3c  .# << >> & | < <
0ae0: 3d 20 3e 20 3e 3d 20 3d 20 3d 3d 20 21 3d 20 3c  = > >= = == != <
0af0: 3e 20 49 53 20 49 53 0a 23 20 4e 4f 54 20 49 4e  > IS IS.# NOT IN
0b00: 20 4c 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48   LIKE GLOB MATCH
0b10: 20 52 45 47 45 58 50 20 41 4e 44 20 4f 52 0a 23   REGEXP AND OR.#
0b20: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
0b30: 52 2d 33 38 37 35 39 2d 33 38 37 38 39 20 4f 70  R-38759-38789 Op
0b40: 65 72 61 74 6f 72 73 20 49 53 20 61 6e 64 20 49  erators IS and I
0b50: 53 20 4e 4f 54 20 68 61 76 65 20 74 68 65 20 73  S NOT have the s
0b60: 61 6d 65 0a 23 20 70 72 65 63 65 64 65 6e 63 65  ame.# precedence
0b70: 20 61 73 20 3d 2e 0a 23 0a 0a 75 6e 73 65 74 20   as =..#..unset 
0b80: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 75 6e 74 65  -nocomplain unte
0b90: 73 74 65 64 0a 66 6f 72 65 61 63 68 20 6f 70 31  sted.foreach op1
0ba0: 20 24 6f 70 6c 69 73 74 20 7b 0a 20 20 66 6f 72   $oplist {.  for
0bb0: 65 61 63 68 20 6f 70 32 20 24 6f 70 6c 69 73 74  each op2 $oplist
0bc0: 20 7b 0a 20 20 20 20 73 65 74 20 75 6e 74 65 73   {.    set untes
0bd0: 74 65 64 28 24 6f 70 31 2c 24 6f 70 32 29 20 31  ted($op1,$op2) 1
0be0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 74 6e  .    foreach {tn
0bf0: 20 41 20 42 20 43 7d 20 7b 0a 20 20 20 20 20 20   A B C} {.      
0c00: 20 31 20 20 20 20 20 32 32 20 20 20 34 35 20 20   1     22   45  
0c10: 20 20 36 36 0a 20 20 20 20 20 20 20 32 20 20 20    66.       2   
0c20: 20 20 20 30 20 20 20 20 30 20 20 20 20 20 30 0a     0    0     0.
0c30: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 30 20         3      0 
0c40: 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20 20     0     1.     
0c50: 20 20 34 20 20 20 20 20 20 30 20 20 20 20 31 20    4      0    1 
0c60: 20 20 20 20 30 0a 20 20 20 20 20 20 20 35 20 20      0.       5  
0c70: 20 20 20 20 30 20 20 20 20 31 20 20 20 20 20 31      0    1     1
0c80: 0a 20 20 20 20 20 20 20 36 20 20 20 20 20 20 31  .       6      1
0c90: 20 20 20 20 30 20 20 20 20 20 30 0a 20 20 20 20      0     0.    
0ca0: 20 20 20 37 20 20 20 20 20 20 31 20 20 20 20 30     7      1    0
0cb0: 20 20 20 20 20 31 0a 20 20 20 20 20 20 20 38 20       1.       8 
0cc0: 20 20 20 20 20 31 20 20 20 20 31 20 20 20 20 20       1    1     
0cd0: 30 0a 20 20 20 20 20 20 20 39 20 20 20 20 20 20  0.       9      
0ce0: 31 20 20 20 20 31 20 20 20 20 20 31 0a 20 20 20  1    1     1.   
0cf0: 20 20 20 31 30 20 20 20 20 20 20 35 20 20 20 20     10      5    
0d00: 36 20 20 20 20 20 31 0a 20 20 20 20 20 20 31 31  6     1.      11
0d10: 20 20 20 20 20 20 31 20 20 20 20 35 20 20 20 20        1    5    
0d20: 20 36 0a 20 20 20 20 20 20 31 32 20 20 20 20 20   6.      12     
0d30: 20 31 20 20 20 20 35 20 20 20 20 20 35 0a 20 20   1    5     5.  
0d40: 20 20 20 20 31 33 20 20 20 20 20 20 35 20 20 20      13      5   
0d50: 20 35 20 20 20 20 20 31 0a 0a 20 20 20 20 20 20   5     1..      
0d60: 31 34 20 20 20 20 20 20 35 20 20 20 20 32 20 20  14      5    2  
0d70: 20 20 20 31 0a 20 20 20 20 20 20 31 35 20 20 20     1.      15   
0d80: 20 20 20 31 20 20 20 20 34 20 20 20 20 20 31 0a     1    4     1.
0d90: 20 20 20 20 20 20 31 36 20 20 20 20 20 2d 31 20        16     -1 
0da0: 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20 20     0     1.     
0db0: 20 31 37 20 20 20 20 20 20 30 20 20 20 20 31 20   17      0    1 
0dc0: 20 20 20 2d 31 0a 0a 20 20 20 20 7d 20 7b 0a 20     -1..    } {. 
0dd0: 20 20 20 20 20 73 65 74 20 74 65 73 74 6e 61 6d       set testnam
0de0: 65 20 22 65 5f 65 78 70 72 2d 31 2e 24 6f 70 6e  e "e_expr-1.$opn
0df0: 61 6d 65 28 24 6f 70 31 29 2e 24 6f 70 6e 61 6d  ame($op1).$opnam
0e00: 65 28 24 6f 70 32 29 2e 24 74 6e 22 0a 0a 20 20  e($op2).$tn"..  
0e10: 20 20 20 20 23 20 49 66 20 24 6f 70 32 20 67 72      # If $op2 gr
0e20: 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74 6c  oups more tightl
0e30: 79 20 74 68 61 6e 20 24 6f 70 31 2c 20 74 68 65  y than $op1, the
0e40: 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  n the result.   
0e50: 20 20 20 23 20 6f 66 20 65 78 65 63 75 74 69 6e     # of executin
0e60: 67 20 24 73 71 6c 31 20 77 68 6f 75 6c 64 20 62  g $sql1 whould b
0e70: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78  e the same as ex
0e80: 65 63 75 74 69 6e 67 20 24 73 71 6c 33 2e 0a 20  ecuting $sql3.. 
0e90: 20 20 20 20 20 23 20 49 66 20 24 6f 70 31 20 67       # If $op1 g
0ea0: 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74  roups more tight
0eb0: 6c 79 2c 20 6f 72 20 69 66 20 24 6f 70 31 20 61  ly, or if $op1 a
0ec0: 6e 64 20 24 6f 70 32 20 68 61 76 65 20 0a 20 20  nd $op2 have .  
0ed0: 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20 70      # the same p
0ee0: 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 6e 20  recedence, then 
0ef0: 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c 31 20  executing $sql1 
0f00: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20 20  should return.  
0f10: 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20 76      # the same v
0f20: 61 6c 75 65 20 61 73 20 24 73 71 6c 32 2e 0a 20  alue as $sql2.. 
0f30: 20 20 20 20 20 23 0a 20 20 20 20 20 20 73 65 74       #.      set
0f40: 20 73 71 6c 31 20 22 53 45 4c 45 43 54 20 24 41   sql1 "SELECT $A
0f50: 20 24 6f 70 31 20 24 42 20 24 6f 70 32 20 24 43   $op1 $B $op2 $C
0f60: 22 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 32  ".      set sql2
0f70: 20 22 53 45 4c 45 43 54 20 28 24 41 20 24 6f 70   "SELECT ($A $op
0f80: 31 20 24 42 29 20 24 6f 70 32 20 24 43 22 0a 20  1 $B) $op2 $C". 
0f90: 20 20 20 20 20 73 65 74 20 73 71 6c 33 20 22 53       set sql3 "S
0fa0: 45 4c 45 43 54 20 24 41 20 24 6f 70 31 20 28 24  ELECT $A $op1 ($
0fb0: 42 20 24 6f 70 32 20 24 43 29 22 0a 0a 20 20 20  B $op2 $C)"..   
0fc0: 20 20 20 73 65 74 20 61 32 20 5b 64 62 20 6f 6e     set a2 [db on
0fd0: 65 20 24 73 71 6c 32 5d 0a 20 20 20 20 20 20 73  e $sql2].      s
0fe0: 65 74 20 61 33 20 5b 64 62 20 6f 6e 65 20 24 73  et a3 [db one $s
0ff0: 71 6c 33 5d 0a 0a 20 20 20 20 20 20 64 6f 5f 65  ql3]..      do_e
1000: 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 65 73  xecsql_test $tes
1010: 74 6e 61 6d 65 20 24 73 71 6c 31 20 5b 6c 69 73  tname $sql1 [lis
1020: 74 20 5b 0a 20 20 20 20 20 20 20 20 69 66 20 7b  t [.        if {
1030: 24 6f 70 70 72 65 63 28 24 6f 70 32 29 20 3c 20  $opprec($op2) < 
1040: 24 6f 70 70 72 65 63 28 24 6f 70 31 29 7d 20 7b  $opprec($op1)} {
1050: 73 65 74 20 61 33 7d 20 7b 73 65 74 20 61 32 7d  set a3} {set a2}
1060: 0a 20 20 20 20 20 20 5d 5d 0a 20 20 20 20 20 20  .      ]].      
1070: 69 66 20 7b 24 61 32 20 21 3d 20 24 61 33 7d 20  if {$a2 != $a3} 
1080: 7b 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  { unset -nocompl
1090: 61 69 6e 20 75 6e 74 65 73 74 65 64 28 24 6f 70  ain untested($op
10a0: 31 2c 24 6f 70 32 29 20 7d 0a 20 20 20 20 7d 0a  1,$op2) }.    }.
10b0: 20 20 7d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 6f    }.}..foreach o
10c0: 70 20 7b 2a 20 41 4e 44 20 4f 52 20 2b 20 7c 7c  p {* AND OR + ||
10d0: 20 26 20 7c 7d 20 7b 20 75 6e 73 65 74 20 75 6e   & |} { unset un
10e0: 74 65 73 74 65 64 28 24 6f 70 2c 24 6f 70 29 20  tested($op,$op) 
10f0: 7d 0a 75 6e 73 65 74 20 75 6e 74 65 73 74 65 64  }.unset untested
1100: 28 2b 2c 2d 29 20 20 3b 23 20 20 20 20 20 20 20  (+,-)  ;#       
1110: 53 69 6e 63 65 20 20 20 20 28 61 2b 62 29 2d 63  Since    (a+b)-c
1120: 20 3d 3d 20 61 2b 28 62 2d 63 29 0a 75 6e 73 65   == a+(b-c).unse
1130: 74 20 75 6e 74 65 73 74 65 64 28 2a 2c 3c 3c 29  t untested(*,<<)
1140: 20 3b 23 20 20 20 20 20 20 20 53 69 6e 63 65 20   ;#       Since 
1150: 20 20 20 28 61 2a 62 29 3c 3c 63 20 3d 3d 20 61     (a*b)<<c == a
1160: 2a 28 62 3c 3c 63 29 0a 0a 64 6f 5f 74 65 73 74  *(b<<c)..do_test
1170: 20 65 5f 65 78 70 72 2d 31 2e 31 20 7b 20 61 72   e_expr-1.1 { ar
1180: 72 61 79 20 6e 61 6d 65 73 20 75 6e 74 65 73 74  ray names untest
1190: 65 64 20 7d 20 7b 7d 0a 0a 23 20 41 74 20 6f 6e  ed } {}..# At on
11a0: 65 20 70 6f 69 6e 74 2c 20 74 65 73 74 20 31 2e  e point, test 1.
11b0: 32 2e 32 20 77 61 73 20 66 61 69 6c 69 6e 67 2e  2.2 was failing.
11c0: 20 49 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   Instead of the 
11d0: 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 2c 20  correct result, 
11e0: 69 74 0a 23 20 77 61 73 20 72 65 74 75 72 6e 69  it.# was returni
11f0: 6e 67 20 7b 31 20 31 20 30 7d 2e 20 54 68 69 73  ng {1 1 0}. This
1200: 20 77 6f 75 6c 64 20 73 65 65 6d 20 74 6f 20 69   would seem to i
1210: 6e 64 69 63 61 74 65 20 74 68 61 74 20 4c 49 4b  ndicate that LIK
1220: 45 20 68 61 73 20 74 68 65 0a 23 20 73 61 6d 65  E has the.# same
1230: 20 70 72 65 63 65 64 65 6e 63 65 20 61 73 20 27   precedence as '
1240: 3c 27 2e 20 57 68 69 63 68 20 69 73 20 69 6e 63  <'. Which is inc
1250: 6f 72 72 65 63 74 2e 20 49 74 20 68 61 73 20 6c  orrect. It has l
1260: 6f 77 65 72 20 70 72 65 63 65 64 65 6e 63 65 2e  ower precedence.
1270: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1280: 73 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 31 20  st e_expr-1.2.1 
1290: 7b 20 0a 20 20 53 45 4c 45 43 54 20 30 20 3c 20  { .  SELECT 0 < 
12a0: 32 20 4c 49 4b 45 20 31 2c 20 20 20 28 30 20 3c  2 LIKE 1,   (0 <
12b0: 20 32 29 20 4c 49 4b 45 20 31 2c 20 20 20 30 20   2) LIKE 1,   0 
12c0: 3c 20 28 32 20 4c 49 4b 45 20 31 29 0a 7d 20 7b  < (2 LIKE 1).} {
12d0: 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71  1 1 0}.do_execsq
12e0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 2e  l_test e_expr-1.
12f0: 32 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  2.2 { .  SELECT 
1300: 30 20 4c 49 4b 45 20 30 20 3c 20 32 2c 20 20 20  0 LIKE 0 < 2,   
1310: 28 30 20 4c 49 4b 45 20 30 29 20 3c 20 32 2c 20  (0 LIKE 0) < 2, 
1320: 20 20 30 20 4c 49 4b 45 20 28 30 20 3c 20 32 29    0 LIKE (0 < 2)
1330: 0a 7d 20 7b 30 20 31 20 30 7d 0a 0a 23 20 53 68  .} {0 1 0}..# Sh
1340: 6f 77 69 6e 67 20 74 68 61 74 20 4c 49 4b 45 20  owing that LIKE 
1350: 61 6e 64 20 3d 3d 20 68 61 76 65 20 74 68 65 20  and == have the 
1360: 73 61 6d 65 20 70 72 65 63 65 64 65 6e 63 65 0a  same precedence.
1370: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
1380: 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 33 20 7b  t e_expr-1.2.3 {
1390: 20 0a 20 20 53 45 4c 45 43 54 20 32 20 4c 49 4b   .  SELECT 2 LIK
13a0: 45 20 32 20 3d 3d 20 31 2c 20 20 20 28 32 20 4c  E 2 == 1,   (2 L
13b0: 49 4b 45 20 32 29 20 3d 3d 20 31 2c 20 20 20 20  IKE 2) == 1,    
13c0: 32 20 4c 49 4b 45 20 28 32 20 3d 3d 20 31 29 0a  2 LIKE (2 == 1).
13d0: 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65  } {1 1 0}.do_exe
13e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
13f0: 2d 31 2e 32 2e 34 20 7b 20 0a 20 20 53 45 4c 45  -1.2.4 { .  SELE
1400: 43 54 20 32 20 3d 3d 20 32 20 4c 49 4b 45 20 31  CT 2 == 2 LIKE 1
1410: 2c 20 20 20 28 32 20 3d 3d 20 32 29 20 4c 49 4b  ,   (2 == 2) LIK
1420: 45 20 31 2c 20 20 20 20 32 20 3d 3d 20 28 32 20  E 1,    2 == (2 
1430: 4c 49 4b 45 20 31 29 0a 7d 20 7b 31 20 31 20 30  LIKE 1).} {1 1 0
1440: 7d 0a 0a 23 20 53 68 6f 77 69 6e 67 20 74 68 61  }..# Showing tha
1450: 74 20 3c 20 67 72 6f 75 70 73 20 6d 6f 72 65 20  t < groups more 
1460: 74 69 67 68 74 6c 79 20 74 68 61 6e 20 3d 3d 20  tightly than == 
1470: 28 3c 20 68 61 73 20 68 69 67 68 65 72 20 70 72  (< has higher pr
1480: 65 63 65 64 65 6e 63 65 29 2e 20 0a 23 0a 64 6f  ecedence). .#.do
1490: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
14a0: 65 78 70 72 2d 31 2e 32 2e 35 20 7b 20 0a 20 20  expr-1.2.5 { .  
14b0: 53 45 4c 45 43 54 20 30 20 3c 20 32 20 3d 3d 20  SELECT 0 < 2 == 
14c0: 31 2c 20 20 20 28 30 20 3c 20 32 29 20 3d 3d 20  1,   (0 < 2) == 
14d0: 31 2c 20 20 20 30 20 3c 20 28 32 20 3d 3d 20 31  1,   0 < (2 == 1
14e0: 29 0a 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65  ).} {1 1 0}.do_e
14f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
1500: 70 72 2d 31 2e 36 20 7b 20 0a 20 20 53 45 4c 45  pr-1.6 { .  SELE
1510: 43 54 20 30 20 3d 3d 20 30 20 3c 20 32 2c 20 20  CT 0 == 0 < 2,  
1520: 20 28 30 20 3d 3d 20 30 29 20 3c 20 32 2c 20 20   (0 == 0) < 2,  
1530: 20 30 20 3d 3d 20 28 30 20 3c 20 32 29 0a 7d 20   0 == (0 < 2).} 
1540: 7b 30 20 31 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  {0 1 0}..#------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
15a0: 20 74 68 65 20 66 6f 75 72 20 75 6e 61 72 79 20   the four unary 
15b0: 70 72 65 66 69 78 20 6f 70 65 72 61 74 6f 72 73  prefix operators
15c0: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
15d0: 65 20 0a 23 20 64 6f 63 75 6d 65 6e 74 61 74 69  e .# documentati
15e0: 6f 6e 20 65 78 69 73 74 2e 0a 23 0a 23 20 45 56  on exist..#.# EV
15f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 39  IDENCE-OF: R-139
1600: 35 38 2d 35 33 34 31 39 20 53 75 70 70 6f 72 74  58-53419 Support
1610: 65 64 20 75 6e 61 72 79 20 70 72 65 66 69 78 20  ed unary prefix 
1620: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 74 68  operators are th
1630: 65 73 65 3a 0a 23 20 2d 20 2b 20 7e 20 4e 4f 54  ese:.# - + ~ NOT
1640: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1650: 73 74 20 65 5f 65 78 70 72 2d 32 2e 31 20 7b 20  st e_expr-2.1 { 
1660: 53 45 4c 45 43 54 20 2d 20 20 20 31 30 20 20 20  SELECT -   10   
1670: 7d 20 7b 2d 31 30 7d 0a 64 6f 5f 65 78 65 63 73  } {-10}.do_execs
1680: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
1690: 2e 32 20 7b 20 53 45 4c 45 43 54 20 2b 20 20 20  .2 { SELECT +   
16a0: 31 30 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65  10   } {10}.do_e
16b0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
16c0: 70 72 2d 32 2e 33 20 7b 20 53 45 4c 45 43 54 20  pr-2.3 { SELECT 
16d0: 7e 20 20 20 31 30 20 20 20 7d 20 7b 2d 31 31 7d  ~   10   } {-11}
16e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
16f0: 20 65 5f 65 78 70 72 2d 32 2e 34 20 7b 20 53 45   e_expr-2.4 { SE
1700: 4c 45 43 54 20 4e 4f 54 20 31 30 20 20 20 7d 20  LECT NOT 10   } 
1710: 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {0}..#----------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1760: 23 20 54 65 73 74 73 20 66 6f 72 20 74 68 65 20  # Tests for the 
1770: 74 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 6d  two statements m
1780: 61 64 65 20 72 65 67 61 72 64 69 6e 67 20 74 68  ade regarding th
1790: 65 20 75 6e 61 72 79 20 2b 20 6f 70 65 72 61 74  e unary + operat
17a0: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
17b0: 2d 4f 46 3a 20 52 2d 35 33 36 37 30 2d 30 33 33  -OF: R-53670-033
17c0: 37 33 20 54 68 65 20 75 6e 61 72 79 20 6f 70 65  73 The unary ope
17d0: 72 61 74 6f 72 20 2b 20 69 73 20 61 20 6e 6f 2d  rator + is a no-
17e0: 6f 70 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  op..#.# EVIDENCE
17f0: 2d 4f 46 3a 20 52 2d 31 39 34 38 30 2d 33 30 39  -OF: R-19480-309
1800: 36 38 20 49 74 20 63 61 6e 20 62 65 20 61 70 70  68 It can be app
1810: 6c 69 65 64 20 74 6f 20 73 74 72 69 6e 67 73 2c  lied to strings,
1820: 20 6e 75 6d 62 65 72 73 2c 0a 23 20 62 6c 6f 62   numbers,.# blob
1830: 73 20 6f 72 20 4e 55 4c 4c 20 61 6e 64 20 69 74  s or NULL and it
1840: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1850: 61 20 72 65 73 75 6c 74 20 77 69 74 68 20 74 68  a result with th
1860: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 0a  e same value as.
1870: 23 20 74 68 65 20 6f 70 65 72 61 6e 64 2e 0a 23  # the operand..#
1880: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6c 69 74  .foreach {tn lit
1890: 65 72 61 6c 20 74 79 70 65 7d 20 7b 0a 20 20 31  eral type} {.  1
18a0: 20 20 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c 64       'helloworld
18b0: 27 20 20 20 74 65 78 74 0a 20 20 32 20 20 20 20  '   text.  2    
18c0: 20 34 35 20 20 20 20 20 20 20 20 20 20 20 20 20   45             
18d0: 69 6e 74 65 67 65 72 0a 20 20 33 20 20 20 20 20  integer.  3     
18e0: 34 35 2e 32 20 20 20 20 20 20 20 20 20 20 20 72  45.2           r
18f0: 65 61 6c 0a 20 20 34 20 20 20 20 20 34 35 2e 30  eal.  4     45.0
1900: 20 20 20 20 20 20 20 20 20 20 20 72 65 61 6c 0a             real.
1910: 20 20 35 20 20 20 20 20 58 27 41 42 43 44 45 46    5     X'ABCDEF
1920: 27 20 20 20 20 20 20 62 6c 6f 62 0a 20 20 36 20  '      blob.  6 
1930: 20 20 20 20 4e 55 4c 4c 20 20 20 20 20 20 20 20      NULL        
1940: 20 20 20 6e 75 6c 6c 0a 7d 20 7b 0a 20 20 73 65     null.} {.  se
1950: 74 20 73 71 6c 20 22 20 53 45 4c 45 43 54 20 71  t sql " SELECT q
1960: 75 6f 74 65 28 20 2b 20 24 6c 69 74 65 72 61 6c  uote( + $literal
1970: 20 29 2c 20 74 79 70 65 6f 66 28 20 2b 20 24 6c   ), typeof( + $l
1980: 69 74 65 72 61 6c 29 20 22 0a 20 20 64 6f 5f 65  iteral) ".  do_e
1990: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
19a0: 70 72 2d 33 2e 24 74 6e 20 24 73 71 6c 20 5b 6c  pr-3.$tn $sql [l
19b0: 69 73 74 20 24 6c 69 74 65 72 61 6c 20 24 74 79  ist $literal $ty
19c0: 70 65 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  pe].}..#--------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a10: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 62  -.# Check that b
1a20: 6f 74 68 20 3d 20 61 6e 64 20 3d 3d 20 61 72 65  oth = and == are
1a30: 20 62 6f 74 68 20 61 63 63 65 70 74 61 62 6c 65   both acceptable
1a40: 20 61 73 20 74 68 65 20 22 65 71 75 61 6c 73 22   as the "equals"
1a50: 20 6f 70 65 72 61 74 6f 72 2e 0a 23 20 53 69 6d   operator..# Sim
1a60: 69 6c 61 72 6c 79 2c 20 65 69 74 68 65 72 20 21  ilarly, either !
1a70: 3d 20 6f 72 20 3c 3e 20 77 6f 72 6b 20 61 73 20  = or <> work as 
1a80: 74 68 65 20 6e 6f 74 2d 65 71 75 61 6c 73 20 6f  the not-equals o
1a90: 70 65 72 61 74 6f 72 2e 0a 23 0a 23 20 45 56 49  perator..#.# EVI
1aa0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 37  DENCE-OF: R-0367
1ab0: 39 2d 36 30 36 33 39 20 45 71 75 61 6c 73 20 63  9-60639 Equals c
1ac0: 61 6e 20 62 65 20 65 69 74 68 65 72 20 3d 20 6f  an be either = o
1ad0: 72 20 3d 3d 2e 0a 23 0a 23 20 45 56 49 44 45 4e  r ==..#.# EVIDEN
1ae0: 43 45 2d 4f 46 3a 20 52 2d 33 30 30 38 32 2d 33  CE-OF: R-30082-3
1af0: 38 39 39 36 20 54 68 65 20 6e 6f 6e 2d 65 71 75  8996 The non-equ
1b00: 61 6c 73 20 6f 70 65 72 61 74 6f 72 20 63 61 6e  als operator can
1b10: 20 62 65 20 65 69 74 68 65 72 20 21 3d 20 6f 72   be either != or
1b20: 0a 23 20 3c 3e 2e 0a 23 0a 66 6f 72 65 61 63 68  .# <>..#.foreach
1b30: 20 7b 74 6e 20 6c 69 74 65 72 61 6c 20 64 69 66   {tn literal dif
1b40: 66 65 72 65 6e 74 7d 20 7b 0a 20 20 31 20 20 20  ferent} {.  1   
1b50: 27 68 65 6c 6c 6f 77 6f 72 6c 64 27 20 20 27 31  'helloworld'  '1
1b60: 32 33 34 35 27 0a 20 20 32 20 20 20 32 32 20 20  2345'.  2   22  
1b70: 20 20 20 20 20 20 20 20 20 20 32 33 0a 20 20 33            23.  3
1b80: 20 20 20 27 78 79 7a 27 20 20 20 20 20 20 20 20     'xyz'        
1b90: 20 58 27 37 38 37 39 37 41 27 0a 20 20 34 20 20   X'78797A'.  4  
1ba0: 20 58 27 37 38 37 39 37 41 30 30 27 20 20 20 27   X'78797A00'   '
1bb0: 78 79 7a 27 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78  xyz'.} {.  do_ex
1bc0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
1bd0: 72 2d 34 2e 24 74 6e 20 22 0a 20 20 20 20 53 45  r-4.$tn ".    SE
1be0: 4c 45 43 54 20 24 6c 69 74 65 72 61 6c 20 20 3d  LECT $literal  =
1bf0: 20 24 6c 69 74 65 72 61 6c 2c 20 20 20 24 6c 69   $literal,   $li
1c00: 74 65 72 61 6c 20 3d 3d 20 24 6c 69 74 65 72 61  teral == $litera
1c10: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24 6c  l,.           $l
1c20: 69 74 65 72 61 6c 20 20 3d 20 24 64 69 66 66 65  iteral  = $diffe
1c30: 72 65 6e 74 2c 20 24 6c 69 74 65 72 61 6c 20 3d  rent, $literal =
1c40: 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 0a 20 20  = $different,.  
1c50: 20 20 20 20 20 20 20 20 20 24 6c 69 74 65 72 61           $litera
1c60: 6c 20 20 3d 20 4e 55 4c 4c 2c 20 20 20 20 20 20  l  = NULL,      
1c70: 20 24 6c 69 74 65 72 61 6c 20 3d 3d 20 4e 55 4c   $literal == NUL
1c80: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24 6c  L,.           $l
1c90: 69 74 65 72 61 6c 20 21 3d 20 24 6c 69 74 65 72  iteral != $liter
1ca0: 61 6c 2c 20 20 20 24 6c 69 74 65 72 61 6c 20 3c  al,   $literal <
1cb0: 3e 20 24 6c 69 74 65 72 61 6c 2c 0a 20 20 20 20  > $literal,.    
1cc0: 20 20 20 20 20 20 20 24 6c 69 74 65 72 61 6c 20         $literal 
1cd0: 21 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 20 24  != $different, $
1ce0: 6c 69 74 65 72 61 6c 20 3c 3e 20 24 64 69 66 66  literal <> $diff
1cf0: 65 72 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  erent,.         
1d00: 20 20 24 6c 69 74 65 72 61 6c 20 21 3d 20 4e 55    $literal != NU
1d10: 4c 4c 2c 20 20 20 20 20 20 20 24 6c 69 74 65 72  LL,       $liter
1d20: 61 6c 20 21 3d 20 4e 55 4c 4c 0a 0a 20 20 22 20  al != NULL..  " 
1d30: 7b 31 20 31 20 30 20 30 20 7b 7d 20 7b 7d 20 30  {1 1 0 0 {} {} 0
1d40: 20 30 20 31 20 31 20 7b 7d 20 7b 7d 7d 0a 7d 0a   0 1 1 {} {}}.}.
1d50: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
1da0: 73 74 20 74 68 65 20 7c 7c 20 6f 70 65 72 61 74  st the || operat
1db0: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
1dc0: 2d 4f 46 3a 20 52 2d 34 34 34 30 39 2d 36 32 36  -OF: R-44409-626
1dd0: 34 31 20 54 68 65 20 7c 7c 20 6f 70 65 72 61 74  41 The || operat
1de0: 6f 72 20 69 73 20 22 63 6f 6e 63 61 74 65 6e 61  or is "concatena
1df0: 74 65 22 20 2d 20 69 74 20 6a 6f 69 6e 73 0a 23  te" - it joins.#
1e00: 20 74 6f 67 65 74 68 65 72 20 74 68 65 20 74 77   together the tw
1e10: 6f 20 73 74 72 69 6e 67 73 20 6f 66 20 69 74 73  o strings of its
1e20: 20 6f 70 65 72 61 6e 64 73 2e 0a 23 0a 66 6f 72   operands..#.for
1e30: 65 61 63 68 20 7b 74 6e 20 61 20 62 7d 20 7b 0a  each {tn a b} {.
1e40: 20 20 31 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c    1   'helloworl
1e50: 64 27 20 20 27 31 32 33 34 35 27 0a 20 20 32 20  d'  '12345'.  2 
1e60: 20 20 32 32 20 20 20 20 20 20 20 20 20 20 20 20    22            
1e70: 32 33 0a 7d 20 7b 0a 20 20 73 65 74 20 61 73 20  23.} {.  set as 
1e80: 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20  [db one "SELECT 
1e90: 24 61 22 5d 0a 20 20 73 65 74 20 62 73 20 5b 64  $a"].  set bs [d
1ea0: 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 24 62  b one "SELECT $b
1eb0: 22 5d 0a 20 20 0a 20 20 64 6f 5f 65 78 65 63 73  "].  .  do_execs
1ec0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 35  ql_test e_expr-5
1ed0: 2e 24 74 6e 20 22 53 45 4c 45 43 54 20 24 61 20  .$tn "SELECT $a 
1ee0: 7c 7c 20 24 62 22 20 5b 6c 69 73 74 20 22 24 7b  || $b" [list "${
1ef0: 61 73 7d 24 7b 62 73 7d 22 5d 0a 7d 0a 0a 23 2d  as}${bs}"].}..#-
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
1f50: 74 68 65 20 25 20 6f 70 65 72 61 74 6f 72 2e 0a  the % operator..
1f60: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
1f70: 20 52 2d 30 34 32 32 33 2d 30 34 33 35 32 20 54   R-04223-04352 T
1f80: 68 65 20 6f 70 65 72 61 74 6f 72 20 25 20 6f 75  he operator % ou
1f90: 74 70 75 74 73 20 74 68 65 20 69 6e 74 65 67 65  tputs the intege
1fa0: 72 20 76 61 6c 75 65 20 6f 66 0a 23 20 69 74 73  r value of.# its
1fb0: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6d 6f   left operand mo
1fc0: 64 75 6c 6f 20 69 74 73 20 72 69 67 68 74 20 6f  dulo its right o
1fd0: 70 65 72 61 6e 64 2e 0a 23 0a 64 6f 5f 65 78 65  perand..#.do_exe
1fe0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
1ff0: 2d 36 2e 31 20 7b 53 45 4c 45 43 54 20 20 37 32  -6.1 {SELECT  72
2000: 25 35 7d 20 20 7b 32 7d 0a 64 6f 5f 65 78 65 63  %5}  {2}.do_exec
2010: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
2020: 36 2e 32 20 7b 53 45 4c 45 43 54 20 20 37 32 25  6.2 {SELECT  72%
2030: 2d 35 7d 20 7b 32 7d 0a 64 6f 5f 65 78 65 63 73  -5} {2}.do_execs
2040: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 36  ql_test e_expr-6
2050: 2e 33 20 7b 53 45 4c 45 43 54 20 2d 37 32 25 2d  .3 {SELECT -72%-
2060: 35 7d 20 7b 2d 32 7d 0a 64 6f 5f 65 78 65 63 73  5} {-2}.do_execs
2070: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 36  ql_test e_expr-6
2080: 2e 34 20 7b 53 45 4c 45 43 54 20 2d 37 32 25 35  .4 {SELECT -72%5
2090: 7d 20 20 7b 2d 32 7d 0a 64 6f 5f 65 78 65 63 73  }  {-2}.do_execs
20a0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 36  ql_test e_expr-6
20b0: 2e 35 20 7b 53 45 4c 45 43 54 20 37 32 2e 33 35  .5 {SELECT 72.35
20c0: 25 35 7d 20 7b 32 2e 30 7d 0a 0a 23 2d 2d 2d 2d  %5} {2.0}..#----
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2110: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
2120: 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  t the results of
2130: 20 61 6c 6c 20 62 69 6e 61 72 79 20 6f 70 65 72   all binary oper
2140: 61 74 6f 72 73 20 61 72 65 20 65 69 74 68 65 72  ators are either
2150: 20 6e 75 6d 65 72 69 63 20 6f 72 20 0a 23 20 4e   numeric or .# N
2160: 55 4c 4c 2c 20 65 78 63 65 70 74 20 66 6f 72 20  ULL, except for 
2170: 74 68 65 20 7c 7c 20 6f 70 65 72 61 74 6f 72 2c  the || operator,
2180: 20 77 68 69 63 68 20 6d 61 79 20 65 76 61 6c 75   which may evalu
2190: 61 74 65 20 74 6f 20 65 69 74 68 65 72 20 61 20  ate to either a 
21a0: 74 65 78 74 0a 23 20 76 61 6c 75 65 20 6f 72 20  text.# value or 
21b0: 4e 55 4c 4c 2e 0a 23 0a 23 20 45 56 49 44 45 4e  NULL..#.# EVIDEN
21c0: 43 45 2d 4f 46 3a 20 52 2d 32 30 36 36 35 2d 31  CE-OF: R-20665-1
21d0: 37 37 39 32 20 54 68 65 20 72 65 73 75 6c 74 20  7792 The result 
21e0: 6f 66 20 61 6e 79 20 62 69 6e 61 72 79 20 6f 70  of any binary op
21f0: 65 72 61 74 6f 72 20 69 73 20 65 69 74 68 65 72  erator is either
2200: 0a 23 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c  .# a numeric val
2210: 75 65 20 6f 72 20 4e 55 4c 4c 2c 20 65 78 63 65  ue or NULL, exce
2220: 70 74 20 66 6f 72 20 74 68 65 20 7c 7c 20 63 6f  pt for the || co
2230: 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 70 65 72  ncatenation oper
2240: 61 74 6f 72 0a 23 20 77 68 69 63 68 20 61 6c 77  ator.# which alw
2250: 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ays evaluates to
2260: 20 65 69 74 68 65 72 20 4e 55 4c 4c 20 6f 72 20   either NULL or 
2270: 61 20 74 65 78 74 20 76 61 6c 75 65 2e 0a 23 0a  a text value..#.
2280: 73 65 74 20 6c 69 74 65 72 61 6c 73 20 7b 0a 20  set literals {. 
2290: 20 31 20 27 61 62 63 27 20 20 20 20 20 20 20 20   1 'abc'        
22a0: 32 20 27 68 65 78 61 64 65 63 69 6d 61 6c 27 20  2 'hexadecimal' 
22b0: 20 20 20 20 20 20 33 20 27 27 0a 20 20 34 20 31        3 ''.  4 1
22c0: 32 33 20 20 20 20 20 20 20 20 20 20 35 20 2d 31  23          5 -1
22d0: 32 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20  23              
22e0: 20 20 36 20 30 0a 20 20 37 20 31 32 33 2e 34 20    6 0.  7 123.4 
22f0: 20 20 20 20 20 20 20 38 20 30 2e 30 20 20 20 20         8 0.0    
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 39 20 2d               9 -
2310: 31 32 33 2e 34 0a 20 31 30 20 58 27 41 42 43 44  123.4. 10 X'ABCD
2320: 45 46 27 20 20 20 31 31 20 58 27 27 20 20 20 20  EF'   11 X''    
2330: 20 20 20 20 20 20 20 20 20 20 20 20 31 32 20 58              12 X
2340: 27 30 30 30 30 27 0a 20 31 33 20 20 20 20 20 4e  '0000'. 13     N
2350: 55 4c 4c 0a 7d 0a 66 6f 72 65 61 63 68 20 6f 70  ULL.}.foreach op
2360: 20 24 6f 70 6c 69 73 74 20 7b 0a 20 20 66 6f 72   $oplist {.  for
2370: 65 61 63 68 20 7b 6e 31 20 72 68 73 7d 20 24 6c  each {n1 rhs} $l
2380: 69 74 65 72 61 6c 73 20 7b 20 0a 20 20 66 6f 72  iterals { .  for
2390: 65 61 63 68 20 7b 6e 32 20 6c 68 73 7d 20 24 6c  each {n2 lhs} $l
23a0: 69 74 65 72 61 6c 73 20 7b 0a 0a 20 20 20 20 73  iterals {..    s
23b0: 65 74 20 74 20 5b 64 62 20 6f 6e 65 20 22 20 53  et t [db one " S
23c0: 45 4c 45 43 54 20 74 79 70 65 6f 66 28 24 6c 68  ELECT typeof($lh
23d0: 73 20 24 6f 70 20 24 72 68 73 29 20 22 5d 0a 20  s $op $rhs) "]. 
23e0: 20 20 20 64 6f 5f 74 65 73 74 20 65 5f 65 78 70     do_test e_exp
23f0: 72 2d 37 2e 24 6f 70 6e 61 6d 65 28 24 6f 70 29  r-7.$opname($op)
2400: 2e 24 6e 31 2e 24 6e 32 20 7b 0a 20 20 20 20 20  .$n1.$n2 {.     
2410: 20 65 78 70 72 20 7b 0a 20 20 20 20 20 20 20 20   expr {.        
2420: 20 20 20 28 24 6f 70 3d 3d 22 7c 7c 22 20 26 26     ($op=="||" &&
2430: 20 28 24 74 20 3d 3d 20 22 74 65 78 74 22 20 7c   ($t == "text" |
2440: 7c 20 24 74 20 3d 3d 20 22 6e 75 6c 6c 22 29 29  | $t == "null"))
2450: 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 24 6f 70  .        || ($op
2460: 21 3d 22 7c 7c 22 20 26 26 20 28 24 74 20 3d 3d  !="||" && ($t ==
2470: 20 22 69 6e 74 65 67 65 72 22 20 7c 7c 20 24 74   "integer" || $t
2480: 20 3d 3d 20 22 72 65 61 6c 22 20 7c 7c 20 24 74   == "real" || $t
2490: 20 3d 3d 20 22 6e 75 6c 6c 22 29 29 0a 20 20 20   == "null")).   
24a0: 20 20 20 7d 0a 20 20 20 20 7d 20 31 0a 0a 20 20     }.    } 1..  
24b0: 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}.}..#---------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2500: 0a 23 20 54 65 73 74 20 74 68 65 20 49 53 20 61  .# Test the IS a
2510: 6e 64 20 49 53 20 4e 4f 54 20 6f 70 65 72 61 74  nd IS NOT operat
2520: 6f 72 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ors..#.# EVIDENC
2530: 45 2d 4f 46 3a 20 52 2d 32 34 37 33 31 2d 34 35  E-OF: R-24731-45
2540: 37 37 33 20 54 68 65 20 49 53 20 61 6e 64 20 49  773 The IS and I
2550: 53 20 4e 4f 54 20 6f 70 65 72 61 74 6f 72 73 20  S NOT operators 
2560: 77 6f 72 6b 20 6c 69 6b 65 20 3d 20 61 6e 64 0a  work like = and.
2570: 23 20 21 3d 20 65 78 63 65 70 74 20 77 68 65 6e  # != except when
2580: 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   one or both of 
2590: 74 68 65 20 6f 70 65 72 61 6e 64 73 20 61 72 65  the operands are
25a0: 20 4e 55 4c 4c 2e 0a 23 0a 23 20 45 56 49 44 45   NULL..#.# EVIDE
25b0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 33 32 35 2d  NCE-OF: R-06325-
25c0: 31 35 33 31 35 20 49 6e 20 74 68 69 73 20 63 61  15315 In this ca
25d0: 73 65 2c 20 69 66 20 62 6f 74 68 20 6f 70 65 72  se, if both oper
25e0: 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c 2c 0a 23  ands are NULL,.#
25f0: 20 74 68 65 6e 20 74 68 65 20 49 53 20 6f 70 65   then the IS ope
2600: 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73 20  rator evaluates 
2610: 74 6f 20 31 20 28 74 72 75 65 29 20 61 6e 64 20  to 1 (true) and 
2620: 74 68 65 20 49 53 20 4e 4f 54 20 6f 70 65 72 61  the IS NOT opera
2630: 74 6f 72 0a 23 20 65 76 61 6c 75 61 74 65 73 20  tor.# evaluates 
2640: 74 6f 20 30 20 28 66 61 6c 73 65 29 2e 0a 23 0a  to 0 (false)..#.
2650: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
2660: 2d 31 39 38 31 32 2d 33 36 37 37 39 20 49 66 20  -19812-36779 If 
2670: 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69 73 20 4e  one operand is N
2680: 55 4c 4c 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ULL and the othe
2690: 72 20 69 73 0a 23 20 6e 6f 74 2c 20 74 68 65 6e  r is.# not, then
26a0: 20 74 68 65 20 49 53 20 6f 70 65 72 61 74 6f 72   the IS operator
26b0: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 30 20   evaluates to 0 
26c0: 28 66 61 6c 73 65 29 20 61 6e 64 20 74 68 65 20  (false) and the 
26d0: 49 53 20 4e 4f 54 0a 23 20 6f 70 65 72 61 74 6f  IS NOT.# operato
26e0: 72 20 69 73 20 31 20 28 74 72 75 65 29 2e 0a 23  r is 1 (true)..#
26f0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
2700: 52 2d 36 31 39 37 35 2d 31 33 34 31 30 20 49 74  R-61975-13410 It
2710: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
2720: 20 66 6f 72 20 61 6e 20 49 53 20 6f 72 20 49 53   for an IS or IS
2730: 20 4e 4f 54 0a 23 20 65 78 70 72 65 73 73 69 6f   NOT.# expressio
2740: 6e 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 6f  n to evaluate to
2750: 20 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f 65 78 65 63   NULL..#.do_exec
2760: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
2770: 38 2e 31 2e 31 20 20 7b 20 53 45 4c 45 43 54 20  8.1.1  { SELECT 
2780: 4e 55 4c 4c 20 49 53 20 20 20 20 20 4e 55 4c 4c  NULL IS     NULL
2790: 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71   } {1}.do_execsq
27a0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
27b0: 31 2e 32 20 20 7b 20 53 45 4c 45 43 54 20 27 61  1.2  { SELECT 'a
27c0: 62 27 20 49 53 20 20 20 20 20 4e 55 4c 4c 20 7d  b' IS     NULL }
27d0: 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {0}.do_execsql_
27e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e  test e_expr-8.1.
27f0: 33 20 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c  3  { SELECT NULL
2800: 20 49 53 20 20 20 20 20 27 61 62 27 20 7d 20 7b   IS     'ab' } {
2810: 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0}.do_execsql_te
2820: 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 34 20  st e_expr-8.1.4 
2830: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27 20 49   { SELECT 'ab' I
2840: 53 20 20 20 20 20 27 61 62 27 20 7d 20 7b 31 7d  S     'ab' } {1}
2850: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2860: 20 65 5f 65 78 70 72 2d 38 2e 31 2e 35 20 20 7b   e_expr-8.1.5  {
2870: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 3d 3d 20   SELECT NULL == 
2880: 20 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b 7d 7d 0a      NULL } {{}}.
2890: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
28a0: 65 5f 65 78 70 72 2d 38 2e 31 2e 36 20 20 7b 20  e_expr-8.1.6  { 
28b0: 53 45 4c 45 43 54 20 27 61 62 27 20 3d 3d 20 20  SELECT 'ab' ==  
28c0: 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b 7d 7d 0a 64     NULL } {{}}.d
28d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
28e0: 5f 65 78 70 72 2d 38 2e 31 2e 37 20 20 7b 20 53  _expr-8.1.7  { S
28f0: 45 4c 45 43 54 20 4e 55 4c 4c 20 3d 3d 20 20 20  ELECT NULL ==   
2900: 20 20 27 61 62 27 20 7d 20 7b 7b 7d 7d 0a 64 6f    'ab' } {{}}.do
2910: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
2920: 65 78 70 72 2d 38 2e 31 2e 38 20 20 7b 20 53 45  expr-8.1.8  { SE
2930: 4c 45 43 54 20 27 61 62 27 20 3d 3d 20 20 20 20  LECT 'ab' ==    
2940: 20 27 61 62 27 20 7d 20 7b 31 7d 0a 64 6f 5f 65   'ab' } {1}.do_e
2950: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
2960: 70 72 2d 38 2e 31 2e 39 20 20 7b 20 53 45 4c 45  pr-8.1.9  { SELE
2970: 43 54 20 4e 55 4c 4c 20 49 53 20 4e 4f 54 20 4e  CT NULL IS NOT N
2980: 55 4c 4c 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65  ULL } {0}.do_exe
2990: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
29a0: 2d 38 2e 31 2e 31 30 20 7b 20 53 45 4c 45 43 54  -8.1.10 { SELECT
29b0: 20 27 61 62 27 20 49 53 20 4e 4f 54 20 4e 55 4c   'ab' IS NOT NUL
29c0: 4c 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73  L } {1}.do_execs
29d0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38  ql_test e_expr-8
29e0: 2e 31 2e 31 31 20 7b 20 53 45 4c 45 43 54 20 4e  .1.11 { SELECT N
29f0: 55 4c 4c 20 49 53 20 4e 4f 54 20 27 61 62 27 20  ULL IS NOT 'ab' 
2a00: 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {1}.do_execsql
2a10: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31  _test e_expr-8.1
2a20: 2e 31 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .12 { SELECT 'ab
2a30: 27 20 49 53 20 4e 4f 54 20 27 61 62 27 20 7d 20  ' IS NOT 'ab' } 
2a40: 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {0}.do_execsql_t
2a50: 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31  est e_expr-8.1.1
2a60: 33 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20  3 { SELECT NULL 
2a70: 21 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b  !=     NULL } {{
2a80: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
2a90: 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31 34  st e_expr-8.1.14
2aa0: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27 20 21   { SELECT 'ab' !
2ab0: 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b 7d  =     NULL } {{}
2ac0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
2ad0: 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31 35 20  t e_expr-8.1.15 
2ae0: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 21 3d  { SELECT NULL !=
2af0: 20 20 20 20 20 27 61 62 27 20 7d 20 7b 7b 7d 7d       'ab' } {{}}
2b00: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2b10: 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31 36 20 7b   e_expr-8.1.16 {
2b20: 20 53 45 4c 45 43 54 20 27 61 62 27 20 21 3d 20   SELECT 'ab' != 
2b30: 20 20 20 20 27 61 62 27 20 7d 20 7b 30 7d 0a 0a      'ab' } {0}..
2b40: 66 6f 72 65 61 63 68 20 7b 6e 31 20 72 68 73 7d  foreach {n1 rhs}
2b50: 20 24 6c 69 74 65 72 61 6c 73 20 7b 20 0a 20 20   $literals { .  
2b60: 66 6f 72 65 61 63 68 20 7b 6e 32 20 6c 68 73 7d  foreach {n2 lhs}
2b70: 20 24 6c 69 74 65 72 61 6c 73 20 7b 0a 20 20 20   $literals {.   
2b80: 20 69 66 20 7b 24 72 68 73 21 3d 22 4e 55 4c 4c   if {$rhs!="NULL
2b90: 22 20 26 26 20 24 6c 68 73 21 3d 22 4e 55 4c 4c  " && $lhs!="NULL
2ba0: 22 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 65  "} {.      set e
2bb0: 71 20 5b 65 78 65 63 73 71 6c 20 22 53 45 4c 45  q [execsql "SELE
2bc0: 43 54 20 24 6c 68 73 20 3d 20 24 72 68 73 2c 20  CT $lhs = $rhs, 
2bd0: 24 6c 68 73 20 21 3d 20 24 72 68 73 22 5d 0a 20  $lhs != $rhs"]. 
2be0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2bf0: 20 20 73 65 74 20 65 71 20 5b 6c 69 73 74 20 5b    set eq [list [
2c00: 65 78 70 72 20 7b 24 6c 68 73 3d 3d 22 4e 55 4c  expr {$lhs=="NUL
2c10: 4c 22 20 26 26 20 24 72 68 73 3d 3d 22 4e 55 4c  L" && $rhs=="NUL
2c20: 4c 22 7d 5d 20 5c 0a 20 20 20 20 20 20 20 20 20  L"}] \.         
2c30: 20 20 20 20 20 20 20 20 20 20 5b 65 78 70 72 20            [expr 
2c40: 7b 24 6c 68 73 21 3d 22 4e 55 4c 4c 22 20 7c 7c  {$lhs!="NULL" ||
2c50: 20 24 72 68 73 21 3d 22 4e 55 4c 4c 22 7d 5d 0a   $rhs!="NULL"}].
2c60: 20 20 20 20 20 20 5d 0a 20 20 20 20 7d 0a 20 20        ].    }.  
2c70: 20 20 73 65 74 20 74 65 73 74 20 65 5f 65 78 70    set test e_exp
2c80: 72 2d 38 2e 32 2e 24 6e 31 2e 24 6e 32 0a 20 20  r-8.2.$n1.$n2.  
2c90: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
2ca0: 74 20 24 74 65 73 74 2e 31 20 22 53 45 4c 45 43  t $test.1 "SELEC
2cb0: 54 20 24 6c 68 73 20 49 53 20 24 72 68 73 2c 20  T $lhs IS $rhs, 
2cc0: 24 6c 68 73 20 49 53 20 4e 4f 54 20 24 72 68 73  $lhs IS NOT $rhs
2cd0: 22 20 24 65 71 0a 20 20 20 20 64 6f 5f 65 78 65  " $eq.    do_exe
2ce0: 63 73 71 6c 5f 74 65 73 74 20 24 74 65 73 74 2e  csql_test $test.
2cf0: 32 20 22 0a 20 20 20 20 20 20 53 45 4c 45 43 54  2 ".      SELECT
2d00: 20 28 24 6c 68 73 20 49 53 20 24 72 68 73 29 20   ($lhs IS $rhs) 
2d10: 49 53 20 4e 55 4c 4c 2c 20 28 24 6c 68 73 20 49  IS NULL, ($lhs I
2d20: 53 20 4e 4f 54 20 24 72 68 73 29 20 49 53 20 4e  S NOT $rhs) IS N
2d30: 55 4c 4c 0a 20 20 20 20 22 20 7b 30 20 30 7d 0a  ULL.    " {0 0}.
2d40: 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d    }.}..#--------
2d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d90: 2d 0a 23 20 52 75 6e 20 73 6f 6d 65 20 74 65 73  -.# Run some tes
2da0: 74 73 20 6f 6e 20 74 68 65 20 43 4f 4c 4c 41 54  ts on the COLLAT
2db0: 45 20 22 75 6e 61 72 79 20 70 6f 73 74 66 69 78  E "unary postfix
2dc0: 20 6f 70 65 72 61 74 6f 72 22 2e 0a 23 0a 23 20   operator"..#.# 
2dd0: 54 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  This collation s
2de0: 65 71 75 65 6e 63 65 20 72 65 76 65 72 73 65 73  equence reverses
2df0: 20 62 6f 74 68 20 61 72 67 75 6d 65 6e 74 73 20   both arguments 
2e00: 62 65 66 6f 72 65 20 75 73 69 6e 67 20 0a 23 20  before using .# 
2e10: 5b 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65 5d  [string compare]
2e20: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 68 65 6d   to compare them
2e30: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  . For example, w
2e40: 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  hen comparing th
2e50: 65 0a 23 20 73 74 72 69 6e 67 73 20 27 6f 6e 65  e.# strings 'one
2e60: 27 20 61 6e 64 20 27 66 6f 75 72 27 2c 20 72 65  ' and 'four', re
2e70: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
2e80: 6f 66 3a 0a 23 20 20 20 0a 23 20 20 20 73 74 72  of:.#   .#   str
2e90: 69 6e 67 20 63 6f 6d 70 61 72 65 20 65 6e 6f 20  ing compare eno 
2ea0: 72 75 6f 66 0a 23 0a 70 72 6f 63 20 72 65 76 65  ruof.#.proc reve
2eb0: 72 73 65 5f 73 74 72 20 7b 7a 53 74 72 7d 20 7b  rse_str {zStr} {
2ec0: 0a 20 20 73 65 74 20 6f 75 74 20 22 22 0a 20 20  .  set out "".  
2ed0: 66 6f 72 65 61 63 68 20 63 20 5b 73 70 6c 69 74  foreach c [split
2ee0: 20 24 7a 53 74 72 20 7b 7d 5d 20 7b 20 73 65 74   $zStr {}] { set
2ef0: 20 6f 75 74 20 22 24 7b 63 7d 24 7b 6f 75 74 7d   out "${c}${out}
2f00: 22 20 7d 0a 20 20 73 65 74 20 6f 75 74 0a 7d 0a  " }.  set out.}.
2f10: 70 72 6f 63 20 72 65 76 65 72 73 65 5f 63 6f 6c  proc reverse_col
2f20: 6c 61 74 65 20 7b 7a 4c 65 66 74 20 7a 52 69 67  late {zLeft zRig
2f30: 68 74 7d 20 7b 0a 20 20 73 74 72 69 6e 67 20 63  ht} {.  string c
2f40: 6f 6d 70 61 72 65 20 5b 72 65 76 65 72 73 65 5f  ompare [reverse_
2f50: 73 74 72 20 24 7a 4c 65 66 74 5d 20 5b 72 65 76  str $zLeft] [rev
2f60: 65 72 73 65 5f 73 74 72 20 24 7a 52 69 67 68 74  erse_str $zRight
2f70: 5d 0a 7d 0a 64 62 20 63 6f 6c 6c 61 74 65 20 72  ].}.db collate r
2f80: 65 76 65 72 73 65 20 72 65 76 65 72 73 65 5f 63  everse reverse_c
2f90: 6f 6c 6c 61 74 65 0a 0a 23 20 45 56 49 44 45 4e  ollate..# EVIDEN
2fa0: 43 45 2d 4f 46 3a 20 52 2d 35 39 35 37 37 2d 33  CE-OF: R-59577-3
2fb0: 33 34 37 31 20 54 68 65 20 43 4f 4c 4c 41 54 45  3471 The COLLATE
2fc0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 75   operator is a u
2fd0: 6e 61 72 79 20 70 6f 73 74 66 69 78 0a 23 20 6f  nary postfix.# o
2fe0: 70 65 72 61 74 6f 72 20 74 68 61 74 20 61 73 73  perator that ass
2ff0: 69 67 6e 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67  igns a collating
3000: 20 73 65 71 75 65 6e 63 65 20 74 6f 20 61 6e 20   sequence to an 
3010: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23 0a 23 20  expression..#.# 
3020: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
3030: 36 32 33 31 2d 33 30 37 33 31 20 54 68 65 20 43  6231-30731 The C
3040: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
3050: 68 61 73 20 61 20 68 69 67 68 65 72 0a 23 20 70  has a higher.# p
3060: 72 65 63 65 64 65 6e 63 65 20 28 62 69 6e 64 73  recedence (binds
3070: 20 6d 6f 72 65 20 74 69 67 68 74 6c 79 29 20 74   more tightly) t
3080: 68 61 6e 20 61 6e 79 20 62 69 6e 61 72 79 20 6f  han any binary o
3090: 70 65 72 61 74 6f 72 20 61 6e 64 20 61 6e 79 20  perator and any 
30a0: 75 6e 61 72 79 0a 23 20 70 72 65 66 69 78 20 6f  unary.# prefix o
30b0: 70 65 72 61 74 6f 72 20 65 78 63 65 70 74 20 22  perator except "
30c0: 7e 22 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ~"..#.do_execsql
30d0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31  _test e_expr-9.1
30e0: 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64   { SELECT  'abcd
30f0: 27 20 3c 20 27 62 62 62 62 27 20 20 20 20 43 4f  ' < 'bbbb'    CO
3100: 4c 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d 20  LLATE reverse } 
3110: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
3120: 74 20 65 5f 65 78 70 72 2d 39 2e 32 20 7b 20 53  t e_expr-9.2 { S
3130: 45 4c 45 43 54 20 28 27 61 62 63 64 27 20 3c 20  ELECT ('abcd' < 
3140: 27 62 62 62 62 27 29 20 20 20 43 4f 4c 4c 41 54  'bbbb')   COLLAT
3150: 45 20 72 65 76 65 72 73 65 20 7d 20 31 0a 64 6f  E reverse } 1.do
3160: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3170: 65 78 70 72 2d 39 2e 33 20 7b 20 53 45 4c 45 43  expr-9.3 { SELEC
3180: 54 20 20 27 61 62 63 64 27 20 3c 3d 20 27 62 62  T  'abcd' <= 'bb
3190: 62 62 27 20 20 20 43 4f 4c 4c 41 54 45 20 72 65  bb'   COLLATE re
31a0: 76 65 72 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65  verse } 0.do_exe
31b0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
31c0: 2d 39 2e 34 20 7b 20 53 45 4c 45 43 54 20 28 27  -9.4 { SELECT ('
31d0: 61 62 63 64 27 20 3c 3d 20 27 62 62 62 62 27 29  abcd' <= 'bbbb')
31e0: 20 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73    COLLATE revers
31f0: 65 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71  e } 1..do_execsq
3200: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e  l_test e_expr-9.
3210: 35 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63  5 { SELECT  'abc
3220: 64 27 20 3e 20 27 62 62 62 62 27 20 20 20 20 43  d' > 'bbbb'    C
3230: 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d  OLLATE reverse }
3240: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
3250: 73 74 20 65 5f 65 78 70 72 2d 39 2e 36 20 7b 20  st e_expr-9.6 { 
3260: 53 45 4c 45 43 54 20 28 27 61 62 63 64 27 20 3e  SELECT ('abcd' >
3270: 20 27 62 62 62 62 27 29 20 20 20 43 4f 4c 4c 41   'bbbb')   COLLA
3280: 54 45 20 72 65 76 65 72 73 65 20 7d 20 30 0a 64  TE reverse } 0.d
3290: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
32a0: 5f 65 78 70 72 2d 39 2e 37 20 7b 20 53 45 4c 45  _expr-9.7 { SELE
32b0: 43 54 20 20 27 61 62 63 64 27 20 3e 3d 20 27 62  CT  'abcd' >= 'b
32c0: 62 62 62 27 20 20 20 43 4f 4c 4c 41 54 45 20 72  bbb'   COLLATE r
32d0: 65 76 65 72 73 65 20 7d 20 31 0a 64 6f 5f 65 78  everse } 1.do_ex
32e0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
32f0: 72 2d 39 2e 38 20 7b 20 53 45 4c 45 43 54 20 28  r-9.8 { SELECT (
3300: 27 61 62 63 64 27 20 3e 3d 20 27 62 62 62 62 27  'abcd' >= 'bbbb'
3310: 29 20 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72  )  COLLATE rever
3320: 73 65 20 7d 20 30 0a 0a 64 6f 5f 65 78 65 63 73  se } 0..do_execs
3330: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
3340: 2e 31 30 20 7b 20 53 45 4c 45 43 54 20 20 27 61  .10 { SELECT  'a
3350: 62 63 64 27 20 3d 20 20 27 41 42 43 44 27 20 20  bcd' =  'ABCD'  
3360: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d  COLLATE nocase }
3370: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
3380: 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 31 20 7b  st e_expr-9.11 {
3390: 20 53 45 4c 45 43 54 20 28 27 61 62 63 64 27 20   SELECT ('abcd' 
33a0: 3d 20 20 27 41 42 43 44 27 29 20 43 4f 4c 4c 41  =  'ABCD') COLLA
33b0: 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64 6f  TE nocase } 0.do
33c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
33d0: 65 78 70 72 2d 39 2e 31 32 20 7b 20 53 45 4c 45  expr-9.12 { SELE
33e0: 43 54 20 20 27 61 62 63 64 27 20 3d 3d 20 27 41  CT  'abcd' == 'A
33f0: 42 43 44 27 20 20 43 4f 4c 4c 41 54 45 20 6e 6f  BCD'  COLLATE no
3400: 63 61 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  case } 1.do_exec
3410: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3420: 39 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 28 27  9.13 { SELECT ('
3430: 61 62 63 64 27 20 3d 3d 20 27 41 42 43 44 27 29  abcd' == 'ABCD')
3440: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
3450: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
3460: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 34 20  est e_expr-9.14 
3470: 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27  { SELECT  'abcd'
3480: 20 49 53 20 27 41 42 43 44 27 20 20 43 4f 4c 4c   IS 'ABCD'  COLL
3490: 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64  ATE nocase } 1.d
34a0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
34b0: 5f 65 78 70 72 2d 39 2e 31 35 20 7b 20 53 45 4c  _expr-9.15 { SEL
34c0: 45 43 54 20 28 27 61 62 63 64 27 20 49 53 20 27  ECT ('abcd' IS '
34d0: 41 42 43 44 27 29 20 43 4f 4c 4c 41 54 45 20 6e  ABCD') COLLATE n
34e0: 6f 63 61 73 65 20 7d 20 30 0a 0a 64 6f 5f 65 78  ocase } 0..do_ex
34f0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3500: 72 2d 39 2e 31 36 20 7b 20 53 45 4c 45 43 54 20  r-9.16 { SELECT 
3510: 20 27 61 62 63 64 27 20 21 3d 20 27 41 42 43 44   'abcd' != 'ABCD
3520: 27 20 20 20 20 20 20 43 4f 4c 4c 41 54 45 20 6e  '      COLLATE n
3530: 6f 63 61 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65  ocase } 0.do_exe
3540: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3550: 2d 39 2e 31 37 20 7b 20 53 45 4c 45 43 54 20 28  -9.17 { SELECT (
3560: 27 61 62 63 64 27 20 21 3d 20 27 41 42 43 44 27  'abcd' != 'ABCD'
3570: 29 20 20 20 20 20 43 4f 4c 4c 41 54 45 20 6e 6f  )     COLLATE no
3580: 63 61 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  case } 1.do_exec
3590: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
35a0: 39 2e 31 38 20 7b 20 53 45 4c 45 43 54 20 20 27  9.18 { SELECT  '
35b0: 61 62 63 64 27 20 3c 3e 20 27 41 42 43 44 27 20  abcd' <> 'ABCD' 
35c0: 20 20 20 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63       COLLATE noc
35d0: 61 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  ase } 0.do_execs
35e0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
35f0: 2e 31 39 20 7b 20 53 45 4c 45 43 54 20 28 27 61  .19 { SELECT ('a
3600: 62 63 64 27 20 3c 3e 20 27 41 42 43 44 27 29 20  bcd' <> 'ABCD') 
3610: 20 20 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61      COLLATE noca
3620: 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71  se } 1.do_execsq
3630: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e  l_test e_expr-9.
3640: 32 30 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62  20 { SELECT  'ab
3650: 63 64 27 20 49 53 20 4e 4f 54 20 27 41 42 43 44  cd' IS NOT 'ABCD
3660: 27 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  '  COLLATE nocas
3670: 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  e } 0.do_execsql
3680: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
3690: 31 20 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63  1 { SELECT ('abc
36a0: 64 27 20 49 53 20 4e 4f 54 20 27 41 42 43 44 27  d' IS NOT 'ABCD'
36b0: 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ) COLLATE nocase
36c0: 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   } 1..do_execsql
36d0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
36e0: 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 27 62  2 { .  SELECT 'b
36f0: 62 62 27 20 42 45 54 57 45 45 4e 20 27 41 41 41  bb' BETWEEN 'AAA
3700: 27 20 41 4e 44 20 27 43 43 43 27 20 43 4f 4c 4c  ' AND 'CCC' COLL
3710: 41 54 45 20 6e 6f 63 61 73 65 20 0a 7d 20 31 0a  ATE nocase .} 1.
3720: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3730: 65 5f 65 78 70 72 2d 39 2e 32 33 20 7b 20 0a 20  e_expr-9.23 { . 
3740: 20 53 45 4c 45 43 54 20 28 27 62 62 62 27 20 42   SELECT ('bbb' B
3750: 45 54 57 45 45 4e 20 27 41 41 41 27 20 41 4e 44  ETWEEN 'AAA' AND
3760: 20 27 43 43 43 27 29 20 43 4f 4c 4c 41 54 45 20   'CCC') COLLATE 
3770: 6e 6f 63 61 73 65 20 0a 7d 20 30 0a 0a 23 20 45  nocase .} 0..# E
3780: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
3790: 37 33 31 2d 32 35 34 33 39 20 54 68 65 20 63 6f  731-25439 The co
37a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
37b0: 20 73 65 74 20 62 79 20 74 68 65 20 43 4f 4c 4c   set by the COLL
37c0: 41 54 45 0a 23 20 6f 70 65 72 61 74 6f 72 20 6f  ATE.# operator o
37d0: 76 65 72 72 69 64 65 73 20 74 68 65 20 63 6f 6c  verrides the col
37e0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
37f0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
3800: 65 20 43 4f 4c 4c 41 54 45 0a 23 20 63 6c 61 75  e COLLATE.# clau
3810: 73 65 20 69 6e 20 61 20 74 61 62 6c 65 20 63 6f  se in a table co
3820: 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2e  lumn definition.
3830: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
3840: 73 74 20 65 5f 65 78 70 72 2d 39 2e 32 34 20 7b  st e_expr-9.24 {
3850: 20 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45   .  CREATE TABLE
3860: 20 74 32 34 28 61 20 43 4f 4c 4c 41 54 45 20 4e   t24(a COLLATE N
3870: 4f 43 41 53 45 2c 20 62 29 3b 0a 20 20 49 4e 53  OCASE, b);.  INS
3880: 45 52 54 20 49 4e 54 4f 20 74 32 34 20 56 41 4c  ERT INTO t24 VAL
3890: 55 45 53 28 27 61 61 61 27 2c 20 31 29 3b 0a 20  UES('aaa', 1);. 
38a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 34   INSERT INTO t24
38b0: 20 56 41 4c 55 45 53 28 27 62 62 62 27 2c 20 32   VALUES('bbb', 2
38c0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
38d0: 20 74 32 34 20 56 41 4c 55 45 53 28 27 63 63 63   t24 VALUES('ccc
38e0: 27 2c 20 33 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65  ', 3);.} {}.do_e
38f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
3900: 70 72 2d 39 2e 32 35 20 7b 20 53 45 4c 45 43 54  pr-9.25 { SELECT
3910: 20 27 42 42 42 27 20 3d 20 61 20 46 52 4f 4d 20   'BBB' = a FROM 
3920: 74 32 34 20 7d 20 7b 30 20 31 20 30 7d 0a 64 6f  t24 } {0 1 0}.do
3930: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3940: 65 78 70 72 2d 39 2e 32 35 20 7b 20 53 45 4c 45  expr-9.25 { SELE
3950: 43 54 20 61 20 3d 20 27 42 42 42 27 20 46 52 4f  CT a = 'BBB' FRO
3960: 4d 20 74 32 34 20 7d 20 7b 30 20 31 20 30 7d 0a  M t24 } {0 1 0}.
3970: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3980: 65 5f 65 78 70 72 2d 39 2e 32 35 20 7b 20 53 45  e_expr-9.25 { SE
3990: 4c 45 43 54 20 27 42 42 42 27 20 3d 20 61 20 43  LECT 'BBB' = a C
39a0: 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 46 52  OLLATE binary FR
39b0: 4f 4d 20 74 32 34 20 7d 20 7b 30 20 30 20 30 7d  OM t24 } {0 0 0}
39c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
39d0: 20 65 5f 65 78 70 72 2d 39 2e 32 35 20 7b 20 53   e_expr-9.25 { S
39e0: 45 4c 45 43 54 20 61 20 43 4f 4c 4c 41 54 45 20  ELECT a COLLATE 
39f0: 62 69 6e 61 72 79 20 3d 20 27 42 42 42 27 20 46  binary = 'BBB' F
3a00: 52 4f 4d 20 74 32 34 20 7d 20 7b 30 20 30 20 30  ROM t24 } {0 0 0
3a10: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
3a60: 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74 73 20  Test statements 
3a70: 72 65 6c 61 74 65 64 20 74 6f 20 6c 69 74 65 72  related to liter
3a80: 61 6c 20 76 61 6c 75 65 73 2e 0a 23 0a 23 20 45  al values..#.# E
3a90: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
3aa0: 35 33 36 2d 33 32 30 30 38 20 4c 69 74 65 72 61  536-32008 Litera
3ab0: 6c 20 76 61 6c 75 65 73 20 6d 61 79 20 62 65 20  l values may be 
3ac0: 69 6e 74 65 67 65 72 73 2c 20 66 6c 6f 61 74 69  integers, floati
3ad0: 6e 67 0a 23 20 70 6f 69 6e 74 20 6e 75 6d 62 65  ng.# point numbe
3ae0: 72 73 2c 20 73 74 72 69 6e 67 73 2c 20 42 4c 4f  rs, strings, BLO
3af0: 42 73 2c 20 6f 72 20 4e 55 4c 4c 73 2e 0a 23 0a  Bs, or NULLs..#.
3b00: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3b10: 65 5f 65 78 70 72 2d 31 30 2e 31 2e 31 20 7b 20  e_expr-10.1.1 { 
3b20: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 35 29  SELECT typeof(5)
3b30: 20 20 20 20 20 20 20 7d 20 7b 69 6e 74 65 67 65         } {intege
3b40: 72 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  r}.do_execsql_te
3b50: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 31 2e 32  st e_expr-10.1.2
3b60: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3b70: 28 35 2e 31 29 20 20 20 20 20 7d 20 7b 72 65 61  (5.1)     } {rea
3b80: 6c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  l}.do_execsql_te
3b90: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 31 2e 33  st e_expr-10.1.3
3ba0: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3bb0: 28 27 35 2e 31 27 29 20 20 20 7d 20 7b 74 65 78  ('5.1')   } {tex
3bc0: 74 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  t}.do_execsql_te
3bd0: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 31 2e 34  st e_expr-10.1.4
3be0: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3bf0: 28 58 27 41 42 43 44 27 29 20 7d 20 7b 62 6c 6f  (X'ABCD') } {blo
3c00: 62 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  b}.do_execsql_te
3c10: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 31 2e 35  st e_expr-10.1.5
3c20: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3c30: 28 4e 55 4c 4c 29 20 20 20 20 7d 20 7b 6e 75 6c  (NULL)    } {nul
3c40: 6c 7d 0a 0a 23 20 22 53 63 69 65 6e 74 69 66 69  l}..# "Scientifi
3c50: 63 20 6e 6f 74 61 74 69 6f 6e 20 69 73 20 73 75  c notation is su
3c60: 70 70 6f 72 74 65 64 20 66 6f 72 20 70 6f 69 6e  pported for poin
3c70: 74 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73  t literal values
3c80: 2e 22 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  .".#.do_execsql_
3c90: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 32  test e_expr-10.2
3ca0: 2e 31 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65  .1 { SELECT type
3cb0: 6f 66 28 33 2e 34 65 2d 30 32 29 20 20 20 20 7d  of(3.4e-02)    }
3cc0: 20 7b 72 65 61 6c 7d 0a 64 6f 5f 65 78 65 63 73   {real}.do_execs
3cd0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
3ce0: 30 2e 32 2e 32 20 7b 20 53 45 4c 45 43 54 20 74  0.2.2 { SELECT t
3cf0: 79 70 65 6f 66 28 33 65 2b 35 29 20 20 20 20 20  ypeof(3e+5)     
3d00: 20 20 7d 20 7b 72 65 61 6c 7d 0a 64 6f 5f 65 78    } {real}.do_ex
3d10: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3d20: 72 2d 31 30 2e 32 2e 33 20 7b 20 53 45 4c 45 43  r-10.2.3 { SELEC
3d30: 54 20 33 2e 34 65 2d 30 32 20 20 20 20 20 20 20  T 3.4e-02       
3d40: 20 20 20 20 20 7d 20 7b 30 2e 30 33 34 7d 0a 64       } {0.034}.d
3d50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
3d60: 5f 65 78 70 72 2d 31 30 2e 32 2e 34 20 7b 20 53  _expr-10.2.4 { S
3d70: 45 4c 45 43 54 20 33 65 2b 34 20 20 20 20 20 20  ELECT 3e+4      
3d80: 20 20 20 20 20 20 20 20 20 7d 20 7b 33 30 30 30           } {3000
3d90: 30 2e 30 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  0.0}..# EVIDENCE
3da0: 2d 4f 46 3a 20 52 2d 33 35 32 32 39 2d 31 37 38  -OF: R-35229-178
3db0: 33 30 20 41 20 73 74 72 69 6e 67 20 63 6f 6e 73  30 A string cons
3dc0: 74 61 6e 74 20 69 73 20 66 6f 72 6d 65 64 20 62  tant is formed b
3dd0: 79 20 65 6e 63 6c 6f 73 69 6e 67 0a 23 20 74 68  y enclosing.# th
3de0: 65 20 73 74 72 69 6e 67 20 69 6e 20 73 69 6e 67  e string in sing
3df0: 6c 65 20 71 75 6f 74 65 73 20 28 27 29 2e 0a 23  le quotes (')..#
3e00: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
3e10: 52 2d 30 37 31 30 30 2d 30 36 36 30 36 20 41 20  R-07100-06606 A 
3e20: 73 69 6e 67 6c 65 20 71 75 6f 74 65 20 77 69 74  single quote wit
3e30: 68 69 6e 20 74 68 65 20 73 74 72 69 6e 67 20 63  hin the string c
3e40: 61 6e 20 62 65 0a 23 20 65 6e 63 6f 64 65 64 20  an be.# encoded 
3e50: 62 79 20 70 75 74 74 69 6e 67 20 74 77 6f 20 73  by putting two s
3e60: 69 6e 67 6c 65 20 71 75 6f 74 65 73 20 69 6e 20  ingle quotes in 
3e70: 61 20 72 6f 77 20 2d 20 61 73 20 69 6e 20 50 61  a row - as in Pa
3e80: 73 63 61 6c 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  scal..#.do_execs
3e90: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
3ea0: 30 2e 33 2e 31 20 7b 20 53 45 4c 45 43 54 20 27  0.3.1 { SELECT '
3eb0: 69 73 20 6e 6f 74 27 20 7d 20 20 20 20 20 20 20  is not' }       
3ec0: 20 20 7b 7b 69 73 20 6e 6f 74 7d 7d 0a 64 6f 5f    {{is not}}.do_
3ed0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3ee0: 78 70 72 2d 31 30 2e 33 2e 32 20 7b 20 53 45 4c  xpr-10.3.2 { SEL
3ef0: 45 43 54 20 74 79 70 65 6f 66 28 27 69 73 20 6e  ECT typeof('is n
3f00: 6f 74 27 29 20 7d 20 7b 74 65 78 74 7d 0a 64 6f  ot') } {text}.do
3f10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3f20: 65 78 70 72 2d 31 30 2e 33 2e 33 20 7b 20 53 45  expr-10.3.3 { SE
3f30: 4c 45 43 54 20 27 69 73 6e 27 27 74 27 20 7d 20  LECT 'isn''t' } 
3f40: 20 20 20 20 20 20 20 20 7b 69 73 6e 27 74 7d 0a          {isn't}.
3f50: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3f60: 65 5f 65 78 70 72 2d 31 30 2e 33 2e 34 20 7b 20  e_expr-10.3.4 { 
3f70: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 27 69  SELECT typeof('i
3f80: 73 6e 27 27 74 27 29 20 7d 20 7b 74 65 78 74 7d  sn''t') } {text}
3f90: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
3fa0: 20 52 2d 30 39 35 39 33 2d 30 33 33 32 31 20 42   R-09593-03321 B
3fb0: 4c 4f 42 20 6c 69 74 65 72 61 6c 73 20 61 72 65  LOB literals are
3fc0: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   string literals
3fd0: 0a 23 20 63 6f 6e 74 61 69 6e 69 6e 67 20 68 65  .# containing he
3fe0: 78 61 64 65 63 69 6d 61 6c 20 64 61 74 61 20 61  xadecimal data a
3ff0: 6e 64 20 70 72 65 63 65 64 65 64 20 62 79 20 61  nd preceded by a
4000: 20 73 69 6e 67 6c 65 20 22 78 22 20 6f 72 20 22   single "x" or "
4010: 58 22 0a 23 20 63 68 61 72 61 63 74 65 72 2e 0a  X".# character..
4020: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
4030: 20 52 2d 31 39 38 33 36 2d 31 31 32 34 34 20 45   R-19836-11244 E
4040: 78 61 6d 70 6c 65 3a 20 58 27 35 33 35 31 34 43  xample: X'53514C
4050: 36 39 37 34 36 35 27 0a 23 0a 64 6f 5f 65 78 65  697465'.#.do_exe
4060: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
4070: 2d 31 30 2e 34 2e 31 20 7b 20 53 45 4c 45 43 54  -10.4.1 { SELECT
4080: 20 74 79 70 65 6f 66 28 58 27 30 31 32 33 34 35   typeof(X'012345
4090: 36 37 38 39 41 42 43 44 45 46 27 29 20 7d 20 62  6789ABCDEF') } b
40a0: 6c 6f 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  lob.do_execsql_t
40b0: 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e  est e_expr-10.4.
40c0: 32 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f  2 { SELECT typeo
40d0: 66 28 78 27 30 31 32 33 34 35 36 37 38 39 41 42  f(x'0123456789AB
40e0: 43 44 45 46 27 29 20 7d 20 62 6c 6f 62 0a 64 6f  CDEF') } blob.do
40f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
4100: 65 78 70 72 2d 31 30 2e 34 2e 33 20 7b 20 53 45  expr-10.4.3 { SE
4110: 4c 45 43 54 20 74 79 70 65 6f 66 28 58 27 30 31  LECT typeof(X'01
4120: 32 33 34 35 36 37 38 39 61 62 63 64 65 66 27 29  23456789abcdef')
4130: 20 7d 20 62 6c 6f 62 0a 64 6f 5f 65 78 65 63 73   } blob.do_execs
4140: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
4150: 30 2e 34 2e 34 20 7b 20 53 45 4c 45 43 54 20 74  0.4.4 { SELECT t
4160: 79 70 65 6f 66 28 78 27 30 31 32 33 34 35 36 37  ypeof(x'01234567
4170: 38 39 61 62 63 64 65 66 27 29 20 7d 20 62 6c 6f  89abcdef') } blo
4180: 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  b.do_execsql_tes
4190: 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e 35 20  t e_expr-10.4.5 
41a0: 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28  { SELECT typeof(
41b0: 58 27 35 33 35 31 34 43 36 39 37 34 36 35 27 29  X'53514C697465')
41c0: 20 20 20 20 20 7d 20 62 6c 6f 62 0a 0a 23 20 45       } blob..# E
41d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33  VIDENCE-OF: R-23
41e0: 39 31 34 2d 35 31 34 37 36 20 41 20 6c 69 74 65  914-51476 A lite
41f0: 72 61 6c 20 76 61 6c 75 65 20 63 61 6e 20 61 6c  ral value can al
4200: 73 6f 20 62 65 20 74 68 65 20 74 6f 6b 65 6e 0a  so be the token.
4210: 23 20 22 4e 55 4c 4c 22 2e 0a 23 0a 64 6f 5f 65  # "NULL"..#.do_e
4220: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
4230: 70 72 2d 31 30 2e 35 2e 31 20 7b 20 53 45 4c 45  pr-10.5.1 { SELE
4240: 43 54 20 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  CT NULL         
4250: 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  } {{}}.do_execsq
4260: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30  l_test e_expr-10
4270: 2e 35 2e 32 20 7b 20 53 45 4c 45 43 54 20 74 79  .5.2 { SELECT ty
4280: 70 65 6f 66 28 4e 55 4c 4c 29 20 7d 20 7b 6e 75  peof(NULL) } {nu
4290: 6c 6c 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ll}..#----------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
42e0: 23 20 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74  # Test statement
42f0: 73 20 72 65 6c 61 74 65 64 20 74 6f 20 62 6f 75  s related to bou
4300: 6e 64 20 70 61 72 61 6d 65 74 65 72 73 0a 23 0a  nd parameters.#.
4310: 0a 70 72 6f 63 20 70 61 72 61 6d 65 74 65 72 5f  .proc parameter_
4320: 74 65 73 74 20 7b 74 6e 20 73 71 6c 20 70 61 72  test {tn sql par
4330: 61 6d 73 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20  ams result} {.  
4340: 73 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65  set stmt [sqlite
4350: 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20  3_prepare_v2 db 
4360: 24 73 71 6c 20 2d 31 5d 0a 0a 20 20 66 6f 72 65  $sql -1]..  fore
4370: 61 63 68 20 7b 6e 75 6d 62 65 72 20 6e 61 6d 65  ach {number name
4380: 7d 20 24 70 61 72 61 6d 73 20 7b 0a 20 20 20 20  } $params {.    
4390: 73 65 74 20 6e 6d 20 5b 73 71 6c 69 74 65 33 5f  set nm [sqlite3_
43a0: 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
43b0: 61 6d 65 20 24 73 74 6d 74 20 24 6e 75 6d 62 65  ame $stmt $numbe
43c0: 72 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24  r].    do_test $
43d0: 74 6e 2e 6e 61 6d 65 2e 24 6e 75 6d 62 65 72 20  tn.name.$number 
43e0: 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 6e 6d  [list set {} $nm
43f0: 5d 20 24 6e 61 6d 65 0a 20 20 20 20 73 71 6c 69  ] $name.    sqli
4400: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 24 73 74  te3_bind_int $st
4410: 6d 74 20 24 6e 75 6d 62 65 72 20 5b 65 78 70 72  mt $number [expr
4420: 20 2d 31 20 2a 20 24 6e 75 6d 62 65 72 5d 0a 20   -1 * $number]. 
4430: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   }..  sqlite3_st
4440: 65 70 20 24 73 74 6d 74 0a 0a 20 20 73 65 74 20  ep $stmt..  set 
4450: 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72  res [list].  for
4460: 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c   {set i 0} {$i <
4470: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   [sqlite3_column
4480: 5f 63 6f 75 6e 74 20 24 73 74 6d 74 5d 7d 20 7b  _count $stmt]} {
4490: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61  incr i} {.    la
44a0: 70 70 65 6e 64 20 72 65 73 20 5b 73 71 6c 69 74  ppend res [sqlit
44b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24  e3_column_text $
44c0: 73 74 6d 74 20 24 69 5d 0a 20 20 7d 0a 0a 20 20  stmt $i].  }..  
44d0: 73 65 74 20 72 63 20 5b 73 71 6c 69 74 65 33 5f  set rc [sqlite3_
44e0: 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 5d 0a  finalize $stmt].
44f0: 20 20 64 6f 5f 74 65 73 74 20 24 74 6e 2e 72 63    do_test $tn.rc
4500: 20 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72   [list set {} $r
4510: 63 5d 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 64  c] SQLITE_OK.  d
4520: 6f 5f 74 65 73 74 20 24 74 6e 2e 72 65 73 20 5b  o_test $tn.res [
4530: 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72 65 73  list set {} $res
4540: 5d 20 24 72 65 73 75 6c 74 0a 7d 0a 0a 23 20 45  ] $result.}..# E
4550: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33  VIDENCE-OF: R-33
4560: 35 30 39 2d 33 39 34 35 38 20 41 20 71 75 65 73  509-39458 A ques
4570: 74 69 6f 6e 20 6d 61 72 6b 20 66 6f 6c 6c 6f 77  tion mark follow
4580: 65 64 20 62 79 20 61 20 6e 75 6d 62 65 72 20 4e  ed by a number N
4590: 4e 4e 0a 23 20 68 6f 6c 64 73 20 61 20 73 70 6f  NN.# holds a spo
45a0: 74 20 66 6f 72 20 74 68 65 20 4e 4e 4e 2d 74 68  t for the NNN-th
45b0: 20 70 61 72 61 6d 65 74 65 72 2e 20 4e 4e 4e 20   parameter. NNN 
45c0: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
45d0: 31 20 61 6e 64 0a 23 20 53 51 4c 49 54 45 5f 4d  1 and.# SQLITE_M
45e0: 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
45f0: 45 52 2e 0a 23 0a 73 65 74 20 6d 76 6e 20 24 53  ER..#.set mvn $S
4600: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
4610: 4c 45 5f 4e 55 4d 42 45 52 0a 70 61 72 61 6d 65  LE_NUMBER.parame
4620: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4630: 31 31 2e 31 20 22 0a 20 20 53 45 4c 45 43 54 20  11.1 ".  SELECT 
4640: 3f 31 2c 20 3f 31 32 33 2c 20 3f 24 53 51 4c 49  ?1, ?123, ?$SQLI
4650: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
4660: 4e 55 4d 42 45 52 2c 20 3f 31 32 33 2c 20 3f 34  NUMBER, ?123, ?4
4670: 0a 22 20 20 20 22 31 20 3f 31 20 20 31 32 33 20  ."   "1 ?1  123 
4680: 3f 31 32 33 20 24 6d 76 6e 20 3f 24 6d 76 6e 20  ?123 $mvn ?$mvn 
4690: 34 20 3f 34 22 20 20 20 22 2d 31 20 2d 31 32 33  4 ?4"   "-1 -123
46a0: 20 2d 24 6d 76 6e 20 2d 31 32 33 20 2d 34 22 0a   -$mvn -123 -4".
46b0: 0a 73 65 74 20 65 72 72 6d 73 67 20 22 76 61 72  .set errmsg "var
46c0: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73  iable number mus
46d0: 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20  t be between ?1 
46e0: 61 6e 64 20 3f 24 53 51 4c 49 54 45 5f 4d 41 58  and ?$SQLITE_MAX
46f0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
4700: 22 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 70 61  ".foreach {tn pa
4710: 72 61 6d 5f 6e 75 6d 62 65 72 7d 20 5b 6c 69 73  ram_number} [lis
4720: 74 20 5c 0a 20 20 32 20 20 30 20 20 20 20 20 20  t \.  2  0      
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4750: 20 20 33 20 20 5b 65 78 70 72 20 24 53 51 4c 49    3  [expr $SQLI
4760: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
4770: 4e 55 4d 42 45 52 2b 31 5d 20 5c 0a 20 20 34 20  NUMBER+1] \.  4 
4780: 20 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d   [expr $SQLITE_M
4790: 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
47a0: 45 52 2b 32 5d 20 5c 0a 20 20 35 20 20 31 32 33  ER+2] \.  5  123
47b0: 34 35 36 37 38 39 30 33 34 35 36 37 38 39 30 33  4567890345678903
47c0: 34 35 36 37 38 39 30 32 33 34 35 36 37 38 39 30  4567890234567890
47d0: 20 20 5c 0a 20 20 36 20 20 32 31 34 37 34 38 33    \.  6  2147483
47e0: 36 34 38 20 20 20 20 20 20 20 20 20 20 20 20 20  648             
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4800: 20 20 37 20 20 32 31 34 37 34 38 33 36 34 39 20    7  2147483649 
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 38 20            \.  8 
4830: 20 34 32 39 34 39 36 37 32 39 36 20 20 20 20 20   4294967296     
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 20 20 20 20 20 5c 0a 20 20 39 20 20 34 32 39        \.  9  429
4860: 34 39 36 37 32 39 37 20 20 20 20 20 20 20 20 20  4967297         
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 5c 0a 20 20 31 30 20 39 32 32 33 33 37 32    \.  10 9223372
4890: 30 33 36 38 35 34 37 37 35 38 30 38 20 20 20 20  036854775808    
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
48b0: 20 20 31 31 20 39 32 32 33 33 37 32 30 33 36 38    11 92233720368
48c0: 35 34 37 37 35 38 30 39 20 20 20 20 20 20 20 20  54775809        
48d0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 31 32            \.  12
48e0: 20 31 38 34 34 36 37 34 34 30 37 33 37 30 39 35   184467440737095
48f0: 35 31 36 31 36 20 20 20 20 20 20 20 20 20 20 20  51616           
4900: 20 20 20 20 20 20 5c 0a 20 20 31 33 20 31 38 34        \.  13 184
4910: 34 36 37 34 34 30 37 33 37 30 39 35 35 31 36 31  4674407370955161
4920: 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
4930: 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 63 61 74    \.] {.  do_cat
4940: 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  chsql_test e_exp
4950: 72 2d 31 31 2e 31 2e 24 74 6e 20 22 53 45 4c 45  r-11.1.$tn "SELE
4960: 43 54 20 3f 24 70 61 72 61 6d 5f 6e 75 6d 62 65  CT ?$param_numbe
4970: 72 22 20 5b 6c 69 73 74 20 31 20 24 65 72 72 6d  r" [list 1 $errm
4980: 73 67 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  sg].}..# EVIDENC
4990: 45 2d 4f 46 3a 20 52 2d 33 33 36 37 30 2d 33 36  E-OF: R-33670-36
49a0: 30 39 37 20 41 20 71 75 65 73 74 69 6f 6e 20 6d  097 A question m
49b0: 61 72 6b 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ark that is not 
49c0: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 0a 23 20  followed by a.# 
49d0: 6e 75 6d 62 65 72 20 63 72 65 61 74 65 73 20 61  number creates a
49e0: 20 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20   parameter with 
49f0: 61 20 6e 75 6d 62 65 72 20 6f 6e 65 20 67 72 65  a number one gre
4a00: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  ater than the la
4a10: 72 67 65 73 74 0a 23 20 70 61 72 61 6d 65 74 65  rgest.# paramete
4a20: 72 20 6e 75 6d 62 65 72 20 61 6c 72 65 61 64 79  r number already
4a30: 20 61 73 73 69 67 6e 65 64 2e 0a 23 0a 23 20 45   assigned..#.# E
4a40: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32  VIDENCE-OF: R-42
4a50: 39 33 38 2d 30 37 30 33 30 20 49 66 20 74 68 69  938-07030 If thi
4a60: 73 20 6d 65 61 6e 73 20 74 68 65 20 70 61 72 61  s means the para
4a70: 6d 65 74 65 72 20 6e 75 6d 62 65 72 20 69 73 0a  meter number is.
4a80: 23 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  # greater than S
4a90: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
4aa0: 4c 45 5f 4e 55 4d 42 45 52 2c 20 69 74 20 69 73  LE_NUMBER, it is
4ab0: 20 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 70 61 72   an error..#.par
4ac0: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
4ad0: 70 72 2d 31 31 2e 32 2e 31 20 22 53 45 4c 45 43  pr-11.2.1 "SELEC
4ae0: 54 20 3f 22 20 20 20 20 20 20 20 20 20 20 7b 31  T ?"          {1
4af0: 20 7b 7d 7d 20 20 20 20 20 20 20 2d 31 0a 70 61   {}}       -1.pa
4b00: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
4b10: 78 70 72 2d 31 31 2e 32 2e 32 20 22 53 45 4c 45  xpr-11.2.2 "SELE
4b20: 43 54 20 3f 2c 20 3f 22 20 20 20 20 20 20 20 7b  CT ?, ?"       {
4b30: 31 20 7b 7d 20 32 20 7b 7d 7d 20 20 7b 2d 31 20  1 {} 2 {}}  {-1 
4b40: 2d 32 7d 0a 70 61 72 61 6d 65 74 65 72 5f 74 65  -2}.parameter_te
4b50: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 33  st e_expr-11.2.3
4b60: 20 22 53 45 4c 45 43 54 20 3f 35 2c 20 3f 22 20   "SELECT ?5, ?" 
4b70: 20 20 20 20 20 7b 35 20 3f 35 20 36 20 7b 7d 7d       {5 ?5 6 {}}
4b80: 20 20 7b 2d 35 20 2d 36 7d 0a 70 61 72 61 6d 65    {-5 -6}.parame
4b90: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4ba0: 31 31 2e 32 2e 34 20 22 53 45 4c 45 43 54 20 3f  11.2.4 "SELECT ?
4bb0: 2c 20 3f 35 22 20 20 20 20 20 20 7b 31 20 7b 7d  , ?5"      {1 {}
4bc0: 20 35 20 3f 35 7d 20 20 7b 2d 31 20 2d 35 7d 0a   5 ?5}  {-1 -5}.
4bd0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
4be0: 5f 65 78 70 72 2d 31 31 2e 32 2e 35 20 22 53 45  _expr-11.2.5 "SE
4bf0: 4c 45 43 54 20 3f 2c 20 3f 34 35 36 2c 20 3f 22  LECT ?, ?456, ?"
4c00: 20 7b 0a 20 20 31 20 7b 7d 20 34 35 36 20 3f 34   {.  1 {} 456 ?4
4c10: 35 36 20 34 35 37 20 7b 7d 0a 7d 20 20 7b 2d 31  56 457 {}.}  {-1
4c20: 20 2d 34 35 36 20 2d 34 35 37 7d 0a 70 61 72 61   -456 -457}.para
4c30: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
4c40: 72 2d 31 31 2e 32 2e 35 20 22 53 45 4c 45 43 54  r-11.2.5 "SELECT
4c50: 20 3f 2c 20 3f 34 35 36 2c 20 3f 34 2c 20 3f 22   ?, ?456, ?4, ?"
4c60: 20 7b 0a 20 20 31 20 7b 7d 20 34 35 36 20 3f 34   {.  1 {} 456 ?4
4c70: 35 36 20 34 20 3f 34 20 34 35 37 20 7b 7d 0a 7d  56 4 ?4 457 {}.}
4c80: 20 20 7b 2d 31 20 2d 34 35 36 20 2d 34 20 2d 34    {-1 -456 -4 -4
4c90: 35 37 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  57}.foreach {tn 
4ca0: 73 71 6c 7d 20 5b 6c 69 73 74 20 20 20 20 20 20  sql} [list      
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 20 20 20 5c 0a 20 20 31 20 20 22 53 45 4c       \.  1  "SEL
4cd0: 45 43 54 20 3f 24 6d 76 6e 2c 20 3f 22 20 20 20  ECT ?$mvn, ?"   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 20 20 20 20 20 20 20 5c 0a 20 20 32 20 20 22          \.  2  "
4d00: 53 45 4c 45 43 54 20 3f 5b 65 78 70 72 20 24 6d  SELECT ?[expr $m
4d10: 76 6e 2d 35 5d 2c 20 3f 2c 20 3f 2c 20 3f 2c 20  vn-5], ?, ?, ?, 
4d20: 3f 2c 20 3f 2c 20 3f 22 20 20 20 5c 0a 20 20 33  ?, ?, ?"   \.  3
4d30: 20 20 22 53 45 4c 45 43 54 20 3f 5b 65 78 70 72    "SELECT ?[expr
4d40: 20 24 6d 76 6e 5d 2c 20 3f 35 2c 20 3f 36 2c 20   $mvn], ?5, ?6, 
4d50: 3f 22 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  ?"            \.
4d60: 5d 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71  ] {.  do_catchsq
4d70: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  l_test e_expr-11
4d80: 2e 33 2e 24 74 6e 20 24 73 71 6c 20 5b 6c 69 73  .3.$tn $sql [lis
4d90: 74 20 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 53 51  t 1 {too many SQ
4da0: 4c 20 76 61 72 69 61 62 6c 65 73 7d 5d 0a 7d 0a  L variables}].}.
4db0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
4dc0: 52 2d 31 31 36 32 30 2d 32 32 37 34 33 20 41 20  R-11620-22743 A 
4dd0: 63 6f 6c 6f 6e 20 66 6f 6c 6c 6f 77 65 64 20 62  colon followed b
4de0: 79 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20  y an identifier 
4df0: 6e 61 6d 65 0a 23 20 68 6f 6c 64 73 20 61 20 73  name.# holds a s
4e00: 70 6f 74 20 66 6f 72 20 61 20 6e 61 6d 65 64 20  pot for a named 
4e10: 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 74  parameter with t
4e20: 68 65 20 6e 61 6d 65 20 3a 41 41 41 41 2e 0a 23  he name :AAAA..#
4e30: 0a 23 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  .# Identifiers i
4e40: 6e 20 53 51 4c 69 74 65 20 63 6f 6e 73 69 73 74  n SQLite consist
4e50: 20 6f 66 20 61 6c 70 68 61 6e 75 6d 65 72 69 63   of alphanumeric
4e60: 2c 20 27 5f 27 20 61 6e 64 20 27 24 27 20 63 68  , '_' and '$' ch
4e70: 61 72 61 63 74 65 72 73 2c 0a 23 20 61 6e 64 20  aracters,.# and 
4e80: 61 6e 79 20 55 54 46 20 63 68 61 72 61 63 74 65  any UTF characte
4e90: 72 73 20 77 69 74 68 20 63 6f 64 65 70 6f 69 6e  rs with codepoin
4ea0: 74 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 31  ts larger than 1
4eb0: 32 37 20 28 6e 6f 6e 2d 41 53 43 49 49 20 0a 23  27 (non-ASCII .#
4ec0: 20 63 68 61 72 61 63 74 65 72 73 29 2e 0a 23 0a   characters)..#.
4ed0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
4ee0: 5f 65 78 70 72 2d 31 31 2e 32 2e 31 20 7b 53 45  _expr-11.2.1 {SE
4ef0: 4c 45 43 54 20 3a 41 41 41 41 7d 20 20 20 20 20  LECT :AAAA}     
4f00: 20 20 20 20 7b 31 20 3a 41 41 41 41 7d 20 20 20      {1 :AAAA}   
4f10: 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72      -1.parameter
4f20: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
4f30: 32 2e 32 20 7b 53 45 4c 45 43 54 20 3a 31 32 33  2.2 {SELECT :123
4f40: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 3a 31  }          {1 :1
4f50: 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61  23}        -1.pa
4f60: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
4f70: 78 70 72 2d 31 31 2e 32 2e 33 20 7b 53 45 4c 45  xpr-11.2.3 {SELE
4f80: 43 54 20 3a 5f 5f 7d 20 20 20 20 20 20 20 20 20  CT :__}         
4f90: 20 20 7b 31 20 3a 5f 5f 7d 20 20 20 20 20 20 20    {1 :__}       
4fa0: 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74    -1.parameter_t
4fb0: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e  est e_expr-11.2.
4fc0: 34 20 7b 53 45 4c 45 43 54 20 3a 5f 24 5f 7d 20  4 {SELECT :_$_} 
4fd0: 20 20 20 20 20 20 20 20 20 7b 31 20 3a 5f 24 5f           {1 :_$_
4fe0: 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61  }        -1.para
4ff0: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
5000: 72 2d 31 31 2e 32 2e 35 20 22 0a 20 20 53 45 4c  r-11.2.5 ".  SEL
5010: 45 43 54 20 3a 5c 75 30 65 34 30 5c 75 30 65 32  ECT :\u0e40\u0e2
5020: 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75 30  d\u0e28\u0e02\u0
5030: 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64 5c  e39\u0e40\u0e2d\
5040: 75 30 65 32 35 0a 22 20 22 31 20 3a 5c 75 30 65  u0e25." "1 :\u0e
5050: 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75  40\u0e2d\u0e28\u
5060: 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30  0e02\u0e39\u0e40
5070: 5c 75 30 65 32 64 5c 75 30 65 32 35 22 20 2d 31  \u0e2d\u0e25" -1
5080: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5090: 65 5f 65 78 70 72 2d 31 31 2e 32 2e 36 20 22 53  e_expr-11.2.6 "S
50a0: 45 4c 45 43 54 20 3a 5c 75 30 30 38 30 22 20 22  ELECT :\u0080" "
50b0: 31 20 3a 5c 75 30 30 38 30 22 20 2d 31 0a 0a 23  1 :\u0080" -1..#
50c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
50d0: 34 39 37 38 33 2d 36 31 32 37 39 20 41 6e 20 22  49783-61279 An "
50e0: 61 74 22 20 73 69 67 6e 20 77 6f 72 6b 73 20 65  at" sign works e
50f0: 78 61 63 74 6c 79 20 6c 69 6b 65 20 61 20 63 6f  xactly like a co
5100: 6c 6f 6e 2c 0a 23 20 65 78 63 65 70 74 20 74 68  lon,.# except th
5110: 61 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  at the name of t
5120: 68 65 20 70 61 72 61 6d 65 74 65 72 20 63 72 65  he parameter cre
5130: 61 74 65 64 20 69 73 20 40 41 41 41 41 2e 0a 23  ated is @AAAA..#
5140: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5150: 65 5f 65 78 70 72 2d 31 31 2e 33 2e 31 20 7b 53  e_expr-11.3.1 {S
5160: 45 4c 45 43 54 20 40 41 41 41 41 7d 20 20 20 20  ELECT @AAAA}    
5170: 20 20 20 20 20 7b 31 20 40 41 41 41 41 7d 20 20       {1 @AAAA}  
5180: 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65       -1.paramete
5190: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
51a0: 2e 33 2e 32 20 7b 53 45 4c 45 43 54 20 40 31 32  .3.2 {SELECT @12
51b0: 33 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 40  3}          {1 @
51c0: 31 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70  123}        -1.p
51d0: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
51e0: 65 78 70 72 2d 31 31 2e 33 2e 33 20 7b 53 45 4c  expr-11.3.3 {SEL
51f0: 45 43 54 20 40 5f 5f 7d 20 20 20 20 20 20 20 20  ECT @__}        
5200: 20 20 20 7b 31 20 40 5f 5f 7d 20 20 20 20 20 20     {1 @__}      
5210: 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f     -1.parameter_
5220: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 33  test e_expr-11.3
5230: 2e 34 20 7b 53 45 4c 45 43 54 20 40 5f 24 5f 7d  .4 {SELECT @_$_}
5240: 20 20 20 20 20 20 20 20 20 20 7b 31 20 40 5f 24            {1 @_$
5250: 5f 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72  _}        -1.par
5260: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
5270: 70 72 2d 31 31 2e 33 2e 35 20 22 0a 20 20 53 45  pr-11.3.5 ".  SE
5280: 4c 45 43 54 20 40 5c 75 30 65 34 30 5c 75 30 65  LECT @\u0e40\u0e
5290: 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75  2d\u0e28\u0e02\u
52a0: 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64  0e39\u0e40\u0e2d
52b0: 5c 75 30 65 32 35 0a 22 20 22 31 20 40 5c 75 30  \u0e25." "1 @\u0
52c0: 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c  e40\u0e2d\u0e28\
52d0: 75 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34  u0e02\u0e39\u0e4
52e0: 30 5c 75 30 65 32 64 5c 75 30 65 32 35 22 20 2d  0\u0e2d\u0e25" -
52f0: 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  1.parameter_test
5300: 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e 36 20 22   e_expr-11.3.6 "
5310: 53 45 4c 45 43 54 20 40 5c 75 30 30 38 30 22 20  SELECT @\u0080" 
5320: 22 31 20 40 5c 75 30 30 38 30 22 20 2d 31 0a 0a  "1 @\u0080" -1..
5330: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
5340: 2d 36 32 36 31 30 2d 35 31 33 32 39 20 41 20 64  -62610-51329 A d
5350: 6f 6c 6c 61 72 2d 73 69 67 6e 20 66 6f 6c 6c 6f  ollar-sign follo
5360: 77 65 64 20 62 79 20 61 6e 20 69 64 65 6e 74 69  wed by an identi
5370: 66 69 65 72 0a 23 20 6e 61 6d 65 20 61 6c 73 6f  fier.# name also
5380: 20 68 6f 6c 64 73 20 61 20 73 70 6f 74 20 66 6f   holds a spot fo
5390: 72 20 61 20 6e 61 6d 65 64 20 70 61 72 61 6d 65  r a named parame
53a0: 74 65 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ter with the nam
53b0: 65 20 24 41 41 41 41 2e 0a 23 0a 23 20 45 56 49  e $AAAA..#.# EVI
53c0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 30 32  DENCE-OF: R-5502
53d0: 35 2d 32 31 30 34 32 20 54 68 65 20 69 64 65 6e  5-21042 The iden
53e0: 74 69 66 69 65 72 20 6e 61 6d 65 20 69 6e 20 74  tifier name in t
53f0: 68 69 73 20 63 61 73 65 20 63 61 6e 0a 23 20 69  his case can.# i
5400: 6e 63 6c 75 64 65 20 6f 6e 65 20 6f 72 20 6d 6f  nclude one or mo
5410: 72 65 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f  re occurrences o
5420: 66 20 22 3a 3a 22 20 61 6e 64 20 61 20 73 75 66  f "::" and a suf
5430: 66 69 78 20 65 6e 63 6c 6f 73 65 64 20 69 6e 0a  fix enclosed in.
5440: 23 20 22 28 2e 2e 2e 29 22 20 63 6f 6e 74 61 69  # "(...)" contai
5450: 6e 69 6e 67 20 61 6e 79 20 74 65 78 74 20 61 74  ning any text at
5460: 20 61 6c 6c 2e 0a 23 0a 23 20 4e 6f 74 65 3a 20   all..#.# Note: 
5470: 4c 6f 6f 6b 73 20 6c 69 6b 65 20 61 6e 20 69 64  Looks like an id
5480: 65 6e 74 69 66 69 65 72 20 63 61 6e 6e 6f 74 20  entifier cannot 
5490: 63 6f 6e 73 69 73 74 20 65 6e 74 69 72 65 6c 79  consist entirely
54a0: 20 6f 66 20 22 3a 3a 22 20 0a 23 20 63 68 61 72   of "::" .# char
54b0: 61 63 74 65 72 73 20 6f 72 20 6a 75 73 74 20 61  acters or just a
54c0: 20 73 75 66 66 69 78 2e 20 41 6c 73 6f 2c 20 74   suffix. Also, t
54d0: 68 65 20 6f 74 68 65 72 20 6e 61 6d 65 64 20 76  he other named v
54e0: 61 72 69 61 62 6c 65 20 63 68 61 72 61 63 74 65  ariable characte
54f0: 72 73 0a 23 20 28 3a 20 61 6e 64 20 40 29 20 77  rs.# (: and @) w
5500: 6f 72 6b 20 74 68 65 20 73 61 6d 65 20 77 61 79  ork the same way
5510: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 20 57 68 79   internally. Why
5520: 20 6e 6f 74 20 6a 75 73 74 20 64 6f 63 75 6d 65   not just docume
5530: 6e 74 20 69 74 20 74 68 61 74 20 77 61 79 3f 0a  nt it that way?.
5540: 23 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  #.parameter_test
5550: 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e 31 20 7b   e_expr-11.4.1 {
5560: 53 45 4c 45 43 54 20 24 41 41 41 41 7d 20 20 20  SELECT $AAAA}   
5570: 20 20 20 20 20 20 7b 31 20 24 41 41 41 41 7d 20        {1 $AAAA} 
5580: 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74        -1.paramet
5590: 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  er_test e_expr-1
55a0: 31 2e 34 2e 32 20 7b 53 45 4c 45 43 54 20 24 31  1.4.2 {SELECT $1
55b0: 32 33 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20  23}          {1 
55c0: 24 31 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a  $123}        -1.
55d0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
55e0: 5f 65 78 70 72 2d 31 31 2e 34 2e 33 20 7b 53 45  _expr-11.4.3 {SE
55f0: 4c 45 43 54 20 24 5f 5f 7d 20 20 20 20 20 20 20  LECT $__}       
5600: 20 20 20 20 7b 31 20 24 5f 5f 7d 20 20 20 20 20      {1 $__}     
5610: 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72      -1.parameter
5620: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5630: 34 2e 34 20 7b 53 45 4c 45 43 54 20 24 5f 24 5f  4.4 {SELECT $_$_
5640: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 24 5f  }          {1 $_
5650: 24 5f 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61  $_}        -1.pa
5660: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
5670: 78 70 72 2d 31 31 2e 34 2e 35 20 22 0a 20 20 53  xpr-11.4.5 ".  S
5680: 45 4c 45 43 54 20 5c 24 5c 75 30 65 34 30 5c 75  ELECT \$\u0e40\u
5690: 30 65 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32  0e2d\u0e28\u0e02
56a0: 5c 75 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65  \u0e39\u0e40\u0e
56b0: 32 64 5c 75 30 65 32 35 0a 22 20 22 31 20 5c 24  2d\u0e25." "1 \$
56c0: 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65  \u0e40\u0e2d\u0e
56d0: 32 38 5c 75 30 65 30 32 5c 75 30 65 33 39 5c 75  28\u0e02\u0e39\u
56e0: 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 35  0e40\u0e2d\u0e25
56f0: 22 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74  " -1.parameter_t
5700: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e  est e_expr-11.4.
5710: 36 20 22 53 45 4c 45 43 54 20 5c 24 5c 75 30 30  6 "SELECT \$\u00
5720: 38 30 22 20 22 31 20 5c 24 5c 75 30 30 38 30 22  80" "1 \$\u0080"
5730: 20 2d 31 0a 0a 70 61 72 61 6d 65 74 65 72 5f 74   -1..parameter_t
5740: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 35 2e  est e_expr-11.5.
5750: 31 20 7b 53 45 4c 45 43 54 20 24 3a 3a 3a 3a 61  1 {SELECT $::::a
5760: 28 2b 2b 2d 2d 2b 2b 29 7d 20 7b 31 20 24 3a 3a  (++--++)} {1 $::
5770: 3a 3a 61 28 2b 2b 2d 2d 2b 2b 29 7d 20 2d 31 0a  ::a(++--++)} -1.
5780: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
5790: 5f 65 78 70 72 2d 31 31 2e 35 2e 32 20 7b 53 45  _expr-11.5.2 {SE
57a0: 4c 45 43 54 20 24 3a 3a 61 28 29 7d 20 7b 31 20  LECT $::a()} {1 
57b0: 24 3a 3a 61 28 29 7d 20 2d 31 0a 70 61 72 61 6d  $::a()} -1.param
57c0: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
57d0: 2d 31 31 2e 35 2e 33 20 7b 53 45 4c 45 43 54 20  -11.5.3 {SELECT 
57e0: 24 3a 3a 31 28 3a 3a 23 24 29 7d 20 7b 31 20 24  $::1(::#$)} {1 $
57f0: 3a 3a 31 28 3a 3a 23 24 29 7d 20 2d 31 0a 20 0a  ::1(::#$)} -1. .
5800: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
5810: 2d 31 31 33 37 30 2d 30 34 35 32 30 20 4e 61 6d  -11370-04520 Nam
5820: 65 64 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ed parameters ar
5830: 65 20 61 6c 73 6f 20 6e 75 6d 62 65 72 65 64 2e  e also numbered.
5840: 20 54 68 65 0a 23 20 6e 75 6d 62 65 72 20 61 73   The.# number as
5850: 73 69 67 6e 65 64 20 69 73 20 6f 6e 65 20 67 72  signed is one gr
5860: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c  eater than the l
5870: 61 72 67 65 73 74 20 70 61 72 61 6d 65 74 65 72  argest parameter
5880: 20 6e 75 6d 62 65 72 0a 23 20 61 6c 72 65 61 64   number.# alread
5890: 79 20 61 73 73 69 67 6e 65 64 2e 0a 23 0a 23 20  y assigned..#.# 
58a0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
58b0: 32 36 32 30 2d 32 32 31 38 34 20 49 66 20 74 68  2620-22184 If th
58c0: 69 73 20 6d 65 61 6e 73 20 74 68 65 20 70 61 72  is means the par
58d0: 61 6d 65 74 65 72 20 77 6f 75 6c 64 20 62 65 0a  ameter would be.
58e0: 23 20 61 73 73 69 67 6e 65 64 20 61 20 6e 75 6d  # assigned a num
58f0: 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
5900: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
5910: 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 69 74 20  ABLE_NUMBER, it 
5920: 69 73 20 61 6e 0a 23 20 65 72 72 6f 72 2e 0a 23  is an.# error..#
5930: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5940: 65 5f 65 78 70 72 2d 31 31 2e 36 2e 31 20 22 53  e_expr-11.6.1 "S
5950: 45 4c 45 43 54 20 3f 2c 20 40 61 62 63 22 20 20  ELECT ?, @abc"  
5960: 20 20 7b 31 20 7b 7d 20 32 20 40 61 62 63 7d 20    {1 {} 2 @abc} 
5970: 7b 2d 31 20 2d 32 7d 0a 70 61 72 61 6d 65 74 65  {-1 -2}.paramete
5980: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
5990: 2e 36 2e 32 20 22 53 45 4c 45 43 54 20 3f 31 32  .6.2 "SELECT ?12
59a0: 33 2c 20 3a 61 31 22 20 20 7b 31 32 33 20 3f 31  3, :a1"  {123 ?1
59b0: 32 33 20 31 32 34 20 3a 61 31 7d 20 7b 2d 31 32  23 124 :a1} {-12
59c0: 33 20 2d 31 32 34 7d 0a 70 61 72 61 6d 65 74 65  3 -124}.paramete
59d0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
59e0: 2e 36 2e 33 20 7b 53 45 4c 45 43 54 20 24 61 2c  .6.3 {SELECT $a,
59f0: 20 3f 38 2c 20 3f 2c 20 24 62 2c 20 3f 32 2c 20   ?8, ?, $b, ?2, 
5a00: 24 63 7d 20 7b 0a 20 20 31 20 24 61 20 38 20 3f  $c} {.  1 $a 8 ?
5a10: 38 20 39 20 7b 7d 20 31 30 20 24 62 20 32 20 3f  8 9 {} 10 $b 2 ?
5a20: 32 20 31 31 20 24 63 0a 7d 20 7b 2d 31 20 2d 38  2 11 $c.} {-1 -8
5a30: 20 2d 39 20 2d 31 30 20 2d 32 20 2d 31 31 7d 0a   -9 -10 -2 -11}.
5a40: 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d  foreach {tn sql}
5a50: 20 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20   [list          
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 5c 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20   \.  1  "SELECT 
5a80: 3f 24 6d 76 6e 2c 20 5c 24 3a 3a 61 22 20 20 20  ?$mvn, \$::a"   
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 20 20 20 20 5c 0a 20 20 32 20 20 22 53 45 4c 45      \.  2  "SELE
5ab0: 43 54 20 3f 24 6d 76 6e 2c 20 3f 34 2c 20 40 61  CT ?$mvn, ?4, @a
5ac0: 31 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1"              
5ad0: 20 20 20 20 20 20 20 5c 0a 20 20 33 20 20 22 53         \.  3  "S
5ae0: 45 4c 45 43 54 20 3f 5b 65 78 70 72 20 24 6d 76  ELECT ?[expr $mv
5af0: 6e 2d 32 5d 2c 20 3a 62 61 67 2c 20 40 31 32 33  n-2], :bag, @123
5b00: 2c 20 5c 24 78 22 20 20 20 20 5c 0a 5d 20 7b 0a  , \$x"    \.] {.
5b10: 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65    do_catchsql_te
5b20: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 37 2e 24  st e_expr-11.7.$
5b30: 74 6e 20 24 73 71 6c 20 5b 6c 69 73 74 20 31 20  tn $sql [list 1 
5b40: 7b 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61  {too many SQL va
5b50: 72 69 61 62 6c 65 73 7d 5d 0a 7d 0a 0a 23 20 45  riables}].}..# E
5b60: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
5b70: 30 36 38 2d 34 39 36 37 31 20 50 61 72 61 6d 65  068-49671 Parame
5b80: 74 65 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  ters that are no
5b90: 74 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65  t assigned value
5ba0: 73 0a 23 20 75 73 69 6e 67 20 73 71 6c 69 74 65  s.# using sqlite
5bb0: 33 5f 62 69 6e 64 28 29 20 61 72 65 20 74 72 65  3_bind() are tre
5bc0: 61 74 65 64 20 61 73 20 4e 55 4c 4c 2e 0a 23 0a  ated as NULL..#.
5bd0: 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  do_test e_expr-1
5be0: 31 2e 37 2e 31 20 7b 0a 20 20 73 65 74 20 73 74  1.7.1 {.  set st
5bf0: 6d 74 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70  mt [sqlite3_prep
5c00: 61 72 65 5f 76 32 20 64 62 20 7b 20 53 45 4c 45  are_v2 db { SELE
5c10: 43 54 20 3f 2c 20 3a 61 2c 20 40 62 2c 20 24 64  CT ?, :a, @b, $d
5c20: 20 7d 20 2d 31 5d 0a 20 20 73 71 6c 69 74 65 33   } -1].  sqlite3
5c30: 5f 73 74 65 70 20 24 73 74 6d 74 0a 0a 20 20 6c  _step $stmt..  l
5c40: 69 73 74 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c  ist [sqlite3_col
5c50: 75 6d 6e 5f 74 79 70 65 20 24 73 74 6d 74 20 30  umn_type $stmt 0
5c60: 5d 20 5c 0a 20 20 20 20 20 20 20 5b 73 71 6c 69  ] \.       [sqli
5c70: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20  te3_column_type 
5c80: 24 73 74 6d 74 20 31 5d 20 5c 0a 20 20 20 20 20  $stmt 1] \.     
5c90: 20 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d    [sqlite3_colum
5ca0: 6e 5f 74 79 70 65 20 24 73 74 6d 74 20 32 5d 20  n_type $stmt 2] 
5cb0: 5c 0a 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65  \.       [sqlite
5cc0: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24 73  3_column_type $s
5cd0: 74 6d 74 20 33 5d 20 0a 7d 20 7b 4e 55 4c 4c 20  tmt 3] .} {NULL 
5ce0: 4e 55 4c 4c 20 4e 55 4c 4c 20 4e 55 4c 4c 7d 0a  NULL NULL NULL}.
5cf0: 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  do_test e_expr-1
5d00: 31 2e 37 2e 31 20 7b 20 73 71 6c 69 74 65 33 5f  1.7.1 { sqlite3_
5d10: 66 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 20 7d  finalize $stmt }
5d20: 20 53 51 4c 49 54 45 5f 4f 4b 0a 0a 23 2d 2d 2d   SQLITE_OK..#---
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d70: 2d 2d 2d 2d 2d 2d 0a 23 20 22 54 65 73 74 22 20  ------.# "Test" 
5d80: 74 68 65 20 73 79 6e 74 61 78 20 64 69 61 67 72  the syntax diagr
5d90: 61 6d 73 20 69 6e 20 6c 61 6e 67 5f 65 78 70 72  ams in lang_expr
5da0: 2e 68 74 6d 6c 2e 0a 23 0a 23 20 2d 2d 20 73 79  .html..#.# -- sy
5db0: 6e 74 61 78 20 64 69 61 67 72 61 6d 20 73 69 67  ntax diagram sig
5dc0: 6e 65 64 2d 6e 75 6d 62 65 72 0a 23 0a 64 6f 5f  ned-number.#.do_
5dd0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
5de0: 78 70 72 2d 31 32 2e 31 2e 31 20 7b 20 53 45 4c  xpr-12.1.1 { SEL
5df0: 45 43 54 20 30 2c 20 2b 30 2c 20 2d 30 20 7d 20  ECT 0, +0, -0 } 
5e00: 7b 30 20 30 20 30 7d 0a 64 6f 5f 65 78 65 63 73  {0 0 0}.do_execs
5e10: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
5e20: 32 2e 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 31  2.1.2 { SELECT 1
5e30: 2c 20 2b 31 2c 20 2d 31 20 7d 20 7b 31 20 31 20  , +1, -1 } {1 1 
5e40: 2d 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  -1}.do_execsql_t
5e50: 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 31 2e  est e_expr-12.1.
5e60: 33 20 7b 20 53 45 4c 45 43 54 20 32 2c 20 2b 32  3 { SELECT 2, +2
5e70: 2c 20 2d 32 20 7d 20 7b 32 20 32 20 2d 32 7d 0a  , -2 } {2 2 -2}.
5e80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5e90: 65 5f 65 78 70 72 2d 31 32 2e 31 2e 34 20 7b 20  e_expr-12.1.4 { 
5ea0: 0a 20 20 53 45 4c 45 43 54 20 31 2e 34 2c 20 2b  .  SELECT 1.4, +
5eb0: 31 2e 34 2c 20 2d 31 2e 34 20 0a 7d 20 7b 31 2e  1.4, -1.4 .} {1.
5ec0: 34 20 31 2e 34 20 2d 31 2e 34 7d 0a 64 6f 5f 65  4 1.4 -1.4}.do_e
5ed0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
5ee0: 70 72 2d 31 32 2e 31 2e 35 20 7b 20 0a 20 20 53  pr-12.1.5 { .  S
5ef0: 45 4c 45 43 54 20 31 2e 35 65 2b 35 2c 20 2b 31  ELECT 1.5e+5, +1
5f00: 2e 35 65 2b 35 2c 20 2d 31 2e 35 65 2b 35 20 0a  .5e+5, -1.5e+5 .
5f10: 7d 20 7b 31 35 30 30 30 30 2e 30 20 31 35 30 30  } {150000.0 1500
5f20: 30 30 2e 30 20 2d 31 35 30 30 30 30 2e 30 7d 0a  00.0 -150000.0}.
5f30: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5f40: 65 5f 65 78 70 72 2d 31 32 2e 31 2e 36 20 7b 20  e_expr-12.1.6 { 
5f50: 0a 20 20 53 45 4c 45 43 54 20 30 2e 30 30 30 31  .  SELECT 0.0001
5f60: 2c 20 2b 30 2e 30 30 30 31 2c 20 2d 30 2e 30 30  , +0.0001, -0.00
5f70: 30 31 20 0a 7d 20 7b 30 2e 30 30 30 31 20 30 2e  01 .} {0.0001 0.
5f80: 30 30 30 31 20 2d 30 2e 30 30 30 31 7d 0a 0a 23  0001 -0.0001}..#
5f90: 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72   -- syntax diagr
5fa0: 61 6d 20 6c 69 74 65 72 61 6c 2d 76 61 6c 75 65  am literal-value
5fb0: 0a 23 0a 73 65 74 20 73 71 6c 69 74 65 5f 63 75  .#.set sqlite_cu
5fc0: 72 72 65 6e 74 5f 74 69 6d 65 20 31 0a 64 6f 5f  rrent_time 1.do_
5fd0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
5fe0: 78 70 72 2d 31 32 2e 32 2e 31 20 7b 53 45 4c 45  xpr-12.2.1 {SELE
5ff0: 43 54 20 31 32 33 7d 20 20 20 20 20 20 20 20 20  CT 123}         
6000: 20 20 20 20 20 20 7b 31 32 33 7d 0a 64 6f 5f 65        {123}.do_e
6010: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
6020: 70 72 2d 31 32 2e 32 2e 32 20 7b 53 45 4c 45 43  pr-12.2.2 {SELEC
6030: 54 20 31 32 33 2e 34 65 30 35 7d 20 20 20 20 20  T 123.4e05}     
6040: 20 20 20 20 20 7b 31 32 33 34 30 30 30 30 2e 30       {12340000.0
6050: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
6060: 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 33 20  t e_expr-12.2.3 
6070: 7b 53 45 4c 45 43 54 20 27 61 62 63 64 65 27 7d  {SELECT 'abcde'}
6080: 20 20 20 20 20 20 20 20 20 20 20 7b 61 62 63 64             {abcd
6090: 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e}.do_execsql_te
60a0: 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 34  st e_expr-12.2.4
60b0: 20 7b 53 45 4c 45 43 54 20 58 27 34 31 34 32 34   {SELECT X'41424
60c0: 33 27 7d 20 20 20 20 20 20 20 20 20 7b 41 42 43  3'}         {ABC
60d0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
60e0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 35 20  t e_expr-12.2.5 
60f0: 7b 53 45 4c 45 43 54 20 4e 55 4c 4c 7d 20 20 20  {SELECT NULL}   
6100: 20 20 20 20 20 20 20 20 20 20 20 7b 7b 7d 7d 0a             {{}}.
6110: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6120: 65 5f 65 78 70 72 2d 31 32 2e 32 2e 36 20 7b 53  e_expr-12.2.6 {S
6130: 45 4c 45 43 54 20 43 55 52 52 45 4e 54 5f 54 49  ELECT CURRENT_TI
6140: 4d 45 7d 20 20 20 20 20 20 7b 30 30 3a 30 30 3a  ME}      {00:00:
6150: 30 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  01}.do_execsql_t
6160: 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e  est e_expr-12.2.
6170: 37 20 7b 53 45 4c 45 43 54 20 43 55 52 52 45 4e  7 {SELECT CURREN
6180: 54 5f 44 41 54 45 7d 20 20 20 20 20 20 7b 31 39  T_DATE}      {19
6190: 37 30 2d 30 31 2d 30 31 7d 0a 64 6f 5f 65 78 65  70-01-01}.do_exe
61a0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
61b0: 2d 31 32 2e 32 2e 38 20 7b 53 45 4c 45 43 54 20  -12.2.8 {SELECT 
61c0: 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d  CURRENT_TIMESTAM
61d0: 50 7d 20 7b 7b 31 39 37 30 2d 30 31 2d 30 31 20  P} {{1970-01-01 
61e0: 30 30 3a 30 30 3a 30 31 7d 7d 0a 73 65 74 20 73  00:00:01}}.set s
61f0: 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69  qlite_current_ti
6200: 6d 65 20 30 0a 0a 23 20 2d 2d 20 73 79 6e 74 61  me 0..# -- synta
6210: 78 20 64 69 61 67 72 61 6d 20 65 78 70 72 0a 23  x diagram expr.#
6220: 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
6230: 74 2e 64 62 32 0a 65 78 65 63 73 71 6c 20 7b 0a  t.db2.execsql {.
6240: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 2e 64    ATTACH 'test.d
6250: 62 32 27 20 41 53 20 64 62 6e 61 6d 65 3b 0a 20  b2' AS dbname;. 
6260: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 62   CREATE TABLE db
6270: 6e 61 6d 65 2e 74 62 6c 6e 61 6d 65 28 63 6e 61  name.tblname(cna
6280: 6d 65 29 3b 0a 7d 0a 0a 70 72 6f 63 20 67 6c 6f  me);.}..proc glo
6290: 62 20 7b 61 72 67 73 7d 20 7b 72 65 74 75 72 6e  b {args} {return
62a0: 20 31 7d 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20   1}.db function 
62b0: 67 6c 6f 62 20 67 6c 6f 62 0a 64 62 20 66 75 6e  glob glob.db fun
62c0: 63 74 69 6f 6e 20 6d 61 74 63 68 20 67 6c 6f 62  ction match glob
62d0: 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20 72 65 67  .db function reg
62e0: 65 78 70 20 67 6c 6f 62 0a 0a 66 6f 72 65 61 63  exp glob..foreac
62f0: 68 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20  h {tn expr} {.  
6300: 31 20 31 32 33 0a 20 20 32 20 31 32 33 2e 34 65  1 123.  2 123.4e
6310: 30 35 0a 20 20 33 20 27 61 62 63 64 65 27 0a 20  05.  3 'abcde'. 
6320: 20 34 20 58 27 34 31 34 32 34 33 27 0a 20 20 35   4 X'414243'.  5
6330: 20 4e 55 4c 4c 0a 20 20 36 20 43 55 52 52 45 4e   NULL.  6 CURREN
6340: 54 5f 54 49 4d 45 0a 20 20 37 20 43 55 52 52 45  T_TIME.  7 CURRE
6350: 4e 54 5f 44 41 54 45 0a 20 20 38 20 43 55 52 52  NT_DATE.  8 CURR
6360: 45 4e 54 5f 54 49 4d 45 53 54 41 4d 50 0a 0a 20  ENT_TIMESTAMP.. 
6370: 20 39 20 3f 0a 20 31 30 20 3f 31 32 33 0a 20 31   9 ?. 10 ?123. 1
6380: 31 20 40 68 65 6c 6c 6f 0a 20 31 32 20 3a 77 6f  1 @hello. 12 :wo
6390: 72 6c 64 0a 20 31 33 20 24 74 63 6c 0a 20 31 34  rld. 13 $tcl. 14
63a0: 20 24 74 63 6c 28 61 72 72 61 79 29 0a 20 20 0a   $tcl(array).  .
63b0: 20 20 31 35 20 63 6e 61 6d 65 0a 20 20 31 36 20    15 cname.  16 
63c0: 74 62 6c 6e 61 6d 65 2e 63 6e 61 6d 65 0a 20 20  tblname.cname.  
63d0: 31 37 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61 6d  17 dbname.tblnam
63e0: 65 2e 63 6e 61 6d 65 0a 0a 20 20 31 38 20 22 2b  e.cname..  18 "+
63f0: 20 45 58 50 52 22 0a 20 20 31 39 20 22 2d 20 45   EXPR".  19 "- E
6400: 58 50 52 22 0a 20 20 32 30 20 22 4e 4f 54 20 45  XPR".  20 "NOT E
6410: 58 50 52 22 0a 20 20 32 31 20 22 7e 20 45 58 50  XPR".  21 "~ EXP
6420: 52 22 0a 0a 20 20 32 32 20 22 45 58 50 52 31 20  R"..  22 "EXPR1 
6430: 7c 7c 20 45 58 50 52 32 22 0a 20 20 32 33 20 22  || EXPR2".  23 "
6440: 45 58 50 52 31 20 2a 20 45 58 50 52 32 22 0a 20  EXPR1 * EXPR2". 
6450: 20 32 34 20 22 45 58 50 52 31 20 2f 20 45 58 50   24 "EXPR1 / EXP
6460: 52 32 22 0a 20 20 32 35 20 22 45 58 50 52 31 20  R2".  25 "EXPR1 
6470: 25 20 45 58 50 52 32 22 0a 20 20 32 36 20 22 45  % EXPR2".  26 "E
6480: 58 50 52 31 20 2b 20 45 58 50 52 32 22 0a 20 20  XPR1 + EXPR2".  
6490: 32 37 20 22 45 58 50 52 31 20 2d 20 45 58 50 52  27 "EXPR1 - EXPR
64a0: 32 22 0a 20 20 32 38 20 22 45 58 50 52 31 20 3c  2".  28 "EXPR1 <
64b0: 3c 20 45 58 50 52 32 22 0a 20 20 32 39 20 22 45  < EXPR2".  29 "E
64c0: 58 50 52 31 20 3e 3e 20 45 58 50 52 32 22 0a 20  XPR1 >> EXPR2". 
64d0: 20 33 30 20 22 45 58 50 52 31 20 26 20 45 58 50   30 "EXPR1 & EXP
64e0: 52 32 22 0a 20 20 33 31 20 22 45 58 50 52 31 20  R2".  31 "EXPR1 
64f0: 7c 20 45 58 50 52 32 22 0a 20 20 33 32 20 22 45  | EXPR2".  32 "E
6500: 58 50 52 31 20 3c 20 45 58 50 52 32 22 0a 20 20  XPR1 < EXPR2".  
6510: 33 33 20 22 45 58 50 52 31 20 3c 3d 20 45 58 50  33 "EXPR1 <= EXP
6520: 52 32 22 0a 20 20 33 34 20 22 45 58 50 52 31 20  R2".  34 "EXPR1 
6530: 3e 20 45 58 50 52 32 22 0a 20 20 33 35 20 22 45  > EXPR2".  35 "E
6540: 58 50 52 31 20 3e 3d 20 45 58 50 52 32 22 0a 20  XPR1 >= EXPR2". 
6550: 20 33 36 20 22 45 58 50 52 31 20 3d 20 45 58 50   36 "EXPR1 = EXP
6560: 52 32 22 0a 20 20 33 37 20 22 45 58 50 52 31 20  R2".  37 "EXPR1 
6570: 3d 3d 20 45 58 50 52 32 22 0a 20 20 33 38 20 22  == EXPR2".  38 "
6580: 45 58 50 52 31 20 21 3d 20 45 58 50 52 32 22 0a  EXPR1 != EXPR2".
6590: 20 20 33 39 20 22 45 58 50 52 31 20 3c 3e 20 45    39 "EXPR1 <> E
65a0: 58 50 52 32 22 0a 20 20 34 30 20 22 45 58 50 52  XPR2".  40 "EXPR
65b0: 31 20 49 53 20 45 58 50 52 32 22 0a 20 20 34 31  1 IS EXPR2".  41
65c0: 20 22 45 58 50 52 31 20 49 53 20 4e 4f 54 20 45   "EXPR1 IS NOT E
65d0: 58 50 52 32 22 0a 20 20 34 32 20 22 45 58 50 52  XPR2".  42 "EXPR
65e0: 31 20 41 4e 44 20 45 58 50 52 32 22 0a 20 20 34  1 AND EXPR2".  4
65f0: 33 20 22 45 58 50 52 31 20 4f 52 20 45 58 50 52  3 "EXPR1 OR EXPR
6600: 32 22 0a 20 0a 20 20 34 34 20 22 63 6f 75 6e 74  2". .  44 "count
6610: 28 2a 29 22 0a 20 20 34 35 20 22 63 6f 75 6e 74  (*)".  45 "count
6620: 28 44 49 53 54 49 4e 43 54 20 45 58 50 52 29 22  (DISTINCT EXPR)"
6630: 0a 20 20 34 36 20 22 73 75 62 73 74 72 28 45 58  .  46 "substr(EX
6640: 50 52 2c 20 31 30 2c 20 32 30 29 22 0a 20 20 34  PR, 10, 20)".  4
6650: 37 20 22 63 68 61 6e 67 65 73 28 29 22 0a 20 0a  7 "changes()". .
6660: 20 20 34 38 20 22 28 20 45 58 50 52 20 29 22 0a    48 "( EXPR )".
6670: 20 0a 20 20 34 39 20 22 43 41 53 54 20 28 20 45   .  49 "CAST ( E
6680: 58 50 52 20 41 53 20 69 6e 74 65 67 65 72 20 29  XPR AS integer )
6690: 22 0a 20 20 35 30 20 22 43 41 53 54 20 28 20 45  ".  50 "CAST ( E
66a0: 58 50 52 20 41 53 20 27 61 62 63 64 27 20 29 22  XPR AS 'abcd' )"
66b0: 0a 20 20 35 31 20 22 43 41 53 54 20 28 20 45 58  .  51 "CAST ( EX
66c0: 50 52 20 41 53 20 27 61 62 24 20 24 63 64 27 20  PR AS 'ab$ $cd' 
66d0: 29 22 0a 20 0a 20 20 35 32 20 22 45 58 50 52 20  )". .  52 "EXPR 
66e0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22 0a  COLLATE nocase".
66f0: 20 20 35 33 20 22 45 58 50 52 20 43 4f 4c 4c 41    53 "EXPR COLLA
6700: 54 45 20 62 69 6e 61 72 79 22 0a 20 0a 20 20 35  TE binary". .  5
6710: 34 20 22 45 58 50 52 31 20 4c 49 4b 45 20 45 58  4 "EXPR1 LIKE EX
6720: 50 52 32 22 0a 20 20 35 35 20 22 45 58 50 52 31  PR2".  55 "EXPR1
6730: 20 4c 49 4b 45 20 45 58 50 52 32 20 45 53 43 41   LIKE EXPR2 ESCA
6740: 50 45 20 45 58 50 52 22 0a 20 20 35 36 20 22 45  PE EXPR".  56 "E
6750: 58 50 52 31 20 47 4c 4f 42 20 45 58 50 52 32 22  XPR1 GLOB EXPR2"
6760: 0a 20 20 35 37 20 22 45 58 50 52 31 20 47 4c 4f  .  57 "EXPR1 GLO
6770: 42 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45  B EXPR2 ESCAPE E
6780: 58 50 52 22 0a 20 20 35 38 20 22 45 58 50 52 31  XPR".  58 "EXPR1
6790: 20 52 45 47 45 58 50 20 45 58 50 52 32 22 0a 20   REGEXP EXPR2". 
67a0: 20 35 39 20 22 45 58 50 52 31 20 52 45 47 45 58   59 "EXPR1 REGEX
67b0: 50 20 45 58 50 52 32 20 45 53 43 41 50 45 20 45  P EXPR2 ESCAPE E
67c0: 58 50 52 22 0a 20 20 36 30 20 22 45 58 50 52 31  XPR".  60 "EXPR1
67d0: 20 4d 41 54 43 48 20 45 58 50 52 32 22 0a 20 20   MATCH EXPR2".  
67e0: 36 31 20 22 45 58 50 52 31 20 4d 41 54 43 48 20  61 "EXPR1 MATCH 
67f0: 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50  EXPR2 ESCAPE EXP
6800: 52 22 0a 20 20 36 32 20 22 45 58 50 52 31 20 4e  R".  62 "EXPR1 N
6810: 4f 54 20 4c 49 4b 45 20 45 58 50 52 32 22 0a 20  OT LIKE EXPR2". 
6820: 20 36 33 20 22 45 58 50 52 31 20 4e 4f 54 20 4c   63 "EXPR1 NOT L
6830: 49 4b 45 20 45 58 50 52 32 20 45 53 43 41 50 45  IKE EXPR2 ESCAPE
6840: 20 45 58 50 52 22 0a 20 20 36 34 20 22 45 58 50   EXPR".  64 "EXP
6850: 52 31 20 4e 4f 54 20 47 4c 4f 42 20 45 58 50 52  R1 NOT GLOB EXPR
6860: 32 22 0a 20 20 36 35 20 22 45 58 50 52 31 20 4e  2".  65 "EXPR1 N
6870: 4f 54 20 47 4c 4f 42 20 45 58 50 52 32 20 45 53  OT GLOB EXPR2 ES
6880: 43 41 50 45 20 45 58 50 52 22 0a 20 20 36 36 20  CAPE EXPR".  66 
6890: 22 45 58 50 52 31 20 4e 4f 54 20 52 45 47 45 58  "EXPR1 NOT REGEX
68a0: 50 20 45 58 50 52 32 22 0a 20 20 36 37 20 22 45  P EXPR2".  67 "E
68b0: 58 50 52 31 20 4e 4f 54 20 52 45 47 45 58 50 20  XPR1 NOT REGEXP 
68c0: 45 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50  EXPR2 ESCAPE EXP
68d0: 52 22 0a 20 20 36 38 20 22 45 58 50 52 31 20 4e  R".  68 "EXPR1 N
68e0: 4f 54 20 4d 41 54 43 48 20 45 58 50 52 32 22 0a  OT MATCH EXPR2".
68f0: 20 20 36 39 20 22 45 58 50 52 31 20 4e 4f 54 20    69 "EXPR1 NOT 
6900: 4d 41 54 43 48 20 45 58 50 52 32 20 45 53 43 41  MATCH EXPR2 ESCA
6910: 50 45 20 45 58 50 52 22 0a 20 0a 20 20 37 30 20  PE EXPR". .  70 
6920: 22 45 58 50 52 20 49 53 4e 55 4c 4c 22 0a 20 20  "EXPR ISNULL".  
6930: 37 31 20 22 45 58 50 52 20 4e 4f 54 4e 55 4c 4c  71 "EXPR NOTNULL
6940: 22 0a 20 20 37 32 20 22 45 58 50 52 20 4e 4f 54  ".  72 "EXPR NOT
6950: 20 4e 55 4c 4c 22 0a 20 0a 20 20 37 33 20 22 45   NULL". .  73 "E
6960: 58 50 52 31 20 49 53 20 45 58 50 52 32 22 0a 20  XPR1 IS EXPR2". 
6970: 20 37 34 20 22 45 58 50 52 31 20 49 53 20 4e 4f   74 "EXPR1 IS NO
6980: 54 20 45 58 50 52 32 22 0a 0a 20 20 37 35 20 22  T EXPR2"..  75 "
6990: 45 58 50 52 20 4e 4f 54 20 42 45 54 57 45 45 4e  EXPR NOT BETWEEN
69a0: 20 45 58 50 52 31 20 41 4e 44 20 45 58 50 52 32   EXPR1 AND EXPR2
69b0: 22 0a 20 20 37 36 20 22 45 58 50 52 20 42 45 54  ".  76 "EXPR BET
69c0: 57 45 45 4e 20 45 58 50 52 31 20 41 4e 44 20 45  WEEN EXPR1 AND E
69d0: 58 50 52 32 22 0a 0a 20 20 37 37 20 22 45 58 50  XPR2"..  77 "EXP
69e0: 52 20 4e 4f 54 20 49 4e 20 28 53 45 4c 45 43 54  R NOT IN (SELECT
69f0: 20 63 6e 61 6d 65 20 46 52 4f 4d 20 74 62 6c 6e   cname FROM tbln
6a00: 61 6d 65 29 22 0a 20 20 37 38 20 22 45 58 50 52  ame)".  78 "EXPR
6a10: 20 4e 4f 54 20 49 4e 20 28 31 29 22 0a 20 20 37   NOT IN (1)".  7
6a20: 39 20 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 28  9 "EXPR NOT IN (
6a30: 31 2c 20 32 2c 20 33 29 22 0a 20 20 38 30 20 22  1, 2, 3)".  80 "
6a40: 45 58 50 52 20 4e 4f 54 20 49 4e 20 74 62 6c 6e  EXPR NOT IN tbln
6a50: 61 6d 65 22 0a 20 20 38 31 20 22 45 58 50 52 20  ame".  81 "EXPR 
6a60: 4e 4f 54 20 49 4e 20 64 62 6e 61 6d 65 2e 74 62  NOT IN dbname.tb
6a70: 6c 6e 61 6d 65 22 0a 20 20 38 32 20 22 45 58 50  lname".  82 "EXP
6a80: 52 20 49 4e 20 28 53 45 4c 45 43 54 20 63 6e 61  R IN (SELECT cna
6a90: 6d 65 20 46 52 4f 4d 20 74 62 6c 6e 61 6d 65 29  me FROM tblname)
6aa0: 22 0a 20 20 38 33 20 22 45 58 50 52 20 49 4e 20  ".  83 "EXPR IN 
6ab0: 28 31 29 22 0a 20 20 38 34 20 22 45 58 50 52 20  (1)".  84 "EXPR 
6ac0: 49 4e 20 28 31 2c 20 32 2c 20 33 29 22 0a 20 20  IN (1, 2, 3)".  
6ad0: 38 35 20 22 45 58 50 52 20 49 4e 20 74 62 6c 6e  85 "EXPR IN tbln
6ae0: 61 6d 65 22 0a 20 20 38 36 20 22 45 58 50 52 20  ame".  86 "EXPR 
6af0: 49 4e 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61 6d  IN dbname.tblnam
6b00: 65 22 0a 0a 20 20 38 37 20 22 45 58 49 53 54 53  e"..  87 "EXISTS
6b10: 20 28 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46   (SELECT cname F
6b20: 52 4f 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 20 20  ROM tblname)".  
6b30: 38 38 20 22 4e 4f 54 20 45 58 49 53 54 53 20 28  88 "NOT EXISTS (
6b40: 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46 52 4f  SELECT cname FRO
6b50: 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 0a 20 20 38  M tblname)"..  8
6b60: 39 20 22 43 41 53 45 20 45 58 50 52 20 57 48 45  9 "CASE EXPR WHE
6b70: 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50  N EXPR1 THEN EXP
6b80: 52 32 20 45 4c 53 45 20 45 58 50 52 20 45 4e 44  R2 ELSE EXPR END
6b90: 22 0a 20 20 39 30 20 22 43 41 53 45 20 45 58 50  ".  90 "CASE EXP
6ba0: 52 20 57 48 45 4e 20 45 58 50 52 31 20 54 48 45  R WHEN EXPR1 THE
6bb0: 4e 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20 39  N EXPR2 END".  9
6bc0: 31 20 22 43 41 53 45 20 45 58 50 52 20 57 48 45  1 "CASE EXPR WHE
6bd0: 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58 50  N EXPR1 THEN EXP
6be0: 52 32 20 57 48 45 4e 20 45 58 50 52 20 54 48 45  R2 WHEN EXPR THE
6bf0: 4e 20 45 58 50 52 31 20 45 4c 53 45 20 45 58 50  N EXPR1 ELSE EXP
6c00: 52 32 20 45 4e 44 22 0a 20 20 39 32 20 22 43 41  R2 END".  92 "CA
6c10: 53 45 20 45 58 50 52 20 57 48 45 4e 20 45 58 50  SE EXPR WHEN EXP
6c20: 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 57 48  R1 THEN EXPR2 WH
6c30: 45 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58 50  EN EXPR THEN EXP
6c40: 52 31 20 45 4e 44 22 0a 20 20 39 33 20 22 43 41  R1 END".  93 "CA
6c50: 53 45 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  SE WHEN EXPR1 TH
6c60: 45 4e 20 45 58 50 52 32 20 45 4c 53 45 20 45 58  EN EXPR2 ELSE EX
6c70: 50 52 20 45 4e 44 22 0a 20 20 39 34 20 22 43 41  PR END".  94 "CA
6c80: 53 45 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  SE WHEN EXPR1 TH
6c90: 45 4e 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20  EN EXPR2 END".  
6ca0: 39 35 20 22 43 41 53 45 20 57 48 45 4e 20 45 58  95 "CASE WHEN EX
6cb0: 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 57  PR1 THEN EXPR2 W
6cc0: 48 45 4e 20 45 58 50 52 20 54 48 45 4e 20 45 58  HEN EXPR THEN EX
6cd0: 50 52 31 20 45 4c 53 45 20 45 58 50 52 32 20 45  PR1 ELSE EXPR2 E
6ce0: 4e 44 22 0a 20 20 39 36 20 22 43 41 53 45 20 57  ND".  96 "CASE W
6cf0: 48 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45  HEN EXPR1 THEN E
6d00: 58 50 52 32 20 57 48 45 4e 20 45 58 50 52 20 54  XPR2 WHEN EXPR T
6d10: 48 45 4e 20 45 58 50 52 31 20 45 4e 44 22 0a 7d  HEN EXPR1 END".}
6d20: 20 7b 0a 0a 20 20 23 20 49 66 20 74 68 65 20 65   {..  # If the e
6d30: 78 70 72 65 73 73 69 6f 6e 20 73 74 72 69 6e 67  xpression string
6d40: 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 63 6f   being parsed co
6d50: 6e 74 61 69 6e 73 20 22 45 58 50 52 32 22 2c 20  ntains "EXPR2", 
6d60: 74 68 65 6e 20 72 65 70 6c 61 63 65 0a 20 20 23  then replace.  #
6d70: 20 73 74 72 69 6e 67 20 22 45 58 50 52 31 22 20   string "EXPR1" 
6d80: 61 6e 64 20 22 45 58 50 52 32 22 20 77 69 74 68  and "EXPR2" with
6d90: 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 20 65   arbitrary SQL e
6da0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 49 66 20 69  xpressions. If i
6db0: 74 20 0a 20 20 23 20 63 6f 6e 74 61 69 6e 73 20  t .  # contains 
6dc0: 22 45 58 50 52 22 2c 20 74 68 65 6e 20 72 65 70  "EXPR", then rep
6dd0: 6c 61 63 65 20 45 58 50 52 20 77 69 74 68 20 61  lace EXPR with a
6de0: 6e 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 20  n arbitrary SQL 
6df0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 23 20  expression..  # 
6e00: 0a 20 20 73 65 74 20 65 6c 69 73 74 20 5b 6c 69  .  set elist [li
6e10: 73 74 20 24 65 78 70 72 5d 0a 20 20 69 66 20 7b  st $expr].  if {
6e20: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 45  [string match *E
6e30: 58 50 52 32 2a 20 24 65 78 70 72 5d 7d 20 7b 0a  XPR2* $expr]} {.
6e40: 20 20 20 20 73 65 74 20 65 6c 69 73 74 20 5b 6c      set elist [l
6e50: 69 73 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68  ist].    foreach
6e60: 20 7b 65 31 20 65 32 7d 20 7b 20 63 6e 61 6d 65   {e1 e2} { cname
6e70: 20 22 33 34 2b 32 32 22 20 7d 20 7b 0a 20 20 20   "34+22" } {.   
6e80: 20 20 20 6c 61 70 70 65 6e 64 20 65 6c 69 73 74     lappend elist
6e90: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
6ea0: 73 74 20 45 58 50 52 31 20 24 65 31 20 45 58 50  st EXPR1 $e1 EXP
6eb0: 52 32 20 24 65 32 5d 20 24 65 78 70 72 5d 0a 20  R2 $e2] $expr]. 
6ec0: 20 20 20 7d 0a 20 20 7d 20 0a 20 20 69 66 20 7b     }.  } .  if {
6ed0: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 45  [string match *E
6ee0: 58 50 52 2a 20 24 65 78 70 72 5d 7d 20 7b 0a 20  XPR* $expr]} {. 
6ef0: 20 20 20 73 65 74 20 65 6c 69 73 74 32 20 5b 6c     set elist2 [l
6f00: 69 73 74 5d 0a 20 20 20 20 66 6f 72 65 61 63 68  ist].    foreach
6f10: 20 65 6c 20 24 65 6c 69 73 74 20 7b 0a 20 20 20   el $elist {.   
6f20: 20 20 20 66 6f 72 65 61 63 68 20 65 20 7b 20 63     foreach e { c
6f30: 6e 61 6d 65 20 22 33 34 2b 32 32 22 20 7d 20 7b  name "34+22" } {
6f40: 0a 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64  .        lappend
6f50: 20 65 6c 69 73 74 32 20 5b 73 74 72 69 6e 67 20   elist2 [string 
6f60: 6d 61 70 20 5b 6c 69 73 74 20 45 58 50 52 20 24  map [list EXPR $
6f70: 65 5d 20 24 65 6c 5d 0a 20 20 20 20 20 20 7d 0a  e] $el].      }.
6f80: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 65 6c      }.    set el
6f90: 69 73 74 20 24 65 6c 69 73 74 32 0a 20 20 7d 0a  ist $elist2.  }.
6fa0: 0a 20 20 73 65 74 20 78 20 30 0a 20 20 66 6f 72  .  set x 0.  for
6fb0: 65 61 63 68 20 65 20 24 65 6c 69 73 74 20 7b 0a  each e $elist {.
6fc0: 20 20 20 20 69 6e 63 72 20 78 0a 20 20 20 20 64      incr x.    d
6fd0: 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  o_test e_expr-12
6fe0: 2e 33 2e 24 74 6e 2e 24 78 20 7b 20 0a 20 20 20  .3.$tn.$x { .   
6ff0: 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68     set rc [catch
7000: 20 7b 20 65 78 65 63 73 71 6c 20 22 53 45 4c 45   { execsql "SELE
7010: 43 54 20 24 65 20 46 52 4f 4d 20 74 62 6c 6e 61  CT $e FROM tblna
7020: 6d 65 22 20 7d 20 6d 73 67 5d 0a 20 20 20 20 7d  me" } msg].    }
7030: 20 7b 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 20 2d 2d   {0}.  }.}..# --
7040: 20 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20   syntax diagram 
7050: 72 61 69 73 65 2d 66 75 6e 63 74 69 6f 6e 0a 23  raise-function.#
7060: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 72 61 69  .foreach {tn rai
7070: 73 65 65 78 70 72 7d 20 7b 0a 20 20 31 20 22 52  seexpr} {.  1 "R
7080: 41 49 53 45 28 49 47 4e 4f 52 45 29 22 0a 20 20  AISE(IGNORE)".  
7090: 32 20 22 52 41 49 53 45 28 52 4f 4c 4c 42 41 43  2 "RAISE(ROLLBAC
70a0: 4b 2c 20 27 65 72 72 6f 72 20 6d 65 73 73 61 67  K, 'error messag
70b0: 65 27 29 22 0a 20 20 33 20 22 52 41 49 53 45 28  e')".  3 "RAISE(
70c0: 41 42 4f 52 54 2c 20 27 65 72 72 6f 72 20 6d 65  ABORT, 'error me
70d0: 73 73 61 67 65 27 29 22 0a 20 20 34 20 22 52 41  ssage')".  4 "RA
70e0: 49 53 45 28 46 41 49 4c 2c 20 27 65 72 72 6f 72  ISE(FAIL, 'error
70f0: 20 6d 65 73 73 61 67 65 27 29 22 0a 7d 20 7b 0a   message')".} {.
7100: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
7110: 74 20 65 5f 65 78 70 72 2d 31 32 2e 34 2e 24 74  t e_expr-12.4.$t
7120: 6e 20 22 0a 20 20 20 20 43 52 45 41 54 45 20 54  n ".    CREATE T
7130: 52 49 47 47 45 52 20 64 62 6e 61 6d 65 2e 74 72  RIGGER dbname.tr
7140: 24 74 6e 20 42 45 46 4f 52 45 20 44 45 4c 45 54  $tn BEFORE DELET
7150: 45 20 4f 4e 20 74 62 6c 6e 61 6d 65 20 42 45 47  E ON tblname BEG
7160: 49 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  IN.      SELECT 
7170: 24 72 61 69 73 65 65 78 70 72 20 3b 0a 20 20 20  $raiseexpr ;.   
7180: 20 45 4e 44 3b 0a 20 20 22 20 7b 7d 0a 7d 0a 0a   END;.  " {}.}..
7190: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
71a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
71e0: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73  t the statements
71f0: 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
7200: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
7210: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
7220: 46 3a 20 52 2d 34 30 30 37 39 2d 35 34 35 30 33  F: R-40079-54503
7230: 20 54 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65   The BETWEEN ope
7240: 72 61 74 6f 72 20 69 73 20 6c 6f 67 69 63 61 6c  rator is logical
7250: 6c 79 0a 23 20 65 71 75 69 76 61 6c 65 6e 74 20  ly.# equivalent 
7260: 74 6f 20 61 20 70 61 69 72 20 6f 66 20 63 6f 6d  to a pair of com
7270: 70 61 72 69 73 6f 6e 73 2e 20 22 78 20 42 45 54  parisons. "x BET
7280: 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73  WEEN y AND z" is
7290: 20 65 71 75 69 76 61 6c 65 6e 74 0a 23 20 74 6f   equivalent.# to
72a0: 20 22 78 3e 3d 79 20 41 4e 44 20 78 3c 3d 7a 22   "x>=y AND x<=z"
72b0: 20 65 78 63 65 70 74 20 74 68 61 74 20 77 69 74   except that wit
72c0: 68 20 42 45 54 57 45 45 4e 2c 20 74 68 65 20 78  h BETWEEN, the x
72d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 23   expression is.#
72e0: 20 6f 6e 6c 79 20 65 76 61 6c 75 61 74 65 64 20   only evaluated 
72f0: 6f 6e 63 65 2e 0a 23 0a 64 62 20 66 75 6e 63 20  once..#.db func 
7300: 78 20 78 0a 70 72 6f 63 20 78 20 7b 7d 20 7b 20  x x.proc x {} { 
7310: 69 6e 63 72 20 3a 3a 78 63 6f 75 6e 74 20 3b 20  incr ::xcount ; 
7320: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 24 3a 3a  return [expr $::
7330: 78 5d 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  x] }.foreach {tn
7340: 20 78 20 65 78 70 72 20 72 65 73 20 6e 45 76 61   x expr res nEva
7350: 6c 7d 20 7b 0a 20 20 31 20 20 31 30 20 20 22 78  l} {.  1  10  "x
7360: 28 29 20 3e 3d 20 35 20 41 4e 44 20 78 28 29 20  () >= 5 AND x() 
7370: 3c 3d 20 31 35 22 20 20 31 20 20 32 0a 20 20 32  <= 15"  1  2.  2
7380: 20 20 31 30 20 20 22 78 28 29 20 42 45 54 57 45    10  "x() BETWE
7390: 45 4e 20 35 20 41 4e 44 20 31 35 22 20 20 20 20  EN 5 AND 15"    
73a0: 31 20 20 31 0a 0a 20 20 33 20 20 20 35 20 20 22  1  1..  3   5  "
73b0: 78 28 29 20 3e 3d 20 35 20 41 4e 44 20 78 28 29  x() >= 5 AND x()
73c0: 20 3c 3d 20 35 22 20 20 20 31 20 20 32 0a 20 20   <= 5"   1  2.  
73d0: 34 20 20 20 35 20 20 22 78 28 29 20 42 45 54 57  4   5  "x() BETW
73e0: 45 45 4e 20 35 20 41 4e 44 20 35 22 20 20 20 20  EEN 5 AND 5"    
73f0: 20 31 20 20 31 0a 0a 20 20 35 20 20 20 39 20 20   1  1..  5   9  
7400: 22 28 78 28 29 2c 38 29 20 3e 3d 20 28 39 2c 37  "(x(),8) >= (9,7
7410: 29 20 41 4e 44 20 28 78 28 29 2c 38 29 3c 3d 28  ) AND (x(),8)<=(
7420: 39 2c 31 30 29 22 20 20 31 20 32 0a 20 20 36 20  9,10)"  1 2.  6 
7430: 20 20 39 20 20 22 28 78 28 29 2c 38 29 20 42 45    9  "(x(),8) BE
7440: 54 57 45 45 4e 20 28 39 2c 37 29 20 41 4e 44 20  TWEEN (9,7) AND 
7450: 28 39 2c 31 30 29 22 20 20 20 20 20 20 31 20 31  (9,10)"      1 1
7460: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 65  .} {.  do_test e
7470: 5f 65 78 70 72 2d 31 33 2e 31 2e 24 74 6e 20 7b  _expr-13.1.$tn {
7480: 0a 20 20 20 20 73 65 74 20 3a 3a 78 63 6f 75 6e  .    set ::xcoun
7490: 74 20 30 0a 20 20 20 20 73 65 74 20 61 20 5b 65  t 0.    set a [e
74a0: 78 65 63 73 71 6c 20 22 53 45 4c 45 43 54 20 24  xecsql "SELECT $
74b0: 65 78 70 72 22 5d 0a 20 20 20 20 6c 69 73 74 20  expr"].    list 
74c0: 24 3a 3a 78 63 6f 75 6e 74 20 24 61 0a 20 20 7d  $::xcount $a.  }
74d0: 20 5b 6c 69 73 74 20 24 6e 45 76 61 6c 20 24 72   [list $nEval $r
74e0: 65 73 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  es].}..# EVIDENC
74f0: 45 2d 4f 46 3a 20 52 2d 30 35 31 35 35 2d 33 34  E-OF: R-05155-34
7500: 34 35 34 20 54 68 65 20 70 72 65 63 65 64 65 6e  454 The preceden
7510: 63 65 20 6f 66 20 74 68 65 20 42 45 54 57 45 45  ce of the BETWEE
7520: 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 0a 23 20  N operator is.# 
7530: 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
7540: 70 72 65 63 65 64 65 6e 63 65 20 61 73 20 6f 70  precedence as op
7550: 65 72 61 74 6f 72 73 20 3d 3d 20 61 6e 64 20 21  erators == and !
7560: 3d 20 61 6e 64 20 4c 49 4b 45 20 61 6e 64 20 67  = and LIKE and g
7570: 72 6f 75 70 73 0a 23 20 6c 65 66 74 20 74 6f 20  roups.# left to 
7580: 72 69 67 68 74 2e 0a 23 20 0a 23 20 54 68 65 72  right..# .# Ther
7590: 65 66 6f 72 65 2c 20 42 45 54 57 45 45 4e 20 67  efore, BETWEEN g
75a0: 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74  roups more tight
75b0: 6c 79 20 74 68 61 6e 20 6f 70 65 72 61 74 6f 72  ly than operator
75c0: 20 22 41 4e 44 22 2c 20 62 75 74 20 6c 65 73 73   "AND", but less
75d0: 0a 23 20 73 6f 20 74 68 61 6e 20 22 3c 22 2e 0a  .# so than "<"..
75e0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
75f0: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 20  t e_expr-13.2.1 
7600: 20 7b 20 53 45 4c 45 43 54 20 31 20 3d 3d 20 31   { SELECT 1 == 1
7610: 30 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20  0 BETWEEN 0 AND 
7620: 32 20 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63  2   }  1.do_exec
7630: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
7640: 31 33 2e 32 2e 32 20 20 7b 20 53 45 4c 45 43 54  13.2.2  { SELECT
7650: 20 28 31 20 3d 3d 20 31 30 29 20 42 45 54 57 45   (1 == 10) BETWE
7660: 45 4e 20 30 20 41 4e 44 20 32 20 7d 20 20 31 0a  EN 0 AND 2 }  1.
7670: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7680: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 33 20 20 7b  e_expr-13.2.3  {
7690: 20 53 45 4c 45 43 54 20 31 20 3d 3d 20 28 31 30   SELECT 1 == (10
76a0: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
76b0: 29 20 7d 20 20 30 0a 64 6f 5f 65 78 65 63 73 71  ) }  0.do_execsq
76c0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
76d0: 2e 32 2e 34 20 20 7b 20 53 45 4c 45 43 54 20 20  .2.4  { SELECT  
76e0: 36 20 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20  6 BETWEEN 4 AND 
76f0: 38 20 3d 3d 20 31 20 7d 20 20 20 20 31 0a 64 6f  8 == 1 }    1.do
7700: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7710: 65 78 70 72 2d 31 33 2e 32 2e 35 20 20 7b 20 53  expr-13.2.5  { S
7720: 45 4c 45 43 54 20 28 36 20 42 45 54 57 45 45 4e  ELECT (6 BETWEEN
7730: 20 34 20 41 4e 44 20 38 29 20 3d 3d 20 31 20 7d   4 AND 8) == 1 }
7740: 20 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f     1.do_execsql_
7750: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7760: 2e 36 20 20 7b 20 53 45 4c 45 43 54 20 20 36 20  .6  { SELECT  6 
7770: 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20 28 38  BETWEEN 4 AND (8
7780: 20 3d 3d 20 31 29 20 7d 20 20 30 0a 0a 64 6f 5f   == 1) }  0..do_
7790: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
77a0: 78 70 72 2d 31 33 2e 32 2e 37 20 20 7b 20 53 45  xpr-13.2.7  { SE
77b0: 4c 45 43 54 20 20 35 20 42 45 54 57 45 45 4e 20  LECT  5 BETWEEN 
77c0: 30 20 41 4e 44 20 30 20 20 21 3d 20 31 20 7d 20  0 AND 0  != 1 } 
77d0: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
77e0: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
77f0: 38 20 20 7b 20 53 45 4c 45 43 54 20 28 35 20 42  8  { SELECT (5 B
7800: 45 54 57 45 45 4e 20 30 20 41 4e 44 20 30 29 20  ETWEEN 0 AND 0) 
7810: 21 3d 20 31 20 7d 20 20 20 31 0a 64 6f 5f 65 78  != 1 }   1.do_ex
7820: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7830: 72 2d 31 33 2e 32 2e 39 20 20 7b 20 53 45 4c 45  r-13.2.9  { SELE
7840: 43 54 20 20 35 20 42 45 54 57 45 45 4e 20 30 20  CT  5 BETWEEN 0 
7850: 41 4e 44 20 28 30 20 21 3d 20 31 29 20 7d 20 20  AND (0 != 1) }  
7860: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
7870: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 30  t e_expr-13.2.10
7880: 20 7b 20 53 45 4c 45 43 54 20 20 31 20 21 3d 20   { SELECT  1 != 
7890: 30 20 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44  0  BETWEEN 0 AND
78a0: 20 32 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63   2  }  1.do_exec
78b0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
78c0: 31 33 2e 32 2e 31 31 20 7b 20 53 45 4c 45 43 54  13.2.11 { SELECT
78d0: 20 28 31 20 21 3d 20 30 29 20 42 45 54 57 45 45   (1 != 0) BETWEE
78e0: 4e 20 30 20 41 4e 44 20 32 20 20 7d 20 20 31 0a  N 0 AND 2  }  1.
78f0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7900: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 32 20 7b  e_expr-13.2.12 {
7910: 20 53 45 4c 45 43 54 20 20 31 20 21 3d 20 28 30   SELECT  1 != (0
7920: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
7930: 29 20 7d 20 20 30 0a 0a 64 6f 5f 65 78 65 63 73  ) }  0..do_execs
7940: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7950: 33 2e 32 2e 31 33 20 7b 20 53 45 4c 45 43 54 20  3.2.13 { SELECT 
7960: 31 20 4c 49 4b 45 20 31 30 20 42 45 54 57 45 45  1 LIKE 10 BETWEE
7970: 4e 20 30 20 41 4e 44 20 32 20 20 20 7d 20 20 31  N 0 AND 2   }  1
7980: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7990: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 34 20   e_expr-13.2.14 
79a0: 7b 20 53 45 4c 45 43 54 20 28 31 20 4c 49 4b 45  { SELECT (1 LIKE
79b0: 20 31 30 29 20 42 45 54 57 45 45 4e 20 30 20 41   10) BETWEEN 0 A
79c0: 4e 44 20 32 20 7d 20 20 31 0a 64 6f 5f 65 78 65  ND 2 }  1.do_exe
79d0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
79e0: 2d 31 33 2e 32 2e 31 35 20 7b 20 53 45 4c 45 43  -13.2.15 { SELEC
79f0: 54 20 31 20 4c 49 4b 45 20 28 31 30 20 42 45 54  T 1 LIKE (10 BET
7a00: 57 45 45 4e 20 30 20 41 4e 44 20 32 29 20 7d 20  WEEN 0 AND 2) } 
7a10: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
7a20: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31  st e_expr-13.2.1
7a30: 36 20 7b 20 53 45 4c 45 43 54 20 20 36 20 42 45  6 { SELECT  6 BE
7a40: 54 57 45 45 4e 20 34 20 41 4e 44 20 38 20 4c 49  TWEEN 4 AND 8 LI
7a50: 4b 45 20 31 20 20 20 7d 20 20 31 0a 64 6f 5f 65  KE 1   }  1.do_e
7a60: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7a70: 70 72 2d 31 33 2e 32 2e 31 37 20 7b 20 53 45 4c  pr-13.2.17 { SEL
7a80: 45 43 54 20 28 36 20 42 45 54 57 45 45 4e 20 34  ECT (6 BETWEEN 4
7a90: 20 41 4e 44 20 38 29 20 4c 49 4b 45 20 31 20 20   AND 8) LIKE 1  
7aa0: 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  }  1.do_execsql_
7ab0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7ac0: 2e 31 38 20 7b 20 53 45 4c 45 43 54 20 20 36 20  .18 { SELECT  6 
7ad0: 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20 28 38  BETWEEN 4 AND (8
7ae0: 20 4c 49 4b 45 20 31 29 20 7d 20 20 30 0a 0a 64   LIKE 1) }  0..d
7af0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7b00: 5f 65 78 70 72 2d 31 33 2e 32 2e 31 39 20 7b 20  _expr-13.2.19 { 
7b10: 53 45 4c 45 43 54 20 30 20 41 4e 44 20 30 20 42  SELECT 0 AND 0 B
7b20: 45 54 57 45 45 4e 20 30 20 41 4e 44 20 31 20 20  ETWEEN 0 AND 1  
7b30: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
7b40: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7b50: 2e 32 30 20 7b 20 53 45 4c 45 43 54 20 30 20 41  .20 { SELECT 0 A
7b60: 4e 44 20 28 30 20 42 45 54 57 45 45 4e 20 30 20  ND (0 BETWEEN 0 
7b70: 41 4e 44 20 31 29 20 7d 20 30 0a 64 6f 5f 65 78  AND 1) } 0.do_ex
7b80: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7b90: 72 2d 31 33 2e 32 2e 32 31 20 7b 20 53 45 4c 45  r-13.2.21 { SELE
7ba0: 43 54 20 28 30 20 41 4e 44 20 30 29 20 42 45 54  CT (0 AND 0) BET
7bb0: 57 45 45 4e 20 30 20 41 4e 44 20 31 20 7d 20 31  WEEN 0 AND 1 } 1
7bc0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7bd0: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 32 20   e_expr-13.2.22 
7be0: 7b 20 53 45 4c 45 43 54 20 30 20 42 45 54 57 45  { SELECT 0 BETWE
7bf0: 45 4e 20 2d 31 20 41 4e 44 20 31 20 41 4e 44 20  EN -1 AND 1 AND 
7c00: 30 20 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  0   } 0.do_execs
7c10: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7c20: 33 2e 32 2e 32 33 20 7b 20 53 45 4c 45 43 54 20  3.2.23 { SELECT 
7c30: 28 30 20 42 45 54 57 45 45 4e 20 2d 31 20 41 4e  (0 BETWEEN -1 AN
7c40: 44 20 31 29 20 41 4e 44 20 30 20 7d 20 30 0a 64  D 1) AND 0 } 0.d
7c50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7c60: 5f 65 78 70 72 2d 31 33 2e 32 2e 32 34 20 7b 20  _expr-13.2.24 { 
7c70: 53 45 4c 45 43 54 20 30 20 42 45 54 57 45 45 4e  SELECT 0 BETWEEN
7c80: 20 2d 31 20 41 4e 44 20 28 31 20 41 4e 44 20 30   -1 AND (1 AND 0
7c90: 29 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71  ) } 1..do_execsq
7ca0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7cb0: 2e 32 2e 32 35 20 7b 20 53 45 4c 45 43 54 20 32  .2.25 { SELECT 2
7cc0: 20 3c 20 33 20 42 45 54 57 45 45 4e 20 30 20 41   < 3 BETWEEN 0 A
7cd0: 4e 44 20 31 20 20 20 7d 20 31 0a 64 6f 5f 65 78  ND 1   } 1.do_ex
7ce0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7cf0: 72 2d 31 33 2e 32 2e 32 36 20 7b 20 53 45 4c 45  r-13.2.26 { SELE
7d00: 43 54 20 28 32 20 3c 20 33 29 20 42 45 54 57 45  CT (2 < 3) BETWE
7d10: 45 4e 20 30 20 41 4e 44 20 31 20 7d 20 31 0a 64  EN 0 AND 1 } 1.d
7d20: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7d30: 5f 65 78 70 72 2d 31 33 2e 32 2e 32 37 20 7b 20  _expr-13.2.27 { 
7d40: 53 45 4c 45 43 54 20 32 20 3c 20 28 33 20 42 45  SELECT 2 < (3 BE
7d50: 54 57 45 45 4e 20 30 20 41 4e 44 20 31 29 20 7d  TWEEN 0 AND 1) }
7d60: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
7d70: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32  st e_expr-13.2.2
7d80: 38 20 7b 20 53 45 4c 45 43 54 20 32 20 42 45 54  8 { SELECT 2 BET
7d90: 57 45 45 4e 20 31 20 41 4e 44 20 32 20 3c 20 33  WEEN 1 AND 2 < 3
7da0: 20 20 20 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73      } 0.do_execs
7db0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7dc0: 33 2e 32 2e 32 39 20 7b 20 53 45 4c 45 43 54 20  3.2.29 { SELECT 
7dd0: 32 20 42 45 54 57 45 45 4e 20 31 20 41 4e 44 20  2 BETWEEN 1 AND 
7de0: 28 32 20 3c 20 33 29 20 20 7d 20 30 0a 64 6f 5f  (2 < 3)  } 0.do_
7df0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7e00: 78 70 72 2d 31 33 2e 32 2e 33 30 20 7b 20 53 45  xpr-13.2.30 { SE
7e10: 4c 45 43 54 20 28 32 20 42 45 54 57 45 45 4e 20  LECT (2 BETWEEN 
7e20: 31 20 41 4e 44 20 32 29 20 3c 20 33 20 20 7d 20  1 AND 2) < 3  } 
7e30: 31 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  1..#------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
7e80: 54 65 73 74 20 74 68 65 20 73 74 61 74 65 6d 65  Test the stateme
7e90: 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74  nts related to t
7ea0: 68 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42  he LIKE and GLOB
7eb0: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 23 0a 23 20   operators..#.# 
7ec0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
7ed0: 36 35 38 34 2d 36 30 31 38 39 20 54 68 65 20 4c  6584-60189 The L
7ee0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 64 6f 65  IKE operator doe
7ef0: 73 20 61 20 70 61 74 74 65 72 6e 20 6d 61 74 63  s a pattern matc
7f00: 68 69 6e 67 0a 23 20 63 6f 6d 70 61 72 69 73 6f  hing.# compariso
7f10: 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  n..#.# EVIDENCE-
7f20: 4f 46 3a 20 52 2d 31 31 32 39 35 2d 30 34 36 35  OF: R-11295-0465
7f30: 37 20 54 68 65 20 6f 70 65 72 61 6e 64 20 74 6f  7 The operand to
7f40: 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
7f50: 65 20 4c 49 4b 45 0a 23 20 6f 70 65 72 61 74 6f  e LIKE.# operato
7f60: 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  r contains the p
7f70: 61 74 74 65 72 6e 20 61 6e 64 20 74 68 65 20 6c  attern and the l
7f80: 65 66 74 20 68 61 6e 64 20 6f 70 65 72 61 6e 64  eft hand operand
7f90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 23 20   contains the.# 
7fa0: 73 74 72 69 6e 67 20 74 6f 20 6d 61 74 63 68 20  string to match 
7fb0: 61 67 61 69 6e 73 74 20 74 68 65 20 70 61 74 74  against the patt
7fc0: 65 72 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ern..#.do_execsq
7fd0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
7fe0: 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61  .1.1 { SELECT 'a
7ff0: 62 63 25 27 20 4c 49 4b 45 20 27 61 62 63 64 65  bc%' LIKE 'abcde
8000: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
8010: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
8020: 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.2 { SELECT 'ab
8030: 63 64 65 27 20 4c 49 4b 45 20 27 61 62 63 25 27  cde' LIKE 'abc%'
8040: 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43 45   } 1..# EVIDENCE
8050: 2d 4f 46 3a 20 52 2d 35 35 34 30 36 2d 33 38 35  -OF: R-55406-385
8060: 32 34 20 41 20 70 65 72 63 65 6e 74 20 73 79 6d  24 A percent sym
8070: 62 6f 6c 20 28 22 25 22 29 20 69 6e 20 74 68 65  bol ("%") in the
8080: 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 0a 23 20   LIKE pattern.# 
8090: 6d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  matches any sequ
80a0: 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20  ence of zero or 
80b0: 6d 6f 72 65 20 63 68 61 72 61 63 74 65 72 73 20  more characters 
80c0: 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 23  in the string..#
80d0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
80e0: 20 65 5f 65 78 70 72 2d 31 34 2e 32 2e 31 20 7b   e_expr-14.2.1 {
80f0: 20 53 45 4c 45 43 54 20 27 61 62 64 65 27 20 20   SELECT 'abde'  
8100: 20 20 4c 49 4b 45 20 27 61 62 25 64 65 27 20 7d    LIKE 'ab%de' }
8110: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
8120: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 32 2e 32  st e_expr-14.2.2
8130: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 58 64 65   { SELECT 'abXde
8140: 27 20 20 20 4c 49 4b 45 20 27 61 62 25 64 65 27  '   LIKE 'ab%de'
8150: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
8160: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 32  test e_expr-14.2
8170: 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62 41  .3 { SELECT 'abA
8180: 42 43 64 65 27 20 4c 49 4b 45 20 27 61 62 25 64  BCde' LIKE 'ab%d
8190: 65 27 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e  e' } 1..# EVIDEN
81a0: 43 45 2d 4f 46 3a 20 52 2d 33 30 34 33 33 2d 32  CE-OF: R-30433-2
81b0: 35 34 34 33 20 41 6e 20 75 6e 64 65 72 73 63 6f  5443 An undersco
81c0: 72 65 20 28 22 5f 22 29 20 69 6e 20 74 68 65 20  re ("_") in the 
81d0: 4c 49 4b 45 20 70 61 74 74 65 72 6e 0a 23 20 6d  LIKE pattern.# m
81e0: 61 74 63 68 65 73 20 61 6e 79 20 73 69 6e 67 6c  atches any singl
81f0: 65 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74  e character in t
8200: 68 65 20 73 74 72 69 6e 67 2e 0a 23 0a 64 6f 5f  he string..#.do_
8210: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8220: 78 70 72 2d 31 34 2e 33 2e 31 20 7b 20 53 45 4c  xpr-14.3.1 { SEL
8230: 45 43 54 20 27 61 62 64 65 27 20 20 20 20 4c 49  ECT 'abde'    LI
8240: 4b 45 20 27 61 62 5f 64 65 27 20 7d 20 30 0a 64  KE 'ab_de' } 0.d
8250: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8260: 5f 65 78 70 72 2d 31 34 2e 33 2e 32 20 7b 20 53  _expr-14.3.2 { S
8270: 45 4c 45 43 54 20 27 61 62 58 64 65 27 20 20 20  ELECT 'abXde'   
8280: 4c 49 4b 45 20 27 61 62 5f 64 65 27 20 7d 20 31  LIKE 'ab_de' } 1
8290: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
82a0: 20 65 5f 65 78 70 72 2d 31 34 2e 33 2e 33 20 7b   e_expr-14.3.3 {
82b0: 20 53 45 4c 45 43 54 20 27 61 62 41 42 43 64 65   SELECT 'abABCde
82c0: 27 20 4c 49 4b 45 20 27 61 62 5f 64 65 27 20 7d  ' LIKE 'ab_de' }
82d0: 20 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f   0..# EVIDENCE-O
82e0: 46 3a 20 52 2d 35 39 30 30 37 2d 32 30 34 35 34  F: R-59007-20454
82f0: 20 41 6e 79 20 6f 74 68 65 72 20 63 68 61 72 61   Any other chara
8300: 63 74 65 72 20 6d 61 74 63 68 65 73 20 69 74 73  cter matches its
8310: 65 6c 66 20 6f 72 20 69 74 73 0a 23 20 6c 6f 77  elf or its.# low
8320: 65 72 2f 75 70 70 65 72 20 63 61 73 65 20 65 71  er/upper case eq
8330: 75 69 76 61 6c 65 6e 74 20 28 69 2e 65 2e 20 63  uivalent (i.e. c
8340: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
8350: 6d 61 74 63 68 69 6e 67 29 2e 0a 23 0a 64 6f 5f  matching)..#.do_
8360: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8370: 78 70 72 2d 31 34 2e 34 2e 31 20 7b 20 53 45 4c  xpr-14.4.1 { SEL
8380: 45 43 54 20 27 61 62 63 27 20 4c 49 4b 45 20 27  ECT 'abc' LIKE '
8390: 61 42 63 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63  aBc' } 1.do_exec
83a0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
83b0: 31 34 2e 34 2e 32 20 7b 20 53 45 4c 45 43 54 20  14.4.2 { SELECT 
83c0: 27 61 42 63 27 20 4c 49 4b 45 20 27 61 42 63 27  'aBc' LIKE 'aBc'
83d0: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
83e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 34  test e_expr-14.4
83f0: 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 63 27  .3 { SELECT 'ac'
8400: 20 20 4c 49 4b 45 20 27 61 42 63 27 20 7d 20 30    LIKE 'aBc' } 0
8410: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
8420: 20 52 2d 32 33 36 34 38 2d 35 38 35 32 37 20 53   R-23648-58527 S
8430: 51 4c 69 74 65 20 6f 6e 6c 79 20 75 6e 64 65 72  QLite only under
8440: 73 74 61 6e 64 73 20 75 70 70 65 72 2f 6c 6f 77  stands upper/low
8450: 65 72 20 63 61 73 65 0a 23 20 66 6f 72 20 41 53  er case.# for AS
8460: 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20 62  CII characters b
8470: 79 20 64 65 66 61 75 6c 74 2e 0a 23 0a 23 20 45  y default..#.# E
8480: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 34  VIDENCE-OF: R-04
8490: 35 33 32 2d 31 31 35 32 37 20 54 68 65 20 4c 49  532-11527 The LI
84a0: 4b 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20 63  KE operator is c
84b0: 61 73 65 20 73 65 6e 73 69 74 69 76 65 20 62 79  ase sensitive by
84c0: 0a 23 20 64 65 66 61 75 6c 74 20 66 6f 72 20 75  .# default for u
84d0: 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72  nicode character
84e0: 73 20 74 68 61 74 20 61 72 65 20 62 65 79 6f 6e  s that are beyon
84f0: 64 20 74 68 65 20 41 53 43 49 49 20 72 61 6e 67  d the ASCII rang
8500: 65 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  e..#.# EVIDENCE-
8510: 4f 46 3a 20 52 2d 34 34 33 38 31 2d 31 31 36 36  OF: R-44381-1166
8520: 39 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  9 the expression
8530: 0a 23 20 27 61 27 26 6e 62 73 70 3b 4c 49 4b 45  .# 'a'&nbsp;LIKE
8540: 26 6e 62 73 70 3b 27 41 27 20 69 73 20 54 52 55  &nbsp;'A' is TRU
8550: 45 20 62 75 74 0a 23 20 27 26 61 65 6c 69 67 3b  E but.# '&aelig;
8560: 27 26 6e 62 73 70 3b 4c 49 4b 45 26 6e 62 73 70  '&nbsp;LIKE&nbsp
8570: 3b 27 26 41 45 6c 69 67 3b 27 20 69 73 20 46 41  ;'&AElig;' is FA
8580: 4c 53 45 2e 0a 23 0a 23 20 20 20 54 68 65 20 72  LSE..#.#   The r
8590: 65 73 74 72 69 63 74 69 6f 6e 20 74 6f 20 41 53  estriction to AS
85a0: 43 49 49 20 63 68 61 72 61 63 74 65 72 73 20 64  CII characters d
85b0: 6f 65 73 20 6e 6f 74 20 61 70 70 6c 79 20 69 66  oes not apply if
85c0: 20 74 68 65 20 49 43 55 0a 23 20 20 20 6c 69 62   the ICU.#   lib
85d0: 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64  rary is compiled
85e0: 20 69 6e 2e 20 57 68 65 6e 20 49 43 55 20 69 73   in. When ICU is
85f0: 20 65 6e 61 62 6c 65 64 20 53 51 4c 69 74 65 20   enabled SQLite 
8600: 64 6f 65 73 20 6e 6f 74 20 61 63 74 0a 23 20 20  does not act.#  
8610: 20 61 73 20 69 74 20 64 6f 65 73 20 22 62 79 20   as it does "by 
8620: 64 65 66 61 75 6c 74 22 2e 0a 23 0a 64 6f 5f 65  default"..#.do_e
8630: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8640: 70 72 2d 31 34 2e 35 2e 31 20 7b 20 53 45 4c 45  pr-14.5.1 { SELE
8650: 43 54 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20  CT 'A' LIKE 'a' 
8660: 20 20 20 20 20 20 20 20 7d 20 31 0a 69 66 63 61          } 1.ifca
8670: 70 61 62 6c 65 20 21 69 63 75 20 7b 0a 20 20 64  pable !icu {.  d
8680: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8690: 5f 65 78 70 72 2d 31 34 2e 35 2e 32 20 22 53 45  _expr-14.5.2 "SE
86a0: 4c 45 43 54 20 27 5c 75 30 30 63 36 27 20 4c 49  LECT '\u00c6' LI
86b0: 4b 45 20 27 5c 75 30 30 65 36 27 22 20 30 0a 7d  KE '\u00e6'" 0.}
86c0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
86d0: 20 52 2d 35 36 36 38 33 2d 31 33 37 33 31 20 49   R-56683-13731 I
86e0: 66 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20 45  f the optional E
86f0: 53 43 41 50 45 20 63 6c 61 75 73 65 20 69 73 20  SCAPE clause is 
8700: 70 72 65 73 65 6e 74 2c 0a 23 20 74 68 65 6e 20  present,.# then 
8710: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66  the expression f
8720: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 45 53 43  ollowing the ESC
8730: 41 50 45 20 6b 65 79 77 6f 72 64 20 6d 75 73 74  APE keyword must
8740: 20 65 76 61 6c 75 61 74 65 20 74 6f 20 61 0a 23   evaluate to a.#
8750: 20 73 74 72 69 6e 67 20 63 6f 6e 73 69 73 74 69   string consisti
8760: 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63  ng of a single c
8770: 68 61 72 61 63 74 65 72 2e 0a 23 0a 64 6f 5f 63  haracter..#.do_c
8780: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65  atchsql_test e_e
8790: 78 70 72 2d 31 34 2e 36 2e 31 20 7b 20 0a 20 20  xpr-14.6.1 { .  
87a0: 53 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20  SELECT 'A' LIKE 
87b0: 27 61 27 20 45 53 43 41 50 45 20 27 31 32 27 20  'a' ESCAPE '12' 
87c0: 0a 7d 20 7b 31 20 7b 45 53 43 41 50 45 20 65 78  .} {1 {ESCAPE ex
87d0: 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
87e0: 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63   a single charac
87f0: 74 65 72 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71  ter}}.do_catchsq
8800: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
8810: 2e 36 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54  .6.2 { .  SELECT
8820: 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53   'A' LIKE 'a' ES
8830: 43 41 50 45 20 27 27 20 0a 7d 20 7b 31 20 7b 45  CAPE '' .} {1 {E
8840: 53 43 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e  SCAPE expression
8850: 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c   must be a singl
8860: 65 20 63 68 61 72 61 63 74 65 72 7d 7d 0a 64 6f  e character}}.do
8870: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
8880: 5f 65 78 70 72 2d 31 34 2e 36 2e 33 20 7b 20 53  _expr-14.6.3 { S
8890: 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20 27  ELECT 'A' LIKE '
88a0: 61 27 20 45 53 43 41 50 45 20 27 78 27 20 7d 20  a' ESCAPE 'x' } 
88b0: 20 20 20 7b 30 20 31 7d 0a 64 6f 5f 63 61 74 63     {0 1}.do_catc
88c0: 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  hsql_test e_expr
88d0: 2d 31 34 2e 36 2e 34 20 22 53 45 4c 45 43 54 20  -14.6.4 "SELECT 
88e0: 27 41 27 20 4c 49 4b 45 20 27 61 27 20 45 53 43  'A' LIKE 'a' ESC
88f0: 41 50 45 20 27 5c 75 30 30 65 36 27 22 20 7b 30  APE '\u00e6'" {0
8900: 20 31 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   1}..# EVIDENCE-
8910: 4f 46 3a 20 52 2d 30 32 30 34 35 2d 32 33 37 36  OF: R-02045-2376
8920: 32 20 54 68 69 73 20 63 68 61 72 61 63 74 65 72  2 This character
8930: 20 6d 61 79 20 62 65 20 75 73 65 64 20 69 6e 20   may be used in 
8940: 74 68 65 20 4c 49 4b 45 0a 23 20 70 61 74 74 65  the LIKE.# patte
8950: 72 6e 20 74 6f 20 69 6e 63 6c 75 64 65 20 6c 69  rn to include li
8960: 74 65 72 61 6c 20 70 65 72 63 65 6e 74 20 6f 72  teral percent or
8970: 20 75 6e 64 65 72 73 63 6f 72 65 20 63 68 61 72   underscore char
8980: 61 63 74 65 72 73 2e 0a 23 0a 23 20 45 56 49 44  acters..#.# EVID
8990: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 33 34 35  ENCE-OF: R-13345
89a0: 2d 33 31 38 33 30 20 54 68 65 20 65 73 63 61 70  -31830 The escap
89b0: 65 20 63 68 61 72 61 63 74 65 72 20 66 6f 6c 6c  e character foll
89c0: 6f 77 65 64 20 62 79 20 61 20 70 65 72 63 65 6e  owed by a percen
89d0: 74 0a 23 20 73 79 6d 62 6f 6c 20 28 25 29 2c 20  t.# symbol (%), 
89e0: 75 6e 64 65 72 73 63 6f 72 65 20 28 5f 29 2c 20  underscore (_), 
89f0: 6f 72 20 61 20 73 65 63 6f 6e 64 20 69 6e 73 74  or a second inst
8a00: 61 6e 63 65 20 6f 66 20 74 68 65 20 65 73 63 61  ance of the esca
8a10: 70 65 0a 23 20 63 68 61 72 61 63 74 65 72 20 69  pe.# character i
8a20: 74 73 65 6c 66 20 6d 61 74 63 68 65 73 20 61 20  tself matches a 
8a30: 6c 69 74 65 72 61 6c 20 70 65 72 63 65 6e 74 20  literal percent 
8a40: 73 79 6d 62 6f 6c 2c 20 75 6e 64 65 72 73 63 6f  symbol, undersco
8a50: 72 65 2c 20 6f 72 20 61 0a 23 20 73 69 6e 67 6c  re, or a.# singl
8a60: 65 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74  e escape charact
8a70: 65 72 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  er, respectively
8a80: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
8a90: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e  est e_expr-14.7.
8aa0: 31 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  1  { SELECT 'abc
8ab0: 25 27 20 20 4c 49 4b 45 20 27 61 62 63 58 25 27  %'  LIKE 'abcX%'
8ac0: 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 31 0a   ESCAPE 'X' } 1.
8ad0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8ae0: 65 5f 65 78 70 72 2d 31 34 2e 37 2e 32 20 20 7b  e_expr-14.7.2  {
8af0: 20 53 45 4c 45 43 54 20 27 61 62 63 35 27 20 20   SELECT 'abc5'  
8b00: 4c 49 4b 45 20 27 61 62 63 58 25 27 20 45 53 43  LIKE 'abcX%' ESC
8b10: 41 50 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65  APE 'X' } 0.do_e
8b20: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8b30: 70 72 2d 31 34 2e 37 2e 33 20 20 7b 20 53 45 4c  pr-14.7.3  { SEL
8b40: 45 43 54 20 27 61 62 63 27 20 20 20 4c 49 4b 45  ECT 'abc'   LIKE
8b50: 20 27 61 62 63 58 25 27 20 45 53 43 41 50 45 20   'abcX%' ESCAPE 
8b60: 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  'X' } 0.do_execs
8b70: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8b80: 34 2e 37 2e 34 20 20 7b 20 53 45 4c 45 43 54 20  4.7.4  { SELECT 
8b90: 27 61 62 63 58 25 27 20 4c 49 4b 45 20 27 61 62  'abcX%' LIKE 'ab
8ba0: 63 58 25 27 20 45 53 43 41 50 45 20 27 58 27 20  cX%' ESCAPE 'X' 
8bb0: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
8bc0: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e  est e_expr-14.7.
8bd0: 35 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  5  { SELECT 'abc
8be0: 25 25 27 20 4c 49 4b 45 20 27 61 62 63 58 25 27  %%' LIKE 'abcX%'
8bf0: 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a   ESCAPE 'X' } 0.
8c00: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8c10: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 36 20 20   e_expr-14.7.6  
8c20: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 5f 27 20  { SELECT 'abc_' 
8c30: 20 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53   LIKE 'abcX_' ES
8c40: 43 41 50 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f  CAPE 'X' } 1.do_
8c50: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8c60: 78 70 72 2d 31 34 2e 37 2e 37 20 20 7b 20 53 45  xpr-14.7.7  { SE
8c70: 4c 45 43 54 20 27 61 62 63 35 27 20 20 4c 49 4b  LECT 'abc5'  LIK
8c80: 45 20 27 61 62 63 58 5f 27 20 45 53 43 41 50 45  E 'abcX_' ESCAPE
8c90: 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63   'X' } 0.do_exec
8ca0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
8cb0: 31 34 2e 37 2e 38 20 20 7b 20 53 45 4c 45 43 54  14.7.8  { SELECT
8cc0: 20 27 61 62 63 27 20 20 20 4c 49 4b 45 20 27 61   'abc'   LIKE 'a
8cd0: 62 63 58 5f 27 20 45 53 43 41 50 45 20 27 58 27  bcX_' ESCAPE 'X'
8ce0: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
8cf0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37  test e_expr-14.7
8d00: 2e 39 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .9  { SELECT 'ab
8d10: 63 58 5f 27 20 4c 49 4b 45 20 27 61 62 63 58 5f  cX_' LIKE 'abcX_
8d20: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30  ' ESCAPE 'X' } 0
8d30: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8d40: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 30 20   e_expr-14.7.10 
8d50: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 5f 5f 27  { SELECT 'abc__'
8d60: 20 4c 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53   LIKE 'abcX_' ES
8d70: 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 64 6f  CAPE 'X' } 0..do
8d80: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8d90: 65 78 70 72 2d 31 34 2e 37 2e 31 31 20 7b 20 53  expr-14.7.11 { S
8da0: 45 4c 45 43 54 20 27 61 62 63 58 27 20 20 4c 49  ELECT 'abcX'  LI
8db0: 4b 45 20 27 61 62 63 58 58 27 20 45 53 43 41 50  KE 'abcXX' ESCAP
8dc0: 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f 65 78 65  E 'X' } 1.do_exe
8dd0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
8de0: 2d 31 34 2e 37 2e 31 32 20 7b 20 53 45 4c 45 43  -14.7.12 { SELEC
8df0: 54 20 27 61 62 63 35 27 20 20 4c 49 4b 45 20 27  T 'abc5'  LIKE '
8e00: 61 62 63 58 58 27 20 45 53 43 41 50 45 20 27 58  abcXX' ESCAPE 'X
8e10: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
8e20: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
8e30: 37 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 27 61  7.13 { SELECT 'a
8e40: 62 63 27 20 20 20 4c 49 4b 45 20 27 61 62 63 58  bc'   LIKE 'abcX
8e50: 58 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20  X' ESCAPE 'X' } 
8e60: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
8e70: 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 34  t e_expr-14.7.14
8e80: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 58 58   { SELECT 'abcXX
8e90: 27 20 4c 49 4b 45 20 27 61 62 63 58 58 27 20 45  ' LIKE 'abcXX' E
8ea0: 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 23  SCAPE 'X' } 0..#
8eb0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
8ec0: 35 31 33 35 39 2d 31 37 34 39 36 20 54 68 65 20  51359-17496 The 
8ed0: 69 6e 66 69 78 20 4c 49 4b 45 20 6f 70 65 72 61  infix LIKE opera
8ee0: 74 6f 72 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  tor is implement
8ef0: 65 64 20 62 79 0a 23 20 63 61 6c 6c 69 6e 67 20  ed by.# calling 
8f00: 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d  the application-
8f10: 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63  defined SQL func
8f20: 74 69 6f 6e 73 20 6c 69 6b 65 28 59 2c 58 29 20  tions like(Y,X) 
8f30: 6f 72 20 6c 69 6b 65 28 59 2c 58 2c 5a 29 2e 0a  or like(Y,X,Z)..
8f40: 23 0a 70 72 6f 63 20 6c 69 6b 65 66 75 6e 63 20  #.proc likefunc 
8f50: 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20  {args} {.  eval 
8f60: 6c 61 70 70 65 6e 64 20 3a 3a 6c 69 6b 65 61 72  lappend ::likear
8f70: 67 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72  gs $args.  retur
8f80: 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 6c 69  n 1.}.db func li
8f90: 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 6c  ke -argcount 2 l
8fa0: 69 6b 65 66 75 6e 63 0a 64 62 20 66 75 6e 63 20  ikefunc.db func 
8fb0: 6c 69 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 33  like -argcount 3
8fc0: 20 6c 69 6b 65 66 75 6e 63 0a 73 65 74 20 3a 3a   likefunc.set ::
8fd0: 6c 69 6b 65 61 72 67 73 20 5b 6c 69 73 74 5d 0a  likeargs [list].
8fe0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8ff0: 65 5f 65 78 70 72 2d 31 35 2e 31 2e 31 20 7b 20  e_expr-15.1.1 { 
9000: 53 45 4c 45 43 54 20 27 61 62 63 27 20 4c 49 4b  SELECT 'abc' LIK
9010: 45 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74  E 'def' } 1.do_t
9020: 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78  est         e_ex
9030: 70 72 2d 31 35 2e 31 2e 32 20 7b 20 73 65 74 20  pr-15.1.2 { set 
9040: 6c 69 6b 65 61 72 67 73 20 7d 20 7b 64 65 66 20  likeargs } {def 
9050: 61 62 63 7d 0a 73 65 74 20 3a 3a 6c 69 6b 65 61  abc}.set ::likea
9060: 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78  rgs [list].do_ex
9070: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
9080: 72 2d 31 35 2e 31 2e 33 20 7b 20 53 45 4c 45 43  r-15.1.3 { SELEC
9090: 54 20 27 61 62 63 27 20 4c 49 4b 45 20 27 64 65  T 'abc' LIKE 'de
90a0: 66 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20  f' ESCAPE 'X' } 
90b0: 31 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  1.do_test       
90c0: 20 20 65 5f 65 78 70 72 2d 31 35 2e 31 2e 34 20    e_expr-15.1.4 
90d0: 7b 20 73 65 74 20 6c 69 6b 65 61 72 67 73 20 7d  { set likeargs }
90e0: 20 7b 64 65 66 20 61 62 63 20 58 7d 0a 64 62 20   {def abc X}.db 
90f0: 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62  close.sqlite3 db
9100: 20 74 65 73 74 2e 64 62 0a 0a 23 20 45 56 49 44   test.db..# EVID
9110: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 38 36 38  ENCE-OF: R-22868
9120: 2d 32 35 38 38 30 20 54 68 65 20 4c 49 4b 45 20  -25880 The LIKE 
9130: 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65 20  operator can be 
9140: 6d 61 64 65 20 63 61 73 65 0a 23 20 73 65 6e 73  made case.# sens
9150: 69 74 69 76 65 20 75 73 69 6e 67 20 74 68 65 20  itive using the 
9160: 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c  case_sensitive_l
9170: 69 6b 65 20 70 72 61 67 6d 61 2e 0a 23 0a 64 6f  ike pragma..#.do
9180: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9190: 65 78 70 72 2d 31 36 2e 31 2e 31 20 7b 20 53 45  expr-16.1.1 { SE
91a0: 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4c 49  LECT 'abcxyz' LI
91b0: 4b 45 20 27 41 42 43 25 27 20 7d 20 31 0a 64 6f  KE 'ABC%' } 1.do
91c0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
91d0: 65 78 70 72 2d 31 36 2e 31 2e 32 20 7b 20 50 52  expr-16.1.2 { PR
91e0: 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74  AGMA case_sensit
91f0: 69 76 65 5f 6c 69 6b 65 20 3d 20 31 20 7d 20 7b  ive_like = 1 } {
9200: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
9210: 74 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 33 20  t e_expr-16.1.3 
9220: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
9230: 27 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20  ' LIKE 'ABC%' } 
9240: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
9250: 74 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 34 20  t e_expr-16.1.4 
9260: 7b 20 53 45 4c 45 43 54 20 27 41 42 43 78 79 7a  { SELECT 'ABCxyz
9270: 27 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20  ' LIKE 'ABC%' } 
9280: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
9290: 74 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 35 20  t e_expr-16.1.5 
92a0: 7b 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65  { PRAGMA case_se
92b0: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 20 3d 20 30  nsitive_like = 0
92c0: 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   } {}.do_execsql
92d0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e  _test e_expr-16.
92e0: 31 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.6 { SELECT 'ab
92f0: 63 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25  cxyz' LIKE 'ABC%
9300: 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 1.do_execsql
9310: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e  _test e_expr-16.
9320: 31 2e 37 20 7b 20 53 45 4c 45 43 54 20 27 41 42  1.7 { SELECT 'AB
9330: 43 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25  Cxyz' LIKE 'ABC%
9340: 27 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43  ' } 1..# EVIDENC
9350: 45 2d 4f 46 3a 20 52 2d 35 32 30 38 37 2d 31 32  E-OF: R-52087-12
9360: 30 34 33 20 54 68 65 20 47 4c 4f 42 20 6f 70 65  043 The GLOB ope
9370: 72 61 74 6f 72 20 69 73 20 73 69 6d 69 6c 61 72  rator is similar
9380: 20 74 6f 20 4c 49 4b 45 20 62 75 74 0a 23 20 75   to LIKE but.# u
9390: 73 65 73 20 74 68 65 20 55 6e 69 78 20 66 69 6c  ses the Unix fil
93a0: 65 20 67 6c 6f 62 62 69 6e 67 20 73 79 6e 74 61  e globbing synta
93b0: 78 20 66 6f 72 20 69 74 73 20 77 69 6c 64 63 61  x for its wildca
93c0: 72 64 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  rds..#.# EVIDENC
93d0: 45 2d 4f 46 3a 20 52 2d 30 39 38 31 33 2d 31 37  E-OF: R-09813-17
93e0: 32 37 39 20 41 6c 73 6f 2c 20 47 4c 4f 42 20 69  279 Also, GLOB i
93f0: 73 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65  s case sensitive
9400: 2c 20 75 6e 6c 69 6b 65 20 4c 49 4b 45 2e 0a 23  , unlike LIKE..#
9410: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9420: 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 31 20 7b   e_expr-17.1.1 {
9430: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
9440: 20 47 4c 4f 42 20 27 61 62 63 25 27 20 7d 20 30   GLOB 'abc%' } 0
9450: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9460: 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 32 20 7b   e_expr-17.1.2 {
9470: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
9480: 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20 31   GLOB 'abc*' } 1
9490: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
94a0: 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 33 20 7b   e_expr-17.1.3 {
94b0: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
94c0: 20 47 4c 4f 42 20 27 61 62 63 5f 5f 5f 27 20 7d   GLOB 'abc___' }
94d0: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
94e0: 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 34  st e_expr-17.1.4
94f0: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79   { SELECT 'abcxy
9500: 7a 27 20 47 4c 4f 42 20 27 61 62 63 3f 3f 3f 27  z' GLOB 'abc???'
9510: 20 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   } 1..do_execsql
9520: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9530: 31 2e 35 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.5 { SELECT 'ab
9540: 63 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 2a  cxyz' GLOB 'abc*
9550: 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 1.do_execsql
9560: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9570: 31 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 41 42  1.6 { SELECT 'AB
9580: 43 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 2a  Cxyz' GLOB 'abc*
9590: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
95a0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
95b0: 31 2e 37 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.7 { SELECT 'ab
95c0: 63 78 79 7a 27 20 47 4c 4f 42 20 27 41 42 43 2a  cxyz' GLOB 'ABC*
95d0: 27 20 7d 20 30 0a 0a 23 20 45 56 49 44 45 4e 43  ' } 0..# EVIDENC
95e0: 45 2d 4f 46 3a 20 52 2d 33 39 36 31 36 2d 32 30  E-OF: R-39616-20
95f0: 35 35 35 20 42 6f 74 68 20 47 4c 4f 42 20 61 6e  555 Both GLOB an
9600: 64 20 4c 49 4b 45 20 6d 61 79 20 62 65 20 70 72  d LIKE may be pr
9610: 65 63 65 64 65 64 20 62 79 20 74 68 65 0a 23 20  eceded by the.# 
9620: 4e 4f 54 20 6b 65 79 77 6f 72 64 20 74 6f 20 69  NOT keyword to i
9630: 6e 76 65 72 74 20 74 68 65 20 73 65 6e 73 65 20  nvert the sense 
9640: 6f 66 20 74 68 65 20 74 65 73 74 2e 0a 23 0a 64  of the test..#.d
9650: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
9660: 5f 65 78 70 72 2d 31 37 2e 32 2e 31 20 7b 20 53  _expr-17.2.1 { S
9670: 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e  ELECT 'abcxyz' N
9680: 4f 54 20 47 4c 4f 42 20 27 41 42 43 2a 27 20 7d  OT GLOB 'ABC*' }
9690: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
96a0: 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 32  st e_expr-17.2.2
96b0: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79   { SELECT 'abcxy
96c0: 7a 27 20 4e 4f 54 20 47 4c 4f 42 20 27 61 62 63  z' NOT GLOB 'abc
96d0: 2a 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71  *' } 0.do_execsq
96e0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37  l_test e_expr-17
96f0: 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61  .2.3 { SELECT 'a
9700: 62 63 78 79 7a 27 20 4e 4f 54 20 4c 49 4b 45 20  bcxyz' NOT LIKE 
9710: 27 41 42 43 25 27 20 7d 20 30 0a 64 6f 5f 65 78  'ABC%' } 0.do_ex
9720: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
9730: 72 2d 31 37 2e 32 2e 34 20 7b 20 53 45 4c 45 43  r-17.2.4 { SELEC
9740: 54 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 4c  T 'abcxyz' NOT L
9750: 49 4b 45 20 27 61 62 63 25 27 20 7d 20 30 0a 64  IKE 'abc%' } 0.d
9760: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
9770: 5f 65 78 70 72 2d 31 37 2e 32 2e 35 20 7b 20 53  _expr-17.2.5 { S
9780: 45 4c 45 43 54 20 27 61 62 64 78 79 7a 27 20 4e  ELECT 'abdxyz' N
9790: 4f 54 20 4c 49 4b 45 20 27 61 62 63 25 27 20 7d  OT LIKE 'abc%' }
97a0: 20 31 0a 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65   1..db nullvalue
97b0: 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c   null.do_execsql
97c0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
97d0: 32 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.6 { SELECT 'ab
97e0: 63 78 79 7a 27 20 4e 4f 54 20 47 4c 4f 42 20 4e  cxyz' NOT GLOB N
97f0: 55 4c 4c 20 7d 20 6e 75 6c 6c 0a 64 6f 5f 65 78  ULL } null.do_ex
9800: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
9810: 72 2d 31 37 2e 32 2e 37 20 7b 20 53 45 4c 45 43  r-17.2.7 { SELEC
9820: 54 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 4c  T 'abcxyz' NOT L
9830: 49 4b 45 20 4e 55 4c 4c 20 7d 20 6e 75 6c 6c 0a  IKE NULL } null.
9840: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9850: 65 5f 65 78 70 72 2d 31 37 2e 32 2e 38 20 7b 20  e_expr-17.2.8 { 
9860: 53 45 4c 45 43 54 20 4e 55 4c 4c 20 4e 4f 54 20  SELECT NULL NOT 
9870: 47 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20 6e 75  GLOB 'abc*' } nu
9880: 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  ll.do_execsql_te
9890: 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 39  st e_expr-17.2.9
98a0: 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 4e   { SELECT NULL N
98b0: 4f 54 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d  OT LIKE 'ABC%' }
98c0: 20 6e 75 6c 6c 0a 64 62 20 6e 75 6c 6c 76 61 6c   null.db nullval
98d0: 75 65 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43  ue {}..# EVIDENC
98e0: 45 2d 4f 46 3a 20 52 2d 33 39 34 31 34 2d 33 35  E-OF: R-39414-35
98f0: 34 38 39 20 54 68 65 20 69 6e 66 69 78 20 47 4c  489 The infix GL
9900: 4f 42 20 6f 70 65 72 61 74 6f 72 20 69 73 20 69  OB operator is i
9910: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 23 20  mplemented by.# 
9920: 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63  calling the func
9930: 74 69 6f 6e 20 67 6c 6f 62 28 59 2c 58 29 20 61  tion glob(Y,X) a
9940: 6e 64 20 63 61 6e 20 62 65 20 6d 6f 64 69 66 69  nd can be modifi
9950: 65 64 20 62 79 20 6f 76 65 72 72 69 64 69 6e 67  ed by overriding
9960: 20 74 68 61 74 0a 23 20 66 75 6e 63 74 69 6f 6e   that.# function
9970: 2e 0a 70 72 6f 63 20 67 6c 6f 62 66 75 6e 63 20  ..proc globfunc 
9980: 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20  {args} {.  eval 
9990: 6c 61 70 70 65 6e 64 20 3a 3a 67 6c 6f 62 61 72  lappend ::globar
99a0: 67 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72  gs $args.  retur
99b0: 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 67 6c  n 1.}.db func gl
99c0: 6f 62 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 67  ob -argcount 2 g
99d0: 6c 6f 62 66 75 6e 63 0a 73 65 74 20 3a 3a 67 6c  lobfunc.set ::gl
99e0: 6f 62 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f  obargs [list].do
99f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9a00: 65 78 70 72 2d 31 37 2e 33 2e 31 20 7b 20 53 45  expr-17.3.1 { SE
9a10: 4c 45 43 54 20 27 61 62 63 27 20 47 4c 4f 42 20  LECT 'abc' GLOB 
9a20: 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73  'def' } 1.do_tes
9a30: 74 20 20 20 20 20 20 20 20 20 65 5f 65 78 70 72  t         e_expr
9a40: 2d 31 37 2e 33 2e 32 20 7b 20 73 65 74 20 67 6c  -17.3.2 { set gl
9a50: 6f 62 61 72 67 73 20 7d 20 7b 64 65 66 20 61 62  obargs } {def ab
9a60: 63 7d 0a 73 65 74 20 3a 3a 67 6c 6f 62 61 72 67  c}.set ::globarg
9a70: 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63  s [list].do_exec
9a80: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
9a90: 31 37 2e 33 2e 33 20 7b 20 53 45 4c 45 43 54 20  17.3.3 { SELECT 
9aa0: 27 58 27 20 4e 4f 54 20 47 4c 4f 42 20 27 59 27  'X' NOT GLOB 'Y'
9ab0: 20 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20 20 20   } 0.do_test    
9ac0: 20 20 20 20 20 65 5f 65 78 70 72 2d 31 37 2e 33       e_expr-17.3
9ad0: 2e 34 20 7b 20 73 65 74 20 67 6c 6f 62 61 72 67  .4 { set globarg
9ae0: 73 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69 74 65  s } {Y X}.sqlite
9af0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 23 20  3 db test.db..# 
9b00: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
9b10: 31 36 35 30 2d 32 30 38 37 32 20 4e 6f 20 72 65  1650-20872 No re
9b20: 67 65 78 70 28 29 20 75 73 65 72 20 66 75 6e 63  gexp() user func
9b30: 74 69 6f 6e 20 69 73 20 64 65 66 69 6e 65 64 20  tion is defined 
9b40: 62 79 0a 23 20 64 65 66 61 75 6c 74 20 61 6e 64  by.# default and
9b50: 20 73 6f 20 75 73 65 20 6f 66 20 74 68 65 20 52   so use of the R
9b60: 45 47 45 58 50 20 6f 70 65 72 61 74 6f 72 20 77  EGEXP operator w
9b70: 69 6c 6c 20 6e 6f 72 6d 61 6c 6c 79 20 72 65 73  ill normally res
9b80: 75 6c 74 20 69 6e 20 61 6e 0a 23 20 65 72 72 6f  ult in an.# erro
9b90: 72 20 6d 65 73 73 61 67 65 2e 0a 23 0a 23 20 20  r message..#.#  
9ba0: 20 54 68 65 72 65 20 69 73 20 61 20 72 65 67 65   There is a rege
9bb0: 78 70 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 49  xp function if I
9bc0: 43 55 20 69 73 20 65 6e 61 62 6c 65 64 20 74 68  CU is enabled th
9bd0: 6f 75 67 68 2e 0a 23 0a 69 66 63 61 70 61 62 6c  ough..#.ifcapabl
9be0: 65 20 21 69 63 75 20 7b 0a 20 20 64 6f 5f 63 61  e !icu {.  do_ca
9bf0: 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  tchsql_test e_ex
9c00: 70 72 2d 31 38 2e 31 2e 31 20 7b 20 0a 20 20 20  pr-18.1.1 { .   
9c10: 20 53 45 4c 45 43 54 20 72 65 67 65 78 70 28 27   SELECT regexp('
9c20: 61 62 63 27 2c 20 27 64 65 66 27 29 20 0a 20 20  abc', 'def') .  
9c30: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 66 75  } {1 {no such fu
9c40: 6e 63 74 69 6f 6e 3a 20 72 65 67 65 78 70 7d 7d  nction: regexp}}
9c50: 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  .  do_catchsql_t
9c60: 65 73 74 20 65 5f 65 78 70 72 2d 31 38 2e 31 2e  est e_expr-18.1.
9c70: 32 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20  2 { .    SELECT 
9c80: 27 61 62 63 27 20 52 45 47 45 58 50 20 27 64 65  'abc' REGEXP 'de
9c90: 66 27 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75  f'.  } {1 {no su
9ca0: 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 52 45 47  ch function: REG
9cb0: 45 58 50 7d 7d 0a 7d 0a 0a 23 20 45 56 49 44 45  EXP}}.}..# EVIDE
9cc0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 36 39 33 2d  NCE-OF: R-33693-
9cd0: 35 30 31 38 30 20 54 68 65 20 52 45 47 45 58 50  50180 The REGEXP
9ce0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 61 20 73   operator is a s
9cf0: 70 65 63 69 61 6c 20 73 79 6e 74 61 78 20 66 6f  pecial syntax fo
9d00: 72 0a 23 20 74 68 65 20 72 65 67 65 78 70 28 29  r.# the regexp()
9d10: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a   user function..
9d20: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
9d30: 20 52 2d 36 35 35 32 34 2d 36 31 38 34 39 20 49   R-65524-61849 I
9d40: 66 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e  f an application
9d50: 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e  -defined SQL fun
9d60: 63 74 69 6f 6e 0a 23 20 6e 61 6d 65 64 20 22 72  ction.# named "r
9d70: 65 67 65 78 70 22 20 69 73 20 61 64 64 65 64 20  egexp" is added 
9d80: 61 74 20 72 75 6e 2d 74 69 6d 65 2c 20 74 68 65  at run-time, the
9d90: 6e 20 74 68 65 20 22 58 20 52 45 47 45 58 50 20  n the "X REGEXP 
9da0: 59 22 20 6f 70 65 72 61 74 6f 72 0a 23 20 77 69  Y" operator.# wi
9db0: 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ll be implemente
9dc0: 64 20 61 73 20 61 20 63 61 6c 6c 20 74 6f 20 22  d as a call to "
9dd0: 72 65 67 65 78 70 28 59 2c 58 29 22 2e 0a 23 0a  regexp(Y,X)"..#.
9de0: 70 72 6f 63 20 72 65 67 65 78 70 66 75 6e 63 20  proc regexpfunc 
9df0: 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20  {args} {.  eval 
9e00: 6c 61 70 70 65 6e 64 20 3a 3a 72 65 67 65 78 70  lappend ::regexp
9e10: 61 72 67 73 20 24 61 72 67 73 0a 20 20 72 65 74  args $args.  ret
9e20: 75 72 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20  urn 1.}.db func 
9e30: 72 65 67 65 78 70 20 2d 61 72 67 63 6f 75 6e 74  regexp -argcount
9e40: 20 32 20 72 65 67 65 78 70 66 75 6e 63 0a 73 65   2 regexpfunc.se
9e50: 74 20 3a 3a 72 65 67 65 78 70 61 72 67 73 20 5b  t ::regexpargs [
9e60: 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c  list].do_execsql
9e70: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 38 2e  _test e_expr-18.
9e80: 32 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.1 { SELECT 'ab
9e90: 63 27 20 52 45 47 45 58 50 20 27 64 65 66 27 20  c' REGEXP 'def' 
9ea0: 7d 20 31 0a 64 6f 5f 74 65 73 74 20 20 20 20 20  } 1.do_test     
9eb0: 20 20 20 20 65 5f 65 78 70 72 2d 31 38 2e 32 2e      e_expr-18.2.
9ec0: 32 20 7b 20 73 65 74 20 72 65 67 65 78 70 61 72  2 { set regexpar
9ed0: 67 73 20 7d 20 7b 64 65 66 20 61 62 63 7d 0a 73  gs } {def abc}.s
9ee0: 65 74 20 3a 3a 72 65 67 65 78 70 61 72 67 73 20  et ::regexpargs 
9ef0: 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71  [list].do_execsq
9f00: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 38  l_test e_expr-18
9f10: 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 58  .2.3 { SELECT 'X
9f20: 27 20 4e 4f 54 20 52 45 47 45 58 50 20 27 59 27  ' NOT REGEXP 'Y'
9f30: 20 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20 20 20   } 0.do_test    
9f40: 20 20 20 20 20 65 5f 65 78 70 72 2d 31 38 2e 32       e_expr-18.2
9f50: 2e 34 20 7b 20 73 65 74 20 72 65 67 65 78 70 61  .4 { set regexpa
9f60: 72 67 73 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69  rgs } {Y X}.sqli
9f70: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a  te3 db test.db..
9f80: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
9f90: 2d 34 32 30 33 37 2d 33 37 38 32 36 20 54 68 65  -42037-37826 The
9fa0: 20 64 65 66 61 75 6c 74 20 6d 61 74 63 68 28 29   default match()
9fb0: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
9fc0: 65 6e 74 61 74 69 6f 6e 0a 23 20 72 61 69 73 65  entation.# raise
9fd0: 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 61  s an exception a
9fe0: 6e 64 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  nd is not really
9ff0: 20 75 73 65 66 75 6c 20 66 6f 72 20 61 6e 79 74   useful for anyt
a000: 68 69 6e 67 2e 0a 23 0a 64 6f 5f 63 61 74 63 68  hing..#.do_catch
a010: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
a020: 31 39 2e 31 2e 31 20 7b 20 0a 20 20 53 45 4c 45  19.1.1 { .  SELE
a030: 43 54 20 27 61 62 63 27 20 4d 41 54 43 48 20 27  CT 'abc' MATCH '
a040: 64 65 66 27 20 0a 7d 20 7b 31 20 7b 75 6e 61 62  def' .} {1 {unab
a050: 6c 65 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69  le to use functi
a060: 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74 68 65 20  on MATCH in the 
a070: 72 65 71 75 65 73 74 65 64 20 63 6f 6e 74 65 78  requested contex
a080: 74 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  t}}.do_catchsql_
a090: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 39 2e 31  test e_expr-19.1
a0a0: 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 6d  .2 { .  SELECT m
a0b0: 61 74 63 68 28 27 61 62 63 27 2c 20 27 64 65 66  atch('abc', 'def
a0c0: 27 29 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20  ').} {1 {unable 
a0d0: 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20  to use function 
a0e0: 4d 41 54 43 48 20 69 6e 20 74 68 65 20 72 65 71  MATCH in the req
a0f0: 75 65 73 74 65 64 20 63 6f 6e 74 65 78 74 7d 7d  uested context}}
a100: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
a110: 20 52 2d 33 37 39 31 36 2d 34 37 34 30 37 20 54   R-37916-47407 T
a120: 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f  he MATCH operato
a130: 72 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 73  r is a special s
a140: 79 6e 74 61 78 20 66 6f 72 0a 23 20 74 68 65 20  yntax for.# the 
a150: 6d 61 74 63 68 28 29 20 61 70 70 6c 69 63 61 74  match() applicat
a160: 69 6f 6e 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ion-defined func
a170: 74 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e  tion..#.# EVIDEN
a180: 43 45 2d 4f 46 3a 20 52 2d 30 36 30 32 31 2d 30  CE-OF: R-06021-0
a190: 39 33 37 33 20 42 75 74 20 65 78 74 65 6e 73 69  9373 But extensi
a1a0: 6f 6e 73 20 63 61 6e 20 6f 76 65 72 72 69 64 65  ons can override
a1b0: 20 74 68 65 20 6d 61 74 63 68 28 29 0a 23 20 66   the match().# f
a1c0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 6f 72  unction with mor
a1d0: 65 20 68 65 6c 70 66 75 6c 20 6c 6f 67 69 63 2e  e helpful logic.
a1e0: 0a 23 0a 70 72 6f 63 20 6d 61 74 63 68 66 75 6e  .#.proc matchfun
a1f0: 63 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61  c {args} {.  eva
a200: 6c 20 6c 61 70 70 65 6e 64 20 3a 3a 6d 61 74 63  l lappend ::matc
a210: 68 61 72 67 73 20 24 61 72 67 73 0a 20 20 72 65  hargs $args.  re
a220: 74 75 72 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63  turn 1.}.db func
a230: 20 6d 61 74 63 68 20 2d 61 72 67 63 6f 75 6e 74   match -argcount
a240: 20 32 20 6d 61 74 63 68 66 75 6e 63 0a 73 65 74   2 matchfunc.set
a250: 20 3a 3a 6d 61 74 63 68 61 72 67 73 20 5b 6c 69   ::matchargs [li
a260: 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  st].do_execsql_t
a270: 65 73 74 20 65 5f 65 78 70 72 2d 31 39 2e 32 2e  est e_expr-19.2.
a280: 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 27  1 { SELECT 'abc'
a290: 20 4d 41 54 43 48 20 27 64 65 66 27 20 7d 20 31   MATCH 'def' } 1
a2a0: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
a2b0: 20 65 5f 65 78 70 72 2d 31 39 2e 32 2e 32 20 7b   e_expr-19.2.2 {
a2c0: 20 73 65 74 20 6d 61 74 63 68 61 72 67 73 20 7d   set matchargs }
a2d0: 20 7b 64 65 66 20 61 62 63 7d 0a 73 65 74 20 3a   {def abc}.set :
a2e0: 3a 6d 61 74 63 68 61 72 67 73 20 5b 6c 69 73 74  :matchargs [list
a2f0: 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ].do_execsql_tes
a300: 74 20 65 5f 65 78 70 72 2d 31 39 2e 32 2e 33 20  t e_expr-19.2.3 
a310: 7b 20 53 45 4c 45 43 54 20 27 58 27 20 4e 4f 54  { SELECT 'X' NOT
a320: 20 4d 41 54 43 48 20 27 59 27 20 7d 20 30 0a 64   MATCH 'Y' } 0.d
a330: 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 65  o_test         e
a340: 5f 65 78 70 72 2d 31 39 2e 32 2e 34 20 7b 20 73  _expr-19.2.4 { s
a350: 65 74 20 6d 61 74 63 68 61 72 67 73 20 7d 20 7b  et matchargs } {
a360: 59 20 58 7d 0a 73 71 6c 69 74 65 33 20 64 62 20  Y X}.sqlite3 db 
a370: 74 65 73 74 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d  test.db..#------
a380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3c0: 2d 2d 2d 0a 23 20 54 65 73 74 20 63 61 73 65 73  ---.# Test cases
a3d0: 20 66 6f 72 20 74 68 65 20 74 65 73 74 61 62 6c   for the testabl
a3e0: 65 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65 6c  e statements rel
a3f0: 61 74 65 64 20 74 6f 20 74 68 65 20 43 41 53 45  ated to the CASE
a400: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23 0a 23   expression..#.#
a410: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
a420: 31 35 31 39 39 2d 36 31 33 38 39 20 54 68 65 72  15199-61389 Ther
a430: 65 20 61 72 65 20 74 77 6f 20 62 61 73 69 63 20  e are two basic 
a440: 66 6f 72 6d 73 20 6f 66 20 74 68 65 20 43 41 53  forms of the CAS
a450: 45 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 3a 20  E.# expression: 
a460: 74 68 6f 73 65 20 77 69 74 68 20 61 20 62 61 73  those with a bas
a470: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
a480: 20 74 68 6f 73 65 20 77 69 74 68 6f 75 74 2e 0a   those without..
a490: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
a4a0: 74 20 65 5f 65 78 70 72 2d 32 30 2e 31 20 7b 0a  t e_expr-20.1 {.
a4b0: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48    SELECT CASE WH
a4c0: 45 4e 20 31 20 54 48 45 4e 20 27 74 72 75 65 27  EN 1 THEN 'true'
a4d0: 20 57 48 45 4e 20 30 20 54 48 45 4e 20 27 66 61   WHEN 0 THEN 'fa
a4e0: 6c 73 65 27 20 45 4c 53 45 20 27 65 6c 73 65 27  lse' ELSE 'else'
a4f0: 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a 64   END;.} {true}.d
a500: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
a510: 5f 65 78 70 72 2d 32 30 2e 32 20 7b 0a 20 20 53  _expr-20.2 {.  S
a520: 45 4c 45 43 54 20 43 41 53 45 20 30 20 57 48 45  ELECT CASE 0 WHE
a530: 4e 20 31 20 54 48 45 4e 20 27 74 72 75 65 27 20  N 1 THEN 'true' 
a540: 57 48 45 4e 20 30 20 54 48 45 4e 20 27 66 61 6c  WHEN 0 THEN 'fal
a550: 73 65 27 20 45 4c 53 45 20 27 65 6c 73 65 27 20  se' ELSE 'else' 
a560: 45 4e 44 3b 0a 7d 20 7b 66 61 6c 73 65 7d 0a 0a  END;.} {false}..
a570: 70 72 6f 63 20 76 61 72 20 7b 6e 6d 7d 20 7b 0a  proc var {nm} {.
a580: 20 20 6c 61 70 70 65 6e 64 20 3a 3a 76 61 72 6c    lappend ::varl
a590: 69 73 74 20 24 6e 6d 0a 20 20 72 65 74 75 72 6e  ist $nm.  return
a5a0: 20 5b 73 65 74 20 22 3a 3a 24 6e 6d 22 5d 0a 7d   [set "::$nm"].}
a5b0: 0a 64 62 20 66 75 6e 63 20 76 61 72 20 76 61 72  .db func var var
a5c0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
a5d0: 20 52 2d 33 30 36 33 38 2d 35 39 39 35 34 20 49   R-30638-59954 I
a5e0: 6e 20 61 20 43 41 53 45 20 77 69 74 68 6f 75 74  n a CASE without
a5f0: 20 61 20 62 61 73 65 20 65 78 70 72 65 73 73 69   a base expressi
a600: 6f 6e 2c 20 65 61 63 68 0a 23 20 57 48 45 4e 20  on, each.# WHEN 
a610: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76  expression is ev
a620: 61 6c 75 61 74 65 64 20 61 6e 64 20 74 68 65 20  aluated and the 
a630: 72 65 73 75 6c 74 20 74 72 65 61 74 65 64 20 61  result treated a
a640: 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 0a 23 20 73  s a boolean,.# s
a650: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
a660: 20 6c 65 66 74 6d 6f 73 74 20 61 6e 64 20 63 6f   leftmost and co
a670: 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
a680: 72 69 67 68 74 2e 0a 23 0a 66 6f 72 65 61 63 68  right..#.foreach
a690: 20 7b 61 20 62 20 63 7d 20 7b 30 20 30 20 30 7d   {a b c} {0 0 0}
a6a0: 20 62 72 65 61 6b 0a 73 65 74 20 76 61 72 6c 69   break.set varli
a6b0: 73 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65  st [list].do_exe
a6c0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
a6d0: 2d 32 31 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45  -21.1.1 {.  SELE
a6e0: 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61 72  CT CASE WHEN var
a6f0: 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a  ('a') THEN 'A' .
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
a710: 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e  EN var('b') THEN
a720: 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20   'B' .          
a730: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63 27      WHEN var('c'
a740: 29 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d  ) THEN 'C' END.}
a750: 20 7b 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f   {{}}.do_test e_
a760: 65 78 70 72 2d 32 31 2e 31 2e 32 20 7b 20 73 65  expr-21.1.2 { se
a770: 74 20 76 61 72 6c 69 73 74 20 7d 20 7b 61 20 62  t varlist } {a b
a780: 20 63 7d 0a 73 65 74 20 76 61 72 6c 69 73 74 20   c}.set varlist 
a790: 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71  [list].do_execsq
a7a0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31  l_test e_expr-21
a7b0: 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.3 {.  SELECT 
a7c0: 43 41 53 45 20 57 48 45 4e 20 76 61 72 28 27 63  CASE WHEN var('c
a7d0: 27 29 20 54 48 45 4e 20 27 43 27 20 0a 20 20 20  ') THEN 'C' .   
a7e0: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
a7f0: 76 61 72 28 27 62 27 29 20 54 48 45 4e 20 27 42  var('b') THEN 'B
a800: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
a810: 20 57 48 45 4e 20 76 61 72 28 27 61 27 29 20 54   WHEN var('a') T
a820: 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20  HEN 'A' .       
a830: 20 20 20 20 20 20 20 45 4c 53 45 20 27 6e 6f 20         ELSE 'no 
a840: 72 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20  result'.  END.} 
a850: 7b 7b 6e 6f 20 72 65 73 75 6c 74 7d 7d 0a 64 6f  {{no result}}.do
a860: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e  _test e_expr-21.
a870: 31 2e 34 20 7b 20 73 65 74 20 76 61 72 6c 69 73  1.4 { set varlis
a880: 74 20 7d 20 7b 63 20 62 20 61 7d 0a 0a 23 20 45  t } {c b a}..# E
a890: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39  VIDENCE-OF: R-39
a8a0: 30 30 39 2d 32 35 35 39 36 20 54 68 65 20 72 65  009-25596 The re
a8b0: 73 75 6c 74 20 6f 66 20 74 68 65 20 43 41 53 45  sult of the CASE
a8c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
a8d0: 68 65 0a 23 20 65 76 61 6c 75 61 74 69 6f 6e 20  he.# evaluation 
a8e0: 6f 66 20 74 68 65 20 54 48 45 4e 20 65 78 70 72  of the THEN expr
a8f0: 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 72 72  ession that corr
a900: 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 66  esponds to the f
a910: 69 72 73 74 20 57 48 45 4e 0a 23 20 65 78 70 72  irst WHEN.# expr
a920: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 76 61 6c  ession that eval
a930: 75 61 74 65 73 20 74 6f 20 74 72 75 65 2e 0a 23  uates to true..#
a940: 0a 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d  .foreach {a b c}
a950: 20 7b 30 20 31 20 30 7d 20 62 72 65 61 6b 0a 64   {0 1 0} break.d
a960: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
a970: 5f 65 78 70 72 2d 32 31 2e 32 2e 31 20 7b 0a 20  _expr-21.2.1 {. 
a980: 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
a990: 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20  N var('a') THEN 
a9a0: 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'A' .           
a9b0: 20 20 20 57 48 45 4e 20 76 61 72 28 27 62 27 29     WHEN var('b')
a9c0: 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20   THEN 'B' .     
a9d0: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
a9e0: 72 28 27 63 27 29 20 54 48 45 4e 20 27 43 27 20  r('c') THEN 'C' 
a9f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
aa00: 4c 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a  LSE 'no result'.
aa10: 20 20 45 4e 44 0a 7d 20 7b 42 7d 0a 66 6f 72 65    END.} {B}.fore
aa20: 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20 31  ach {a b c} {0 1
aa30: 20 31 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78 65   1} break.do_exe
aa40: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
aa50: 2d 32 31 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45  -21.2.2 {.  SELE
aa60: 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61 72  CT CASE WHEN var
aa70: 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a  ('a') THEN 'A' .
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
aa90: 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e  EN var('b') THEN
aaa0: 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20   'B' .          
aab0: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63 27      WHEN var('c'
aac0: 29 20 54 48 45 4e 20 27 43 27 0a 20 20 20 20 20  ) THEN 'C'.     
aad0: 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 27 6e           ELSE 'n
aae0: 6f 20 72 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a  o result'.  END.
aaf0: 7d 20 7b 42 7d 0a 66 6f 72 65 61 63 68 20 7b 61  } {B}.foreach {a
ab00: 20 62 20 63 7d 20 7b 30 20 30 20 31 7d 20 62 72   b c} {0 0 1} br
ab10: 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  eak.do_execsql_t
ab20: 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 32 2e  est e_expr-21.2.
ab30: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  3 {.  SELECT CAS
ab40: 45 20 57 48 45 4e 20 76 61 72 28 27 61 27 29 20  E WHEN var('a') 
ab50: 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20  THEN 'A' .      
ab60: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
ab70: 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a  ('b') THEN 'B' .
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
ab90: 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45 4e  EN var('c') THEN
aba0: 20 27 43 27 0a 20 20 20 20 20 20 20 20 20 20 20   'C'.           
abb0: 20 20 20 45 4c 53 45 20 27 6e 6f 20 72 65 73 75     ELSE 'no resu
abc0: 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 43 7d 0a  lt'.  END.} {C}.
abd0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
abe0: 52 2d 32 34 32 32 37 2d 30 34 38 30 37 20 4f 72  R-24227-04807 Or
abf0: 2c 20 69 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  , if none of the
ac00: 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e   WHEN expression
ac10: 73 0a 23 20 65 76 61 6c 75 61 74 65 20 74 6f 20  s.# evaluate to 
ac20: 74 72 75 65 2c 20 74 68 65 20 72 65 73 75 6c 74  true, the result
ac30: 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67 20 74   of evaluating t
ac40: 68 65 20 45 4c 53 45 20 65 78 70 72 65 73 73 69  he ELSE expressi
ac50: 6f 6e 2c 20 69 66 0a 23 20 61 6e 79 2e 0a 23 0a  on, if.# any..#.
ac60: 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20  foreach {a b c} 
ac70: 7b 30 20 30 20 30 7d 20 62 72 65 61 6b 0a 64 6f  {0 0 0} break.do
ac80: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
ac90: 65 78 70 72 2d 32 31 2e 33 2e 31 20 7b 0a 20 20  expr-21.3.1 {.  
aca0: 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
acb0: 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20 27   var('a') THEN '
acc0: 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  A' .            
acd0: 20 20 57 48 45 4e 20 76 61 72 28 27 62 27 29 20    WHEN var('b') 
ace0: 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20  THEN 'B' .      
acf0: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
ad00: 28 27 63 27 29 20 54 48 45 4e 20 27 43 27 0a 20  ('c') THEN 'C'. 
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c 53               ELS
ad20: 45 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20  E 'no result'.  
ad30: 45 4e 44 0a 7d 20 7b 7b 6e 6f 20 72 65 73 75 6c  END.} {{no resul
ad40: 74 7d 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  t}}..# EVIDENCE-
ad50: 4f 46 3a 20 52 2d 31 34 31 36 38 2d 30 37 35 37  OF: R-14168-0757
ad60: 39 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  9 If there is no
ad70: 20 45 4c 53 45 20 65 78 70 72 65 73 73 69 6f 6e   ELSE expression
ad80: 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 0a 23 20 74   and none of.# t
ad90: 68 65 20 57 48 45 4e 20 65 78 70 72 65 73 73 69  he WHEN expressi
ada0: 6f 6e 73 20 61 72 65 20 74 72 75 65 2c 20 74 68  ons are true, th
adb0: 65 6e 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 72  en the overall r
adc0: 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 23  esult is NULL..#
add0: 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 6e 75  .db nullvalue nu
ade0: 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  ll.do_execsql_te
adf0: 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 33 2e 32  st e_expr-21.3.2
ae00: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
ae10: 20 57 48 45 4e 20 76 61 72 28 27 61 27 29 20 54   WHEN var('a') T
ae20: 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20  HEN 'A' .       
ae30: 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28         WHEN var(
ae40: 27 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20  'b') THEN 'B' . 
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
ae60: 4e 20 76 61 72 28 27 63 27 29 20 54 48 45 4e 20  N var('c') THEN 
ae70: 27 43 27 0a 20 20 45 4e 44 0a 7d 20 7b 6e 75 6c  'C'.  END.} {nul
ae80: 6c 7d 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20  l}.db nullvalue 
ae90: 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  {}..# EVIDENCE-O
aea0: 46 3a 20 52 2d 31 33 39 34 33 2d 31 33 35 39 32  F: R-13943-13592
aeb0: 20 41 20 4e 55 4c 4c 20 72 65 73 75 6c 74 20 69   A NULL result i
aec0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 75 6e 74  s considered unt
aed0: 72 75 65 20 77 68 65 6e 0a 23 20 65 76 61 6c 75  rue when.# evalu
aee0: 61 74 69 6e 67 20 57 48 45 4e 20 74 65 72 6d 73  ating WHEN terms
aef0: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
af00: 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 34 2e  est e_expr-21.4.
af10: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  1 {.  SELECT CAS
af20: 45 20 57 48 45 4e 20 4e 55 4c 4c 20 54 48 45 4e  E WHEN NULL THEN
af30: 20 27 41 27 20 57 48 45 4e 20 31 20 54 48 45 4e   'A' WHEN 1 THEN
af40: 20 27 42 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64   'B' END.} {B}.d
af50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
af60: 5f 65 78 70 72 2d 32 31 2e 34 2e 32 20 7b 0a 20  _expr-21.4.2 {. 
af70: 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
af80: 4e 20 30 20 54 48 45 4e 20 27 41 27 20 57 48 45  N 0 THEN 'A' WHE
af90: 4e 20 4e 55 4c 4c 20 54 48 45 4e 20 27 42 27 20  N NULL THEN 'B' 
afa0: 45 4c 53 45 20 27 43 27 20 45 4e 44 0a 7d 20 7b  ELSE 'C' END.} {
afb0: 43 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  C}..# EVIDENCE-O
afc0: 46 3a 20 52 2d 33 38 36 32 30 2d 31 39 34 39 39  F: R-38620-19499
afd0: 20 49 6e 20 61 20 43 41 53 45 20 77 69 74 68 20   In a CASE with 
afe0: 61 20 62 61 73 65 20 65 78 70 72 65 73 73 69 6f  a base expressio
aff0: 6e 2c 20 74 68 65 20 62 61 73 65 0a 23 20 65 78  n, the base.# ex
b000: 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
b010: 75 61 74 65 64 20 6a 75 73 74 20 6f 6e 63 65 20  uated just once 
b020: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 69  and the result i
b030: 73 20 63 6f 6d 70 61 72 65 64 20 61 67 61 69 6e  s compared again
b040: 73 74 0a 23 20 74 68 65 20 65 76 61 6c 75 61 74  st.# the evaluat
b050: 69 6f 6e 20 6f 66 20 65 61 63 68 20 57 48 45 4e  ion of each WHEN
b060: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
b070: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
b080: 23 0a 23 20 4e 6f 74 65 3a 20 54 68 69 73 20 74  #.# Note: This t
b090: 65 73 74 20 63 61 73 65 20 74 65 73 74 73 20 74  est case tests t
b0a0: 68 65 20 22 65 76 61 6c 75 61 74 65 64 20 6a 75  he "evaluated ju
b0b0: 73 74 20 6f 6e 63 65 22 20 70 61 72 74 20 6f 66  st once" part of
b0c0: 20 74 68 65 20 61 62 6f 76 65 0a 23 20 73 74 61   the above.# sta
b0d0: 74 65 6d 65 6e 74 2e 20 54 65 73 74 73 20 61 73  tement. Tests as
b0e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
b0f0: 65 20 6e 65 78 74 20 74 77 6f 20 73 74 61 74 65  e next two state
b100: 6d 65 6e 74 73 20 74 65 73 74 20 74 68 61 74 20  ments test that 
b110: 74 68 65 0a 23 20 63 6f 6d 70 61 72 69 73 6f 6e  the.# comparison
b120: 73 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 23 0a  s take place..#.
b130: 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20  foreach {a b c} 
b140: 5b 6c 69 73 74 20 5b 65 78 70 72 20 33 5d 20 5b  [list [expr 3] [
b150: 65 78 70 72 20 34 5d 20 5b 65 78 70 72 20 35 5d  expr 4] [expr 5]
b160: 5d 20 62 72 65 61 6b 0a 73 65 74 20 3a 3a 76 61  ] break.set ::va
b170: 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f  rlist [list].do_
b180: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
b190: 78 70 72 2d 32 32 2e 31 2e 31 20 7b 0a 20 20 53  xpr-22.1.1 {.  S
b1a0: 45 4c 45 43 54 20 43 41 53 45 20 76 61 72 28 27  ELECT CASE var('
b1b0: 61 27 29 20 57 48 45 4e 20 31 20 54 48 45 4e 20  a') WHEN 1 THEN 
b1c0: 27 41 27 20 57 48 45 4e 20 32 20 54 48 45 4e 20  'A' WHEN 2 THEN 
b1d0: 27 42 27 20 57 48 45 4e 20 33 20 54 48 45 4e 20  'B' WHEN 3 THEN 
b1e0: 27 43 27 20 45 4e 44 0a 7d 20 7b 43 7d 0a 64 6f  'C' END.} {C}.do
b1f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e  _test e_expr-22.
b200: 31 2e 32 20 7b 20 73 65 74 20 3a 3a 76 61 72 6c  1.2 { set ::varl
b210: 69 73 74 20 7d 20 7b 61 7d 0a 0a 23 20 45 56 49  ist } {a}..# EVI
b220: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 36 36  DENCE-OF: R-0766
b230: 37 2d 34 39 35 33 37 20 54 68 65 20 72 65 73 75  7-49537 The resu
b240: 6c 74 20 6f 66 20 74 68 65 20 43 41 53 45 20 65  lt of the CASE e
b250: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
b260: 0a 23 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66  .# evaluation of
b270: 20 74 68 65 20 54 48 45 4e 20 65 78 70 72 65 73   the THEN expres
b280: 73 69 6f 6e 20 74 68 61 74 20 63 6f 72 72 65 73  sion that corres
b290: 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 66 69 72  ponds to the fir
b2a0: 73 74 20 57 48 45 4e 0a 23 20 65 78 70 72 65 73  st WHEN.# expres
b2b0: 73 69 6f 6e 20 66 6f 72 20 77 68 69 63 68 20 74  sion for which t
b2c0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
b2d0: 20 74 72 75 65 2e 0a 23 0a 64 6f 5f 65 78 65 63   true..#.do_exec
b2e0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
b2f0: 32 32 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43  22.2.1 {.  SELEC
b300: 54 20 43 41 53 45 20 32 33 20 57 48 45 4e 20 31  T CASE 23 WHEN 1
b310: 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32   THEN 'A' WHEN 2
b320: 33 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20  3 THEN 'B' WHEN 
b330: 32 33 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a  23 THEN 'C' END.
b340: 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {B}.do_execsql
b350: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e  _test e_expr-22.
b360: 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  2.2 {.  SELECT C
b370: 41 53 45 20 31 20 57 48 45 4e 20 31 20 54 48 45  ASE 1 WHEN 1 THE
b380: 4e 20 27 41 27 20 57 48 45 4e 20 32 33 20 54 48  N 'A' WHEN 23 TH
b390: 45 4e 20 27 42 27 20 57 48 45 4e 20 32 33 20 54  EN 'B' WHEN 23 T
b3a0: 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20 7b 41  HEN 'C' END.} {A
b3b0: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
b3c0: 3a 20 52 2d 34 37 35 34 33 2d 33 32 31 34 35 20  : R-47543-32145 
b3d0: 4f 72 2c 20 69 66 20 6e 6f 6e 65 20 6f 66 20 74  Or, if none of t
b3e0: 68 65 20 57 48 45 4e 20 65 78 70 72 65 73 73 69  he WHEN expressi
b3f0: 6f 6e 73 0a 23 20 65 76 61 6c 75 61 74 65 20 74  ons.# evaluate t
b400: 6f 20 61 20 76 61 6c 75 65 20 65 71 75 61 6c 20  o a value equal 
b410: 74 6f 20 74 68 65 20 62 61 73 65 20 65 78 70 72  to the base expr
b420: 65 73 73 69 6f 6e 2c 20 74 68 65 20 72 65 73 75  ession, the resu
b430: 6c 74 20 6f 66 0a 23 20 65 76 61 6c 75 61 74 69  lt of.# evaluati
b440: 6e 67 20 74 68 65 20 45 4c 53 45 20 65 78 70 72  ng the ELSE expr
b450: 65 73 73 69 6f 6e 2c 20 69 66 20 61 6e 79 2e 0a  ession, if any..
b460: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
b470: 74 20 65 5f 65 78 70 72 2d 32 32 2e 33 2e 31 20  t e_expr-22.3.1 
b480: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
b490: 32 34 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27  24 WHEN 1 THEN '
b4a0: 41 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20  A' WHEN 23 THEN 
b4b0: 27 42 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e  'B' WHEN 23 THEN
b4c0: 20 27 43 27 20 45 4c 53 45 20 27 44 27 20 45 4e   'C' ELSE 'D' EN
b4d0: 44 0a 7d 20 7b 44 7d 0a 0a 23 20 45 56 49 44 45  D.} {D}..# EVIDE
b4e0: 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 37 32 31 2d  NCE-OF: R-54721-
b4f0: 34 38 35 35 37 20 49 66 20 74 68 65 72 65 20 69  48557 If there i
b500: 73 20 6e 6f 20 45 4c 53 45 20 65 78 70 72 65 73  s no ELSE expres
b510: 73 69 6f 6e 20 61 6e 64 20 6e 6f 6e 65 20 6f 66  sion and none of
b520: 0a 23 20 74 68 65 20 57 48 45 4e 20 65 78 70 72  .# the WHEN expr
b530: 65 73 73 69 6f 6e 73 20 70 72 6f 64 75 63 65 20  essions produce 
b540: 61 20 72 65 73 75 6c 74 20 65 71 75 61 6c 20 74  a result equal t
b550: 6f 20 74 68 65 20 62 61 73 65 20 65 78 70 72 65  o the base expre
b560: 73 73 69 6f 6e 2c 0a 23 20 74 68 65 20 6f 76 65  ssion,.# the ove
b570: 72 61 6c 6c 20 72 65 73 75 6c 74 20 69 73 20 4e  rall result is N
b580: 55 4c 4c 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ULL..#.do_execsq
b590: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32  l_test e_expr-22
b5a0: 2e 34 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  .4.1 {.  SELECT 
b5b0: 43 41 53 45 20 32 34 20 57 48 45 4e 20 31 20 54  CASE 24 WHEN 1 T
b5c0: 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32 33 20  HEN 'A' WHEN 23 
b5d0: 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20 32 33  THEN 'B' WHEN 23
b5e0: 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20   THEN 'C' END.} 
b5f0: 7b 7b 7d 7d 0a 64 62 20 6e 75 6c 6c 76 61 6c 75  {{}}.db nullvalu
b600: 65 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71  e null.do_execsq
b610: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32  l_test e_expr-22
b620: 2e 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .4.2 {.  SELECT 
b630: 43 41 53 45 20 32 34 20 57 48 45 4e 20 31 20 54  CASE 24 WHEN 1 T
b640: 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32 33 20  HEN 'A' WHEN 23 
b650: 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20 32 33  THEN 'B' WHEN 23
b660: 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20   THEN 'C' END.} 
b670: 7b 6e 75 6c 6c 7d 0a 64 62 20 6e 75 6c 6c 76 61  {null}.db nullva
b680: 6c 75 65 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e  lue {}..# EVIDEN
b690: 43 45 2d 4f 46 3a 20 52 2d 31 31 34 37 39 2d 36  CE-OF: R-11479-6
b6a0: 32 37 37 34 20 57 68 65 6e 20 63 6f 6d 70 61 72  2774 When compar
b6b0: 69 6e 67 20 61 20 62 61 73 65 20 65 78 70 72 65  ing a base expre
b6c0: 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61 0a  ssion against a.
b6d0: 23 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f  # WHEN expressio
b6e0: 6e 2c 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c  n, the same coll
b6f0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2c 20  ating sequence, 
b700: 61 66 66 69 6e 69 74 79 2c 20 61 6e 64 0a 23 20  affinity, and.# 
b710: 4e 55 4c 4c 2d 68 61 6e 64 6c 69 6e 67 20 72 75  NULL-handling ru
b720: 6c 65 73 20 61 70 70 6c 79 20 61 73 20 69 66 20  les apply as if 
b730: 74 68 65 20 62 61 73 65 20 65 78 70 72 65 73 73  the base express
b740: 69 6f 6e 20 61 6e 64 20 57 48 45 4e 0a 23 20 65  ion and WHEN.# e
b750: 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 72 65  xpression are re
b760: 73 70 65 63 74 69 76 65 6c 79 20 74 68 65 20 6c  spectively the l
b770: 65 66 74 2d 20 61 6e 64 20 72 69 67 68 74 2d 68  eft- and right-h
b780: 61 6e 64 20 6f 70 65 72 61 6e 64 73 20 6f 66 20  and operands of 
b790: 61 6e 20 3d 0a 23 20 6f 70 65 72 61 74 6f 72 2e  an =.# operator.
b7a0: 0a 23 0a 70 72 6f 63 20 72 65 76 20 7b 73 74 72  .#.proc rev {str
b7b0: 7d 20 7b 0a 20 20 73 65 74 20 72 65 74 20 22 22  } {.  set ret ""
b7c0: 0a 20 20 73 65 74 20 63 68 61 72 73 20 5b 73 70  .  set chars [sp
b7d0: 6c 69 74 20 24 73 74 72 5d 0a 20 20 66 6f 72 20  lit $str].  for 
b7e0: 7b 73 65 74 20 69 20 5b 65 78 70 72 20 5b 6c 6c  {set i [expr [ll
b7f0: 65 6e 67 74 68 20 24 63 68 61 72 73 5d 2d 31 5d  ength $chars]-1]
b800: 7d 20 7b 24 69 3e 3d 30 7d 20 7b 69 6e 63 72 20  } {$i>=0} {incr 
b810: 69 20 2d 31 7d 20 7b 0a 20 20 20 20 61 70 70 65  i -1} {.    appe
b820: 6e 64 20 72 65 74 20 5b 6c 69 6e 64 65 78 20 24  nd ret [lindex $
b830: 63 68 61 72 73 20 24 69 5d 0a 20 20 7d 0a 20 20  chars $i].  }.  
b840: 73 65 74 20 72 65 74 0a 7d 0a 70 72 6f 63 20 72  set ret.}.proc r
b850: 65 76 65 72 73 65 20 7b 6c 68 73 20 72 68 73 7d  everse {lhs rhs}
b860: 20 7b 0a 20 20 73 74 72 69 6e 67 20 63 6f 6d 70   {.  string comp
b870: 61 72 65 20 5b 72 65 76 20 24 6c 68 73 5d 20 5b  are [rev $lhs] [
b880: 72 65 76 20 24 72 68 73 5d 0a 7d 0a 64 62 20 63  rev $rhs].}.db c
b890: 6f 6c 6c 61 74 65 20 72 65 76 65 72 73 65 20 72  ollate reverse r
b8a0: 65 76 65 72 73 65 0a 64 6f 5f 65 78 65 63 73 71  everse.do_execsq
b8b0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33  l_test e_expr-23
b8c0: 2e 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  .1.1 {.  CREATE 
b8d0: 54 41 42 4c 45 20 74 31 28 0a 20 20 20 20 61 20  TABLE t1(.    a 
b8e0: 54 45 58 54 20 20 20 20 20 43 4f 4c 4c 41 54 45  TEXT     COLLATE
b8f0: 20 4e 4f 43 41 53 45 2c 0a 20 20 20 20 62 20 20   NOCASE,.    b  
b900: 20 20 20 20 20 20 20 20 43 4f 4c 4c 41 54 45 20          COLLATE 
b910: 52 45 56 45 52 53 45 2c 0a 20 20 20 20 63 20 49  REVERSE,.    c I
b920: 4e 54 45 47 45 52 2c 0a 20 20 20 20 64 20 42 4c  NTEGER,.    d BL
b930: 4f 42 0a 20 20 29 3b 0a 20 20 49 4e 53 45 52 54  OB.  );.  INSERT
b940: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
b950: 27 61 62 63 27 2c 20 27 63 62 61 27 2c 20 35 35  'abc', 'cba', 55
b960: 2c 20 33 34 2e 35 29 3b 0a 7d 20 7b 7d 0a 64 6f  , 34.5);.} {}.do
b970: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
b980: 65 78 70 72 2d 32 33 2e 31 2e 32 20 7b 0a 20 20  expr-23.1.2 {.  
b990: 53 45 4c 45 43 54 20 43 41 53 45 20 61 20 57 48  SELECT CASE a WH
b9a0: 45 4e 20 27 78 79 7a 27 20 54 48 45 4e 20 27 41  EN 'xyz' THEN 'A
b9b0: 27 20 57 48 45 4e 20 27 41 62 43 27 20 54 48 45  ' WHEN 'AbC' THE
b9c0: 4e 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20 74  N 'B' END FROM t
b9d0: 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73  1.} {B}.do_execs
b9e0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
b9f0: 33 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  3.1.3 {.  SELECT
ba00: 20 43 41 53 45 20 27 41 62 43 27 20 57 48 45 4e   CASE 'AbC' WHEN
ba10: 20 27 61 62 63 27 20 54 48 45 4e 20 27 41 27 20   'abc' THEN 'A' 
ba20: 57 48 45 4e 20 61 20 54 48 45 4e 20 27 42 27 20  WHEN a THEN 'B' 
ba30: 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 42  END FROM t1.} {B
ba40: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
ba50: 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 34 20  t e_expr-23.1.4 
ba60: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
ba70: 61 20 57 48 45 4e 20 62 20 54 48 45 4e 20 27 41  a WHEN b THEN 'A
ba80: 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 20 46  ' ELSE 'B' END F
ba90: 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f  ROM t1.} {B}.do_
baa0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
bab0: 78 70 72 2d 32 33 2e 31 2e 35 20 7b 0a 20 20 53  xpr-23.1.5 {.  S
bac0: 45 4c 45 43 54 20 43 41 53 45 20 62 20 57 48 45  ELECT CASE b WHE
bad0: 4e 20 61 20 54 48 45 4e 20 27 41 27 20 45 4c 53  N a THEN 'A' ELS
bae0: 45 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20 74  E 'B' END FROM t
baf0: 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73  1.} {B}.do_execs
bb00: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
bb10: 33 2e 31 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54  3.1.6 {.  SELECT
bb20: 20 43 41 53 45 20 35 35 20 57 48 45 4e 20 27 35   CASE 55 WHEN '5
bb30: 35 27 20 54 48 45 4e 20 27 41 27 20 45 4c 53 45  5' THEN 'A' ELSE
bb40: 20 27 42 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64   'B' END.} {B}.d
bb50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
bb60: 5f 65 78 70 72 2d 32 33 2e 31 2e 37 20 7b 0a 20  _expr-23.1.7 {. 
bb70: 20 53 45 4c 45 43 54 20 43 41 53 45 20 63 20 57   SELECT CASE c W
bb80: 48 45 4e 20 27 35 35 27 20 54 48 45 4e 20 27 41  HEN '55' THEN 'A
bb90: 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 20 46  ' ELSE 'B' END F
bba0: 52 4f 4d 20 74 31 0a 7d 20 7b 41 7d 0a 64 6f 5f  ROM t1.} {A}.do_
bbb0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
bbc0: 78 70 72 2d 32 33 2e 31 2e 38 20 7b 0a 20 20 53  xpr-23.1.8 {.  S
bbd0: 45 4c 45 43 54 20 43 41 53 45 20 27 33 34 2e 35  ELECT CASE '34.5
bbe0: 27 20 57 48 45 4e 20 64 20 54 48 45 4e 20 27 41  ' WHEN d THEN 'A
bbf0: 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 20 46  ' ELSE 'B' END F
bc00: 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f  ROM t1.} {B}.do_
bc10: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
bc20: 78 70 72 2d 32 33 2e 31 2e 39 20 7b 0a 20 20 53  xpr-23.1.9 {.  S
bc30: 45 4c 45 43 54 20 43 41 53 45 20 4e 55 4c 4c 20  ELECT CASE NULL 
bc40: 57 48 45 4e 20 4e 55 4c 4c 20 54 48 45 4e 20 27  WHEN NULL THEN '
bc50: 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 0a  A' ELSE 'B' END.
bc60: 7d 20 7b 42 7d 0a 0a 23 20 45 56 49 44 45 4e 43  } {B}..# EVIDENC
bc70: 45 2d 4f 46 3a 20 52 2d 33 37 33 30 34 2d 33 39  E-OF: R-37304-39
bc80: 34 30 35 20 49 66 20 74 68 65 20 62 61 73 65 20  405 If the base 
bc90: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 4e 55  expression is NU
bca0: 4c 4c 20 74 68 65 6e 20 74 68 65 0a 23 20 72 65  LL then the.# re
bcb0: 73 75 6c 74 20 6f 66 20 74 68 65 20 43 41 53 45  sult of the CASE
bcc0: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 72   is always the r
bcd0: 65 73 75 6c 74 20 6f 66 20 65 76 61 6c 75 61 74  esult of evaluat
bce0: 69 6e 67 20 74 68 65 20 45 4c 53 45 0a 23 20 65  ing the ELSE.# e
bcf0: 78 70 72 65 73 73 69 6f 6e 20 69 66 20 69 74 20  xpression if it 
bd00: 65 78 69 73 74 73 2c 20 6f 72 20 4e 55 4c 4c 20  exists, or NULL 
bd10: 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
bd20: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
bd30: 74 20 65 5f 65 78 70 72 2d 32 34 2e 31 2e 31 20  t e_expr-24.1.1 
bd40: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
bd50: 4e 55 4c 4c 20 57 48 45 4e 20 27 61 62 63 27 20  NULL WHEN 'abc' 
bd60: 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 27 64  THEN 'A' WHEN 'd
bd70: 65 66 27 20 54 48 45 4e 20 27 42 27 20 45 4e 44  ef' THEN 'B' END
bd80: 3b 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63  ;.} {{}}.do_exec
bd90: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
bda0: 32 34 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43  24.1.2 {.  SELEC
bdb0: 54 20 43 41 53 45 20 4e 55 4c 4c 20 57 48 45 4e  T CASE NULL WHEN
bdc0: 20 27 61 62 63 27 20 54 48 45 4e 20 27 41 27 20   'abc' THEN 'A' 
bdd0: 57 48 45 4e 20 27 64 65 66 27 20 54 48 45 4e 20  WHEN 'def' THEN 
bde0: 27 42 27 20 45 4c 53 45 20 27 43 27 20 45 4e 44  'B' ELSE 'C' END
bdf0: 3b 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56 49 44 45  ;.} {C}..# EVIDE
be00: 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 32 38 30 2d  NCE-OF: R-56280-
be10: 31 37 33 36 39 20 42 6f 74 68 20 66 6f 72 6d 73  17369 Both forms
be20: 20 6f 66 20 74 68 65 20 43 41 53 45 20 65 78 70   of the CASE exp
be30: 72 65 73 73 69 6f 6e 20 75 73 65 20 6c 61 7a 79  ression use lazy
be40: 2c 0a 23 20 6f 72 20 73 68 6f 72 74 2d 63 69 72  ,.# or short-cir
be50: 63 75 69 74 2c 20 65 76 61 6c 75 61 74 69 6f 6e  cuit, evaluation
be60: 2e 0a 23 0a 73 65 74 20 76 61 72 6c 69 73 74 20  ..#.set varlist 
be70: 5b 6c 69 73 74 5d 0a 66 6f 72 65 61 63 68 20 7b  [list].foreach {
be80: 61 20 62 20 63 7d 20 7b 30 20 31 20 30 7d 20 62  a b c} {0 1 0} b
be90: 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  reak.do_execsql_
bea0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 35 2e 31  test e_expr-25.1
beb0: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .1 {.  SELECT CA
bec0: 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27 29  SE WHEN var('a')
bed0: 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20   THEN 'A' .     
bee0: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
bef0: 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20  r('b') THEN 'B' 
bf00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
bf10: 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45  HEN var('c') THE
bf20: 4e 20 27 43 27 20 0a 20 20 45 4e 44 0a 7d 20 7b  N 'C' .  END.} {
bf30: 42 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70  B}.do_test e_exp
bf40: 72 2d 32 35 2e 31 2e 32 20 7b 20 73 65 74 20 3a  r-25.1.2 { set :
bf50: 3a 76 61 72 6c 69 73 74 20 7d 20 7b 61 20 62 7d  :varlist } {a b}
bf60: 0a 73 65 74 20 76 61 72 6c 69 73 74 20 5b 6c 69  .set varlist [li
bf70: 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  st].do_execsql_t
bf80: 65 73 74 20 65 5f 65 78 70 72 2d 32 35 2e 31 2e  est e_expr-25.1.
bf90: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  3 {.  SELECT CAS
bfa0: 45 20 27 30 27 20 57 48 45 4e 20 76 61 72 28 27  E '0' WHEN var('
bfb0: 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20  a') THEN 'A' .  
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfd0: 57 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48  WHEN var('b') TH
bfe0: 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20  EN 'B' .        
bff0: 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76            WHEN v
c000: 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43 27  ar('c') THEN 'C'
c010: 20 0a 20 20 45 4e 44 0a 7d 20 7b 41 7d 0a 64 6f   .  END.} {A}.do
c020: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 35 2e  _test e_expr-25.
c030: 31 2e 34 20 7b 20 73 65 74 20 3a 3a 76 61 72 6c  1.4 { set ::varl
c040: 69 73 74 20 7d 20 7b 61 7d 0a 0a 23 20 45 56 49  ist } {a}..# EVI
c050: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 37 37  DENCE-OF: R-3477
c060: 33 2d 36 32 32 35 33 20 54 68 65 20 6f 6e 6c 79  3-62253 The only
c070: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
c080: 65 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  een the followin
c090: 67 0a 23 20 74 77 6f 20 43 41 53 45 20 65 78 70  g.# two CASE exp
c0a0: 72 65 73 73 69 6f 6e 73 20 69 73 20 74 68 61 74  ressions is that
c0b0: 20 74 68 65 20 78 20 65 78 70 72 65 73 73 69 6f   the x expressio
c0c0: 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 65  n is evaluated e
c0d0: 78 61 63 74 6c 79 0a 23 20 6f 6e 63 65 20 69 6e  xactly.# once in
c0e0: 20 74 68 65 20 66 69 72 73 74 20 65 78 61 6d 70   the first examp
c0f0: 6c 65 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  le but might be 
c100: 65 76 61 6c 75 61 74 65 64 20 6d 75 6c 74 69 70  evaluated multip
c110: 6c 65 20 74 69 6d 65 73 20 69 6e 20 74 68 65 0a  le times in the.
c120: 23 20 73 65 63 6f 6e 64 3a 20 43 41 53 45 20 78  # second: CASE x
c130: 20 57 48 45 4e 20 77 31 20 54 48 45 4e 20 72 31   WHEN w1 THEN r1
c140: 20 57 48 45 4e 20 77 32 20 54 48 45 4e 20 72 32   WHEN w2 THEN r2
c150: 20 45 4c 53 45 20 72 33 20 45 4e 44 20 43 41 53   ELSE r3 END CAS
c160: 45 20 57 48 45 4e 0a 23 20 78 3d 77 31 20 54 48  E WHEN.# x=w1 TH
c170: 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 77 32 20  EN r1 WHEN x=w2 
c180: 54 48 45 4e 20 72 32 20 45 4c 53 45 20 72 33 20  THEN r2 ELSE r3 
c190: 45 4e 44 0a 23 0a 70 72 6f 63 20 63 65 76 61 6c  END.#.proc ceval
c1a0: 20 7b 78 7d 20 7b 0a 20 20 69 6e 63 72 20 3a 3a   {x} {.  incr ::
c1b0: 65 76 61 6c 63 6f 75 6e 74 0a 20 20 72 65 74 75  evalcount.  retu
c1c0: 72 6e 20 24 78 0a 7d 0a 64 62 20 66 75 6e 63 20  rn $x.}.db func 
c1d0: 63 65 76 61 6c 20 63 65 76 61 6c 0a 73 65 74 20  ceval ceval.set 
c1e0: 3a 3a 65 76 61 6c 63 6f 75 6e 74 20 30 0a 0a 64  ::evalcount 0..d
c1f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
c200: 5f 65 78 70 72 2d 32 36 2e 31 2e 31 20 7b 0a 20  _expr-26.1.1 {. 
c210: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
c220: 28 78 2c 20 77 31 2c 20 72 31 2c 20 77 32 2c 20  (x, w1, r1, w2, 
c230: 72 32 2c 20 72 33 29 3b 0a 20 20 49 4e 53 45 52  r2, r3);.  INSER
c240: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
c250: 28 31 2c 20 31 2c 20 27 52 31 27 2c 20 32 2c 20  (1, 1, 'R1', 2, 
c260: 27 52 32 27 2c 20 27 52 33 27 29 3b 0a 20 20 49  'R2', 'R3');.  I
c270: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
c280: 4c 55 45 53 28 32 2c 20 31 2c 20 27 52 31 27 2c  LUES(2, 1, 'R1',
c290: 20 32 2c 20 27 52 32 27 2c 20 27 52 33 27 29 3b   2, 'R2', 'R3');
c2a0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
c2b0: 32 20 56 41 4c 55 45 53 28 33 2c 20 31 2c 20 27  2 VALUES(3, 1, '
c2c0: 52 31 27 2c 20 32 2c 20 27 52 32 27 2c 20 27 52  R1', 2, 'R2', 'R
c2d0: 33 27 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65  3');.} {}.do_exe
c2e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
c2f0: 2d 32 36 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45  -26.1.2 {.  SELE
c300: 43 54 20 43 41 53 45 20 78 20 57 48 45 4e 20 77  CT CASE x WHEN w
c310: 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20 77  1 THEN r1 WHEN w
c320: 32 20 54 48 45 4e 20 72 32 20 45 4c 53 45 20 72  2 THEN r2 ELSE r
c330: 33 20 45 4e 44 20 46 52 4f 4d 20 74 32 0a 7d 20  3 END FROM t2.} 
c340: 7b 52 31 20 52 32 20 52 33 7d 0a 64 6f 5f 65 78  {R1 R2 R3}.do_ex
c350: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
c360: 72 2d 32 36 2e 31 2e 33 20 7b 0a 20 20 53 45 4c  r-26.1.3 {.  SEL
c370: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 78 3d  ECT CASE WHEN x=
c380: 77 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e 20  w1 THEN r1 WHEN 
c390: 78 3d 77 32 20 54 48 45 4e 20 72 32 20 45 4c 53  x=w2 THEN r2 ELS
c3a0: 45 20 72 33 20 45 4e 44 20 46 52 4f 4d 20 74 32  E r3 END FROM t2
c3b0: 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d 0a 0a 64  .} {R1 R2 R3}..d
c3c0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
c3d0: 5f 65 78 70 72 2d 32 36 2e 31 2e 34 20 7b 0a 20  _expr-26.1.4 {. 
c3e0: 20 53 45 4c 45 43 54 20 43 41 53 45 20 63 65 76   SELECT CASE cev
c3f0: 61 6c 28 78 29 20 57 48 45 4e 20 77 31 20 54 48  al(x) WHEN w1 TH
c400: 45 4e 20 72 31 20 57 48 45 4e 20 77 32 20 54 48  EN r1 WHEN w2 TH
c410: 45 4e 20 72 32 20 45 4c 53 45 20 72 33 20 45 4e  EN r2 ELSE r3 EN
c420: 44 20 46 52 4f 4d 20 74 32 0a 7d 20 7b 52 31 20  D FROM t2.} {R1 
c430: 52 32 20 52 33 7d 0a 64 6f 5f 74 65 73 74 20 65  R2 R3}.do_test e
c440: 5f 65 78 70 72 2d 32 36 2e 31 2e 35 20 7b 20 73  _expr-26.1.5 { s
c450: 65 74 20 3a 3a 65 76 61 6c 63 6f 75 6e 74 20 7d  et ::evalcount }
c460: 20 7b 33 7d 0a 73 65 74 20 3a 3a 65 76 61 6c 63   {3}.set ::evalc
c470: 6f 75 6e 74 20 30 0a 64 6f 5f 65 78 65 63 73 71  ount 0.do_execsq
c480: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36  l_test e_expr-26
c490: 2e 31 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.6 {.  SELECT 
c4a0: 43 41 53 45 20 0a 20 20 20 20 57 48 45 4e 20 63  CASE .    WHEN c
c4b0: 65 76 61 6c 28 78 29 3d 77 31 20 54 48 45 4e 20  eval(x)=w1 THEN 
c4c0: 72 31 20 0a 20 20 20 20 57 48 45 4e 20 63 65 76  r1 .    WHEN cev
c4d0: 61 6c 28 78 29 3d 77 32 20 54 48 45 4e 20 72 32  al(x)=w2 THEN r2
c4e0: 20 0a 20 20 20 20 45 4c 53 45 20 72 33 20 45 4e   .    ELSE r3 EN
c4f0: 44 20 0a 20 20 46 52 4f 4d 20 74 32 0a 7d 20 7b  D .  FROM t2.} {
c500: 52 31 20 52 32 20 52 33 7d 0a 64 6f 5f 74 65 73  R1 R2 R3}.do_tes
c510: 74 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 36 20  t e_expr-26.1.6 
c520: 7b 20 73 65 74 20 3a 3a 65 76 61 6c 63 6f 75 6e  { set ::evalcoun
c530: 74 20 7d 20 7b 35 7d 0a 0a 0a 23 2d 2d 2d 2d 2d  t } {5}...#-----
c540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c580: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74  ----.# Test stat
c590: 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74  ements related t
c5a0: 6f 20 43 41 53 54 20 65 78 70 72 65 73 73 69 6f  o CAST expressio
c5b0: 6e 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ns..#.# EVIDENCE
c5c0: 2d 4f 46 3a 20 52 2d 32 30 38 35 34 2d 31 37 31  -OF: R-20854-171
c5d0: 30 39 20 41 20 43 41 53 54 20 63 6f 6e 76 65 72  09 A CAST conver
c5e0: 73 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  sion is similar 
c5f0: 74 6f 20 74 68 65 0a 23 20 63 6f 6e 76 65 72 73  to the.# convers
c600: 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73 20 70  ion that takes p
c610: 6c 61 63 65 20 77 68 65 6e 20 61 20 63 6f 6c 75  lace when a colu
c620: 6d 6e 20 61 66 66 69 6e 69 74 79 20 69 73 20 61  mn affinity is a
c630: 70 70 6c 69 65 64 20 74 6f 20 61 0a 23 20 76 61  pplied to a.# va
c640: 6c 75 65 20 65 78 63 65 70 74 20 74 68 61 74 20  lue except that 
c650: 77 69 74 68 20 74 68 65 20 43 41 53 54 20 6f 70  with the CAST op
c660: 65 72 61 74 6f 72 20 74 68 65 20 63 6f 6e 76 65  erator the conve
c670: 72 73 69 6f 6e 20 61 6c 77 61 79 73 20 74 61 6b  rsion always tak
c680: 65 73 0a 23 20 70 6c 61 63 65 20 65 76 65 6e 20  es.# place even 
c690: 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  if the conversio
c6a0: 6e 20 6c 6f 73 73 79 20 61 6e 64 20 69 72 72 65  n lossy and irre
c6b0: 76 65 72 73 69 62 6c 65 2c 20 77 68 65 72 65 61  versible, wherea
c6c0: 73 20 63 6f 6c 75 6d 6e 0a 23 20 61 66 66 69 6e  s column.# affin
c6d0: 69 74 79 20 6f 6e 6c 79 20 63 68 61 6e 67 65 73  ity only changes
c6e0: 20 74 68 65 20 64 61 74 61 20 74 79 70 65 20 6f   the data type o
c6f0: 66 20 61 20 76 61 6c 75 65 20 69 66 20 74 68 65  f a value if the
c700: 20 63 68 61 6e 67 65 20 69 73 0a 23 20 6c 6f 73   change is.# los
c710: 73 6c 65 73 73 20 61 6e 64 20 72 65 76 65 72 73  sless and revers
c720: 69 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ible..#.do_execs
c730: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
c740: 37 2e 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  7.1.1 {.  CREATE
c750: 20 54 41 42 4c 45 20 74 33 28 61 20 54 45 58 54   TABLE t3(a TEXT
c760: 2c 20 62 20 52 45 41 4c 2c 20 63 20 49 4e 54 45  , b REAL, c INTE
c770: 47 45 52 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  GER);.  INSERT I
c780: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 58 27  NTO t3 VALUES(X'
c790: 35 35 35 36 35 35 27 2c 20 27 31 2e 32 33 61 62  555655', '1.23ab
c7a0: 63 27 2c 20 34 2e 35 29 3b 0a 20 20 53 45 4c 45  c', 4.5);.  SELE
c7b0: 43 54 20 74 79 70 65 6f 66 28 61 29 2c 20 61 2c  CT typeof(a), a,
c7c0: 20 74 79 70 65 6f 66 28 62 29 2c 20 62 2c 20 74   typeof(b), b, t
c7d0: 79 70 65 6f 66 28 63 29 2c 20 63 20 46 52 4f 4d  ypeof(c), c FROM
c7e0: 20 74 33 3b 0a 7d 20 7b 62 6c 6f 62 20 55 56 55   t3;.} {blob UVU
c7f0: 20 74 65 78 74 20 31 2e 32 33 61 62 63 20 72 65   text 1.23abc re
c800: 61 6c 20 34 2e 35 7d 0a 64 6f 5f 65 78 65 63 73  al 4.5}.do_execs
c810: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
c820: 37 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  7.1.2 {.  SELECT
c830: 20 0a 20 20 20 20 74 79 70 65 6f 66 28 43 41 53   .    typeof(CAS
c840: 54 28 58 27 35 35 35 36 35 35 27 20 61 73 20 54  T(X'555655' as T
c850: 45 58 54 29 29 2c 20 43 41 53 54 28 58 27 35 35  EXT)), CAST(X'55
c860: 35 36 35 35 27 20 61 73 20 54 45 58 54 29 2c 0a  5655' as TEXT),.
c870: 20 20 20 20 74 79 70 65 6f 66 28 43 41 53 54 28      typeof(CAST(
c880: 27 31 2e 32 33 61 62 63 27 20 61 73 20 52 45 41  '1.23abc' as REA
c890: 4c 29 29 2c 20 43 41 53 54 28 27 31 2e 32 33 61  L)), CAST('1.23a
c8a0: 62 63 27 20 61 73 20 52 45 41 4c 29 2c 0a 20 20  bc' as REAL),.  
c8b0: 20 20 74 79 70 65 6f 66 28 43 41 53 54 28 34 2e    typeof(CAST(4.
c8c0: 35 20 61 73 20 49 4e 54 45 47 45 52 29 29 2c 20  5 as INTEGER)), 
c8d0: 43 41 53 54 28 34 2e 35 20 61 73 20 49 4e 54 45  CAST(4.5 as INTE
c8e0: 47 45 52 29 0a 7d 20 7b 74 65 78 74 20 55 56 55  GER).} {text UVU
c8f0: 20 72 65 61 6c 20 31 2e 32 33 20 69 6e 74 65 67   real 1.23 integ
c900: 65 72 20 34 7d 0a 0a 23 20 45 56 49 44 45 4e 43  er 4}..# EVIDENC
c910: 45 2d 4f 46 3a 20 52 2d 33 32 34 33 34 2d 30 39  E-OF: R-32434-09
c920: 30 39 32 20 49 66 20 74 68 65 20 76 61 6c 75 65  092 If the value
c930: 20 6f 66 20 65 78 70 72 20 69 73 20 4e 55 4c 4c   of expr is NULL
c940: 2c 20 74 68 65 6e 20 74 68 65 0a 23 20 72 65 73  , then the.# res
c950: 75 6c 74 20 6f 66 20 74 68 65 20 43 41 53 54 20  ult of the CAST 
c960: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6c  expression is al
c970: 73 6f 20 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f 65 78  so NULL..#.do_ex
c980: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
c990: 37 2e 32 2e 31 20 7b 20 43 41 53 54 28 4e 55 4c  7.2.1 { CAST(NUL
c9a0: 4c 20 41 53 20 69 6e 74 65 67 65 72 29 20 7d 20  L AS integer) } 
c9b0: 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72 5f  null {}.do_expr_
c9c0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 32  test e_expr-27.2
c9d0: 2e 32 20 7b 20 43 41 53 54 28 4e 55 4c 4c 20 41  .2 { CAST(NULL A
c9e0: 53 20 74 65 78 74 29 20 7d 20 20 20 20 6e 75 6c  S text) }    nul
c9f0: 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73  l {}.do_expr_tes
ca00: 74 20 65 5f 65 78 70 72 2d 32 37 2e 32 2e 33 20  t e_expr-27.2.3 
ca10: 7b 20 43 41 53 54 28 4e 55 4c 4c 20 41 53 20 62  { CAST(NULL AS b
ca20: 6c 6f 62 29 20 7d 20 20 20 20 6e 75 6c 6c 20 7b  lob) }    null {
ca30: 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  }.do_expr_test e
ca40: 5f 65 78 70 72 2d 32 37 2e 32 2e 34 20 7b 20 43  _expr-27.2.4 { C
ca50: 41 53 54 28 4e 55 4c 4c 20 41 53 20 6e 75 6d 62  AST(NULL AS numb
ca60: 65 72 29 20 7d 20 20 6e 75 6c 6c 20 7b 7d 0a 0a  er) }  null {}..
ca70: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
ca80: 2d 32 39 32 38 33 2d 31 35 35 36 31 20 4f 74 68  -29283-15561 Oth
ca90: 65 72 77 69 73 65 2c 20 74 68 65 20 73 74 6f 72  erwise, the stor
caa0: 61 67 65 20 63 6c 61 73 73 20 6f 66 20 74 68 65  age class of the
cab0: 20 72 65 73 75 6c 74 0a 23 20 69 73 20 64 65 74   result.# is det
cac0: 65 72 6d 69 6e 65 64 20 62 79 20 61 70 70 6c 79  ermined by apply
cad0: 69 6e 67 20 74 68 65 20 72 75 6c 65 73 20 66 6f  ing the rules fo
cae0: 72 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 63 6f  r determining co
caf0: 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 74 6f  lumn affinity to
cb00: 0a 23 20 74 68 65 20 74 79 70 65 2d 6e 61 6d 65  .# the type-name
cb10: 2e 0a 23 0a 23 20 54 68 65 20 52 2d 32 39 32 38  ..#.# The R-2928
cb20: 33 2d 31 35 35 36 31 20 72 65 71 75 69 72 65 6d  3-15561 requirem
cb30: 65 6e 74 20 61 62 6f 76 65 20 69 73 20 64 65 6d  ent above is dem
cb40: 6f 6e 73 74 72 61 74 65 64 20 62 79 20 61 6c 6c  onstrated by all
cb50: 20 6f 66 20 74 68 65 20 0a 23 20 73 75 62 73 65   of the .# subse
cb60: 71 75 65 6e 74 20 65 5f 65 78 70 72 2d 32 36 20  quent e_expr-26 
cb70: 74 65 73 74 73 2e 0a 23 0a 23 20 45 56 49 44 45  tests..#.# EVIDE
cb80: 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 35 32 32 2d  NCE-OF: R-43522-
cb90: 33 35 35 34 38 20 43 61 73 74 69 6e 67 20 61 20  35548 Casting a 
cba0: 76 61 6c 75 65 20 74 6f 20 61 20 74 79 70 65 2d  value to a type-
cbb0: 6e 61 6d 65 20 77 69 74 68 20 6e 6f 0a 23 20 61  name with no.# a
cbc0: 66 66 69 6e 69 74 79 20 63 61 75 73 65 73 20 74  ffinity causes t
cbd0: 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 63  he value to be c
cbe0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
cbf0: 42 4c 4f 42 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  BLOB..#.do_expr_
cc00: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 33  test e_expr-27.3
cc10: 2e 31 20 7b 20 43 41 53 54 28 27 61 62 63 27 20  .1 { CAST('abc' 
cc20: 41 53 20 62 6c 6f 62 29 20 20 20 20 20 20 20 7d  AS blob)       }
cc30: 20 62 6c 6f 62 20 61 62 63 0a 64 6f 5f 65 78 70   blob abc.do_exp
cc40: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
cc50: 2e 33 2e 32 20 7b 20 43 41 53 54 28 27 64 65 66  .3.2 { CAST('def
cc60: 27 20 41 53 20 73 68 6f 62 62 6c 6f 62 5f 78 29  ' AS shobblob_x)
cc70: 20 7d 20 62 6c 6f 62 20 64 65 66 0a 64 6f 5f 65   } blob def.do_e
cc80: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
cc90: 32 37 2e 33 2e 33 20 7b 20 43 41 53 54 28 27 67  27.3.3 { CAST('g
cca0: 68 69 27 20 41 53 20 61 62 62 4c 4f 62 31 30 29  hi' AS abbLOb10)
ccb0: 20 20 20 7d 20 62 6c 6f 62 20 67 68 69 0a 0a 23     } blob ghi..#
ccc0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ccd0: 32 32 39 35 36 2d 33 37 37 35 34 20 43 61 73 74  22956-37754 Cast
cce0: 69 6e 67 20 74 6f 20 61 20 42 4c 4f 42 20 63 6f  ing to a BLOB co
ccf0: 6e 73 69 73 74 73 20 6f 66 20 66 69 72 73 74 20  nsists of first 
cd00: 63 61 73 74 69 6e 67 0a 23 20 74 68 65 20 76 61  casting.# the va
cd10: 6c 75 65 20 74 6f 20 54 45 58 54 20 69 6e 20 74  lue to TEXT in t
cd20: 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  he encoding of t
cd30: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
cd40: 65 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 23 20 69  ection, then.# i
cd50: 6e 74 65 72 70 72 65 74 69 6e 67 20 74 68 65 20  nterpreting the 
cd60: 72 65 73 75 6c 74 69 6e 67 20 62 79 74 65 20 73  resulting byte s
cd70: 65 71 75 65 6e 63 65 20 61 73 20 61 20 42 4c 4f  equence as a BLO
cd80: 42 20 69 6e 73 74 65 61 64 20 6f 66 20 61 73 20  B instead of as 
cd90: 54 45 58 54 2e 0a 23 0a 64 6f 5f 71 65 78 70 72  TEXT..#.do_qexpr
cda0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e  _test e_expr-27.
cdb0: 34 2e 31 20 7b 20 43 41 53 54 28 27 67 68 69 27  4.1 { CAST('ghi'
cdc0: 20 41 53 20 62 6c 6f 62 29 20 7d 20 58 27 36 37   AS blob) } X'67
cdd0: 36 38 36 39 27 0a 64 6f 5f 71 65 78 70 72 5f 74  6869'.do_qexpr_t
cde0: 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e  est e_expr-27.4.
cdf0: 32 20 7b 20 43 41 53 54 28 34 35 36 20 41 53 20  2 { CAST(456 AS 
ce00: 62 6c 6f 62 29 20 7d 20 20 20 58 27 33 34 33 35  blob) }   X'3435
ce10: 33 36 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73  36'.do_qexpr_tes
ce20: 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 33 20  t e_expr-27.4.3 
ce30: 7b 20 43 41 53 54 28 31 2e 37 38 20 41 53 20 62  { CAST(1.78 AS b
ce40: 6c 6f 62 29 20 7d 20 20 58 27 33 31 32 45 33 37  lob) }  X'312E37
ce50: 33 38 27 0a 72 65 6e 61 6d 65 20 64 62 20 64 62  38'.rename db db
ce60: 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65  2.sqlite3 db :me
ce70: 6d 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c 65 20  mory:.ifcapable 
ce80: 7b 75 74 66 31 36 7d 20 7b 0a 64 62 20 65 76 61  {utf16} {.db eva
ce90: 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  l { PRAGMA encod
cea0: 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65 27  ing = 'utf-16le'
ceb0: 20 7d 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74   }.do_qexpr_test
cec0: 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 34 20 7b   e_expr-27.4.4 {
ced0: 20 43 41 53 54 28 27 67 68 69 27 20 41 53 20 62   CAST('ghi' AS b
cee0: 6c 6f 62 29 20 7d 20 58 27 36 37 30 30 36 38 30  lob) } X'6700680
cef0: 30 36 39 30 30 27 0a 64 6f 5f 71 65 78 70 72 5f  06900'.do_qexpr_
cf00: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34  test e_expr-27.4
cf10: 2e 35 20 7b 20 43 41 53 54 28 34 35 36 20 41 53  .5 { CAST(456 AS
cf20: 20 62 6c 6f 62 29 20 7d 20 20 20 58 27 33 34 30   blob) }   X'340
cf30: 30 33 35 30 30 33 36 30 30 27 0a 64 6f 5f 71 65  035003600'.do_qe
cf40: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
cf50: 32 37 2e 34 2e 36 20 7b 20 43 41 53 54 28 31 2e  27.4.6 { CAST(1.
cf60: 37 38 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 58  78 AS blob) }  X
cf70: 27 33 31 30 30 32 45 30 30 33 37 30 30 33 38 30  '31002E003700380
cf80: 30 27 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 73 71  0'.}.db close.sq
cf90: 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79  lite3 db :memory
cfa0: 3a 0a 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47  :.db eval { PRAG
cfb0: 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75  MA encoding = 'u
cfc0: 74 66 2d 31 36 62 65 27 20 7d 0a 69 66 63 61 70  tf-16be' }.ifcap
cfd0: 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a 64  able {utf16} {.d
cfe0: 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65  o_qexpr_test e_e
cff0: 78 70 72 2d 32 37 2e 34 2e 37 20 7b 20 43 41 53  xpr-27.4.7 { CAS
d000: 54 28 27 67 68 69 27 20 41 53 20 62 6c 6f 62 29  T('ghi' AS blob)
d010: 20 7d 20 58 27 30 30 36 37 30 30 36 38 30 30 36   } X'00670068006
d020: 39 27 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74  9'.do_qexpr_test
d030: 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 38 20 7b   e_expr-27.4.8 {
d040: 20 43 41 53 54 28 34 35 36 20 41 53 20 62 6c 6f   CAST(456 AS blo
d050: 62 29 20 7d 20 20 20 58 27 30 30 33 34 30 30 33  b) }   X'0034003
d060: 35 30 30 33 36 27 0a 64 6f 5f 71 65 78 70 72 5f  50036'.do_qexpr_
d070: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34  test e_expr-27.4
d080: 2e 39 20 7b 20 43 41 53 54 28 31 2e 37 38 20 41  .9 { CAST(1.78 A
d090: 53 20 62 6c 6f 62 29 20 7d 20 20 58 27 30 30 33  S blob) }  X'003
d0a0: 31 30 30 32 45 30 30 33 37 30 30 33 38 27 0a 7d  1002E00370038'.}
d0b0: 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61 6d 65  .db close.rename
d0c0: 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49 44 45   db2 db..# EVIDE
d0d0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 34 32 30 37 2d  NCE-OF: R-04207-
d0e0: 33 37 39 38 31 20 54 6f 20 63 61 73 74 20 61 20  37981 To cast a 
d0f0: 42 4c 4f 42 20 76 61 6c 75 65 20 74 6f 20 54 45  BLOB value to TE
d100: 58 54 2c 20 74 68 65 20 73 65 71 75 65 6e 63 65  XT, the sequence
d110: 0a 23 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  .# of bytes that
d120: 20 6d 61 6b 65 20 75 70 20 74 68 65 20 42 4c 4f   make up the BLO
d130: 42 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  B is interpreted
d140: 20 61 73 20 74 65 78 74 20 65 6e 63 6f 64 65 64   as text encoded
d150: 20 75 73 69 6e 67 0a 23 20 74 68 65 20 64 61 74   using.# the dat
d160: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 2e 0a  abase encoding..
d170: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
d180: 5f 65 78 70 72 2d 32 38 2e 31 2e 31 20 7b 20 43  _expr-28.1.1 { C
d190: 41 53 54 20 28 58 27 36 37 36 38 36 39 27 20 41  AST (X'676869' A
d1a0: 53 20 74 65 78 74 29 20 7d 20 74 65 78 74 20 67  S text) } text g
d1b0: 68 69 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  hi.do_expr_test 
d1c0: 65 5f 65 78 70 72 2d 32 38 2e 31 2e 32 20 7b 20  e_expr-28.1.2 { 
d1d0: 43 41 53 54 20 28 58 27 36 37 30 30 36 38 30 30  CAST (X'67006800
d1e0: 36 39 30 30 27 20 41 53 20 74 65 78 74 29 20 7d  6900' AS text) }
d1f0: 20 74 65 78 74 20 67 0a 72 65 6e 61 6d 65 20 64   text g.rename d
d200: 62 20 64 62 32 0a 73 71 6c 69 74 65 33 20 64 62  b db2.sqlite3 db
d210: 20 3a 6d 65 6d 6f 72 79 3a 0a 64 62 20 65 76 61   :memory:.db eva
d220: 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  l { PRAGMA encod
d230: 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65 27  ing = 'utf-16le'
d240: 20 7d 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74   }.ifcapable {ut
d250: 66 31 36 7d 20 7b 0a 64 6f 5f 65 78 70 72 5f 74  f16} {.do_expr_t
d260: 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 31 2e  est e_expr-28.1.
d270: 33 20 7b 20 43 41 53 54 20 28 58 27 36 37 36 38  3 { CAST (X'6768
d280: 36 39 27 20 41 53 20 74 65 78 74 29 20 3d 3d 20  69' AS text) == 
d290: 27 67 68 69 27 20 7d 20 69 6e 74 65 67 65 72 20  'ghi' } integer 
d2a0: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
d2b0: 5f 65 78 70 72 2d 32 38 2e 31 2e 34 20 7b 20 43  _expr-28.1.4 { C
d2c0: 41 53 54 20 28 58 27 36 37 30 30 36 38 30 30 36  AST (X'670068006
d2d0: 39 30 30 27 20 41 53 20 74 65 78 74 29 20 7d 20  900' AS text) } 
d2e0: 74 65 78 74 20 67 68 69 0a 7d 0a 64 62 20 63 6c  text ghi.}.db cl
d2f0: 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62 32 20 64  ose.rename db2 d
d300: 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  b..# EVIDENCE-OF
d310: 3a 20 52 2d 32 32 32 33 35 2d 34 37 30 30 36 20  : R-22235-47006 
d320: 43 61 73 74 69 6e 67 20 61 6e 20 49 4e 54 45 47  Casting an INTEG
d330: 45 52 20 6f 72 20 52 45 41 4c 20 76 61 6c 75 65  ER or REAL value
d340: 20 69 6e 74 6f 20 54 45 58 54 0a 23 20 72 65 6e   into TEXT.# ren
d350: 64 65 72 73 20 74 68 65 20 76 61 6c 75 65 20 61  ders the value a
d360: 73 20 69 66 20 76 69 61 20 73 71 6c 69 74 65 33  s if via sqlite3
d370: 5f 73 6e 70 72 69 6e 74 66 28 29 20 65 78 63 65  _snprintf() exce
d380: 70 74 20 74 68 61 74 20 74 68 65 0a 23 20 72 65  pt that the.# re
d390: 73 75 6c 74 69 6e 67 20 54 45 58 54 20 75 73 65  sulting TEXT use
d3a0: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f  s the encoding o
d3b0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
d3c0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23 0a 64 6f 5f  onnection..#.do_
d3d0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d3e0: 2d 32 38 2e 32 2e 31 20 7b 20 43 41 53 54 20 28  -28.2.1 { CAST (
d3f0: 31 20 41 53 20 74 65 78 74 29 20 20 20 7d 20 20  1 AS text)   }  
d400: 20 20 20 74 65 78 74 20 31 0a 64 6f 5f 65 78 70     text 1.do_exp
d410: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38  r_test e_expr-28
d420: 2e 32 2e 32 20 7b 20 43 41 53 54 20 28 34 35 20  .2.2 { CAST (45 
d430: 41 53 20 74 65 78 74 29 20 20 7d 20 20 20 20 20  AS text)  }     
d440: 74 65 78 74 20 34 35 0a 64 6f 5f 65 78 70 72 5f  text 45.do_expr_
d450: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32  test e_expr-28.2
d460: 2e 33 20 7b 20 43 41 53 54 20 28 2d 34 35 20 41  .3 { CAST (-45 A
d470: 53 20 74 65 78 74 29 20 7d 20 20 20 20 20 74 65  S text) }     te
d480: 78 74 20 2d 34 35 0a 64 6f 5f 65 78 70 72 5f 74  xt -45.do_expr_t
d490: 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e  est e_expr-28.2.
d4a0: 34 20 7b 20 43 41 53 54 20 28 38 2e 38 20 41 53  4 { CAST (8.8 AS
d4b0: 20 74 65 78 74 29 20 20 20 20 7d 20 20 74 65 78   text)    }  tex
d4c0: 74 20 38 2e 38 0a 64 6f 5f 65 78 70 72 5f 74 65  t 8.8.do_expr_te
d4d0: 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 35  st e_expr-28.2.5
d4e0: 20 7b 20 43 41 53 54 20 28 32 2e 33 65 2b 35 20   { CAST (2.3e+5 
d4f0: 41 53 20 74 65 78 74 29 20 7d 20 20 74 65 78 74  AS text) }  text
d500: 20 32 33 30 30 30 30 2e 30 0a 64 6f 5f 65 78 70   230000.0.do_exp
d510: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38  r_test e_expr-28
d520: 2e 32 2e 36 20 7b 20 43 41 53 54 20 28 2d 32 2e  .2.6 { CAST (-2.
d530: 33 65 2d 35 20 41 53 20 74 65 78 74 29 20 7d 20  3e-5 AS text) } 
d540: 74 65 78 74 20 2d 32 2e 33 65 2d 30 35 0a 64 6f  text -2.3e-05.do
d550: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d560: 72 2d 32 38 2e 32 2e 37 20 7b 20 43 41 53 54 20  r-28.2.7 { CAST 
d570: 28 30 2e 30 20 41 53 20 74 65 78 74 29 20 7d 20  (0.0 AS text) } 
d580: 20 20 20 20 74 65 78 74 20 30 2e 30 0a 64 6f 5f      text 0.0.do_
d590: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d5a0: 2d 32 38 2e 32 2e 37 20 7b 20 43 41 53 54 20 28  -28.2.7 { CAST (
d5b0: 30 20 41 53 20 74 65 78 74 29 20 7d 20 20 20 20  0 AS text) }    
d5c0: 20 20 20 74 65 78 74 20 30 0a 0a 23 20 45 56 49     text 0..# EVI
d5d0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 33 34  DENCE-OF: R-2634
d5e0: 36 2d 33 36 34 34 33 20 57 68 65 6e 20 63 61 73  6-36443 When cas
d5f0: 74 69 6e 67 20 61 20 42 4c 4f 42 20 76 61 6c 75  ting a BLOB valu
d600: 65 20 74 6f 20 61 20 52 45 41 4c 2c 20 74 68 65  e to a REAL, the
d610: 0a 23 20 76 61 6c 75 65 20 69 73 20 66 69 72 73  .# value is firs
d620: 74 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 54  t converted to T
d630: 45 58 54 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74  EXT..#.do_expr_t
d640: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e  est e_expr-29.1.
d650: 31 20 7b 20 43 41 53 54 20 28 58 27 33 31 32 45  1 { CAST (X'312E
d660: 33 32 33 33 27 20 41 53 20 52 45 41 4c 29 20 7d  3233' AS REAL) }
d670: 20 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65 78   real 1.23.do_ex
d680: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
d690: 39 2e 31 2e 32 20 7b 20 43 41 53 54 20 28 58 27  9.1.2 { CAST (X'
d6a0: 33 32 33 33 33 30 32 45 33 30 27 20 41 53 20 52  3233302E30' AS R
d6b0: 45 41 4c 29 20 7d 20 72 65 61 6c 20 32 33 30 2e  EAL) } real 230.
d6c0: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
d6d0: 5f 65 78 70 72 2d 32 39 2e 31 2e 33 20 7b 20 43  _expr-29.1.3 { C
d6e0: 41 53 54 20 28 58 27 32 44 33 39 32 45 33 38 33  AST (X'2D392E383
d6f0: 37 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  7' AS REAL) } re
d700: 61 6c 20 2d 39 2e 38 37 0a 64 6f 5f 65 78 70 72  al -9.87.do_expr
d710: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d720: 31 2e 34 20 7b 20 43 41 53 54 20 28 58 27 33 30  1.4 { CAST (X'30
d730: 32 45 33 30 33 30 33 30 33 31 27 20 41 53 20 52  2E30303031' AS R
d740: 45 41 4c 29 20 7d 20 72 65 61 6c 20 30 2e 30 30  EAL) } real 0.00
d750: 30 31 0a 72 65 6e 61 6d 65 20 64 62 20 64 62 32  01.rename db db2
d760: 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65 6d  .sqlite3 db :mem
d770: 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c 65 20 7b  ory:.ifcapable {
d780: 75 74 66 31 36 7d 20 7b 0a 64 62 20 65 76 61 6c  utf16} {.db eval
d790: 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69   { PRAGMA encodi
d7a0: 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65 27 20  ng = 'utf-16le' 
d7b0: 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  }.do_expr_test e
d7c0: 5f 65 78 70 72 2d 32 39 2e 31 2e 35 20 7b 20 0a  _expr-29.1.5 { .
d7d0: 20 20 20 20 43 41 53 54 20 28 58 27 33 31 30 30      CAST (X'3100
d7e0: 32 45 30 30 33 32 30 30 33 33 30 30 27 20 41 53  2E0032003300' AS
d7f0: 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e   REAL) } real 1.
d800: 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  23.do_expr_test 
d810: 65 5f 65 78 70 72 2d 32 39 2e 31 2e 36 20 7b 20  e_expr-29.1.6 { 
d820: 0a 20 20 20 20 43 41 53 54 20 28 58 27 33 32 30  .    CAST (X'320
d830: 30 33 33 30 30 33 30 30 30 32 45 30 30 33 30 30  0330030002E00300
d840: 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  0' AS REAL) } re
d850: 61 6c 20 32 33 30 2e 30 0a 64 6f 5f 65 78 70 72  al 230.0.do_expr
d860: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d870: 31 2e 37 20 7b 20 0a 20 20 20 20 43 41 53 54 20  1.7 { .    CAST 
d880: 28 58 27 32 44 30 30 33 39 30 30 32 45 30 30 33  (X'2D0039002E003
d890: 38 30 30 33 37 30 30 27 20 41 53 20 52 45 41 4c  8003700' AS REAL
d8a0: 29 20 7d 20 72 65 61 6c 20 2d 39 2e 38 37 0a 64  ) } real -9.87.d
d8b0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d8c0: 70 72 2d 32 39 2e 31 2e 38 20 7b 20 0a 20 20 20  pr-29.1.8 { .   
d8d0: 20 43 41 53 54 20 28 58 27 33 30 30 30 32 45 30   CAST (X'30002E0
d8e0: 30 33 30 30 30 33 30 30 30 33 30 30 30 33 31 30  0300030003000310
d8f0: 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  0' AS REAL) } re
d900: 61 6c 20 30 2e 30 30 30 31 0a 7d 0a 64 62 20 63  al 0.0001.}.db c
d910: 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62 32 20  lose.rename db2 
d920: 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  db..# EVIDENCE-O
d930: 46 3a 20 52 2d 35 34 38 39 38 2d 33 34 35 35 34  F: R-54898-34554
d940: 20 57 68 65 6e 20 63 61 73 74 69 6e 67 20 61 20   When casting a 
d950: 54 45 58 54 20 76 61 6c 75 65 20 74 6f 20 52 45  TEXT value to RE
d960: 41 4c 2c 20 74 68 65 0a 23 20 6c 6f 6e 67 65 73  AL, the.# longes
d970: 74 20 70 6f 73 73 69 62 6c 65 20 70 72 65 66 69  t possible prefi
d980: 78 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 74  x of the value t
d990: 68 61 74 20 63 61 6e 20 62 65 20 69 6e 74 65 72  hat can be inter
d9a0: 70 72 65 74 65 64 20 61 73 20 61 20 72 65 61 6c  preted as a real
d9b0: 0a 23 20 6e 75 6d 62 65 72 20 69 73 20 65 78 74  .# number is ext
d9c0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
d9d0: 54 45 58 54 20 76 61 6c 75 65 20 61 6e 64 20 74  TEXT value and t
d9e0: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69 67 6e  he remainder ign
d9f0: 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  ored..#.do_expr_
da00: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 32  test e_expr-29.2
da10: 2e 31 20 7b 20 43 41 53 54 28 27 31 2e 32 33 61  .1 { CAST('1.23a
da20: 62 63 64 27 20 41 53 20 52 45 41 4c 29 20 7d 20  bcd' AS REAL) } 
da30: 72 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65 78 70  real 1.23.do_exp
da40: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
da50: 2e 32 2e 32 20 7b 20 43 41 53 54 28 27 31 2e 34  .2.2 { CAST('1.4
da60: 35 2e 32 33 61 62 63 64 27 20 41 53 20 52 45 41  5.23abcd' AS REA
da70: 4c 29 20 7d 20 72 65 61 6c 20 31 2e 34 35 0a 64  L) } real 1.45.d
da80: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
da90: 70 72 2d 32 39 2e 32 2e 33 20 7b 20 43 41 53 54  pr-29.2.3 { CAST
daa0: 28 27 2d 32 2e 31 32 65 2d 30 31 41 42 43 27 20  ('-2.12e-01ABC' 
dab0: 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20  AS REAL) } real 
dac0: 2d 30 2e 32 31 32 0a 64 6f 5f 65 78 70 72 5f 74  -0.212.do_expr_t
dad0: 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 32 2e  est e_expr-29.2.
dae0: 34 20 7b 20 43 41 53 54 28 27 31 20 32 20 33 20  4 { CAST('1 2 3 
daf0: 34 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  4' AS REAL) } re
db00: 61 6c 20 31 2e 30 0a 0a 23 20 45 56 49 44 45 4e  al 1.0..# EVIDEN
db10: 43 45 2d 4f 46 3a 20 52 2d 31 31 33 32 31 2d 34  CE-OF: R-11321-4
db20: 37 34 32 37 20 41 6e 79 20 6c 65 61 64 69 6e 67  7427 Any leading
db30: 20 73 70 61 63 65 73 20 69 6e 20 74 68 65 20 54   spaces in the T
db40: 45 58 54 20 76 61 6c 75 65 20 61 72 65 0a 23 20  EXT value are.# 
db50: 69 67 6e 6f 72 65 64 20 77 68 65 6e 20 63 6f 6e  ignored when con
db60: 76 65 72 67 69 6e 67 20 66 72 6f 6d 20 54 45 58  verging from TEX
db70: 54 20 74 6f 20 52 45 41 4c 2e 0a 23 0a 64 6f 5f  T to REAL..#.do_
db80: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
db90: 2d 32 39 2e 33 2e 31 20 7b 20 43 41 53 54 28 27  -29.3.1 { CAST('
dba0: 20 31 2e 32 33 61 62 63 64 27 20 41 53 20 52 45   1.23abcd' AS RE
dbb0: 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32 33 0a  AL) } real 1.23.
dbc0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
dbd0: 78 70 72 2d 32 39 2e 33 2e 32 20 7b 20 43 41 53  xpr-29.3.2 { CAS
dbe0: 54 28 27 20 20 20 20 31 2e 34 35 2e 32 33 61 62  T('    1.45.23ab
dbf0: 63 64 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  cd' AS REAL) } r
dc00: 65 61 6c 20 31 2e 34 35 0a 64 6f 5f 65 78 70 72  eal 1.45.do_expr
dc10: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
dc20: 33 2e 33 20 7b 20 43 41 53 54 28 27 20 20 20 2d  3.3 { CAST('   -
dc30: 32 2e 31 32 65 2d 30 31 41 42 43 27 20 41 53 20  2.12e-01ABC' AS 
dc40: 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 2d 30 2e  REAL) } real -0.
dc50: 32 31 32 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  212.do_expr_test
dc60: 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e 34 20 7b   e_expr-29.3.4 {
dc70: 20 43 41 53 54 28 27 20 31 20 32 20 33 20 34 27   CAST(' 1 2 3 4'
dc80: 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c   AS REAL) } real
dc90: 20 31 2e 30 0a 0a 23 20 45 56 49 44 45 4e 43 45   1.0..# EVIDENCE
dca0: 2d 4f 46 3a 20 52 2d 32 32 36 36 32 2d 32 38 32  -OF: R-22662-282
dcb0: 31 38 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  18 If there is n
dcc0: 6f 20 70 72 65 66 69 78 20 74 68 61 74 20 63 61  o prefix that ca
dcd0: 6e 20 62 65 0a 23 20 69 6e 74 65 72 70 72 65 74  n be.# interpret
dce0: 65 64 20 61 73 20 61 20 72 65 61 6c 20 6e 75 6d  ed as a real num
dcf0: 62 65 72 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ber, the result 
dd00: 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  of the conversio
dd10: 6e 20 69 73 20 30 2e 30 2e 0a 23 0a 64 6f 5f 65  n is 0.0..#.do_e
dd20: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
dd30: 32 39 2e 34 2e 31 20 7b 20 43 41 53 54 28 27 27  29.4.1 { CAST(''
dd40: 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c   AS REAL) } real
dd50: 20 30 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73   0.0.do_expr_tes
dd60: 74 20 65 5f 65 78 70 72 2d 32 39 2e 34 2e 32 20  t e_expr-29.4.2 
dd70: 7b 20 43 41 53 54 28 27 6e 6f 74 20 61 20 6e 75  { CAST('not a nu
dd80: 6d 62 65 72 27 20 41 53 20 52 45 41 4c 29 20 7d  mber' AS REAL) }
dd90: 20 72 65 61 6c 20 30 2e 30 0a 64 6f 5f 65 78 70   real 0.0.do_exp
dda0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
ddb0: 2e 34 2e 33 20 7b 20 43 41 53 54 28 27 58 58 49  .4.3 { CAST('XXI
ddc0: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
ddd0: 6c 20 30 2e 30 0a 0a 23 20 45 56 49 44 45 4e 43  l 0.0..# EVIDENC
dde0: 45 2d 4f 46 3a 20 52 2d 32 31 38 32 39 2d 31 34  E-OF: R-21829-14
ddf0: 35 36 33 20 57 68 65 6e 20 63 61 73 74 69 6e 67  563 When casting
de00: 20 61 20 42 4c 4f 42 20 76 61 6c 75 65 20 74 6f   a BLOB value to
de10: 20 49 4e 54 45 47 45 52 2c 20 74 68 65 0a 23 20   INTEGER, the.# 
de20: 76 61 6c 75 65 20 69 73 20 66 69 72 73 74 20 63  value is first c
de30: 6f 6e 76 65 72 74 65 64 20 74 6f 20 54 45 58 54  onverted to TEXT
de40: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
de50: 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 31 20 7b   e_expr-30.1.1 {
de60: 20 43 41 53 54 28 58 27 33 31 33 32 33 33 27 20   CAST(X'313233' 
de70: 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e  AS INTEGER) } in
de80: 74 65 67 65 72 20 31 32 33 0a 64 6f 5f 65 78 70  teger 123.do_exp
de90: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
dea0: 2e 31 2e 32 20 7b 20 43 41 53 54 28 58 27 32 44  .1.2 { CAST(X'2D
deb0: 33 36 33 37 33 38 27 20 41 53 20 49 4e 54 45 47  363738' AS INTEG
dec0: 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 2d 36  ER) } integer -6
ded0: 37 38 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  78.do_expr_test 
dee0: 65 5f 65 78 70 72 2d 33 30 2e 31 2e 33 20 7b 20  e_expr-30.1.3 { 
def0: 0a 20 20 43 41 53 54 28 58 27 33 31 33 30 33 30  .  CAST(X'313030
df00: 33 30 33 30 33 30 33 30 27 20 41 53 20 49 4e 54  30303030' AS INT
df10: 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67 65 72  EGER) .} integer
df20: 20 31 30 30 30 30 30 30 0a 64 6f 5f 65 78 70 72   1000000.do_expr
df30: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
df40: 31 2e 34 20 7b 20 0a 20 20 43 41 53 54 28 58 27  1.4 { .  CAST(X'
df50: 32 44 33 31 33 31 33 32 33 35 33 38 33 39 33 39  2D31313235383939
df60: 33 39 33 30 33 36 33 38 33 34 33 32 33 36 33 32  3930363834323632
df70: 33 34 27 20 41 53 20 49 4e 54 45 47 45 52 29 20  34' AS INTEGER) 
df80: 0a 7d 20 69 6e 74 65 67 65 72 20 2d 31 31 32 35  .} integer -1125
df90: 38 39 39 39 30 36 38 34 32 36 32 34 0a 0a 72 65  899906842624..re
dfa0: 6e 61 6d 65 20 64 62 20 64 62 32 0a 73 71 6c 69  name db db2.sqli
dfb0: 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a  te3 db :memory:.
dfc0: 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66 31 36  ifcapable {utf16
dfd0: 7d 20 7b 0a 65 78 65 63 73 71 6c 20 7b 20 50 52  } {.execsql { PR
dfe0: 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67 20 3d 20  AGMA encoding = 
dff0: 27 75 74 66 2d 31 36 62 65 27 20 7d 0a 64 6f 5f  'utf-16be' }.do_
e000: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e010: 2d 33 30 2e 31 2e 35 20 7b 20 43 41 53 54 28 58  -30.1.5 { CAST(X
e020: 27 30 30 33 31 30 30 33 32 30 30 33 33 27 20 41  '003100320033' A
e030: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e040: 65 67 65 72 20 31 32 33 0a 64 6f 5f 65 78 70 72  eger 123.do_expr
e050: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
e060: 31 2e 36 20 7b 20 43 41 53 54 28 58 27 30 30 32  1.6 { CAST(X'002
e070: 44 30 30 33 36 30 30 33 37 30 30 33 38 27 20 41  D003600370038' A
e080: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e090: 65 67 65 72 20 2d 36 37 38 0a 64 6f 5f 65 78 70  eger -678.do_exp
e0a0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
e0b0: 2e 31 2e 37 20 7b 20 0a 20 20 43 41 53 54 28 58  .1.7 { .  CAST(X
e0c0: 27 30 30 33 31 30 30 33 30 30 30 33 30 30 30 33  '003100300030003
e0d0: 30 30 30 33 30 30 30 33 30 30 30 33 30 27 20 41  0003000300030' A
e0e0: 53 20 49 4e 54 45 47 45 52 29 20 0a 7d 20 69 6e  S INTEGER) .} in
e0f0: 74 65 67 65 72 20 31 30 30 30 30 30 30 0a 64 6f  teger 1000000.do
e100: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e110: 72 2d 33 30 2e 31 2e 38 20 7b 20 0a 20 20 43 41  r-30.1.8 { .  CA
e120: 53 54 28 58 27 30 30 32 44 30 30 33 31 30 30 33  ST(X'002D0031003
e130: 31 30 30 33 32 30 30 33 35 30 30 33 38 30 30 33  1003200350038003
e140: 39 30 30 33 39 30 30 33 39 30 30 33 30 30 30 33  9003900390030003
e150: 36 30 30 33 38 30 30 33 34 30 30 33 32 30 30 33  6003800340032003
e160: 36 30 30 33 32 30 30 33 34 27 20 41 53 20 49 4e  600320034' AS IN
e170: 54 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67 65  TEGER) .} intege
e180: 72 20 2d 31 31 32 35 38 39 39 39 30 36 38 34 32  r -1125899906842
e190: 36 32 34 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a 72  624.}.db close.r
e1a0: 65 6e 61 6d 65 20 64 62 32 20 64 62 0a 0a 23 20  ename db2 db..# 
e1b0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
e1c0: 37 36 31 32 2d 34 35 38 34 32 20 57 68 65 6e 20  7612-45842 When 
e1d0: 63 61 73 74 69 6e 67 20 61 20 54 45 58 54 20 76  casting a TEXT v
e1e0: 61 6c 75 65 20 74 6f 20 49 4e 54 45 47 45 52 2c  alue to INTEGER,
e1f0: 20 74 68 65 0a 23 20 6c 6f 6e 67 65 73 74 20 70   the.# longest p
e200: 6f 73 73 69 62 6c 65 20 70 72 65 66 69 78 20 6f  ossible prefix o
e210: 66 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  f the value that
e220: 20 63 61 6e 20 62 65 20 69 6e 74 65 72 70 72 65   can be interpre
e230: 74 65 64 20 61 73 20 61 6e 0a 23 20 69 6e 74 65  ted as an.# inte
e240: 67 65 72 20 6e 75 6d 62 65 72 20 69 73 20 65 78  ger number is ex
e250: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
e260: 20 54 45 58 54 20 76 61 6c 75 65 20 61 6e 64 20   TEXT value and 
e270: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 0a 23 20  the remainder.# 
e280: 69 67 6e 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78  ignored..#.do_ex
e290: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
e2a0: 30 2e 32 2e 31 20 7b 20 43 41 53 54 28 27 31 32  0.2.1 { CAST('12
e2b0: 33 61 62 63 64 27 20 41 53 20 49 4e 54 29 20 7d  3abcd' AS INT) }
e2c0: 20 69 6e 74 65 67 65 72 20 31 32 33 0a 64 6f 5f   integer 123.do_
e2d0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e2e0: 2d 33 30 2e 32 2e 32 20 7b 20 43 41 53 54 28 27  -30.2.2 { CAST('
e2f0: 31 34 35 32 33 61 62 63 64 27 20 41 53 20 49 4e  14523abcd' AS IN
e300: 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31 34 35  T) } integer 145
e310: 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  23.do_expr_test 
e320: 65 5f 65 78 70 72 2d 33 30 2e 32 2e 33 20 7b 20  e_expr-30.2.3 { 
e330: 43 41 53 54 28 27 2d 32 2e 31 32 65 2d 30 31 41  CAST('-2.12e-01A
e340: 42 43 27 20 41 53 20 49 4e 54 29 20 7d 20 69 6e  BC' AS INT) } in
e350: 74 65 67 65 72 20 2d 32 0a 64 6f 5f 65 78 70 72  teger -2.do_expr
e360: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
e370: 32 2e 34 20 7b 20 43 41 53 54 28 27 31 20 32 20  2.4 { CAST('1 2 
e380: 33 20 34 27 20 41 53 20 49 4e 54 29 20 7d 20 69  3 4' AS INT) } i
e390: 6e 74 65 67 65 72 20 31 0a 0a 23 20 45 56 49 44  nteger 1..# EVID
e3a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 34 30 30  ENCE-OF: R-34400
e3b0: 2d 33 33 37 37 32 20 41 6e 79 20 6c 65 61 64 69  -33772 Any leadi
e3c0: 6e 67 20 73 70 61 63 65 73 20 69 6e 20 74 68 65  ng spaces in the
e3d0: 20 54 45 58 54 20 76 61 6c 75 65 20 77 68 65 6e   TEXT value when
e3e0: 0a 23 20 63 6f 6e 76 65 72 74 69 6e 67 20 66 72  .# converting fr
e3f0: 6f 6d 20 54 45 58 54 20 74 6f 20 49 4e 54 45 47  om TEXT to INTEG
e400: 45 52 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  ER are ignored..
e410: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
e420: 5f 65 78 70 72 2d 33 30 2e 33 2e 31 20 7b 20 43  _expr-30.3.1 { C
e430: 41 53 54 28 27 20 20 20 31 32 33 61 62 63 64 27  AST('   123abcd'
e440: 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67   AS INT) } integ
e450: 65 72 20 31 32 33 0a 64 6f 5f 65 78 70 72 5f 74  er 123.do_expr_t
e460: 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 33 2e  est e_expr-30.3.
e470: 32 20 7b 20 43 41 53 54 28 27 20 20 31 34 35 32  2 { CAST('  1452
e480: 33 61 62 63 64 27 20 41 53 20 49 4e 54 29 20 7d  3abcd' AS INT) }
e490: 20 69 6e 74 65 67 65 72 20 31 34 35 32 33 0a 64   integer 14523.d
e4a0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
e4b0: 70 72 2d 33 30 2e 33 2e 33 20 7b 20 43 41 53 54  pr-30.3.3 { CAST
e4c0: 28 27 20 2d 32 2e 31 32 65 2d 30 31 41 42 43 27  (' -2.12e-01ABC'
e4d0: 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67   AS INT) } integ
e4e0: 65 72 20 2d 32 0a 64 6f 5f 65 78 70 72 5f 74 65  er -2.do_expr_te
e4f0: 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 33 2e 34  st e_expr-30.3.4
e500: 20 7b 20 43 41 53 54 28 27 20 20 20 20 20 31 20   { CAST('     1 
e510: 32 20 33 20 34 27 20 41 53 20 49 4e 54 29 20 7d  2 3 4' AS INT) }
e520: 20 69 6e 74 65 67 65 72 20 31 0a 0a 23 20 45 56   integer 1..# EV
e530: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 31  IDENCE-OF: R-431
e540: 36 34 2d 34 34 32 37 36 20 49 66 20 74 68 65 72  64-44276 If ther
e550: 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20 74  e is no prefix t
e560: 68 61 74 20 63 61 6e 20 62 65 0a 23 20 69 6e 74  hat can be.# int
e570: 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 69  erpreted as an i
e580: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 2c 20 74  nteger number, t
e590: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
e5a0: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 30   conversion is 0
e5b0: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
e5c0: 20 65 5f 65 78 70 72 2d 33 30 2e 34 2e 31 20 7b   e_expr-30.4.1 {
e5d0: 20 43 41 53 54 28 27 27 20 41 53 20 49 4e 54 45   CAST('' AS INTE
e5e0: 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 30  GER) } integer 0
e5f0: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e600: 65 78 70 72 2d 33 30 2e 34 2e 32 20 7b 20 43 41  expr-30.4.2 { CA
e610: 53 54 28 27 6e 6f 74 20 61 20 6e 75 6d 62 65 72  ST('not a number
e620: 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20  ' AS INTEGER) } 
e630: 69 6e 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70  integer 0.do_exp
e640: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
e650: 2e 34 2e 33 20 7b 20 43 41 53 54 28 27 58 58 49  .4.3 { CAST('XXI
e660: 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20  ' AS INTEGER) } 
e670: 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45 56 49  integer 0..# EVI
e680: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 39 38  DENCE-OF: R-0898
e690: 30 2d 35 33 31 32 34 20 54 68 65 20 43 41 53 54  0-53124 The CAST
e6a0: 20 6f 70 65 72 61 74 6f 72 20 75 6e 64 65 72 73   operator unders
e6b0: 74 61 6e 64 73 20 64 65 63 69 6d 61 6c 0a 23 20  tands decimal.# 
e6c0: 69 6e 74 65 67 65 72 73 20 6f 6e 6c 79 20 26 6d  integers only &m
e6d0: 64 61 73 68 3b 20 63 6f 6e 76 65 72 73 69 6f 6e  dash; conversion
e6e0: 20 6f 66 20 68 65 78 61 64 65 63 69 6d 61 6c 20   of hexadecimal 
e6f0: 69 6e 74 65 67 65 72 73 20 73 74 6f 70 73 20 61  integers stops a
e700: 74 0a 23 20 74 68 65 20 22 78 22 20 69 6e 20 74  t.# the "x" in t
e710: 68 65 20 22 30 78 22 20 70 72 65 66 69 78 20 6f  he "0x" prefix o
e720: 66 20 74 68 65 20 68 65 78 61 64 65 63 69 6d 61  f the hexadecima
e730: 6c 20 69 6e 74 65 67 65 72 20 73 74 72 69 6e 67  l integer string
e740: 20 61 6e 64 20 74 68 75 73 0a 23 20 72 65 73 75   and thus.# resu
e750: 6c 74 20 6f 66 20 74 68 65 20 43 41 53 54 20 69  lt of the CAST i
e760: 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2e 0a 64  s always zero..d
e770: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
e780: 70 72 2d 33 30 2e 35 2e 31 20 7b 20 43 41 53 54  pr-30.5.1 { CAST
e790: 28 27 30 78 31 32 33 34 27 20 41 53 20 49 4e 54  ('0x1234' AS INT
e7a0: 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20  EGER) } integer 
e7b0: 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  0.do_expr_test e
e7c0: 5f 65 78 70 72 2d 33 30 2e 35 2e 32 20 7b 20 43  _expr-30.5.2 { C
e7d0: 41 53 54 28 27 30 58 31 32 33 34 27 20 41 53 20  AST('0X1234' AS 
e7e0: 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67  INTEGER) } integ
e7f0: 65 72 20 30 0a 0a 23 20 45 56 49 44 45 4e 43 45  er 0..# EVIDENCE
e800: 2d 4f 46 3a 20 52 2d 30 32 37 35 32 2d 35 30 30  -OF: R-02752-500
e810: 39 31 20 41 20 63 61 73 74 20 6f 66 20 61 20 52  91 A cast of a R
e820: 45 41 4c 20 76 61 6c 75 65 20 69 6e 74 6f 20 61  EAL value into a
e830: 6e 20 49 4e 54 45 47 45 52 0a 23 20 72 65 73 75  n INTEGER.# resu
e840: 6c 74 73 20 69 6e 20 74 68 65 20 69 6e 74 65 67  lts in the integ
e850: 65 72 20 62 65 74 77 65 65 6e 20 74 68 65 20 52  er between the R
e860: 45 41 4c 20 76 61 6c 75 65 20 61 6e 64 20 7a 65  EAL value and ze
e870: 72 6f 20 74 68 61 74 20 69 73 20 63 6c 6f 73 65  ro that is close
e880: 73 74 0a 23 20 74 6f 20 74 68 65 20 52 45 41 4c  st.# to the REAL
e890: 20 76 61 6c 75 65 2e 0a 23 0a 64 6f 5f 65 78 70   value..#.do_exp
e8a0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31  r_test e_expr-31
e8b0: 2e 31 2e 31 20 7b 20 43 41 53 54 28 33 2e 31 34  .1.1 { CAST(3.14
e8c0: 31 35 39 20 41 53 20 49 4e 54 45 47 45 52 29 20  159 AS INTEGER) 
e8d0: 7d 20 69 6e 74 65 67 65 72 20 33 0a 64 6f 5f 65  } integer 3.do_e
e8e0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
e8f0: 33 31 2e 31 2e 32 20 7b 20 43 41 53 54 28 31 2e  31.1.2 { CAST(1.
e900: 39 39 39 39 39 20 41 53 20 49 4e 54 45 47 45 52  99999 AS INTEGER
e910: 29 20 7d 20 69 6e 74 65 67 65 72 20 31 0a 64 6f  ) } integer 1.do
e920: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
e930: 72 2d 33 31 2e 31 2e 33 20 7b 20 43 41 53 54 28  r-31.1.3 { CAST(
e940: 2d 31 2e 39 39 39 39 39 20 41 53 20 49 4e 54 45  -1.99999 AS INTE
e950: 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 2d  GER) } integer -
e960: 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  1.do_expr_test e
e970: 5f 65 78 70 72 2d 33 31 2e 31 2e 34 20 7b 20 43  _expr-31.1.4 { C
e980: 41 53 54 28 2d 30 2e 39 39 39 39 39 20 41 53 20  AST(-0.99999 AS 
e990: 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67  INTEGER) } integ
e9a0: 65 72 20 30 0a 0a 23 20 45 56 49 44 45 4e 43 45  er 0..# EVIDENCE
e9b0: 2d 4f 46 3a 20 52 2d 35 31 35 31 37 2d 34 30 38  -OF: R-51517-408
e9c0: 32 34 20 49 66 20 61 20 52 45 41 4c 20 69 73 20  24 If a REAL is 
e9d0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
e9e0: 20 67 72 65 61 74 65 73 74 0a 23 20 70 6f 73 73   greatest.# poss
e9f0: 69 62 6c 65 20 73 69 67 6e 65 64 20 69 6e 74 65  ible signed inte
ea00: 67 65 72 20 28 2b 39 32 32 33 33 37 32 30 33 36  ger (+9223372036
ea10: 38 35 34 37 37 35 38 30 37 29 20 74 68 65 6e 20  854775807) then 
ea20: 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68  the result is th
ea30: 65 0a 23 20 67 72 65 61 74 65 73 74 20 70 6f 73  e.# greatest pos
ea40: 73 69 62 6c 65 20 73 69 67 6e 65 64 20 69 6e 74  sible signed int
ea50: 65 67 65 72 20 61 6e 64 20 69 66 20 74 68 65 20  eger and if the 
ea60: 52 45 41 4c 20 69 73 20 6c 65 73 73 20 74 68 61  REAL is less tha
ea70: 6e 20 74 68 65 0a 23 20 6c 65 61 73 74 20 70 6f  n the.# least po
ea80: 73 73 69 62 6c 65 20 73 69 67 6e 65 64 20 69 6e  ssible signed in
ea90: 74 65 67 65 72 20 28 2d 39 32 32 33 33 37 32 30  teger (-92233720
eaa0: 33 36 38 35 34 37 37 35 38 30 38 29 20 74 68 65  36854775808) the
eab0: 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 23 20 69  n the result.# i
eac0: 73 20 74 68 65 20 6c 65 61 73 74 20 70 6f 73 73  s the least poss
ead0: 69 62 6c 65 20 73 69 67 6e 65 64 20 69 6e 74 65  ible signed inte
eae0: 67 65 72 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74  ger..#.do_expr_t
eaf0: 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 32 2e  est e_expr-31.2.
eb00: 31 20 7b 20 43 41 53 54 28 32 65 2b 35 30 20 41  1 { CAST(2e+50 A
eb10: 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72  S INT) } integer
eb20: 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37   922337203685477
eb30: 35 38 30 37 0a 64 6f 5f 65 78 70 72 5f 74 65 73  5807.do_expr_tes
eb40: 74 20 65 5f 65 78 70 72 2d 33 31 2e 32 2e 32 20  t e_expr-31.2.2 
eb50: 7b 20 43 41 53 54 28 2d 32 65 2b 35 30 20 41 53  { CAST(-2e+50 AS
eb60: 20 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20   INT) } integer 
eb70: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
eb80: 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74 65 73  5808.do_expr_tes
eb90: 74 20 65 5f 65 78 70 72 2d 33 31 2e 32 2e 33 20  t e_expr-31.2.3 
eba0: 7b 20 0a 20 20 43 41 53 54 28 2d 39 32 32 33 33  { .  CAST(-92233
ebb0: 37 32 30 33 36 38 35 34 37 37 35 38 30 39 2e 30  72036854775809.0
ebc0: 20 41 53 20 49 4e 54 29 0a 7d 20 69 6e 74 65 67   AS INT).} integ
ebd0: 65 72 20 2d 39 32 32 33 33 37 32 30 33 36 38 35  er -922337203685
ebe0: 34 37 37 35 38 30 38 0a 64 6f 5f 65 78 70 72 5f  4775808.do_expr_
ebf0: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 32  test e_expr-31.2
ec00: 2e 34 20 7b 20 0a 20 20 43 41 53 54 28 39 32 32  .4 { .  CAST(922
ec10: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 39  3372036854775809
ec20: 2e 30 20 41 53 20 49 4e 54 29 0a 7d 20 69 6e 74  .0 AS INT).} int
ec30: 65 67 65 72 20 39 32 32 33 33 37 32 30 33 36 38  eger 92233720368
ec40: 35 34 37 37 35 38 30 37 0a 0a 0a 23 20 45 56 49  54775807...# EVI
ec50: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39 32 39  DENCE-OF: R-0929
ec60: 35 2d 36 31 33 33 37 20 43 61 73 74 69 6e 67 20  5-61337 Casting 
ec70: 61 20 54 45 58 54 20 6f 72 20 42 4c 4f 42 20 76  a TEXT or BLOB v
ec80: 61 6c 75 65 20 69 6e 74 6f 20 4e 55 4d 45 52 49  alue into NUMERI
ec90: 43 0a 23 20 66 69 72 73 74 20 64 6f 65 73 20 61  C.# first does a
eca0: 20 66 6f 72 63 65 64 20 63 6f 6e 76 65 72 73 69   forced conversi
ecb0: 6f 6e 20 69 6e 74 6f 20 52 45 41 4c 20 62 75 74  on into REAL but
ecc0: 20 74 68 65 6e 20 66 75 72 74 68 65 72 20 63 6f   then further co
ecd0: 6e 76 65 72 74 73 20 74 68 65 0a 23 20 72 65 73  nverts the.# res
ece0: 75 6c 74 20 69 6e 74 6f 20 49 4e 54 45 47 45 52  ult into INTEGER
ecf0: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
ed00: 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66  the conversion f
ed10: 72 6f 6d 20 52 45 41 4c 20 74 6f 20 49 4e 54 45  rom REAL to INTE
ed20: 47 45 52 0a 23 20 69 73 20 6c 6f 73 73 6c 65 73  GER.# is lossles
ed30: 73 20 61 6e 64 20 72 65 76 65 72 73 69 62 6c 65  s and reversible
ed40: 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  ..#.do_expr_test
ed50: 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e 31 20 7b   e_expr-32.1.1 {
ed60: 20 43 41 53 54 28 27 34 35 27 20 20 20 41 53 20   CAST('45'   AS 
ed70: 4e 55 4d 45 52 49 43 29 20 20 7d 20 69 6e 74 65  NUMERIC)  } inte
ed80: 67 65 72 20 34 35 0a 64 6f 5f 65 78 70 72 5f 74  ger 45.do_expr_t
ed90: 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e  est e_expr-32.1.
eda0: 32 20 7b 20 43 41 53 54 28 27 34 35 2e 30 27 20  2 { CAST('45.0' 
edb0: 41 53 20 4e 55 4d 45 52 49 43 29 20 20 7d 20 69  AS NUMERIC)  } i
edc0: 6e 74 65 67 65 72 20 34 35 0a 64 6f 5f 65 78 70  nteger 45.do_exp
edd0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32  r_test e_expr-32
ede0: 2e 31 2e 33 20 7b 20 43 41 53 54 28 27 34 35 2e  .1.3 { CAST('45.
edf0: 32 27 20 41 53 20 4e 55 4d 45 52 49 43 29 20 20  2' AS NUMERIC)  
ee00: 7d 20 72 65 61 6c 20 34 35 2e 32 0a 64 6f 5f 65  } real 45.2.do_e
ee10: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
ee20: 33 32 2e 31 2e 34 20 7b 20 43 41 53 54 28 27 31  32.1.4 { CAST('1
ee30: 31 61 62 63 27 20 41 53 20 4e 55 4d 45 52 49 43  1abc' AS NUMERIC
ee40: 29 20 7d 20 69 6e 74 65 67 65 72 20 31 31 0a 64  ) } integer 11.d
ee50: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
ee60: 70 72 2d 33 32 2e 31 2e 35 20 7b 20 43 41 53 54  pr-32.1.5 { CAST
ee70: 28 27 31 31 2e 31 61 62 63 27 20 41 53 20 4e 55  ('11.1abc' AS NU
ee80: 4d 45 52 49 43 29 20 7d 20 72 65 61 6c 20 31 31  MERIC) } real 11
ee90: 2e 31 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  .1..# EVIDENCE-O
eea0: 46 3a 20 52 2d 33 30 33 34 37 2d 31 38 37 30 32  F: R-30347-18702
eeb0: 20 43 61 73 74 69 6e 67 20 61 20 52 45 41 4c 20   Casting a REAL 
eec0: 6f 72 20 49 4e 54 45 47 45 52 20 76 61 6c 75 65  or INTEGER value
eed0: 20 74 6f 20 4e 55 4d 45 52 49 43 0a 23 20 69 73   to NUMERIC.# is
eee0: 20 61 20 6e 6f 2d 6f 70 2c 20 65 76 65 6e 20 69   a no-op, even i
eef0: 66 20 61 20 72 65 61 6c 20 76 61 6c 75 65 20 63  f a real value c
ef00: 6f 75 6c 64 20 62 65 20 6c 6f 73 73 6c 65 73 73  ould be lossless
ef10: 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  ly converted to 
ef20: 61 6e 0a 23 20 69 6e 74 65 67 65 72 2e 0a 23 0a  an.# integer..#.
ef30: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
ef40: 78 70 72 2d 33 32 2e 32 2e 31 20 7b 20 43 41 53  xpr-32.2.1 { CAS
ef50: 54 28 31 33 2e 30 20 41 53 20 4e 55 4d 45 52 49  T(13.0 AS NUMERI
ef60: 43 29 20 7d 20 72 65 61 6c 20 31 33 2e 30 0a 64  C) } real 13.0.d
ef70: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
ef80: 70 72 2d 33 32 2e 32 2e 32 20 7b 20 43 41 53 54  pr-32.2.2 { CAST
ef90: 28 31 33 2e 35 20 41 53 20 4e 55 4d 45 52 49 43  (13.5 AS NUMERIC
efa0: 29 20 7d 20 72 65 61 6c 20 31 33 2e 35 0a 0a 64  ) } real 13.5..d
efb0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
efc0: 70 72 2d 33 32 2e 32 2e 33 20 7b 20 0a 20 20 43  pr-32.2.3 { .  C
efd0: 41 53 54 28 2d 39 32 32 33 33 37 32 30 33 36 38  AST(-92233720368
efe0: 35 34 37 37 35 38 30 38 20 41 53 20 4e 55 4d 45  54775808 AS NUME
eff0: 52 49 43 29 0a 7d 20 69 6e 74 65 67 65 72 20 2d  RIC).} integer -
f000: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
f010: 38 30 38 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  808.do_expr_test
f020: 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 34 20 7b   e_expr-32.2.4 {
f030: 20 0a 20 20 43 41 53 54 28 39 32 32 33 33 37 32   .  CAST(9223372
f040: 30 33 36 38 35 34 37 37 35 38 30 37 20 41 53 20  036854775807 AS 
f050: 4e 55 4d 45 52 49 43 29 0a 7d 20 69 6e 74 65 67  NUMERIC).} integ
f060: 65 72 20 39 32 32 33 33 37 32 30 33 36 38 35 34  er 9223372036854
f070: 37 37 35 38 30 37 0a 64 6f 5f 65 78 70 72 5f 74  775807.do_expr_t
f080: 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e  est e_expr-32.2.
f090: 35 20 7b 20 0a 20 20 43 41 53 54 28 27 39 32 32  5 { .  CAST('922
f0a0: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
f0b0: 20 27 20 41 53 20 4e 55 4d 45 52 49 43 29 0a 7d   ' AS NUMERIC).}
f0c0: 20 69 6e 74 65 67 65 72 20 39 32 32 33 33 37 32   integer 9223372
f0d0: 30 33 36 38 35 34 37 37 35 38 30 37 0a 64 6f 5f  036854775807.do_
f0e0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
f0f0: 2d 33 32 2e 32 2e 36 20 7b 20 0a 20 20 43 41 53  -32.2.6 { .  CAS
f100: 54 28 27 20 20 20 39 32 32 33 33 37 32 30 33 36  T('   9223372036
f110: 38 35 34 37 37 35 38 30 37 20 20 20 27 20 41 53  854775807   ' AS
f120: 20 4e 55 4d 45 52 49 43 29 0a 7d 20 69 6e 74 65   NUMERIC).} inte
f130: 67 65 72 20 39 32 32 33 33 37 32 30 33 36 38 35  ger 922337203685
f140: 34 37 37 35 38 30 37 0a 64 6f 5f 65 78 70 72 5f  4775807.do_expr_
f150: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32  test e_expr-32.2
f160: 2e 37 20 7b 20 0a 20 20 43 41 53 54 28 27 20 20  .7 { .  CAST('  
f170: 27 20 41 53 20 4e 55 4d 45 52 49 43 29 0a 7d 20  ' AS NUMERIC).} 
f180: 69 6e 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 65  integer 0.do_exe
f190: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
f1a0: 2d 33 32 2e 32 2e 38 20 7b 0a 20 20 57 49 54 48  -32.2.8 {.  WITH
f1b0: 20 74 31 28 78 29 20 41 53 20 28 56 41 4c 55 45   t1(x) AS (VALUE
f1c0: 53 0a 20 20 20 20 20 28 27 39 30 30 30 30 30 30  S.     ('9000000
f1d0: 30 30 30 30 30 30 30 30 30 30 30 31 27 29 2c 0a  000000000001'),.
f1e0: 20 20 20 20 20 28 27 39 30 30 30 30 30 30 30 30       ('900000000
f1f0: 30 30 30 30 30 30 30 30 30 31 78 27 29 2c 0a 20  0000000001x'),. 
f200: 20 20 20 20 28 27 39 30 30 30 30 30 30 30 30 30      ('9000000000
f210: 30 30 30 30 30 30 30 30 31 20 27 29 2c 0a 20 20  000000001 '),.  
f220: 20 20 20 28 27 20 39 30 30 30 30 30 30 30 30 30     (' 9000000000
f230: 30 30 30 30 30 30 30 30 31 20 27 29 2c 0a 20 20  000000001 '),.  
f240: 20 20 20 28 27 20 39 30 30 30 30 30 30 30 30 30     (' 9000000000
f250: 30 30 30 30 30 30 30 30 31 27 29 2c 0a 20 20 20  000000001'),.   
f260: 20 20 28 27 20 39 30 30 30 30 30 30 30 30 30 30    (' 90000000000
f270: 30 30 30 30 30 30 30 31 2e 27 29 2c 0a 20 20 20  00000001.'),.   
f280: 20 20 28 27 39 32 32 33 33 37 32 30 33 36 38 35    ('922337203685
f290: 34 37 37 35 38 30 37 27 29 2c 0a 20 20 20 20 20  4775807'),.     
f2a0: 28 27 39 32 32 33 33 37 32 30 33 36 38 35 34 37  ('92233720368547
f2b0: 37 35 38 30 37 20 27 29 2c 0a 20 20 20 20 20 28  75807 '),.     (
f2c0: 27 20 20 20 39 32 32 33 33 37 32 30 33 36 38 35  '   922337203685
f2d0: 34 37 37 35 38 30 37 20 20 20 27 29 2c 0a 20 20  4775807   '),.  
f2e0: 20 20 20 28 27 39 32 32 33 33 37 32 30 33 36 38     ('92233720368
f2f0: 35 34 37 37 35 38 30 38 27 29 2c 0a 20 20 20 20  54775808'),.    
f300: 20 28 27 20 20 20 39 32 32 33 33 37 32 30 33 36   ('   9223372036
f310: 38 35 34 37 37 35 38 30 38 20 20 20 27 29 2c 0a  854775808   '),.
f320: 20 20 20 20 20 28 27 39 32 32 33 33 37 32 30 33       ('922337203
f330: 36 38 35 34 37 37 35 38 30 37 2e 30 27 29 2c 0a  6854775807.0'),.
f340: 20 20 20 20 20 28 27 39 32 32 33 33 37 32 30 33       ('922337203
f350: 36 38 35 34 37 37 35 38 30 37 65 2b 30 27 29 2c  6854775807e+0'),
f360: 0a 20 20 20 20 20 28 27 2d 35 2e 30 27 29 2c 0a  .     ('-5.0'),.
f370: 20 20 20 20 20 28 27 2d 35 65 2b 30 27 29 29 0a       ('-5e+0')).
f380: 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28    SELECT typeof(
f390: 43 41 53 54 28 78 20 41 53 20 4e 55 4d 45 52 49  CAST(x AS NUMERI
f3a0: 43 29 29 2c 20 43 41 53 54 28 78 20 41 53 20 4e  C)), CAST(x AS N
f3b0: 55 4d 45 52 49 43 29 7c 7c 27 27 20 46 52 4f 4d  UMERIC)||'' FROM
f3c0: 20 74 31 3b 0a 7d 20 5b 6c 69 73 74 20 5c 0a 20   t1;.} [list \. 
f3d0: 69 6e 74 65 67 65 72 20 39 30 30 30 30 30 30 30  integer 90000000
f3e0: 30 30 30 30 30 30 30 30 30 30 31 20 5c 0a 20 69  00000000001 \. i
f3f0: 6e 74 65 67 65 72 20 39 30 30 30 30 30 30 30 30  nteger 900000000
f400: 30 30 30 30 30 30 30 30 30 31 20 5c 0a 20 69 6e  0000000001 \. in
f410: 74 65 67 65 72 20 39 30 30 30 30 30 30 30 30 30  teger 9000000000
f420: 30 30 30 30 30 30 30 30 31 20 5c 0a 20 69 6e 74  000000001 \. int
f430: 65 67 65 72 20 39 30 30 30 30 30 30 30 30 30 30  eger 90000000000
f440: 30 30 30 30 30 30 30 31 20 5c 0a 20 69 6e 74 65  00000001 \. inte
f450: 67 65 72 20 39 30 30 30 30 30 30 30 30 30 30 30  ger 900000000000
f460: 30 30 30 30 30 30 31 20 5c 0a 20 69 6e 74 65 67  0000001 \. integ
f470: 65 72 20 39 30 30 30 30 30 30 30 30 30 30 30 30  er 9000000000000
f480: 30 30 30 30 30 31 20 5c 0a 20 69 6e 74 65 67 65  000001 \. intege
f490: 72 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37  r 92233720368547
f4a0: 37 35 38 30 37 20 5c 0a 20 69 6e 74 65 67 65 72  75807 \. integer
f4b0: 20 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37   922337203685477
f4c0: 35 38 30 37 20 5c 0a 20 69 6e 74 65 67 65 72 20  5807 \. integer 
f4d0: 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
f4e0: 38 30 37 20 5c 0a 20 72 65 61 6c 20 39 2e 32 32  807 \. real 9.22
f4f0: 33 33 37 32 30 33 36 38 35 34 37 38 65 2b 31 38  337203685478e+18
f500: 20 5c 0a 20 72 65 61 6c 20 39 2e 32 32 33 33 37   \. real 9.22337
f510: 32 30 33 36 38 35 34 37 38 65 2b 31 38 20 5c 0a  203685478e+18 \.
f520: 20 69 6e 74 65 67 65 72 20 39 32 32 33 33 37 32   integer 9223372
f530: 30 33 36 38 35 34 37 37 35 38 30 37 20 5c 0a 20  036854775807 \. 
f540: 69 6e 74 65 67 65 72 20 39 32 32 33 33 37 32 30  integer 92233720
f550: 33 36 38 35 34 37 37 35 38 30 37 20 5c 0a 20 69  36854775807 \. i
f560: 6e 74 65 67 65 72 20 2d 35 20 5c 0a 20 69 6e 74  nteger -5 \. int
f570: 65 67 65 72 20 2d 35 20 5c 0a 5d 0a 0a 23 20 45  eger -5 \.]..# E
f580: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 34  VIDENCE-OF: R-64
f590: 35 35 30 2d 32 39 31 39 31 20 4e 6f 74 65 20 74  550-29191 Note t
f5a0: 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 66  hat the result f
f5b0: 72 6f 6d 20 63 61 73 74 69 6e 67 20 61 6e 79 0a  rom casting any.
f5c0: 23 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65  # non-BLOB value
f5d0: 20 69 6e 74 6f 20 61 20 42 4c 4f 42 20 61 6e 64   into a BLOB and
f5e0: 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d   the result from
f5f0: 20 63 61 73 74 69 6e 67 20 61 6e 79 20 42 4c 4f   casting any BLO
f600: 42 20 76 61 6c 75 65 0a 23 20 69 6e 74 6f 20 61  B value.# into a
f610: 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65 20   non-BLOB value 
f620: 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74  may be different
f630: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
f640: 65 74 68 65 72 20 74 68 65 0a 23 20 64 61 74 61  ether the.# data
f650: 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 69 73  base encoding is
f660: 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 62 65   UTF-8, UTF-16be
f670: 2c 20 6f 72 20 55 54 46 2d 31 36 6c 65 2e 0a 23  , or UTF-16le..#
f680: 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66 31  .ifcapable {utf1
f690: 36 7d 20 7b 0a 73 71 6c 69 74 65 33 20 64 62 31  6} {.sqlite3 db1
f6a0: 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 31 20   :memory: ; db1 
f6b0: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e  eval { PRAGMA en
f6c0: 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 38 27  coding = 'utf-8'
f6d0: 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 32 20 3a   }.sqlite3 db2 :
f6e0: 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 32 20 65 76  memory: ; db2 ev
f6f0: 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f  al { PRAGMA enco
f700: 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c 65  ding = 'utf-16le
f710: 27 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 33 20  ' }.sqlite3 db3 
f720: 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 33 20 65  :memory: ; db3 e
f730: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63  val { PRAGMA enc
f740: 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 62  oding = 'utf-16b
f750: 65 27 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  e' }.foreach {tn
f760: 20 63 61 73 74 65 78 70 72 20 64 69 66 66 65 72   castexpr differ
f770: 73 7d 20 7b 0a 20 20 31 20 7b 20 43 41 53 54 28  s} {.  1 { CAST(
f780: 31 32 33 20 41 53 20 42 4c 4f 42 29 20 20 20 20  123 AS BLOB)    
f790: 7d 20 31 0a 20 20 32 20 7b 20 43 41 53 54 28 27  } 1.  2 { CAST('
f7a0: 27 20 41 53 20 42 4c 4f 42 29 20 20 20 20 20 7d  ' AS BLOB)     }
f7b0: 20 30 0a 20 20 33 20 7b 20 43 41 53 54 28 27 61   0.  3 { CAST('a
f7c0: 62 63 64 27 20 41 53 20 42 4c 4f 42 29 20 7d 20  bcd' AS BLOB) } 
f7d0: 31 0a 0a 20 20 34 20 7b 20 43 41 53 54 28 58 27  1..  4 { CAST(X'
f7e0: 61 62 63 64 27 20 41 53 20 54 45 58 54 29 20 7d  abcd' AS TEXT) }
f7f0: 20 31 0a 20 20 35 20 7b 20 43 41 53 54 28 58 27   1.  5 { CAST(X'
f800: 27 20 41 53 20 54 45 58 54 29 20 20 20 20 20 7d  ' AS TEXT)     }
f810: 20 30 0a 7d 20 7b 0a 20 20 73 65 74 20 72 31 20   0.} {.  set r1 
f820: 5b 64 62 31 20 65 76 61 6c 20 22 53 45 4c 45 43  [db1 eval "SELEC
f830: 54 20 74 79 70 65 6f 66 28 24 63 61 73 74 65 78  T typeof($castex
f840: 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61 73 74  pr), quote($cast
f850: 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20 72 32  expr)"].  set r2
f860: 20 5b 64 62 32 20 65 76 61 6c 20 22 53 45 4c 45   [db2 eval "SELE
f870: 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74 65  CT typeof($caste
f880: 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61 73  xpr), quote($cas
f890: 74 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20 72  texpr)"].  set r
f8a0: 33 20 5b 64 62 33 20 65 76 61 6c 20 22 53 45 4c  3 [db3 eval "SEL
f8b0: 45 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74  ECT typeof($cast
f8c0: 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61  expr), quote($ca
f8d0: 73 74 65 78 70 72 29 22 5d 0a 0a 20 20 69 66 20  stexpr)"]..  if 
f8e0: 7b 24 64 69 66 66 65 72 73 7d 20 7b 0a 20 20 20  {$differs} {.   
f8f0: 20 73 65 74 20 72 65 73 20 5b 65 78 70 72 20 7b   set res [expr {
f900: 24 72 31 21 3d 24 72 32 20 26 26 20 24 72 32 21  $r1!=$r2 && $r2!
f910: 3d 24 72 33 7d 5d 0a 20 20 7d 20 65 6c 73 65 20  =$r3}].  } else 
f920: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b 65  {.    set res [e
f930: 78 70 72 20 7b 24 72 31 3d 3d 24 72 32 20 26 26  xpr {$r1==$r2 &&
f940: 20 24 72 32 3d 3d 24 72 33 7d 5d 0a 20 20 7d 0a   $r2==$r3}].  }.
f950: 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 65 78 70  .  do_test e_exp
f960: 72 2d 33 33 2e 31 2e 24 74 6e 20 7b 73 65 74 20  r-33.1.$tn {set 
f970: 72 65 73 7d 20 31 0a 7d 0a 64 62 31 20 63 6c 6f  res} 1.}.db1 clo
f980: 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 64 62 33  se.db2 close.db3
f990: 20 63 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d   close.}..#-----
f9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9e0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74  ----.# Test stat
f9f0: 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74  ements related t
fa00: 6f 20 74 68 65 20 45 58 49 53 54 53 20 61 6e 64  o the EXISTS and
fa10: 20 4e 4f 54 20 45 58 49 53 54 53 20 6f 70 65 72   NOT EXISTS oper
fa20: 61 74 6f 72 73 2e 0a 23 0a 63 61 74 63 68 20 7b  ators..#.catch {
fa30: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63   db close }.forc
fa40: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a  edelete test.db.
fa50: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
fa60: 64 62 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  db..do_execsql_t
fa70: 65 73 74 20 65 5f 65 78 70 72 2d 33 34 2e 31 20  est e_expr-34.1 
fa80: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
fa90: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53   t1(a, b);.  INS
faa0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
fab0: 45 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45  ES(1, 2);.  INSE
fac0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
fad0: 53 28 4e 55 4c 4c 2c 20 32 29 3b 0a 20 20 49 4e  S(NULL, 2);.  IN
fae0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
faf0: 55 45 53 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20 20  UES(1, NULL);.  
fb00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
fb10: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c 4c  ALUES(NULL, NULL
fb20: 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44 45  );.} {}..# EVIDE
fb30: 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 35 38 38 2d  NCE-OF: R-25588-
fb40: 32 37 31 38 31 20 54 68 65 20 45 58 49 53 54 53  27181 The EXISTS
fb50: 20 6f 70 65 72 61 74 6f 72 20 61 6c 77 61 79 73   operator always
fb60: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 6f 6e   evaluates to on
fb70: 65 0a 23 20 6f 66 20 74 68 65 20 69 6e 74 65 67  e.# of the integ
fb80: 65 72 20 76 61 6c 75 65 73 20 30 20 61 6e 64 20  er values 0 and 
fb90: 31 2e 0a 23 0a 23 20 54 68 69 73 20 73 74 61 74  1..#.# This stat
fba0: 65 6d 65 6e 74 20 69 73 20 6e 6f 74 20 74 65 73  ement is not tes
fbb0: 74 65 64 20 62 79 20 69 74 73 65 6c 66 2e 20 49  ted by itself. I
fbc0: 6e 73 74 65 61 64 2c 20 61 6c 6c 20 65 5f 65 78  nstead, all e_ex
fbd0: 70 72 2d 33 34 2e 2a 20 74 65 73 74 73 20 0a 23  pr-34.* tests .#
fbe0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
fbf0: 70 6f 69 6e 74 20 65 78 70 6c 69 63 69 74 6c 79  point explicitly
fc00: 20 74 65 73 74 20 74 68 61 74 20 73 70 65 63 69   test that speci
fc10: 66 69 63 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20  fic invocations 
fc20: 6f 66 20 45 58 49 53 54 53 0a 23 20 72 65 74 75  of EXISTS.# retu
fc30: 72 6e 20 65 69 74 68 65 72 20 69 6e 74 65 67 65  rn either intege
fc40: 72 20 30 20 6f 72 20 69 6e 74 65 67 65 72 20 31  r 0 or integer 1
fc50: 2e 0a 23 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  ..#..# EVIDENCE-
fc60: 4f 46 3a 20 52 2d 35 38 35 35 33 2d 36 33 37 34  OF: R-58553-6374
fc70: 30 20 49 66 20 65 78 65 63 75 74 69 6e 67 20 74  0 If executing t
fc80: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
fc90: 65 6e 74 20 73 70 65 63 69 66 69 65 64 0a 23 20  ent specified.# 
fca0: 61 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  as the right-han
fcb0: 64 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65  d operand of the
fcc0: 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72   EXISTS operator
fcd0: 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e   would return on
fce0: 65 20 6f 72 0a 23 20 6d 6f 72 65 20 72 6f 77 73  e or.# more rows
fcf0: 2c 20 74 68 65 6e 20 74 68 65 20 45 58 49 53 54  , then the EXIST
fd00: 53 20 6f 70 65 72 61 74 6f 72 20 65 76 61 6c 75  S operator evalu
fd10: 61 74 65 73 20 74 6f 20 31 2e 0a 23 0a 66 6f 72  ates to 1..#.for
fd20: 65 61 63 68 20 7b 74 6e 20 65 78 70 72 7d 20 7b  each {tn expr} {
fd30: 0a 20 20 20 20 31 20 7b 20 45 58 49 53 54 53 20  .    1 { EXISTS 
fd40: 28 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20  ( SELECT a FROM 
fd50: 74 31 20 29 20 7d 0a 20 20 20 20 32 20 7b 20 45  t1 ) }.    2 { E
fd60: 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 62  XISTS ( SELECT b
fd70: 20 46 52 4f 4d 20 74 31 20 29 20 7d 0a 20 20 20   FROM t1 ) }.   
fd80: 20 33 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   3 { EXISTS ( SE
fd90: 4c 45 43 54 20 32 34 20 29 20 7d 0a 20 20 20 20  LECT 24 ) }.    
fda0: 34 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c  4 { EXISTS ( SEL
fdb0: 45 43 54 20 4e 55 4c 4c 20 29 20 7d 0a 20 20 20  ECT NULL ) }.   
fdc0: 20 35 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   5 { EXISTS ( SE
fdd0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57  LECT a FROM t1 W
fde0: 48 45 52 45 20 61 20 49 53 20 4e 55 4c 4c 20 29  HERE a IS NULL )
fdf0: 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70 72   }.} {.  do_expr
fe00: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34 2e  _test e_expr-34.
fe10: 32 2e 24 74 6e 20 24 65 78 70 72 20 69 6e 74 65  2.$tn $expr inte
fe20: 67 65 72 20 31 0a 7d 0a 0a 23 20 45 56 49 44 45  ger 1.}..# EVIDE
fe30: 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 36 37 33 2d  NCE-OF: R-19673-
fe40: 34 30 39 37 32 20 49 66 20 65 78 65 63 75 74 69  40972 If executi
fe50: 6e 67 20 74 68 65 20 53 45 4c 45 43 54 20 77 6f  ng the SELECT wo
fe60: 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f 0a 23 20  uld return no.# 
fe70: 72 6f 77 73 20 61 74 20 61 6c 6c 2c 20 74 68 65  rows at all, the
fe80: 6e 20 74 68 65 20 45 58 49 53 54 53 20 6f 70 65  n the EXISTS ope
fe90: 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73 20  rator evaluates 
fea0: 74 6f 20 30 2e 0a 23 0a 66 6f 72 65 61 63 68 20  to 0..#.foreach 
feb0: 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20 20  {tn expr} {.    
fec0: 31 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c  1 { EXISTS ( SEL
fed0: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48  ECT a FROM t1 WH
fee0: 45 52 45 20 30 29 20 7d 0a 20 20 20 20 32 20 7b  ERE 0) }.    2 {
fef0: 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54   EXISTS ( SELECT
ff00: 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   b FROM t1 WHERE
ff10: 20 61 20 3d 20 35 29 20 7d 0a 20 20 20 20 33 20   a = 5) }.    3 
ff20: 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43  { EXISTS ( SELEC
ff30: 54 20 32 34 20 57 48 45 52 45 20 30 29 20 7d 0a  T 24 WHERE 0) }.
ff40: 20 20 20 20 34 20 7b 20 45 58 49 53 54 53 20 28      4 { EXISTS (
ff50: 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 57 48 45   SELECT NULL WHE
ff60: 52 45 20 31 3d 32 29 20 7d 0a 7d 20 7b 0a 20 20  RE 1=2) }.} {.  
ff70: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
ff80: 78 70 72 2d 33 34 2e 33 2e 24 74 6e 20 24 65 78  xpr-34.3.$tn $ex
ff90: 70 72 20 69 6e 74 65 67 65 72 20 30 0a 7d 0a 0a  pr integer 0.}..
ffa0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
ffb0: 2d 33 35 31 30 39 2d 34 39 31 33 39 20 54 68 65  -35109-49139 The
ffc0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
ffd0: 6e 73 20 69 6e 20 65 61 63 68 20 72 6f 77 20 72  ns in each row r
ffe0: 65 74 75 72 6e 65 64 0a 23 20 62 79 20 74 68 65  eturned.# by the
fff0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10000 74 20 28 69 66 20 61 6e 79 29 20 61 6e 64 20 74  t (if any) and t
10010 68 65 20 73 70 65 63 69 66 69 63 20 76 61 6c 75  he specific valu
10020 65 73 20 72 65 74 75 72 6e 65 64 20 68 61 76 65  es returned have
10030 0a 23 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20  .# no effect on 
10040 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
10050 68 65 20 45 58 49 53 54 53 20 6f 70 65 72 61 74  he EXISTS operat
10060 6f 72 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  or..#.foreach {t
10070 6e 20 65 78 70 72 20 72 65 73 7d 20 7b 0a 20 20  n expr res} {.  
10080 20 20 31 20 7b 20 45 58 49 53 54 53 20 28 20 53    1 { EXISTS ( S
10090 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
100a0 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ) }             
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a 20               1. 
100c0 20 20 20 32 20 7b 20 45 58 49 53 54 53 20 28 20     2 { EXISTS ( 
100d0 53 45 4c 45 43 54 20 2a 2c 20 2a 2c 20 2a 20 46  SELECT *, *, * F
100e0 52 4f 4d 20 74 31 20 29 20 7d 20 20 20 20 20 20  ROM t1 ) }      
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
10100 20 20 20 20 33 20 7b 20 45 58 49 53 54 53 20 28      3 { EXISTS (
10110 20 53 45 4c 45 43 54 20 32 34 2c 20 32 35 20 29   SELECT 24, 25 )
10120 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
10140 0a 20 20 20 20 34 20 7b 20 45 58 49 53 54 53 20  .    4 { EXISTS 
10150 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 4e  ( SELECT NULL, N
10160 55 4c 4c 2c 20 4e 55 4c 4c 20 29 20 7d 20 20 20  ULL, NULL ) }   
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10180 31 0a 20 20 20 20 35 20 7b 20 45 58 49 53 54 53  1.    5 { EXISTS
10190 20 28 20 53 45 4c 45 43 54 20 61 2c 62 2c 61 7c   ( SELECT a,b,a|
101a0 7c 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  |b FROM t1 WHERE
101b0 20 61 20 49 53 20 4e 55 4c 4c 20 29 20 7d 20 20   a IS NULL ) }  
101c0 20 31 0a 0a 20 20 20 20 36 20 7b 20 45 58 49 53   1..    6 { EXIS
101d0 54 53 20 28 20 53 45 4c 45 43 54 20 61 2c 20 61  TS ( SELECT a, a
101e0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 30   FROM t1 WHERE 0
101f0 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ) }             
10200 20 20 20 30 0a 20 20 20 20 37 20 7b 20 45 58 49     0.    7 { EXI
10210 53 54 53 20 28 20 53 45 4c 45 43 54 20 62 2c 20  STS ( SELECT b, 
10220 62 2c 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  b, a FROM t1 WHE
10230 52 45 20 61 20 3d 20 35 29 20 7d 20 20 20 20 20  RE a = 5) }     
10240 20 20 20 20 30 0a 20 20 20 20 38 20 7b 20 45 58      0.    8 { EX
10250 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 32 34  ISTS ( SELECT 24
10260 2c 20 34 36 2c 20 38 39 20 57 48 45 52 45 20 30  , 46, 89 WHERE 0
10270 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ) }             
10280 20 20 20 20 20 30 0a 20 20 20 20 39 20 7b 20 45       0.    9 { E
10290 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 4e  XISTS ( SELECT N
102a0 55 4c 4c 2c 20 4e 55 4c 4c 20 57 48 45 52 45 20  ULL, NULL WHERE 
102b0 31 3d 32 29 20 7d 20 20 20 20 20 20 20 20 20 20  1=2) }          
102c0 20 20 20 20 20 20 30 0a 7d 20 7b 0a 20 20 64 6f        0.} {.  do
102d0 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
102e0 72 2d 33 34 2e 34 2e 24 74 6e 20 24 65 78 70 72  r-34.4.$tn $expr
102f0 20 69 6e 74 65 67 65 72 20 24 72 65 73 0a 7d 0a   integer $res.}.
10300 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
10310 52 2d 31 30 36 34 35 2d 31 32 34 33 39 20 49 6e  R-10645-12439 In
10320 20 70 61 72 74 69 63 75 6c 61 72 2c 20 72 6f 77   particular, row
10330 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55 4c  s containing NUL
10340 4c 20 76 61 6c 75 65 73 0a 23 20 61 72 65 20 6e  L values.# are n
10350 6f 74 20 68 61 6e 64 6c 65 64 20 61 6e 79 20 64  ot handled any d
10360 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20  ifferently from 
10370 72 6f 77 73 20 77 69 74 68 6f 75 74 20 4e 55 4c  rows without NUL
10380 4c 20 76 61 6c 75 65 73 2e 0a 23 0a 66 6f 72 65  L values..#.fore
10390 61 63 68 20 7b 74 6e 20 65 31 20 65 32 7d 20 7b  ach {tn e1 e2} {
103a0 0a 20 20 31 20 7b 20 45 58 49 53 54 53 20 28 53  .  1 { EXISTS (S
103b0 45 4c 45 43 54 20 27 6e 6f 74 20 6e 75 6c 6c 27  ELECT 'not null'
103c0 29 20 7d 20 20 20 20 7b 20 45 58 49 53 54 53 20  ) }    { EXISTS 
103d0 28 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d 0a  (SELECT NULL) }.
103e0 20 20 32 20 7b 20 45 58 49 53 54 53 20 28 53 45    2 { EXISTS (SE
103f0 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20 74  LECT NULL FROM t
10400 31 29 20 7d 20 20 7b 20 45 58 49 53 54 53 20 28  1) }  { EXISTS (
10410 53 45 4c 45 43 54 20 27 62 72 65 61 64 27 20 46  SELECT 'bread' F
10420 52 4f 4d 20 74 31 29 20 7d 0a 7d 20 7b 0a 20 20  ROM t1) }.} {.  
10430 73 65 74 20 72 65 73 20 5b 64 62 20 6f 6e 65 20  set res [db one 
10440 22 53 45 4c 45 43 54 20 24 65 31 22 5d 0a 20 20  "SELECT $e1"].  
10450 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
10460 78 70 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d 61 20  xpr-34.5.${tn}a 
10470 24 65 31 20 69 6e 74 65 67 65 72 20 24 72 65 73  $e1 integer $res
10480 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .  do_expr_test 
10490 65 5f 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74 6e  e_expr-34.5.${tn
104a0 7d 62 20 24 65 32 20 69 6e 74 65 67 65 72 20 24  }b $e2 integer $
104b0 72 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  res.}..#--------
104c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
104f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10500 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65 6d 65  -.# Test stateme
10510 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 73  nts related to s
10520 63 61 6c 61 72 20 73 75 62 2d 71 75 65 72 69 65  calar sub-querie
10530 73 2e 0a 23 0a 0a 63 61 74 63 68 20 7b 20 64 62  s..#..catch { db
10540 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64 65   close }.forcede
10550 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 73 71 6c  lete test.db.sql
10560 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
10570 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  do_test e_expr-3
10580 35 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.0 {.  execsql 
10590 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
105a0 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  LE t2(a, b);.   
105b0 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
105c0 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 74  VALUES('one', 't
105d0 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  wo');.    INSERT
105e0 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
105f0 27 74 68 72 65 65 27 2c 20 4e 55 4c 4c 29 3b 0a  'three', NULL);.
10600 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
10610 74 32 20 56 41 4c 55 45 53 28 34 2c 20 35 2e 30  t2 VALUES(4, 5.0
10620 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 45  );.  }.} {}..# E
10630 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33  VIDENCE-OF: R-43
10640 35 37 33 2d 32 33 34 34 38 20 41 20 53 45 4c 45  573-23448 A SELE
10650 43 54 20 73 74 61 74 65 6d 65 6e 74 20 65 6e 63  CT statement enc
10660 6c 6f 73 65 64 20 69 6e 20 70 61 72 65 6e 74 68  losed in parenth
10670 65 73 65 73 0a 23 20 69 73 20 61 20 73 75 62 71  eses.# is a subq
10680 75 65 72 79 2e 0a 23 0a 23 20 45 56 49 44 45 4e  uery..#.# EVIDEN
10690 43 45 2d 4f 46 3a 20 52 2d 35 36 32 39 34 2d 30  CE-OF: R-56294-0
106a0 33 39 36 36 20 41 6c 6c 20 74 79 70 65 73 20 6f  3966 All types o
106b0 66 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  f SELECT stateme
106c0 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 0a 23 20  nt, including.# 
106d0 61 67 67 72 65 67 61 74 65 20 61 6e 64 20 63 6f  aggregate and co
106e0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 71 75  mpound SELECT qu
106f0 65 72 69 65 73 20 28 71 75 65 72 69 65 73 20 77  eries (queries w
10700 69 74 68 20 6b 65 79 77 6f 72 64 73 20 6c 69 6b  ith keywords lik
10710 65 0a 23 20 55 4e 49 4f 4e 20 6f 72 20 45 58 43  e.# UNION or EXC
10720 45 50 54 29 20 61 72 65 20 61 6c 6c 6f 77 65 64  EPT) are allowed
10730 20 61 73 20 73 63 61 6c 61 72 20 73 75 62 71 75   as scalar subqu
10740 65 72 69 65 73 2e 0a 23 0a 64 6f 5f 65 78 70 72  eries..#.do_expr
10750 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e  _test e_expr-35.
10760 31 2e 31 20 7b 20 28 53 45 4c 45 43 54 20 33 35  1.1 { (SELECT 35
10770 29 20 20 20 7d 20 69 6e 74 65 67 65 72 20 33 35  )   } integer 35
10780 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
10790 65 78 70 72 2d 33 35 2e 31 2e 32 20 7b 20 28 53  expr-35.1.2 { (S
107a0 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d 20 6e 75  ELECT NULL) } nu
107b0 6c 6c 20 7b 7d 0a 0a 64 6f 5f 65 78 70 72 5f 74  ll {}..do_expr_t
107c0 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e  est e_expr-35.1.
107d0 33 20 7b 20 28 53 45 4c 45 43 54 20 63 6f 75 6e  3 { (SELECT coun
107e0 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 7d 20  t(*) FROM t2) } 
107f0 69 6e 74 65 67 65 72 20 33 0a 64 6f 5f 65 78 70  integer 3.do_exp
10800 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35  r_test e_expr-35
10810 2e 31 2e 34 20 7b 20 28 53 45 4c 45 43 54 20 34  .1.4 { (SELECT 4
10820 20 46 52 4f 4d 20 74 32 29 20 7d 20 69 6e 74 65   FROM t2) } inte
10830 67 65 72 20 34 0a 0a 64 6f 5f 65 78 70 72 5f 74  ger 4..do_expr_t
10840 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31 2e  est e_expr-35.1.
10850 35 20 7b 20 0a 20 20 28 53 45 4c 45 43 54 20 62  5 { .  (SELECT b
10860 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
10870 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 74  ELECT a+1 FROM t
10880 32 29 0a 7d 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f  2).} null {}.do_
10890 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
108a0 2d 33 35 2e 31 2e 36 20 7b 20 0a 20 20 28 53 45  -35.1.6 { .  (SE
108b0 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 32 20 55  LECT a FROM t2 U
108c0 4e 49 4f 4e 20 53 45 4c 45 43 54 20 43 4f 41 4c  NION SELECT COAL
108d0 45 53 43 45 28 62 2c 20 35 35 29 20 46 52 4f 4d  ESCE(b, 55) FROM
108e0 20 74 32 20 4f 52 44 45 52 20 42 59 20 31 29 0a   t2 ORDER BY 1).
108f0 7d 20 69 6e 74 65 67 65 72 20 34 0a 0a 23 20 45  } integer 4..# E
10900 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32  VIDENCE-OF: R-22
10910 32 33 39 2d 33 33 37 34 30 20 41 20 73 75 62 71  239-33740 A subq
10920 75 65 72 79 20 74 68 61 74 20 72 65 74 75 72 6e  uery that return
10930 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f  s two or more co
10940 6c 75 6d 6e 73 0a 23 20 69 73 20 61 20 72 6f 77  lumns.# is a row
10950 20 76 61 6c 75 65 20 73 75 62 71 75 65 72 79 20   value subquery 
10960 61 6e 64 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  and can only be 
10970 75 73 65 64 20 61 73 20 74 68 65 20 6f 70 65 72  used as the oper
10980 61 6e 64 20 6f 66 20 61 0a 23 20 63 6f 6d 70 61  and of a.# compa
10990 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
109a0 23 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  #.# The followin
109b0 67 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 74 68  g block tests th
109c0 61 74 20 65 72 72 6f 72 73 20 61 72 65 20 72 65  at errors are re
109d0 74 75 72 6e 65 64 20 69 6e 20 61 20 62 75 6e 63  turned in a bunc
109e0 68 20 6f 66 20 63 61 73 65 73 0a 23 20 77 68 65  h of cases.# whe
109f0 72 65 20 61 20 73 75 62 71 75 65 72 79 20 72 65  re a subquery re
10a00 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  turns more than 
10a10 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 73 65  one column..#.se
10a20 74 20 4d 20 7b 2f 31 20 7b 73 75 62 2d 73 65 6c  t M {/1 {sub-sel
10a30 65 63 74 20 72 65 74 75 72 6e 73 20 5b 32 33 5d  ect returns [23]
10a40 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65 63   columns - expec
10a50 74 65 64 20 31 7d 2f 7d 0a 66 6f 72 65 61 63 68  ted 1}/}.foreach
10a60 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20 31 20   {tn sql} {.  1 
10a70 20 20 20 20 7b 20 53 45 4c 45 43 54 20 28 53 45      { SELECT (SE
10a80 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 55  LECT * FROM t2 U
10a90 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61 2b 31 2c  NION SELECT a+1,
10aa0 20 62 2b 31 20 46 52 4f 4d 20 74 32 29 20 7d 0a   b+1 FROM t2) }.
10ab0 20 20 32 20 20 20 20 20 7b 20 53 45 4c 45 43 54    2     { SELECT
10ac0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
10ad0 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
10ae0 61 2b 31 2c 20 62 2b 31 20 46 52 4f 4d 20 74 32  a+1, b+1 FROM t2
10af0 20 4f 52 44 45 52 20 42 59 20 31 29 20 7d 0a 20   ORDER BY 1) }. 
10b00 20 33 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20   3     { SELECT 
10b10 28 53 45 4c 45 43 54 20 31 2c 20 32 29 20 7d 0a  (SELECT 1, 2) }.
10b20 20 20 34 20 20 20 20 20 7b 20 53 45 4c 45 43 54    4     { SELECT
10b30 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20 4e   (SELECT NULL, N
10b40 55 4c 4c 2c 20 4e 55 4c 4c 29 20 7d 0a 20 20 35  ULL, NULL) }.  5
10b50 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20 28 53       { SELECT (S
10b60 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 29  ELECT * FROM t2)
10b70 20 7d 0a 20 20 36 20 20 20 20 20 7b 20 53 45 4c   }.  6     { SEL
10b80 45 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46 52  ECT (SELECT * FR
10b90 4f 4d 20 28 53 45 4c 45 43 54 20 31 2c 20 32 2c  OM (SELECT 1, 2,
10ba0 20 33 29 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f   3)) }.} {.  do_
10bb0 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f  catchsql_test e_
10bc0 65 78 70 72 2d 33 35 2e 32 2e 24 74 6e 20 24 73  expr-35.2.$tn $s
10bd0 71 6c 20 24 4d 0a 7d 0a 0a 23 20 45 56 49 44 45  ql $M.}..# EVIDE
10be0 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 33 31 38 2d  NCE-OF: R-18318-
10bf0 31 34 39 39 35 20 54 68 65 20 76 61 6c 75 65 20  14995 The value 
10c00 6f 66 20 61 20 73 75 62 71 75 65 72 79 20 65 78  of a subquery ex
10c10 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 0a  pression is the.
10c20 23 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 74  # first row of t
10c30 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d 20 74  he result from t
10c40 68 65 20 65 6e 63 6c 6f 73 65 64 20 53 45 4c 45  he enclosed SELE
10c50 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a  CT statement..#.
10c60 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
10c70 2d 31 35 39 30 30 2d 35 32 31 35 36 20 49 6e 20  -15900-52156 In 
10c80 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 6e 20  other words, an 
10c90 69 6d 70 6c 69 65 64 20 22 4c 49 4d 49 54 20 31  implied "LIMIT 1
10ca0 22 20 69 73 0a 23 20 61 64 64 65 64 20 74 6f 20  " is.# added to 
10cb0 74 68 65 20 73 75 62 71 75 65 72 79 2c 20 6f 76  the subquery, ov
10cc0 65 72 72 69 64 69 6e 67 20 61 6e 20 65 78 70 6c  erriding an expl
10cd0 69 63 69 74 6c 79 20 63 6f 64 65 64 20 4c 49 4d  icitly coded LIM
10ce0 49 54 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  IT..#.do_execsql
10cf0 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 36 2e  _test e_expr-36.
10d00 33 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  3.1 {.  CREATE T
10d10 41 42 4c 45 20 74 34 28 78 2c 20 79 29 3b 0a 20  ABLE t4(x, y);. 
10d20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
10d30 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27 29  VALUES(1, 'one')
10d40 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
10d50 74 34 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77  t4 VALUES(2, 'tw
10d60 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  o');.  INSERT IN
10d70 54 4f 20 74 34 20 56 41 4c 55 45 53 28 33 2c 20  TO t4 VALUES(3, 
10d80 27 74 68 72 65 65 27 29 3b 0a 7d 20 7b 7d 0a 0a  'three');.} {}..
10d90 66 6f 72 65 61 63 68 20 7b 74 6e 20 65 78 70 72  foreach {tn expr
10da0 20 72 65 73 74 79 70 65 20 72 65 73 76 61 6c 7d   restype resval}
10db0 20 7b 0a 20 20 20 20 32 20 20 7b 20 28 20 53 45   {.    2  { ( SE
10dc0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20 4f  LECT x FROM t4 O
10dd0 52 44 45 52 20 42 59 20 78 20 29 20 20 20 20 20  RDER BY x )     
10de0 20 7d 20 20 20 20 20 20 20 20 69 6e 74 65 67 65   }        intege
10df0 72 20 31 0a 20 20 20 20 33 20 20 7b 20 28 20 53  r 1.    3  { ( S
10e00 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20  ELECT x FROM t4 
10e10 4f 52 44 45 52 20 42 59 20 79 20 29 20 20 20 20  ORDER BY y )    
10e20 20 20 7d 20 20 20 20 20 20 20 20 69 6e 74 65 67    }        integ
10e30 65 72 20 31 0a 20 20 20 20 34 20 20 7b 20 28 20  er 1.    4  { ( 
10e40 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34  SELECT x FROM t4
10e50 20 4f 52 44 45 52 20 42 59 20 78 20 44 45 53 43   ORDER BY x DESC
10e60 20 29 20 7d 20 20 20 20 20 20 20 20 69 6e 74 65   ) }        inte
10e70 67 65 72 20 33 0a 20 20 20 20 35 20 20 7b 20 28  ger 3.    5  { (
10e80 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
10e90 34 20 4f 52 44 45 52 20 42 59 20 79 20 44 45 53  4 ORDER BY y DES
10ea0 43 20 29 20 7d 20 20 20 20 20 20 20 20 69 6e 74  C ) }        int
10eb0 65 67 65 72 20 32 0a 20 20 20 20 36 20 20 7b 20  eger 2.    6  { 
10ec0 28 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20  ( SELECT y FROM 
10ed0 74 34 20 4f 52 44 45 52 20 42 59 20 79 20 44 45  t4 ORDER BY y DE
10ee0 53 43 20 29 20 7d 20 20 20 20 20 20 20 20 74 65  SC ) }        te
10ef0 78 74 20 20 20 20 74 77 6f 0a 0a 20 20 20 20 37  xt    two..    7
10f00 20 20 7b 20 28 20 53 45 4c 45 43 54 20 73 75 6d    { ( SELECT sum
10f10 28 78 29 20 46 52 4f 4d 20 74 34 20 29 20 20 20  (x) FROM t4 )   
10f20 20 20 20 20 20 20 20 20 7d 20 20 20 20 20 20 20          }       
10f30 20 20 69 6e 74 65 67 65 72 20 36 0a 20 20 20 20    integer 6.    
10f40 38 20 20 7b 20 28 20 53 45 4c 45 43 54 20 67 72  8  { ( SELECT gr
10f50 6f 75 70 5f 63 6f 6e 63 61 74 28 79 2c 27 27 29  oup_concat(y,'')
10f60 20 46 52 4f 4d 20 74 34 20 29 20 7d 20 20 20 20   FROM t4 ) }    
10f70 20 20 20 74 65 78 74 20 20 20 20 6f 6e 65 74 77     text    onetw
10f80 6f 74 68 72 65 65 0a 20 20 20 20 39 20 20 7b 20  othree.    9  { 
10f90 28 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20  ( SELECT max(x) 
10fa0 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 79 20  FROM t4 WHERE y 
10fb0 4c 49 4b 45 20 27 5f 5f 5f 27 29 20 7d 20 69 6e  LIKE '___') } in
10fc0 74 65 67 65 72 20 32 20 0a 0a 7d 20 7b 0a 20 20  teger 2 ..} {.  
10fd0 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
10fe0 78 70 72 2d 33 36 2e 33 2e 24 74 6e 20 24 65 78  xpr-36.3.$tn $ex
10ff0 70 72 20 24 72 65 73 74 79 70 65 20 24 72 65 73  pr $restype $res
11000 76 61 6c 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  val.}..# EVIDENC
11010 45 2d 4f 46 3a 20 52 2d 35 32 33 32 35 2d 32 35  E-OF: R-52325-25
11020 34 34 39 20 54 68 65 20 76 61 6c 75 65 20 6f 66  449 The value of
11030 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70 72   a subquery expr
11040 65 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 0a 23  ession is NULL.#
11050 20 69 66 20 74 68 65 20 65 6e 63 6c 6f 73 65 64   if the enclosed
11060 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11070 74 20 72 65 74 75 72 6e 73 20 6e 6f 20 72 6f 77  t returns no row
11080 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  s..#.foreach {tn
11090 20 65 78 70 72 7d 20 7b 0a 20 20 20 20 31 20 20   expr} {.    1  
110a0 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f  { ( SELECT x FRO
110b0 4d 20 74 34 20 57 48 45 52 45 20 78 3e 33 20 4f  M t4 WHERE x>3 O
110c0 52 44 45 52 20 42 59 20 78 20 29 20 20 20 20 20  RDER BY x )     
110d0 20 7d 0a 20 20 20 20 32 20 20 7b 20 28 20 53 45   }.    2  { ( SE
110e0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20 57  LECT x FROM t4 W
110f0 48 45 52 45 20 79 3c 27 6f 6e 65 27 20 4f 52 44  HERE y<'one' ORD
11100 45 52 20 42 59 20 79 20 29 20 20 7d 0a 7d 20 7b  ER BY y )  }.} {
11110 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .  do_expr_test 
11120 65 5f 65 78 70 72 2d 33 36 2e 34 2e 24 74 6e 20  e_expr-36.4.$tn 
11130 24 65 78 70 72 20 6e 75 6c 6c 20 7b 7d 0a 7d 0a  $expr null {}.}.
11140 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
11150 52 2d 36 32 34 37 37 2d 30 36 34 37 36 20 46 6f  R-62477-06476 Fo
11160 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 76  r example, the v
11170 61 6c 75 65 73 20 4e 55 4c 4c 2c 20 30 2e 30 2c  alues NULL, 0.0,
11180 20 30 2c 0a 23 20 27 65 6e 67 6c 69 73 68 27 20   0,.# 'english' 
11190 61 6e 64 20 27 30 27 20 61 72 65 20 61 6c 6c 20  and '0' are all 
111a0 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
111b0 20 66 61 6c 73 65 2e 0a 23 0a 64 6f 5f 65 78 65   false..#.do_exe
111c0 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
111d0 2d 33 37 2e 31 20 7b 0a 20 20 20 53 45 4c 45 43  -37.1 {.   SELEC
111e0 54 20 43 41 53 45 20 57 48 45 4e 20 4e 55 4c 4c  T CASE WHEN NULL
111f0 20 54 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53   THEN 'true' ELS
11200 45 20 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d  E 'false' END;.}
11210 20 7b 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63   {false}.do_exec
11220 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
11230 33 37 2e 32 20 7b 0a 20 20 20 53 45 4c 45 43 54  37.2 {.   SELECT
11240 20 43 41 53 45 20 57 48 45 4e 20 30 2e 30 20 54   CASE WHEN 0.0 T
11250 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20  HEN 'true' ELSE 
11260 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b  'false' END;.} {
11270 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63 73 71  false}.do_execsq
11280 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37  l_test e_expr-37
11290 2e 33 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43  .3 {.   SELECT C
112a0 41 53 45 20 57 48 45 4e 20 30 20 54 48 45 4e 20  ASE WHEN 0 THEN 
112b0 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61 6c  'true' ELSE 'fal
112c0 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66 61 6c 73  se' END;.} {fals
112d0 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e}.do_execsql_te
112e0 73 74 20 65 5f 65 78 70 72 2d 33 37 2e 34 20 7b  st e_expr-37.4 {
112f0 0a 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  .   SELECT CASE 
11300 57 48 45 4e 20 27 65 6e 67 6c 69 67 68 27 20 54  WHEN 'engligh' T
11310 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20  HEN 'true' ELSE 
11320 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b  'false' END;.} {
11330 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63 73 71  false}.do_execsq
11340 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37  l_test e_expr-37
11350 2e 35 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43  .5 {.   SELECT C
11360 41 53 45 20 57 48 45 4e 20 27 30 27 20 54 48 45  ASE WHEN '0' THE
11370 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20 27 66  N 'true' ELSE 'f
11380 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66 61  alse' END;.} {fa
11390 6c 73 65 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  lse}..# EVIDENCE
113a0 2d 4f 46 3a 20 52 2d 35 35 35 33 32 2d 31 30 31  -OF: R-55532-101
113b0 30 38 20 56 61 6c 75 65 73 20 31 2c 20 31 2e 30  08 Values 1, 1.0
113c0 2c 20 30 2e 31 2c 20 2d 30 2e 31 20 61 6e 64 20  , 0.1, -0.1 and 
113d0 27 31 65 6e 67 6c 69 73 68 27 20 61 72 65 0a 23  '1english' are.#
113e0 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
113f0 65 20 74 72 75 65 2e 0a 23 0a 64 6f 5f 65 78 65  e true..#.do_exe
11400 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
11410 2d 33 37 2e 36 20 7b 0a 20 20 20 53 45 4c 45 43  -37.6 {.   SELEC
11420 54 20 43 41 53 45 20 57 48 45 4e 20 31 20 54 48  T CASE WHEN 1 TH
11430 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20 27  EN 'true' ELSE '
11440 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74  false' END;.} {t
11450 72 75 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  rue}.do_execsql_
11460 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37 2e 37  test e_expr-37.7
11470 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43 41 53   {.   SELECT CAS
11480 45 20 57 48 45 4e 20 31 2e 30 20 54 48 45 4e 20  E WHEN 1.0 THEN 
11490 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61 6c  'true' ELSE 'fal
114a0 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65  se' END;.} {true
114b0 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
114c0 74 20 65 5f 65 78 70 72 2d 33 37 2e 38 20 7b 0a  t e_expr-37.8 {.
114d0 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57     SELECT CASE W
114e0 48 45 4e 20 30 2e 31 20 54 48 45 4e 20 27 74 72  HEN 0.1 THEN 'tr
114f0 75 65 27 20 45 4c 53 45 20 27 66 61 6c 73 65 27  ue' ELSE 'false'
11500 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a 64   END;.} {true}.d
11510 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
11520 5f 65 78 70 72 2d 33 37 2e 39 20 7b 0a 20 20 20  _expr-37.9 {.   
11530 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
11540 20 2d 30 2e 31 20 54 48 45 4e 20 27 74 72 75 65   -0.1 THEN 'true
11550 27 20 45 4c 53 45 20 27 66 61 6c 73 65 27 20 45  ' ELSE 'false' E
11560 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a 64 6f 5f  ND;.} {true}.do_
11570 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
11580 78 70 72 2d 33 37 2e 31 30 20 7b 0a 20 20 20 53  xpr-37.10 {.   S
11590 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20  ELECT CASE WHEN 
115a0 27 31 65 6e 67 6c 69 73 68 27 20 54 48 45 4e 20  '1english' THEN 
115b0 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61 6c  'true' ELSE 'fal
115c0 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65  se' END;.} {true
115d0 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  }...finish_test.