/ Hex Artifact Content
Login

Artifact d0dd488e0527cbc560ae2dea1939cc44cb9b9924:


0000: 23 20 32 30 31 30 20 4a 75 6c 79 20 31 36 0a 23  # 2010 July 16.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 23 20 54 68 69 73 20 66 69  ****.#.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 65  le implements te
0180: 73 74 73 20 74 6f 20 76 65 72 69 66 79 20 74 68  sts to verify th
0190: 61 74 20 74 68 65 20 22 74 65 73 74 61 62 6c 65  at the "testable
01a0: 20 73 74 61 74 65 6d 65 6e 74 73 22 20 69 6e 20   statements" in 
01b0: 0a 23 20 74 68 65 20 6c 61 6e 67 5f 65 78 70 72  .# the lang_expr
01c0: 2e 68 74 6d 6c 20 64 6f 63 75 6d 65 6e 74 20 61  .html document a
01d0: 72 65 20 63 6f 72 72 65 63 74 2e 0a 23 0a 0a 73  re correct..#..s
01e0: 65 74 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65  et testdir [file
01f0: 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d   dirname $argv0]
0200: 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64 69 72  .source $testdir
0210: 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72  /tester.tcl.sour
0220: 63 65 20 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c  ce $testdir/mall
0230: 6f 63 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 69  oc_common.tcl..i
0240: 66 63 61 70 61 62 6c 65 20 21 63 6f 6d 70 6f 75  fcapable !compou
0250: 6e 64 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  nd {.  finish_te
0260: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70  st.  return.}..p
0270: 72 6f 63 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  roc do_expr_test
0280: 20 7b 74 6e 20 65 78 70 72 20 74 79 70 65 20 76   {tn expr type v
0290: 61 6c 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65  alue} {.  upleve
02a0: 6c 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l do_execsql_tes
02b0: 74 20 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c  t $tn [list "SEL
02c0: 45 43 54 20 74 79 70 65 6f 66 28 24 65 78 70 72  ECT typeof($expr
02d0: 29 2c 20 24 65 78 70 72 22 5d 20 5b 0a 20 20 20  ), $expr"] [.   
02e0: 20 6c 69 73 74 20 5b 6c 69 73 74 20 24 74 79 70   list [list $typ
02f0: 65 20 24 76 61 6c 75 65 5d 0a 20 20 5d 0a 7d 0a  e $value].  ].}.
0300: 0a 70 72 6f 63 20 64 6f 5f 71 65 78 70 72 5f 74  .proc do_qexpr_t
0310: 65 73 74 20 7b 74 6e 20 65 78 70 72 20 76 61 6c  est {tn expr val
0320: 75 65 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c 20  ue} {.  uplevel 
0330: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0340: 24 74 6e 20 5b 6c 69 73 74 20 22 53 45 4c 45 43  $tn [list "SELEC
0350: 54 20 71 75 6f 74 65 28 24 65 78 70 72 29 22 5d  T quote($expr)"]
0360: 20 5b 6c 69 73 74 20 24 76 61 6c 75 65 5d 0a 7d   [list $value].}
0370: 0a 0a 23 20 53 65 74 20 75 70 20 74 68 72 65 65  ..# Set up three
0380: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0390: 73 3a 0a 23 0a 23 20 20 20 3a 3a 6f 70 6e 61 6d  s:.#.#   ::opnam
03a0: 65 20 20 20 20 20 20 20 20 20 41 6e 20 61 72 72  e         An arr
03b0: 61 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20  ay mapping from 
03c0: 53 51 4c 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  SQL operator to 
03d0: 61 6e 20 65 61 73 79 20 74 6f 20 70 61 72 73 65  an easy to parse
03e0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
03f0: 20 20 20 20 20 20 6e 61 6d 65 2e 20 54 68 65 20        name. The 
0400: 6e 61 6d 65 73 20 61 72 65 20 75 73 65 64 20 61  names are used a
0410: 73 20 70 61 72 74 20 6f 66 20 74 65 73 74 20 63  s part of test c
0420: 61 73 65 20 6e 61 6d 65 73 2e 0a 23 0a 23 20 20  ase names..#.#  
0430: 20 3a 3a 6f 70 70 72 65 63 20 20 20 20 20 20 20   ::opprec       
0440: 20 20 41 6e 20 61 72 72 61 79 20 6d 61 70 70 69    An array mappi
0450: 6e 67 20 66 72 6f 6d 20 53 51 4c 20 6f 70 65 72  ng from SQL oper
0460: 61 74 6f 72 20 74 6f 20 61 20 6e 75 6d 65 72 69  ator to a numeri
0470: 63 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  c.#             
0480: 20 20 20 20 20 20 20 70 72 65 63 65 64 65 6e 63         precedenc
0490: 65 20 76 61 6c 75 65 2e 20 4f 70 65 72 61 74 6f  e value. Operato
04a0: 72 73 20 74 68 61 74 20 67 72 6f 75 70 20 6d 6f  rs that group mo
04b0: 72 65 20 74 69 67 68 74 6c 79 0a 23 20 20 20 20  re tightly.#    
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 68 61 76 65 20 6c 6f 77 65 72 20 6e 75 6d 65 72  have lower numer
04e0: 69 63 20 70 72 65 63 65 64 65 6e 63 65 73 2e 0a  ic precedences..
04f0: 23 0a 23 20 20 20 3a 3a 6f 70 6c 69 73 74 20 20  #.#   ::oplist  
0500: 20 20 20 20 20 20 20 41 20 6c 69 73 74 20 6f 66         A list of
0510: 20 61 6c 6c 20 53 51 4c 20 6f 70 65 72 61 74 6f   all SQL operato
0520: 72 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  rs supported by 
0530: 53 51 4c 69 74 65 2e 0a 23 0a 66 6f 72 65 61 63  SQLite..#.foreac
0540: 68 20 7b 6f 70 20 6f 70 6e 7d 20 7b 0a 20 20 20  h {op opn} {.   
0550: 20 20 20 7c 7c 20 20 20 63 61 74 20 20 20 20 20     ||   cat     
0560: 2a 20 20 20 6d 75 6c 20 20 20 20 20 20 20 2f 20  *   mul       / 
0570: 20 64 69 76 20 20 20 20 20 20 20 25 20 20 20 20   div       %    
0580: 20 6d 6f 64 20 20 20 20 20 20 20 2b 20 20 20 20   mod       +    
0590: 20 20 61 64 64 0a 20 20 20 20 20 20 2d 20 20 20    add.      -   
05a0: 20 73 75 62 20 20 20 20 20 3c 3c 20 20 6c 73 68   sub     <<  lsh
05b0: 69 66 74 20 20 20 20 3e 3e 20 72 73 68 69 66 74  ift    >> rshift
05c0: 20 20 20 20 26 20 20 20 20 20 62 69 74 61 6e 64      &     bitand
05d0: 20 20 20 20 7c 20 20 20 20 20 20 62 69 74 6f 72      |      bitor
05e0: 0a 20 20 20 20 20 20 3c 20 20 20 20 6c 65 73 73  .      <    less
05f0: 20 20 20 20 3c 3d 20 20 6c 65 73 73 65 71 20 20      <=  lesseq  
0600: 20 20 3e 20 20 6d 6f 72 65 20 20 20 20 20 20 3e    >  more      >
0610: 3d 20 20 20 20 6d 6f 72 65 65 71 20 20 20 20 3d  =    moreeq    =
0620: 20 20 20 20 20 20 65 71 31 0a 20 20 20 20 20 20        eq1.      
0630: 3d 3d 20 20 20 65 71 32 20 20 20 20 20 3c 3e 20  ==   eq2     <> 
0640: 20 6e 65 31 20 20 20 20 20 20 20 21 3d 20 6e 65   ne1       != ne
0650: 32 20 20 20 20 20 20 20 49 53 20 20 20 20 69 73  2       IS    is
0660: 20 20 20 20 20 20 20 20 4c 49 4b 45 20 20 20 6c          LIKE   l
0670: 69 6b 65 0a 20 20 20 20 20 20 47 4c 4f 42 20 67  ike.      GLOB g
0680: 6c 6f 62 20 20 20 20 41 4e 44 20 61 6e 64 20 20  lob    AND and  
0690: 20 20 20 20 20 4f 52 20 6f 72 20 20 20 20 20 20       OR or      
06a0: 20 20 4d 41 54 43 48 20 6d 61 74 63 68 20 20 20    MATCH match   
06b0: 20 20 52 45 47 45 58 50 20 72 65 67 65 78 70 0a    REGEXP regexp.
06c0: 20 20 20 20 20 20 7b 49 53 20 4e 4f 54 7d 20 69        {IS NOT} i
06d0: 73 6e 74 0a 7d 20 7b 0a 20 20 73 65 74 20 3a 3a  snt.} {.  set ::
06e0: 6f 70 6e 61 6d 65 28 24 6f 70 29 20 24 6f 70 6e  opname($op) $opn
06f0: 0a 7d 0a 73 65 74 20 6f 70 6c 69 73 74 20 5b 6c  .}.set oplist [l
0700: 69 73 74 5d 0a 66 6f 72 65 61 63 68 20 7b 70 72  ist].foreach {pr
0710: 65 63 20 6f 70 6c 7d 20 7b 0a 20 20 31 20 20 20  ec opl} {.  1   
0720: 7c 7c 0a 20 20 32 20 20 20 7b 2a 20 2f 20 25 7d  ||.  2   {* / %}
0730: 0a 20 20 33 20 20 20 7b 2b 20 2d 7d 0a 20 20 34  .  3   {+ -}.  4
0740: 20 20 20 7b 3c 3c 20 3e 3e 20 26 20 7c 7d 0a 20     {<< >> & |}. 
0750: 20 35 20 20 20 7b 3c 20 3c 3d 20 3e 20 3e 3d 7d   5   {< <= > >=}
0760: 0a 20 20 36 20 20 20 7b 3d 20 3d 3d 20 21 3d 20  .  6   {= == != 
0770: 3c 3e 20 49 53 20 7b 49 53 20 4e 4f 54 7d 20 4c  <> IS {IS NOT} L
0780: 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48 20 52  IKE GLOB MATCH R
0790: 45 47 45 58 50 7d 0a 20 20 37 20 20 20 41 4e 44  EGEXP}.  7   AND
07a0: 0a 20 20 38 20 20 20 4f 52 0a 7d 20 7b 0a 20 20  .  8   OR.} {.  
07b0: 66 6f 72 65 61 63 68 20 6f 70 20 24 6f 70 6c 20  foreach op $opl 
07c0: 7b 20 0a 20 20 20 20 73 65 74 20 3a 3a 6f 70 70  { .    set ::opp
07d0: 72 65 63 28 24 6f 70 29 20 24 70 72 65 63 20 0a  rec($op) $prec .
07e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 6f 70 6c 69      lappend opli
07f0: 73 74 20 24 6f 70 0a 20 20 7d 0a 7d 0a 0a 0a 23  st $op.  }.}...#
0800: 20 48 6f 6f 6b 20 69 6e 20 64 65 66 69 6e 69 74   Hook in definit
0810: 69 6f 6e 73 20 6f 66 20 4d 41 54 43 48 20 61 6e  ions of MATCH an
0820: 64 20 52 45 47 45 58 2e 20 54 68 65 20 66 6f 6c  d REGEX. The fol
0830: 6c 6f 77 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  lowing implement
0840: 61 74 69 6f 6e 73 0a 23 20 63 61 75 73 65 20 4d  ations.# cause M
0850: 41 54 43 48 20 61 6e 64 20 52 45 47 45 58 20 74  ATCH and REGEX t
0860: 6f 20 62 65 68 61 76 65 20 73 69 6d 69 6c 61 72  o behave similar
0870: 6c 79 20 74 6f 20 74 68 65 20 3d 3d 20 6f 70 65  ly to the == ope
0880: 72 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 6d 61  rator..#.proc ma
0890: 74 63 68 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20  tchfunc {a b} { 
08a0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 61  return [expr {$a
08b0: 3d 3d 24 62 7d 5d 20 7d 0a 70 72 6f 63 20 72 65  ==$b}] }.proc re
08c0: 67 65 78 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20  gexfunc {a b} { 
08d0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 61  return [expr {$a
08e0: 3d 3d 24 62 7d 5d 20 7d 0a 64 62 20 66 75 6e 63  ==$b}] }.db func
08f0: 20 6d 61 74 63 68 20 20 2d 61 72 67 63 6f 75 6e   match  -argcoun
0900: 74 20 32 20 6d 61 74 63 68 66 75 6e 63 0a 64 62  t 2 matchfunc.db
0910: 20 66 75 6e 63 20 72 65 67 65 78 70 20 2d 61 72   func regexp -ar
0920: 67 63 6f 75 6e 74 20 32 20 72 65 67 65 78 66 75  gcount 2 regexfu
0930: 6e 63 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  nc..#-----------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0980: 20 54 65 73 74 20 63 61 73 65 73 20 65 5f 65 78   Test cases e_ex
0990: 70 72 2d 31 2e 2a 20 61 74 74 65 6d 70 74 20 74  pr-1.* attempt t
09a0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61 6c  o verify that al
09b0: 6c 20 62 69 6e 61 72 79 20 6f 70 65 72 61 74 6f  l binary operato
09c0: 72 73 20 6c 69 73 74 65 64 0a 23 20 69 6e 20 74  rs listed.# in t
09d0: 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
09e0: 20 65 78 69 73 74 20 61 6e 64 20 74 68 61 74 20   exist and that 
09f0: 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 72 65  the relative pre
0a00: 63 65 64 65 6e 63 65 73 20 6f 66 20 74 68 65 0a  cedences of the.
0a10: 23 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  # operators are 
0a20: 61 6c 73 6f 20 61 73 20 74 68 65 20 64 6f 63 75  also as the docu
0a30: 6d 65 6e 74 61 74 69 6f 6e 20 73 75 67 67 65 73  mentation sugges
0a40: 74 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ts..#.# EVIDENCE
0a50: 2d 4f 46 3a 20 52 2d 31 35 35 31 34 2d 36 35 31  -OF: R-15514-651
0a60: 36 33 20 53 51 4c 69 74 65 20 75 6e 64 65 72 73  63 SQLite unders
0a70: 74 61 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f 77  tands the follow
0a80: 69 6e 67 20 62 69 6e 61 72 79 0a 23 20 6f 70 65  ing binary.# ope
0a90: 72 61 74 6f 72 73 2c 20 69 6e 20 6f 72 64 65 72  rators, in order
0aa0: 20 66 72 6f 6d 20 68 69 67 68 65 73 74 20 74 6f   from highest to
0ab0: 20 6c 6f 77 65 73 74 20 70 72 65 63 65 64 65 6e   lowest preceden
0ac0: 63 65 3a 20 7c 7c 20 2a 20 2f 20 25 20 2b 20 2d  ce: || * / % + -
0ad0: 0a 23 20 3c 3c 20 3e 3e 20 26 20 7c 20 3c 20 3c  .# << >> & | < <
0ae0: 3d 20 3e 20 3e 3d 20 3d 20 3d 3d 20 21 3d 20 3c  = > >= = == != <
0af0: 3e 20 49 53 20 49 53 0a 23 20 4e 4f 54 20 49 4e  > IS IS.# NOT IN
0b00: 20 4c 49 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48   LIKE GLOB MATCH
0b10: 20 52 45 47 45 58 50 20 41 4e 44 20 4f 52 0a 23   REGEXP AND OR.#
0b20: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
0b30: 52 2d 33 38 37 35 39 2d 33 38 37 38 39 20 4f 70  R-38759-38789 Op
0b40: 65 72 61 74 6f 72 73 20 49 53 20 61 6e 64 20 49  erators IS and I
0b50: 53 20 4e 4f 54 20 68 61 76 65 20 74 68 65 20 73  S NOT have the s
0b60: 61 6d 65 0a 23 20 70 72 65 63 65 64 65 6e 63 65  ame.# precedence
0b70: 20 61 73 20 3d 2e 0a 23 0a 0a 75 6e 73 65 74 20   as =..#..unset 
0b80: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 75 6e 74 65  -nocomplain unte
0b90: 73 74 65 64 0a 66 6f 72 65 61 63 68 20 6f 70 31  sted.foreach op1
0ba0: 20 24 6f 70 6c 69 73 74 20 7b 0a 20 20 66 6f 72   $oplist {.  for
0bb0: 65 61 63 68 20 6f 70 32 20 24 6f 70 6c 69 73 74  each op2 $oplist
0bc0: 20 7b 0a 20 20 20 20 73 65 74 20 75 6e 74 65 73   {.    set untes
0bd0: 74 65 64 28 24 6f 70 31 2c 24 6f 70 32 29 20 31  ted($op1,$op2) 1
0be0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 74 6e  .    foreach {tn
0bf0: 20 41 20 42 20 43 7d 20 7b 0a 20 20 20 20 20 20   A B C} {.      
0c00: 20 31 20 20 20 20 20 32 32 20 20 20 34 35 20 20   1     22   45  
0c10: 20 20 36 36 0a 20 20 20 20 20 20 20 32 20 20 20    66.       2   
0c20: 20 20 20 30 20 20 20 20 30 20 20 20 20 20 30 0a     0    0     0.
0c30: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 30 20         3      0 
0c40: 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20 20     0     1.     
0c50: 20 20 34 20 20 20 20 20 20 30 20 20 20 20 31 20    4      0    1 
0c60: 20 20 20 20 30 0a 20 20 20 20 20 20 20 35 20 20      0.       5  
0c70: 20 20 20 20 30 20 20 20 20 31 20 20 20 20 20 31      0    1     1
0c80: 0a 20 20 20 20 20 20 20 36 20 20 20 20 20 20 31  .       6      1
0c90: 20 20 20 20 30 20 20 20 20 20 30 0a 20 20 20 20      0     0.    
0ca0: 20 20 20 37 20 20 20 20 20 20 31 20 20 20 20 30     7      1    0
0cb0: 20 20 20 20 20 31 0a 20 20 20 20 20 20 20 38 20       1.       8 
0cc0: 20 20 20 20 20 31 20 20 20 20 31 20 20 20 20 20       1    1     
0cd0: 30 0a 20 20 20 20 20 20 20 39 20 20 20 20 20 20  0.       9      
0ce0: 31 20 20 20 20 31 20 20 20 20 20 31 0a 20 20 20  1    1     1.   
0cf0: 20 20 20 31 30 20 20 20 20 20 20 35 20 20 20 20     10      5    
0d00: 36 20 20 20 20 20 31 0a 20 20 20 20 20 20 31 31  6     1.      11
0d10: 20 20 20 20 20 20 31 20 20 20 20 35 20 20 20 20        1    5    
0d20: 20 36 0a 20 20 20 20 20 20 31 32 20 20 20 20 20   6.      12     
0d30: 20 31 20 20 20 20 35 20 20 20 20 20 35 0a 20 20   1    5     5.  
0d40: 20 20 20 20 31 33 20 20 20 20 20 20 35 20 20 20      13      5   
0d50: 20 35 20 20 20 20 20 31 0a 0a 20 20 20 20 20 20   5     1..      
0d60: 31 34 20 20 20 20 20 20 35 20 20 20 20 32 20 20  14      5    2  
0d70: 20 20 20 31 0a 20 20 20 20 20 20 31 35 20 20 20     1.      15   
0d80: 20 20 20 31 20 20 20 20 34 20 20 20 20 20 31 0a     1    4     1.
0d90: 20 20 20 20 20 20 31 36 20 20 20 20 20 2d 31 20        16     -1 
0da0: 20 20 20 30 20 20 20 20 20 31 0a 20 20 20 20 20     0     1.     
0db0: 20 31 37 20 20 20 20 20 20 30 20 20 20 20 31 20   17      0    1 
0dc0: 20 20 20 2d 31 0a 0a 20 20 20 20 7d 20 7b 0a 20     -1..    } {. 
0dd0: 20 20 20 20 20 73 65 74 20 74 65 73 74 6e 61 6d       set testnam
0de0: 65 20 22 65 5f 65 78 70 72 2d 31 2e 24 6f 70 6e  e "e_expr-1.$opn
0df0: 61 6d 65 28 24 6f 70 31 29 2e 24 6f 70 6e 61 6d  ame($op1).$opnam
0e00: 65 28 24 6f 70 32 29 2e 24 74 6e 22 0a 0a 20 20  e($op2).$tn"..  
0e10: 20 20 20 20 23 20 49 66 20 24 6f 70 32 20 67 72      # If $op2 gr
0e20: 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74 6c  oups more tightl
0e30: 79 20 74 68 61 6e 20 24 6f 70 31 2c 20 74 68 65  y than $op1, the
0e40: 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  n the result.   
0e50: 20 20 20 23 20 6f 66 20 65 78 65 63 75 74 69 6e     # of executin
0e60: 67 20 24 73 71 6c 31 20 77 68 6f 75 6c 64 20 62  g $sql1 whould b
0e70: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 65 78  e the same as ex
0e80: 65 63 75 74 69 6e 67 20 24 73 71 6c 33 2e 0a 20  ecuting $sql3.. 
0e90: 20 20 20 20 20 23 20 49 66 20 24 6f 70 31 20 67       # If $op1 g
0ea0: 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67 68 74  roups more tight
0eb0: 6c 79 2c 20 6f 72 20 69 66 20 24 6f 70 31 20 61  ly, or if $op1 a
0ec0: 6e 64 20 24 6f 70 32 20 68 61 76 65 20 0a 20 20  nd $op2 have .  
0ed0: 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20 70      # the same p
0ee0: 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 6e 20  recedence, then 
0ef0: 65 78 65 63 75 74 69 6e 67 20 24 73 71 6c 31 20  executing $sql1 
0f00: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20 20  should return.  
0f10: 20 20 20 20 23 20 74 68 65 20 73 61 6d 65 20 76      # the same v
0f20: 61 6c 75 65 20 61 73 20 24 73 71 6c 32 2e 0a 20  alue as $sql2.. 
0f30: 20 20 20 20 20 23 0a 20 20 20 20 20 20 73 65 74       #.      set
0f40: 20 73 71 6c 31 20 22 53 45 4c 45 43 54 20 24 41   sql1 "SELECT $A
0f50: 20 24 6f 70 31 20 24 42 20 24 6f 70 32 20 24 43   $op1 $B $op2 $C
0f60: 22 0a 20 20 20 20 20 20 73 65 74 20 73 71 6c 32  ".      set sql2
0f70: 20 22 53 45 4c 45 43 54 20 28 24 41 20 24 6f 70   "SELECT ($A $op
0f80: 31 20 24 42 29 20 24 6f 70 32 20 24 43 22 0a 20  1 $B) $op2 $C". 
0f90: 20 20 20 20 20 73 65 74 20 73 71 6c 33 20 22 53       set sql3 "S
0fa0: 45 4c 45 43 54 20 24 41 20 24 6f 70 31 20 28 24  ELECT $A $op1 ($
0fb0: 42 20 24 6f 70 32 20 24 43 29 22 0a 0a 20 20 20  B $op2 $C)"..   
0fc0: 20 20 20 73 65 74 20 61 32 20 5b 64 62 20 6f 6e     set a2 [db on
0fd0: 65 20 24 73 71 6c 32 5d 0a 20 20 20 20 20 20 73  e $sql2].      s
0fe0: 65 74 20 61 33 20 5b 64 62 20 6f 6e 65 20 24 73  et a3 [db one $s
0ff0: 71 6c 33 5d 0a 0a 20 20 20 20 20 20 64 6f 5f 65  ql3]..      do_e
1000: 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 65 73  xecsql_test $tes
1010: 74 6e 61 6d 65 20 24 73 71 6c 31 20 5b 6c 69 73  tname $sql1 [lis
1020: 74 20 5b 0a 20 20 20 20 20 20 20 20 69 66 20 7b  t [.        if {
1030: 24 6f 70 70 72 65 63 28 24 6f 70 32 29 20 3c 20  $opprec($op2) < 
1040: 24 6f 70 70 72 65 63 28 24 6f 70 31 29 7d 20 7b  $opprec($op1)} {
1050: 73 65 74 20 61 33 7d 20 7b 73 65 74 20 61 32 7d  set a3} {set a2}
1060: 0a 20 20 20 20 20 20 5d 5d 0a 20 20 20 20 20 20  .      ]].      
1070: 69 66 20 7b 24 61 32 20 21 3d 20 24 61 33 7d 20  if {$a2 != $a3} 
1080: 7b 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  { unset -nocompl
1090: 61 69 6e 20 75 6e 74 65 73 74 65 64 28 24 6f 70  ain untested($op
10a0: 31 2c 24 6f 70 32 29 20 7d 0a 20 20 20 20 7d 0a  1,$op2) }.    }.
10b0: 20 20 7d 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 6f    }.}..foreach o
10c0: 70 20 7b 2a 20 41 4e 44 20 4f 52 20 2b 20 7c 7c  p {* AND OR + ||
10d0: 20 26 20 7c 7d 20 7b 20 75 6e 73 65 74 20 75 6e   & |} { unset un
10e0: 74 65 73 74 65 64 28 24 6f 70 2c 24 6f 70 29 20  tested($op,$op) 
10f0: 7d 0a 75 6e 73 65 74 20 75 6e 74 65 73 74 65 64  }.unset untested
1100: 28 2b 2c 2d 29 20 20 3b 23 20 20 20 20 20 20 20  (+,-)  ;#       
1110: 53 69 6e 63 65 20 20 20 20 28 61 2b 62 29 2d 63  Since    (a+b)-c
1120: 20 3d 3d 20 61 2b 28 62 2d 63 29 0a 75 6e 73 65   == a+(b-c).unse
1130: 74 20 75 6e 74 65 73 74 65 64 28 2a 2c 3c 3c 29  t untested(*,<<)
1140: 20 3b 23 20 20 20 20 20 20 20 53 69 6e 63 65 20   ;#       Since 
1150: 20 20 20 28 61 2a 62 29 3c 3c 63 20 3d 3d 20 61     (a*b)<<c == a
1160: 2a 28 62 3c 3c 63 29 0a 0a 64 6f 5f 74 65 73 74  *(b<<c)..do_test
1170: 20 65 5f 65 78 70 72 2d 31 2e 31 20 7b 20 61 72   e_expr-1.1 { ar
1180: 72 61 79 20 6e 61 6d 65 73 20 75 6e 74 65 73 74  ray names untest
1190: 65 64 20 7d 20 7b 7d 0a 0a 23 20 41 74 20 6f 6e  ed } {}..# At on
11a0: 65 20 70 6f 69 6e 74 2c 20 74 65 73 74 20 31 2e  e point, test 1.
11b0: 32 2e 32 20 77 61 73 20 66 61 69 6c 69 6e 67 2e  2.2 was failing.
11c0: 20 49 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   Instead of the 
11d0: 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 2c 20  correct result, 
11e0: 69 74 0a 23 20 77 61 73 20 72 65 74 75 72 6e 69  it.# was returni
11f0: 6e 67 20 7b 31 20 31 20 30 7d 2e 20 54 68 69 73  ng {1 1 0}. This
1200: 20 77 6f 75 6c 64 20 73 65 65 6d 20 74 6f 20 69   would seem to i
1210: 6e 64 69 63 61 74 65 20 74 68 61 74 20 4c 49 4b  ndicate that LIK
1220: 45 20 68 61 73 20 74 68 65 0a 23 20 73 61 6d 65  E has the.# same
1230: 20 70 72 65 63 65 64 65 6e 63 65 20 61 73 20 27   precedence as '
1240: 3c 27 2e 20 57 68 69 63 68 20 69 73 20 69 6e 63  <'. Which is inc
1250: 6f 72 72 65 63 74 2e 20 49 74 20 68 61 73 20 6c  orrect. It has l
1260: 6f 77 65 72 20 70 72 65 63 65 64 65 6e 63 65 2e  ower precedence.
1270: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1280: 73 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 31 20  st e_expr-1.2.1 
1290: 7b 20 0a 20 20 53 45 4c 45 43 54 20 30 20 3c 20  { .  SELECT 0 < 
12a0: 32 20 4c 49 4b 45 20 31 2c 20 20 20 28 30 20 3c  2 LIKE 1,   (0 <
12b0: 20 32 29 20 4c 49 4b 45 20 31 2c 20 20 20 30 20   2) LIKE 1,   0 
12c0: 3c 20 28 32 20 4c 49 4b 45 20 31 29 0a 7d 20 7b  < (2 LIKE 1).} {
12d0: 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71  1 1 0}.do_execsq
12e0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 2e  l_test e_expr-1.
12f0: 32 2e 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  2.2 { .  SELECT 
1300: 30 20 4c 49 4b 45 20 30 20 3c 20 32 2c 20 20 20  0 LIKE 0 < 2,   
1310: 28 30 20 4c 49 4b 45 20 30 29 20 3c 20 32 2c 20  (0 LIKE 0) < 2, 
1320: 20 20 30 20 4c 49 4b 45 20 28 30 20 3c 20 32 29    0 LIKE (0 < 2)
1330: 0a 7d 20 7b 30 20 31 20 30 7d 0a 0a 23 20 53 68  .} {0 1 0}..# Sh
1340: 6f 77 69 6e 67 20 74 68 61 74 20 4c 49 4b 45 20  owing that LIKE 
1350: 61 6e 64 20 3d 3d 20 68 61 76 65 20 74 68 65 20  and == have the 
1360: 73 61 6d 65 20 70 72 65 63 65 64 65 6e 63 65 0a  same precedence.
1370: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
1380: 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 33 20 7b  t e_expr-1.2.3 {
1390: 20 0a 20 20 53 45 4c 45 43 54 20 32 20 4c 49 4b   .  SELECT 2 LIK
13a0: 45 20 32 20 3d 3d 20 31 2c 20 20 20 28 32 20 4c  E 2 == 1,   (2 L
13b0: 49 4b 45 20 32 29 20 3d 3d 20 31 2c 20 20 20 20  IKE 2) == 1,    
13c0: 32 20 4c 49 4b 45 20 28 32 20 3d 3d 20 31 29 0a  2 LIKE (2 == 1).
13d0: 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65  } {1 1 0}.do_exe
13e0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
13f0: 2d 31 2e 32 2e 34 20 7b 20 0a 20 20 53 45 4c 45  -1.2.4 { .  SELE
1400: 43 54 20 32 20 3d 3d 20 32 20 4c 49 4b 45 20 31  CT 2 == 2 LIKE 1
1410: 2c 20 20 20 28 32 20 3d 3d 20 32 29 20 4c 49 4b  ,   (2 == 2) LIK
1420: 45 20 31 2c 20 20 20 20 32 20 3d 3d 20 28 32 20  E 1,    2 == (2 
1430: 4c 49 4b 45 20 31 29 0a 7d 20 7b 31 20 31 20 30  LIKE 1).} {1 1 0
1440: 7d 0a 0a 23 20 53 68 6f 77 69 6e 67 20 74 68 61  }..# Showing tha
1450: 74 20 3c 20 67 72 6f 75 70 73 20 6d 6f 72 65 20  t < groups more 
1460: 74 69 67 68 74 6c 79 20 74 68 61 6e 20 3d 3d 20  tightly than == 
1470: 28 3c 20 68 61 73 20 68 69 67 68 65 72 20 70 72  (< has higher pr
1480: 65 63 65 64 65 6e 63 65 29 2e 20 0a 23 0a 64 6f  ecedence). .#.do
1490: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
14a0: 65 78 70 72 2d 31 2e 32 2e 35 20 7b 20 0a 20 20  expr-1.2.5 { .  
14b0: 53 45 4c 45 43 54 20 30 20 3c 20 32 20 3d 3d 20  SELECT 0 < 2 == 
14c0: 31 2c 20 20 20 28 30 20 3c 20 32 29 20 3d 3d 20  1,   (0 < 2) == 
14d0: 31 2c 20 20 20 30 20 3c 20 28 32 20 3d 3d 20 31  1,   0 < (2 == 1
14e0: 29 0a 7d 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65  ).} {1 1 0}.do_e
14f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
1500: 70 72 2d 31 2e 36 20 7b 20 0a 20 20 53 45 4c 45  pr-1.6 { .  SELE
1510: 43 54 20 30 20 3d 3d 20 30 20 3c 20 32 2c 20 20  CT 0 == 0 < 2,  
1520: 20 28 30 20 3d 3d 20 30 29 20 3c 20 32 2c 20 20   (0 == 0) < 2,  
1530: 20 30 20 3d 3d 20 28 30 20 3c 20 32 29 0a 7d 20   0 == (0 < 2).} 
1540: 7b 30 20 31 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  {0 1 0}..#------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74  ---.# Check that
15a0: 20 74 68 65 20 66 6f 75 72 20 75 6e 61 72 79 20   the four unary 
15b0: 70 72 65 66 69 78 20 6f 70 65 72 61 74 6f 72 73  prefix operators
15c0: 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68   mentioned in th
15d0: 65 20 0a 23 20 64 6f 63 75 6d 65 6e 74 61 74 69  e .# documentati
15e0: 6f 6e 20 65 78 69 73 74 2e 0a 23 0a 23 20 45 56  on exist..#.# EV
15f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 39  IDENCE-OF: R-139
1600: 35 38 2d 35 33 34 31 39 20 53 75 70 70 6f 72 74  58-53419 Support
1610: 65 64 20 75 6e 61 72 79 20 70 72 65 66 69 78 20  ed unary prefix 
1620: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 74 68  operators are th
1630: 65 73 65 3a 0a 23 20 2d 20 2b 20 7e 20 4e 4f 54  ese:.# - + ~ NOT
1640: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
1650: 73 74 20 65 5f 65 78 70 72 2d 32 2e 31 20 7b 20  st e_expr-2.1 { 
1660: 53 45 4c 45 43 54 20 2d 20 20 20 31 30 20 20 20  SELECT -   10   
1670: 7d 20 7b 2d 31 30 7d 0a 64 6f 5f 65 78 65 63 73  } {-10}.do_execs
1680: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
1690: 2e 32 20 7b 20 53 45 4c 45 43 54 20 2b 20 20 20  .2 { SELECT +   
16a0: 31 30 20 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65  10   } {10}.do_e
16b0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
16c0: 70 72 2d 32 2e 33 20 7b 20 53 45 4c 45 43 54 20  pr-2.3 { SELECT 
16d0: 7e 20 20 20 31 30 20 20 20 7d 20 7b 2d 31 31 7d  ~   10   } {-11}
16e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
16f0: 20 65 5f 65 78 70 72 2d 32 2e 34 20 7b 20 53 45   e_expr-2.4 { SE
1700: 4c 45 43 54 20 4e 4f 54 20 31 30 20 20 20 7d 20  LECT NOT 10   } 
1710: 7b 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {0}..#----------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1760: 23 20 54 65 73 74 73 20 66 6f 72 20 74 68 65 20  # Tests for the 
1770: 74 77 6f 20 73 74 61 74 65 6d 65 6e 74 73 20 6d  two statements m
1780: 61 64 65 20 72 65 67 61 72 64 69 6e 67 20 74 68  ade regarding th
1790: 65 20 75 6e 61 72 79 20 2b 20 6f 70 65 72 61 74  e unary + operat
17a0: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
17b0: 2d 4f 46 3a 20 52 2d 35 33 36 37 30 2d 30 33 33  -OF: R-53670-033
17c0: 37 33 20 54 68 65 20 75 6e 61 72 79 20 6f 70 65  73 The unary ope
17d0: 72 61 74 6f 72 20 2b 20 69 73 20 61 20 6e 6f 2d  rator + is a no-
17e0: 6f 70 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  op..#.# EVIDENCE
17f0: 2d 4f 46 3a 20 52 2d 31 39 34 38 30 2d 33 30 39  -OF: R-19480-309
1800: 36 38 20 49 74 20 63 61 6e 20 62 65 20 61 70 70  68 It can be app
1810: 6c 69 65 64 20 74 6f 20 73 74 72 69 6e 67 73 2c  lied to strings,
1820: 20 6e 75 6d 62 65 72 73 2c 0a 23 20 62 6c 6f 62   numbers,.# blob
1830: 73 20 6f 72 20 4e 55 4c 4c 20 61 6e 64 20 69 74  s or NULL and it
1840: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1850: 61 20 72 65 73 75 6c 74 20 77 69 74 68 20 74 68  a result with th
1860: 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 0a  e same value as.
1870: 23 20 74 68 65 20 6f 70 65 72 61 6e 64 2e 0a 23  # the operand..#
1880: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 6c 69 74  .foreach {tn lit
1890: 65 72 61 6c 20 74 79 70 65 7d 20 7b 0a 20 20 31  eral type} {.  1
18a0: 20 20 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c 64       'helloworld
18b0: 27 20 20 20 74 65 78 74 0a 20 20 32 20 20 20 20  '   text.  2    
18c0: 20 34 35 20 20 20 20 20 20 20 20 20 20 20 20 20   45             
18d0: 69 6e 74 65 67 65 72 0a 20 20 33 20 20 20 20 20  integer.  3     
18e0: 34 35 2e 32 20 20 20 20 20 20 20 20 20 20 20 72  45.2           r
18f0: 65 61 6c 0a 20 20 34 20 20 20 20 20 34 35 2e 30  eal.  4     45.0
1900: 20 20 20 20 20 20 20 20 20 20 20 72 65 61 6c 0a             real.
1910: 20 20 35 20 20 20 20 20 58 27 41 42 43 44 45 46    5     X'ABCDEF
1920: 27 20 20 20 20 20 20 62 6c 6f 62 0a 20 20 36 20  '      blob.  6 
1930: 20 20 20 20 4e 55 4c 4c 20 20 20 20 20 20 20 20      NULL        
1940: 20 20 20 6e 75 6c 6c 0a 7d 20 7b 0a 20 20 73 65     null.} {.  se
1950: 74 20 73 71 6c 20 22 20 53 45 4c 45 43 54 20 71  t sql " SELECT q
1960: 75 6f 74 65 28 20 2b 20 24 6c 69 74 65 72 61 6c  uote( + $literal
1970: 20 29 2c 20 74 79 70 65 6f 66 28 20 2b 20 24 6c   ), typeof( + $l
1980: 69 74 65 72 61 6c 29 20 22 0a 20 20 64 6f 5f 65  iteral) ".  do_e
1990: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
19a0: 70 72 2d 33 2e 24 74 6e 20 24 73 71 6c 20 5b 6c  pr-3.$tn $sql [l
19b0: 69 73 74 20 24 6c 69 74 65 72 61 6c 20 24 74 79  ist $literal $ty
19c0: 70 65 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  pe].}..#--------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a10: 2d 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 62  -.# Check that b
1a20: 6f 74 68 20 3d 20 61 6e 64 20 3d 3d 20 61 72 65  oth = and == are
1a30: 20 62 6f 74 68 20 61 63 63 65 70 74 61 62 6c 65   both acceptable
1a40: 20 61 73 20 74 68 65 20 22 65 71 75 61 6c 73 22   as the "equals"
1a50: 20 6f 70 65 72 61 74 6f 72 2e 0a 23 20 53 69 6d   operator..# Sim
1a60: 69 6c 61 72 6c 79 2c 20 65 69 74 68 65 72 20 21  ilarly, either !
1a70: 3d 20 6f 72 20 3c 3e 20 77 6f 72 6b 20 61 73 20  = or <> work as 
1a80: 74 68 65 20 6e 6f 74 2d 65 71 75 61 6c 73 20 6f  the not-equals o
1a90: 70 65 72 61 74 6f 72 2e 0a 23 0a 23 20 45 56 49  perator..#.# EVI
1aa0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 37  DENCE-OF: R-0367
1ab0: 39 2d 36 30 36 33 39 20 45 71 75 61 6c 73 20 63  9-60639 Equals c
1ac0: 61 6e 20 62 65 20 65 69 74 68 65 72 20 3d 20 6f  an be either = o
1ad0: 72 20 3d 3d 2e 0a 23 0a 23 20 45 56 49 44 45 4e  r ==..#.# EVIDEN
1ae0: 43 45 2d 4f 46 3a 20 52 2d 33 30 30 38 32 2d 33  CE-OF: R-30082-3
1af0: 38 39 39 36 20 54 68 65 20 6e 6f 6e 2d 65 71 75  8996 The non-equ
1b00: 61 6c 73 20 6f 70 65 72 61 74 6f 72 20 63 61 6e  als operator can
1b10: 20 62 65 20 65 69 74 68 65 72 20 21 3d 20 6f 72   be either != or
1b20: 0a 23 20 3c 3e 2e 0a 23 0a 66 6f 72 65 61 63 68  .# <>..#.foreach
1b30: 20 7b 74 6e 20 6c 69 74 65 72 61 6c 20 64 69 66   {tn literal dif
1b40: 66 65 72 65 6e 74 7d 20 7b 0a 20 20 31 20 20 20  ferent} {.  1   
1b50: 27 68 65 6c 6c 6f 77 6f 72 6c 64 27 20 20 27 31  'helloworld'  '1
1b60: 32 33 34 35 27 0a 20 20 32 20 20 20 32 32 20 20  2345'.  2   22  
1b70: 20 20 20 20 20 20 20 20 20 20 32 33 0a 20 20 33            23.  3
1b80: 20 20 20 27 78 79 7a 27 20 20 20 20 20 20 20 20     'xyz'        
1b90: 20 58 27 37 38 37 39 37 41 27 0a 20 20 34 20 20   X'78797A'.  4  
1ba0: 20 58 27 37 38 37 39 37 41 30 30 27 20 20 20 27   X'78797A00'   '
1bb0: 78 79 7a 27 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78  xyz'.} {.  do_ex
1bc0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
1bd0: 72 2d 34 2e 24 74 6e 20 22 0a 20 20 20 20 53 45  r-4.$tn ".    SE
1be0: 4c 45 43 54 20 24 6c 69 74 65 72 61 6c 20 20 3d  LECT $literal  =
1bf0: 20 24 6c 69 74 65 72 61 6c 2c 20 20 20 24 6c 69   $literal,   $li
1c00: 74 65 72 61 6c 20 3d 3d 20 24 6c 69 74 65 72 61  teral == $litera
1c10: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24 6c  l,.           $l
1c20: 69 74 65 72 61 6c 20 20 3d 20 24 64 69 66 66 65  iteral  = $diffe
1c30: 72 65 6e 74 2c 20 24 6c 69 74 65 72 61 6c 20 3d  rent, $literal =
1c40: 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 0a 20 20  = $different,.  
1c50: 20 20 20 20 20 20 20 20 20 24 6c 69 74 65 72 61           $litera
1c60: 6c 20 20 3d 20 4e 55 4c 4c 2c 20 20 20 20 20 20  l  = NULL,      
1c70: 20 24 6c 69 74 65 72 61 6c 20 3d 3d 20 4e 55 4c   $literal == NUL
1c80: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24 6c  L,.           $l
1c90: 69 74 65 72 61 6c 20 21 3d 20 24 6c 69 74 65 72  iteral != $liter
1ca0: 61 6c 2c 20 20 20 24 6c 69 74 65 72 61 6c 20 3c  al,   $literal <
1cb0: 3e 20 24 6c 69 74 65 72 61 6c 2c 0a 20 20 20 20  > $literal,.    
1cc0: 20 20 20 20 20 20 20 24 6c 69 74 65 72 61 6c 20         $literal 
1cd0: 21 3d 20 24 64 69 66 66 65 72 65 6e 74 2c 20 24  != $different, $
1ce0: 6c 69 74 65 72 61 6c 20 3c 3e 20 24 64 69 66 66  literal <> $diff
1cf0: 65 72 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  erent,.         
1d00: 20 20 24 6c 69 74 65 72 61 6c 20 21 3d 20 4e 55    $literal != NU
1d10: 4c 4c 2c 20 20 20 20 20 20 20 24 6c 69 74 65 72  LL,       $liter
1d20: 61 6c 20 21 3d 20 4e 55 4c 4c 0a 0a 20 20 22 20  al != NULL..  " 
1d30: 7b 31 20 31 20 30 20 30 20 7b 7d 20 7b 7d 20 30  {1 1 0 0 {} {} 0
1d40: 20 30 20 31 20 31 20 7b 7d 20 7b 7d 7d 0a 7d 0a   0 1 1 {} {}}.}.
1d50: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
1da0: 73 74 20 74 68 65 20 7c 7c 20 6f 70 65 72 61 74  st the || operat
1db0: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
1dc0: 2d 4f 46 3a 20 52 2d 34 34 34 30 39 2d 36 32 36  -OF: R-44409-626
1dd0: 34 31 20 54 68 65 20 7c 7c 20 6f 70 65 72 61 74  41 The || operat
1de0: 6f 72 20 69 73 20 22 63 6f 6e 63 61 74 65 6e 61  or is "concatena
1df0: 74 65 22 20 2d 20 69 74 20 6a 6f 69 6e 73 0a 23  te" - it joins.#
1e00: 20 74 6f 67 65 74 68 65 72 20 74 68 65 20 74 77   together the tw
1e10: 6f 20 73 74 72 69 6e 67 73 20 6f 66 20 69 74 73  o strings of its
1e20: 20 6f 70 65 72 61 6e 64 73 2e 0a 23 0a 66 6f 72   operands..#.for
1e30: 65 61 63 68 20 7b 74 6e 20 61 20 62 7d 20 7b 0a  each {tn a b} {.
1e40: 20 20 31 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c    1   'helloworl
1e50: 64 27 20 20 27 31 32 33 34 35 27 0a 20 20 32 20  d'  '12345'.  2 
1e60: 20 20 32 32 20 20 20 20 20 20 20 20 20 20 20 20    22            
1e70: 32 33 0a 7d 20 7b 0a 20 20 73 65 74 20 61 73 20  23.} {.  set as 
1e80: 5b 64 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20  [db one "SELECT 
1e90: 24 61 22 5d 0a 20 20 73 65 74 20 62 73 20 5b 64  $a"].  set bs [d
1ea0: 62 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 24 62  b one "SELECT $b
1eb0: 22 5d 0a 20 20 0a 20 20 64 6f 5f 65 78 65 63 73  "].  .  do_execs
1ec0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 35  ql_test e_expr-5
1ed0: 2e 24 74 6e 20 22 53 45 4c 45 43 54 20 24 61 20  .$tn "SELECT $a 
1ee0: 7c 7c 20 24 62 22 20 5b 6c 69 73 74 20 22 24 7b  || $b" [list "${
1ef0: 61 73 7d 24 7b 62 73 7d 22 5d 0a 7d 0a 0a 23 2d  as}${bs}"].}..#-
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
1f50: 74 68 65 20 25 20 6f 70 65 72 61 74 6f 72 2e 0a  the % operator..
1f60: 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  #.# EVIDENCE-OF:
1f70: 20 52 2d 30 38 39 31 34 2d 36 33 37 39 30 20 54   R-08914-63790 T
1f80: 68 65 20 6f 70 65 72 61 74 6f 72 20 25 20 6f 75  he operator % ou
1f90: 74 70 75 74 73 20 74 68 65 20 76 61 6c 75 65 20  tputs the value 
1fa0: 6f 66 20 69 74 73 0a 23 20 6c 65 66 74 20 6f 70  of its.# left op
1fb0: 65 72 61 6e 64 20 6d 6f 64 75 6c 6f 20 69 74 73  erand modulo its
1fc0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 0a   right operand..
1fd0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
1fe0: 74 20 65 5f 65 78 70 72 2d 36 2e 31 20 7b 53 45  t e_expr-6.1 {SE
1ff0: 4c 45 43 54 20 20 37 32 25 35 7d 20 20 7b 32 7d  LECT  72%5}  {2}
2000: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2010: 20 65 5f 65 78 70 72 2d 36 2e 32 20 7b 53 45 4c   e_expr-6.2 {SEL
2020: 45 43 54 20 20 37 32 25 2d 35 7d 20 7b 32 7d 0a  ECT  72%-5} {2}.
2030: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2040: 65 5f 65 78 70 72 2d 36 2e 33 20 7b 53 45 4c 45  e_expr-6.3 {SELE
2050: 43 54 20 2d 37 32 25 2d 35 7d 20 7b 2d 32 7d 0a  CT -72%-5} {-2}.
2060: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2070: 65 5f 65 78 70 72 2d 36 2e 34 20 7b 53 45 4c 45  e_expr-6.4 {SELE
2080: 43 54 20 2d 37 32 25 35 7d 20 20 7b 2d 32 7d 0a  CT -72%5}  {-2}.
2090: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
20e0: 73 74 20 74 68 61 74 20 74 68 65 20 72 65 73 75  st that the resu
20f0: 6c 74 73 20 6f 66 20 61 6c 6c 20 62 69 6e 61 72  lts of all binar
2100: 79 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  y operators are 
2110: 65 69 74 68 65 72 20 6e 75 6d 65 72 69 63 20 6f  either numeric o
2120: 72 20 0a 23 20 4e 55 4c 4c 2c 20 65 78 63 65 70  r .# NULL, excep
2130: 74 20 66 6f 72 20 74 68 65 20 7c 7c 20 6f 70 65  t for the || ope
2140: 72 61 74 6f 72 2c 20 77 68 69 63 68 20 6d 61 79  rator, which may
2150: 20 65 76 61 6c 75 61 74 65 20 74 6f 20 65 69 74   evaluate to eit
2160: 68 65 72 20 61 20 74 65 78 74 0a 23 20 76 61 6c  her a text.# val
2170: 75 65 20 6f 72 20 4e 55 4c 4c 2e 0a 23 0a 23 20  ue or NULL..#.# 
2180: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
2190: 30 36 36 35 2d 31 37 37 39 32 20 54 68 65 20 72  0665-17792 The r
21a0: 65 73 75 6c 74 20 6f 66 20 61 6e 79 20 62 69 6e  esult of any bin
21b0: 61 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ary operator is 
21c0: 65 69 74 68 65 72 0a 23 20 61 20 6e 75 6d 65 72  either.# a numer
21d0: 69 63 20 76 61 6c 75 65 20 6f 72 20 4e 55 4c 4c  ic value or NULL
21e0: 2c 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  , except for the
21f0: 20 7c 7c 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f   || concatenatio
2200: 6e 20 6f 70 65 72 61 74 6f 72 0a 23 20 77 68 69  n operator.# whi
2210: 63 68 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  ch always evalua
2220: 74 65 73 20 74 6f 20 65 69 74 68 65 72 20 4e 55  tes to either NU
2230: 4c 4c 20 6f 72 20 61 20 74 65 78 74 20 76 61 6c  LL or a text val
2240: 75 65 2e 0a 23 0a 73 65 74 20 6c 69 74 65 72 61  ue..#.set litera
2250: 6c 73 20 7b 0a 20 20 31 20 27 61 62 63 27 20 20  ls {.  1 'abc'  
2260: 20 20 20 20 20 20 32 20 27 68 65 78 61 64 65 63        2 'hexadec
2270: 69 6d 61 6c 27 20 20 20 20 20 20 20 33 20 27 27  imal'       3 ''
2280: 0a 20 20 34 20 31 32 33 20 20 20 20 20 20 20 20  .  4 123        
2290: 20 20 35 20 2d 31 32 33 20 20 20 20 20 20 20 20    5 -123        
22a0: 20 20 20 20 20 20 20 20 36 20 30 0a 20 20 37 20          6 0.  7 
22b0: 31 32 33 2e 34 20 20 20 20 20 20 20 20 38 20 30  123.4        8 0
22c0: 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
22d0: 20 20 20 39 20 2d 31 32 33 2e 34 0a 20 31 30 20     9 -123.4. 10 
22e0: 58 27 41 42 43 44 45 46 27 20 20 20 31 31 20 58  X'ABCDEF'   11 X
22f0: 27 27 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ''              
2300: 20 20 31 32 20 58 27 30 30 30 30 27 0a 20 31 33    12 X'0000'. 13
2310: 20 20 20 20 20 4e 55 4c 4c 0a 7d 0a 66 6f 72 65       NULL.}.fore
2320: 61 63 68 20 6f 70 20 24 6f 70 6c 69 73 74 20 7b  ach op $oplist {
2330: 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 31 20 72  .  foreach {n1 r
2340: 68 73 7d 20 24 6c 69 74 65 72 61 6c 73 20 7b 20  hs} $literals { 
2350: 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 32 20 6c  .  foreach {n2 l
2360: 68 73 7d 20 24 6c 69 74 65 72 61 6c 73 20 7b 0a  hs} $literals {.
2370: 0a 20 20 20 20 73 65 74 20 74 20 5b 64 62 20 6f  .    set t [db o
2380: 6e 65 20 22 20 53 45 4c 45 43 54 20 74 79 70 65  ne " SELECT type
2390: 6f 66 28 24 6c 68 73 20 24 6f 70 20 24 72 68 73  of($lhs $op $rhs
23a0: 29 20 22 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74  ) "].    do_test
23b0: 20 65 5f 65 78 70 72 2d 37 2e 24 6f 70 6e 61 6d   e_expr-7.$opnam
23c0: 65 28 24 6f 70 29 2e 24 6e 31 2e 24 6e 32 20 7b  e($op).$n1.$n2 {
23d0: 0a 20 20 20 20 20 20 65 78 70 72 20 7b 0a 20 20  .      expr {.  
23e0: 20 20 20 20 20 20 20 20 20 28 24 6f 70 3d 3d 22           ($op=="
23f0: 7c 7c 22 20 26 26 20 28 24 74 20 3d 3d 20 22 74  ||" && ($t == "t
2400: 65 78 74 22 20 7c 7c 20 24 74 20 3d 3d 20 22 6e  ext" || $t == "n
2410: 75 6c 6c 22 29 29 0a 20 20 20 20 20 20 20 20 7c  ull")).        |
2420: 7c 20 28 24 6f 70 21 3d 22 7c 7c 22 20 26 26 20  | ($op!="||" && 
2430: 28 24 74 20 3d 3d 20 22 69 6e 74 65 67 65 72 22  ($t == "integer"
2440: 20 7c 7c 20 24 74 20 3d 3d 20 22 72 65 61 6c 22   || $t == "real"
2450: 20 7c 7c 20 24 74 20 3d 3d 20 22 6e 75 6c 6c 22   || $t == "null"
2460: 29 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  )).      }.    }
2470: 20 31 0a 0a 20 20 7d 7d 0a 7d 0a 0a 23 2d 2d 2d   1..  }}.}..#---
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
24d0: 65 20 49 53 20 61 6e 64 20 49 53 20 4e 4f 54 20  e IS and IS NOT 
24e0: 6f 70 65 72 61 74 6f 72 73 2e 0a 23 0a 23 20 45  operators..#.# E
24f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
2500: 37 33 31 2d 34 35 37 37 33 20 54 68 65 20 49 53  731-45773 The IS
2510: 20 61 6e 64 20 49 53 20 4e 4f 54 20 6f 70 65 72   and IS NOT oper
2520: 61 74 6f 72 73 20 77 6f 72 6b 20 6c 69 6b 65 20  ators work like 
2530: 3d 20 61 6e 64 0a 23 20 21 3d 20 65 78 63 65 70  = and.# != excep
2540: 74 20 77 68 65 6e 20 6f 6e 65 20 6f 72 20 62 6f  t when one or bo
2550: 74 68 20 6f 66 20 74 68 65 20 6f 70 65 72 61 6e  th of the operan
2560: 64 73 20 61 72 65 20 4e 55 4c 4c 2e 0a 23 0a 23  ds are NULL..#.#
2570: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2580: 30 36 33 32 35 2d 31 35 33 31 35 20 49 6e 20 74  06325-15315 In t
2590: 68 69 73 20 63 61 73 65 2c 20 69 66 20 62 6f 74  his case, if bot
25a0: 68 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 4e  h operands are N
25b0: 55 4c 4c 2c 0a 23 20 74 68 65 6e 20 74 68 65 20  ULL,.# then the 
25c0: 49 53 20 6f 70 65 72 61 74 6f 72 20 65 76 61 6c  IS operator eval
25d0: 75 61 74 65 73 20 74 6f 20 31 20 28 74 72 75 65  uates to 1 (true
25e0: 29 20 61 6e 64 20 74 68 65 20 49 53 20 4e 4f 54  ) and the IS NOT
25f0: 20 6f 70 65 72 61 74 6f 72 0a 23 20 65 76 61 6c   operator.# eval
2600: 75 61 74 65 73 20 74 6f 20 30 20 28 66 61 6c 73  uates to 0 (fals
2610: 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  e)..#.# EVIDENCE
2620: 2d 4f 46 3a 20 52 2d 31 39 38 31 32 2d 33 36 37  -OF: R-19812-367
2630: 37 39 20 49 66 20 6f 6e 65 20 6f 70 65 72 61 6e  79 If one operan
2640: 64 20 69 73 20 4e 55 4c 4c 20 61 6e 64 20 74 68  d is NULL and th
2650: 65 20 6f 74 68 65 72 20 69 73 0a 23 20 6e 6f 74  e other is.# not
2660: 2c 20 74 68 65 6e 20 74 68 65 20 49 53 20 6f 70  , then the IS op
2670: 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73  erator evaluates
2680: 20 74 6f 20 30 20 28 66 61 6c 73 65 29 20 61 6e   to 0 (false) an
2690: 64 20 74 68 65 20 49 53 20 4e 4f 54 0a 23 20 6f  d the IS NOT.# o
26a0: 70 65 72 61 74 6f 72 20 69 73 20 31 20 28 74 72  perator is 1 (tr
26b0: 75 65 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ue)..#.# EVIDENC
26c0: 45 2d 4f 46 3a 20 52 2d 36 31 39 37 35 2d 31 33  E-OF: R-61975-13
26d0: 34 31 30 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  410 It is not po
26e0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 49 53  ssible for an IS
26f0: 20 6f 72 20 49 53 20 4e 4f 54 0a 23 20 65 78 70   or IS NOT.# exp
2700: 72 65 73 73 69 6f 6e 20 74 6f 20 65 76 61 6c 75  ression to evalu
2710: 61 74 65 20 74 6f 20 4e 55 4c 4c 2e 0a 23 0a 64  ate to NULL..#.d
2720: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
2730: 5f 65 78 70 72 2d 38 2e 31 2e 31 20 20 7b 20 53  _expr-8.1.1  { S
2740: 45 4c 45 43 54 20 4e 55 4c 4c 20 49 53 20 20 20  ELECT NULL IS   
2750: 20 20 4e 55 4c 4c 20 7d 20 7b 31 7d 0a 64 6f 5f    NULL } {1}.do_
2760: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
2770: 78 70 72 2d 38 2e 31 2e 32 20 20 7b 20 53 45 4c  xpr-8.1.2  { SEL
2780: 45 43 54 20 27 61 62 27 20 49 53 20 20 20 20 20  ECT 'ab' IS     
2790: 4e 55 4c 4c 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78  NULL } {0}.do_ex
27a0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
27b0: 72 2d 38 2e 31 2e 33 20 20 7b 20 53 45 4c 45 43  r-8.1.3  { SELEC
27c0: 54 20 4e 55 4c 4c 20 49 53 20 20 20 20 20 27 61  T NULL IS     'a
27d0: 62 27 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63  b' } {0}.do_exec
27e0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
27f0: 38 2e 31 2e 34 20 20 7b 20 53 45 4c 45 43 54 20  8.1.4  { SELECT 
2800: 27 61 62 27 20 49 53 20 20 20 20 20 27 61 62 27  'ab' IS     'ab'
2810: 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71   } {1}.do_execsq
2820: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
2830: 31 2e 35 20 20 7b 20 53 45 4c 45 43 54 20 4e 55  1.5  { SELECT NU
2840: 4c 4c 20 3d 3d 20 20 20 20 20 4e 55 4c 4c 20 7d  LL ==     NULL }
2850: 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {{}}.do_execsql
2860: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31  _test e_expr-8.1
2870: 2e 36 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .6  { SELECT 'ab
2880: 27 20 3d 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20  ' ==     NULL } 
2890: 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {{}}.do_execsql_
28a0: 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e  test e_expr-8.1.
28b0: 37 20 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c  7  { SELECT NULL
28c0: 20 3d 3d 20 20 20 20 20 27 61 62 27 20 7d 20 7b   ==     'ab' } {
28d0: 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}}.do_execsql_t
28e0: 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 38  est e_expr-8.1.8
28f0: 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27 20    { SELECT 'ab' 
2900: 3d 3d 20 20 20 20 20 27 61 62 27 20 7d 20 7b 31  ==     'ab' } {1
2910: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
2920: 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 39 20 20  t e_expr-8.1.9  
2930: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 49 53  { SELECT NULL IS
2940: 20 4e 4f 54 20 4e 55 4c 4c 20 7d 20 7b 30 7d 0a   NOT NULL } {0}.
2950: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2960: 65 5f 65 78 70 72 2d 38 2e 31 2e 31 30 20 7b 20  e_expr-8.1.10 { 
2970: 53 45 4c 45 43 54 20 27 61 62 27 20 49 53 20 4e  SELECT 'ab' IS N
2980: 4f 54 20 4e 55 4c 4c 20 7d 20 7b 31 7d 0a 64 6f  OT NULL } {1}.do
2990: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
29a0: 65 78 70 72 2d 38 2e 31 2e 31 31 20 7b 20 53 45  expr-8.1.11 { SE
29b0: 4c 45 43 54 20 4e 55 4c 4c 20 49 53 20 4e 4f 54  LECT NULL IS NOT
29c0: 20 27 61 62 27 20 7d 20 7b 31 7d 0a 64 6f 5f 65   'ab' } {1}.do_e
29d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
29e0: 70 72 2d 38 2e 31 2e 31 32 20 7b 20 53 45 4c 45  pr-8.1.12 { SELE
29f0: 43 54 20 27 61 62 27 20 49 53 20 4e 4f 54 20 27  CT 'ab' IS NOT '
2a00: 61 62 27 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65  ab' } {0}.do_exe
2a10: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
2a20: 2d 38 2e 31 2e 31 33 20 7b 20 53 45 4c 45 43 54  -8.1.13 { SELECT
2a30: 20 4e 55 4c 4c 20 21 3d 20 20 20 20 20 4e 55 4c   NULL !=     NUL
2a40: 4c 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63  L } {{}}.do_exec
2a50: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
2a60: 38 2e 31 2e 31 34 20 7b 20 53 45 4c 45 43 54 20  8.1.14 { SELECT 
2a70: 27 61 62 27 20 21 3d 20 20 20 20 20 4e 55 4c 4c  'ab' !=     NULL
2a80: 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73   } {{}}.do_execs
2a90: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38  ql_test e_expr-8
2aa0: 2e 31 2e 31 35 20 7b 20 53 45 4c 45 43 54 20 4e  .1.15 { SELECT N
2ab0: 55 4c 4c 20 21 3d 20 20 20 20 20 27 61 62 27 20  ULL !=     'ab' 
2ac0: 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  } {{}}.do_execsq
2ad0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
2ae0: 31 2e 31 36 20 7b 20 53 45 4c 45 43 54 20 27 61  1.16 { SELECT 'a
2af0: 62 27 20 21 3d 20 20 20 20 20 27 61 62 27 20 7d  b' !=     'ab' }
2b00: 20 7b 30 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 6e   {0}..foreach {n
2b10: 31 20 72 68 73 7d 20 24 6c 69 74 65 72 61 6c 73  1 rhs} $literals
2b20: 20 7b 20 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e   { .  foreach {n
2b30: 32 20 6c 68 73 7d 20 24 6c 69 74 65 72 61 6c 73  2 lhs} $literals
2b40: 20 7b 0a 20 20 20 20 69 66 20 7b 24 72 68 73 21   {.    if {$rhs!
2b50: 3d 22 4e 55 4c 4c 22 20 26 26 20 24 6c 68 73 21  ="NULL" && $lhs!
2b60: 3d 22 4e 55 4c 4c 22 7d 20 7b 0a 20 20 20 20 20  ="NULL"} {.     
2b70: 20 73 65 74 20 65 71 20 5b 65 78 65 63 73 71 6c   set eq [execsql
2b80: 20 22 53 45 4c 45 43 54 20 24 6c 68 73 20 3d 20   "SELECT $lhs = 
2b90: 24 72 68 73 2c 20 24 6c 68 73 20 21 3d 20 24 72  $rhs, $lhs != $r
2ba0: 68 73 22 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20  hs"].    } else 
2bb0: 7b 0a 20 20 20 20 20 20 73 65 74 20 65 71 20 5b  {.      set eq [
2bc0: 6c 69 73 74 20 5b 65 78 70 72 20 7b 24 6c 68 73  list [expr {$lhs
2bd0: 3d 3d 22 4e 55 4c 4c 22 20 26 26 20 24 72 68 73  =="NULL" && $rhs
2be0: 3d 3d 22 4e 55 4c 4c 22 7d 5d 20 5c 0a 20 20 20  =="NULL"}] \.   
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 5b 65 78 70 72 20 7b 24 6c 68 73 21 3d 22 4e 55  [expr {$lhs!="NU
2c10: 4c 4c 22 20 7c 7c 20 24 72 68 73 21 3d 22 4e 55  LL" || $rhs!="NU
2c20: 4c 4c 22 7d 5d 0a 20 20 20 20 20 20 5d 0a 20 20  LL"}].      ].  
2c30: 20 20 7d 0a 20 20 20 20 73 65 74 20 74 65 73 74    }.    set test
2c40: 20 65 5f 65 78 70 72 2d 38 2e 32 2e 24 6e 31 2e   e_expr-8.2.$n1.
2c50: 24 6e 32 0a 20 20 20 20 64 6f 5f 65 78 65 63 73  $n2.    do_execs
2c60: 71 6c 5f 74 65 73 74 20 24 74 65 73 74 2e 31 20  ql_test $test.1 
2c70: 22 53 45 4c 45 43 54 20 24 6c 68 73 20 49 53 20  "SELECT $lhs IS 
2c80: 24 72 68 73 2c 20 24 6c 68 73 20 49 53 20 4e 4f  $rhs, $lhs IS NO
2c90: 54 20 24 72 68 73 22 20 24 65 71 0a 20 20 20 20  T $rhs" $eq.    
2ca0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2cb0: 24 74 65 73 74 2e 32 20 22 0a 20 20 20 20 20 20  $test.2 ".      
2cc0: 53 45 4c 45 43 54 20 28 24 6c 68 73 20 49 53 20  SELECT ($lhs IS 
2cd0: 24 72 68 73 29 20 49 53 20 4e 55 4c 4c 2c 20 28  $rhs) IS NULL, (
2ce0: 24 6c 68 73 20 49 53 20 4e 4f 54 20 24 72 68 73  $lhs IS NOT $rhs
2cf0: 29 20 49 53 20 4e 55 4c 4c 0a 20 20 20 20 22 20  ) IS NULL.    " 
2d00: 7b 30 20 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d  {0 0}.  }.}..#--
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d50: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 75 6e 20 73 6f  -------.# Run so
2d60: 6d 65 20 74 65 73 74 73 20 6f 6e 20 74 68 65 20  me tests on the 
2d70: 43 4f 4c 4c 41 54 45 20 22 75 6e 61 72 79 20 70  COLLATE "unary p
2d80: 6f 73 74 66 69 78 20 6f 70 65 72 61 74 6f 72 22  ostfix operator"
2d90: 2e 0a 23 0a 23 20 54 68 69 73 20 63 6f 6c 6c 61  ..#.# This colla
2da0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65  tion sequence re
2db0: 76 65 72 73 65 73 20 62 6f 74 68 20 61 72 67 75  verses both argu
2dc0: 6d 65 6e 74 73 20 62 65 66 6f 72 65 20 75 73 69  ments before usi
2dd0: 6e 67 20 0a 23 20 5b 73 74 72 69 6e 67 20 63 6f  ng .# [string co
2de0: 6d 70 61 72 65 5d 20 74 6f 20 63 6f 6d 70 61 72  mpare] to compar
2df0: 65 20 74 68 65 6d 2e 20 46 6f 72 20 65 78 61 6d  e them. For exam
2e00: 70 6c 65 2c 20 77 68 65 6e 20 63 6f 6d 70 61 72  ple, when compar
2e10: 69 6e 67 20 74 68 65 0a 23 20 73 74 72 69 6e 67  ing the.# string
2e20: 73 20 27 6f 6e 65 27 20 61 6e 64 20 27 66 6f 75  s 'one' and 'fou
2e30: 72 27 2c 20 72 65 74 75 72 6e 20 74 68 65 20 72  r', return the r
2e40: 65 73 75 6c 74 20 6f 66 3a 0a 23 20 20 20 0a 23  esult of:.#   .#
2e50: 20 20 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72     string compar
2e60: 65 20 65 6e 6f 20 72 75 6f 66 0a 23 0a 70 72 6f  e eno ruof.#.pro
2e70: 63 20 72 65 76 65 72 73 65 5f 73 74 72 20 7b 7a  c reverse_str {z
2e80: 53 74 72 7d 20 7b 0a 20 20 73 65 74 20 6f 75 74  Str} {.  set out
2e90: 20 22 22 0a 20 20 66 6f 72 65 61 63 68 20 63 20   "".  foreach c 
2ea0: 5b 73 70 6c 69 74 20 24 7a 53 74 72 20 7b 7d 5d  [split $zStr {}]
2eb0: 20 7b 20 73 65 74 20 6f 75 74 20 22 24 7b 63 7d   { set out "${c}
2ec0: 24 7b 6f 75 74 7d 22 20 7d 0a 20 20 73 65 74 20  ${out}" }.  set 
2ed0: 6f 75 74 0a 7d 0a 70 72 6f 63 20 72 65 76 65 72  out.}.proc rever
2ee0: 73 65 5f 63 6f 6c 6c 61 74 65 20 7b 7a 4c 65 66  se_collate {zLef
2ef0: 74 20 7a 52 69 67 68 74 7d 20 7b 0a 20 20 73 74  t zRight} {.  st
2f00: 72 69 6e 67 20 63 6f 6d 70 61 72 65 20 5b 72 65  ring compare [re
2f10: 76 65 72 73 65 5f 73 74 72 20 24 7a 4c 65 66 74  verse_str $zLeft
2f20: 5d 20 5b 72 65 76 65 72 73 65 5f 73 74 72 20 24  ] [reverse_str $
2f30: 7a 52 69 67 68 74 5d 0a 7d 0a 64 62 20 63 6f 6c  zRight].}.db col
2f40: 6c 61 74 65 20 72 65 76 65 72 73 65 20 72 65 76  late reverse rev
2f50: 65 72 73 65 5f 63 6f 6c 6c 61 74 65 0a 0a 23 20  erse_collate..# 
2f60: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
2f70: 39 35 37 37 2d 33 33 34 37 31 20 54 68 65 20 43  9577-33471 The C
2f80: 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20  OLLATE operator 
2f90: 69 73 20 61 20 75 6e 61 72 79 20 70 6f 73 74 66  is a unary postf
2fa0: 69 78 0a 23 20 6f 70 65 72 61 74 6f 72 20 74 68  ix.# operator th
2fb0: 61 74 20 61 73 73 69 67 6e 73 20 61 20 63 6f 6c  at assigns a col
2fc0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
2fd0: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
2fe0: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
2ff0: 46 3a 20 52 2d 33 36 32 33 31 2d 33 30 37 33 31  F: R-36231-30731
3000: 20 54 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   The COLLATE ope
3010: 72 61 74 6f 72 20 68 61 73 20 61 20 68 69 67 68  rator has a high
3020: 65 72 0a 23 20 70 72 65 63 65 64 65 6e 63 65 20  er.# precedence 
3030: 28 62 69 6e 64 73 20 6d 6f 72 65 20 74 69 67 68  (binds more tigh
3040: 74 6c 79 29 20 74 68 61 6e 20 61 6e 79 20 62 69  tly) than any bi
3050: 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 20 61 6e  nary operator an
3060: 64 20 61 6e 79 20 75 6e 61 72 79 0a 23 20 70 72  d any unary.# pr
3070: 65 66 69 78 20 6f 70 65 72 61 74 6f 72 20 65 78  efix operator ex
3080: 63 65 70 74 20 22 7e 22 2e 0a 23 0a 64 6f 5f 65  cept "~"..#.do_e
3090: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
30a0: 70 72 2d 39 2e 31 20 7b 20 53 45 4c 45 43 54 20  pr-9.1 { SELECT 
30b0: 20 27 61 62 63 64 27 20 3c 20 27 62 62 62 62 27   'abcd' < 'bbbb'
30c0: 20 20 20 20 43 4f 4c 4c 41 54 45 20 72 65 76 65      COLLATE reve
30d0: 72 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  rse } 0.do_execs
30e0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
30f0: 2e 32 20 7b 20 53 45 4c 45 43 54 20 28 27 61 62  .2 { SELECT ('ab
3100: 63 64 27 20 3c 20 27 62 62 62 62 27 29 20 20 20  cd' < 'bbbb')   
3110: 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65 20  COLLATE reverse 
3120: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
3130: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 33 20 7b  est e_expr-9.3 {
3140: 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27 20   SELECT  'abcd' 
3150: 3c 3d 20 27 62 62 62 62 27 20 20 20 43 4f 4c 4c  <= 'bbbb'   COLL
3160: 41 54 45 20 72 65 76 65 72 73 65 20 7d 20 30 0a  ATE reverse } 0.
3170: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3180: 65 5f 65 78 70 72 2d 39 2e 34 20 7b 20 53 45 4c  e_expr-9.4 { SEL
3190: 45 43 54 20 28 27 61 62 63 64 27 20 3c 3d 20 27  ECT ('abcd' <= '
31a0: 62 62 62 62 27 29 20 20 43 4f 4c 4c 41 54 45 20  bbbb')  COLLATE 
31b0: 72 65 76 65 72 73 65 20 7d 20 31 0a 0a 64 6f 5f  reverse } 1..do_
31c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
31d0: 78 70 72 2d 39 2e 35 20 7b 20 53 45 4c 45 43 54  xpr-9.5 { SELECT
31e0: 20 20 27 61 62 63 64 27 20 3e 20 27 62 62 62 62    'abcd' > 'bbbb
31f0: 27 20 20 20 20 43 4f 4c 4c 41 54 45 20 72 65 76  '    COLLATE rev
3200: 65 72 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  erse } 1.do_exec
3210: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3220: 39 2e 36 20 7b 20 53 45 4c 45 43 54 20 28 27 61  9.6 { SELECT ('a
3230: 62 63 64 27 20 3e 20 27 62 62 62 62 27 29 20 20  bcd' > 'bbbb')  
3240: 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65   COLLATE reverse
3250: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
3260: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 37 20  test e_expr-9.7 
3270: 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27  { SELECT  'abcd'
3280: 20 3e 3d 20 27 62 62 62 62 27 20 20 20 43 4f 4c   >= 'bbbb'   COL
3290: 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d 20 31  LATE reverse } 1
32a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
32b0: 20 65 5f 65 78 70 72 2d 39 2e 38 20 7b 20 53 45   e_expr-9.8 { SE
32c0: 4c 45 43 54 20 28 27 61 62 63 64 27 20 3e 3d 20  LECT ('abcd' >= 
32d0: 27 62 62 62 62 27 29 20 20 43 4f 4c 4c 41 54 45  'bbbb')  COLLATE
32e0: 20 72 65 76 65 72 73 65 20 7d 20 30 0a 0a 64 6f   reverse } 0..do
32f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3300: 65 78 70 72 2d 39 2e 31 30 20 7b 20 53 45 4c 45  expr-9.10 { SELE
3310: 43 54 20 20 27 61 62 63 64 27 20 3d 20 20 27 41  CT  'abcd' =  'A
3320: 42 43 44 27 20 20 43 4f 4c 4c 41 54 45 20 6e 6f  BCD'  COLLATE no
3330: 63 61 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63  case } 1.do_exec
3340: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3350: 39 2e 31 31 20 7b 20 53 45 4c 45 43 54 20 28 27  9.11 { SELECT ('
3360: 61 62 63 64 27 20 3d 20 20 27 41 42 43 44 27 29  abcd' =  'ABCD')
3370: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
3380: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
3390: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 32 20  est e_expr-9.12 
33a0: 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27  { SELECT  'abcd'
33b0: 20 3d 3d 20 27 41 42 43 44 27 20 20 43 4f 4c 4c   == 'ABCD'  COLL
33c0: 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64  ATE nocase } 1.d
33d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
33e0: 5f 65 78 70 72 2d 39 2e 31 33 20 7b 20 53 45 4c  _expr-9.13 { SEL
33f0: 45 43 54 20 28 27 61 62 63 64 27 20 3d 3d 20 27  ECT ('abcd' == '
3400: 41 42 43 44 27 29 20 43 4f 4c 4c 41 54 45 20 6e  ABCD') COLLATE n
3410: 6f 63 61 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65  ocase } 0.do_exe
3420: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3430: 2d 39 2e 31 34 20 7b 20 53 45 4c 45 43 54 20 20  -9.14 { SELECT  
3440: 27 61 62 63 64 27 20 49 53 20 27 41 42 43 44 27  'abcd' IS 'ABCD'
3450: 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65    COLLATE nocase
3460: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
3470: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 35  test e_expr-9.15
3480: 20 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63 64   { SELECT ('abcd
3490: 27 20 49 53 20 27 41 42 43 44 27 29 20 43 4f 4c  ' IS 'ABCD') COL
34a0: 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a  LATE nocase } 0.
34b0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
34c0: 20 65 5f 65 78 70 72 2d 39 2e 31 36 20 7b 20 53   e_expr-9.16 { S
34d0: 45 4c 45 43 54 20 20 27 61 62 63 64 27 20 21 3d  ELECT  'abcd' !=
34e0: 20 27 41 42 43 44 27 20 20 20 20 20 20 43 4f 4c   'ABCD'      COL
34f0: 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a  LATE nocase } 0.
3500: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3510: 65 5f 65 78 70 72 2d 39 2e 31 37 20 7b 20 53 45  e_expr-9.17 { SE
3520: 4c 45 43 54 20 28 27 61 62 63 64 27 20 21 3d 20  LECT ('abcd' != 
3530: 27 41 42 43 44 27 29 20 20 20 20 20 43 4f 4c 4c  'ABCD')     COLL
3540: 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64  ATE nocase } 1.d
3550: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
3560: 5f 65 78 70 72 2d 39 2e 31 38 20 7b 20 53 45 4c  _expr-9.18 { SEL
3570: 45 43 54 20 20 27 61 62 63 64 27 20 3c 3e 20 27  ECT  'abcd' <> '
3580: 41 42 43 44 27 20 20 20 20 20 20 43 4f 4c 4c 41  ABCD'      COLLA
3590: 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64 6f  TE nocase } 0.do
35a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
35b0: 65 78 70 72 2d 39 2e 31 39 20 7b 20 53 45 4c 45  expr-9.19 { SELE
35c0: 43 54 20 28 27 61 62 63 64 27 20 3c 3e 20 27 41  CT ('abcd' <> 'A
35d0: 42 43 44 27 29 20 20 20 20 20 43 4f 4c 4c 41 54  BCD')     COLLAT
35e0: 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64 6f 5f  E nocase } 1.do_
35f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3600: 78 70 72 2d 39 2e 32 30 20 7b 20 53 45 4c 45 43  xpr-9.20 { SELEC
3610: 54 20 20 27 61 62 63 64 27 20 49 53 20 4e 4f 54  T  'abcd' IS NOT
3620: 20 27 41 42 43 44 27 20 20 43 4f 4c 4c 41 54 45   'ABCD'  COLLATE
3630: 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64 6f 5f 65   nocase } 0.do_e
3640: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
3650: 70 72 2d 39 2e 32 31 20 7b 20 53 45 4c 45 43 54  pr-9.21 { SELECT
3660: 20 28 27 61 62 63 64 27 20 49 53 20 4e 4f 54 20   ('abcd' IS NOT 
3670: 27 41 42 43 44 27 29 20 43 4f 4c 4c 41 54 45 20  'ABCD') COLLATE 
3680: 6e 6f 63 61 73 65 20 7d 20 31 0a 0a 64 6f 5f 65  nocase } 1..do_e
3690: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
36a0: 70 72 2d 39 2e 32 32 20 7b 20 0a 20 20 53 45 4c  pr-9.22 { .  SEL
36b0: 45 43 54 20 27 62 62 62 27 20 42 45 54 57 45 45  ECT 'bbb' BETWEE
36c0: 4e 20 27 41 41 41 27 20 41 4e 44 20 27 43 43 43  N 'AAA' AND 'CCC
36d0: 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ' COLLATE nocase
36e0: 20 0a 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c   .} 1.do_execsql
36f0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
3700: 33 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 28 27  3 { .  SELECT ('
3710: 62 62 62 27 20 42 45 54 57 45 45 4e 20 27 41 41  bbb' BETWEEN 'AA
3720: 41 27 20 41 4e 44 20 27 43 43 43 27 29 20 43 4f  A' AND 'CCC') CO
3730: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 0a 7d 20  LLATE nocase .} 
3740: 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  0..# EVIDENCE-OF
3750: 3a 20 52 2d 35 38 37 33 31 2d 32 35 34 33 39 20  : R-58731-25439 
3760: 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
3770: 71 75 65 6e 63 65 20 73 65 74 20 62 79 20 74 68  quence set by th
3780: 65 20 43 4f 4c 4c 41 54 45 0a 23 20 6f 70 65 72  e COLLATE.# oper
3790: 61 74 6f 72 20 6f 76 65 72 72 69 64 65 73 20 74  ator overrides t
37a0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
37b0: 75 65 6e 63 65 20 64 65 74 65 72 6d 69 6e 65 64  uence determined
37c0: 20 62 79 20 74 68 65 20 43 4f 4c 4c 41 54 45 0a   by the COLLATE.
37d0: 23 20 63 6c 61 75 73 65 20 69 6e 20 61 20 74 61  # clause in a ta
37e0: 62 6c 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  ble column defin
37f0: 69 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 65 78 65 63  ition..#.do_exec
3800: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3810: 39 2e 32 34 20 7b 20 0a 20 20 43 52 45 41 54 45  9.24 { .  CREATE
3820: 20 54 41 42 4c 45 20 74 32 34 28 61 20 43 4f 4c   TABLE t24(a COL
3830: 4c 41 54 45 20 4e 4f 43 41 53 45 2c 20 62 29 3b  LATE NOCASE, b);
3840: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
3850: 32 34 20 56 41 4c 55 45 53 28 27 61 61 61 27 2c  24 VALUES('aaa',
3860: 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   1);.  INSERT IN
3870: 54 4f 20 74 32 34 20 56 41 4c 55 45 53 28 27 62  TO t24 VALUES('b
3880: 62 62 27 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52  bb', 2);.  INSER
3890: 54 20 49 4e 54 4f 20 74 32 34 20 56 41 4c 55 45  T INTO t24 VALUE
38a0: 53 28 27 63 63 63 27 2c 20 33 29 3b 0a 7d 20 7b  S('ccc', 3);.} {
38b0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
38c0: 74 20 65 5f 65 78 70 72 2d 39 2e 32 35 20 7b 20  t e_expr-9.25 { 
38d0: 53 45 4c 45 43 54 20 27 42 42 42 27 20 3d 20 61  SELECT 'BBB' = a
38e0: 20 46 52 4f 4d 20 74 32 34 20 7d 20 7b 30 20 31   FROM t24 } {0 1
38f0: 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   0}.do_execsql_t
3900: 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32 35 20  est e_expr-9.25 
3910: 7b 20 53 45 4c 45 43 54 20 61 20 3d 20 27 42 42  { SELECT a = 'BB
3920: 42 27 20 46 52 4f 4d 20 74 32 34 20 7d 20 7b 30  B' FROM t24 } {0
3930: 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   1 0}.do_execsql
3940: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32  _test e_expr-9.2
3950: 35 20 7b 20 53 45 4c 45 43 54 20 27 42 42 42 27  5 { SELECT 'BBB'
3960: 20 3d 20 61 20 43 4f 4c 4c 41 54 45 20 62 69 6e   = a COLLATE bin
3970: 61 72 79 20 46 52 4f 4d 20 74 32 34 20 7d 20 7b  ary FROM t24 } {
3980: 30 20 30 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71  0 0 0}.do_execsq
3990: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e  l_test e_expr-9.
39a0: 32 35 20 7b 20 53 45 4c 45 43 54 20 61 20 43 4f  25 { SELECT a CO
39b0: 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 3d 20 27  LLATE binary = '
39c0: 42 42 42 27 20 46 52 4f 4d 20 74 32 34 20 7d 20  BBB' FROM t24 } 
39d0: 7b 30 20 30 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  {0 0 0}..#------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65  ---.# Test state
3a30: 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f  ments related to
3a40: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 2e   literal values.
3a50: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
3a60: 3a 20 52 2d 33 31 35 33 36 2d 33 32 30 30 38 20  : R-31536-32008 
3a70: 4c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20 6d  Literal values m
3a80: 61 79 20 62 65 20 69 6e 74 65 67 65 72 73 2c 20  ay be integers, 
3a90: 66 6c 6f 61 74 69 6e 67 0a 23 20 70 6f 69 6e 74  floating.# point
3aa0: 20 6e 75 6d 62 65 72 73 2c 20 73 74 72 69 6e 67   numbers, string
3ab0: 73 2c 20 42 4c 4f 42 73 2c 20 6f 72 20 4e 55 4c  s, BLOBs, or NUL
3ac0: 4c 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  Ls..#.do_execsql
3ad0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e  _test e_expr-10.
3ae0: 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 74 79 70  1.1 { SELECT typ
3af0: 65 6f 66 28 35 29 20 20 20 20 20 20 20 7d 20 7b  eof(5)       } {
3b00: 69 6e 74 65 67 65 72 7d 0a 64 6f 5f 65 78 65 63  integer}.do_exec
3b10: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3b20: 31 30 2e 31 2e 32 20 7b 20 53 45 4c 45 43 54 20  10.1.2 { SELECT 
3b30: 74 79 70 65 6f 66 28 35 2e 31 29 20 20 20 20 20  typeof(5.1)     
3b40: 7d 20 7b 72 65 61 6c 7d 0a 64 6f 5f 65 78 65 63  } {real}.do_exec
3b50: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3b60: 31 30 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54 20  10.1.3 { SELECT 
3b70: 74 79 70 65 6f 66 28 27 35 2e 31 27 29 20 20 20  typeof('5.1')   
3b80: 7d 20 7b 74 65 78 74 7d 0a 64 6f 5f 65 78 65 63  } {text}.do_exec
3b90: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3ba0: 31 30 2e 31 2e 34 20 7b 20 53 45 4c 45 43 54 20  10.1.4 { SELECT 
3bb0: 74 79 70 65 6f 66 28 58 27 41 42 43 44 27 29 20  typeof(X'ABCD') 
3bc0: 7d 20 7b 62 6c 6f 62 7d 0a 64 6f 5f 65 78 65 63  } {blob}.do_exec
3bd0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3be0: 31 30 2e 31 2e 35 20 7b 20 53 45 4c 45 43 54 20  10.1.5 { SELECT 
3bf0: 74 79 70 65 6f 66 28 4e 55 4c 4c 29 20 20 20 20  typeof(NULL)    
3c00: 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 20 22 53 63 69  } {null}..# "Sci
3c10: 65 6e 74 69 66 69 63 20 6e 6f 74 61 74 69 6f 6e  entific notation
3c20: 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f   is supported fo
3c30: 72 20 70 6f 69 6e 74 20 6c 69 74 65 72 61 6c 20  r point literal 
3c40: 76 61 6c 75 65 73 2e 22 0a 23 0a 64 6f 5f 65 78  values.".#.do_ex
3c50: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3c60: 72 2d 31 30 2e 32 2e 31 20 7b 20 53 45 4c 45 43  r-10.2.1 { SELEC
3c70: 54 20 74 79 70 65 6f 66 28 33 2e 34 65 2d 30 32  T typeof(3.4e-02
3c80: 29 20 20 20 20 7d 20 7b 72 65 61 6c 7d 0a 64 6f  )    } {real}.do
3c90: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3ca0: 65 78 70 72 2d 31 30 2e 32 2e 32 20 7b 20 53 45  expr-10.2.2 { SE
3cb0: 4c 45 43 54 20 74 79 70 65 6f 66 28 33 65 2b 35  LECT typeof(3e+5
3cc0: 29 20 20 20 20 20 20 20 7d 20 7b 72 65 61 6c 7d  )       } {real}
3cd0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3ce0: 20 65 5f 65 78 70 72 2d 31 30 2e 32 2e 33 20 7b   e_expr-10.2.3 {
3cf0: 20 53 45 4c 45 43 54 20 33 2e 34 65 2d 30 32 20   SELECT 3.4e-02 
3d00: 20 20 20 20 20 20 20 20 20 20 20 7d 20 7b 30 2e             } {0.
3d10: 30 33 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  034}.do_execsql_
3d20: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 32  test e_expr-10.2
3d30: 2e 34 20 7b 20 53 45 4c 45 43 54 20 33 65 2b 34  .4 { SELECT 3e+4
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
3d50: 20 7b 33 30 30 30 30 2e 30 7d 0a 0a 23 20 45 56   {30000.0}..# EV
3d60: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 35 32  IDENCE-OF: R-352
3d70: 32 39 2d 31 37 38 33 30 20 41 20 73 74 72 69 6e  29-17830 A strin
3d80: 67 20 63 6f 6e 73 74 61 6e 74 20 69 73 20 66 6f  g constant is fo
3d90: 72 6d 65 64 20 62 79 20 65 6e 63 6c 6f 73 69 6e  rmed by enclosin
3da0: 67 0a 23 20 74 68 65 20 73 74 72 69 6e 67 20 69  g.# the string i
3db0: 6e 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 20  n single quotes 
3dc0: 28 27 29 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  (')..#.# EVIDENC
3dd0: 45 2d 4f 46 3a 20 52 2d 30 37 31 30 30 2d 30 36  E-OF: R-07100-06
3de0: 36 30 36 20 41 20 73 69 6e 67 6c 65 20 71 75 6f  606 A single quo
3df0: 74 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  te within the st
3e00: 72 69 6e 67 20 63 61 6e 20 62 65 0a 23 20 65 6e  ring can be.# en
3e10: 63 6f 64 65 64 20 62 79 20 70 75 74 74 69 6e 67  coded by putting
3e20: 20 74 77 6f 20 73 69 6e 67 6c 65 20 71 75 6f 74   two single quot
3e30: 65 73 20 69 6e 20 61 20 72 6f 77 20 2d 20 61 73  es in a row - as
3e40: 20 69 6e 20 50 61 73 63 61 6c 2e 0a 23 0a 64 6f   in Pascal..#.do
3e50: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3e60: 65 78 70 72 2d 31 30 2e 33 2e 31 20 7b 20 53 45  expr-10.3.1 { SE
3e70: 4c 45 43 54 20 27 69 73 20 6e 6f 74 27 20 7d 20  LECT 'is not' } 
3e80: 20 20 20 20 20 20 20 20 7b 7b 69 73 20 6e 6f 74          {{is not
3e90: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
3ea0: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 33 2e 32  st e_expr-10.3.2
3eb0: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3ec0: 28 27 69 73 20 6e 6f 74 27 29 20 7d 20 7b 74 65  ('is not') } {te
3ed0: 78 74 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  xt}.do_execsql_t
3ee0: 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 33 2e  est e_expr-10.3.
3ef0: 33 20 7b 20 53 45 4c 45 43 54 20 27 69 73 6e 27  3 { SELECT 'isn'
3f00: 27 74 27 20 7d 20 20 20 20 20 20 20 20 20 7b 69  't' }         {i
3f10: 73 6e 27 74 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  sn't}.do_execsql
3f20: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e  _test e_expr-10.
3f30: 33 2e 34 20 7b 20 53 45 4c 45 43 54 20 74 79 70  3.4 { SELECT typ
3f40: 65 6f 66 28 27 69 73 6e 27 27 74 27 29 20 7d 20  eof('isn''t') } 
3f50: 7b 74 65 78 74 7d 0a 0a 23 20 45 56 49 44 45 4e  {text}..# EVIDEN
3f60: 43 45 2d 4f 46 3a 20 52 2d 30 39 35 39 33 2d 30  CE-OF: R-09593-0
3f70: 33 33 32 31 20 42 4c 4f 42 20 6c 69 74 65 72 61  3321 BLOB litera
3f80: 6c 73 20 61 72 65 20 73 74 72 69 6e 67 20 6c 69  ls are string li
3f90: 74 65 72 61 6c 73 0a 23 20 63 6f 6e 74 61 69 6e  terals.# contain
3fa0: 69 6e 67 20 68 65 78 61 64 65 63 69 6d 61 6c 20  ing hexadecimal 
3fb0: 64 61 74 61 20 61 6e 64 20 70 72 65 63 65 64 65  data and precede
3fc0: 64 20 62 79 20 61 20 73 69 6e 67 6c 65 20 22 78  d by a single "x
3fd0: 22 20 6f 72 20 22 58 22 0a 23 20 63 68 61 72 61  " or "X".# chara
3fe0: 63 74 65 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e  cter..#.# EVIDEN
3ff0: 43 45 2d 4f 46 3a 20 52 2d 31 39 38 33 36 2d 31  CE-OF: R-19836-1
4000: 31 32 34 34 20 45 78 61 6d 70 6c 65 3a 20 58 27  1244 Example: X'
4010: 35 33 35 31 34 43 36 39 37 34 36 35 27 0a 23 0a  53514C697465'.#.
4020: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
4030: 65 5f 65 78 70 72 2d 31 30 2e 34 2e 31 20 7b 20  e_expr-10.4.1 { 
4040: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 58 27  SELECT typeof(X'
4050: 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46  0123456789ABCDEF
4060: 27 29 20 7d 20 62 6c 6f 62 0a 64 6f 5f 65 78 65  ') } blob.do_exe
4070: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
4080: 2d 31 30 2e 34 2e 32 20 7b 20 53 45 4c 45 43 54  -10.4.2 { SELECT
4090: 20 74 79 70 65 6f 66 28 78 27 30 31 32 33 34 35   typeof(x'012345
40a0: 36 37 38 39 41 42 43 44 45 46 27 29 20 7d 20 62  6789ABCDEF') } b
40b0: 6c 6f 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  lob.do_execsql_t
40c0: 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e  est e_expr-10.4.
40d0: 33 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f  3 { SELECT typeo
40e0: 66 28 58 27 30 31 32 33 34 35 36 37 38 39 61 62  f(X'0123456789ab
40f0: 63 64 65 66 27 29 20 7d 20 62 6c 6f 62 0a 64 6f  cdef') } blob.do
4100: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
4110: 65 78 70 72 2d 31 30 2e 34 2e 34 20 7b 20 53 45  expr-10.4.4 { SE
4120: 4c 45 43 54 20 74 79 70 65 6f 66 28 78 27 30 31  LECT typeof(x'01
4130: 32 33 34 35 36 37 38 39 61 62 63 64 65 66 27 29  23456789abcdef')
4140: 20 7d 20 62 6c 6f 62 0a 64 6f 5f 65 78 65 63 73   } blob.do_execs
4150: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
4160: 30 2e 34 2e 35 20 7b 20 53 45 4c 45 43 54 20 74  0.4.5 { SELECT t
4170: 79 70 65 6f 66 28 58 27 35 33 35 31 34 43 36 39  ypeof(X'53514C69
4180: 37 34 36 35 27 29 20 20 20 20 20 7d 20 62 6c 6f  7465')     } blo
4190: 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  b..# EVIDENCE-OF
41a0: 3a 20 52 2d 32 33 39 31 34 2d 35 31 34 37 36 20  : R-23914-51476 
41b0: 41 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 20  A literal value 
41c0: 63 61 6e 20 61 6c 73 6f 20 62 65 20 74 68 65 20  can also be the 
41d0: 74 6f 6b 65 6e 0a 23 20 22 4e 55 4c 4c 22 2e 0a  token.# "NULL"..
41e0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
41f0: 74 20 65 5f 65 78 70 72 2d 31 30 2e 35 2e 31 20  t e_expr-10.5.1 
4200: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 20 20  { SELECT NULL   
4210: 20 20 20 20 20 20 7d 20 7b 7b 7d 7d 0a 64 6f 5f        } {{}}.do_
4220: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
4230: 78 70 72 2d 31 30 2e 35 2e 32 20 7b 20 53 45 4c  xpr-10.5.2 { SEL
4240: 45 43 54 20 74 79 70 65 6f 66 28 4e 55 4c 4c 29  ECT typeof(NULL)
4250: 20 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 2d 2d 2d 2d   } {null}..#----
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42a0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61  -----.# Test sta
42b0: 74 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20  tements related 
42c0: 74 6f 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74  to bound paramet
42d0: 65 72 73 0a 23 0a 0a 70 72 6f 63 20 70 61 72 61  ers.#..proc para
42e0: 6d 65 74 65 72 5f 74 65 73 74 20 7b 74 6e 20 73  meter_test {tn s
42f0: 71 6c 20 70 61 72 61 6d 73 20 72 65 73 75 6c 74  ql params result
4300: 7d 20 7b 0a 20 20 73 65 74 20 73 74 6d 74 20 5b  } {.  set stmt [
4310: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
4320: 76 32 20 64 62 20 24 73 71 6c 20 2d 31 5d 0a 0a  v2 db $sql -1]..
4330: 20 20 66 6f 72 65 61 63 68 20 7b 6e 75 6d 62 65    foreach {numbe
4340: 72 20 6e 61 6d 65 7d 20 24 70 61 72 61 6d 73 20  r name} $params 
4350: 7b 0a 20 20 20 20 73 65 74 20 6e 6d 20 5b 73 71  {.    set nm [sq
4360: 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
4370: 65 74 65 72 5f 6e 61 6d 65 20 24 73 74 6d 74 20  eter_name $stmt 
4380: 24 6e 75 6d 62 65 72 5d 0a 20 20 20 20 64 6f 5f  $number].    do_
4390: 74 65 73 74 20 24 74 6e 2e 6e 61 6d 65 2e 24 6e  test $tn.name.$n
43a0: 75 6d 62 65 72 20 5b 6c 69 73 74 20 73 65 74 20  umber [list set 
43b0: 7b 7d 20 24 6e 6d 5d 20 24 6e 61 6d 65 0a 20 20  {} $nm] $name.  
43c0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
43d0: 6e 74 20 24 73 74 6d 74 20 24 6e 75 6d 62 65 72  nt $stmt $number
43e0: 20 5b 65 78 70 72 20 2d 31 20 2a 20 24 6e 75 6d   [expr -1 * $num
43f0: 62 65 72 5d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ber].  }..  sqli
4400: 74 65 33 5f 73 74 65 70 20 24 73 74 6d 74 0a 0a  te3_step $stmt..
4410: 20 20 73 65 74 20 72 65 73 20 5b 6c 69 73 74 5d    set res [list]
4420: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
4430: 20 7b 24 69 20 3c 20 5b 73 71 6c 69 74 65 33 5f   {$i < [sqlite3_
4440: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 24 73 74  column_count $st
4450: 6d 74 5d 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  mt]} {incr i} {.
4460: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20      lappend res 
4470: 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  [sqlite3_column_
4480: 74 65 78 74 20 24 73 74 6d 74 20 24 69 5d 0a 20  text $stmt $i]. 
4490: 20 7d 0a 0a 20 20 73 65 74 20 72 63 20 5b 73 71   }..  set rc [sq
44a0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
44b0: 73 74 6d 74 5d 0a 20 20 64 6f 5f 74 65 73 74 20  stmt].  do_test 
44c0: 24 74 6e 2e 72 63 20 5b 6c 69 73 74 20 73 65 74  $tn.rc [list set
44d0: 20 7b 7d 20 24 72 63 5d 20 53 51 4c 49 54 45 5f   {} $rc] SQLITE_
44e0: 4f 4b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 6e  OK.  do_test $tn
44f0: 2e 72 65 73 20 5b 6c 69 73 74 20 73 65 74 20 7b  .res [list set {
4500: 7d 20 24 72 65 73 5d 20 24 72 65 73 75 6c 74 0a  } $res] $result.
4510: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
4520: 3a 20 52 2d 33 33 35 30 39 2d 33 39 34 35 38 20  : R-33509-39458 
4530: 41 20 71 75 65 73 74 69 6f 6e 20 6d 61 72 6b 20  A question mark 
4540: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 6e 75  followed by a nu
4550: 6d 62 65 72 20 4e 4e 4e 0a 23 20 68 6f 6c 64 73  mber NNN.# holds
4560: 20 61 20 73 70 6f 74 20 66 6f 72 20 74 68 65 20   a spot for the 
4570: 4e 4e 4e 2d 74 68 20 70 61 72 61 6d 65 74 65 72  NNN-th parameter
4580: 2e 20 4e 4e 4e 20 6d 75 73 74 20 62 65 20 62 65  . NNN must be be
4590: 74 77 65 65 6e 20 31 20 61 6e 64 0a 23 20 53 51  tween 1 and.# SQ
45a0: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
45b0: 45 5f 4e 55 4d 42 45 52 2e 0a 23 0a 73 65 74 20  E_NUMBER..#.set 
45c0: 6d 76 6e 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f  mvn $SQLITE_MAX_
45d0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 0a  VARIABLE_NUMBER.
45e0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
45f0: 5f 65 78 70 72 2d 31 31 2e 31 20 22 0a 20 20 53  _expr-11.1 ".  S
4600: 45 4c 45 43 54 20 3f 31 2c 20 3f 31 32 33 2c 20  ELECT ?1, ?123, 
4610: 3f 24 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  ?$SQLITE_MAX_VAR
4620: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 3f 31  IABLE_NUMBER, ?1
4630: 32 33 2c 20 3f 34 0a 22 20 20 20 22 31 20 3f 31  23, ?4."   "1 ?1
4640: 20 20 31 32 33 20 3f 31 32 33 20 24 6d 76 6e 20    123 ?123 $mvn 
4650: 3f 24 6d 76 6e 20 34 20 3f 34 22 20 20 20 22 2d  ?$mvn 4 ?4"   "-
4660: 31 20 2d 31 32 33 20 2d 24 6d 76 6e 20 2d 31 32  1 -123 -$mvn -12
4670: 33 20 2d 34 22 0a 0a 73 65 74 20 65 72 72 6d 73  3 -4"..set errms
4680: 67 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  g "variable numb
4690: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
46a0: 65 6e 20 3f 31 20 61 6e 64 20 3f 24 53 51 4c 49  en ?1 and ?$SQLI
46b0: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
46c0: 4e 55 4d 42 45 52 22 0a 66 6f 72 65 61 63 68 20  NUMBER".foreach 
46d0: 7b 74 6e 20 70 61 72 61 6d 5f 6e 75 6d 62 65 72  {tn param_number
46e0: 7d 20 5b 6c 69 73 74 20 5c 0a 20 20 32 20 20 30  } [list \.  2  0
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 20 20 5c 0a 20 20 33 20 20 5b 65 78 70 72      \.  3  [expr
4720: 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52   $SQLITE_MAX_VAR
4730: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2b 31 5d 20  IABLE_NUMBER+1] 
4740: 5c 0a 20 20 34 20 20 5b 65 78 70 72 20 24 53 51  \.  4  [expr $SQ
4750: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
4760: 45 5f 4e 55 4d 42 45 52 2b 32 5d 20 5c 0a 20 20  E_NUMBER+2] \.  
4770: 35 20 20 31 32 33 34 35 36 37 38 39 30 33 34 35  5  1234567890345
4780: 36 37 38 39 30 33 34 35 36 37 38 39 30 32 33 34  6789034567890234
4790: 35 36 37 38 39 30 20 20 5c 0a 20 20 36 20 20 32  567890  \.  6  2
47a0: 31 34 37 34 38 33 36 34 38 20 20 20 20 20 20 20  147483648       
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47c0: 20 20 20 20 5c 0a 20 20 37 20 20 32 31 34 37 34      \.  7  21474
47d0: 38 33 36 34 39 20 20 20 20 20 20 20 20 20 20 20  83649           
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 5c 0a 20 20 38 20 20 34 32 39 34 39 36 37 32 39  \.  8  429496729
4800: 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
4810: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
4820: 39 20 20 34 32 39 34 39 36 37 32 39 37 20 20 20  9  4294967297   
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 20 20 20 20 20 20 20 5c 0a 20 20 31 30 20 39          \.  10 9
4850: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
4860: 30 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20  08              
4870: 20 20 20 20 5c 0a 20 20 31 31 20 39 32 32 33 33      \.  11 92233
4880: 37 32 30 33 36 38 35 34 37 37 35 38 30 39 20 20  72036854775809  
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48a0: 5c 0a 20 20 31 32 20 31 38 34 34 36 37 34 34 30  \.  12 184467440
48b0: 37 33 37 30 39 35 35 31 36 31 36 20 20 20 20 20  73709551616     
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
48d0: 31 33 20 31 38 34 34 36 37 34 34 30 37 33 37 30  13 1844674407370
48e0: 39 35 35 31 36 31 37 20 20 20 20 20 20 20 20 20  9551617         
48f0: 20 20 20 20 20 20 20 20 5c 0a 5d 20 7b 0a 20 20          \.] {.  
4900: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
4910: 20 65 5f 65 78 70 72 2d 31 31 2e 31 2e 24 74 6e   e_expr-11.1.$tn
4920: 20 22 53 45 4c 45 43 54 20 3f 24 70 61 72 61 6d   "SELECT ?$param
4930: 5f 6e 75 6d 62 65 72 22 20 5b 6c 69 73 74 20 31  _number" [list 1
4940: 20 24 65 72 72 6d 73 67 5d 0a 7d 0a 0a 23 20 45   $errmsg].}..# E
4950: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33  VIDENCE-OF: R-33
4960: 36 37 30 2d 33 36 30 39 37 20 41 20 71 75 65 73  670-36097 A ques
4970: 74 69 6f 6e 20 6d 61 72 6b 20 74 68 61 74 20 69  tion mark that i
4980: 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 65 64 20 62  s not followed b
4990: 79 20 61 0a 23 20 6e 75 6d 62 65 72 20 63 72 65  y a.# number cre
49a0: 61 74 65 73 20 61 20 70 61 72 61 6d 65 74 65 72  ates a parameter
49b0: 20 77 69 74 68 20 61 20 6e 75 6d 62 65 72 20 6f   with a number o
49c0: 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ne greater than 
49d0: 74 68 65 20 6c 61 72 67 65 73 74 0a 23 20 70 61  the largest.# pa
49e0: 72 61 6d 65 74 65 72 20 6e 75 6d 62 65 72 20 61  rameter number a
49f0: 6c 72 65 61 64 79 20 61 73 73 69 67 6e 65 64 2e  lready assigned.
4a00: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
4a10: 3a 20 52 2d 34 32 39 33 38 2d 30 37 30 33 30 20  : R-42938-07030 
4a20: 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  If this means th
4a30: 65 20 70 61 72 61 6d 65 74 65 72 20 6e 75 6d 62  e parameter numb
4a40: 65 72 20 69 73 0a 23 20 67 72 65 61 74 65 72 20  er is.# greater 
4a50: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f  than SQLITE_MAX_
4a60: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c  VARIABLE_NUMBER,
4a70: 20 69 74 20 69 73 20 61 6e 20 65 72 72 6f 72 2e   it is an error.
4a80: 0a 23 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  .#.parameter_tes
4a90: 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 31 20  t e_expr-11.2.1 
4aa0: 22 53 45 4c 45 43 54 20 3f 22 20 20 20 20 20 20  "SELECT ?"      
4ab0: 20 20 20 20 7b 31 20 7b 7d 7d 20 20 20 20 20 20      {1 {}}      
4ac0: 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65   -1.parameter_te
4ad0: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 32  st e_expr-11.2.2
4ae0: 20 22 53 45 4c 45 43 54 20 3f 2c 20 3f 22 20 20   "SELECT ?, ?"  
4af0: 20 20 20 20 20 7b 31 20 7b 7d 20 32 20 7b 7d 7d       {1 {} 2 {}}
4b00: 20 20 7b 2d 31 20 2d 32 7d 0a 70 61 72 61 6d 65    {-1 -2}.parame
4b10: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
4b20: 31 31 2e 32 2e 33 20 22 53 45 4c 45 43 54 20 3f  11.2.3 "SELECT ?
4b30: 35 2c 20 3f 22 20 20 20 20 20 20 7b 35 20 3f 35  5, ?"      {5 ?5
4b40: 20 36 20 7b 7d 7d 20 20 7b 2d 35 20 2d 36 7d 0a   6 {}}  {-5 -6}.
4b50: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
4b60: 5f 65 78 70 72 2d 31 31 2e 32 2e 34 20 22 53 45  _expr-11.2.4 "SE
4b70: 4c 45 43 54 20 3f 2c 20 3f 35 22 20 20 20 20 20  LECT ?, ?5"     
4b80: 20 7b 31 20 7b 7d 20 35 20 3f 35 7d 20 20 7b 2d   {1 {} 5 ?5}  {-
4b90: 31 20 2d 35 7d 0a 70 61 72 61 6d 65 74 65 72 5f  1 -5}.parameter_
4ba0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32  test e_expr-11.2
4bb0: 2e 35 20 22 53 45 4c 45 43 54 20 3f 2c 20 3f 34  .5 "SELECT ?, ?4
4bc0: 35 36 2c 20 3f 22 20 7b 0a 20 20 31 20 7b 7d 20  56, ?" {.  1 {} 
4bd0: 34 35 36 20 3f 34 35 36 20 34 35 37 20 7b 7d 0a  456 ?456 457 {}.
4be0: 7d 20 20 7b 2d 31 20 2d 34 35 36 20 2d 34 35 37  }  {-1 -456 -457
4bf0: 7d 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  }.parameter_test
4c00: 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 35 20 22   e_expr-11.2.5 "
4c10: 53 45 4c 45 43 54 20 3f 2c 20 3f 34 35 36 2c 20  SELECT ?, ?456, 
4c20: 3f 34 2c 20 3f 22 20 7b 0a 20 20 31 20 7b 7d 20  ?4, ?" {.  1 {} 
4c30: 34 35 36 20 3f 34 35 36 20 34 20 3f 34 20 34 35  456 ?456 4 ?4 45
4c40: 37 20 7b 7d 0a 7d 20 20 7b 2d 31 20 2d 34 35 36  7 {}.}  {-1 -456
4c50: 20 2d 34 20 2d 34 35 37 7d 0a 66 6f 72 65 61 63   -4 -457}.foreac
4c60: 68 20 7b 74 6e 20 73 71 6c 7d 20 5b 6c 69 73 74  h {tn sql} [list
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c80: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 31             \.  1
4c90: 20 20 22 53 45 4c 45 43 54 20 3f 24 6d 76 6e 2c    "SELECT ?$mvn,
4ca0: 20 3f 22 20 20 20 20 20 20 20 20 20 20 20 20 20   ?"             
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
4cc0: 20 20 32 20 20 22 53 45 4c 45 43 54 20 3f 5b 65    2  "SELECT ?[e
4cd0: 78 70 72 20 24 6d 76 6e 2d 35 5d 2c 20 3f 2c 20  xpr $mvn-5], ?, 
4ce0: 3f 2c 20 3f 2c 20 3f 2c 20 3f 2c 20 3f 22 20 20  ?, ?, ?, ?, ?"  
4cf0: 20 5c 0a 20 20 33 20 20 22 53 45 4c 45 43 54 20   \.  3  "SELECT 
4d00: 3f 5b 65 78 70 72 20 24 6d 76 6e 5d 2c 20 3f 35  ?[expr $mvn], ?5
4d10: 2c 20 3f 36 2c 20 3f 22 20 20 20 20 20 20 20 20  , ?6, ?"        
4d20: 20 20 20 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 63      \.] {.  do_c
4d30: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65  atchsql_test e_e
4d40: 78 70 72 2d 31 31 2e 33 2e 24 74 6e 20 24 73 71  xpr-11.3.$tn $sq
4d50: 6c 20 5b 6c 69 73 74 20 31 20 7b 74 6f 6f 20 6d  l [list 1 {too m
4d60: 61 6e 79 20 53 51 4c 20 76 61 72 69 61 62 6c 65  any SQL variable
4d70: 73 7d 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43  s}].}..# EVIDENC
4d80: 45 2d 4f 46 3a 20 52 2d 31 31 36 32 30 2d 32 32  E-OF: R-11620-22
4d90: 37 34 33 20 41 20 63 6f 6c 6f 6e 20 66 6f 6c 6c  743 A colon foll
4da0: 6f 77 65 64 20 62 79 20 61 6e 20 69 64 65 6e 74  owed by an ident
4db0: 69 66 69 65 72 20 6e 61 6d 65 0a 23 20 68 6f 6c  ifier name.# hol
4dc0: 64 73 20 61 20 73 70 6f 74 20 66 6f 72 20 61 20  ds a spot for a 
4dd0: 6e 61 6d 65 64 20 70 61 72 61 6d 65 74 65 72 20  named parameter 
4de0: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 3a 41  with the name :A
4df0: 41 41 41 2e 0a 23 0a 23 20 49 64 65 6e 74 69 66  AAA..#.# Identif
4e00: 69 65 72 73 20 69 6e 20 53 51 4c 69 74 65 20 63  iers in SQLite c
4e10: 6f 6e 73 69 73 74 20 6f 66 20 61 6c 70 68 61 6e  onsist of alphan
4e20: 75 6d 65 72 69 63 2c 20 27 5f 27 20 61 6e 64 20  umeric, '_' and 
4e30: 27 24 27 20 63 68 61 72 61 63 74 65 72 73 2c 0a  '$' characters,.
4e40: 23 20 61 6e 64 20 61 6e 79 20 55 54 46 20 63 68  # and any UTF ch
4e50: 61 72 61 63 74 65 72 73 20 77 69 74 68 20 63 6f  aracters with co
4e60: 64 65 70 6f 69 6e 74 73 20 6c 61 72 67 65 72 20  depoints larger 
4e70: 74 68 61 6e 20 31 32 37 20 28 6e 6f 6e 2d 41 53  than 127 (non-AS
4e80: 43 49 49 20 0a 23 20 63 68 61 72 61 63 74 65 72  CII .# character
4e90: 73 29 2e 0a 23 0a 70 61 72 61 6d 65 74 65 72 5f  s)..#.parameter_
4ea0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32  test e_expr-11.2
4eb0: 2e 31 20 7b 53 45 4c 45 43 54 20 3a 41 41 41 41  .1 {SELECT :AAAA
4ec0: 7d 20 20 20 20 20 20 20 20 20 7b 31 20 3a 41 41  }         {1 :AA
4ed0: 41 41 7d 20 20 20 20 20 20 20 2d 31 0a 70 61 72  AA}       -1.par
4ee0: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
4ef0: 70 72 2d 31 31 2e 32 2e 32 20 7b 53 45 4c 45 43  pr-11.2.2 {SELEC
4f00: 54 20 3a 31 32 33 7d 20 20 20 20 20 20 20 20 20  T :123}         
4f10: 20 7b 31 20 3a 31 32 33 7d 20 20 20 20 20 20 20   {1 :123}       
4f20: 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65   -1.parameter_te
4f30: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 33  st e_expr-11.2.3
4f40: 20 7b 53 45 4c 45 43 54 20 3a 5f 5f 7d 20 20 20   {SELECT :__}   
4f50: 20 20 20 20 20 20 20 20 7b 31 20 3a 5f 5f 7d 20          {1 :__} 
4f60: 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d          -1.param
4f70: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
4f80: 2d 31 31 2e 32 2e 34 20 7b 53 45 4c 45 43 54 20  -11.2.4 {SELECT 
4f90: 3a 5f 24 5f 7d 20 20 20 20 20 20 20 20 20 20 7b  :_$_}          {
4fa0: 31 20 3a 5f 24 5f 7d 20 20 20 20 20 20 20 20 2d  1 :_$_}        -
4fb0: 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74  1.parameter_test
4fc0: 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 35 20 22   e_expr-11.2.5 "
4fd0: 0a 20 20 53 45 4c 45 43 54 20 3a 5c 75 30 65 34  .  SELECT :\u0e4
4fe0: 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75 30  0\u0e2d\u0e28\u0
4ff0: 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30 5c  e02\u0e39\u0e40\
5000: 75 30 65 32 64 5c 75 30 65 32 35 0a 22 20 22 31  u0e2d\u0e25." "1
5010: 20 3a 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75   :\u0e40\u0e2d\u
5020: 30 65 32 38 5c 75 30 65 30 32 5c 75 30 65 33 39  0e28\u0e02\u0e39
5030: 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65  \u0e40\u0e2d\u0e
5040: 32 35 22 20 2d 31 0a 70 61 72 61 6d 65 74 65 72  25" -1.parameter
5050: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5060: 32 2e 36 20 22 53 45 4c 45 43 54 20 3a 5c 75 30  2.6 "SELECT :\u0
5070: 30 38 30 22 20 22 31 20 3a 5c 75 30 30 38 30 22  080" "1 :\u0080"
5080: 20 2d 31 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   -1..# EVIDENCE-
5090: 4f 46 3a 20 52 2d 34 39 37 38 33 2d 36 31 32 37  OF: R-49783-6127
50a0: 39 20 41 6e 20 22 61 74 22 20 73 69 67 6e 20 77  9 An "at" sign w
50b0: 6f 72 6b 73 20 65 78 61 63 74 6c 79 20 6c 69 6b  orks exactly lik
50c0: 65 20 61 20 63 6f 6c 6f 6e 2c 0a 23 20 65 78 63  e a colon,.# exc
50d0: 65 70 74 20 74 68 61 74 20 74 68 65 20 6e 61 6d  ept that the nam
50e0: 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  e of the paramet
50f0: 65 72 20 63 72 65 61 74 65 64 20 69 73 20 40 41  er created is @A
5100: 41 41 41 2e 0a 23 0a 70 61 72 61 6d 65 74 65 72  AAA..#.parameter
5110: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5120: 33 2e 31 20 7b 53 45 4c 45 43 54 20 40 41 41 41  3.1 {SELECT @AAA
5130: 41 7d 20 20 20 20 20 20 20 20 20 7b 31 20 40 41  A}         {1 @A
5140: 41 41 41 7d 20 20 20 20 20 20 20 2d 31 0a 70 61  AAA}       -1.pa
5150: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
5160: 78 70 72 2d 31 31 2e 33 2e 32 20 7b 53 45 4c 45  xpr-11.3.2 {SELE
5170: 43 54 20 40 31 32 33 7d 20 20 20 20 20 20 20 20  CT @123}        
5180: 20 20 7b 31 20 40 31 32 33 7d 20 20 20 20 20 20    {1 @123}      
5190: 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74    -1.parameter_t
51a0: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e  est e_expr-11.3.
51b0: 33 20 7b 53 45 4c 45 43 54 20 40 5f 5f 7d 20 20  3 {SELECT @__}  
51c0: 20 20 20 20 20 20 20 20 20 7b 31 20 40 5f 5f 7d           {1 @__}
51d0: 20 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61           -1.para
51e0: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
51f0: 72 2d 31 31 2e 33 2e 34 20 7b 53 45 4c 45 43 54  r-11.3.4 {SELECT
5200: 20 40 5f 24 5f 7d 20 20 20 20 20 20 20 20 20 20   @_$_}          
5210: 7b 31 20 40 5f 24 5f 7d 20 20 20 20 20 20 20 20  {1 @_$_}        
5220: 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  -1.parameter_tes
5230: 74 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e 35 20  t e_expr-11.3.5 
5240: 22 0a 20 20 53 45 4c 45 43 54 20 40 5c 75 30 65  ".  SELECT @\u0e
5250: 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75  40\u0e2d\u0e28\u
5260: 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30  0e02\u0e39\u0e40
5270: 5c 75 30 65 32 64 5c 75 30 65 32 35 0a 22 20 22  \u0e2d\u0e25." "
5280: 31 20 40 5c 75 30 65 34 30 5c 75 30 65 32 64 5c  1 @\u0e40\u0e2d\
5290: 75 30 65 32 38 5c 75 30 65 30 32 5c 75 30 65 33  u0e28\u0e02\u0e3
52a0: 39 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30  9\u0e40\u0e2d\u0
52b0: 65 32 35 22 20 2d 31 0a 70 61 72 61 6d 65 74 65  e25" -1.paramete
52c0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
52d0: 2e 33 2e 36 20 22 53 45 4c 45 43 54 20 40 5c 75  .3.6 "SELECT @\u
52e0: 30 30 38 30 22 20 22 31 20 40 5c 75 30 30 38 30  0080" "1 @\u0080
52f0: 22 20 2d 31 0a 0a 23 20 45 56 49 44 45 4e 43 45  " -1..# EVIDENCE
5300: 2d 4f 46 3a 20 52 2d 36 32 36 31 30 2d 35 31 33  -OF: R-62610-513
5310: 32 39 20 41 20 64 6f 6c 6c 61 72 2d 73 69 67 6e  29 A dollar-sign
5320: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 20   followed by an 
5330: 69 64 65 6e 74 69 66 69 65 72 0a 23 20 6e 61 6d  identifier.# nam
5340: 65 20 61 6c 73 6f 20 68 6f 6c 64 73 20 61 20 73  e also holds a s
5350: 70 6f 74 20 66 6f 72 20 61 20 6e 61 6d 65 64 20  pot for a named 
5360: 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 74  parameter with t
5370: 68 65 20 6e 61 6d 65 20 24 41 41 41 41 2e 0a 23  he name $AAAA..#
5380: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
5390: 52 2d 35 35 30 32 35 2d 32 31 30 34 32 20 54 68  R-55025-21042 Th
53a0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
53b0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 63  e in this case c
53c0: 61 6e 0a 23 20 69 6e 63 6c 75 64 65 20 6f 6e 65  an.# include one
53d0: 20 6f 72 20 6d 6f 72 65 20 6f 63 63 75 72 72 65   or more occurre
53e0: 6e 63 65 73 20 6f 66 20 22 3a 3a 22 20 61 6e 64  nces of "::" and
53f0: 20 61 20 73 75 66 66 69 78 20 65 6e 63 6c 6f 73   a suffix enclos
5400: 65 64 20 69 6e 0a 23 20 22 28 2e 2e 2e 29 22 20  ed in.# "(...)" 
5410: 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 79 20 74  containing any t
5420: 65 78 74 20 61 74 20 61 6c 6c 2e 0a 23 0a 23 20  ext at all..#.# 
5430: 4e 6f 74 65 3a 20 4c 6f 6f 6b 73 20 6c 69 6b 65  Note: Looks like
5440: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 63   an identifier c
5450: 61 6e 6e 6f 74 20 63 6f 6e 73 69 73 74 20 65 6e  annot consist en
5460: 74 69 72 65 6c 79 20 6f 66 20 22 3a 3a 22 20 0a  tirely of "::" .
5470: 23 20 63 68 61 72 61 63 74 65 72 73 20 6f 72 20  # characters or 
5480: 6a 75 73 74 20 61 20 73 75 66 66 69 78 2e 20 41  just a suffix. A
5490: 6c 73 6f 2c 20 74 68 65 20 6f 74 68 65 72 20 6e  lso, the other n
54a0: 61 6d 65 64 20 76 61 72 69 61 62 6c 65 20 63 68  amed variable ch
54b0: 61 72 61 63 74 65 72 73 0a 23 20 28 3a 20 61 6e  aracters.# (: an
54c0: 64 20 40 29 20 77 6f 72 6b 20 74 68 65 20 73 61  d @) work the sa
54d0: 6d 65 20 77 61 79 20 69 6e 74 65 72 6e 61 6c 6c  me way internall
54e0: 79 2e 20 57 68 79 20 6e 6f 74 20 6a 75 73 74 20  y. Why not just 
54f0: 64 6f 63 75 6d 65 6e 74 20 69 74 20 74 68 61 74  document it that
5500: 20 77 61 79 3f 0a 23 0a 70 61 72 61 6d 65 74 65   way?.#.paramete
5510: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
5520: 2e 34 2e 31 20 7b 53 45 4c 45 43 54 20 24 41 41  .4.1 {SELECT $AA
5530: 41 41 7d 20 20 20 20 20 20 20 20 20 7b 31 20 24  AA}         {1 $
5540: 41 41 41 41 7d 20 20 20 20 20 20 20 2d 31 0a 70  AAAA}       -1.p
5550: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
5560: 65 78 70 72 2d 31 31 2e 34 2e 32 20 7b 53 45 4c  expr-11.4.2 {SEL
5570: 45 43 54 20 24 31 32 33 7d 20 20 20 20 20 20 20  ECT $123}       
5580: 20 20 20 7b 31 20 24 31 32 33 7d 20 20 20 20 20     {1 $123}     
5590: 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f     -1.parameter_
55a0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34  test e_expr-11.4
55b0: 2e 33 20 7b 53 45 4c 45 43 54 20 24 5f 5f 7d 20  .3 {SELECT $__} 
55c0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 24 5f 5f            {1 $__
55d0: 7d 20 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72  }         -1.par
55e0: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
55f0: 70 72 2d 31 31 2e 34 2e 34 20 7b 53 45 4c 45 43  pr-11.4.4 {SELEC
5600: 54 20 24 5f 24 5f 7d 20 20 20 20 20 20 20 20 20  T $_$_}         
5610: 20 7b 31 20 24 5f 24 5f 7d 20 20 20 20 20 20 20   {1 $_$_}       
5620: 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65   -1.parameter_te
5630: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e 35  st e_expr-11.4.5
5640: 20 22 0a 20 20 53 45 4c 45 43 54 20 5c 24 5c 75   ".  SELECT \$\u
5650: 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38  0e40\u0e2d\u0e28
5660: 5c 75 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65  \u0e02\u0e39\u0e
5670: 34 30 5c 75 30 65 32 64 5c 75 30 65 32 35 0a 22  40\u0e2d\u0e25."
5680: 20 22 31 20 5c 24 5c 75 30 65 34 30 5c 75 30 65   "1 \$\u0e40\u0e
5690: 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75  2d\u0e28\u0e02\u
56a0: 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64  0e39\u0e40\u0e2d
56b0: 5c 75 30 65 32 35 22 20 2d 31 0a 70 61 72 61 6d  \u0e25" -1.param
56c0: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
56d0: 2d 31 31 2e 34 2e 36 20 22 53 45 4c 45 43 54 20  -11.4.6 "SELECT 
56e0: 5c 24 5c 75 30 30 38 30 22 20 22 31 20 5c 24 5c  \$\u0080" "1 \$\
56f0: 75 30 30 38 30 22 20 2d 31 0a 0a 70 61 72 61 6d  u0080" -1..param
5700: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
5710: 2d 31 31 2e 35 2e 31 20 7b 53 45 4c 45 43 54 20  -11.5.1 {SELECT 
5720: 24 3a 3a 3a 3a 61 28 2b 2b 2d 2d 2b 2b 29 7d 20  $::::a(++--++)} 
5730: 7b 31 20 24 3a 3a 3a 3a 61 28 2b 2b 2d 2d 2b 2b  {1 $::::a(++--++
5740: 29 7d 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f  )} -1.parameter_
5750: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 35  test e_expr-11.5
5760: 2e 32 20 7b 53 45 4c 45 43 54 20 24 3a 3a 61 28  .2 {SELECT $::a(
5770: 29 7d 20 7b 31 20 24 3a 3a 61 28 29 7d 20 2d 31  )} {1 $::a()} -1
5780: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5790: 65 5f 65 78 70 72 2d 31 31 2e 35 2e 33 20 7b 53  e_expr-11.5.3 {S
57a0: 45 4c 45 43 54 20 24 3a 3a 31 28 3a 3a 23 24 29  ELECT $::1(::#$)
57b0: 7d 20 7b 31 20 24 3a 3a 31 28 3a 3a 23 24 29 7d  } {1 $::1(::#$)}
57c0: 20 2d 31 0a 20 0a 23 20 45 56 49 44 45 4e 43 45   -1. .# EVIDENCE
57d0: 2d 4f 46 3a 20 52 2d 31 31 33 37 30 2d 30 34 35  -OF: R-11370-045
57e0: 32 30 20 4e 61 6d 65 64 20 70 61 72 61 6d 65 74  20 Named paramet
57f0: 65 72 73 20 61 72 65 20 61 6c 73 6f 20 6e 75 6d  ers are also num
5800: 62 65 72 65 64 2e 20 54 68 65 0a 23 20 6e 75 6d  bered. The.# num
5810: 62 65 72 20 61 73 73 69 67 6e 65 64 20 69 73 20  ber assigned is 
5820: 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
5830: 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 61 72   the largest par
5840: 61 6d 65 74 65 72 20 6e 75 6d 62 65 72 0a 23 20  ameter number.# 
5850: 61 6c 72 65 61 64 79 20 61 73 73 69 67 6e 65 64  already assigned
5860: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
5870: 46 3a 20 52 2d 34 32 36 32 30 2d 32 32 31 38 34  F: R-42620-22184
5880: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
5890: 68 65 20 70 61 72 61 6d 65 74 65 72 20 77 6f 75  he parameter wou
58a0: 6c 64 20 62 65 0a 23 20 61 73 73 69 67 6e 65 64  ld be.# assigned
58b0: 20 61 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65   a number greate
58c0: 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41  r than SQLITE_MA
58d0: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
58e0: 52 2c 20 69 74 20 69 73 20 61 6e 0a 23 20 65 72  R, it is an.# er
58f0: 72 6f 72 2e 0a 23 0a 70 61 72 61 6d 65 74 65 72  ror..#.parameter
5900: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5910: 36 2e 31 20 22 53 45 4c 45 43 54 20 3f 2c 20 40  6.1 "SELECT ?, @
5920: 61 62 63 22 20 20 20 20 7b 31 20 7b 7d 20 32 20  abc"    {1 {} 2 
5930: 40 61 62 63 7d 20 7b 2d 31 20 2d 32 7d 0a 70 61  @abc} {-1 -2}.pa
5940: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
5950: 78 70 72 2d 31 31 2e 36 2e 32 20 22 53 45 4c 45  xpr-11.6.2 "SELE
5960: 43 54 20 3f 31 32 33 2c 20 3a 61 31 22 20 20 7b  CT ?123, :a1"  {
5970: 31 32 33 20 3f 31 32 33 20 31 32 34 20 3a 61 31  123 ?123 124 :a1
5980: 7d 20 7b 2d 31 32 33 20 2d 31 32 34 7d 0a 70 61  } {-123 -124}.pa
5990: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
59a0: 78 70 72 2d 31 31 2e 36 2e 33 20 7b 53 45 4c 45  xpr-11.6.3 {SELE
59b0: 43 54 20 24 61 2c 20 3f 38 2c 20 3f 2c 20 24 62  CT $a, ?8, ?, $b
59c0: 2c 20 3f 32 2c 20 24 63 7d 20 7b 0a 20 20 31 20  , ?2, $c} {.  1 
59d0: 24 61 20 38 20 3f 38 20 39 20 7b 7d 20 31 30 20  $a 8 ?8 9 {} 10 
59e0: 24 62 20 32 20 3f 32 20 31 31 20 24 63 0a 7d 20  $b 2 ?2 11 $c.} 
59f0: 7b 2d 31 20 2d 38 20 2d 39 20 2d 31 30 20 2d 32  {-1 -8 -9 -10 -2
5a00: 20 2d 31 31 7d 0a 66 6f 72 65 61 63 68 20 7b 74   -11}.foreach {t
5a10: 6e 20 73 71 6c 7d 20 5b 6c 69 73 74 20 20 20 20  n sql} [list    
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 20 20 20 20 20 5c 0a 20 20 31 20 20 22 53         \.  1  "S
5a40: 45 4c 45 43 54 20 3f 24 6d 76 6e 2c 20 5c 24 3a  ELECT ?$mvn, \$:
5a50: 3a 61 22 20 20 20 20 20 20 20 20 20 20 20 20 20  :a"             
5a60: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 32 20            \.  2 
5a70: 20 22 53 45 4c 45 43 54 20 3f 24 6d 76 6e 2c 20   "SELECT ?$mvn, 
5a80: 3f 34 2c 20 40 61 31 22 20 20 20 20 20 20 20 20  ?4, @a1"        
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
5aa0: 20 33 20 20 22 53 45 4c 45 43 54 20 3f 5b 65 78   3  "SELECT ?[ex
5ab0: 70 72 20 24 6d 76 6e 2d 32 5d 2c 20 3a 62 61 67  pr $mvn-2], :bag
5ac0: 2c 20 40 31 32 33 2c 20 5c 24 78 22 20 20 20 20  , @123, \$x"    
5ad0: 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68  \.] {.  do_catch
5ae0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
5af0: 31 31 2e 37 2e 24 74 6e 20 24 73 71 6c 20 5b 6c  11.7.$tn $sql [l
5b00: 69 73 74 20 31 20 7b 74 6f 6f 20 6d 61 6e 79 20  ist 1 {too many 
5b10: 53 51 4c 20 76 61 72 69 61 62 6c 65 73 7d 5d 0a  SQL variables}].
5b20: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
5b30: 3a 20 52 2d 31 34 30 36 38 2d 34 39 36 37 31 20  : R-14068-49671 
5b40: 50 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  Parameters that 
5b50: 61 72 65 20 6e 6f 74 20 61 73 73 69 67 6e 65 64  are not assigned
5b60: 20 76 61 6c 75 65 73 0a 23 20 75 73 69 6e 67 20   values.# using 
5b70: 73 71 6c 69 74 65 33 5f 62 69 6e 64 28 29 20 61  sqlite3_bind() a
5b80: 72 65 20 74 72 65 61 74 65 64 20 61 73 20 4e 55  re treated as NU
5b90: 4c 4c 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 65 5f  LL..#.do_test e_
5ba0: 65 78 70 72 2d 31 31 2e 37 2e 31 20 7b 0a 20 20  expr-11.7.1 {.  
5bb0: 73 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65  set stmt [sqlite
5bc0: 33 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20  3_prepare_v2 db 
5bd0: 7b 20 53 45 4c 45 43 54 20 3f 2c 20 3a 61 2c 20  { SELECT ?, :a, 
5be0: 40 62 2c 20 24 64 20 7d 20 2d 31 5d 0a 20 20 73  @b, $d } -1].  s
5bf0: 71 6c 69 74 65 33 5f 73 74 65 70 20 24 73 74 6d  qlite3_step $stm
5c00: 74 0a 0a 20 20 6c 69 73 74 20 5b 73 71 6c 69 74  t..  list [sqlit
5c10: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24  e3_column_type $
5c20: 73 74 6d 74 20 30 5d 20 5c 0a 20 20 20 20 20 20  stmt 0] \.      
5c30: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   [sqlite3_column
5c40: 5f 74 79 70 65 20 24 73 74 6d 74 20 31 5d 20 5c  _type $stmt 1] \
5c50: 0a 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  .       [sqlite3
5c60: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24 73 74  _column_type $st
5c70: 6d 74 20 32 5d 20 5c 0a 20 20 20 20 20 20 20 5b  mt 2] \.       [
5c80: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
5c90: 79 70 65 20 24 73 74 6d 74 20 33 5d 20 0a 7d 20  ype $stmt 3] .} 
5ca0: 7b 4e 55 4c 4c 20 4e 55 4c 4c 20 4e 55 4c 4c 20  {NULL NULL NULL 
5cb0: 4e 55 4c 4c 7d 0a 64 6f 5f 74 65 73 74 20 65 5f  NULL}.do_test e_
5cc0: 65 78 70 72 2d 31 31 2e 37 2e 31 20 7b 20 73 71  expr-11.7.1 { sq
5cd0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
5ce0: 73 74 6d 74 20 7d 20 53 51 4c 49 54 45 5f 4f 4b  stmt } SQLITE_OK
5cf0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 22  ------------.# "
5d40: 54 65 73 74 22 20 74 68 65 20 73 79 6e 74 61 78  Test" the syntax
5d50: 20 64 69 61 67 72 61 6d 73 20 69 6e 20 6c 61 6e   diagrams in lan
5d60: 67 5f 65 78 70 72 2e 68 74 6d 6c 2e 0a 23 0a 23  g_expr.html..#.#
5d70: 20 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72   -- syntax diagr
5d80: 61 6d 20 73 69 67 6e 65 64 2d 6e 75 6d 62 65 72  am signed-number
5d90: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
5da0: 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 31 2e 31  st e_expr-12.1.1
5db0: 20 7b 20 53 45 4c 45 43 54 20 30 2c 20 2b 30 2c   { SELECT 0, +0,
5dc0: 20 2d 30 20 7d 20 7b 30 20 30 20 30 7d 0a 64 6f   -0 } {0 0 0}.do
5dd0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
5de0: 65 78 70 72 2d 31 32 2e 31 2e 32 20 7b 20 53 45  expr-12.1.2 { SE
5df0: 4c 45 43 54 20 31 2c 20 2b 31 2c 20 2d 31 20 7d  LECT 1, +1, -1 }
5e00: 20 7b 31 20 31 20 2d 31 7d 0a 64 6f 5f 65 78 65   {1 1 -1}.do_exe
5e10: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
5e20: 2d 31 32 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54  -12.1.3 { SELECT
5e30: 20 32 2c 20 2b 32 2c 20 2d 32 20 7d 20 7b 32 20   2, +2, -2 } {2 
5e40: 32 20 2d 32 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  2 -2}.do_execsql
5e50: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
5e60: 31 2e 34 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  1.4 { .  SELECT 
5e70: 31 2e 34 2c 20 2b 31 2e 34 2c 20 2d 31 2e 34 20  1.4, +1.4, -1.4 
5e80: 0a 7d 20 7b 31 2e 34 20 31 2e 34 20 2d 31 2e 34  .} {1.4 1.4 -1.4
5e90: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
5ea0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 31 2e 35 20  t e_expr-12.1.5 
5eb0: 7b 20 0a 20 20 53 45 4c 45 43 54 20 31 2e 35 65  { .  SELECT 1.5e
5ec0: 2b 35 2c 20 2b 31 2e 35 65 2b 35 2c 20 2d 31 2e  +5, +1.5e+5, -1.
5ed0: 35 65 2b 35 20 0a 7d 20 7b 31 35 30 30 30 30 2e  5e+5 .} {150000.
5ee0: 30 20 31 35 30 30 30 30 2e 30 20 2d 31 35 30 30  0 150000.0 -1500
5ef0: 30 30 2e 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  00.0}.do_execsql
5f00: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
5f10: 31 2e 36 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  1.6 { .  SELECT 
5f20: 30 2e 30 30 30 31 2c 20 2b 30 2e 30 30 30 31 2c  0.0001, +0.0001,
5f30: 20 2d 30 2e 30 30 30 31 20 0a 7d 20 7b 30 2e 30   -0.0001 .} {0.0
5f40: 30 30 31 20 30 2e 30 30 30 31 20 2d 30 2e 30 30  001 0.0001 -0.00
5f50: 30 31 7d 0a 0a 23 20 2d 2d 20 73 79 6e 74 61 78  01}..# -- syntax
5f60: 20 64 69 61 67 72 61 6d 20 6c 69 74 65 72 61 6c   diagram literal
5f70: 2d 76 61 6c 75 65 0a 23 0a 73 65 74 20 73 71 6c  -value.#.set sql
5f80: 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  ite_current_time
5f90: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
5fa0: 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 31  st e_expr-12.2.1
5fb0: 20 7b 53 45 4c 45 43 54 20 31 32 33 7d 20 20 20   {SELECT 123}   
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 31 32 33              {123
5fd0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
5fe0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 32 20  t e_expr-12.2.2 
5ff0: 7b 53 45 4c 45 43 54 20 31 32 33 2e 34 65 30 35  {SELECT 123.4e05
6000: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 32 33 34  }          {1234
6010: 30 30 30 30 2e 30 7d 0a 64 6f 5f 65 78 65 63 73  0000.0}.do_execs
6020: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
6030: 32 2e 32 2e 33 20 7b 53 45 4c 45 43 54 20 27 61  2.2.3 {SELECT 'a
6040: 62 63 64 65 27 7d 20 20 20 20 20 20 20 20 20 20  bcde'}          
6050: 20 7b 61 62 63 64 65 7d 0a 64 6f 5f 65 78 65 63   {abcde}.do_exec
6060: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
6070: 31 32 2e 32 2e 34 20 7b 53 45 4c 45 43 54 20 58  12.2.4 {SELECT X
6080: 27 34 31 34 32 34 33 27 7d 20 20 20 20 20 20 20  '414243'}       
6090: 20 20 7b 41 42 43 7d 0a 64 6f 5f 65 78 65 63 73    {ABC}.do_execs
60a0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
60b0: 32 2e 32 2e 35 20 7b 53 45 4c 45 43 54 20 4e 55  2.2.5 {SELECT NU
60c0: 4c 4c 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  LL}             
60d0: 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {{}}.do_execsql
60e0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
60f0: 32 2e 36 20 7b 53 45 4c 45 43 54 20 43 55 52 52  2.6 {SELECT CURR
6100: 45 4e 54 5f 54 49 4d 45 7d 20 20 20 20 20 20 7b  ENT_TIME}      {
6110: 30 30 3a 30 30 3a 30 31 7d 0a 64 6f 5f 65 78 65  00:00:01}.do_exe
6120: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
6130: 2d 31 32 2e 32 2e 37 20 7b 53 45 4c 45 43 54 20  -12.2.7 {SELECT 
6140: 43 55 52 52 45 4e 54 5f 44 41 54 45 7d 20 20 20  CURRENT_DATE}   
6150: 20 20 20 7b 31 39 37 30 2d 30 31 2d 30 31 7d 0a     {1970-01-01}.
6160: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
6170: 65 5f 65 78 70 72 2d 31 32 2e 32 2e 38 20 7b 53  e_expr-12.2.8 {S
6180: 45 4c 45 43 54 20 43 55 52 52 45 4e 54 5f 54 49  ELECT CURRENT_TI
6190: 4d 45 53 54 41 4d 50 7d 20 7b 7b 31 39 37 30 2d  MESTAMP} {{1970-
61a0: 30 31 2d 30 31 20 30 30 3a 30 30 3a 30 31 7d 7d  01-01 00:00:01}}
61b0: 0a 73 65 74 20 73 71 6c 69 74 65 5f 63 75 72 72  .set sqlite_curr
61c0: 65 6e 74 5f 74 69 6d 65 20 30 0a 0a 23 20 2d 2d  ent_time 0..# --
61d0: 20 73 79 6e 74 61 78 20 64 69 61 67 72 61 6d 20   syntax diagram 
61e0: 65 78 70 72 0a 23 0a 66 6f 72 63 65 64 65 6c 65  expr.#.forcedele
61f0: 74 65 20 74 65 73 74 2e 64 62 32 0a 65 78 65 63  te test.db2.exec
6200: 73 71 6c 20 7b 0a 20 20 41 54 54 41 43 48 20 27  sql {.  ATTACH '
6210: 74 65 73 74 2e 64 62 32 27 20 41 53 20 64 62 6e  test.db2' AS dbn
6220: 61 6d 65 3b 0a 20 20 43 52 45 41 54 45 20 54 41  ame;.  CREATE TA
6230: 42 4c 45 20 64 62 6e 61 6d 65 2e 74 62 6c 6e 61  BLE dbname.tblna
6240: 6d 65 28 63 6e 61 6d 65 29 3b 0a 7d 0a 0a 70 72  me(cname);.}..pr
6250: 6f 63 20 67 6c 6f 62 20 7b 61 72 67 73 7d 20 7b  oc glob {args} {
6260: 72 65 74 75 72 6e 20 31 7d 0a 64 62 20 66 75 6e  return 1}.db fun
6270: 63 74 69 6f 6e 20 67 6c 6f 62 20 67 6c 6f 62 0a  ction glob glob.
6280: 64 62 20 66 75 6e 63 74 69 6f 6e 20 6d 61 74 63  db function matc
6290: 68 20 67 6c 6f 62 0a 64 62 20 66 75 6e 63 74 69  h glob.db functi
62a0: 6f 6e 20 72 65 67 65 78 70 20 67 6c 6f 62 0a 0a  on regexp glob..
62b0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 65 78 70 72  foreach {tn expr
62c0: 7d 20 7b 0a 20 20 31 20 31 32 33 0a 20 20 32 20  } {.  1 123.  2 
62d0: 31 32 33 2e 34 65 30 35 0a 20 20 33 20 27 61 62  123.4e05.  3 'ab
62e0: 63 64 65 27 0a 20 20 34 20 58 27 34 31 34 32 34  cde'.  4 X'41424
62f0: 33 27 0a 20 20 35 20 4e 55 4c 4c 0a 20 20 36 20  3'.  5 NULL.  6 
6300: 43 55 52 52 45 4e 54 5f 54 49 4d 45 0a 20 20 37  CURRENT_TIME.  7
6310: 20 43 55 52 52 45 4e 54 5f 44 41 54 45 0a 20 20   CURRENT_DATE.  
6320: 38 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54  8 CURRENT_TIMEST
6330: 41 4d 50 0a 0a 20 20 39 20 3f 0a 20 31 30 20 3f  AMP..  9 ?. 10 ?
6340: 31 32 33 0a 20 31 31 20 40 68 65 6c 6c 6f 0a 20  123. 11 @hello. 
6350: 31 32 20 3a 77 6f 72 6c 64 0a 20 31 33 20 24 74  12 :world. 13 $t
6360: 63 6c 0a 20 31 34 20 24 74 63 6c 28 61 72 72 61  cl. 14 $tcl(arra
6370: 79 29 0a 20 20 0a 20 20 31 35 20 63 6e 61 6d 65  y).  .  15 cname
6380: 0a 20 20 31 36 20 74 62 6c 6e 61 6d 65 2e 63 6e  .  16 tblname.cn
6390: 61 6d 65 0a 20 20 31 37 20 64 62 6e 61 6d 65 2e  ame.  17 dbname.
63a0: 74 62 6c 6e 61 6d 65 2e 63 6e 61 6d 65 0a 0a 20  tblname.cname.. 
63b0: 20 31 38 20 22 2b 20 45 58 50 52 22 0a 20 20 31   18 "+ EXPR".  1
63c0: 39 20 22 2d 20 45 58 50 52 22 0a 20 20 32 30 20  9 "- EXPR".  20 
63d0: 22 4e 4f 54 20 45 58 50 52 22 0a 20 20 32 31 20  "NOT EXPR".  21 
63e0: 22 7e 20 45 58 50 52 22 0a 0a 20 20 32 32 20 22  "~ EXPR"..  22 "
63f0: 45 58 50 52 31 20 7c 7c 20 45 58 50 52 32 22 0a  EXPR1 || EXPR2".
6400: 20 20 32 33 20 22 45 58 50 52 31 20 2a 20 45 58    23 "EXPR1 * EX
6410: 50 52 32 22 0a 20 20 32 34 20 22 45 58 50 52 31  PR2".  24 "EXPR1
6420: 20 2f 20 45 58 50 52 32 22 0a 20 20 32 35 20 22   / EXPR2".  25 "
6430: 45 58 50 52 31 20 25 20 45 58 50 52 32 22 0a 20  EXPR1 % EXPR2". 
6440: 20 32 36 20 22 45 58 50 52 31 20 2b 20 45 58 50   26 "EXPR1 + EXP
6450: 52 32 22 0a 20 20 32 37 20 22 45 58 50 52 31 20  R2".  27 "EXPR1 
6460: 2d 20 45 58 50 52 32 22 0a 20 20 32 38 20 22 45  - EXPR2".  28 "E
6470: 58 50 52 31 20 3c 3c 20 45 58 50 52 32 22 0a 20  XPR1 << EXPR2". 
6480: 20 32 39 20 22 45 58 50 52 31 20 3e 3e 20 45 58   29 "EXPR1 >> EX
6490: 50 52 32 22 0a 20 20 33 30 20 22 45 58 50 52 31  PR2".  30 "EXPR1
64a0: 20 26 20 45 58 50 52 32 22 0a 20 20 33 31 20 22   & EXPR2".  31 "
64b0: 45 58 50 52 31 20 7c 20 45 58 50 52 32 22 0a 20  EXPR1 | EXPR2". 
64c0: 20 33 32 20 22 45 58 50 52 31 20 3c 20 45 58 50   32 "EXPR1 < EXP
64d0: 52 32 22 0a 20 20 33 33 20 22 45 58 50 52 31 20  R2".  33 "EXPR1 
64e0: 3c 3d 20 45 58 50 52 32 22 0a 20 20 33 34 20 22  <= EXPR2".  34 "
64f0: 45 58 50 52 31 20 3e 20 45 58 50 52 32 22 0a 20  EXPR1 > EXPR2". 
6500: 20 33 35 20 22 45 58 50 52 31 20 3e 3d 20 45 58   35 "EXPR1 >= EX
6510: 50 52 32 22 0a 20 20 33 36 20 22 45 58 50 52 31  PR2".  36 "EXPR1
6520: 20 3d 20 45 58 50 52 32 22 0a 20 20 33 37 20 22   = EXPR2".  37 "
6530: 45 58 50 52 31 20 3d 3d 20 45 58 50 52 32 22 0a  EXPR1 == EXPR2".
6540: 20 20 33 38 20 22 45 58 50 52 31 20 21 3d 20 45    38 "EXPR1 != E
6550: 58 50 52 32 22 0a 20 20 33 39 20 22 45 58 50 52  XPR2".  39 "EXPR
6560: 31 20 3c 3e 20 45 58 50 52 32 22 0a 20 20 34 30  1 <> EXPR2".  40
6570: 20 22 45 58 50 52 31 20 49 53 20 45 58 50 52 32   "EXPR1 IS EXPR2
6580: 22 0a 20 20 34 31 20 22 45 58 50 52 31 20 49 53  ".  41 "EXPR1 IS
6590: 20 4e 4f 54 20 45 58 50 52 32 22 0a 20 20 34 32   NOT EXPR2".  42
65a0: 20 22 45 58 50 52 31 20 41 4e 44 20 45 58 50 52   "EXPR1 AND EXPR
65b0: 32 22 0a 20 20 34 33 20 22 45 58 50 52 31 20 4f  2".  43 "EXPR1 O
65c0: 52 20 45 58 50 52 32 22 0a 20 0a 20 20 34 34 20  R EXPR2". .  44 
65d0: 22 63 6f 75 6e 74 28 2a 29 22 0a 20 20 34 35 20  "count(*)".  45 
65e0: 22 63 6f 75 6e 74 28 44 49 53 54 49 4e 43 54 20  "count(DISTINCT 
65f0: 45 58 50 52 29 22 0a 20 20 34 36 20 22 73 75 62  EXPR)".  46 "sub
6600: 73 74 72 28 45 58 50 52 2c 20 31 30 2c 20 32 30  str(EXPR, 10, 20
6610: 29 22 0a 20 20 34 37 20 22 63 68 61 6e 67 65 73  )".  47 "changes
6620: 28 29 22 0a 20 0a 20 20 34 38 20 22 28 20 45 58  ()". .  48 "( EX
6630: 50 52 20 29 22 0a 20 0a 20 20 34 39 20 22 43 41  PR )". .  49 "CA
6640: 53 54 20 28 20 45 58 50 52 20 41 53 20 69 6e 74  ST ( EXPR AS int
6650: 65 67 65 72 20 29 22 0a 20 20 35 30 20 22 43 41  eger )".  50 "CA
6660: 53 54 20 28 20 45 58 50 52 20 41 53 20 27 61 62  ST ( EXPR AS 'ab
6670: 63 64 27 20 29 22 0a 20 20 35 31 20 22 43 41 53  cd' )".  51 "CAS
6680: 54 20 28 20 45 58 50 52 20 41 53 20 27 61 62 24  T ( EXPR AS 'ab$
6690: 20 24 63 64 27 20 29 22 0a 20 0a 20 20 35 32 20   $cd' )". .  52 
66a0: 22 45 58 50 52 20 43 4f 4c 4c 41 54 45 20 6e 6f  "EXPR COLLATE no
66b0: 63 61 73 65 22 0a 20 20 35 33 20 22 45 58 50 52  case".  53 "EXPR
66c0: 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 22   COLLATE binary"
66d0: 0a 20 0a 20 20 35 34 20 22 45 58 50 52 31 20 4c  . .  54 "EXPR1 L
66e0: 49 4b 45 20 45 58 50 52 32 22 0a 20 20 35 35 20  IKE EXPR2".  55 
66f0: 22 45 58 50 52 31 20 4c 49 4b 45 20 45 58 50 52  "EXPR1 LIKE EXPR
6700: 32 20 45 53 43 41 50 45 20 45 58 50 52 22 0a 20  2 ESCAPE EXPR". 
6710: 20 35 36 20 22 45 58 50 52 31 20 47 4c 4f 42 20   56 "EXPR1 GLOB 
6720: 45 58 50 52 32 22 0a 20 20 35 37 20 22 45 58 50  EXPR2".  57 "EXP
6730: 52 31 20 47 4c 4f 42 20 45 58 50 52 32 20 45 53  R1 GLOB EXPR2 ES
6740: 43 41 50 45 20 45 58 50 52 22 0a 20 20 35 38 20  CAPE EXPR".  58 
6750: 22 45 58 50 52 31 20 52 45 47 45 58 50 20 45 58  "EXPR1 REGEXP EX
6760: 50 52 32 22 0a 20 20 35 39 20 22 45 58 50 52 31  PR2".  59 "EXPR1
6770: 20 52 45 47 45 58 50 20 45 58 50 52 32 20 45 53   REGEXP EXPR2 ES
6780: 43 41 50 45 20 45 58 50 52 22 0a 20 20 36 30 20  CAPE EXPR".  60 
6790: 22 45 58 50 52 31 20 4d 41 54 43 48 20 45 58 50  "EXPR1 MATCH EXP
67a0: 52 32 22 0a 20 20 36 31 20 22 45 58 50 52 31 20  R2".  61 "EXPR1 
67b0: 4d 41 54 43 48 20 45 58 50 52 32 20 45 53 43 41  MATCH EXPR2 ESCA
67c0: 50 45 20 45 58 50 52 22 0a 20 20 36 32 20 22 45  PE EXPR".  62 "E
67d0: 58 50 52 31 20 4e 4f 54 20 4c 49 4b 45 20 45 58  XPR1 NOT LIKE EX
67e0: 50 52 32 22 0a 20 20 36 33 20 22 45 58 50 52 31  PR2".  63 "EXPR1
67f0: 20 4e 4f 54 20 4c 49 4b 45 20 45 58 50 52 32 20   NOT LIKE EXPR2 
6800: 45 53 43 41 50 45 20 45 58 50 52 22 0a 20 20 36  ESCAPE EXPR".  6
6810: 34 20 22 45 58 50 52 31 20 4e 4f 54 20 47 4c 4f  4 "EXPR1 NOT GLO
6820: 42 20 45 58 50 52 32 22 0a 20 20 36 35 20 22 45  B EXPR2".  65 "E
6830: 58 50 52 31 20 4e 4f 54 20 47 4c 4f 42 20 45 58  XPR1 NOT GLOB EX
6840: 50 52 32 20 45 53 43 41 50 45 20 45 58 50 52 22  PR2 ESCAPE EXPR"
6850: 0a 20 20 36 36 20 22 45 58 50 52 31 20 4e 4f 54  .  66 "EXPR1 NOT
6860: 20 52 45 47 45 58 50 20 45 58 50 52 32 22 0a 20   REGEXP EXPR2". 
6870: 20 36 37 20 22 45 58 50 52 31 20 4e 4f 54 20 52   67 "EXPR1 NOT R
6880: 45 47 45 58 50 20 45 58 50 52 32 20 45 53 43 41  EGEXP EXPR2 ESCA
6890: 50 45 20 45 58 50 52 22 0a 20 20 36 38 20 22 45  PE EXPR".  68 "E
68a0: 58 50 52 31 20 4e 4f 54 20 4d 41 54 43 48 20 45  XPR1 NOT MATCH E
68b0: 58 50 52 32 22 0a 20 20 36 39 20 22 45 58 50 52  XPR2".  69 "EXPR
68c0: 31 20 4e 4f 54 20 4d 41 54 43 48 20 45 58 50 52  1 NOT MATCH EXPR
68d0: 32 20 45 53 43 41 50 45 20 45 58 50 52 22 0a 20  2 ESCAPE EXPR". 
68e0: 0a 20 20 37 30 20 22 45 58 50 52 20 49 53 4e 55  .  70 "EXPR ISNU
68f0: 4c 4c 22 0a 20 20 37 31 20 22 45 58 50 52 20 4e  LL".  71 "EXPR N
6900: 4f 54 4e 55 4c 4c 22 0a 20 20 37 32 20 22 45 58  OTNULL".  72 "EX
6910: 50 52 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 0a 20  PR NOT NULL". . 
6920: 20 37 33 20 22 45 58 50 52 31 20 49 53 20 45 58   73 "EXPR1 IS EX
6930: 50 52 32 22 0a 20 20 37 34 20 22 45 58 50 52 31  PR2".  74 "EXPR1
6940: 20 49 53 20 4e 4f 54 20 45 58 50 52 32 22 0a 0a   IS NOT EXPR2"..
6950: 20 20 37 35 20 22 45 58 50 52 20 4e 4f 54 20 42    75 "EXPR NOT B
6960: 45 54 57 45 45 4e 20 45 58 50 52 31 20 41 4e 44  ETWEEN EXPR1 AND
6970: 20 45 58 50 52 32 22 0a 20 20 37 36 20 22 45 58   EXPR2".  76 "EX
6980: 50 52 20 42 45 54 57 45 45 4e 20 45 58 50 52 31  PR BETWEEN EXPR1
6990: 20 41 4e 44 20 45 58 50 52 32 22 0a 0a 20 20 37   AND EXPR2"..  7
69a0: 37 20 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 28  7 "EXPR NOT IN (
69b0: 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46 52 4f  SELECT cname FRO
69c0: 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 20 20 37 38  M tblname)".  78
69d0: 20 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 28 31   "EXPR NOT IN (1
69e0: 29 22 0a 20 20 37 39 20 22 45 58 50 52 20 4e 4f  )".  79 "EXPR NO
69f0: 54 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 22 0a  T IN (1, 2, 3)".
6a00: 20 20 38 30 20 22 45 58 50 52 20 4e 4f 54 20 49    80 "EXPR NOT I
6a10: 4e 20 74 62 6c 6e 61 6d 65 22 0a 20 20 38 31 20  N tblname".  81 
6a20: 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 64 62 6e  "EXPR NOT IN dbn
6a30: 61 6d 65 2e 74 62 6c 6e 61 6d 65 22 0a 20 20 38  ame.tblname".  8
6a40: 32 20 22 45 58 50 52 20 49 4e 20 28 53 45 4c 45  2 "EXPR IN (SELE
6a50: 43 54 20 63 6e 61 6d 65 20 46 52 4f 4d 20 74 62  CT cname FROM tb
6a60: 6c 6e 61 6d 65 29 22 0a 20 20 38 33 20 22 45 58  lname)".  83 "EX
6a70: 50 52 20 49 4e 20 28 31 29 22 0a 20 20 38 34 20  PR IN (1)".  84 
6a80: 22 45 58 50 52 20 49 4e 20 28 31 2c 20 32 2c 20  "EXPR IN (1, 2, 
6a90: 33 29 22 0a 20 20 38 35 20 22 45 58 50 52 20 49  3)".  85 "EXPR I
6aa0: 4e 20 74 62 6c 6e 61 6d 65 22 0a 20 20 38 36 20  N tblname".  86 
6ab0: 22 45 58 50 52 20 49 4e 20 64 62 6e 61 6d 65 2e  "EXPR IN dbname.
6ac0: 74 62 6c 6e 61 6d 65 22 0a 0a 20 20 38 37 20 22  tblname"..  87 "
6ad0: 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 63  EXISTS (SELECT c
6ae0: 6e 61 6d 65 20 46 52 4f 4d 20 74 62 6c 6e 61 6d  name FROM tblnam
6af0: 65 29 22 0a 20 20 38 38 20 22 4e 4f 54 20 45 58  e)".  88 "NOT EX
6b00: 49 53 54 53 20 28 53 45 4c 45 43 54 20 63 6e 61  ISTS (SELECT cna
6b10: 6d 65 20 46 52 4f 4d 20 74 62 6c 6e 61 6d 65 29  me FROM tblname)
6b20: 22 0a 0a 20 20 38 39 20 22 43 41 53 45 20 45 58  "..  89 "CASE EX
6b30: 50 52 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  PR WHEN EXPR1 TH
6b40: 45 4e 20 45 58 50 52 32 20 45 4c 53 45 20 45 58  EN EXPR2 ELSE EX
6b50: 50 52 20 45 4e 44 22 0a 20 20 39 30 20 22 43 41  PR END".  90 "CA
6b60: 53 45 20 45 58 50 52 20 57 48 45 4e 20 45 58 50  SE EXPR WHEN EXP
6b70: 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 45 4e  R1 THEN EXPR2 EN
6b80: 44 22 0a 20 20 39 31 20 22 43 41 53 45 20 45 58  D".  91 "CASE EX
6b90: 50 52 20 57 48 45 4e 20 45 58 50 52 31 20 54 48  PR WHEN EXPR1 TH
6ba0: 45 4e 20 45 58 50 52 32 20 57 48 45 4e 20 45 58  EN EXPR2 WHEN EX
6bb0: 50 52 20 54 48 45 4e 20 45 58 50 52 31 20 45 4c  PR THEN EXPR1 EL
6bc0: 53 45 20 45 58 50 52 32 20 45 4e 44 22 0a 20 20  SE EXPR2 END".  
6bd0: 39 32 20 22 43 41 53 45 20 45 58 50 52 20 57 48  92 "CASE EXPR WH
6be0: 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45 58  EN EXPR1 THEN EX
6bf0: 50 52 32 20 57 48 45 4e 20 45 58 50 52 20 54 48  PR2 WHEN EXPR TH
6c00: 45 4e 20 45 58 50 52 31 20 45 4e 44 22 0a 20 20  EN EXPR1 END".  
6c10: 39 33 20 22 43 41 53 45 20 57 48 45 4e 20 45 58  93 "CASE WHEN EX
6c20: 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 45  PR1 THEN EXPR2 E
6c30: 4c 53 45 20 45 58 50 52 20 45 4e 44 22 0a 20 20  LSE EXPR END".  
6c40: 39 34 20 22 43 41 53 45 20 57 48 45 4e 20 45 58  94 "CASE WHEN EX
6c50: 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 45  PR1 THEN EXPR2 E
6c60: 4e 44 22 0a 20 20 39 35 20 22 43 41 53 45 20 57  ND".  95 "CASE W
6c70: 48 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45  HEN EXPR1 THEN E
6c80: 58 50 52 32 20 57 48 45 4e 20 45 58 50 52 20 54  XPR2 WHEN EXPR T
6c90: 48 45 4e 20 45 58 50 52 31 20 45 4c 53 45 20 45  HEN EXPR1 ELSE E
6ca0: 58 50 52 32 20 45 4e 44 22 0a 20 20 39 36 20 22  XPR2 END".  96 "
6cb0: 43 41 53 45 20 57 48 45 4e 20 45 58 50 52 31 20  CASE WHEN EXPR1 
6cc0: 54 48 45 4e 20 45 58 50 52 32 20 57 48 45 4e 20  THEN EXPR2 WHEN 
6cd0: 45 58 50 52 20 54 48 45 4e 20 45 58 50 52 31 20  EXPR THEN EXPR1 
6ce0: 45 4e 44 22 0a 7d 20 7b 0a 0a 20 20 23 20 49 66  END".} {..  # If
6cf0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6d00: 73 74 72 69 6e 67 20 62 65 69 6e 67 20 70 61 72  string being par
6d10: 73 65 64 20 63 6f 6e 74 61 69 6e 73 20 22 45 58  sed contains "EX
6d20: 50 52 32 22 2c 20 74 68 65 6e 20 72 65 70 6c 61  PR2", then repla
6d30: 63 65 0a 20 20 23 20 73 74 72 69 6e 67 20 22 45  ce.  # string "E
6d40: 58 50 52 31 22 20 61 6e 64 20 22 45 58 50 52 32  XPR1" and "EXPR2
6d50: 22 20 77 69 74 68 20 61 72 62 69 74 72 61 72 79  " with arbitrary
6d60: 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 73   SQL expressions
6d70: 2e 20 49 66 20 69 74 20 0a 20 20 23 20 63 6f 6e  . If it .  # con
6d80: 74 61 69 6e 73 20 22 45 58 50 52 22 2c 20 74 68  tains "EXPR", th
6d90: 65 6e 20 72 65 70 6c 61 63 65 20 45 58 50 52 20  en replace EXPR 
6da0: 77 69 74 68 20 61 6e 20 61 72 62 69 74 72 61 72  with an arbitrar
6db0: 79 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  y SQL expression
6dc0: 2e 0a 20 20 23 20 0a 20 20 73 65 74 20 65 6c 69  ..  # .  set eli
6dd0: 73 74 20 5b 6c 69 73 74 20 24 65 78 70 72 5d 0a  st [list $expr].
6de0: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
6df0: 74 63 68 20 2a 45 58 50 52 32 2a 20 24 65 78 70  tch *EXPR2* $exp
6e00: 72 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 65 6c  r]} {.    set el
6e10: 69 73 74 20 5b 6c 69 73 74 5d 0a 20 20 20 20 66  ist [list].    f
6e20: 6f 72 65 61 63 68 20 7b 65 31 20 65 32 7d 20 7b  oreach {e1 e2} {
6e30: 20 63 6e 61 6d 65 20 22 33 34 2b 32 32 22 20 7d   cname "34+22" }
6e40: 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64   {.      lappend
6e50: 20 65 6c 69 73 74 20 5b 73 74 72 69 6e 67 20 6d   elist [string m
6e60: 61 70 20 5b 6c 69 73 74 20 45 58 50 52 31 20 24  ap [list EXPR1 $
6e70: 65 31 20 45 58 50 52 32 20 24 65 32 5d 20 24 65  e1 EXPR2 $e2] $e
6e80: 78 70 72 5d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a  xpr].    }.  } .
6e90: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61    if {[string ma
6ea0: 74 63 68 20 2a 45 58 50 52 2a 20 24 65 78 70 72  tch *EXPR* $expr
6eb0: 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 65 6c 69  ]} {.    set eli
6ec0: 73 74 32 20 5b 6c 69 73 74 5d 0a 20 20 20 20 66  st2 [list].    f
6ed0: 6f 72 65 61 63 68 20 65 6c 20 24 65 6c 69 73 74  oreach el $elist
6ee0: 20 7b 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68   {.      foreach
6ef0: 20 65 20 7b 20 63 6e 61 6d 65 20 22 33 34 2b 32   e { cname "34+2
6f00: 32 22 20 7d 20 7b 0a 20 20 20 20 20 20 20 20 6c  2" } {.        l
6f10: 61 70 70 65 6e 64 20 65 6c 69 73 74 32 20 5b 73  append elist2 [s
6f20: 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
6f30: 45 58 50 52 20 24 65 5d 20 24 65 6c 5d 0a 20 20  EXPR $e] $el].  
6f40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6f50: 73 65 74 20 65 6c 69 73 74 20 24 65 6c 69 73 74  set elist $elist
6f60: 32 0a 20 20 7d 0a 0a 20 20 73 65 74 20 78 20 30  2.  }..  set x 0
6f70: 0a 20 20 66 6f 72 65 61 63 68 20 65 20 24 65 6c  .  foreach e $el
6f80: 69 73 74 20 7b 0a 20 20 20 20 69 6e 63 72 20 78  ist {.    incr x
6f90: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 65 5f 65  .    do_test e_e
6fa0: 78 70 72 2d 31 32 2e 33 2e 24 74 6e 2e 24 78 20  xpr-12.3.$tn.$x 
6fb0: 7b 20 0a 20 20 20 20 20 20 73 65 74 20 72 63 20  { .      set rc 
6fc0: 5b 63 61 74 63 68 20 7b 20 65 78 65 63 73 71 6c  [catch { execsql
6fd0: 20 22 53 45 4c 45 43 54 20 24 65 20 46 52 4f 4d   "SELECT $e FROM
6fe0: 20 74 62 6c 6e 61 6d 65 22 20 7d 20 6d 73 67 5d   tblname" } msg]
6ff0: 0a 20 20 20 20 7d 20 7b 30 7d 0a 20 20 7d 0a 7d  .    } {0}.  }.}
7000: 0a 0a 23 20 2d 2d 20 73 79 6e 74 61 78 20 64 69  ..# -- syntax di
7010: 61 67 72 61 6d 20 72 61 69 73 65 2d 66 75 6e 63  agram raise-func
7020: 74 69 6f 6e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  tion.#.foreach {
7030: 74 6e 20 72 61 69 73 65 65 78 70 72 7d 20 7b 0a  tn raiseexpr} {.
7040: 20 20 31 20 22 52 41 49 53 45 28 49 47 4e 4f 52    1 "RAISE(IGNOR
7050: 45 29 22 0a 20 20 32 20 22 52 41 49 53 45 28 52  E)".  2 "RAISE(R
7060: 4f 4c 4c 42 41 43 4b 2c 20 27 65 72 72 6f 72 20  OLLBACK, 'error 
7070: 6d 65 73 73 61 67 65 27 29 22 0a 20 20 33 20 22  message')".  3 "
7080: 52 41 49 53 45 28 41 42 4f 52 54 2c 20 27 65 72  RAISE(ABORT, 'er
7090: 72 6f 72 20 6d 65 73 73 61 67 65 27 29 22 0a 20  ror message')". 
70a0: 20 34 20 22 52 41 49 53 45 28 46 41 49 4c 2c 20   4 "RAISE(FAIL, 
70b0: 27 65 72 72 6f 72 20 6d 65 73 73 61 67 65 27 29  'error message')
70c0: 22 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73  ".} {.  do_execs
70d0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
70e0: 32 2e 34 2e 24 74 6e 20 22 0a 20 20 20 20 43 52  2.4.$tn ".    CR
70f0: 45 41 54 45 20 54 52 49 47 47 45 52 20 64 62 6e  EATE TRIGGER dbn
7100: 61 6d 65 2e 74 72 24 74 6e 20 42 45 46 4f 52 45  ame.tr$tn BEFORE
7110: 20 44 45 4c 45 54 45 20 4f 4e 20 74 62 6c 6e 61   DELETE ON tblna
7120: 6d 65 20 42 45 47 49 4e 0a 20 20 20 20 20 20 53  me BEGIN.      S
7130: 45 4c 45 43 54 20 24 72 61 69 73 65 65 78 70 72  ELECT $raiseexpr
7140: 20 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 22 20   ;.    END;.  " 
7150: 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}.}..#---------
7160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71a0: 0a 23 20 54 65 73 74 20 74 68 65 20 73 74 61 74  .# Test the stat
71b0: 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74  ements related t
71c0: 6f 20 74 68 65 20 42 45 54 57 45 45 4e 20 6f 70  o the BETWEEN op
71d0: 65 72 61 74 6f 72 2e 0a 23 0a 23 20 45 56 49 44  erator..#.# EVID
71e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 30 30 37 39  ENCE-OF: R-40079
71f0: 2d 35 34 35 30 33 20 54 68 65 20 42 45 54 57 45  -54503 The BETWE
7200: 45 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6c  EN operator is l
7210: 6f 67 69 63 61 6c 6c 79 0a 23 20 65 71 75 69 76  ogically.# equiv
7220: 61 6c 65 6e 74 20 74 6f 20 61 20 70 61 69 72 20  alent to a pair 
7230: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e 20  of comparisons. 
7240: 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44  "x BETWEEN y AND
7250: 20 7a 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e   z" is equivalen
7260: 74 0a 23 20 74 6f 20 22 78 3e 3d 79 20 41 4e 44  t.# to "x>=y AND
7270: 20 78 3c 3d 7a 22 20 65 78 63 65 70 74 20 74 68   x<=z" except th
7280: 61 74 20 77 69 74 68 20 42 45 54 57 45 45 4e 2c  at with BETWEEN,
7290: 20 74 68 65 20 78 20 65 78 70 72 65 73 73 69 6f   the x expressio
72a0: 6e 20 69 73 0a 23 20 6f 6e 6c 79 20 65 76 61 6c  n is.# only eval
72b0: 75 61 74 65 64 20 6f 6e 63 65 2e 0a 23 0a 64 62  uated once..#.db
72c0: 20 66 75 6e 63 20 78 20 78 0a 70 72 6f 63 20 78   func x x.proc x
72d0: 20 7b 7d 20 7b 20 69 6e 63 72 20 3a 3a 78 63 6f   {} { incr ::xco
72e0: 75 6e 74 20 3b 20 72 65 74 75 72 6e 20 5b 65 78  unt ; return [ex
72f0: 70 72 20 24 3a 3a 78 5d 20 7d 0a 66 6f 72 65 61  pr $::x] }.forea
7300: 63 68 20 7b 74 6e 20 78 20 65 78 70 72 20 72 65  ch {tn x expr re
7310: 73 20 6e 45 76 61 6c 7d 20 7b 0a 20 20 31 20 20  s nEval} {.  1  
7320: 31 30 20 20 22 78 28 29 20 3e 3d 20 35 20 41 4e  10  "x() >= 5 AN
7330: 44 20 78 28 29 20 3c 3d 20 31 35 22 20 20 31 20  D x() <= 15"  1 
7340: 20 32 0a 20 20 32 20 20 31 30 20 20 22 78 28 29   2.  2  10  "x()
7350: 20 42 45 54 57 45 45 4e 20 35 20 41 4e 44 20 31   BETWEEN 5 AND 1
7360: 35 22 20 20 20 20 31 20 20 31 0a 0a 20 20 33 20  5"    1  1..  3 
7370: 20 20 35 20 20 22 78 28 29 20 3e 3d 20 35 20 41    5  "x() >= 5 A
7380: 4e 44 20 78 28 29 20 3c 3d 20 35 22 20 20 20 31  ND x() <= 5"   1
7390: 20 20 32 0a 20 20 34 20 20 20 35 20 20 22 78 28    2.  4   5  "x(
73a0: 29 20 42 45 54 57 45 45 4e 20 35 20 41 4e 44 20  ) BETWEEN 5 AND 
73b0: 35 22 20 20 20 20 20 31 20 20 31 0a 0a 20 20 35  5"     1  1..  5
73c0: 20 20 20 39 20 20 22 28 78 28 29 2c 38 29 20 3e     9  "(x(),8) >
73d0: 3d 20 28 39 2c 37 29 20 41 4e 44 20 28 78 28 29  = (9,7) AND (x()
73e0: 2c 38 29 3c 3d 28 39 2c 31 30 29 22 20 20 31 20  ,8)<=(9,10)"  1 
73f0: 32 0a 20 20 36 20 20 20 39 20 20 22 28 78 28 29  2.  6   9  "(x()
7400: 2c 38 29 20 42 45 54 57 45 45 4e 20 28 39 2c 37  ,8) BETWEEN (9,7
7410: 29 20 41 4e 44 20 28 39 2c 31 30 29 22 20 20 20  ) AND (9,10)"   
7420: 20 20 20 31 20 31 0a 7d 20 7b 0a 20 20 64 6f 5f     1 1.} {.  do_
7430: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 31  test e_expr-13.1
7440: 2e 24 74 6e 20 7b 0a 20 20 20 20 73 65 74 20 3a  .$tn {.    set :
7450: 3a 78 63 6f 75 6e 74 20 30 0a 20 20 20 20 73 65  :xcount 0.    se
7460: 74 20 61 20 5b 65 78 65 63 73 71 6c 20 22 53 45  t a [execsql "SE
7470: 4c 45 43 54 20 24 65 78 70 72 22 5d 0a 20 20 20  LECT $expr"].   
7480: 20 6c 69 73 74 20 24 3a 3a 78 63 6f 75 6e 74 20   list $::xcount 
7490: 24 61 0a 20 20 7d 20 5b 6c 69 73 74 20 24 6e 45  $a.  } [list $nE
74a0: 76 61 6c 20 24 72 65 73 5d 0a 7d 0a 0a 23 20 45  val $res].}..# E
74b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35  VIDENCE-OF: R-05
74c0: 31 35 35 2d 33 34 34 35 34 20 54 68 65 20 70 72  155-34454 The pr
74d0: 65 63 65 64 65 6e 63 65 20 6f 66 20 74 68 65 20  ecedence of the 
74e0: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
74f0: 20 69 73 0a 23 20 74 68 65 20 73 61 6d 65 20 61   is.# the same a
7500: 73 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65  s the precedence
7510: 20 61 73 20 6f 70 65 72 61 74 6f 72 73 20 3d 3d   as operators ==
7520: 20 61 6e 64 20 21 3d 20 61 6e 64 20 4c 49 4b 45   and != and LIKE
7530: 20 61 6e 64 20 67 72 6f 75 70 73 0a 23 20 6c 65   and groups.# le
7540: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 23 20 0a  ft to right..# .
7550: 23 20 54 68 65 72 65 66 6f 72 65 2c 20 42 45 54  # Therefore, BET
7560: 57 45 45 4e 20 67 72 6f 75 70 73 20 6d 6f 72 65  WEEN groups more
7570: 20 74 69 67 68 74 6c 79 20 74 68 61 6e 20 6f 70   tightly than op
7580: 65 72 61 74 6f 72 20 22 41 4e 44 22 2c 20 62 75  erator "AND", bu
7590: 74 20 6c 65 73 73 0a 23 20 73 6f 20 74 68 61 6e  t less.# so than
75a0: 20 22 3c 22 2e 0a 23 0a 64 6f 5f 65 78 65 63 73   "<"..#.do_execs
75b0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
75c0: 33 2e 32 2e 31 20 20 7b 20 53 45 4c 45 43 54 20  3.2.1  { SELECT 
75d0: 31 20 3d 3d 20 31 30 20 42 45 54 57 45 45 4e 20  1 == 10 BETWEEN 
75e0: 30 20 41 4e 44 20 32 20 20 20 7d 20 20 31 0a 64  0 AND 2   }  1.d
75f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7600: 5f 65 78 70 72 2d 31 33 2e 32 2e 32 20 20 7b 20  _expr-13.2.2  { 
7610: 53 45 4c 45 43 54 20 28 31 20 3d 3d 20 31 30 29  SELECT (1 == 10)
7620: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
7630: 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c   }  1.do_execsql
7640: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7650: 32 2e 33 20 20 7b 20 53 45 4c 45 43 54 20 31 20  2.3  { SELECT 1 
7660: 3d 3d 20 28 31 30 20 42 45 54 57 45 45 4e 20 30  == (10 BETWEEN 0
7670: 20 41 4e 44 20 32 29 20 7d 20 20 30 0a 64 6f 5f   AND 2) }  0.do_
7680: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7690: 78 70 72 2d 31 33 2e 32 2e 34 20 20 7b 20 53 45  xpr-13.2.4  { SE
76a0: 4c 45 43 54 20 20 36 20 42 45 54 57 45 45 4e 20  LECT  6 BETWEEN 
76b0: 34 20 41 4e 44 20 38 20 3d 3d 20 31 20 7d 20 20  4 AND 8 == 1 }  
76c0: 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74    1.do_execsql_t
76d0: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
76e0: 35 20 20 7b 20 53 45 4c 45 43 54 20 28 36 20 42  5  { SELECT (6 B
76f0: 45 54 57 45 45 4e 20 34 20 41 4e 44 20 38 29 20  ETWEEN 4 AND 8) 
7700: 3d 3d 20 31 20 7d 20 20 20 31 0a 64 6f 5f 65 78  == 1 }   1.do_ex
7710: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7720: 72 2d 31 33 2e 32 2e 36 20 20 7b 20 53 45 4c 45  r-13.2.6  { SELE
7730: 43 54 20 20 36 20 42 45 54 57 45 45 4e 20 34 20  CT  6 BETWEEN 4 
7740: 41 4e 44 20 28 38 20 3d 3d 20 31 29 20 7d 20 20  AND (8 == 1) }  
7750: 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  0..do_execsql_te
7760: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 37  st e_expr-13.2.7
7770: 20 20 7b 20 53 45 4c 45 43 54 20 20 35 20 42 45    { SELECT  5 BE
7780: 54 57 45 45 4e 20 30 20 41 4e 44 20 30 20 20 21  TWEEN 0 AND 0  !
7790: 3d 20 31 20 7d 20 20 20 31 0a 64 6f 5f 65 78 65  = 1 }   1.do_exe
77a0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
77b0: 2d 31 33 2e 32 2e 38 20 20 7b 20 53 45 4c 45 43  -13.2.8  { SELEC
77c0: 54 20 28 35 20 42 45 54 57 45 45 4e 20 30 20 41  T (5 BETWEEN 0 A
77d0: 4e 44 20 30 29 20 21 3d 20 31 20 7d 20 20 20 31  ND 0) != 1 }   1
77e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
77f0: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 39 20 20   e_expr-13.2.9  
7800: 7b 20 53 45 4c 45 43 54 20 20 35 20 42 45 54 57  { SELECT  5 BETW
7810: 45 45 4e 20 30 20 41 4e 44 20 28 30 20 21 3d 20  EEN 0 AND (0 != 
7820: 31 29 20 7d 20 20 30 0a 64 6f 5f 65 78 65 63 73  1) }  0.do_execs
7830: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7840: 33 2e 32 2e 31 30 20 7b 20 53 45 4c 45 43 54 20  3.2.10 { SELECT 
7850: 20 31 20 21 3d 20 30 20 20 42 45 54 57 45 45 4e   1 != 0  BETWEEN
7860: 20 30 20 41 4e 44 20 32 20 20 7d 20 20 31 0a 64   0 AND 2  }  1.d
7870: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7880: 5f 65 78 70 72 2d 31 33 2e 32 2e 31 31 20 7b 20  _expr-13.2.11 { 
7890: 53 45 4c 45 43 54 20 28 31 20 21 3d 20 30 29 20  SELECT (1 != 0) 
78a0: 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32 20  BETWEEN 0 AND 2 
78b0: 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c   }  1.do_execsql
78c0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
78d0: 32 2e 31 32 20 7b 20 53 45 4c 45 43 54 20 20 31  2.12 { SELECT  1
78e0: 20 21 3d 20 28 30 20 42 45 54 57 45 45 4e 20 30   != (0 BETWEEN 0
78f0: 20 41 4e 44 20 32 29 20 7d 20 20 30 0a 0a 64 6f   AND 2) }  0..do
7900: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7910: 65 78 70 72 2d 31 33 2e 32 2e 31 33 20 7b 20 53  expr-13.2.13 { S
7920: 45 4c 45 43 54 20 31 20 4c 49 4b 45 20 31 30 20  ELECT 1 LIKE 10 
7930: 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32 20  BETWEEN 0 AND 2 
7940: 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71    }  1.do_execsq
7950: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7960: 2e 32 2e 31 34 20 7b 20 53 45 4c 45 43 54 20 28  .2.14 { SELECT (
7970: 31 20 4c 49 4b 45 20 31 30 29 20 42 45 54 57 45  1 LIKE 10) BETWE
7980: 45 4e 20 30 20 41 4e 44 20 32 20 7d 20 20 31 0a  EN 0 AND 2 }  1.
7990: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
79a0: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 35 20 7b  e_expr-13.2.15 {
79b0: 20 53 45 4c 45 43 54 20 31 20 4c 49 4b 45 20 28   SELECT 1 LIKE (
79c0: 31 30 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44  10 BETWEEN 0 AND
79d0: 20 32 29 20 7d 20 20 30 0a 64 6f 5f 65 78 65 63   2) }  0.do_exec
79e0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
79f0: 31 33 2e 32 2e 31 36 20 7b 20 53 45 4c 45 43 54  13.2.16 { SELECT
7a00: 20 20 36 20 42 45 54 57 45 45 4e 20 34 20 41 4e    6 BETWEEN 4 AN
7a10: 44 20 38 20 4c 49 4b 45 20 31 20 20 20 7d 20 20  D 8 LIKE 1   }  
7a20: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
7a30: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 37  t e_expr-13.2.17
7a40: 20 7b 20 53 45 4c 45 43 54 20 28 36 20 42 45 54   { SELECT (6 BET
7a50: 57 45 45 4e 20 34 20 41 4e 44 20 38 29 20 4c 49  WEEN 4 AND 8) LI
7a60: 4b 45 20 31 20 20 7d 20 20 31 0a 64 6f 5f 65 78  KE 1  }  1.do_ex
7a70: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7a80: 72 2d 31 33 2e 32 2e 31 38 20 7b 20 53 45 4c 45  r-13.2.18 { SELE
7a90: 43 54 20 20 36 20 42 45 54 57 45 45 4e 20 34 20  CT  6 BETWEEN 4 
7aa0: 41 4e 44 20 28 38 20 4c 49 4b 45 20 31 29 20 7d  AND (8 LIKE 1) }
7ab0: 20 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f    0..do_execsql_
7ac0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7ad0: 2e 31 39 20 7b 20 53 45 4c 45 43 54 20 30 20 41  .19 { SELECT 0 A
7ae0: 4e 44 20 30 20 42 45 54 57 45 45 4e 20 30 20 41  ND 0 BETWEEN 0 A
7af0: 4e 44 20 31 20 20 20 7d 20 30 0a 64 6f 5f 65 78  ND 1   } 0.do_ex
7b00: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
7b10: 72 2d 31 33 2e 32 2e 32 30 20 7b 20 53 45 4c 45  r-13.2.20 { SELE
7b20: 43 54 20 30 20 41 4e 44 20 28 30 20 42 45 54 57  CT 0 AND (0 BETW
7b30: 45 45 4e 20 30 20 41 4e 44 20 31 29 20 7d 20 30  EEN 0 AND 1) } 0
7b40: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7b50: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 31 20   e_expr-13.2.21 
7b60: 7b 20 53 45 4c 45 43 54 20 28 30 20 41 4e 44 20  { SELECT (0 AND 
7b70: 30 29 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44  0) BETWEEN 0 AND
7b80: 20 31 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71   1 } 1.do_execsq
7b90: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7ba0: 2e 32 2e 32 32 20 7b 20 53 45 4c 45 43 54 20 30  .2.22 { SELECT 0
7bb0: 20 42 45 54 57 45 45 4e 20 2d 31 20 41 4e 44 20   BETWEEN -1 AND 
7bc0: 31 20 41 4e 44 20 30 20 20 20 7d 20 30 0a 64 6f  1 AND 0   } 0.do
7bd0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7be0: 65 78 70 72 2d 31 33 2e 32 2e 32 33 20 7b 20 53  expr-13.2.23 { S
7bf0: 45 4c 45 43 54 20 28 30 20 42 45 54 57 45 45 4e  ELECT (0 BETWEEN
7c00: 20 2d 31 20 41 4e 44 20 31 29 20 41 4e 44 20 30   -1 AND 1) AND 0
7c10: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
7c20: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7c30: 2e 32 34 20 7b 20 53 45 4c 45 43 54 20 30 20 42  .24 { SELECT 0 B
7c40: 45 54 57 45 45 4e 20 2d 31 20 41 4e 44 20 28 31  ETWEEN -1 AND (1
7c50: 20 41 4e 44 20 30 29 20 7d 20 31 0a 0a 64 6f 5f   AND 0) } 1..do_
7c60: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7c70: 78 70 72 2d 31 33 2e 32 2e 32 35 20 7b 20 53 45  xpr-13.2.25 { SE
7c80: 4c 45 43 54 20 32 20 3c 20 33 20 42 45 54 57 45  LECT 2 < 3 BETWE
7c90: 45 4e 20 30 20 41 4e 44 20 31 20 20 20 7d 20 31  EN 0 AND 1   } 1
7ca0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7cb0: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 36 20   e_expr-13.2.26 
7cc0: 7b 20 53 45 4c 45 43 54 20 28 32 20 3c 20 33 29  { SELECT (2 < 3)
7cd0: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 31   BETWEEN 0 AND 1
7ce0: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
7cf0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
7d00: 2e 32 37 20 7b 20 53 45 4c 45 43 54 20 32 20 3c  .27 { SELECT 2 <
7d10: 20 28 33 20 42 45 54 57 45 45 4e 20 30 20 41 4e   (3 BETWEEN 0 AN
7d20: 44 20 31 29 20 7d 20 30 0a 64 6f 5f 65 78 65 63  D 1) } 0.do_exec
7d30: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
7d40: 31 33 2e 32 2e 32 38 20 7b 20 53 45 4c 45 43 54  13.2.28 { SELECT
7d50: 20 32 20 42 45 54 57 45 45 4e 20 31 20 41 4e 44   2 BETWEEN 1 AND
7d60: 20 32 20 3c 20 33 20 20 20 20 7d 20 30 0a 64 6f   2 < 3    } 0.do
7d70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7d80: 65 78 70 72 2d 31 33 2e 32 2e 32 39 20 7b 20 53  expr-13.2.29 { S
7d90: 45 4c 45 43 54 20 32 20 42 45 54 57 45 45 4e 20  ELECT 2 BETWEEN 
7da0: 31 20 41 4e 44 20 28 32 20 3c 20 33 29 20 20 7d  1 AND (2 < 3)  }
7db0: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
7dc0: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 33  st e_expr-13.2.3
7dd0: 30 20 7b 20 53 45 4c 45 43 54 20 28 32 20 42 45  0 { SELECT (2 BE
7de0: 54 57 45 45 4e 20 31 20 41 4e 44 20 32 29 20 3c  TWEEN 1 AND 2) <
7df0: 20 33 20 20 7d 20 31 0a 0a 23 2d 2d 2d 2d 2d 2d   3  } 1..#------
7e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e40: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 73  ---.# Test the s
7e50: 74 61 74 65 6d 65 6e 74 73 20 72 65 6c 61 74 65  tatements relate
7e60: 64 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 61 6e  d to the LIKE an
7e70: 64 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73  d GLOB operators
7e80: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
7e90: 46 3a 20 52 2d 31 36 35 38 34 2d 36 30 31 38 39  F: R-16584-60189
7ea0: 20 54 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74   The LIKE operat
7eb0: 6f 72 20 64 6f 65 73 20 61 20 70 61 74 74 65 72  or does a patter
7ec0: 6e 20 6d 61 74 63 68 69 6e 67 0a 23 20 63 6f 6d  n matching.# com
7ed0: 70 61 72 69 73 6f 6e 2e 0a 23 0a 23 20 45 56 49  parison..#.# EVI
7ee0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 32 39  DENCE-OF: R-1129
7ef0: 35 2d 30 34 36 35 37 20 54 68 65 20 6f 70 65 72  5-04657 The oper
7f00: 61 6e 64 20 74 6f 20 74 68 65 20 72 69 67 68 74  and to the right
7f10: 20 6f 66 20 74 68 65 20 4c 49 4b 45 0a 23 20 6f   of the LIKE.# o
7f20: 70 65 72 61 74 6f 72 20 63 6f 6e 74 61 69 6e 73  perator contains
7f30: 20 74 68 65 20 70 61 74 74 65 72 6e 20 61 6e 64   the pattern and
7f40: 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20 6f   the left hand o
7f50: 70 65 72 61 6e 64 20 63 6f 6e 74 61 69 6e 73 20  perand contains 
7f60: 74 68 65 0a 23 20 73 74 72 69 6e 67 20 74 6f 20  the.# string to 
7f70: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
7f80: 65 20 70 61 74 74 65 72 6e 2e 0a 23 0a 64 6f 5f  e pattern..#.do_
7f90: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7fa0: 78 70 72 2d 31 34 2e 31 2e 31 20 7b 20 53 45 4c  xpr-14.1.1 { SEL
7fb0: 45 43 54 20 27 61 62 63 25 27 20 4c 49 4b 45 20  ECT 'abc%' LIKE 
7fc0: 27 61 62 63 64 65 27 20 7d 20 30 0a 64 6f 5f 65  'abcde' } 0.do_e
7fd0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7fe0: 70 72 2d 31 34 2e 31 2e 32 20 7b 20 53 45 4c 45  pr-14.1.2 { SELE
7ff0: 43 54 20 27 61 62 63 64 65 27 20 4c 49 4b 45 20  CT 'abcde' LIKE 
8000: 27 61 62 63 25 27 20 7d 20 31 0a 0a 23 20 45 56  'abc%' } 1..# EV
8010: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 34  IDENCE-OF: R-554
8020: 30 36 2d 33 38 35 32 34 20 41 20 70 65 72 63 65  06-38524 A perce
8030: 6e 74 20 73 79 6d 62 6f 6c 20 28 22 25 22 29 20  nt symbol ("%") 
8040: 69 6e 20 74 68 65 20 4c 49 4b 45 20 70 61 74 74  in the LIKE patt
8050: 65 72 6e 0a 23 20 6d 61 74 63 68 65 73 20 61 6e  ern.# matches an
8060: 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65  y sequence of ze
8070: 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61  ro or more chara
8080: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 74 72  cters in the str
8090: 69 6e 67 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  ing..#.do_execsq
80a0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
80b0: 2e 32 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61  .2.1 { SELECT 'a
80c0: 62 64 65 27 20 20 20 20 4c 49 4b 45 20 27 61 62  bde'    LIKE 'ab
80d0: 25 64 65 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63  %de' } 1.do_exec
80e0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
80f0: 31 34 2e 32 2e 32 20 7b 20 53 45 4c 45 43 54 20  14.2.2 { SELECT 
8100: 27 61 62 58 64 65 27 20 20 20 4c 49 4b 45 20 27  'abXde'   LIKE '
8110: 61 62 25 64 65 27 20 7d 20 31 0a 64 6f 5f 65 78  ab%de' } 1.do_ex
8120: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
8130: 72 2d 31 34 2e 32 2e 33 20 7b 20 53 45 4c 45 43  r-14.2.3 { SELEC
8140: 54 20 27 61 62 41 42 43 64 65 27 20 4c 49 4b 45  T 'abABCde' LIKE
8150: 20 27 61 62 25 64 65 27 20 7d 20 31 0a 0a 23 20   'ab%de' } 1..# 
8160: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
8170: 30 34 33 33 2d 32 35 34 34 33 20 41 6e 20 75 6e  0433-25443 An un
8180: 64 65 72 73 63 6f 72 65 20 28 22 5f 22 29 20 69  derscore ("_") i
8190: 6e 20 74 68 65 20 4c 49 4b 45 20 70 61 74 74 65  n the LIKE patte
81a0: 72 6e 0a 23 20 6d 61 74 63 68 65 73 20 61 6e 79  rn.# matches any
81b0: 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
81c0: 72 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e  r in the string.
81d0: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
81e0: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 33 2e 31  st e_expr-14.3.1
81f0: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 64 65 27   { SELECT 'abde'
8200: 20 20 20 20 4c 49 4b 45 20 27 61 62 5f 64 65 27      LIKE 'ab_de'
8210: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
8220: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 33  test e_expr-14.3
8230: 2e 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62 58  .2 { SELECT 'abX
8240: 64 65 27 20 20 20 4c 49 4b 45 20 27 61 62 5f 64  de'   LIKE 'ab_d
8250: 65 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71  e' } 1.do_execsq
8260: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
8270: 2e 33 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61  .3.3 { SELECT 'a
8280: 62 41 42 43 64 65 27 20 4c 49 4b 45 20 27 61 62  bABCde' LIKE 'ab
8290: 5f 64 65 27 20 7d 20 30 0a 0a 23 20 45 56 49 44  _de' } 0..# EVID
82a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 30 30 37  ENCE-OF: R-59007
82b0: 2d 32 30 34 35 34 20 41 6e 79 20 6f 74 68 65 72  -20454 Any other
82c0: 20 63 68 61 72 61 63 74 65 72 20 6d 61 74 63 68   character match
82d0: 65 73 20 69 74 73 65 6c 66 20 6f 72 20 69 74 73  es itself or its
82e0: 0a 23 20 6c 6f 77 65 72 2f 75 70 70 65 72 20 63  .# lower/upper c
82f0: 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 20 28  ase equivalent (
8300: 69 2e 65 2e 20 63 61 73 65 2d 69 6e 73 65 6e 73  i.e. case-insens
8310: 69 74 69 76 65 20 6d 61 74 63 68 69 6e 67 29 2e  itive matching).
8320: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
8330: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 34 2e 31  st e_expr-14.4.1
8340: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 27 20   { SELECT 'abc' 
8350: 4c 49 4b 45 20 27 61 42 63 27 20 7d 20 31 0a 64  LIKE 'aBc' } 1.d
8360: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8370: 5f 65 78 70 72 2d 31 34 2e 34 2e 32 20 7b 20 53  _expr-14.4.2 { S
8380: 45 4c 45 43 54 20 27 61 42 63 27 20 4c 49 4b 45  ELECT 'aBc' LIKE
8390: 20 27 61 42 63 27 20 7d 20 31 0a 64 6f 5f 65 78   'aBc' } 1.do_ex
83a0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
83b0: 72 2d 31 34 2e 34 2e 33 20 7b 20 53 45 4c 45 43  r-14.4.3 { SELEC
83c0: 54 20 27 61 63 27 20 20 4c 49 4b 45 20 27 61 42  T 'ac'  LIKE 'aB
83d0: 63 27 20 7d 20 30 0a 0a 23 20 45 56 49 44 45 4e  c' } 0..# EVIDEN
83e0: 43 45 2d 4f 46 3a 20 52 2d 32 33 36 34 38 2d 35  CE-OF: R-23648-5
83f0: 38 35 32 37 20 53 51 4c 69 74 65 20 6f 6e 6c 79  8527 SQLite only
8400: 20 75 6e 64 65 72 73 74 61 6e 64 73 20 75 70 70   understands upp
8410: 65 72 2f 6c 6f 77 65 72 20 63 61 73 65 0a 23 20  er/lower case.# 
8420: 66 6f 72 20 41 53 43 49 49 20 63 68 61 72 61 63  for ASCII charac
8430: 74 65 72 73 20 62 79 20 64 65 66 61 75 6c 74 2e  ters by default.
8440: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
8450: 3a 20 52 2d 30 34 35 33 32 2d 31 31 35 32 37 20  : R-04532-11527 
8460: 54 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f  The LIKE operato
8470: 72 20 69 73 20 63 61 73 65 20 73 65 6e 73 69 74  r is case sensit
8480: 69 76 65 20 62 79 0a 23 20 64 65 66 61 75 6c 74  ive by.# default
8490: 20 66 6f 72 20 75 6e 69 63 6f 64 65 20 63 68 61   for unicode cha
84a0: 72 61 63 74 65 72 73 20 74 68 61 74 20 61 72 65  racters that are
84b0: 20 62 65 79 6f 6e 64 20 74 68 65 20 41 53 43 49   beyond the ASCI
84c0: 49 20 72 61 6e 67 65 2e 0a 23 0a 23 20 45 56 49  I range..#.# EVI
84d0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 33 38  DENCE-OF: R-4438
84e0: 31 2d 31 31 36 36 39 20 74 68 65 20 65 78 70 72  1-11669 the expr
84f0: 65 73 73 69 6f 6e 0a 23 20 27 61 27 26 6e 62 73  ession.# 'a'&nbs
8500: 70 3b 4c 49 4b 45 26 6e 62 73 70 3b 27 41 27 20  p;LIKE&nbsp;'A' 
8510: 69 73 20 54 52 55 45 20 62 75 74 0a 23 20 27 26  is TRUE but.# '&
8520: 61 65 6c 69 67 3b 27 26 6e 62 73 70 3b 4c 49 4b  aelig;'&nbsp;LIK
8530: 45 26 6e 62 73 70 3b 27 26 41 45 6c 69 67 3b 27  E&nbsp;'&AElig;'
8540: 20 69 73 20 46 41 4c 53 45 2e 0a 23 0a 23 20 20   is FALSE..#.#  
8550: 20 54 68 65 20 72 65 73 74 72 69 63 74 69 6f 6e   The restriction
8560: 20 74 6f 20 41 53 43 49 49 20 63 68 61 72 61 63   to ASCII charac
8570: 74 65 72 73 20 64 6f 65 73 20 6e 6f 74 20 61 70  ters does not ap
8580: 70 6c 79 20 69 66 20 74 68 65 20 49 43 55 0a 23  ply if the ICU.#
8590: 20 20 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f     library is co
85a0: 6d 70 69 6c 65 64 20 69 6e 2e 20 57 68 65 6e 20  mpiled in. When 
85b0: 49 43 55 20 69 73 20 65 6e 61 62 6c 65 64 20 53  ICU is enabled S
85c0: 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 61  QLite does not a
85d0: 63 74 0a 23 20 20 20 61 73 20 69 74 20 64 6f 65  ct.#   as it doe
85e0: 73 20 22 62 79 20 64 65 66 61 75 6c 74 22 2e 0a  s "by default"..
85f0: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
8600: 74 20 65 5f 65 78 70 72 2d 31 34 2e 35 2e 31 20  t e_expr-14.5.1 
8610: 7b 20 53 45 4c 45 43 54 20 27 41 27 20 4c 49 4b  { SELECT 'A' LIK
8620: 45 20 27 61 27 20 20 20 20 20 20 20 20 20 7d 20  E 'a'         } 
8630: 31 0a 69 66 63 61 70 61 62 6c 65 20 21 69 63 75  1.ifcapable !icu
8640: 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f   {.  do_execsql_
8650: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 35  test e_expr-14.5
8660: 2e 32 20 22 53 45 4c 45 43 54 20 27 5c 75 30 30  .2 "SELECT '\u00
8670: 63 36 27 20 4c 49 4b 45 20 27 5c 75 30 30 65 36  c6' LIKE '\u00e6
8680: 27 22 20 30 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  '" 0.}..# EVIDEN
8690: 43 45 2d 4f 46 3a 20 52 2d 35 36 36 38 33 2d 31  CE-OF: R-56683-1
86a0: 33 37 33 31 20 49 66 20 74 68 65 20 6f 70 74 69  3731 If the opti
86b0: 6f 6e 61 6c 20 45 53 43 41 50 45 20 63 6c 61 75  onal ESCAPE clau
86c0: 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 0a 23  se is present,.#
86d0: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
86e0: 73 69 6f 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  sion following t
86f0: 68 65 20 45 53 43 41 50 45 20 6b 65 79 77 6f 72  he ESCAPE keywor
8700: 64 20 6d 75 73 74 20 65 76 61 6c 75 61 74 65 20  d must evaluate 
8710: 74 6f 20 61 0a 23 20 73 74 72 69 6e 67 20 63 6f  to a.# string co
8720: 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
8730: 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a  ngle character..
8740: 23 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  #.do_catchsql_te
8750: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 36 2e 31  st e_expr-14.6.1
8760: 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 27 41 27   { .  SELECT 'A'
8770: 20 4c 49 4b 45 20 27 61 27 20 45 53 43 41 50 45   LIKE 'a' ESCAPE
8780: 20 27 31 32 27 20 0a 7d 20 7b 31 20 7b 45 53 43   '12' .} {1 {ESC
8790: 41 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  APE expression m
87a0: 75 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ust be a single 
87b0: 63 68 61 72 61 63 74 65 72 7d 7d 0a 64 6f 5f 63  character}}.do_c
87c0: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65  atchsql_test e_e
87d0: 78 70 72 2d 31 34 2e 36 2e 32 20 7b 20 0a 20 20  xpr-14.6.2 { .  
87e0: 53 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20  SELECT 'A' LIKE 
87f0: 27 61 27 20 45 53 43 41 50 45 20 27 27 20 0a 7d  'a' ESCAPE '' .}
8800: 20 7b 31 20 7b 45 53 43 41 50 45 20 65 78 70 72   {1 {ESCAPE expr
8810: 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  ession must be a
8820: 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
8830: 72 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f  r}}.do_catchsql_
8840: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 36  test e_expr-14.6
8850: 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 41 27 20  .3 { SELECT 'A' 
8860: 4c 49 4b 45 20 27 61 27 20 45 53 43 41 50 45 20  LIKE 'a' ESCAPE 
8870: 27 78 27 20 7d 20 20 20 20 7b 30 20 31 7d 0a 64  'x' }    {0 1}.d
8880: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
8890: 65 5f 65 78 70 72 2d 31 34 2e 36 2e 34 20 22 53  e_expr-14.6.4 "S
88a0: 45 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20 27  ELECT 'A' LIKE '
88b0: 61 27 20 45 53 43 41 50 45 20 27 5c 75 30 30 65  a' ESCAPE '\u00e
88c0: 36 27 22 20 7b 30 20 31 7d 0a 0a 23 20 45 56 49  6'" {0 1}..# EVI
88d0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32 30 34  DENCE-OF: R-0204
88e0: 35 2d 32 33 37 36 32 20 54 68 69 73 20 63 68 61  5-23762 This cha
88f0: 72 61 63 74 65 72 20 6d 61 79 20 62 65 20 75 73  racter may be us
8900: 65 64 20 69 6e 20 74 68 65 20 4c 49 4b 45 0a 23  ed in the LIKE.#
8910: 20 70 61 74 74 65 72 6e 20 74 6f 20 69 6e 63 6c   pattern to incl
8920: 75 64 65 20 6c 69 74 65 72 61 6c 20 70 65 72 63  ude literal perc
8930: 65 6e 74 20 6f 72 20 75 6e 64 65 72 73 63 6f 72  ent or underscor
8940: 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 23 0a  e characters..#.
8950: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
8960: 2d 31 33 33 34 35 2d 33 31 38 33 30 20 54 68 65  -13345-31830 The
8970: 20 65 73 63 61 70 65 20 63 68 61 72 61 63 74 65   escape characte
8980: 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  r followed by a 
8990: 70 65 72 63 65 6e 74 0a 23 20 73 79 6d 62 6f 6c  percent.# symbol
89a0: 20 28 25 29 2c 20 75 6e 64 65 72 73 63 6f 72 65   (%), underscore
89b0: 20 28 5f 29 2c 20 6f 72 20 61 20 73 65 63 6f 6e   (_), or a secon
89c0: 64 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  d instance of th
89d0: 65 20 65 73 63 61 70 65 0a 23 20 63 68 61 72 61  e escape.# chara
89e0: 63 74 65 72 20 69 74 73 65 6c 66 20 6d 61 74 63  cter itself matc
89f0: 68 65 73 20 61 20 6c 69 74 65 72 61 6c 20 70 65  hes a literal pe
8a00: 72 63 65 6e 74 20 73 79 6d 62 6f 6c 2c 20 75 6e  rcent symbol, un
8a10: 64 65 72 73 63 6f 72 65 2c 20 6f 72 20 61 0a 23  derscore, or a.#
8a20: 20 73 69 6e 67 6c 65 20 65 73 63 61 70 65 20 63   single escape c
8a30: 68 61 72 61 63 74 65 72 2c 20 72 65 73 70 65 63  haracter, respec
8a40: 74 69 76 65 6c 79 2e 0a 23 0a 64 6f 5f 65 78 65  tively..#.do_exe
8a50: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
8a60: 2d 31 34 2e 37 2e 31 20 20 7b 20 53 45 4c 45 43  -14.7.1  { SELEC
8a70: 54 20 27 61 62 63 25 27 20 20 4c 49 4b 45 20 27  T 'abc%'  LIKE '
8a80: 61 62 63 58 25 27 20 45 53 43 41 50 45 20 27 58  abcX%' ESCAPE 'X
8a90: 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 1.do_execsql
8aa0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
8ab0: 37 2e 32 20 20 7b 20 53 45 4c 45 43 54 20 27 61  7.2  { SELECT 'a
8ac0: 62 63 35 27 20 20 4c 49 4b 45 20 27 61 62 63 58  bc5'  LIKE 'abcX
8ad0: 25 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20  %' ESCAPE 'X' } 
8ae0: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
8af0: 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 33 20  t e_expr-14.7.3 
8b00: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 27 20   { SELECT 'abc' 
8b10: 20 20 4c 49 4b 45 20 27 61 62 63 58 25 27 20 45    LIKE 'abcX%' E
8b20: 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a 64 6f  SCAPE 'X' } 0.do
8b30: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8b40: 65 78 70 72 2d 31 34 2e 37 2e 34 20 20 7b 20 53  expr-14.7.4  { S
8b50: 45 4c 45 43 54 20 27 61 62 63 58 25 27 20 4c 49  ELECT 'abcX%' LI
8b60: 4b 45 20 27 61 62 63 58 25 27 20 45 53 43 41 50  KE 'abcX%' ESCAP
8b70: 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65  E 'X' } 0.do_exe
8b80: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
8b90: 2d 31 34 2e 37 2e 35 20 20 7b 20 53 45 4c 45 43  -14.7.5  { SELEC
8ba0: 54 20 27 61 62 63 25 25 27 20 4c 49 4b 45 20 27  T 'abc%%' LIKE '
8bb0: 61 62 63 58 25 27 20 45 53 43 41 50 45 20 27 58  abcX%' ESCAPE 'X
8bc0: 27 20 7d 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71  ' } 0..do_execsq
8bd0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
8be0: 2e 37 2e 36 20 20 7b 20 53 45 4c 45 43 54 20 27  .7.6  { SELECT '
8bf0: 61 62 63 5f 27 20 20 4c 49 4b 45 20 27 61 62 63  abc_'  LIKE 'abc
8c00: 58 5f 27 20 45 53 43 41 50 45 20 27 58 27 20 7d  X_' ESCAPE 'X' }
8c10: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
8c20: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 37  st e_expr-14.7.7
8c30: 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 35    { SELECT 'abc5
8c40: 27 20 20 4c 49 4b 45 20 27 61 62 63 58 5f 27 20  '  LIKE 'abcX_' 
8c50: 45 53 43 41 50 45 20 27 58 27 20 7d 20 30 0a 64  ESCAPE 'X' } 0.d
8c60: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8c70: 5f 65 78 70 72 2d 31 34 2e 37 2e 38 20 20 7b 20  _expr-14.7.8  { 
8c80: 53 45 4c 45 43 54 20 27 61 62 63 27 20 20 20 4c  SELECT 'abc'   L
8c90: 49 4b 45 20 27 61 62 63 58 5f 27 20 45 53 43 41  IKE 'abcX_' ESCA
8ca0: 50 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78  PE 'X' } 0.do_ex
8cb0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
8cc0: 72 2d 31 34 2e 37 2e 39 20 20 7b 20 53 45 4c 45  r-14.7.9  { SELE
8cd0: 43 54 20 27 61 62 63 58 5f 27 20 4c 49 4b 45 20  CT 'abcX_' LIKE 
8ce0: 27 61 62 63 58 5f 27 20 45 53 43 41 50 45 20 27  'abcX_' ESCAPE '
8cf0: 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71  X' } 0.do_execsq
8d00: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
8d10: 2e 37 2e 31 30 20 7b 20 53 45 4c 45 43 54 20 27  .7.10 { SELECT '
8d20: 61 62 63 5f 5f 27 20 4c 49 4b 45 20 27 61 62 63  abc__' LIKE 'abc
8d30: 58 5f 27 20 45 53 43 41 50 45 20 27 58 27 20 7d  X_' ESCAPE 'X' }
8d40: 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   0..do_execsql_t
8d50: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e  est e_expr-14.7.
8d60: 31 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  11 { SELECT 'abc
8d70: 58 27 20 20 4c 49 4b 45 20 27 61 62 63 58 58 27  X'  LIKE 'abcXX'
8d80: 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 31 0a   ESCAPE 'X' } 1.
8d90: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8da0: 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 32 20 7b  e_expr-14.7.12 {
8db0: 20 53 45 4c 45 43 54 20 27 61 62 63 35 27 20 20   SELECT 'abc5'  
8dc0: 4c 49 4b 45 20 27 61 62 63 58 58 27 20 45 53 43  LIKE 'abcXX' ESC
8dd0: 41 50 45 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65  APE 'X' } 0.do_e
8de0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8df0: 70 72 2d 31 34 2e 37 2e 31 33 20 7b 20 53 45 4c  pr-14.7.13 { SEL
8e00: 45 43 54 20 27 61 62 63 27 20 20 20 4c 49 4b 45  ECT 'abc'   LIKE
8e10: 20 27 61 62 63 58 58 27 20 45 53 43 41 50 45 20   'abcXX' ESCAPE 
8e20: 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  'X' } 0.do_execs
8e30: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8e40: 34 2e 37 2e 31 34 20 7b 20 53 45 4c 45 43 54 20  4.7.14 { SELECT 
8e50: 27 61 62 63 58 58 27 20 4c 49 4b 45 20 27 61 62  'abcXX' LIKE 'ab
8e60: 63 58 58 27 20 45 53 43 41 50 45 20 27 58 27 20  cXX' ESCAPE 'X' 
8e70: 7d 20 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  } 0..# EVIDENCE-
8e80: 4f 46 3a 20 52 2d 35 31 33 35 39 2d 31 37 34 39  OF: R-51359-1749
8e90: 36 20 54 68 65 20 69 6e 66 69 78 20 4c 49 4b 45  6 The infix LIKE
8ea0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 69 6d 70   operator is imp
8eb0: 6c 65 6d 65 6e 74 65 64 20 62 79 0a 23 20 63 61  lemented by.# ca
8ec0: 6c 6c 69 6e 67 20 74 68 65 20 61 70 70 6c 69 63  lling the applic
8ed0: 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 53 51  ation-defined SQ
8ee0: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 6c 69 6b 65  L functions like
8ef0: 28 59 2c 58 29 20 6f 72 20 6c 69 6b 65 28 59 2c  (Y,X) or like(Y,
8f00: 58 2c 5a 29 2e 0a 23 0a 70 72 6f 63 20 6c 69 6b  X,Z)..#.proc lik
8f10: 65 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b 0a 20  efunc {args} {. 
8f20: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a 3a   eval lappend ::
8f30: 6c 69 6b 65 61 72 67 73 20 24 61 72 67 73 0a 20  likeargs $args. 
8f40: 20 72 65 74 75 72 6e 20 31 0a 7d 0a 64 62 20 66   return 1.}.db f
8f50: 75 6e 63 20 6c 69 6b 65 20 2d 61 72 67 63 6f 75  unc like -argcou
8f60: 6e 74 20 32 20 6c 69 6b 65 66 75 6e 63 0a 64 62  nt 2 likefunc.db
8f70: 20 66 75 6e 63 20 6c 69 6b 65 20 2d 61 72 67 63   func like -argc
8f80: 6f 75 6e 74 20 33 20 6c 69 6b 65 66 75 6e 63 0a  ount 3 likefunc.
8f90: 73 65 74 20 3a 3a 6c 69 6b 65 61 72 67 73 20 5b  set ::likeargs [
8fa0: 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c  list].do_execsql
8fb0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 35 2e  _test e_expr-15.
8fc0: 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62  1.1 { SELECT 'ab
8fd0: 63 27 20 4c 49 4b 45 20 27 64 65 66 27 20 7d 20  c' LIKE 'def' } 
8fe0: 31 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  1.do_test       
8ff0: 20 20 65 5f 65 78 70 72 2d 31 35 2e 31 2e 32 20    e_expr-15.1.2 
9000: 7b 20 73 65 74 20 6c 69 6b 65 61 72 67 73 20 7d  { set likeargs }
9010: 20 7b 64 65 66 20 61 62 63 7d 0a 73 65 74 20 3a   {def abc}.set :
9020: 3a 6c 69 6b 65 61 72 67 73 20 5b 6c 69 73 74 5d  :likeargs [list]
9030: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9040: 20 65 5f 65 78 70 72 2d 31 35 2e 31 2e 33 20 7b   e_expr-15.1.3 {
9050: 20 53 45 4c 45 43 54 20 27 61 62 63 27 20 4c 49   SELECT 'abc' LI
9060: 4b 45 20 27 64 65 66 27 20 45 53 43 41 50 45 20  KE 'def' ESCAPE 
9070: 27 58 27 20 7d 20 31 0a 64 6f 5f 74 65 73 74 20  'X' } 1.do_test 
9080: 20 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31          e_expr-1
9090: 35 2e 31 2e 34 20 7b 20 73 65 74 20 6c 69 6b 65  5.1.4 { set like
90a0: 61 72 67 73 20 7d 20 7b 64 65 66 20 61 62 63 20  args } {def abc 
90b0: 58 7d 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69  X}.db close.sqli
90c0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a  te3 db test.db..
90d0: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
90e0: 2d 32 32 38 36 38 2d 32 35 38 38 30 20 54 68 65  -22868-25880 The
90f0: 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 63   LIKE operator c
9100: 61 6e 20 62 65 20 6d 61 64 65 20 63 61 73 65 0a  an be made case.
9110: 23 20 73 65 6e 73 69 74 69 76 65 20 75 73 69 6e  # sensitive usin
9120: 67 20 74 68 65 20 63 61 73 65 5f 73 65 6e 73 69  g the case_sensi
9130: 74 69 76 65 5f 6c 69 6b 65 20 70 72 61 67 6d 61  tive_like pragma
9140: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
9150: 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e  est e_expr-16.1.
9160: 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78  1 { SELECT 'abcx
9170: 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25 27 20  yz' LIKE 'ABC%' 
9180: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
9190: 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e  est e_expr-16.1.
91a0: 32 20 7b 20 50 52 41 47 4d 41 20 63 61 73 65 5f  2 { PRAGMA case_
91b0: 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 20 3d  sensitive_like =
91c0: 20 31 20 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73   1 } {}.do_execs
91d0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
91e0: 36 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54 20 27  6.1.3 { SELECT '
91f0: 61 62 63 78 79 7a 27 20 4c 49 4b 45 20 27 41 42  abcxyz' LIKE 'AB
9200: 43 25 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73  C%' } 0.do_execs
9210: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
9220: 36 2e 31 2e 34 20 7b 20 53 45 4c 45 43 54 20 27  6.1.4 { SELECT '
9230: 41 42 43 78 79 7a 27 20 4c 49 4b 45 20 27 41 42  ABCxyz' LIKE 'AB
9240: 43 25 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73  C%' } 1.do_execs
9250: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
9260: 36 2e 31 2e 35 20 7b 20 50 52 41 47 4d 41 20 63  6.1.5 { PRAGMA c
9270: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
9280: 6b 65 20 3d 20 30 20 7d 20 7b 7d 0a 64 6f 5f 65  ke = 0 } {}.do_e
9290: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
92a0: 70 72 2d 31 36 2e 31 2e 36 20 7b 20 53 45 4c 45  pr-16.1.6 { SELE
92b0: 43 54 20 27 61 62 63 78 79 7a 27 20 4c 49 4b 45  CT 'abcxyz' LIKE
92c0: 20 27 41 42 43 25 27 20 7d 20 31 0a 64 6f 5f 65   'ABC%' } 1.do_e
92d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
92e0: 70 72 2d 31 36 2e 31 2e 37 20 7b 20 53 45 4c 45  pr-16.1.7 { SELE
92f0: 43 54 20 27 41 42 43 78 79 7a 27 20 4c 49 4b 45  CT 'ABCxyz' LIKE
9300: 20 27 41 42 43 25 27 20 7d 20 31 0a 0a 23 20 45   'ABC%' } 1..# E
9310: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32  VIDENCE-OF: R-52
9320: 30 38 37 2d 31 32 30 34 33 20 54 68 65 20 47 4c  087-12043 The GL
9330: 4f 42 20 6f 70 65 72 61 74 6f 72 20 69 73 20 73  OB operator is s
9340: 69 6d 69 6c 61 72 20 74 6f 20 4c 49 4b 45 20 62  imilar to LIKE b
9350: 75 74 0a 23 20 75 73 65 73 20 74 68 65 20 55 6e  ut.# uses the Un
9360: 69 78 20 66 69 6c 65 20 67 6c 6f 62 62 69 6e 67  ix file globbing
9370: 20 73 79 6e 74 61 78 20 66 6f 72 20 69 74 73 20   syntax for its 
9380: 77 69 6c 64 63 61 72 64 73 2e 0a 23 0a 23 20 45  wildcards..#.# E
9390: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39  VIDENCE-OF: R-09
93a0: 38 31 33 2d 31 37 32 37 39 20 41 6c 73 6f 2c 20  813-17279 Also, 
93b0: 47 4c 4f 42 20 69 73 20 63 61 73 65 20 73 65 6e  GLOB is case sen
93c0: 73 69 74 69 76 65 2c 20 75 6e 6c 69 6b 65 20 4c  sitive, unlike L
93d0: 49 4b 45 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  IKE..#.do_execsq
93e0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37  l_test e_expr-17
93f0: 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61  .1.1 { SELECT 'a
9400: 62 63 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63  bcxyz' GLOB 'abc
9410: 25 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71  %' } 0.do_execsq
9420: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37  l_test e_expr-17
9430: 2e 31 2e 32 20 7b 20 53 45 4c 45 43 54 20 27 61  .1.2 { SELECT 'a
9440: 62 63 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63  bcxyz' GLOB 'abc
9450: 2a 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71  *' } 1.do_execsq
9460: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37  l_test e_expr-17
9470: 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61  .1.3 { SELECT 'a
9480: 62 63 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63  bcxyz' GLOB 'abc
9490: 5f 5f 5f 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63  ___' } 0.do_exec
94a0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
94b0: 31 37 2e 31 2e 34 20 7b 20 53 45 4c 45 43 54 20  17.1.4 { SELECT 
94c0: 27 61 62 63 78 79 7a 27 20 47 4c 4f 42 20 27 61  'abcxyz' GLOB 'a
94d0: 62 63 3f 3f 3f 27 20 7d 20 31 0a 0a 64 6f 5f 65  bc???' } 1..do_e
94e0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
94f0: 70 72 2d 31 37 2e 31 2e 35 20 7b 20 53 45 4c 45  pr-17.1.5 { SELE
9500: 43 54 20 27 61 62 63 78 79 7a 27 20 47 4c 4f 42  CT 'abcxyz' GLOB
9510: 20 27 61 62 63 2a 27 20 7d 20 31 0a 64 6f 5f 65   'abc*' } 1.do_e
9520: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
9530: 70 72 2d 31 37 2e 31 2e 36 20 7b 20 53 45 4c 45  pr-17.1.6 { SELE
9540: 43 54 20 27 41 42 43 78 79 7a 27 20 47 4c 4f 42  CT 'ABCxyz' GLOB
9550: 20 27 61 62 63 2a 27 20 7d 20 30 0a 64 6f 5f 65   'abc*' } 0.do_e
9560: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
9570: 70 72 2d 31 37 2e 31 2e 37 20 7b 20 53 45 4c 45  pr-17.1.7 { SELE
9580: 43 54 20 27 61 62 63 78 79 7a 27 20 47 4c 4f 42  CT 'abcxyz' GLOB
9590: 20 27 41 42 43 2a 27 20 7d 20 30 0a 0a 23 20 45   'ABC*' } 0..# E
95a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39  VIDENCE-OF: R-39
95b0: 36 31 36 2d 32 30 35 35 35 20 42 6f 74 68 20 47  616-20555 Both G
95c0: 4c 4f 42 20 61 6e 64 20 4c 49 4b 45 20 6d 61 79  LOB and LIKE may
95d0: 20 62 65 20 70 72 65 63 65 64 65 64 20 62 79 20   be preceded by 
95e0: 74 68 65 0a 23 20 4e 4f 54 20 6b 65 79 77 6f 72  the.# NOT keywor
95f0: 64 20 74 6f 20 69 6e 76 65 72 74 20 74 68 65 20  d to invert the 
9600: 73 65 6e 73 65 20 6f 66 20 74 68 65 20 74 65 73  sense of the tes
9610: 74 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t..#.do_execsql_
9620: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 32  test e_expr-17.2
9630: 2e 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .1 { SELECT 'abc
9640: 78 79 7a 27 20 4e 4f 54 20 47 4c 4f 42 20 27 41  xyz' NOT GLOB 'A
9650: 42 43 2a 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63  BC*' } 1.do_exec
9660: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
9670: 31 37 2e 32 2e 32 20 7b 20 53 45 4c 45 43 54 20  17.2.2 { SELECT 
9680: 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 47 4c 4f  'abcxyz' NOT GLO
9690: 42 20 27 61 62 63 2a 27 20 7d 20 30 0a 64 6f 5f  B 'abc*' } 0.do_
96a0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
96b0: 78 70 72 2d 31 37 2e 32 2e 33 20 7b 20 53 45 4c  xpr-17.2.3 { SEL
96c0: 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e 4f 54  ECT 'abcxyz' NOT
96d0: 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20 30   LIKE 'ABC%' } 0
96e0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
96f0: 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 34 20 7b   e_expr-17.2.4 {
9700: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
9710: 20 4e 4f 54 20 4c 49 4b 45 20 27 61 62 63 25 27   NOT LIKE 'abc%'
9720: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
9730: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 32  test e_expr-17.2
9740: 2e 35 20 7b 20 53 45 4c 45 43 54 20 27 61 62 64  .5 { SELECT 'abd
9750: 78 79 7a 27 20 4e 4f 54 20 4c 49 4b 45 20 27 61  xyz' NOT LIKE 'a
9760: 62 63 25 27 20 7d 20 31 0a 0a 64 62 20 6e 75 6c  bc%' } 1..db nul
9770: 6c 76 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f 65  lvalue null.do_e
9780: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
9790: 70 72 2d 31 37 2e 32 2e 36 20 7b 20 53 45 4c 45  pr-17.2.6 { SELE
97a0: 43 54 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20  CT 'abcxyz' NOT 
97b0: 47 4c 4f 42 20 4e 55 4c 4c 20 7d 20 6e 75 6c 6c  GLOB NULL } null
97c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
97d0: 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 37 20 7b   e_expr-17.2.7 {
97e0: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
97f0: 20 4e 4f 54 20 4c 49 4b 45 20 4e 55 4c 4c 20 7d   NOT LIKE NULL }
9800: 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c   null.do_execsql
9810: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
9820: 32 2e 38 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c  2.8 { SELECT NUL
9830: 4c 20 4e 4f 54 20 47 4c 4f 42 20 27 61 62 63 2a  L NOT GLOB 'abc*
9840: 27 20 7d 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63  ' } null.do_exec
9850: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
9860: 31 37 2e 32 2e 39 20 7b 20 53 45 4c 45 43 54 20  17.2.9 { SELECT 
9870: 4e 55 4c 4c 20 4e 4f 54 20 4c 49 4b 45 20 27 41  NULL NOT LIKE 'A
9880: 42 43 25 27 20 7d 20 6e 75 6c 6c 0a 64 62 20 6e  BC%' } null.db n
9890: 75 6c 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23 20 45  ullvalue {}..# E
98a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39  VIDENCE-OF: R-39
98b0: 34 31 34 2d 33 35 34 38 39 20 54 68 65 20 69 6e  414-35489 The in
98c0: 66 69 78 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f  fix GLOB operato
98d0: 72 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  r is implemented
98e0: 20 62 79 0a 23 20 63 61 6c 6c 69 6e 67 20 74 68   by.# calling th
98f0: 65 20 66 75 6e 63 74 69 6f 6e 20 67 6c 6f 62 28  e function glob(
9900: 59 2c 58 29 20 61 6e 64 20 63 61 6e 20 62 65 20  Y,X) and can be 
9910: 6d 6f 64 69 66 69 65 64 20 62 79 20 6f 76 65 72  modified by over
9920: 72 69 64 69 6e 67 20 74 68 61 74 0a 23 20 66 75  riding that.# fu
9930: 6e 63 74 69 6f 6e 2e 0a 70 72 6f 63 20 67 6c 6f  nction..proc glo
9940: 62 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b 0a 20  bfunc {args} {. 
9950: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a 3a   eval lappend ::
9960: 67 6c 6f 62 61 72 67 73 20 24 61 72 67 73 0a 20  globargs $args. 
9970: 20 72 65 74 75 72 6e 20 31 0a 7d 0a 64 62 20 66   return 1.}.db f
9980: 75 6e 63 20 67 6c 6f 62 20 2d 61 72 67 63 6f 75  unc glob -argcou
9990: 6e 74 20 32 20 67 6c 6f 62 66 75 6e 63 0a 73 65  nt 2 globfunc.se
99a0: 74 20 3a 3a 67 6c 6f 62 61 72 67 73 20 5b 6c 69  t ::globargs [li
99b0: 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  st].do_execsql_t
99c0: 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 33 2e  est e_expr-17.3.
99d0: 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 27  1 { SELECT 'abc'
99e0: 20 47 4c 4f 42 20 27 64 65 66 27 20 7d 20 31 0a   GLOB 'def' } 1.
99f0: 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20 20  do_test         
9a00: 65 5f 65 78 70 72 2d 31 37 2e 33 2e 32 20 7b 20  e_expr-17.3.2 { 
9a10: 73 65 74 20 67 6c 6f 62 61 72 67 73 20 7d 20 7b  set globargs } {
9a20: 64 65 66 20 61 62 63 7d 0a 73 65 74 20 3a 3a 67  def abc}.set ::g
9a30: 6c 6f 62 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64  lobargs [list].d
9a40: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
9a50: 5f 65 78 70 72 2d 31 37 2e 33 2e 33 20 7b 20 53  _expr-17.3.3 { S
9a60: 45 4c 45 43 54 20 27 58 27 20 4e 4f 54 20 47 4c  ELECT 'X' NOT GL
9a70: 4f 42 20 27 59 27 20 7d 20 30 0a 64 6f 5f 74 65  OB 'Y' } 0.do_te
9a80: 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78 70  st         e_exp
9a90: 72 2d 31 37 2e 33 2e 34 20 7b 20 73 65 74 20 67  r-17.3.4 { set g
9aa0: 6c 6f 62 61 72 67 73 20 7d 20 7b 59 20 58 7d 0a  lobargs } {Y X}.
9ab0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
9ac0: 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  db..# EVIDENCE-O
9ad0: 46 3a 20 52 2d 34 31 36 35 30 2d 32 30 38 37 32  F: R-41650-20872
9ae0: 20 4e 6f 20 72 65 67 65 78 70 28 29 20 75 73 65   No regexp() use
9af0: 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 64 65  r function is de
9b00: 66 69 6e 65 64 20 62 79 0a 23 20 64 65 66 61 75  fined by.# defau
9b10: 6c 74 20 61 6e 64 20 73 6f 20 75 73 65 20 6f 66  lt and so use of
9b20: 20 74 68 65 20 52 45 47 45 58 50 20 6f 70 65 72   the REGEXP oper
9b30: 61 74 6f 72 20 77 69 6c 6c 20 6e 6f 72 6d 61 6c  ator will normal
9b40: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 0a  ly result in an.
9b50: 23 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  # error message.
9b60: 0a 23 0a 23 20 20 20 54 68 65 72 65 20 69 73 20  .#.#   There is 
9b70: 61 20 72 65 67 65 78 70 20 66 75 6e 63 74 69 6f  a regexp functio
9b80: 6e 20 69 66 20 49 43 55 20 69 73 20 65 6e 61 62  n if ICU is enab
9b90: 6c 65 64 20 74 68 6f 75 67 68 2e 0a 23 0a 69 66  led though..#.if
9ba0: 63 61 70 61 62 6c 65 20 21 69 63 75 20 7b 0a 20  capable !icu {. 
9bb0: 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73   do_catchsql_tes
9bc0: 74 20 65 5f 65 78 70 72 2d 31 38 2e 31 2e 31 20  t e_expr-18.1.1 
9bd0: 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 72 65  { .    SELECT re
9be0: 67 65 78 70 28 27 61 62 63 27 2c 20 27 64 65 66  gexp('abc', 'def
9bf0: 27 29 20 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73  ') .  } {1 {no s
9c00: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 72 65  uch function: re
9c10: 67 65 78 70 7d 7d 0a 20 20 64 6f 5f 63 61 74 63  gexp}}.  do_catc
9c20: 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  hsql_test e_expr
9c30: 2d 31 38 2e 31 2e 32 20 7b 20 0a 20 20 20 20 53  -18.1.2 { .    S
9c40: 45 4c 45 43 54 20 27 61 62 63 27 20 52 45 47 45  ELECT 'abc' REGE
9c50: 58 50 20 27 64 65 66 27 0a 20 20 7d 20 7b 31 20  XP 'def'.  } {1 
9c60: 7b 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f  {no such functio
9c70: 6e 3a 20 52 45 47 45 58 50 7d 7d 0a 7d 0a 0a 23  n: REGEXP}}.}..#
9c80: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
9c90: 33 33 36 39 33 2d 35 30 31 38 30 20 54 68 65 20  33693-50180 The 
9ca0: 52 45 47 45 58 50 20 6f 70 65 72 61 74 6f 72 20  REGEXP operator 
9cb0: 69 73 20 61 20 73 70 65 63 69 61 6c 20 73 79 6e  is a special syn
9cc0: 74 61 78 20 66 6f 72 0a 23 20 74 68 65 20 72 65  tax for.# the re
9cd0: 67 65 78 70 28 29 20 75 73 65 72 20 66 75 6e 63  gexp() user func
9ce0: 74 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e  tion..#.# EVIDEN
9cf0: 43 45 2d 4f 46 3a 20 52 2d 36 35 35 32 34 2d 36  CE-OF: R-65524-6
9d00: 31 38 34 39 20 49 66 20 61 6e 20 61 70 70 6c 69  1849 If an appli
9d10: 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 53  cation-defined S
9d20: 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 23 20 6e 61  QL function.# na
9d30: 6d 65 64 20 22 72 65 67 65 78 70 22 20 69 73 20  med "regexp" is 
9d40: 61 64 64 65 64 20 61 74 20 72 75 6e 2d 74 69 6d  added at run-tim
9d50: 65 2c 20 74 68 65 6e 20 74 68 65 20 22 58 20 52  e, then the "X R
9d60: 45 47 45 58 50 20 59 22 20 6f 70 65 72 61 74 6f  EGEXP Y" operato
9d70: 72 0a 23 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  r.# will be impl
9d80: 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 61 6c  emented as a cal
9d90: 6c 20 74 6f 20 22 72 65 67 65 78 70 28 59 2c 58  l to "regexp(Y,X
9da0: 29 22 2e 0a 23 0a 70 72 6f 63 20 72 65 67 65 78  )"..#.proc regex
9db0: 70 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b 0a 20  pfunc {args} {. 
9dc0: 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20 3a 3a   eval lappend ::
9dd0: 72 65 67 65 78 70 61 72 67 73 20 24 61 72 67 73  regexpargs $args
9de0: 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a 64 62  .  return 1.}.db
9df0: 20 66 75 6e 63 20 72 65 67 65 78 70 20 2d 61 72   func regexp -ar
9e00: 67 63 6f 75 6e 74 20 32 20 72 65 67 65 78 70 66  gcount 2 regexpf
9e10: 75 6e 63 0a 73 65 74 20 3a 3a 72 65 67 65 78 70  unc.set ::regexp
9e20: 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65  args [list].do_e
9e30: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
9e40: 70 72 2d 31 38 2e 32 2e 31 20 7b 20 53 45 4c 45  pr-18.2.1 { SELE
9e50: 43 54 20 27 61 62 63 27 20 52 45 47 45 58 50 20  CT 'abc' REGEXP 
9e60: 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73  'def' } 1.do_tes
9e70: 74 20 20 20 20 20 20 20 20 20 65 5f 65 78 70 72  t         e_expr
9e80: 2d 31 38 2e 32 2e 32 20 7b 20 73 65 74 20 72 65  -18.2.2 { set re
9e90: 67 65 78 70 61 72 67 73 20 7d 20 7b 64 65 66 20  gexpargs } {def 
9ea0: 61 62 63 7d 0a 73 65 74 20 3a 3a 72 65 67 65 78  abc}.set ::regex
9eb0: 70 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f  pargs [list].do_
9ec0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
9ed0: 78 70 72 2d 31 38 2e 32 2e 33 20 7b 20 53 45 4c  xpr-18.2.3 { SEL
9ee0: 45 43 54 20 27 58 27 20 4e 4f 54 20 52 45 47 45  ECT 'X' NOT REGE
9ef0: 58 50 20 27 59 27 20 7d 20 30 0a 64 6f 5f 74 65  XP 'Y' } 0.do_te
9f00: 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78 70  st         e_exp
9f10: 72 2d 31 38 2e 32 2e 34 20 7b 20 73 65 74 20 72  r-18.2.4 { set r
9f20: 65 67 65 78 70 61 72 67 73 20 7d 20 7b 59 20 58  egexpargs } {Y X
9f30: 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  }.sqlite3 db tes
9f40: 74 2e 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45  t.db..# EVIDENCE
9f50: 2d 4f 46 3a 20 52 2d 34 32 30 33 37 2d 33 37 38  -OF: R-42037-378
9f60: 32 36 20 54 68 65 20 64 65 66 61 75 6c 74 20 6d  26 The default m
9f70: 61 74 63 68 28 29 20 66 75 6e 63 74 69 6f 6e 20  atch() function 
9f80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 23  implementation.#
9f90: 20 72 61 69 73 65 73 20 61 6e 20 65 78 63 65 70   raises an excep
9fa0: 74 69 6f 6e 20 61 6e 64 20 69 73 20 6e 6f 74 20  tion and is not 
9fb0: 72 65 61 6c 6c 79 20 75 73 65 66 75 6c 20 66 6f  really useful fo
9fc0: 72 20 61 6e 79 74 68 69 6e 67 2e 0a 23 0a 64 6f  r anything..#.do
9fd0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
9fe0: 5f 65 78 70 72 2d 31 39 2e 31 2e 31 20 7b 20 0a  _expr-19.1.1 { .
9ff0: 20 20 53 45 4c 45 43 54 20 27 61 62 63 27 20 4d    SELECT 'abc' M
a000: 41 54 43 48 20 27 64 65 66 27 20 0a 7d 20 7b 31  ATCH 'def' .} {1
a010: 20 7b 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20   {unable to use 
a020: 66 75 6e 63 74 69 6f 6e 20 4d 41 54 43 48 20 69  function MATCH i
a030: 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
a040: 63 6f 6e 74 65 78 74 7d 7d 0a 64 6f 5f 63 61 74  context}}.do_cat
a050: 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  chsql_test e_exp
a060: 72 2d 31 39 2e 31 2e 32 20 7b 20 0a 20 20 53 45  r-19.1.2 { .  SE
a070: 4c 45 43 54 20 6d 61 74 63 68 28 27 61 62 63 27  LECT match('abc'
a080: 2c 20 27 64 65 66 27 29 0a 7d 20 7b 31 20 7b 75  , 'def').} {1 {u
a090: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 66 75 6e  nable to use fun
a0a0: 63 74 69 6f 6e 20 4d 41 54 43 48 20 69 6e 20 74  ction MATCH in t
a0b0: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6e  he requested con
a0c0: 74 65 78 74 7d 7d 0a 0a 23 20 45 56 49 44 45 4e  text}}..# EVIDEN
a0d0: 43 45 2d 4f 46 3a 20 52 2d 33 37 39 31 36 2d 34  CE-OF: R-37916-4
a0e0: 37 34 30 37 20 54 68 65 20 4d 41 54 43 48 20 6f  7407 The MATCH o
a0f0: 70 65 72 61 74 6f 72 20 69 73 20 61 20 73 70 65  perator is a spe
a100: 63 69 61 6c 20 73 79 6e 74 61 78 20 66 6f 72 0a  cial syntax for.
a110: 23 20 74 68 65 20 6d 61 74 63 68 28 29 20 61 70  # the match() ap
a120: 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e 65  plication-define
a130: 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 23 20  d function..#.# 
a140: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
a150: 36 30 32 31 2d 30 39 33 37 33 20 42 75 74 20 65  6021-09373 But e
a160: 78 74 65 6e 73 69 6f 6e 73 20 63 61 6e 20 6f 76  xtensions can ov
a170: 65 72 72 69 64 65 20 74 68 65 20 6d 61 74 63 68  erride the match
a180: 28 29 0a 23 20 66 75 6e 63 74 69 6f 6e 20 77 69  ().# function wi
a190: 74 68 20 6d 6f 72 65 20 68 65 6c 70 66 75 6c 20  th more helpful 
a1a0: 6c 6f 67 69 63 2e 0a 23 0a 70 72 6f 63 20 6d 61  logic..#.proc ma
a1b0: 74 63 68 66 75 6e 63 20 7b 61 72 67 73 7d 20 7b  tchfunc {args} {
a1c0: 0a 20 20 65 76 61 6c 20 6c 61 70 70 65 6e 64 20  .  eval lappend 
a1d0: 3a 3a 6d 61 74 63 68 61 72 67 73 20 24 61 72 67  ::matchargs $arg
a1e0: 73 0a 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a 64  s.  return 1.}.d
a1f0: 62 20 66 75 6e 63 20 6d 61 74 63 68 20 2d 61 72  b func match -ar
a200: 67 63 6f 75 6e 74 20 32 20 6d 61 74 63 68 66 75  gcount 2 matchfu
a210: 6e 63 0a 73 65 74 20 3a 3a 6d 61 74 63 68 61 72  nc.set ::matchar
a220: 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65  gs [list].do_exe
a230: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
a240: 2d 31 39 2e 32 2e 31 20 7b 20 53 45 4c 45 43 54  -19.2.1 { SELECT
a250: 20 27 61 62 63 27 20 4d 41 54 43 48 20 27 64 65   'abc' MATCH 'de
a260: 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73 74 20 20  f' } 1.do_test  
a270: 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d 31 39         e_expr-19
a280: 2e 32 2e 32 20 7b 20 73 65 74 20 6d 61 74 63 68  .2.2 { set match
a290: 61 72 67 73 20 7d 20 7b 64 65 66 20 61 62 63 7d  args } {def abc}
a2a0: 0a 73 65 74 20 3a 3a 6d 61 74 63 68 61 72 67 73  .set ::matchargs
a2b0: 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73   [list].do_execs
a2c0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
a2d0: 39 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 27  9.2.3 { SELECT '
a2e0: 58 27 20 4e 4f 54 20 4d 41 54 43 48 20 27 59 27  X' NOT MATCH 'Y'
a2f0: 20 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20 20 20   } 0.do_test    
a300: 20 20 20 20 20 65 5f 65 78 70 72 2d 31 39 2e 32       e_expr-19.2
a310: 2e 34 20 7b 20 73 65 74 20 6d 61 74 63 68 61 72  .4 { set matchar
a320: 67 73 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69 74  gs } {Y X}.sqlit
a330: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 23  e3 db test.db..#
a340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
a390: 20 63 61 73 65 73 20 66 6f 72 20 74 68 65 20 74   cases for the t
a3a0: 65 73 74 61 62 6c 65 20 73 74 61 74 65 6d 65 6e  estable statemen
a3b0: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68  ts related to th
a3c0: 65 20 43 41 53 45 20 65 78 70 72 65 73 73 69 6f  e CASE expressio
a3d0: 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  n..#.# EVIDENCE-
a3e0: 4f 46 3a 20 52 2d 31 35 31 39 39 2d 36 31 33 38  OF: R-15199-6138
a3f0: 39 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  9 There are two 
a400: 62 61 73 69 63 20 66 6f 72 6d 73 20 6f 66 20 74  basic forms of t
a410: 68 65 20 43 41 53 45 0a 23 20 65 78 70 72 65 73  he CASE.# expres
a420: 73 69 6f 6e 3a 20 74 68 6f 73 65 20 77 69 74 68  sion: those with
a430: 20 61 20 62 61 73 65 20 65 78 70 72 65 73 73 69   a base expressi
a440: 6f 6e 20 61 6e 64 20 74 68 6f 73 65 20 77 69 74  on and those wit
a450: 68 6f 75 74 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  hout..#.do_execs
a460: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
a470: 30 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  0.1 {.  SELECT C
a480: 41 53 45 20 57 48 45 4e 20 31 20 54 48 45 4e 20  ASE WHEN 1 THEN 
a490: 27 74 72 75 65 27 20 57 48 45 4e 20 30 20 54 48  'true' WHEN 0 TH
a4a0: 45 4e 20 27 66 61 6c 73 65 27 20 45 4c 53 45 20  EN 'false' ELSE 
a4b0: 27 65 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74  'else' END;.} {t
a4c0: 72 75 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  rue}.do_execsql_
a4d0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 30 2e 32  test e_expr-20.2
a4e0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
a4f0: 20 30 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27   0 WHEN 1 THEN '
a500: 74 72 75 65 27 20 57 48 45 4e 20 30 20 54 48 45  true' WHEN 0 THE
a510: 4e 20 27 66 61 6c 73 65 27 20 45 4c 53 45 20 27  N 'false' ELSE '
a520: 65 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66 61  else' END;.} {fa
a530: 6c 73 65 7d 0a 0a 70 72 6f 63 20 76 61 72 20 7b  lse}..proc var {
a540: 6e 6d 7d 20 7b 0a 20 20 6c 61 70 70 65 6e 64 20  nm} {.  lappend 
a550: 3a 3a 76 61 72 6c 69 73 74 20 24 6e 6d 0a 20 20  ::varlist $nm.  
a560: 72 65 74 75 72 6e 20 5b 73 65 74 20 22 3a 3a 24  return [set "::$
a570: 6e 6d 22 5d 0a 7d 0a 64 62 20 66 75 6e 63 20 76  nm"].}.db func v
a580: 61 72 20 76 61 72 0a 0a 23 20 45 56 49 44 45 4e  ar var..# EVIDEN
a590: 43 45 2d 4f 46 3a 20 52 2d 33 30 36 33 38 2d 35  CE-OF: R-30638-5
a5a0: 39 39 35 34 20 49 6e 20 61 20 43 41 53 45 20 77  9954 In a CASE w
a5b0: 69 74 68 6f 75 74 20 61 20 62 61 73 65 20 65 78  ithout a base ex
a5c0: 70 72 65 73 73 69 6f 6e 2c 20 65 61 63 68 0a 23  pression, each.#
a5d0: 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e   WHEN expression
a5e0: 20 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e   is evaluated an
a5f0: 64 20 74 68 65 20 72 65 73 75 6c 74 20 74 72 65  d the result tre
a600: 61 74 65 64 20 61 73 20 61 20 62 6f 6f 6c 65 61  ated as a boolea
a610: 6e 2c 0a 23 20 73 74 61 72 74 69 6e 67 20 77 69  n,.# starting wi
a620: 74 68 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20  th the leftmost 
a630: 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
a640: 6f 20 74 68 65 20 72 69 67 68 74 2e 0a 23 0a 66  o the right..#.f
a650: 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b  oreach {a b c} {
a660: 30 20 30 20 30 7d 20 62 72 65 61 6b 0a 73 65 74  0 0 0} break.set
a670: 20 76 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a   varlist [list].
a680: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
a690: 65 5f 65 78 70 72 2d 32 31 2e 31 2e 31 20 7b 0a  e_expr-21.1.1 {.
a6a0: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48    SELECT CASE WH
a6b0: 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e  EN var('a') THEN
a6c0: 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20   'A' .          
a6d0: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62 27      WHEN var('b'
a6e0: 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20  ) THEN 'B' .    
a6f0: 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76            WHEN v
a700: 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43 27  ar('c') THEN 'C'
a710: 20 45 4e 44 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f 74   END.} {{}}.do_t
a720: 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 31 2e  est e_expr-21.1.
a730: 32 20 7b 20 73 65 74 20 76 61 72 6c 69 73 74 20  2 { set varlist 
a740: 7d 20 7b 61 20 62 20 63 7d 0a 73 65 74 20 76 61  } {a b c}.set va
a750: 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f  rlist [list].do_
a760: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
a770: 78 70 72 2d 32 31 2e 31 2e 33 20 7b 0a 20 20 53  xpr-21.1.3 {.  S
a780: 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20  ELECT CASE WHEN 
a790: 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43  var('c') THEN 'C
a7a0: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
a7b0: 20 57 48 45 4e 20 76 61 72 28 27 62 27 29 20 54   WHEN var('b') T
a7c0: 48 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20  HEN 'B' .       
a7d0: 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28         WHEN var(
a7e0: 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20  'a') THEN 'A' . 
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c 53               ELS
a800: 45 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20  E 'no result'.  
a810: 45 4e 44 0a 7d 20 7b 7b 6e 6f 20 72 65 73 75 6c  END.} {{no resul
a820: 74 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78  t}}.do_test e_ex
a830: 70 72 2d 32 31 2e 31 2e 34 20 7b 20 73 65 74 20  pr-21.1.4 { set 
a840: 76 61 72 6c 69 73 74 20 7d 20 7b 63 20 62 20 61  varlist } {c b a
a850: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
a860: 3a 20 52 2d 33 39 30 30 39 2d 32 35 35 39 36 20  : R-39009-25596 
a870: 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  The result of th
a880: 65 20 43 41 53 45 20 65 78 70 72 65 73 73 69 6f  e CASE expressio
a890: 6e 20 69 73 20 74 68 65 0a 23 20 65 76 61 6c 75  n is the.# evalu
a8a0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 54 48 45  ation of the THE
a8b0: 4e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  N expression tha
a8c0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
a8d0: 20 74 68 65 20 66 69 72 73 74 20 57 48 45 4e 0a   the first WHEN.
a8e0: 23 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  # expression tha
a8f0: 74 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 74  t evaluates to t
a900: 72 75 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  rue..#.foreach {
a910: 61 20 62 20 63 7d 20 7b 30 20 31 20 30 7d 20 62  a b c} {0 1 0} b
a920: 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  reak.do_execsql_
a930: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 32  test e_expr-21.2
a940: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .1 {.  SELECT CA
a950: 53 45 20 57 48 45 4e 20 76 61 72 28 27 61 27 29  SE WHEN var('a')
a960: 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20   THEN 'A' .     
a970: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61           WHEN va
a980: 72 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20  r('b') THEN 'B' 
a990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
a9a0: 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45  HEN var('c') THE
a9b0: 4e 20 27 43 27 20 0a 20 20 20 20 20 20 20 20 20  N 'C' .         
a9c0: 20 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72 65       ELSE 'no re
a9d0: 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 42  sult'.  END.} {B
a9e0: 7d 0a 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63  }.foreach {a b c
a9f0: 7d 20 7b 30 20 31 20 31 7d 20 62 72 65 61 6b 0a  } {0 1 1} break.
aa00: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
aa10: 65 5f 65 78 70 72 2d 32 31 2e 32 2e 32 20 7b 0a  e_expr-21.2.2 {.
aa20: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48    SELECT CASE WH
aa30: 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e  EN var('a') THEN
aa40: 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20   'A' .          
aa50: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62 27      WHEN var('b'
aa60: 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20  ) THEN 'B' .    
aa70: 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76            WHEN v
aa80: 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43 27  ar('c') THEN 'C'
aa90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
aaa0: 4c 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a  LSE 'no result'.
aab0: 20 20 45 4e 44 0a 7d 20 7b 42 7d 0a 66 6f 72 65    END.} {B}.fore
aac0: 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20 30  ach {a b c} {0 0
aad0: 20 31 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78 65   1} break.do_exe
aae0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
aaf0: 2d 32 31 2e 32 2e 33 20 7b 0a 20 20 53 45 4c 45  -21.2.3 {.  SELE
ab00: 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61 72  CT CASE WHEN var
ab10: 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a  ('a') THEN 'A' .
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
ab30: 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e  EN var('b') THEN
ab40: 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20   'B' .          
ab50: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63 27      WHEN var('c'
ab60: 29 20 54 48 45 4e 20 27 43 27 0a 20 20 20 20 20  ) THEN 'C'.     
ab70: 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 27 6e           ELSE 'n
ab80: 6f 20 72 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a  o result'.  END.
ab90: 7d 20 7b 43 7d 0a 0a 23 20 45 56 49 44 45 4e 43  } {C}..# EVIDENC
aba0: 45 2d 4f 46 3a 20 52 2d 32 34 32 32 37 2d 30 34  E-OF: R-24227-04
abb0: 38 30 37 20 4f 72 2c 20 69 66 20 6e 6f 6e 65 20  807 Or, if none 
abc0: 6f 66 20 74 68 65 20 57 48 45 4e 20 65 78 70 72  of the WHEN expr
abd0: 65 73 73 69 6f 6e 73 0a 23 20 65 76 61 6c 75 61  essions.# evalua
abe0: 74 65 20 74 6f 20 74 72 75 65 2c 20 74 68 65 20  te to true, the 
abf0: 72 65 73 75 6c 74 20 6f 66 20 65 76 61 6c 75 61  result of evalua
ac00: 74 69 6e 67 20 74 68 65 20 45 4c 53 45 20 65 78  ting the ELSE ex
ac10: 70 72 65 73 73 69 6f 6e 2c 20 69 66 0a 23 20 61  pression, if.# a
ac20: 6e 79 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 61  ny..#.foreach {a
ac30: 20 62 20 63 7d 20 7b 30 20 30 20 30 7d 20 62 72   b c} {0 0 0} br
ac40: 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  eak.do_execsql_t
ac50: 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 33 2e  est e_expr-21.3.
ac60: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  1 {.  SELECT CAS
ac70: 45 20 57 48 45 4e 20 76 61 72 28 27 61 27 29 20  E WHEN var('a') 
ac80: 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20  THEN 'A' .      
ac90: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
aca0: 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a  ('b') THEN 'B' .
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
acc0: 45 4e 20 76 61 72 28 27 63 27 29 20 54 48 45 4e  EN var('c') THEN
acd0: 20 27 43 27 0a 20 20 20 20 20 20 20 20 20 20 20   'C'.           
ace0: 20 20 20 45 4c 53 45 20 27 6e 6f 20 72 65 73 75     ELSE 'no resu
acf0: 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 7b 6e 6f  lt'.  END.} {{no
ad00: 20 72 65 73 75 6c 74 7d 7d 0a 0a 23 20 45 56 49   result}}..# EVI
ad10: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 31 36  DENCE-OF: R-1416
ad20: 38 2d 30 37 35 37 39 20 49 66 20 74 68 65 72 65  8-07579 If there
ad30: 20 69 73 20 6e 6f 20 45 4c 53 45 20 65 78 70 72   is no ELSE expr
ad40: 65 73 73 69 6f 6e 20 61 6e 64 20 6e 6f 6e 65 20  ession and none 
ad50: 6f 66 0a 23 20 74 68 65 20 57 48 45 4e 20 65 78  of.# the WHEN ex
ad60: 70 72 65 73 73 69 6f 6e 73 20 61 72 65 20 74 72  pressions are tr
ad70: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 76 65  ue, then the ove
ad80: 72 61 6c 6c 20 72 65 73 75 6c 74 20 69 73 20 4e  rall result is N
ad90: 55 4c 4c 2e 0a 23 0a 64 62 20 6e 75 6c 6c 76 61  ULL..#.db nullva
ada0: 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63  lue null.do_exec
adb0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
adc0: 32 31 2e 33 2e 32 20 7b 0a 20 20 53 45 4c 45 43  21.3.2 {.  SELEC
add0: 54 20 43 41 53 45 20 57 48 45 4e 20 76 61 72 28  T CASE WHEN var(
ade0: 27 61 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20  'a') THEN 'A' . 
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
ae00: 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e 20  N var('b') THEN 
ae10: 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'B' .           
ae20: 20 20 20 57 48 45 4e 20 76 61 72 28 27 63 27 29     WHEN var('c')
ae30: 20 54 48 45 4e 20 27 43 27 0a 20 20 45 4e 44 0a   THEN 'C'.  END.
ae40: 7d 20 7b 6e 75 6c 6c 7d 0a 64 62 20 6e 75 6c 6c  } {null}.db null
ae50: 76 61 6c 75 65 20 7b 7d 0a 0a 23 20 45 56 49 44  value {}..# EVID
ae60: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 39 34 33  ENCE-OF: R-13943
ae70: 2d 31 33 35 39 32 20 41 20 4e 55 4c 4c 20 72 65  -13592 A NULL re
ae80: 73 75 6c 74 20 69 73 20 63 6f 6e 73 69 64 65 72  sult is consider
ae90: 65 64 20 75 6e 74 72 75 65 20 77 68 65 6e 0a 23  ed untrue when.#
aea0: 20 65 76 61 6c 75 61 74 69 6e 67 20 57 48 45 4e   evaluating WHEN
aeb0: 20 74 65 72 6d 73 2e 0a 23 0a 64 6f 5f 65 78 65   terms..#.do_exe
aec0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
aed0: 2d 32 31 2e 34 2e 31 20 7b 0a 20 20 53 45 4c 45  -21.4.1 {.  SELE
aee0: 43 54 20 43 41 53 45 20 57 48 45 4e 20 4e 55 4c  CT CASE WHEN NUL
aef0: 4c 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20  L THEN 'A' WHEN 
af00: 31 20 54 48 45 4e 20 27 42 27 20 45 4e 44 0a 7d  1 THEN 'B' END.}
af10: 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {B}.do_execsql_
af20: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 34  test e_expr-21.4
af30: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .2 {.  SELECT CA
af40: 53 45 20 57 48 45 4e 20 30 20 54 48 45 4e 20 27  SE WHEN 0 THEN '
af50: 41 27 20 57 48 45 4e 20 4e 55 4c 4c 20 54 48 45  A' WHEN NULL THE
af60: 4e 20 27 42 27 20 45 4c 53 45 20 27 43 27 20 45  N 'B' ELSE 'C' E
af70: 4e 44 0a 7d 20 7b 43 7d 0a 0a 23 20 45 56 49 44  ND.} {C}..# EVID
af80: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 38 36 32 30  ENCE-OF: R-38620
af90: 2d 31 39 34 39 39 20 49 6e 20 61 20 43 41 53 45  -19499 In a CASE
afa0: 20 77 69 74 68 20 61 20 62 61 73 65 20 65 78 70   with a base exp
afb0: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 62 61 73  ression, the bas
afc0: 65 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20 69  e.# expression i
afd0: 73 20 65 76 61 6c 75 61 74 65 64 20 6a 75 73 74  s evaluated just
afe0: 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 20 72 65   once and the re
aff0: 73 75 6c 74 20 69 73 20 63 6f 6d 70 61 72 65 64  sult is compared
b000: 20 61 67 61 69 6e 73 74 0a 23 20 74 68 65 20 65   against.# the e
b010: 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 65 61 63  valuation of eac
b020: 68 20 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f  h WHEN expressio
b030: 6e 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  n from left to r
b040: 69 67 68 74 2e 0a 23 0a 23 20 4e 6f 74 65 3a 20  ight..#.# Note: 
b050: 54 68 69 73 20 74 65 73 74 20 63 61 73 65 20 74  This test case t
b060: 65 73 74 73 20 74 68 65 20 22 65 76 61 6c 75 61  ests the "evalua
b070: 74 65 64 20 6a 75 73 74 20 6f 6e 63 65 22 20 70  ted just once" p
b080: 61 72 74 20 6f 66 20 74 68 65 20 61 62 6f 76 65  art of the above
b090: 0a 23 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 65  .# statement. Te
b0a0: 73 74 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  sts associated w
b0b0: 69 74 68 20 74 68 65 20 6e 65 78 74 20 74 77 6f  ith the next two
b0c0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 65 73 74   statements test
b0d0: 20 74 68 61 74 20 74 68 65 0a 23 20 63 6f 6d 70   that the.# comp
b0e0: 61 72 69 73 6f 6e 73 20 74 61 6b 65 20 70 6c 61  arisons take pla
b0f0: 63 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 61  ce..#.foreach {a
b100: 20 62 20 63 7d 20 5b 6c 69 73 74 20 5b 65 78 70   b c} [list [exp
b110: 72 20 33 5d 20 5b 65 78 70 72 20 34 5d 20 5b 65  r 3] [expr 4] [e
b120: 78 70 72 20 35 5d 5d 20 62 72 65 61 6b 0a 73 65  xpr 5]] break.se
b130: 74 20 3a 3a 76 61 72 6c 69 73 74 20 5b 6c 69 73  t ::varlist [lis
b140: 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  t].do_execsql_te
b150: 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 31 2e 31  st e_expr-22.1.1
b160: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
b170: 20 76 61 72 28 27 61 27 29 20 57 48 45 4e 20 31   var('a') WHEN 1
b180: 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32   THEN 'A' WHEN 2
b190: 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20 33   THEN 'B' WHEN 3
b1a0: 20 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20   THEN 'C' END.} 
b1b0: 7b 43 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78  {C}.do_test e_ex
b1c0: 70 72 2d 32 32 2e 31 2e 32 20 7b 20 73 65 74 20  pr-22.1.2 { set 
b1d0: 3a 3a 76 61 72 6c 69 73 74 20 7d 20 7b 61 7d 0a  ::varlist } {a}.
b1e0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
b1f0: 52 2d 30 37 36 36 37 2d 34 39 35 33 37 20 54 68  R-07667-49537 Th
b200: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
b210: 43 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20  CASE expression 
b220: 69 73 20 74 68 65 0a 23 20 65 76 61 6c 75 61 74  is the.# evaluat
b230: 69 6f 6e 20 6f 66 20 74 68 65 20 54 48 45 4e 20  ion of the THEN 
b240: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
b250: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
b260: 68 65 20 66 69 72 73 74 20 57 48 45 4e 0a 23 20  he first WHEN.# 
b270: 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 77  expression for w
b280: 68 69 63 68 20 74 68 65 20 63 6f 6d 70 61 72 69  hich the compari
b290: 73 6f 6e 20 69 73 20 74 72 75 65 2e 0a 23 0a 64  son is true..#.d
b2a0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
b2b0: 5f 65 78 70 72 2d 32 32 2e 32 2e 31 20 7b 0a 20  _expr-22.2.1 {. 
b2c0: 20 53 45 4c 45 43 54 20 43 41 53 45 20 32 33 20   SELECT CASE 23 
b2d0: 57 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20  WHEN 1 THEN 'A' 
b2e0: 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27  WHEN 23 THEN 'B'
b2f0: 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43   WHEN 23 THEN 'C
b300: 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f 65  ' END.} {B}.do_e
b310: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
b320: 70 72 2d 32 32 2e 32 2e 32 20 7b 0a 20 20 53 45  pr-22.2.2 {.  SE
b330: 4c 45 43 54 20 43 41 53 45 20 31 20 57 48 45 4e  LECT CASE 1 WHEN
b340: 20 31 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e   1 THEN 'A' WHEN
b350: 20 32 33 20 54 48 45 4e 20 27 42 27 20 57 48 45   23 THEN 'B' WHE
b360: 4e 20 32 33 20 54 48 45 4e 20 27 43 27 20 45 4e  N 23 THEN 'C' EN
b370: 44 0a 7d 20 7b 41 7d 0a 0a 23 20 45 56 49 44 45  D.} {A}..# EVIDE
b380: 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 35 34 33 2d  NCE-OF: R-47543-
b390: 33 32 31 34 35 20 4f 72 2c 20 69 66 20 6e 6f 6e  32145 Or, if non
b3a0: 65 20 6f 66 20 74 68 65 20 57 48 45 4e 20 65 78  e of the WHEN ex
b3b0: 70 72 65 73 73 69 6f 6e 73 0a 23 20 65 76 61 6c  pressions.# eval
b3c0: 75 61 74 65 20 74 6f 20 61 20 76 61 6c 75 65 20  uate to a value 
b3d0: 65 71 75 61 6c 20 74 6f 20 74 68 65 20 62 61 73  equal to the bas
b3e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  e expression, th
b3f0: 65 20 72 65 73 75 6c 74 20 6f 66 0a 23 20 65 76  e result of.# ev
b400: 61 6c 75 61 74 69 6e 67 20 74 68 65 20 45 4c 53  aluating the ELS
b410: 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66  E expression, if
b420: 20 61 6e 79 2e 0a 23 0a 64 6f 5f 65 78 65 63 73   any..#.do_execs
b430: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
b440: 32 2e 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  2.3.1 {.  SELECT
b450: 20 43 41 53 45 20 32 34 20 57 48 45 4e 20 31 20   CASE 24 WHEN 1 
b460: 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 32 33  THEN 'A' WHEN 23
b470: 20 54 48 45 4e 20 27 42 27 20 57 48 45 4e 20 32   THEN 'B' WHEN 2
b480: 33 20 54 48 45 4e 20 27 43 27 20 45 4c 53 45 20  3 THEN 'C' ELSE 
b490: 27 44 27 20 45 4e 44 0a 7d 20 7b 44 7d 0a 0a 23  'D' END.} {D}..#
b4a0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
b4b0: 35 34 37 32 31 2d 34 38 35 35 37 20 49 66 20 74  54721-48557 If t
b4c0: 68 65 72 65 20 69 73 20 6e 6f 20 45 4c 53 45 20  here is no ELSE 
b4d0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6e  expression and n
b4e0: 6f 6e 65 20 6f 66 0a 23 20 74 68 65 20 57 48 45  one of.# the WHE
b4f0: 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72  N expressions pr
b500: 6f 64 75 63 65 20 61 20 72 65 73 75 6c 74 20 65  oduce a result e
b510: 71 75 61 6c 20 74 6f 20 74 68 65 20 62 61 73 65  qual to the base
b520: 20 65 78 70 72 65 73 73 69 6f 6e 2c 0a 23 20 74   expression,.# t
b530: 68 65 20 6f 76 65 72 61 6c 6c 20 72 65 73 75 6c  he overall resul
b540: 74 20 69 73 20 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f  t is NULL..#.do_
b550: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
b560: 78 70 72 2d 32 32 2e 34 2e 31 20 7b 0a 20 20 53  xpr-22.4.1 {.  S
b570: 45 4c 45 43 54 20 43 41 53 45 20 32 34 20 57 48  ELECT CASE 24 WH
b580: 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57 48  EN 1 THEN 'A' WH
b590: 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20 57  EN 23 THEN 'B' W
b5a0: 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27 20  HEN 23 THEN 'C' 
b5b0: 45 4e 44 0a 7d 20 7b 7b 7d 7d 0a 64 62 20 6e 75  END.} {{}}.db nu
b5c0: 6c 6c 76 61 6c 75 65 20 6e 75 6c 6c 0a 64 6f 5f  llvalue null.do_
b5d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
b5e0: 78 70 72 2d 32 32 2e 34 2e 32 20 7b 0a 20 20 53  xpr-22.4.2 {.  S
b5f0: 45 4c 45 43 54 20 43 41 53 45 20 32 34 20 57 48  ELECT CASE 24 WH
b600: 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20 57 48  EN 1 THEN 'A' WH
b610: 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27 20 57  EN 23 THEN 'B' W
b620: 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43 27 20  HEN 23 THEN 'C' 
b630: 45 4e 44 0a 7d 20 7b 6e 75 6c 6c 7d 0a 64 62 20  END.} {null}.db 
b640: 6e 75 6c 6c 76 61 6c 75 65 20 7b 7d 0a 0a 23 20  nullvalue {}..# 
b650: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
b660: 31 34 37 39 2d 36 32 37 37 34 20 57 68 65 6e 20  1479-62774 When 
b670: 63 6f 6d 70 61 72 69 6e 67 20 61 20 62 61 73 65  comparing a base
b680: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
b690: 6e 73 74 20 61 0a 23 20 57 48 45 4e 20 65 78 70  nst a.# WHEN exp
b6a0: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 73 61 6d  ression, the sam
b6b0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
b6c0: 65 6e 63 65 2c 20 61 66 66 69 6e 69 74 79 2c 20  ence, affinity, 
b6d0: 61 6e 64 0a 23 20 4e 55 4c 4c 2d 68 61 6e 64 6c  and.# NULL-handl
b6e0: 69 6e 67 20 72 75 6c 65 73 20 61 70 70 6c 79 20  ing rules apply 
b6f0: 61 73 20 69 66 20 74 68 65 20 62 61 73 65 20 65  as if the base e
b700: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 57 48  xpression and WH
b710: 45 4e 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20  EN.# expression 
b720: 61 72 65 20 72 65 73 70 65 63 74 69 76 65 6c 79  are respectively
b730: 20 74 68 65 20 6c 65 66 74 2d 20 61 6e 64 20 72   the left- and r
b740: 69 67 68 74 2d 68 61 6e 64 20 6f 70 65 72 61 6e  ight-hand operan
b750: 64 73 20 6f 66 20 61 6e 20 3d 0a 23 20 6f 70 65  ds of an =.# ope
b760: 72 61 74 6f 72 2e 0a 23 0a 70 72 6f 63 20 72 65  rator..#.proc re
b770: 76 20 7b 73 74 72 7d 20 7b 0a 20 20 73 65 74 20  v {str} {.  set 
b780: 72 65 74 20 22 22 0a 20 20 73 65 74 20 63 68 61  ret "".  set cha
b790: 72 73 20 5b 73 70 6c 69 74 20 24 73 74 72 5d 0a  rs [split $str].
b7a0: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 5b 65 78    for {set i [ex
b7b0: 70 72 20 5b 6c 6c 65 6e 67 74 68 20 24 63 68 61  pr [llength $cha
b7c0: 72 73 5d 2d 31 5d 7d 20 7b 24 69 3e 3d 30 7d 20  rs]-1]} {$i>=0} 
b7d0: 7b 69 6e 63 72 20 69 20 2d 31 7d 20 7b 0a 20 20  {incr i -1} {.  
b7e0: 20 20 61 70 70 65 6e 64 20 72 65 74 20 5b 6c 69    append ret [li
b7f0: 6e 64 65 78 20 24 63 68 61 72 73 20 24 69 5d 0a  ndex $chars $i].
b800: 20 20 7d 0a 20 20 73 65 74 20 72 65 74 0a 7d 0a    }.  set ret.}.
b810: 70 72 6f 63 20 72 65 76 65 72 73 65 20 7b 6c 68  proc reverse {lh
b820: 73 20 72 68 73 7d 20 7b 0a 20 20 73 74 72 69 6e  s rhs} {.  strin
b830: 67 20 63 6f 6d 70 61 72 65 20 5b 72 65 76 20 24  g compare [rev $
b840: 6c 68 73 5d 20 5b 72 65 76 20 24 72 68 73 5d 0a  lhs] [rev $rhs].
b850: 7d 0a 64 62 20 63 6f 6c 6c 61 74 65 20 72 65 76  }.db collate rev
b860: 65 72 73 65 20 72 65 76 65 72 73 65 0a 64 6f 5f  erse reverse.do_
b870: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
b880: 78 70 72 2d 32 33 2e 31 2e 31 20 7b 0a 20 20 43  xpr-23.1.1 {.  C
b890: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 0a  REATE TABLE t1(.
b8a0: 20 20 20 20 61 20 54 45 58 54 20 20 20 20 20 43      a TEXT     C
b8b0: 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c 0a 20  OLLATE NOCASE,. 
b8c0: 20 20 20 62 20 20 20 20 20 20 20 20 20 20 43 4f     b          CO
b8d0: 4c 4c 41 54 45 20 52 45 56 45 52 53 45 2c 0a 20  LLATE REVERSE,. 
b8e0: 20 20 20 63 20 49 4e 54 45 47 45 52 2c 0a 20 20     c INTEGER,.  
b8f0: 20 20 64 20 42 4c 4f 42 0a 20 20 29 3b 0a 20 20    d BLOB.  );.  
b900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
b910: 41 4c 55 45 53 28 27 61 62 63 27 2c 20 27 63 62  ALUES('abc', 'cb
b920: 61 27 2c 20 35 35 2c 20 33 34 2e 35 29 3b 0a 7d  a', 55, 34.5);.}
b930: 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   {}.do_execsql_t
b940: 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e  est e_expr-23.1.
b950: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  2 {.  SELECT CAS
b960: 45 20 61 20 57 48 45 4e 20 27 78 79 7a 27 20 54  E a WHEN 'xyz' T
b970: 48 45 4e 20 27 41 27 20 57 48 45 4e 20 27 41 62  HEN 'A' WHEN 'Ab
b980: 43 27 20 54 48 45 4e 20 27 42 27 20 45 4e 44 20  C' THEN 'B' END 
b990: 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f  FROM t1.} {B}.do
b9a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
b9b0: 65 78 70 72 2d 32 33 2e 31 2e 33 20 7b 0a 20 20  expr-23.1.3 {.  
b9c0: 53 45 4c 45 43 54 20 43 41 53 45 20 27 41 62 43  SELECT CASE 'AbC
b9d0: 27 20 57 48 45 4e 20 27 61 62 63 27 20 54 48 45  ' WHEN 'abc' THE
b9e0: 4e 20 27 41 27 20 57 48 45 4e 20 61 20 54 48 45  N 'A' WHEN a THE
b9f0: 4e 20 27 42 27 20 45 4e 44 20 46 52 4f 4d 20 74  N 'B' END FROM t
ba00: 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73  1.} {B}.do_execs
ba10: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
ba20: 33 2e 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  3.1.4 {.  SELECT
ba30: 20 43 41 53 45 20 61 20 57 48 45 4e 20 62 20 54   CASE a WHEN b T
ba40: 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42 27  HEN 'A' ELSE 'B'
ba50: 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b   END FROM t1.} {
ba60: 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  B}.do_execsql_te
ba70: 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 35  st e_expr-23.1.5
ba80: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
ba90: 20 62 20 57 48 45 4e 20 61 20 54 48 45 4e 20 27   b WHEN a THEN '
baa0: 41 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 20  A' ELSE 'B' END 
bab0: 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f  FROM t1.} {B}.do
bac0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
bad0: 65 78 70 72 2d 32 33 2e 31 2e 36 20 7b 0a 20 20  expr-23.1.6 {.  
bae0: 53 45 4c 45 43 54 20 43 41 53 45 20 35 35 20 57  SELECT CASE 55 W
baf0: 48 45 4e 20 27 35 35 27 20 54 48 45 4e 20 27 41  HEN '55' THEN 'A
bb00: 27 20 45 4c 53 45 20 27 42 27 20 45 4e 44 0a 7d  ' ELSE 'B' END.}
bb10: 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {B}.do_execsql_
bb20: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31  test e_expr-23.1
bb30: 2e 37 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .7 {.  SELECT CA
bb40: 53 45 20 63 20 57 48 45 4e 20 27 35 35 27 20 54  SE c WHEN '55' T
bb50: 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42 27  HEN 'A' ELSE 'B'
bb60: 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b   END FROM t1.} {
bb70: 41 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  A}.do_execsql_te
bb80: 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 38  st e_expr-23.1.8
bb90: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
bba0: 20 27 33 34 2e 35 27 20 57 48 45 4e 20 64 20 54   '34.5' WHEN d T
bbb0: 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42 27  HEN 'A' ELSE 'B'
bbc0: 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d 20 7b   END FROM t1.} {
bbd0: 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  B}.do_execsql_te
bbe0: 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e 39  st e_expr-23.1.9
bbf0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
bc00: 20 4e 55 4c 4c 20 57 48 45 4e 20 4e 55 4c 4c 20   NULL WHEN NULL 
bc10: 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42  THEN 'A' ELSE 'B
bc20: 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 0a 23 20 45  ' END.} {B}..# E
bc30: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
bc40: 33 30 34 2d 33 39 34 30 35 20 49 66 20 74 68 65  304-39405 If the
bc50: 20 62 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e   base expression
bc60: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68   is NULL then th
bc70: 65 0a 23 20 72 65 73 75 6c 74 20 6f 66 20 74 68  e.# result of th
bc80: 65 20 43 41 53 45 20 69 73 20 61 6c 77 61 79 73  e CASE is always
bc90: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65   the result of e
bca0: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 45 4c  valuating the EL
bcb0: 53 45 0a 23 20 65 78 70 72 65 73 73 69 6f 6e 20  SE.# expression 
bcc0: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 6f 72  if it exists, or
bcd0: 20 4e 55 4c 4c 20 69 66 20 69 74 20 64 6f 65 73   NULL if it does
bce0: 20 6e 6f 74 2e 0a 23 0a 64 6f 5f 65 78 65 63 73   not..#.do_execs
bcf0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
bd00: 34 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  4.1.1 {.  SELECT
bd10: 20 43 41 53 45 20 4e 55 4c 4c 20 57 48 45 4e 20   CASE NULL WHEN 
bd20: 27 61 62 63 27 20 54 48 45 4e 20 27 41 27 20 57  'abc' THEN 'A' W
bd30: 48 45 4e 20 27 64 65 66 27 20 54 48 45 4e 20 27  HEN 'def' THEN '
bd40: 42 27 20 45 4e 44 3b 0a 7d 20 7b 7b 7d 7d 0a 64  B' END;.} {{}}.d
bd50: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
bd60: 5f 65 78 70 72 2d 32 34 2e 31 2e 32 20 7b 0a 20  _expr-24.1.2 {. 
bd70: 20 53 45 4c 45 43 54 20 43 41 53 45 20 4e 55 4c   SELECT CASE NUL
bd80: 4c 20 57 48 45 4e 20 27 61 62 63 27 20 54 48 45  L WHEN 'abc' THE
bd90: 4e 20 27 41 27 20 57 48 45 4e 20 27 64 65 66 27  N 'A' WHEN 'def'
bda0: 20 54 48 45 4e 20 27 42 27 20 45 4c 53 45 20 27   THEN 'B' ELSE '
bdb0: 43 27 20 45 4e 44 3b 0a 7d 20 7b 43 7d 0a 0a 23  C' END;.} {C}..#
bdc0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
bdd0: 35 36 32 38 30 2d 31 37 33 36 39 20 42 6f 74 68  56280-17369 Both
bde0: 20 66 6f 72 6d 73 20 6f 66 20 74 68 65 20 43 41   forms of the CA
bdf0: 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73  SE expression us
be00: 65 20 6c 61 7a 79 2c 0a 23 20 6f 72 20 73 68 6f  e lazy,.# or sho
be10: 72 74 2d 63 69 72 63 75 69 74 2c 20 65 76 61 6c  rt-circuit, eval
be20: 75 61 74 69 6f 6e 2e 0a 23 0a 73 65 74 20 76 61  uation..#.set va
be30: 72 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 66 6f 72  rlist [list].for
be40: 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20  each {a b c} {0 
be50: 31 20 30 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78  1 0} break.do_ex
be60: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
be70: 72 2d 32 35 2e 31 2e 31 20 7b 0a 20 20 53 45 4c  r-25.1.1 {.  SEL
be80: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61  ECT CASE WHEN va
be90: 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20  r('a') THEN 'A' 
bea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
beb0: 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45  HEN var('b') THE
bec0: 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20  N 'B' .         
bed0: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63       WHEN var('c
bee0: 27 29 20 54 48 45 4e 20 27 43 27 20 0a 20 20 45  ') THEN 'C' .  E
bef0: 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f 74 65 73 74  ND.} {B}.do_test
bf00: 20 65 5f 65 78 70 72 2d 32 35 2e 31 2e 32 20 7b   e_expr-25.1.2 {
bf10: 20 73 65 74 20 3a 3a 76 61 72 6c 69 73 74 20 7d   set ::varlist }
bf20: 20 7b 61 20 62 7d 0a 73 65 74 20 76 61 72 6c 69   {a b}.set varli
bf30: 73 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65  st [list].do_exe
bf40: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
bf50: 2d 32 35 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45  -25.1.3 {.  SELE
bf60: 43 54 20 43 41 53 45 20 27 30 27 20 57 48 45 4e  CT CASE '0' WHEN
bf70: 20 76 61 72 28 27 61 27 29 20 54 48 45 4e 20 27   var('a') THEN '
bf80: 41 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  A' .            
bf90: 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27        WHEN var('
bfa0: 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20  b') THEN 'B' .  
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54 48  WHEN var('c') TH
bfd0: 45 4e 20 27 43 27 20 0a 20 20 45 4e 44 0a 7d 20  EN 'C' .  END.} 
bfe0: 7b 41 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78  {A}.do_test e_ex
bff0: 70 72 2d 32 35 2e 31 2e 34 20 7b 20 73 65 74 20  pr-25.1.4 { set 
c000: 3a 3a 76 61 72 6c 69 73 74 20 7d 20 7b 61 7d 0a  ::varlist } {a}.
c010: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
c020: 52 2d 33 34 37 37 33 2d 36 32 32 35 33 20 54 68  R-34773-62253 Th
c030: 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63  e only differenc
c040: 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 66 6f  e between the fo
c050: 6c 6c 6f 77 69 6e 67 0a 23 20 74 77 6f 20 43 41  llowing.# two CA
c060: 53 45 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  SE expressions i
c070: 73 20 74 68 61 74 20 74 68 65 20 78 20 65 78 70  s that the x exp
c080: 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
c090: 61 74 65 64 20 65 78 61 63 74 6c 79 0a 23 20 6f  ated exactly.# o
c0a0: 6e 63 65 20 69 6e 20 74 68 65 20 66 69 72 73 74  nce in the first
c0b0: 20 65 78 61 6d 70 6c 65 20 62 75 74 20 6d 69 67   example but mig
c0c0: 68 74 20 62 65 20 65 76 61 6c 75 61 74 65 64 20  ht be evaluated 
c0d0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 69  multiple times i
c0e0: 6e 20 74 68 65 0a 23 20 73 65 63 6f 6e 64 3a 20  n the.# second: 
c0f0: 43 41 53 45 20 78 20 57 48 45 4e 20 77 31 20 54  CASE x WHEN w1 T
c100: 48 45 4e 20 72 31 20 57 48 45 4e 20 77 32 20 54  HEN r1 WHEN w2 T
c110: 48 45 4e 20 72 32 20 45 4c 53 45 20 72 33 20 45  HEN r2 ELSE r3 E
c120: 4e 44 20 43 41 53 45 20 57 48 45 4e 0a 23 20 78  ND CASE WHEN.# x
c130: 3d 77 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e  =w1 THEN r1 WHEN
c140: 20 78 3d 77 32 20 54 48 45 4e 20 72 32 20 45 4c   x=w2 THEN r2 EL
c150: 53 45 20 72 33 20 45 4e 44 0a 23 0a 70 72 6f 63  SE r3 END.#.proc
c160: 20 63 65 76 61 6c 20 7b 78 7d 20 7b 0a 20 20 69   ceval {x} {.  i
c170: 6e 63 72 20 3a 3a 65 76 61 6c 63 6f 75 6e 74 0a  ncr ::evalcount.
c180: 20 20 72 65 74 75 72 6e 20 24 78 0a 7d 0a 64 62    return $x.}.db
c190: 20 66 75 6e 63 20 63 65 76 61 6c 20 63 65 76 61   func ceval ceva
c1a0: 6c 0a 73 65 74 20 3a 3a 65 76 61 6c 63 6f 75 6e  l.set ::evalcoun
c1b0: 74 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  t 0..do_execsql_
c1c0: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e 31  test e_expr-26.1
c1d0: 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  .1 {.  CREATE TA
c1e0: 42 4c 45 20 74 32 28 78 2c 20 77 31 2c 20 72 31  BLE t2(x, w1, r1
c1f0: 2c 20 77 32 2c 20 72 32 2c 20 72 33 29 3b 0a 20  , w2, r2, r3);. 
c200: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
c210: 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 27 52 31  VALUES(1, 1, 'R1
c220: 27 2c 20 32 2c 20 27 52 32 27 2c 20 27 52 33 27  ', 2, 'R2', 'R3'
c230: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
c240: 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20 31 2c   t2 VALUES(2, 1,
c250: 20 27 52 31 27 2c 20 32 2c 20 27 52 32 27 2c 20   'R1', 2, 'R2', 
c260: 27 52 33 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  'R3');.  INSERT 
c270: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33  INTO t2 VALUES(3
c280: 2c 20 31 2c 20 27 52 31 27 2c 20 32 2c 20 27 52  , 1, 'R1', 2, 'R
c290: 32 27 2c 20 27 52 33 27 29 3b 0a 7d 20 7b 7d 0a  2', 'R3');.} {}.
c2a0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
c2b0: 65 5f 65 78 70 72 2d 32 36 2e 31 2e 32 20 7b 0a  e_expr-26.1.2 {.
c2c0: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 78 20    SELECT CASE x 
c2d0: 57 48 45 4e 20 77 31 20 54 48 45 4e 20 72 31 20  WHEN w1 THEN r1 
c2e0: 57 48 45 4e 20 77 32 20 54 48 45 4e 20 72 32 20  WHEN w2 THEN r2 
c2f0: 45 4c 53 45 20 72 33 20 45 4e 44 20 46 52 4f 4d  ELSE r3 END FROM
c300: 20 74 32 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d   t2.} {R1 R2 R3}
c310: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
c320: 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e 33 20 7b   e_expr-26.1.3 {
c330: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57  .  SELECT CASE W
c340: 48 45 4e 20 78 3d 77 31 20 54 48 45 4e 20 72 31  HEN x=w1 THEN r1
c350: 20 57 48 45 4e 20 78 3d 77 32 20 54 48 45 4e 20   WHEN x=w2 THEN 
c360: 72 32 20 45 4c 53 45 20 72 33 20 45 4e 44 20 46  r2 ELSE r3 END F
c370: 52 4f 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32 20  ROM t2.} {R1 R2 
c380: 52 33 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  R3}..do_execsql_
c390: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e 31  test e_expr-26.1
c3a0: 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .4 {.  SELECT CA
c3b0: 53 45 20 63 65 76 61 6c 28 78 29 20 57 48 45 4e  SE ceval(x) WHEN
c3c0: 20 77 31 20 54 48 45 4e 20 72 31 20 57 48 45 4e   w1 THEN r1 WHEN
c3d0: 20 77 32 20 54 48 45 4e 20 72 32 20 45 4c 53 45   w2 THEN r2 ELSE
c3e0: 20 72 33 20 45 4e 44 20 46 52 4f 4d 20 74 32 0a   r3 END FROM t2.
c3f0: 7d 20 7b 52 31 20 52 32 20 52 33 7d 0a 64 6f 5f  } {R1 R2 R3}.do_
c400: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e 31  test e_expr-26.1
c410: 2e 35 20 7b 20 73 65 74 20 3a 3a 65 76 61 6c 63  .5 { set ::evalc
c420: 6f 75 6e 74 20 7d 20 7b 33 7d 0a 73 65 74 20 3a  ount } {3}.set :
c430: 3a 65 76 61 6c 63 6f 75 6e 74 20 30 0a 64 6f 5f  :evalcount 0.do_
c440: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
c450: 78 70 72 2d 32 36 2e 31 2e 36 20 7b 0a 20 20 53  xpr-26.1.6 {.  S
c460: 45 4c 45 43 54 20 43 41 53 45 20 0a 20 20 20 20  ELECT CASE .    
c470: 57 48 45 4e 20 63 65 76 61 6c 28 78 29 3d 77 31  WHEN ceval(x)=w1
c480: 20 54 48 45 4e 20 72 31 20 0a 20 20 20 20 57 48   THEN r1 .    WH
c490: 45 4e 20 63 65 76 61 6c 28 78 29 3d 77 32 20 54  EN ceval(x)=w2 T
c4a0: 48 45 4e 20 72 32 20 0a 20 20 20 20 45 4c 53 45  HEN r2 .    ELSE
c4b0: 20 72 33 20 45 4e 44 20 0a 20 20 46 52 4f 4d 20   r3 END .  FROM 
c4c0: 74 32 0a 7d 20 7b 52 31 20 52 32 20 52 33 7d 0a  t2.} {R1 R2 R3}.
c4d0: 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  do_test e_expr-2
c4e0: 36 2e 31 2e 36 20 7b 20 73 65 74 20 3a 3a 65 76  6.1.6 { set ::ev
c4f0: 61 6c 63 6f 75 6e 74 20 7d 20 7b 35 7d 0a 0a 0a  alcount } {5}...
c500: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
c510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
c550: 74 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65 6c  t statements rel
c560: 61 74 65 64 20 74 6f 20 43 41 53 54 20 65 78 70  ated to CAST exp
c570: 72 65 73 73 69 6f 6e 73 2e 0a 23 0a 23 20 45 56  ressions..#.# EV
c580: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 38  IDENCE-OF: R-208
c590: 35 34 2d 31 37 31 30 39 20 41 20 43 41 53 54 20  54-17109 A CAST 
c5a0: 63 6f 6e 76 65 72 73 69 6f 6e 20 69 73 20 73 69  conversion is si
c5b0: 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 23 20 63  milar to the.# c
c5c0: 6f 6e 76 65 72 73 69 6f 6e 20 74 68 61 74 20 74  onversion that t
c5d0: 61 6b 65 73 20 70 6c 61 63 65 20 77 68 65 6e 20  akes place when 
c5e0: 61 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  a column affinit
c5f0: 79 20 69 73 20 61 70 70 6c 69 65 64 20 74 6f 20  y is applied to 
c600: 61 0a 23 20 76 61 6c 75 65 20 65 78 63 65 70 74  a.# value except
c610: 20 74 68 61 74 20 77 69 74 68 20 74 68 65 20 43   that with the C
c620: 41 53 54 20 6f 70 65 72 61 74 6f 72 20 74 68 65  AST operator the
c630: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 61 6c 77 61   conversion alwa
c640: 79 73 20 74 61 6b 65 73 0a 23 20 70 6c 61 63 65  ys takes.# place
c650: 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 6f 6e   even if the con
c660: 76 65 72 73 69 6f 6e 20 6c 6f 73 73 79 20 61 6e  version lossy an
c670: 64 20 69 72 72 65 76 65 72 73 69 62 6c 65 2c 20  d irreversible, 
c680: 77 68 65 72 65 61 73 20 63 6f 6c 75 6d 6e 0a 23  whereas column.#
c690: 20 61 66 66 69 6e 69 74 79 20 6f 6e 6c 79 20 63   affinity only c
c6a0: 68 61 6e 67 65 73 20 74 68 65 20 64 61 74 61 20  hanges the data 
c6b0: 74 79 70 65 20 6f 66 20 61 20 76 61 6c 75 65 20  type of a value 
c6c0: 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69 73  if the change is
c6d0: 0a 23 20 6c 6f 73 73 6c 65 73 73 20 61 6e 64 20  .# lossless and 
c6e0: 72 65 76 65 72 73 69 62 6c 65 2e 0a 23 0a 64 6f  reversible..#.do
c6f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
c700: 65 78 70 72 2d 32 37 2e 31 2e 31 20 7b 0a 20 20  expr-27.1.1 {.  
c710: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28  CREATE TABLE t3(
c720: 61 20 54 45 58 54 2c 20 62 20 52 45 41 4c 2c 20  a TEXT, b REAL, 
c730: 63 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 49 4e  c INTEGER);.  IN
c740: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
c750: 55 45 53 28 58 27 35 35 35 36 35 35 27 2c 20 27  UES(X'555655', '
c760: 31 2e 32 33 61 62 63 27 2c 20 34 2e 35 29 3b 0a  1.23abc', 4.5);.
c770: 20 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28    SELECT typeof(
c780: 61 29 2c 20 61 2c 20 74 79 70 65 6f 66 28 62 29  a), a, typeof(b)
c790: 2c 20 62 2c 20 74 79 70 65 6f 66 28 63 29 2c 20  , b, typeof(c), 
c7a0: 63 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b 62 6c  c FROM t3;.} {bl
c7b0: 6f 62 20 55 56 55 20 74 65 78 74 20 31 2e 32 33  ob UVU text 1.23
c7c0: 61 62 63 20 72 65 61 6c 20 34 2e 35 7d 0a 64 6f  abc real 4.5}.do
c7d0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
c7e0: 65 78 70 72 2d 32 37 2e 31 2e 32 20 7b 0a 20 20  expr-27.1.2 {.  
c7f0: 53 45 4c 45 43 54 20 0a 20 20 20 20 74 79 70 65  SELECT .    type
c800: 6f 66 28 43 41 53 54 28 58 27 35 35 35 36 35 35  of(CAST(X'555655
c810: 27 20 61 73 20 54 45 58 54 29 29 2c 20 43 41 53  ' as TEXT)), CAS
c820: 54 28 58 27 35 35 35 36 35 35 27 20 61 73 20 54  T(X'555655' as T
c830: 45 58 54 29 2c 0a 20 20 20 20 74 79 70 65 6f 66  EXT),.    typeof
c840: 28 43 41 53 54 28 27 31 2e 32 33 61 62 63 27 20  (CAST('1.23abc' 
c850: 61 73 20 52 45 41 4c 29 29 2c 20 43 41 53 54 28  as REAL)), CAST(
c860: 27 31 2e 32 33 61 62 63 27 20 61 73 20 52 45 41  '1.23abc' as REA
c870: 4c 29 2c 0a 20 20 20 20 74 79 70 65 6f 66 28 43  L),.    typeof(C
c880: 41 53 54 28 34 2e 35 20 61 73 20 49 4e 54 45 47  AST(4.5 as INTEG
c890: 45 52 29 29 2c 20 43 41 53 54 28 34 2e 35 20 61  ER)), CAST(4.5 a
c8a0: 73 20 49 4e 54 45 47 45 52 29 0a 7d 20 7b 74 65  s INTEGER).} {te
c8b0: 78 74 20 55 56 55 20 72 65 61 6c 20 31 2e 32 33  xt UVU real 1.23
c8c0: 20 69 6e 74 65 67 65 72 20 34 7d 0a 0a 23 20 45   integer 4}..# E
c8d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 32  VIDENCE-OF: R-32
c8e0: 34 33 34 2d 30 39 30 39 32 20 49 66 20 74 68 65  434-09092 If the
c8f0: 20 76 61 6c 75 65 20 6f 66 20 65 78 70 72 20 69   value of expr i
c900: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
c910: 0a 23 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  .# result of the
c920: 20 43 41 53 54 20 65 78 70 72 65 73 73 69 6f 6e   CAST expression
c930: 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 0a 23   is also NULL..#
c940: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
c950: 65 78 70 72 2d 32 37 2e 32 2e 31 20 7b 20 43 41  expr-27.2.1 { CA
c960: 53 54 28 4e 55 4c 4c 20 41 53 20 69 6e 74 65 67  ST(NULL AS integ
c970: 65 72 29 20 7d 20 6e 75 6c 6c 20 7b 7d 0a 64 6f  er) } null {}.do
c980: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
c990: 72 2d 32 37 2e 32 2e 32 20 7b 20 43 41 53 54 28  r-27.2.2 { CAST(
c9a0: 4e 55 4c 4c 20 41 53 20 74 65 78 74 29 20 7d 20  NULL AS text) } 
c9b0: 20 20 20 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65 78     null {}.do_ex
c9c0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
c9d0: 37 2e 32 2e 33 20 7b 20 43 41 53 54 28 4e 55 4c  7.2.3 { CAST(NUL
c9e0: 4c 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 20 20  L AS blob) }    
c9f0: 6e 75 6c 6c 20 7b 7d 0a 64 6f 5f 65 78 70 72 5f  null {}.do_expr_
ca00: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 32  test e_expr-27.2
ca10: 2e 34 20 7b 20 43 41 53 54 28 4e 55 4c 4c 20 41  .4 { CAST(NULL A
ca20: 53 20 6e 75 6d 62 65 72 29 20 7d 20 20 6e 75 6c  S number) }  nul
ca30: 6c 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  l {}..# EVIDENCE
ca40: 2d 4f 46 3a 20 52 2d 32 39 32 38 33 2d 31 35 35  -OF: R-29283-155
ca50: 36 31 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  61 Otherwise, th
ca60: 65 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 20  e storage class 
ca70: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 23 20  of the result.# 
ca80: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
ca90: 20 61 70 70 6c 79 69 6e 67 20 74 68 65 20 72 75   applying the ru
caa0: 6c 65 73 20 66 6f 72 20 64 65 74 65 72 6d 69 6e  les for determin
cab0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e  ing column affin
cac0: 69 74 79 20 74 6f 0a 23 20 74 68 65 20 74 79 70  ity to.# the typ
cad0: 65 2d 6e 61 6d 65 2e 0a 23 0a 23 20 54 68 65 20  e-name..#.# The 
cae0: 52 2d 32 39 32 38 33 2d 31 35 35 36 31 20 72 65  R-29283-15561 re
caf0: 71 75 69 72 65 6d 65 6e 74 20 61 62 6f 76 65 20  quirement above 
cb00: 69 73 20 64 65 6d 6f 6e 73 74 72 61 74 65 64 20  is demonstrated 
cb10: 62 79 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 23  by all of the .#
cb20: 20 73 75 62 73 65 71 75 65 6e 74 20 65 5f 65 78   subsequent e_ex
cb30: 70 72 2d 32 36 20 74 65 73 74 73 2e 0a 23 0a 23  pr-26 tests..#.#
cb40: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cb50: 34 33 35 32 32 2d 33 35 35 34 38 20 43 61 73 74  43522-35548 Cast
cb60: 69 6e 67 20 61 20 76 61 6c 75 65 20 74 6f 20 61  ing a value to a
cb70: 20 74 79 70 65 2d 6e 61 6d 65 20 77 69 74 68 20   type-name with 
cb80: 6e 6f 0a 23 20 61 66 66 69 6e 69 74 79 20 63 61  no.# affinity ca
cb90: 75 73 65 73 20 74 68 65 20 76 61 6c 75 65 20 74  uses the value t
cba0: 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  o be converted i
cbb0: 6e 74 6f 20 61 20 42 4c 4f 42 2e 0a 23 0a 64 6f  nto a BLOB..#.do
cbc0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
cbd0: 72 2d 32 37 2e 33 2e 31 20 7b 20 43 41 53 54 28  r-27.3.1 { CAST(
cbe0: 27 61 62 63 27 20 41 53 20 62 6c 6f 62 29 20 20  'abc' AS blob)  
cbf0: 20 20 20 20 20 7d 20 62 6c 6f 62 20 61 62 63 0a       } blob abc.
cc00: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
cc10: 78 70 72 2d 32 37 2e 33 2e 32 20 7b 20 43 41 53  xpr-27.3.2 { CAS
cc20: 54 28 27 64 65 66 27 20 41 53 20 73 68 6f 62 62  T('def' AS shobb
cc30: 6c 6f 62 5f 78 29 20 7d 20 62 6c 6f 62 20 64 65  lob_x) } blob de
cc40: 66 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  f.do_expr_test e
cc50: 5f 65 78 70 72 2d 32 37 2e 33 2e 33 20 7b 20 43  _expr-27.3.3 { C
cc60: 41 53 54 28 27 67 68 69 27 20 41 53 20 61 62 62  AST('ghi' AS abb
cc70: 4c 4f 62 31 30 29 20 20 20 7d 20 62 6c 6f 62 20  LOb10)   } blob 
cc80: 67 68 69 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d  ghi..# EVIDENCE-
cc90: 4f 46 3a 20 52 2d 32 32 39 35 36 2d 33 37 37 35  OF: R-22956-3775
cca0: 34 20 43 61 73 74 69 6e 67 20 74 6f 20 61 20 42  4 Casting to a B
ccb0: 4c 4f 42 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  LOB consists of 
ccc0: 66 69 72 73 74 20 63 61 73 74 69 6e 67 0a 23 20  first casting.# 
ccd0: 74 68 65 20 76 61 6c 75 65 20 74 6f 20 54 45 58  the value to TEX
cce0: 54 20 69 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e  T in the encodin
ccf0: 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
cd00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 74 68  e connection, th
cd10: 65 6e 0a 23 20 69 6e 74 65 72 70 72 65 74 69 6e  en.# interpretin
cd20: 67 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  g the resulting 
cd30: 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 61 73  byte sequence as
cd40: 20 61 20 42 4c 4f 42 20 69 6e 73 74 65 61 64 20   a BLOB instead 
cd50: 6f 66 20 61 73 20 54 45 58 54 2e 0a 23 0a 64 6f  of as TEXT..#.do
cd60: 5f 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  _qexpr_test e_ex
cd70: 70 72 2d 32 37 2e 34 2e 31 20 7b 20 43 41 53 54  pr-27.4.1 { CAST
cd80: 28 27 67 68 69 27 20 41 53 20 62 6c 6f 62 29 20  ('ghi' AS blob) 
cd90: 7d 20 58 27 36 37 36 38 36 39 27 0a 64 6f 5f 71  } X'676869'.do_q
cda0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
cdb0: 2d 32 37 2e 34 2e 32 20 7b 20 43 41 53 54 28 34  -27.4.2 { CAST(4
cdc0: 35 36 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 20  56 AS blob) }   
cdd0: 58 27 33 34 33 35 33 36 27 0a 64 6f 5f 71 65 78  X'343536'.do_qex
cde0: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
cdf0: 37 2e 34 2e 33 20 7b 20 43 41 53 54 28 31 2e 37  7.4.3 { CAST(1.7
ce00: 38 20 41 53 20 62 6c 6f 62 29 20 7d 20 20 58 27  8 AS blob) }  X'
ce10: 33 31 32 45 33 37 33 38 27 0a 72 65 6e 61 6d 65  312E3738'.rename
ce20: 20 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33 20   db db2.sqlite3 
ce30: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 69 66 63 61  db :memory:.ifca
ce40: 70 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a  pable {utf16} {.
ce50: 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  db eval { PRAGMA
ce60: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66   encoding = 'utf
ce70: 2d 31 36 6c 65 27 20 7d 0a 64 6f 5f 71 65 78 70  -16le' }.do_qexp
ce80: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
ce90: 2e 34 2e 34 20 7b 20 43 41 53 54 28 27 67 68 69  .4.4 { CAST('ghi
cea0: 27 20 41 53 20 62 6c 6f 62 29 20 7d 20 58 27 36  ' AS blob) } X'6
ceb0: 37 30 30 36 38 30 30 36 39 30 30 27 0a 64 6f 5f  70068006900'.do_
cec0: 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  qexpr_test e_exp
ced0: 72 2d 32 37 2e 34 2e 35 20 7b 20 43 41 53 54 28  r-27.4.5 { CAST(
cee0: 34 35 36 20 41 53 20 62 6c 6f 62 29 20 7d 20 20  456 AS blob) }  
cef0: 20 58 27 33 34 30 30 33 35 30 30 33 36 30 30 27   X'340035003600'
cf00: 0a 64 6f 5f 71 65 78 70 72 5f 74 65 73 74 20 65  .do_qexpr_test e
cf10: 5f 65 78 70 72 2d 32 37 2e 34 2e 36 20 7b 20 43  _expr-27.4.6 { C
cf20: 41 53 54 28 31 2e 37 38 20 41 53 20 62 6c 6f 62  AST(1.78 AS blob
cf30: 29 20 7d 20 20 58 27 33 31 30 30 32 45 30 30 33  ) }  X'31002E003
cf40: 37 30 30 33 38 30 30 27 0a 7d 0a 64 62 20 63 6c  7003800'.}.db cl
cf50: 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20 3a  ose.sqlite3 db :
cf60: 6d 65 6d 6f 72 79 3a 0a 64 62 20 65 76 61 6c 20  memory:.db eval 
cf70: 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e  { PRAGMA encodin
cf80: 67 20 3d 20 27 75 74 66 2d 31 36 62 65 27 20 7d  g = 'utf-16be' }
cf90: 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66 31  .ifcapable {utf1
cfa0: 36 7d 20 7b 0a 64 6f 5f 71 65 78 70 72 5f 74 65  6} {.do_qexpr_te
cfb0: 73 74 20 65 5f 65 78 70 72 2d 32 37 2e 34 2e 37  st e_expr-27.4.7
cfc0: 20 7b 20 43 41 53 54 28 27 67 68 69 27 20 41 53   { CAST('ghi' AS
cfd0: 20 62 6c 6f 62 29 20 7d 20 58 27 30 30 36 37 30   blob) } X'00670
cfe0: 30 36 38 30 30 36 39 27 0a 64 6f 5f 71 65 78 70  0680069'.do_qexp
cff0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 37  r_test e_expr-27
d000: 2e 34 2e 38 20 7b 20 43 41 53 54 28 34 35 36 20  .4.8 { CAST(456 
d010: 41 53 20 62 6c 6f 62 29 20 7d 20 20 20 58 27 30  AS blob) }   X'0
d020: 30 33 34 30 30 33 35 30 30 33 36 27 0a 64 6f 5f  03400350036'.do_
d030: 71 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  qexpr_test e_exp
d040: 72 2d 32 37 2e 34 2e 39 20 7b 20 43 41 53 54 28  r-27.4.9 { CAST(
d050: 31 2e 37 38 20 41 53 20 62 6c 6f 62 29 20 7d 20  1.78 AS blob) } 
d060: 20 58 27 30 30 33 31 30 30 32 45 30 30 33 37 30   X'0031002E00370
d070: 30 33 38 27 0a 7d 0a 64 62 20 63 6c 6f 73 65 0a  038'.}.db close.
d080: 72 65 6e 61 6d 65 20 64 62 32 20 64 62 0a 0a 23  rename db2 db..#
d090: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d0a0: 30 34 32 30 37 2d 33 37 39 38 31 20 54 6f 20 63  04207-37981 To c
d0b0: 61 73 74 20 61 20 42 4c 4f 42 20 76 61 6c 75 65  ast a BLOB value
d0c0: 20 74 6f 20 54 45 58 54 2c 20 74 68 65 20 73 65   to TEXT, the se
d0d0: 71 75 65 6e 63 65 0a 23 20 6f 66 20 62 79 74 65  quence.# of byte
d0e0: 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
d0f0: 68 65 20 42 4c 4f 42 20 69 73 20 69 6e 74 65 72  he BLOB is inter
d100: 70 72 65 74 65 64 20 61 73 20 74 65 78 74 20 65  preted as text e
d110: 6e 63 6f 64 65 64 20 75 73 69 6e 67 0a 23 20 74  ncoded using.# t
d120: 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f  he database enco
d130: 64 69 6e 67 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  ding..#.do_expr_
d140: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 31  test e_expr-28.1
d150: 2e 31 20 7b 20 43 41 53 54 20 28 58 27 36 37 36  .1 { CAST (X'676
d160: 38 36 39 27 20 41 53 20 74 65 78 74 29 20 7d 20  869' AS text) } 
d170: 74 65 78 74 20 67 68 69 0a 64 6f 5f 65 78 70 72  text ghi.do_expr
d180: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e  _test e_expr-28.
d190: 31 2e 32 20 7b 20 43 41 53 54 20 28 58 27 36 37  1.2 { CAST (X'67
d1a0: 30 30 36 38 30 30 36 39 30 30 27 20 41 53 20 74  0068006900' AS t
d1b0: 65 78 74 29 20 7d 20 74 65 78 74 20 67 0a 72 65  ext) } text g.re
d1c0: 6e 61 6d 65 20 64 62 20 64 62 32 0a 73 71 6c 69  name db db2.sqli
d1d0: 74 65 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a  te3 db :memory:.
d1e0: 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  db eval { PRAGMA
d1f0: 20 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66   encoding = 'utf
d200: 2d 31 36 6c 65 27 20 7d 0a 69 66 63 61 70 61 62  -16le' }.ifcapab
d210: 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a 64 6f 5f  le {utf16} {.do_
d220: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d230: 2d 32 38 2e 31 2e 33 20 7b 20 43 41 53 54 20 28  -28.1.3 { CAST (
d240: 58 27 36 37 36 38 36 39 27 20 41 53 20 74 65 78  X'676869' AS tex
d250: 74 29 20 3d 3d 20 27 67 68 69 27 20 7d 20 69 6e  t) == 'ghi' } in
d260: 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72 5f  teger 0.do_expr_
d270: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 38 2e 31  test e_expr-28.1
d280: 2e 34 20 7b 20 43 41 53 54 20 28 58 27 36 37 30  .4 { CAST (X'670
d290: 30 36 38 30 30 36 39 30 30 27 20 41 53 20 74 65  068006900' AS te
d2a0: 78 74 29 20 7d 20 74 65 78 74 20 67 68 69 0a 7d  xt) } text ghi.}
d2b0: 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61 6d 65  .db close.rename
d2c0: 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49 44 45   db2 db..# EVIDE
d2d0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 32 33 35 2d  NCE-OF: R-22235-
d2e0: 34 37 30 30 36 20 43 61 73 74 69 6e 67 20 61 6e  47006 Casting an
d2f0: 20 49 4e 54 45 47 45 52 20 6f 72 20 52 45 41 4c   INTEGER or REAL
d300: 20 76 61 6c 75 65 20 69 6e 74 6f 20 54 45 58 54   value into TEXT
d310: 0a 23 20 72 65 6e 64 65 72 73 20 74 68 65 20 76  .# renders the v
d320: 61 6c 75 65 20 61 73 20 69 66 20 76 69 61 20 73  alue as if via s
d330: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
d340: 29 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  ) except that th
d350: 65 0a 23 20 72 65 73 75 6c 74 69 6e 67 20 54 45  e.# resulting TE
d360: 58 54 20 75 73 65 73 20 74 68 65 20 65 6e 63 6f  XT uses the enco
d370: 64 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ding of the data
d380: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
d390: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
d3a0: 65 5f 65 78 70 72 2d 32 38 2e 32 2e 31 20 7b 20  e_expr-28.2.1 { 
d3b0: 43 41 53 54 20 28 31 20 41 53 20 74 65 78 74 29  CAST (1 AS text)
d3c0: 20 20 20 7d 20 20 20 20 20 74 65 78 74 20 31 0a     }     text 1.
d3d0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d3e0: 78 70 72 2d 32 38 2e 32 2e 32 20 7b 20 43 41 53  xpr-28.2.2 { CAS
d3f0: 54 20 28 34 35 20 41 53 20 74 65 78 74 29 20 20  T (45 AS text)  
d400: 7d 20 20 20 20 20 74 65 78 74 20 34 35 0a 64 6f  }     text 45.do
d410: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d420: 72 2d 32 38 2e 32 2e 33 20 7b 20 43 41 53 54 20  r-28.2.3 { CAST 
d430: 28 2d 34 35 20 41 53 20 74 65 78 74 29 20 7d 20  (-45 AS text) } 
d440: 20 20 20 20 74 65 78 74 20 2d 34 35 0a 64 6f 5f      text -45.do_
d450: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d460: 2d 32 38 2e 32 2e 34 20 7b 20 43 41 53 54 20 28  -28.2.4 { CAST (
d470: 38 2e 38 20 41 53 20 74 65 78 74 29 20 20 20 20  8.8 AS text)    
d480: 7d 20 20 74 65 78 74 20 38 2e 38 0a 64 6f 5f 65  }  text 8.8.do_e
d490: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
d4a0: 32 38 2e 32 2e 35 20 7b 20 43 41 53 54 20 28 32  28.2.5 { CAST (2
d4b0: 2e 33 65 2b 35 20 41 53 20 74 65 78 74 29 20 7d  .3e+5 AS text) }
d4c0: 20 20 74 65 78 74 20 32 33 30 30 30 30 2e 30 0a    text 230000.0.
d4d0: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
d4e0: 78 70 72 2d 32 38 2e 32 2e 36 20 7b 20 43 41 53  xpr-28.2.6 { CAS
d4f0: 54 20 28 2d 32 2e 33 65 2d 35 20 41 53 20 74 65  T (-2.3e-5 AS te
d500: 78 74 29 20 7d 20 74 65 78 74 20 2d 32 2e 33 65  xt) } text -2.3e
d510: 2d 30 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  -05.do_expr_test
d520: 20 65 5f 65 78 70 72 2d 32 38 2e 32 2e 37 20 7b   e_expr-28.2.7 {
d530: 20 43 41 53 54 20 28 30 2e 30 20 41 53 20 74 65   CAST (0.0 AS te
d540: 78 74 29 20 7d 20 20 20 20 20 74 65 78 74 20 30  xt) }     text 0
d550: 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .0.do_expr_test 
d560: 65 5f 65 78 70 72 2d 32 38 2e 32 2e 37 20 7b 20  e_expr-28.2.7 { 
d570: 43 41 53 54 20 28 30 20 41 53 20 74 65 78 74 29  CAST (0 AS text)
d580: 20 7d 20 20 20 20 20 20 20 74 65 78 74 20 30 0a   }       text 0.
d590: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
d5a0: 52 2d 32 36 33 34 36 2d 33 36 34 34 33 20 57 68  R-26346-36443 Wh
d5b0: 65 6e 20 63 61 73 74 69 6e 67 20 61 20 42 4c 4f  en casting a BLO
d5c0: 42 20 76 61 6c 75 65 20 74 6f 20 61 20 52 45 41  B value to a REA
d5d0: 4c 2c 20 74 68 65 0a 23 20 76 61 6c 75 65 20 69  L, the.# value i
d5e0: 73 20 66 69 72 73 74 20 63 6f 6e 76 65 72 74 65  s first converte
d5f0: 64 20 74 6f 20 54 45 58 54 2e 0a 23 0a 64 6f 5f  d to TEXT..#.do_
d600: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
d610: 2d 32 39 2e 31 2e 31 20 7b 20 43 41 53 54 20 28  -29.1.1 { CAST (
d620: 58 27 33 31 32 45 33 32 33 33 27 20 41 53 20 52  X'312E3233' AS R
d630: 45 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32 33  EAL) } real 1.23
d640: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
d650: 65 78 70 72 2d 32 39 2e 31 2e 32 20 7b 20 43 41  expr-29.1.2 { CA
d660: 53 54 20 28 58 27 33 32 33 33 33 30 32 45 33 30  ST (X'3233302E30
d670: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
d680: 6c 20 32 33 30 2e 30 0a 64 6f 5f 65 78 70 72 5f  l 230.0.do_expr_
d690: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31  test e_expr-29.1
d6a0: 2e 33 20 7b 20 43 41 53 54 20 28 58 27 32 44 33  .3 { CAST (X'2D3
d6b0: 39 32 45 33 38 33 37 27 20 41 53 20 52 45 41 4c  92E3837' AS REAL
d6c0: 29 20 7d 20 72 65 61 6c 20 2d 39 2e 38 37 0a 64  ) } real -9.87.d
d6d0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d6e0: 70 72 2d 32 39 2e 31 2e 34 20 7b 20 43 41 53 54  pr-29.1.4 { CAST
d6f0: 20 28 58 27 33 30 32 45 33 30 33 30 33 30 33 31   (X'302E30303031
d700: 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61  ' AS REAL) } rea
d710: 6c 20 30 2e 30 30 30 31 0a 72 65 6e 61 6d 65 20  l 0.0001.rename 
d720: 64 62 20 64 62 32 0a 73 71 6c 69 74 65 33 20 64  db db2.sqlite3 d
d730: 62 20 3a 6d 65 6d 6f 72 79 3a 0a 69 66 63 61 70  b :memory:.ifcap
d740: 61 62 6c 65 20 7b 75 74 66 31 36 7d 20 7b 0a 64  able {utf16} {.d
d750: 62 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  b eval { PRAGMA 
d760: 65 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d  encoding = 'utf-
d770: 31 36 6c 65 27 20 7d 0a 64 6f 5f 65 78 70 72 5f  16le' }.do_expr_
d780: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 31  test e_expr-29.1
d790: 2e 35 20 7b 20 0a 20 20 20 20 43 41 53 54 20 28  .5 { .    CAST (
d7a0: 58 27 33 31 30 30 32 45 30 30 33 32 30 30 33 33  X'31002E00320033
d7b0: 30 30 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72  00' AS REAL) } r
d7c0: 65 61 6c 20 31 2e 32 33 0a 64 6f 5f 65 78 70 72  eal 1.23.do_expr
d7d0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39 2e  _test e_expr-29.
d7e0: 31 2e 36 20 7b 20 0a 20 20 20 20 43 41 53 54 20  1.6 { .    CAST 
d7f0: 28 58 27 33 32 30 30 33 33 30 30 33 30 30 30 32  (X'3200330030002
d800: 45 30 30 33 30 30 30 27 20 41 53 20 52 45 41 4c  E003000' AS REAL
d810: 29 20 7d 20 72 65 61 6c 20 32 33 30 2e 30 0a 64  ) } real 230.0.d
d820: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
d830: 70 72 2d 32 39 2e 31 2e 37 20 7b 20 0a 20 20 20  pr-29.1.7 { .   
d840: 20 43 41 53 54 20 28 58 27 32 44 30 30 33 39 30   CAST (X'2D00390
d850: 30 32 45 30 30 33 38 30 30 33 37 30 30 27 20 41  02E0038003700' A
d860: 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20 2d  S REAL) } real -
d870: 39 2e 38 37 0a 64 6f 5f 65 78 70 72 5f 74 65 73  9.87.do_expr_tes
d880: 74 20 65 5f 65 78 70 72 2d 32 39 2e 31 2e 38 20  t e_expr-29.1.8 
d890: 7b 20 0a 20 20 20 20 43 41 53 54 20 28 58 27 33  { .    CAST (X'3
d8a0: 30 30 30 32 45 30 30 33 30 30 30 33 30 30 30 33  0002E00300030003
d8b0: 30 30 30 33 31 30 30 27 20 41 53 20 52 45 41 4c  0003100' AS REAL
d8c0: 29 20 7d 20 72 65 61 6c 20 30 2e 30 30 30 31 0a  ) } real 0.0001.
d8d0: 7d 0a 64 62 20 63 6c 6f 73 65 0a 72 65 6e 61 6d  }.db close.renam
d8e0: 65 20 64 62 32 20 64 62 0a 0a 23 20 45 56 49 44  e db2 db..# EVID
d8f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 38 39 38  ENCE-OF: R-54898
d900: 2d 33 34 35 35 34 20 57 68 65 6e 20 63 61 73 74  -34554 When cast
d910: 69 6e 67 20 61 20 54 45 58 54 20 76 61 6c 75 65  ing a TEXT value
d920: 20 74 6f 20 52 45 41 4c 2c 20 74 68 65 0a 23 20   to REAL, the.# 
d930: 6c 6f 6e 67 65 73 74 20 70 6f 73 73 69 62 6c 65  longest possible
d940: 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 76   prefix of the v
d950: 61 6c 75 65 20 74 68 61 74 20 63 61 6e 20 62 65  alue that can be
d960: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
d970: 61 20 72 65 61 6c 0a 23 20 6e 75 6d 62 65 72 20  a real.# number 
d980: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
d990: 6d 20 74 68 65 20 54 45 58 54 20 76 61 6c 75 65  m the TEXT value
d9a0: 20 61 6e 64 20 74 68 65 20 72 65 6d 61 69 6e 64   and the remaind
d9b0: 65 72 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64 6f  er ignored..#.do
d9c0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
d9d0: 72 2d 32 39 2e 32 2e 31 20 7b 20 43 41 53 54 28  r-29.2.1 { CAST(
d9e0: 27 31 2e 32 33 61 62 63 64 27 20 41 53 20 52 45  '1.23abcd' AS RE
d9f0: 41 4c 29 20 7d 20 72 65 61 6c 20 31 2e 32 33 0a  AL) } real 1.23.
da00: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
da10: 78 70 72 2d 32 39 2e 32 2e 32 20 7b 20 43 41 53  xpr-29.2.2 { CAS
da20: 54 28 27 31 2e 34 35 2e 32 33 61 62 63 64 27 20  T('1.45.23abcd' 
da30: 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c 20  AS REAL) } real 
da40: 31 2e 34 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73  1.45.do_expr_tes
da50: 74 20 65 5f 65 78 70 72 2d 32 39 2e 32 2e 33 20  t e_expr-29.2.3 
da60: 7b 20 43 41 53 54 28 27 2d 32 2e 31 32 65 2d 30  { CAST('-2.12e-0
da70: 31 41 42 43 27 20 41 53 20 52 45 41 4c 29 20 7d  1ABC' AS REAL) }
da80: 20 72 65 61 6c 20 2d 30 2e 32 31 32 0a 64 6f 5f   real -0.212.do_
da90: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
daa0: 2d 32 39 2e 32 2e 34 20 7b 20 43 41 53 54 28 27  -29.2.4 { CAST('
dab0: 31 20 32 20 33 20 34 27 20 41 53 20 52 45 41 4c  1 2 3 4' AS REAL
dac0: 29 20 7d 20 72 65 61 6c 20 31 2e 30 0a 0a 23 20  ) } real 1.0..# 
dad0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
dae0: 31 33 32 31 2d 34 37 34 32 37 20 41 6e 79 20 6c  1321-47427 Any l
daf0: 65 61 64 69 6e 67 20 73 70 61 63 65 73 20 69 6e  eading spaces in
db00: 20 74 68 65 20 54 45 58 54 20 76 61 6c 75 65 20   the TEXT value 
db10: 61 72 65 0a 23 20 69 67 6e 6f 72 65 64 20 77 68  are.# ignored wh
db20: 65 6e 20 63 6f 6e 76 65 72 67 69 6e 67 20 66 72  en converging fr
db30: 6f 6d 20 54 45 58 54 20 74 6f 20 52 45 41 4c 2e  om TEXT to REAL.
db40: 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  .#.do_expr_test 
db50: 65 5f 65 78 70 72 2d 32 39 2e 33 2e 31 20 7b 20  e_expr-29.3.1 { 
db60: 43 41 53 54 28 27 20 31 2e 32 33 61 62 63 64 27  CAST(' 1.23abcd'
db70: 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65 61 6c   AS REAL) } real
db80: 20 31 2e 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65   1.23.do_expr_te
db90: 73 74 20 65 5f 65 78 70 72 2d 32 39 2e 33 2e 32  st e_expr-29.3.2
dba0: 20 7b 20 43 41 53 54 28 27 20 20 20 20 31 2e 34   { CAST('    1.4
dbb0: 35 2e 32 33 61 62 63 64 27 20 41 53 20 52 45 41  5.23abcd' AS REA
dbc0: 4c 29 20 7d 20 72 65 61 6c 20 31 2e 34 35 0a 64  L) } real 1.45.d
dbd0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
dbe0: 70 72 2d 32 39 2e 33 2e 33 20 7b 20 43 41 53 54  pr-29.3.3 { CAST
dbf0: 28 27 20 20 20 2d 32 2e 31 32 65 2d 30 31 41 42  ('   -2.12e-01AB
dc00: 43 27 20 41 53 20 52 45 41 4c 29 20 7d 20 72 65  C' AS REAL) } re
dc10: 61 6c 20 2d 30 2e 32 31 32 0a 64 6f 5f 65 78 70  al -0.212.do_exp
dc20: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 39  r_test e_expr-29
dc30: 2e 33 2e 34 20 7b 20 43 41 53 54 28 27 20 31 20  .3.4 { CAST(' 1 
dc40: 32 20 33 20 34 27 20 41 53 20 52 45 41 4c 29 20  2 3 4' AS REAL) 
dc50: 7d 20 72 65 61 6c 20 31 2e 30 0a 0a 23 20 45 56  } real 1.0..# EV
dc60: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 36  IDENCE-OF: R-226
dc70: 36 32 2d 32 38 32 31 38 20 49 66 20 74 68 65 72  62-28218 If ther
dc80: 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20 74  e is no prefix t
dc90: 68 61 74 20 63 61 6e 20 62 65 0a 23 20 69 6e 74  hat can be.# int
dca0: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 72 65  erpreted as a re
dcb0: 61 6c 20 6e 75 6d 62 65 72 2c 20 74 68 65 20 72  al number, the r
dcc0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 63 6f 6e  esult of the con
dcd0: 76 65 72 73 69 6f 6e 20 69 73 20 30 2e 30 2e 0a  version is 0.0..
dce0: 23 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  #.do_expr_test e
dcf0: 5f 65 78 70 72 2d 32 39 2e 34 2e 31 20 7b 20 43  _expr-29.4.1 { C
dd00: 41 53 54 28 27 27 20 41 53 20 52 45 41 4c 29 20  AST('' AS REAL) 
dd10: 7d 20 72 65 61 6c 20 30 2e 30 0a 64 6f 5f 65 78  } real 0.0.do_ex
dd20: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  pr_test e_expr-2
dd30: 39 2e 34 2e 32 20 7b 20 43 41 53 54 28 27 6e 6f  9.4.2 { CAST('no
dd40: 74 20 61 20 6e 75 6d 62 65 72 27 20 41 53 20 52  t a number' AS R
dd50: 45 41 4c 29 20 7d 20 72 65 61 6c 20 30 2e 30 0a  EAL) } real 0.0.
dd60: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
dd70: 78 70 72 2d 32 39 2e 34 2e 33 20 7b 20 43 41 53  xpr-29.4.3 { CAS
dd80: 54 28 27 58 58 49 27 20 41 53 20 52 45 41 4c 29  T('XXI' AS REAL)
dd90: 20 7d 20 72 65 61 6c 20 30 2e 30 0a 0a 23 20 45   } real 0.0..# E
dda0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 31  VIDENCE-OF: R-21
ddb0: 38 32 39 2d 31 34 35 36 33 20 57 68 65 6e 20 63  829-14563 When c
ddc0: 61 73 74 69 6e 67 20 61 20 42 4c 4f 42 20 76 61  asting a BLOB va
ddd0: 6c 75 65 20 74 6f 20 49 4e 54 45 47 45 52 2c 20  lue to INTEGER, 
dde0: 74 68 65 0a 23 20 76 61 6c 75 65 20 69 73 20 66  the.# value is f
ddf0: 69 72 73 74 20 63 6f 6e 76 65 72 74 65 64 20 74  irst converted t
de00: 6f 20 54 45 58 54 2e 0a 23 0a 64 6f 5f 65 78 70  o TEXT..#.do_exp
de10: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
de20: 2e 31 2e 31 20 7b 20 43 41 53 54 28 58 27 33 31  .1.1 { CAST(X'31
de30: 33 32 33 33 27 20 41 53 20 49 4e 54 45 47 45 52  3233' AS INTEGER
de40: 29 20 7d 20 69 6e 74 65 67 65 72 20 31 32 33 0a  ) } integer 123.
de50: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
de60: 78 70 72 2d 33 30 2e 31 2e 32 20 7b 20 43 41 53  xpr-30.1.2 { CAS
de70: 54 28 58 27 32 44 33 36 33 37 33 38 27 20 41 53  T(X'2D363738' AS
de80: 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65   INTEGER) } inte
de90: 67 65 72 20 2d 36 37 38 0a 64 6f 5f 65 78 70 72  ger -678.do_expr
dea0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
deb0: 31 2e 33 20 7b 20 0a 20 20 43 41 53 54 28 58 27  1.3 { .  CAST(X'
dec0: 33 31 33 30 33 30 33 30 33 30 33 30 33 30 27 20  31303030303030' 
ded0: 41 53 20 49 4e 54 45 47 45 52 29 20 0a 7d 20 69  AS INTEGER) .} i
dee0: 6e 74 65 67 65 72 20 31 30 30 30 30 30 30 0a 64  nteger 1000000.d
def0: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
df00: 70 72 2d 33 30 2e 31 2e 34 20 7b 20 0a 20 20 43  pr-30.1.4 { .  C
df10: 41 53 54 28 58 27 32 44 33 31 33 31 33 32 33 35  AST(X'2D31313235
df20: 33 38 33 39 33 39 33 39 33 30 33 36 33 38 33 34  3839393930363834
df30: 33 32 33 36 33 32 33 34 27 20 41 53 20 49 4e 54  32363234' AS INT
df40: 45 47 45 52 29 20 0a 7d 20 69 6e 74 65 67 65 72  EGER) .} integer
df50: 20 2d 31 31 32 35 38 39 39 39 30 36 38 34 32 36   -11258999068426
df60: 32 34 0a 0a 72 65 6e 61 6d 65 20 64 62 20 64 62  24..rename db db
df70: 32 0a 73 71 6c 69 74 65 33 20 64 62 20 3a 6d 65  2.sqlite3 db :me
df80: 6d 6f 72 79 3a 0a 69 66 63 61 70 61 62 6c 65 20  mory:.ifcapable 
df90: 7b 75 74 66 31 36 7d 20 7b 0a 65 78 65 63 73 71  {utf16} {.execsq
dfa0: 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63 6f 64  l { PRAGMA encod
dfb0: 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 62 65 27  ing = 'utf-16be'
dfc0: 20 7d 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20   }.do_expr_test 
dfd0: 65 5f 65 78 70 72 2d 33 30 2e 31 2e 35 20 7b 20  e_expr-30.1.5 { 
dfe0: 43 41 53 54 28 58 27 30 30 33 31 30 30 33 32 30  CAST(X'003100320
dff0: 30 33 33 27 20 41 53 20 49 4e 54 45 47 45 52 29  033' AS INTEGER)
e000: 20 7d 20 69 6e 74 65 67 65 72 20 31 32 33 0a 64   } integer 123.d
e010: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
e020: 70 72 2d 33 30 2e 31 2e 36 20 7b 20 43 41 53 54  pr-30.1.6 { CAST
e030: 28 58 27 30 30 32 44 30 30 33 36 30 30 33 37 30  (X'002D003600370
e040: 30 33 38 27 20 41 53 20 49 4e 54 45 47 45 52 29  038' AS INTEGER)
e050: 20 7d 20 69 6e 74 65 67 65 72 20 2d 36 37 38 0a   } integer -678.
e060: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e070: 78 70 72 2d 33 30 2e 31 2e 37 20 7b 20 0a 20 20  xpr-30.1.7 { .  
e080: 43 41 53 54 28 58 27 30 30 33 31 30 30 33 30 30  CAST(X'003100300
e090: 30 33 30 30 30 33 30 30 30 33 30 30 30 33 30 30  0300030003000300
e0a0: 30 33 30 27 20 41 53 20 49 4e 54 45 47 45 52 29  030' AS INTEGER)
e0b0: 20 0a 7d 20 69 6e 74 65 67 65 72 20 31 30 30 30   .} integer 1000
e0c0: 30 30 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  000.do_expr_test
e0d0: 20 65 5f 65 78 70 72 2d 33 30 2e 31 2e 38 20 7b   e_expr-30.1.8 {
e0e0: 20 0a 20 20 43 41 53 54 28 58 27 30 30 32 44 30   .  CAST(X'002D0
e0f0: 30 33 31 30 30 33 31 30 30 33 32 30 30 33 35 30  0310031003200350
e100: 30 33 38 30 30 33 39 30 30 33 39 30 30 33 39 30  0380039003900390
e110: 30 33 30 30 30 33 36 30 30 33 38 30 30 33 34 30  0300036003800340
e120: 30 33 32 30 30 33 36 30 30 33 32 30 30 33 34 27  032003600320034'
e130: 20 41 53 20 49 4e 54 45 47 45 52 29 20 0a 7d 20   AS INTEGER) .} 
e140: 69 6e 74 65 67 65 72 20 2d 31 31 32 35 38 39 39  integer -1125899
e150: 39 30 36 38 34 32 36 32 34 0a 7d 0a 64 62 20 63  906842624.}.db c
e160: 6c 6f 73 65 0a 72 65 6e 61 6d 65 20 64 62 32 20  lose.rename db2 
e170: 64 62 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  db..# EVIDENCE-O
e180: 46 3a 20 52 2d 34 37 36 31 32 2d 34 35 38 34 32  F: R-47612-45842
e190: 20 57 68 65 6e 20 63 61 73 74 69 6e 67 20 61 20   When casting a 
e1a0: 54 45 58 54 20 76 61 6c 75 65 20 74 6f 20 49 4e  TEXT value to IN
e1b0: 54 45 47 45 52 2c 20 74 68 65 0a 23 20 6c 6f 6e  TEGER, the.# lon
e1c0: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 72  gest possible pr
e1d0: 65 66 69 78 20 6f 66 20 74 68 65 20 76 61 6c 75  efix of the valu
e1e0: 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 69 6e  e that can be in
e1f0: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 0a  terpreted as an.
e200: 23 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  # integer number
e210: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
e220: 6f 6d 20 74 68 65 20 54 45 58 54 20 76 61 6c 75  om the TEXT valu
e230: 65 20 61 6e 64 20 74 68 65 20 72 65 6d 61 69 6e  e and the remain
e240: 64 65 72 0a 23 20 69 67 6e 6f 72 65 64 2e 0a 23  der.# ignored..#
e250: 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f  .do_expr_test e_
e260: 65 78 70 72 2d 33 30 2e 32 2e 31 20 7b 20 43 41  expr-30.2.1 { CA
e270: 53 54 28 27 31 32 33 61 62 63 64 27 20 41 53 20  ST('123abcd' AS 
e280: 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31  INT) } integer 1
e290: 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20  23.do_expr_test 
e2a0: 65 5f 65 78 70 72 2d 33 30 2e 32 2e 32 20 7b 20  e_expr-30.2.2 { 
e2b0: 43 41 53 54 28 27 31 34 35 32 33 61 62 63 64 27  CAST('14523abcd'
e2c0: 20 41 53 20 49 4e 54 29 20 7d 20 69 6e 74 65 67   AS INT) } integ
e2d0: 65 72 20 31 34 35 32 33 0a 64 6f 5f 65 78 70 72  er 14523.do_expr
e2e0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e  _test e_expr-30.
e2f0: 32 2e 33 20 7b 20 43 41 53 54 28 27 2d 32 2e 31  2.3 { CAST('-2.1
e300: 32 65 2d 30 31 41 42 43 27 20 41 53 20 49 4e 54  2e-01ABC' AS INT
e310: 29 20 7d 20 69 6e 74 65 67 65 72 20 2d 32 0a 64  ) } integer -2.d
e320: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
e330: 70 72 2d 33 30 2e 32 2e 34 20 7b 20 43 41 53 54  pr-30.2.4 { CAST
e340: 28 27 31 20 32 20 33 20 34 27 20 41 53 20 49 4e  ('1 2 3 4' AS IN
e350: 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31 0a 0a  T) } integer 1..
e360: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
e370: 2d 33 34 34 30 30 2d 33 33 37 37 32 20 41 6e 79  -34400-33772 Any
e380: 20 6c 65 61 64 69 6e 67 20 73 70 61 63 65 73 20   leading spaces 
e390: 69 6e 20 74 68 65 20 54 45 58 54 20 76 61 6c 75  in the TEXT valu
e3a0: 65 20 77 68 65 6e 0a 23 20 63 6f 6e 76 65 72 74  e when.# convert
e3b0: 69 6e 67 20 66 72 6f 6d 20 54 45 58 54 20 74 6f  ing from TEXT to
e3c0: 20 49 4e 54 45 47 45 52 20 61 72 65 20 69 67 6e   INTEGER are ign
e3d0: 6f 72 65 64 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f  ored..#.do_expr_
e3e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 33  test e_expr-30.3
e3f0: 2e 31 20 7b 20 43 41 53 54 28 27 20 20 20 31 32  .1 { CAST('   12
e400: 33 61 62 63 64 27 20 41 53 20 49 4e 54 29 20 7d  3abcd' AS INT) }
e410: 20 69 6e 74 65 67 65 72 20 31 32 33 0a 64 6f 5f   integer 123.do_
e420: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
e430: 2d 33 30 2e 33 2e 32 20 7b 20 43 41 53 54 28 27  -30.3.2 { CAST('
e440: 20 20 31 34 35 32 33 61 62 63 64 27 20 41 53 20    14523abcd' AS 
e450: 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31  INT) } integer 1
e460: 34 35 32 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73  4523.do_expr_tes
e470: 74 20 65 5f 65 78 70 72 2d 33 30 2e 33 2e 33 20  t e_expr-30.3.3 
e480: 7b 20 43 41 53 54 28 27 20 2d 32 2e 31 32 65 2d  { CAST(' -2.12e-
e490: 30 31 41 42 43 27 20 41 53 20 49 4e 54 29 20 7d  01ABC' AS INT) }
e4a0: 20 69 6e 74 65 67 65 72 20 2d 32 0a 64 6f 5f 65   integer -2.do_e
e4b0: 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  xpr_test e_expr-
e4c0: 33 30 2e 33 2e 34 20 7b 20 43 41 53 54 28 27 20  30.3.4 { CAST(' 
e4d0: 20 20 20 20 31 20 32 20 33 20 34 27 20 41 53 20      1 2 3 4' AS 
e4e0: 49 4e 54 29 20 7d 20 69 6e 74 65 67 65 72 20 31  INT) } integer 1
e4f0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
e500: 20 52 2d 34 33 31 36 34 2d 34 34 32 37 36 20 49   R-43164-44276 I
e510: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 72  f there is no pr
e520: 65 66 69 78 20 74 68 61 74 20 63 61 6e 20 62 65  efix that can be
e530: 0a 23 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  .# interpreted a
e540: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  s an integer num
e550: 62 65 72 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ber, the result 
e560: 6f 66 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  of the conversio
e570: 6e 20 69 73 20 30 2e 0a 23 0a 64 6f 5f 65 78 70  n is 0..#.do_exp
e580: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30  r_test e_expr-30
e590: 2e 34 2e 31 20 7b 20 43 41 53 54 28 27 27 20 41  .4.1 { CAST('' A
e5a0: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e5b0: 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72 5f 74  eger 0.do_expr_t
e5c0: 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 34 2e  est e_expr-30.4.
e5d0: 32 20 7b 20 43 41 53 54 28 27 6e 6f 74 20 61 20  2 { CAST('not a 
e5e0: 6e 75 6d 62 65 72 27 20 41 53 20 49 4e 54 45 47  number' AS INTEG
e5f0: 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 30 0a  ER) } integer 0.
e600: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e610: 78 70 72 2d 33 30 2e 34 2e 33 20 7b 20 43 41 53  xpr-30.4.3 { CAS
e620: 54 28 27 58 58 49 27 20 41 53 20 49 4e 54 45 47  T('XXI' AS INTEG
e630: 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20 30 0a  ER) } integer 0.
e640: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
e650: 52 2d 30 38 39 38 30 2d 35 33 31 32 34 20 54 68  R-08980-53124 Th
e660: 65 20 43 41 53 54 20 6f 70 65 72 61 74 6f 72 20  e CAST operator 
e670: 75 6e 64 65 72 73 74 61 6e 64 73 20 64 65 63 69  understands deci
e680: 6d 61 6c 0a 23 20 69 6e 74 65 67 65 72 73 20 6f  mal.# integers o
e690: 6e 6c 79 20 26 6d 64 61 73 68 3b 20 63 6f 6e 76  nly &mdash; conv
e6a0: 65 72 73 69 6f 6e 20 6f 66 20 68 65 78 61 64 65  ersion of hexade
e6b0: 63 69 6d 61 6c 20 69 6e 74 65 67 65 72 73 20 73  cimal integers s
e6c0: 74 6f 70 73 20 61 74 0a 23 20 74 68 65 20 22 78  tops at.# the "x
e6d0: 22 20 69 6e 20 74 68 65 20 22 30 78 22 20 70 72  " in the "0x" pr
e6e0: 65 66 69 78 20 6f 66 20 74 68 65 20 68 65 78 61  efix of the hexa
e6f0: 64 65 63 69 6d 61 6c 20 69 6e 74 65 67 65 72 20  decimal integer 
e700: 73 74 72 69 6e 67 20 61 6e 64 20 74 68 75 73 0a  string and thus.
e710: 23 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  # result of the 
e720: 43 41 53 54 20 69 73 20 61 6c 77 61 79 73 20 7a  CAST is always z
e730: 65 72 6f 2e 0a 64 6f 5f 65 78 70 72 5f 74 65 73  ero..do_expr_tes
e740: 74 20 65 5f 65 78 70 72 2d 33 30 2e 35 2e 31 20  t e_expr-30.5.1 
e750: 7b 20 43 41 53 54 28 27 30 78 31 32 33 34 27 20  { CAST('0x1234' 
e760: 41 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e  AS INTEGER) } in
e770: 74 65 67 65 72 20 30 0a 64 6f 5f 65 78 70 72 5f  teger 0.do_expr_
e780: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 30 2e 35  test e_expr-30.5
e790: 2e 32 20 7b 20 43 41 53 54 28 27 30 58 31 32 33  .2 { CAST('0X123
e7a0: 34 27 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d  4' AS INTEGER) }
e7b0: 20 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45 56   integer 0..# EV
e7c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32 37  IDENCE-OF: R-027
e7d0: 35 32 2d 35 30 30 39 31 20 41 20 63 61 73 74 20  52-50091 A cast 
e7e0: 6f 66 20 61 20 52 45 41 4c 20 76 61 6c 75 65 20  of a REAL value 
e7f0: 69 6e 74 6f 20 61 6e 20 49 4e 54 45 47 45 52 0a  into an INTEGER.
e800: 23 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  # results in the
e810: 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e   integer between
e820: 20 74 68 65 20 52 45 41 4c 20 76 61 6c 75 65 20   the REAL value 
e830: 61 6e 64 20 7a 65 72 6f 20 74 68 61 74 20 69 73  and zero that is
e840: 20 63 6c 6f 73 65 73 74 0a 23 20 74 6f 20 74 68   closest.# to th
e850: 65 20 52 45 41 4c 20 76 61 6c 75 65 2e 0a 23 0a  e REAL value..#.
e860: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
e870: 78 70 72 2d 33 31 2e 31 2e 31 20 7b 20 43 41 53  xpr-31.1.1 { CAS
e880: 54 28 33 2e 31 34 31 35 39 20 41 53 20 49 4e 54  T(3.14159 AS INT
e890: 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65 72 20  EGER) } integer 
e8a0: 33 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  3.do_expr_test e
e8b0: 5f 65 78 70 72 2d 33 31 2e 31 2e 32 20 7b 20 43  _expr-31.1.2 { C
e8c0: 41 53 54 28 31 2e 39 39 39 39 39 20 41 53 20 49  AST(1.99999 AS I
e8d0: 4e 54 45 47 45 52 29 20 7d 20 69 6e 74 65 67 65  NTEGER) } intege
e8e0: 72 20 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74  r 1.do_expr_test
e8f0: 20 65 5f 65 78 70 72 2d 33 31 2e 31 2e 33 20 7b   e_expr-31.1.3 {
e900: 20 43 41 53 54 28 2d 31 2e 39 39 39 39 39 20 41   CAST(-1.99999 A
e910: 53 20 49 4e 54 45 47 45 52 29 20 7d 20 69 6e 74  S INTEGER) } int
e920: 65 67 65 72 20 2d 31 0a 64 6f 5f 65 78 70 72 5f  eger -1.do_expr_
e930: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 31 2e 31  test e_expr-31.1
e940: 2e 34 20 7b 20 43 41 53 54 28 2d 30 2e 39 39 39  .4 { CAST(-0.999
e950: 39 39 20 41 53 20 49 4e 54 45 47 45 52 29 20 7d  99 AS INTEGER) }
e960: 20 69 6e 74 65 67 65 72 20 30 0a 0a 23 20 45 56   integer 0..# EV
e970: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 35  IDENCE-OF: R-515
e980: 31 37 2d 34 30 38 32 34 20 49 66 20 61 20 52 45  17-40824 If a RE
e990: 41 4c 20 69 73 20 67 72 65 61 74 65 72 20 74 68  AL is greater th
e9a0: 61 6e 20 74 68 65 20 67 72 65 61 74 65 73 74 0a  an the greatest.
e9b0: 23 20 70 6f 73 73 69 62 6c 65 20 73 69 67 6e 65  # possible signe
e9c0: 64 20 69 6e 74 65 67 65 72 20 28 2b 39 32 32 33  d integer (+9223
e9d0: 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 29  372036854775807)
e9e0: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
e9f0: 20 69 73 20 74 68 65 0a 23 20 67 72 65 61 74 65   is the.# greate
ea00: 73 74 20 70 6f 73 73 69 62 6c 65 20 73 69 67 6e  st possible sign
ea10: 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 69  ed integer and i
ea20: 66 20 74 68 65 20 52 45 41 4c 20 69 73 20 6c 65  f the REAL is le
ea30: 73 73 20 74 68 61 6e 20 74 68 65 0a 23 20 6c 65  ss than the.# le
ea40: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 73 69 67  ast possible sig
ea50: 6e 65 64 20 69 6e 74 65 67 65 72 20 28 2d 39 32  ned integer (-92
ea60: 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
ea70: 38 29 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  8) then the resu
ea80: 6c 74 0a 23 20 69 73 20 74 68 65 20 6c 65 61 73  lt.# is the leas
ea90: 74 20 70 6f 73 73 69 62 6c 65 20 73 69 67 6e 65  t possible signe
eaa0: 64 20 69 6e 74 65 67 65 72 2e 0a 23 0a 64 6f 5f  d integer..#.do_
eab0: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
eac0: 2d 33 31 2e 32 2e 31 20 7b 20 43 41 53 54 28 32  -31.2.1 { CAST(2
ead0: 65 2b 35 30 20 41 53 20 49 4e 54 29 20 7d 20 69  e+50 AS INT) } i
eae0: 6e 74 65 67 65 72 20 39 32 32 33 33 37 32 30 33  nteger 922337203
eaf0: 36 38 35 34 37 37 35 38 30 37 0a 64 6f 5f 65 78  6854775807.do_ex
eb00: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
eb10: 31 2e 32 2e 32 20 7b 20 43 41 53 54 28 2d 32 65  1.2.2 { CAST(-2e
eb20: 2b 35 30 20 41 53 20 49 4e 54 29 20 7d 20 69 6e  +50 AS INT) } in
eb30: 74 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33  teger -922337203
eb40: 36 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78  6854775808.do_ex
eb50: 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
eb60: 31 2e 32 2e 33 20 7b 20 0a 20 20 43 41 53 54 28  1.2.3 { .  CAST(
eb70: 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
eb80: 35 38 30 39 2e 30 20 41 53 20 49 4e 54 29 0a 7d  5809.0 AS INT).}
eb90: 20 69 6e 74 65 67 65 72 20 2d 39 32 32 33 33 37   integer -922337
eba0: 32 30 33 36 38 35 34 37 37 35 38 30 38 0a 64 6f  2036854775808.do
ebb0: 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
ebc0: 72 2d 33 31 2e 32 2e 34 20 7b 20 0a 20 20 43 41  r-31.2.4 { .  CA
ebd0: 53 54 28 39 32 32 33 33 37 32 30 33 36 38 35 34  ST(9223372036854
ebe0: 37 37 35 38 30 39 2e 30 20 41 53 20 49 4e 54 29  775809.0 AS INT)
ebf0: 0a 7d 20 69 6e 74 65 67 65 72 20 39 32 32 33 33  .} integer 92233
ec00: 37 32 30 33 36 38 35 34 37 37 35 38 30 37 0a 0a  72036854775807..
ec10: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
ec20: 52 2d 30 39 32 39 35 2d 36 31 33 33 37 20 43 61  R-09295-61337 Ca
ec30: 73 74 69 6e 67 20 61 20 54 45 58 54 20 6f 72 20  sting a TEXT or 
ec40: 42 4c 4f 42 20 76 61 6c 75 65 20 69 6e 74 6f 20  BLOB value into 
ec50: 4e 55 4d 45 52 49 43 0a 23 20 66 69 72 73 74 20  NUMERIC.# first 
ec60: 64 6f 65 73 20 61 20 66 6f 72 63 65 64 20 63 6f  does a forced co
ec70: 6e 76 65 72 73 69 6f 6e 20 69 6e 74 6f 20 52 45  nversion into RE
ec80: 41 4c 20 62 75 74 20 74 68 65 6e 20 66 75 72 74  AL but then furt
ec90: 68 65 72 20 63 6f 6e 76 65 72 74 73 20 74 68 65  her converts the
eca0: 0a 23 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 49  .# result into I
ecb0: 4e 54 45 47 45 52 20 69 66 20 61 6e 64 20 6f 6e  NTEGER if and on
ecc0: 6c 79 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72  ly if the conver
ecd0: 73 69 6f 6e 20 66 72 6f 6d 20 52 45 41 4c 20 74  sion from REAL t
ece0: 6f 20 49 4e 54 45 47 45 52 0a 23 20 69 73 20 6c  o INTEGER.# is l
ecf0: 6f 73 73 6c 65 73 73 20 61 6e 64 20 72 65 76 65  ossless and reve
ed00: 72 73 69 62 6c 65 2e 0a 23 0a 64 6f 5f 65 78 70  rsible..#.do_exp
ed10: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32  r_test e_expr-32
ed20: 2e 31 2e 31 20 7b 20 43 41 53 54 28 27 34 35 27  .1.1 { CAST('45'
ed30: 20 20 20 41 53 20 4e 55 4d 45 52 49 43 29 20 20     AS NUMERIC)  
ed40: 7d 20 69 6e 74 65 67 65 72 20 34 35 0a 64 6f 5f  } integer 45.do_
ed50: 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72  expr_test e_expr
ed60: 2d 33 32 2e 31 2e 32 20 7b 20 43 41 53 54 28 27  -32.1.2 { CAST('
ed70: 34 35 2e 30 27 20 41 53 20 4e 55 4d 45 52 49 43  45.0' AS NUMERIC
ed80: 29 20 20 7d 20 69 6e 74 65 67 65 72 20 34 35 0a  )  } integer 45.
ed90: 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65  do_expr_test e_e
eda0: 78 70 72 2d 33 32 2e 31 2e 33 20 7b 20 43 41 53  xpr-32.1.3 { CAS
edb0: 54 28 27 34 35 2e 32 27 20 41 53 20 4e 55 4d 45  T('45.2' AS NUME
edc0: 52 49 43 29 20 20 7d 20 72 65 61 6c 20 34 35 2e  RIC)  } real 45.
edd0: 32 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  2.do_expr_test e
ede0: 5f 65 78 70 72 2d 33 32 2e 31 2e 34 20 7b 20 43  _expr-32.1.4 { C
edf0: 41 53 54 28 27 31 31 61 62 63 27 20 41 53 20 4e  AST('11abc' AS N
ee00: 55 4d 45 52 49 43 29 20 7d 20 69 6e 74 65 67 65  UMERIC) } intege
ee10: 72 20 31 31 0a 64 6f 5f 65 78 70 72 5f 74 65 73  r 11.do_expr_tes
ee20: 74 20 65 5f 65 78 70 72 2d 33 32 2e 31 2e 35 20  t e_expr-32.1.5 
ee30: 7b 20 43 41 53 54 28 27 31 31 2e 31 61 62 63 27  { CAST('11.1abc'
ee40: 20 41 53 20 4e 55 4d 45 52 49 43 29 20 7d 20 72   AS NUMERIC) } r
ee50: 65 61 6c 20 31 31 2e 31 0a 0a 23 20 45 56 49 44  eal 11.1..# EVID
ee60: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 33 34 37  ENCE-OF: R-30347
ee70: 2d 31 38 37 30 32 20 43 61 73 74 69 6e 67 20 61  -18702 Casting a
ee80: 20 52 45 41 4c 20 6f 72 20 49 4e 54 45 47 45 52   REAL or INTEGER
ee90: 20 76 61 6c 75 65 20 74 6f 20 4e 55 4d 45 52 49   value to NUMERI
eea0: 43 0a 23 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20  C.# is a no-op, 
eeb0: 65 76 65 6e 20 69 66 20 61 20 72 65 61 6c 20 76  even if a real v
eec0: 61 6c 75 65 20 63 6f 75 6c 64 20 62 65 20 6c 6f  alue could be lo
eed0: 73 73 6c 65 73 73 6c 79 20 63 6f 6e 76 65 72 74  sslessly convert
eee0: 65 64 20 74 6f 20 61 6e 0a 23 20 69 6e 74 65 67  ed to an.# integ
eef0: 65 72 2e 0a 23 0a 64 6f 5f 65 78 70 72 5f 74 65  er..#.do_expr_te
ef00: 73 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 31  st e_expr-32.2.1
ef10: 20 7b 20 43 41 53 54 28 31 33 2e 30 20 41 53 20   { CAST(13.0 AS 
ef20: 4e 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c 20  NUMERIC) } real 
ef30: 31 33 2e 30 0a 64 6f 5f 65 78 70 72 5f 74 65 73  13.0.do_expr_tes
ef40: 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 32 20  t e_expr-32.2.2 
ef50: 7b 20 43 41 53 54 28 31 33 2e 35 20 41 53 20 4e  { CAST(13.5 AS N
ef60: 55 4d 45 52 49 43 29 20 7d 20 72 65 61 6c 20 31  UMERIC) } real 1
ef70: 33 2e 35 0a 0a 64 6f 5f 65 78 70 72 5f 74 65 73  3.5..do_expr_tes
ef80: 74 20 65 5f 65 78 70 72 2d 33 32 2e 32 2e 33 20  t e_expr-32.2.3 
ef90: 7b 20 0a 20 20 43 41 53 54 28 2d 39 32 32 33 33  { .  CAST(-92233
efa0: 37 32 30 33 36 38 35 34 37 37 35 38 30 38 20 41  72036854775808 A
efb0: 53 20 4e 55 4d 45 52 49 43 29 0a 7d 20 69 6e 74  S NUMERIC).} int
efc0: 65 67 65 72 20 2d 39 32 32 33 33 37 32 30 33 36  eger -9223372036
efd0: 38 35 34 37 37 35 38 30 38 0a 64 6f 5f 65 78 70  854775808.do_exp
efe0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 32  r_test e_expr-32
eff0: 2e 32 2e 34 20 7b 20 0a 20 20 43 41 53 54 28 39  .2.4 { .  CAST(9
f000: 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
f010: 30 37 20 41 53 20 4e 55 4d 45 52 49 43 29 0a 7d  07 AS NUMERIC).}
f020: 20 69 6e 74 65 67 65 72 20 39 32 32 33 33 37 32   integer 9223372
f030: 30 33 36 38 35 34 37 37 35 38 30 37 0a 0a 23 20  036854775807..# 
f040: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
f050: 34 35 35 30 2d 32 39 31 39 31 20 4e 6f 74 65 20  4550-29191 Note 
f060: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
f070: 66 72 6f 6d 20 63 61 73 74 69 6e 67 20 61 6e 79  from casting any
f080: 0a 23 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75  .# non-BLOB valu
f090: 65 20 69 6e 74 6f 20 61 20 42 4c 4f 42 20 61 6e  e into a BLOB an
f0a0: 64 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f  d the result fro
f0b0: 6d 20 63 61 73 74 69 6e 67 20 61 6e 79 20 42 4c  m casting any BL
f0c0: 4f 42 20 76 61 6c 75 65 0a 23 20 69 6e 74 6f 20  OB value.# into 
f0d0: 61 20 6e 6f 6e 2d 42 4c 4f 42 20 76 61 6c 75 65  a non-BLOB value
f0e0: 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65 6e   may be differen
f0f0: 74 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  t depending on w
f100: 68 65 74 68 65 72 20 74 68 65 0a 23 20 64 61 74  hether the.# dat
f110: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 69  abase encoding i
f120: 73 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 62  s UTF-8, UTF-16b
f130: 65 2c 20 6f 72 20 55 54 46 2d 31 36 6c 65 2e 0a  e, or UTF-16le..
f140: 23 0a 69 66 63 61 70 61 62 6c 65 20 7b 75 74 66  #.ifcapable {utf
f150: 31 36 7d 20 7b 0a 73 71 6c 69 74 65 33 20 64 62  16} {.sqlite3 db
f160: 31 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 31  1 :memory: ; db1
f170: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65   eval { PRAGMA e
f180: 6e 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 38  ncoding = 'utf-8
f190: 27 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 32 20  ' }.sqlite3 db2 
f1a0: 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 32 20 65  :memory: ; db2 e
f1b0: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e 63  val { PRAGMA enc
f1c0: 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36 6c  oding = 'utf-16l
f1d0: 65 27 20 7d 0a 73 71 6c 69 74 65 33 20 64 62 33  e' }.sqlite3 db3
f1e0: 20 3a 6d 65 6d 6f 72 79 3a 20 3b 20 64 62 33 20   :memory: ; db3 
f1f0: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 65 6e  eval { PRAGMA en
f200: 63 6f 64 69 6e 67 20 3d 20 27 75 74 66 2d 31 36  coding = 'utf-16
f210: 62 65 27 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74  be' }.foreach {t
f220: 6e 20 63 61 73 74 65 78 70 72 20 64 69 66 66 65  n castexpr diffe
f230: 72 73 7d 20 7b 0a 20 20 31 20 7b 20 43 41 53 54  rs} {.  1 { CAST
f240: 28 31 32 33 20 41 53 20 42 4c 4f 42 29 20 20 20  (123 AS BLOB)   
f250: 20 7d 20 31 0a 20 20 32 20 7b 20 43 41 53 54 28   } 1.  2 { CAST(
f260: 27 27 20 41 53 20 42 4c 4f 42 29 20 20 20 20 20  '' AS BLOB)     
f270: 7d 20 30 0a 20 20 33 20 7b 20 43 41 53 54 28 27  } 0.  3 { CAST('
f280: 61 62 63 64 27 20 41 53 20 42 4c 4f 42 29 20 7d  abcd' AS BLOB) }
f290: 20 31 0a 0a 20 20 34 20 7b 20 43 41 53 54 28 58   1..  4 { CAST(X
f2a0: 27 61 62 63 64 27 20 41 53 20 54 45 58 54 29 20  'abcd' AS TEXT) 
f2b0: 7d 20 31 0a 20 20 35 20 7b 20 43 41 53 54 28 58  } 1.  5 { CAST(X
f2c0: 27 27 20 41 53 20 54 45 58 54 29 20 20 20 20 20  '' AS TEXT)     
f2d0: 7d 20 30 0a 7d 20 7b 0a 20 20 73 65 74 20 72 31  } 0.} {.  set r1
f2e0: 20 5b 64 62 31 20 65 76 61 6c 20 22 53 45 4c 45   [db1 eval "SELE
f2f0: 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74 65  CT typeof($caste
f300: 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61 73  xpr), quote($cas
f310: 74 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20 72  texpr)"].  set r
f320: 32 20 5b 64 62 32 20 65 76 61 6c 20 22 53 45 4c  2 [db2 eval "SEL
f330: 45 43 54 20 74 79 70 65 6f 66 28 24 63 61 73 74  ECT typeof($cast
f340: 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63 61  expr), quote($ca
f350: 73 74 65 78 70 72 29 22 5d 0a 20 20 73 65 74 20  stexpr)"].  set 
f360: 72 33 20 5b 64 62 33 20 65 76 61 6c 20 22 53 45  r3 [db3 eval "SE
f370: 4c 45 43 54 20 74 79 70 65 6f 66 28 24 63 61 73  LECT typeof($cas
f380: 74 65 78 70 72 29 2c 20 71 75 6f 74 65 28 24 63  texpr), quote($c
f390: 61 73 74 65 78 70 72 29 22 5d 0a 0a 20 20 69 66  astexpr)"]..  if
f3a0: 20 7b 24 64 69 66 66 65 72 73 7d 20 7b 0a 20 20   {$differs} {.  
f3b0: 20 20 73 65 74 20 72 65 73 20 5b 65 78 70 72 20    set res [expr 
f3c0: 7b 24 72 31 21 3d 24 72 32 20 26 26 20 24 72 32  {$r1!=$r2 && $r2
f3d0: 21 3d 24 72 33 7d 5d 0a 20 20 7d 20 65 6c 73 65  !=$r3}].  } else
f3e0: 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b   {.    set res [
f3f0: 65 78 70 72 20 7b 24 72 31 3d 3d 24 72 32 20 26  expr {$r1==$r2 &
f400: 26 20 24 72 32 3d 3d 24 72 33 7d 5d 0a 20 20 7d  & $r2==$r3}].  }
f410: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 65 5f 65 78  ..  do_test e_ex
f420: 70 72 2d 33 33 2e 31 2e 24 74 6e 20 7b 73 65 74  pr-33.1.$tn {set
f430: 20 72 65 73 7d 20 31 0a 7d 0a 64 62 31 20 63 6c   res} 1.}.db1 cl
f440: 6f 73 65 0a 64 62 32 20 63 6c 6f 73 65 0a 64 62  ose.db2 close.db
f450: 33 20 63 6c 6f 73 65 0a 7d 0a 0a 23 2d 2d 2d 2d  3 close.}..#----
f460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f4a0: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61  -----.# Test sta
f4b0: 74 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20  tements related 
f4c0: 74 6f 20 74 68 65 20 45 58 49 53 54 53 20 61 6e  to the EXISTS an
f4d0: 64 20 4e 4f 54 20 45 58 49 53 54 53 20 6f 70 65  d NOT EXISTS ope
f4e0: 72 61 74 6f 72 73 2e 0a 23 0a 63 61 74 63 68 20  rators..#.catch 
f4f0: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72  { db close }.for
f500: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
f510: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
f520: 2e 64 62 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  .db..do_execsql_
f530: 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34 2e 31  test e_expr-34.1
f540: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
f550: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 49 4e  E t1(a, b);.  IN
f560: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
f570: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53  UES(1, 2);.  INS
f580: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
f590: 45 53 28 4e 55 4c 4c 2c 20 32 29 3b 0a 20 20 49  ES(NULL, 2);.  I
f5a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
f5b0: 4c 55 45 53 28 31 2c 20 4e 55 4c 4c 29 3b 0a 20  LUES(1, NULL);. 
f5c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
f5d0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 4e 55 4c  VALUES(NULL, NUL
f5e0: 4c 29 3b 0a 7d 20 7b 7d 0a 0a 23 20 45 56 49 44  L);.} {}..# EVID
f5f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 35 38 38  ENCE-OF: R-25588
f600: 2d 32 37 31 38 31 20 54 68 65 20 45 58 49 53 54  -27181 The EXIST
f610: 53 20 6f 70 65 72 61 74 6f 72 20 61 6c 77 61 79  S operator alway
f620: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 6f  s evaluates to o
f630: 6e 65 0a 23 20 6f 66 20 74 68 65 20 69 6e 74 65  ne.# of the inte
f640: 67 65 72 20 76 61 6c 75 65 73 20 30 20 61 6e 64  ger values 0 and
f650: 20 31 2e 0a 23 0a 23 20 54 68 69 73 20 73 74 61   1..#.# This sta
f660: 74 65 6d 65 6e 74 20 69 73 20 6e 6f 74 20 74 65  tement is not te
f670: 73 74 65 64 20 62 79 20 69 74 73 65 6c 66 2e 20  sted by itself. 
f680: 49 6e 73 74 65 61 64 2c 20 61 6c 6c 20 65 5f 65  Instead, all e_e
f690: 78 70 72 2d 33 34 2e 2a 20 74 65 73 74 73 20 0a  xpr-34.* tests .
f6a0: 23 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  # following this
f6b0: 20 70 6f 69 6e 74 20 65 78 70 6c 69 63 69 74 6c   point explicitl
f6c0: 79 20 74 65 73 74 20 74 68 61 74 20 73 70 65 63  y test that spec
f6d0: 69 66 69 63 20 69 6e 76 6f 63 61 74 69 6f 6e 73  ific invocations
f6e0: 20 6f 66 20 45 58 49 53 54 53 0a 23 20 72 65 74   of EXISTS.# ret
f6f0: 75 72 6e 20 65 69 74 68 65 72 20 69 6e 74 65 67  urn either integ
f700: 65 72 20 30 20 6f 72 20 69 6e 74 65 67 65 72 20  er 0 or integer 
f710: 31 2e 0a 23 0a 0a 23 20 45 56 49 44 45 4e 43 45  1..#..# EVIDENCE
f720: 2d 4f 46 3a 20 52 2d 35 38 35 35 33 2d 36 33 37  -OF: R-58553-637
f730: 34 30 20 49 66 20 65 78 65 63 75 74 69 6e 67 20  40 If executing 
f740: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
f750: 6d 65 6e 74 20 73 70 65 63 69 66 69 65 64 0a 23  ment specified.#
f760: 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 68 61   as the right-ha
f770: 6e 64 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  nd operand of th
f780: 65 20 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f  e EXISTS operato
f790: 72 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f  r would return o
f7a0: 6e 65 20 6f 72 0a 23 20 6d 6f 72 65 20 72 6f 77  ne or.# more row
f7b0: 73 2c 20 74 68 65 6e 20 74 68 65 20 45 58 49 53  s, then the EXIS
f7c0: 54 53 20 6f 70 65 72 61 74 6f 72 20 65 76 61 6c  TS operator eval
f7d0: 75 61 74 65 73 20 74 6f 20 31 2e 0a 23 0a 66 6f  uates to 1..#.fo
f7e0: 72 65 61 63 68 20 7b 74 6e 20 65 78 70 72 7d 20  reach {tn expr} 
f7f0: 7b 0a 20 20 20 20 31 20 7b 20 45 58 49 53 54 53  {.    1 { EXISTS
f800: 20 28 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   ( SELECT a FROM
f810: 20 74 31 20 29 20 7d 0a 20 20 20 20 32 20 7b 20   t1 ) }.    2 { 
f820: 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
f830: 62 20 46 52 4f 4d 20 74 31 20 29 20 7d 0a 20 20  b FROM t1 ) }.  
f840: 20 20 33 20 7b 20 45 58 49 53 54 53 20 28 20 53    3 { EXISTS ( S
f850: 45 4c 45 43 54 20 32 34 20 29 20 7d 0a 20 20 20  ELECT 24 ) }.   
f860: 20 34 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   4 { EXISTS ( SE
f870: 4c 45 43 54 20 4e 55 4c 4c 20 29 20 7d 0a 20 20  LECT NULL ) }.  
f880: 20 20 35 20 7b 20 45 58 49 53 54 53 20 28 20 53    5 { EXISTS ( S
f890: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
f8a0: 57 48 45 52 45 20 61 20 49 53 20 4e 55 4c 4c 20  WHERE a IS NULL 
f8b0: 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 70  ) }.} {.  do_exp
f8c0: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 34  r_test e_expr-34
f8d0: 2e 32 2e 24 74 6e 20 24 65 78 70 72 20 69 6e 74  .2.$tn $expr int
f8e0: 65 67 65 72 20 31 0a 7d 0a 0a 23 20 45 56 49 44  eger 1.}..# EVID
f8f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 36 37 33  ENCE-OF: R-19673
f900: 2d 34 30 39 37 32 20 49 66 20 65 78 65 63 75 74  -40972 If execut
f910: 69 6e 67 20 74 68 65 20 53 45 4c 45 43 54 20 77  ing the SELECT w
f920: 6f 75 6c 64 20 72 65 74 75 72 6e 20 6e 6f 0a 23  ould return no.#
f930: 20 72 6f 77 73 20 61 74 20 61 6c 6c 2c 20 74 68   rows at all, th
f940: 65 6e 20 74 68 65 20 45 58 49 53 54 53 20 6f 70  en the EXISTS op
f950: 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74 65 73  erator evaluates
f960: 20 74 6f 20 30 2e 0a 23 0a 66 6f 72 65 61 63 68   to 0..#.foreach
f970: 20 7b 74 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20   {tn expr} {.   
f980: 20 31 20 7b 20 45 58 49 53 54 53 20 28 20 53 45   1 { EXISTS ( SE
f990: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57  LECT a FROM t1 W
f9a0: 48 45 52 45 20 30 29 20 7d 0a 20 20 20 20 32 20  HERE 0) }.    2 
f9b0: 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45 43  { EXISTS ( SELEC
f9c0: 54 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T b FROM t1 WHER
f9d0: 45 20 61 20 3d 20 35 29 20 7d 0a 20 20 20 20 33  E a = 5) }.    3
f9e0: 20 7b 20 45 58 49 53 54 53 20 28 20 53 45 4c 45   { EXISTS ( SELE
f9f0: 43 54 20 32 34 20 57 48 45 52 45 20 30 29 20 7d  CT 24 WHERE 0) }
fa00: 0a 20 20 20 20 34 20 7b 20 45 58 49 53 54 53 20  .    4 { EXISTS 
fa10: 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 57 48  ( SELECT NULL WH
fa20: 45 52 45 20 31 3d 32 29 20 7d 0a 7d 20 7b 0a 20  ERE 1=2) }.} {. 
fa30: 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f   do_expr_test e_
fa40: 65 78 70 72 2d 33 34 2e 33 2e 24 74 6e 20 24 65  expr-34.3.$tn $e
fa50: 78 70 72 20 69 6e 74 65 67 65 72 20 30 0a 7d 0a  xpr integer 0.}.
fa60: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
fa70: 52 2d 33 35 31 30 39 2d 34 39 31 33 39 20 54 68  R-35109-49139 Th
fa80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
fa90: 6d 6e 73 20 69 6e 20 65 61 63 68 20 72 6f 77 20  mns in each row 
faa0: 72 65 74 75 72 6e 65 64 0a 23 20 62 79 20 74 68  returned.# by th
fab0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
fac0: 6e 74 20 28 69 66 20 61 6e 79 29 20 61 6e 64 20  nt (if any) and 
fad0: 74 68 65 20 73 70 65 63 69 66 69 63 20 76 61 6c  the specific val
fae0: 75 65 73 20 72 65 74 75 72 6e 65 64 20 68 61 76  ues returned hav
faf0: 65 0a 23 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e  e.# no effect on
fb00: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
fb10: 74 68 65 20 45 58 49 53 54 53 20 6f 70 65 72 61  the EXISTS opera
fb20: 74 6f 72 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  tor..#.foreach {
fb30: 74 6e 20 65 78 70 72 20 72 65 73 7d 20 7b 0a 20  tn expr res} {. 
fb40: 20 20 20 31 20 7b 20 45 58 49 53 54 53 20 28 20     1 { EXISTS ( 
fb50: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
fb60: 20 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20   ) }            
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 0a                1.
fb80: 20 20 20 20 32 20 7b 20 45 58 49 53 54 53 20 28      2 { EXISTS (
fb90: 20 53 45 4c 45 43 54 20 2a 2c 20 2a 2c 20 2a 20   SELECT *, *, * 
fba0: 46 52 4f 4d 20 74 31 20 29 20 7d 20 20 20 20 20  FROM t1 ) }     
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
fbc0: 0a 20 20 20 20 33 20 7b 20 45 58 49 53 54 53 20  .    3 { EXISTS 
fbd0: 28 20 53 45 4c 45 43 54 20 32 34 2c 20 32 35 20  ( SELECT 24, 25 
fbe0: 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ) }             
fbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc00: 31 0a 20 20 20 20 34 20 7b 20 45 58 49 53 54 53  1.    4 { EXISTS
fc10: 20 28 20 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20   ( SELECT NULL, 
fc20: 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 29 20 7d 20 20  NULL, NULL ) }  
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc40: 20 31 0a 20 20 20 20 35 20 7b 20 45 58 49 53 54   1.    5 { EXIST
fc50: 53 20 28 20 53 45 4c 45 43 54 20 61 2c 62 2c 61  S ( SELECT a,b,a
fc60: 7c 7c 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ||b FROM t1 WHER
fc70: 45 20 61 20 49 53 20 4e 55 4c 4c 20 29 20 7d 20  E a IS NULL ) } 
fc80: 20 20 31 0a 0a 20 20 20 20 36 20 7b 20 45 58 49    1..    6 { EXI
fc90: 53 54 53 20 28 20 53 45 4c 45 43 54 20 61 2c 20  STS ( SELECT a, 
fca0: 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
fcb0: 30 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0) }            
fcc0: 20 20 20 20 30 0a 20 20 20 20 37 20 7b 20 45 58      0.    7 { EX
fcd0: 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 62 2c  ISTS ( SELECT b,
fce0: 20 62 2c 20 61 20 46 52 4f 4d 20 74 31 20 57 48   b, a FROM t1 WH
fcf0: 45 52 45 20 61 20 3d 20 35 29 20 7d 20 20 20 20  ERE a = 5) }    
fd00: 20 20 20 20 20 30 0a 20 20 20 20 38 20 7b 20 45       0.    8 { E
fd10: 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20 32  XISTS ( SELECT 2
fd20: 34 2c 20 34 36 2c 20 38 39 20 57 48 45 52 45 20  4, 46, 89 WHERE 
fd30: 30 29 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0) }            
fd40: 20 20 20 20 20 20 30 0a 20 20 20 20 39 20 7b 20        0.    9 { 
fd50: 45 58 49 53 54 53 20 28 20 53 45 4c 45 43 54 20  EXISTS ( SELECT 
fd60: 4e 55 4c 4c 2c 20 4e 55 4c 4c 20 57 48 45 52 45  NULL, NULL WHERE
fd70: 20 31 3d 32 29 20 7d 20 20 20 20 20 20 20 20 20   1=2) }         
fd80: 20 20 20 20 20 20 20 30 0a 7d 20 7b 0a 20 20 64         0.} {.  d
fd90: 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78  o_expr_test e_ex
fda0: 70 72 2d 33 34 2e 34 2e 24 74 6e 20 24 65 78 70  pr-34.4.$tn $exp
fdb0: 72 20 69 6e 74 65 67 65 72 20 24 72 65 73 0a 7d  r integer $res.}
fdc0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
fdd0: 20 52 2d 31 30 36 34 35 2d 31 32 34 33 39 20 49   R-10645-12439 I
fde0: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 72 6f  n particular, ro
fdf0: 77 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 4e 55  ws containing NU
fe00: 4c 4c 20 76 61 6c 75 65 73 0a 23 20 61 72 65 20  LL values.# are 
fe10: 6e 6f 74 20 68 61 6e 64 6c 65 64 20 61 6e 79 20  not handled any 
fe20: 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
fe30: 20 72 6f 77 73 20 77 69 74 68 6f 75 74 20 4e 55   rows without NU
fe40: 4c 4c 20 76 61 6c 75 65 73 2e 0a 23 0a 66 6f 72  LL values..#.for
fe50: 65 61 63 68 20 7b 74 6e 20 65 31 20 65 32 7d 20  each {tn e1 e2} 
fe60: 7b 0a 20 20 31 20 7b 20 45 58 49 53 54 53 20 28  {.  1 { EXISTS (
fe70: 53 45 4c 45 43 54 20 27 6e 6f 74 20 6e 75 6c 6c  SELECT 'not null
fe80: 27 29 20 7d 20 20 20 20 7b 20 45 58 49 53 54 53  ') }    { EXISTS
fe90: 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d   (SELECT NULL) }
fea0: 0a 20 20 32 20 7b 20 45 58 49 53 54 53 20 28 53  .  2 { EXISTS (S
feb0: 45 4c 45 43 54 20 4e 55 4c 4c 20 46 52 4f 4d 20  ELECT NULL FROM 
fec0: 74 31 29 20 7d 20 20 7b 20 45 58 49 53 54 53 20  t1) }  { EXISTS 
fed0: 28 53 45 4c 45 43 54 20 27 62 72 65 61 64 27 20  (SELECT 'bread' 
fee0: 46 52 4f 4d 20 74 31 29 20 7d 0a 7d 20 7b 0a 20  FROM t1) }.} {. 
fef0: 20 73 65 74 20 72 65 73 20 5b 64 62 20 6f 6e 65   set res [db one
ff00: 20 22 53 45 4c 45 43 54 20 24 65 31 22 5d 0a 20   "SELECT $e1"]. 
ff10: 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f   do_expr_test e_
ff20: 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74 6e 7d 61  expr-34.5.${tn}a
ff30: 20 24 65 31 20 69 6e 74 65 67 65 72 20 24 72 65   $e1 integer $re
ff40: 73 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  s.  do_expr_test
ff50: 20 65 5f 65 78 70 72 2d 33 34 2e 35 2e 24 7b 74   e_expr-34.5.${t
ff60: 6e 7d 62 20 24 65 32 20 69 6e 74 65 67 65 72 20  n}b $e2 integer 
ff70: 24 72 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  $res.}..#-------
ff80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ff90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ffa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ffb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ffc0: 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74 65 6d  --.# Test statem
ffd0: 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20  ents related to 
ffe0: 73 63 61 6c 61 72 20 73 75 62 2d 71 75 65 72 69  scalar sub-queri
fff0: 65 73 2e 0a 23 0a 0a 63 61 74 63 68 20 7b 20 64  es..#..catch { d
10000 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64  b close }.forced
10010 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 73 71  elete test.db.sq
10020 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
10030 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  .do_test e_expr-
10040 33 35 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  35.0 {.  execsql
10050 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
10060 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
10070 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
10080 20 56 41 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27   VALUES('one', '
10090 74 77 6f 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  two');.    INSER
100a0 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
100b0 28 27 74 68 72 65 65 27 2c 20 4e 55 4c 4c 29 3b  ('three', NULL);
100c0 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
100d0 20 74 32 20 56 41 4c 55 45 53 28 34 2c 20 35 2e   t2 VALUES(4, 5.
100e0 30 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20  0);.  }.} {}..# 
100f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
10100 33 35 37 33 2d 32 33 34 34 38 20 41 20 53 45 4c  3573-23448 A SEL
10110 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 65 6e  ECT statement en
10120 63 6c 6f 73 65 64 20 69 6e 20 70 61 72 65 6e 74  closed in parent
10130 68 65 73 65 73 0a 23 20 69 73 20 61 20 73 75 62  heses.# is a sub
10140 71 75 65 72 79 2e 0a 23 0a 23 20 45 56 49 44 45  query..#.# EVIDE
10150 4e 43 45 2d 4f 46 3a 20 52 2d 35 36 32 39 34 2d  NCE-OF: R-56294-
10160 30 33 39 36 36 20 41 6c 6c 20 74 79 70 65 73 20  03966 All types 
10170 6f 66 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  of SELECT statem
10180 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 0a 23  ent, including.#
10190 20 61 67 67 72 65 67 61 74 65 20 61 6e 64 20 63   aggregate and c
101a0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 71  ompound SELECT q
101b0 75 65 72 69 65 73 20 28 71 75 65 72 69 65 73 20  ueries (queries 
101c0 77 69 74 68 20 6b 65 79 77 6f 72 64 73 20 6c 69  with keywords li
101d0 6b 65 0a 23 20 55 4e 49 4f 4e 20 6f 72 20 45 58  ke.# UNION or EX
101e0 43 45 50 54 29 20 61 72 65 20 61 6c 6c 6f 77 65  CEPT) are allowe
101f0 64 20 61 73 20 73 63 61 6c 61 72 20 73 75 62 71  d as scalar subq
10200 75 65 72 69 65 73 2e 0a 23 0a 64 6f 5f 65 78 70  ueries..#.do_exp
10210 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35  r_test e_expr-35
10220 2e 31 2e 31 20 7b 20 28 53 45 4c 45 43 54 20 33  .1.1 { (SELECT 3
10230 35 29 20 20 20 7d 20 69 6e 74 65 67 65 72 20 33  5)   } integer 3
10240 35 0a 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65  5.do_expr_test e
10250 5f 65 78 70 72 2d 33 35 2e 31 2e 32 20 7b 20 28  _expr-35.1.2 { (
10260 53 45 4c 45 43 54 20 4e 55 4c 4c 29 20 7d 20 6e  SELECT NULL) } n
10270 75 6c 6c 20 7b 7d 0a 0a 64 6f 5f 65 78 70 72 5f  ull {}..do_expr_
10280 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31  test e_expr-35.1
10290 2e 33 20 7b 20 28 53 45 4c 45 43 54 20 63 6f 75  .3 { (SELECT cou
102a0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 20 7d  nt(*) FROM t2) }
102b0 20 69 6e 74 65 67 65 72 20 33 0a 64 6f 5f 65 78   integer 3.do_ex
102c0 70 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  pr_test e_expr-3
102d0 35 2e 31 2e 34 20 7b 20 28 53 45 4c 45 43 54 20  5.1.4 { (SELECT 
102e0 34 20 46 52 4f 4d 20 74 32 29 20 7d 20 69 6e 74  4 FROM t2) } int
102f0 65 67 65 72 20 34 0a 0a 64 6f 5f 65 78 70 72 5f  eger 4..do_expr_
10300 74 65 73 74 20 65 5f 65 78 70 72 2d 33 35 2e 31  test e_expr-35.1
10310 2e 35 20 7b 20 0a 20 20 28 53 45 4c 45 43 54 20  .5 { .  (SELECT 
10320 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
10330 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
10340 74 32 29 0a 7d 20 6e 75 6c 6c 20 7b 7d 0a 64 6f  t2).} null {}.do
10350 5f 65 78 70 72 5f 74 65 73 74 20 65 5f 65 78 70  _expr_test e_exp
10360 72 2d 33 35 2e 31 2e 36 20 7b 20 0a 20 20 28 53  r-35.1.6 { .  (S
10370 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 32 20  ELECT a FROM t2 
10380 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 43 4f 41  UNION SELECT COA
10390 4c 45 53 43 45 28 62 2c 20 35 35 29 20 46 52 4f  LESCE(b, 55) FRO
103a0 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 31 29  M t2 ORDER BY 1)
103b0 0a 7d 20 69 6e 74 65 67 65 72 20 34 0a 0a 23 20  .} integer 4..# 
103c0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
103d0 32 32 33 39 2d 33 33 37 34 30 20 41 20 73 75 62  2239-33740 A sub
103e0 71 75 65 72 79 20 74 68 61 74 20 72 65 74 75 72  query that retur
103f0 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  ns two or more c
10400 6f 6c 75 6d 6e 73 0a 23 20 69 73 20 61 20 72 6f  olumns.# is a ro
10410 77 20 76 61 6c 75 65 20 73 75 62 71 75 65 72 79  w value subquery
10420 20 61 6e 64 20 63 61 6e 20 6f 6e 6c 79 20 62 65   and can only be
10430 20 75 73 65 64 20 61 73 20 74 68 65 20 6f 70 65   used as the ope
10440 72 61 6e 64 20 6f 66 20 61 0a 23 20 63 6f 6d 70  rand of a.# comp
10450 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
10460 0a 23 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  .#.# The followi
10470 6e 67 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 74  ng block tests t
10480 68 61 74 20 65 72 72 6f 72 73 20 61 72 65 20 72  hat errors are r
10490 65 74 75 72 6e 65 64 20 69 6e 20 61 20 62 75 6e  eturned in a bun
104a0 63 68 20 6f 66 20 63 61 73 65 73 0a 23 20 77 68  ch of cases.# wh
104b0 65 72 65 20 61 20 73 75 62 71 75 65 72 79 20 72  ere a subquery r
104c0 65 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e  eturns more than
104d0 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 0a 23 0a 73   one column..#.s
104e0 65 74 20 4d 20 7b 2f 31 20 7b 73 75 62 2d 73 65  et M {/1 {sub-se
104f0 6c 65 63 74 20 72 65 74 75 72 6e 73 20 5b 32 33  lect returns [23
10500 5d 20 63 6f 6c 75 6d 6e 73 20 2d 20 65 78 70 65  ] columns - expe
10510 63 74 65 64 20 31 7d 2f 7d 0a 66 6f 72 65 61 63  cted 1}/}.foreac
10520 68 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20 31  h {tn sql} {.  1
10530 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20 28 53       { SELECT (S
10540 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
10550 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 61 2b 31  UNION SELECT a+1
10560 2c 20 62 2b 31 20 46 52 4f 4d 20 74 32 29 20 7d  , b+1 FROM t2) }
10570 0a 20 20 32 20 20 20 20 20 7b 20 53 45 4c 45 43  .  2     { SELEC
10580 54 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  T (SELECT * FROM
10590 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
105a0 20 61 2b 31 2c 20 62 2b 31 20 46 52 4f 4d 20 74   a+1, b+1 FROM t
105b0 32 20 4f 52 44 45 52 20 42 59 20 31 29 20 7d 0a  2 ORDER BY 1) }.
105c0 20 20 33 20 20 20 20 20 7b 20 53 45 4c 45 43 54    3     { SELECT
105d0 20 28 53 45 4c 45 43 54 20 31 2c 20 32 29 20 7d   (SELECT 1, 2) }
105e0 0a 20 20 34 20 20 20 20 20 7b 20 53 45 4c 45 43  .  4     { SELEC
105f0 54 20 28 53 45 4c 45 43 54 20 4e 55 4c 4c 2c 20  T (SELECT NULL, 
10600 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 20 7d 0a 20 20  NULL, NULL) }.  
10610 35 20 20 20 20 20 7b 20 53 45 4c 45 43 54 20 28  5     { SELECT (
10620 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
10630 29 20 7d 0a 20 20 36 20 20 20 20 20 7b 20 53 45  ) }.  6     { SE
10640 4c 45 43 54 20 28 53 45 4c 45 43 54 20 2a 20 46  LECT (SELECT * F
10650 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 2c 20 32  ROM (SELECT 1, 2
10660 2c 20 33 29 29 20 7d 0a 7d 20 7b 0a 20 20 64 6f  , 3)) }.} {.  do
10670 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
10680 5f 65 78 70 72 2d 33 35 2e 32 2e 24 74 6e 20 24  _expr-35.2.$tn $
10690 73 71 6c 20 24 4d 0a 7d 0a 0a 23 20 45 56 49 44  sql $M.}..# EVID
106a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 33 31 38  ENCE-OF: R-18318
106b0 2d 31 34 39 39 35 20 54 68 65 20 76 61 6c 75 65  -14995 The value
106c0 20 6f 66 20 61 20 73 75 62 71 75 65 72 79 20 65   of a subquery e
106d0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
106e0 0a 23 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  .# first row of 
106f0 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d 20  the result from 
10700 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 53 45 4c  the enclosed SEL
10710 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23  ECT statement..#
10720 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
10730 52 2d 31 35 39 30 30 2d 35 32 31 35 36 20 49 6e  R-15900-52156 In
10740 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 6e   other words, an
10750 20 69 6d 70 6c 69 65 64 20 22 4c 49 4d 49 54 20   implied "LIMIT 
10760 31 22 20 69 73 0a 23 20 61 64 64 65 64 20 74 6f  1" is.# added to
10770 20 74 68 65 20 73 75 62 71 75 65 72 79 2c 20 6f   the subquery, o
10780 76 65 72 72 69 64 69 6e 67 20 61 6e 20 65 78 70  verriding an exp
10790 6c 69 63 69 74 6c 79 20 63 6f 64 65 64 20 4c 49  licitly coded LI
107a0 4d 49 54 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  MIT..#.do_execsq
107b0 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 36  l_test e_expr-36
107c0 2e 33 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  .3.1 {.  CREATE 
107d0 54 41 42 4c 45 20 74 34 28 78 2c 20 79 29 3b 0a  TABLE t4(x, y);.
107e0 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
107f0 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27   VALUES(1, 'one'
10800 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
10810 20 74 34 20 56 41 4c 55 45 53 28 32 2c 20 27 74   t4 VALUES(2, 't
10820 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  wo');.  INSERT I
10830 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 33 2c  NTO t4 VALUES(3,
10840 20 27 74 68 72 65 65 27 29 3b 0a 7d 20 7b 7d 0a   'three');.} {}.
10850 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 65 78 70  .foreach {tn exp
10860 72 20 72 65 73 74 79 70 65 20 72 65 73 76 61 6c  r restype resval
10870 7d 20 7b 0a 20 20 20 20 32 20 20 7b 20 28 20 53  } {.    2  { ( S
10880 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20  ELECT x FROM t4 
10890 4f 52 44 45 52 20 42 59 20 78 20 29 20 20 20 20  ORDER BY x )    
108a0 20 20 7d 20 20 20 20 20 20 20 20 69 6e 74 65 67    }        integ
108b0 65 72 20 31 0a 20 20 20 20 33 20 20 7b 20 28 20  er 1.    3  { ( 
108c0 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34  SELECT x FROM t4
108d0 20 4f 52 44 45 52 20 42 59 20 79 20 29 20 20 20   ORDER BY y )   
108e0 20 20 20 7d 20 20 20 20 20 20 20 20 69 6e 74 65     }        inte
108f0 67 65 72 20 31 0a 20 20 20 20 34 20 20 7b 20 28  ger 1.    4  { (
10900 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
10910 34 20 4f 52 44 45 52 20 42 59 20 78 20 44 45 53  4 ORDER BY x DES
10920 43 20 29 20 7d 20 20 20 20 20 20 20 20 69 6e 74  C ) }        int
10930 65 67 65 72 20 33 0a 20 20 20 20 35 20 20 7b 20  eger 3.    5  { 
10940 28 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20  ( SELECT x FROM 
10950 74 34 20 4f 52 44 45 52 20 42 59 20 79 20 44 45  t4 ORDER BY y DE
10960 53 43 20 29 20 7d 20 20 20 20 20 20 20 20 69 6e  SC ) }        in
10970 74 65 67 65 72 20 32 0a 20 20 20 20 36 20 20 7b  teger 2.    6  {
10980 20 28 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d   ( SELECT y FROM
10990 20 74 34 20 4f 52 44 45 52 20 42 59 20 79 20 44   t4 ORDER BY y D
109a0 45 53 43 20 29 20 7d 20 20 20 20 20 20 20 20 74  ESC ) }        t
109b0 65 78 74 20 20 20 20 74 77 6f 0a 0a 20 20 20 20  ext    two..    
109c0 37 20 20 7b 20 28 20 53 45 4c 45 43 54 20 73 75  7  { ( SELECT su
109d0 6d 28 78 29 20 46 52 4f 4d 20 74 34 20 29 20 20  m(x) FROM t4 )  
109e0 20 20 20 20 20 20 20 20 20 7d 20 20 20 20 20 20           }      
109f0 20 20 20 69 6e 74 65 67 65 72 20 36 0a 20 20 20     integer 6.   
10a00 20 38 20 20 7b 20 28 20 53 45 4c 45 43 54 20 67   8  { ( SELECT g
10a10 72 6f 75 70 5f 63 6f 6e 63 61 74 28 79 2c 27 27  roup_concat(y,''
10a20 29 20 46 52 4f 4d 20 74 34 20 29 20 7d 20 20 20  ) FROM t4 ) }   
10a30 20 20 20 20 74 65 78 74 20 20 20 20 6f 6e 65 74      text    onet
10a40 77 6f 74 68 72 65 65 0a 20 20 20 20 39 20 20 7b  wothree.    9  {
10a50 20 28 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29   ( SELECT max(x)
10a60 20 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 79   FROM t4 WHERE y
10a70 20 4c 49 4b 45 20 27 5f 5f 5f 27 29 20 7d 20 69   LIKE '___') } i
10a80 6e 74 65 67 65 72 20 32 20 0a 0a 7d 20 7b 0a 20  nteger 2 ..} {. 
10a90 20 64 6f 5f 65 78 70 72 5f 74 65 73 74 20 65 5f   do_expr_test e_
10aa0 65 78 70 72 2d 33 36 2e 33 2e 24 74 6e 20 24 65  expr-36.3.$tn $e
10ab0 78 70 72 20 24 72 65 73 74 79 70 65 20 24 72 65  xpr $restype $re
10ac0 73 76 61 6c 0a 7d 0a 0a 23 20 45 56 49 44 45 4e  sval.}..# EVIDEN
10ad0 43 45 2d 4f 46 3a 20 52 2d 35 32 33 32 35 2d 32  CE-OF: R-52325-2
10ae0 35 34 34 39 20 54 68 65 20 76 61 6c 75 65 20 6f  5449 The value o
10af0 66 20 61 20 73 75 62 71 75 65 72 79 20 65 78 70  f a subquery exp
10b00 72 65 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 0a  ression is NULL.
10b10 23 20 69 66 20 74 68 65 20 65 6e 63 6c 6f 73 65  # if the enclose
10b20 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
10b30 6e 74 20 72 65 74 75 72 6e 73 20 6e 6f 20 72 6f  nt returns no ro
10b40 77 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  ws..#.foreach {t
10b50 6e 20 65 78 70 72 7d 20 7b 0a 20 20 20 20 31 20  n expr} {.    1 
10b60 20 7b 20 28 20 53 45 4c 45 43 54 20 78 20 46 52   { ( SELECT x FR
10b70 4f 4d 20 74 34 20 57 48 45 52 45 20 78 3e 33 20  OM t4 WHERE x>3 
10b80 4f 52 44 45 52 20 42 59 20 78 20 29 20 20 20 20  ORDER BY x )    
10b90 20 20 7d 0a 20 20 20 20 32 20 20 7b 20 28 20 53    }.    2  { ( S
10ba0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 34 20  ELECT x FROM t4 
10bb0 57 48 45 52 45 20 79 3c 27 6f 6e 65 27 20 4f 52  WHERE y<'one' OR
10bc0 44 45 52 20 42 59 20 79 20 29 20 20 7d 0a 7d 20  DER BY y )  }.} 
10bd0 7b 0a 20 20 64 6f 5f 65 78 70 72 5f 74 65 73 74  {.  do_expr_test
10be0 20 65 5f 65 78 70 72 2d 33 36 2e 34 2e 24 74 6e   e_expr-36.4.$tn
10bf0 20 24 65 78 70 72 20 6e 75 6c 6c 20 7b 7d 0a 7d   $expr null {}.}
10c00 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
10c10 20 52 2d 36 32 34 37 37 2d 30 36 34 37 36 20 46   R-62477-06476 F
10c20 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
10c30 76 61 6c 75 65 73 20 4e 55 4c 4c 2c 20 30 2e 30  values NULL, 0.0
10c40 2c 20 30 2c 0a 23 20 27 65 6e 67 6c 69 73 68 27  , 0,.# 'english'
10c50 20 61 6e 64 20 27 30 27 20 61 72 65 20 61 6c 6c   and '0' are all
10c60 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
10c70 65 20 66 61 6c 73 65 2e 0a 23 0a 64 6f 5f 65 78  e false..#.do_ex
10c80 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
10c90 72 2d 33 37 2e 31 20 7b 0a 20 20 20 53 45 4c 45  r-37.1 {.   SELE
10ca0 43 54 20 43 41 53 45 20 57 48 45 4e 20 4e 55 4c  CT CASE WHEN NUL
10cb0 4c 20 54 48 45 4e 20 27 74 72 75 65 27 20 45 4c  L THEN 'true' EL
10cc0 53 45 20 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a  SE 'false' END;.
10cd0 7d 20 7b 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65  } {false}.do_exe
10ce0 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
10cf0 2d 33 37 2e 32 20 7b 0a 20 20 20 53 45 4c 45 43  -37.2 {.   SELEC
10d00 54 20 43 41 53 45 20 57 48 45 4e 20 30 2e 30 20  T CASE WHEN 0.0 
10d10 54 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45  THEN 'true' ELSE
10d20 20 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20   'false' END;.} 
10d30 7b 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63 73  {false}.do_execs
10d40 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  ql_test e_expr-3
10d50 37 2e 33 20 7b 0a 20 20 20 53 45 4c 45 43 54 20  7.3 {.   SELECT 
10d60 43 41 53 45 20 57 48 45 4e 20 30 20 54 48 45 4e  CASE WHEN 0 THEN
10d70 20 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61   'true' ELSE 'fa
10d80 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66 61 6c  lse' END;.} {fal
10d90 73 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  se}.do_execsql_t
10da0 65 73 74 20 65 5f 65 78 70 72 2d 33 37 2e 34 20  est e_expr-37.4 
10db0 7b 0a 20 20 20 53 45 4c 45 43 54 20 43 41 53 45  {.   SELECT CASE
10dc0 20 57 48 45 4e 20 27 65 6e 67 6c 69 67 68 27 20   WHEN 'engligh' 
10dd0 54 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45  THEN 'true' ELSE
10de0 20 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20   'false' END;.} 
10df0 7b 66 61 6c 73 65 7d 0a 64 6f 5f 65 78 65 63 73  {false}.do_execs
10e00 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33  ql_test e_expr-3
10e10 37 2e 35 20 7b 0a 20 20 20 53 45 4c 45 43 54 20  7.5 {.   SELECT 
10e20 43 41 53 45 20 57 48 45 4e 20 27 30 27 20 54 48  CASE WHEN '0' TH
10e30 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20 27  EN 'true' ELSE '
10e40 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 66  false' END;.} {f
10e50 61 6c 73 65 7d 0a 0a 23 20 45 56 49 44 45 4e 43  alse}..# EVIDENC
10e60 45 2d 4f 46 3a 20 52 2d 35 35 35 33 32 2d 31 30  E-OF: R-55532-10
10e70 31 30 38 20 56 61 6c 75 65 73 20 31 2c 20 31 2e  108 Values 1, 1.
10e80 30 2c 20 30 2e 31 2c 20 2d 30 2e 31 20 61 6e 64  0, 0.1, -0.1 and
10e90 20 27 31 65 6e 67 6c 69 73 68 27 20 61 72 65 0a   '1english' are.
10ea0 23 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  # considered to 
10eb0 62 65 20 74 72 75 65 2e 0a 23 0a 64 6f 5f 65 78  be true..#.do_ex
10ec0 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
10ed0 72 2d 33 37 2e 36 20 7b 0a 20 20 20 53 45 4c 45  r-37.6 {.   SELE
10ee0 43 54 20 43 41 53 45 20 57 48 45 4e 20 31 20 54  CT CASE WHEN 1 T
10ef0 48 45 4e 20 27 74 72 75 65 27 20 45 4c 53 45 20  HEN 'true' ELSE 
10f00 27 66 61 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b  'false' END;.} {
10f10 74 72 75 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  true}.do_execsql
10f20 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 33 37 2e  _test e_expr-37.
10f30 37 20 7b 0a 20 20 20 53 45 4c 45 43 54 20 43 41  7 {.   SELECT CA
10f40 53 45 20 57 48 45 4e 20 31 2e 30 20 54 48 45 4e  SE WHEN 1.0 THEN
10f50 20 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61   'true' ELSE 'fa
10f60 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75  lse' END;.} {tru
10f70 65 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  e}.do_execsql_te
10f80 73 74 20 65 5f 65 78 70 72 2d 33 37 2e 38 20 7b  st e_expr-37.8 {
10f90 0a 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  .   SELECT CASE 
10fa0 57 48 45 4e 20 30 2e 31 20 54 48 45 4e 20 27 74  WHEN 0.1 THEN 't
10fb0 72 75 65 27 20 45 4c 53 45 20 27 66 61 6c 73 65  rue' ELSE 'false
10fc0 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a  ' END;.} {true}.
10fd0 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
10fe0 65 5f 65 78 70 72 2d 33 37 2e 39 20 7b 0a 20 20  e_expr-37.9 {.  
10ff0 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
11000 4e 20 2d 30 2e 31 20 54 48 45 4e 20 27 74 72 75  N -0.1 THEN 'tru
11010 65 27 20 45 4c 53 45 20 27 66 61 6c 73 65 27 20  e' ELSE 'false' 
11020 45 4e 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a 64 6f  END;.} {true}.do
11030 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
11040 65 78 70 72 2d 33 37 2e 31 30 20 7b 0a 20 20 20  expr-37.10 {.   
11050 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
11060 20 27 31 65 6e 67 6c 69 73 68 27 20 54 48 45 4e   '1english' THEN
11070 20 27 74 72 75 65 27 20 45 4c 53 45 20 27 66 61   'true' ELSE 'fa
11080 6c 73 65 27 20 45 4e 44 3b 0a 7d 20 7b 74 72 75  lse' END;.} {tru
11090 65 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  e}...finish_test
110a0 0a                                               .