/ Hex Artifact Content
Login

Artifact 1c531745c94f091445157fb7953a2cc3f256f8e4:


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 23  oc_common.tcl..#
0240: 20 53 65 74 20 75 70 20 74 68 72 65 65 20 67 6c   Set up three gl
0250: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 3a 0a  obal variables:.
0260: 23 0a 23 20 20 20 3a 3a 6f 70 6e 61 6d 65 20 20  #.#   ::opname  
0270: 20 20 20 20 20 20 20 41 6e 20 61 72 72 61 79 20         An array 
0280: 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 53 51 4c  mapping from SQL
0290: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 61 6e 20   operator to an 
02a0: 65 61 73 79 20 74 6f 20 70 61 72 73 65 0a 23 20  easy to parse.# 
02b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02c0: 20 20 20 6e 61 6d 65 2e 20 54 68 65 20 6e 61 6d     name. The nam
02d0: 65 73 20 61 72 65 20 75 73 65 64 20 61 73 20 70  es are used as p
02e0: 61 72 74 20 6f 66 20 74 65 73 74 20 63 61 73 65  art of test case
02f0: 20 6e 61 6d 65 73 2e 0a 23 0a 23 20 20 20 3a 3a   names..#.#   ::
0300: 6f 70 70 72 65 63 20 20 20 20 20 20 20 20 20 41  opprec         A
0310: 6e 20 61 72 72 61 79 20 6d 61 70 70 69 6e 67 20  n array mapping 
0320: 66 72 6f 6d 20 53 51 4c 20 6f 70 65 72 61 74 6f  from SQL operato
0330: 72 20 74 6f 20 61 20 6e 75 6d 65 72 69 63 0a 23  r to a numeric.#
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 20 20 20 70 72 65 63 65 64 65 6e 63 65 20 76      precedence v
0360: 61 6c 75 65 2e 20 4f 70 65 72 61 74 6f 72 73 20  alue. Operators 
0370: 74 68 61 74 20 67 72 6f 75 70 20 6d 6f 72 65 20  that group more 
0380: 74 69 67 68 74 6c 79 0a 23 20 20 20 20 20 20 20  tightly.#       
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 76               hav
03a0: 65 20 6c 6f 77 65 72 20 6e 75 6d 65 72 69 63 20  e lower numeric 
03b0: 70 72 65 63 65 64 65 6e 63 65 73 2e 0a 23 0a 23  precedences..#.#
03c0: 20 20 20 3a 3a 6f 70 6c 69 73 74 20 20 20 20 20     ::oplist     
03d0: 20 20 20 20 41 20 6c 69 73 74 20 6f 66 20 61 6c      A list of al
03e0: 6c 20 53 51 4c 20 6f 70 65 72 61 74 6f 72 73 20  l SQL operators 
03f0: 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c  supported by SQL
0400: 69 74 65 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  ite..#.foreach {
0410: 6f 70 20 6f 70 6e 7d 20 7b 0a 20 20 20 20 20 20  op opn} {.      
0420: 7c 7c 20 20 20 63 61 74 20 20 20 20 20 2a 20 20  ||   cat     *  
0430: 20 6d 75 6c 20 20 20 20 20 20 20 2f 20 20 64 69   mul       /  di
0440: 76 20 20 20 20 20 20 20 25 20 20 20 20 20 6d 6f  v       %     mo
0450: 64 20 20 20 20 20 20 20 2b 20 20 20 20 20 20 61  d       +      a
0460: 64 64 0a 20 20 20 20 20 20 2d 20 20 20 20 73 75  dd.      -    su
0470: 62 20 20 20 20 20 3c 3c 20 20 6c 73 68 69 66 74  b     <<  lshift
0480: 20 20 20 20 3e 3e 20 72 73 68 69 66 74 20 20 20      >> rshift   
0490: 20 26 20 20 20 20 20 62 69 74 61 6e 64 20 20 20   &     bitand   
04a0: 20 7c 20 20 20 20 20 20 62 69 74 6f 72 0a 20 20   |      bitor.  
04b0: 20 20 20 20 3c 20 20 20 20 6c 65 73 73 20 20 20      <    less   
04c0: 20 3c 3d 20 20 6c 65 73 73 65 71 20 20 20 20 3e   <=  lesseq    >
04d0: 20 20 6d 6f 72 65 20 20 20 20 20 20 3e 3d 20 20    more      >=  
04e0: 20 20 6d 6f 72 65 65 71 20 20 20 20 3d 20 20 20    moreeq    =   
04f0: 20 20 20 65 71 31 0a 20 20 20 20 20 20 3d 3d 20     eq1.      == 
0500: 20 20 65 71 32 20 20 20 20 20 3c 3e 20 20 6e 65    eq2     <>  ne
0510: 31 20 20 20 20 20 20 20 21 3d 20 6e 65 32 20 20  1       != ne2  
0520: 20 20 20 20 20 49 53 20 20 20 20 69 73 20 20 20       IS    is   
0530: 20 20 20 20 20 4c 49 4b 45 20 20 20 6c 69 6b 65       LIKE   like
0540: 0a 20 20 20 20 20 20 47 4c 4f 42 20 67 6c 6f 62  .      GLOB glob
0550: 20 20 20 20 41 4e 44 20 61 6e 64 20 20 20 20 20      AND and     
0560: 20 20 4f 52 20 6f 72 20 20 20 20 20 20 20 20 4d    OR or        M
0570: 41 54 43 48 20 6d 61 74 63 68 20 20 20 20 20 52  ATCH match     R
0580: 45 47 45 58 50 20 72 65 67 65 78 70 0a 20 20 20  EGEXP regexp.   
0590: 20 20 20 7b 49 53 20 4e 4f 54 7d 20 69 73 6e 74     {IS NOT} isnt
05a0: 0a 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 6f 70 6e  .} {.  set ::opn
05b0: 61 6d 65 28 24 6f 70 29 20 24 6f 70 6e 0a 7d 0a  ame($op) $opn.}.
05c0: 73 65 74 20 6f 70 6c 69 73 74 20 5b 6c 69 73 74  set oplist [list
05d0: 5d 0a 66 6f 72 65 61 63 68 20 7b 70 72 65 63 20  ].foreach {prec 
05e0: 6f 70 6c 7d 20 7b 0a 20 20 31 20 20 20 7c 7c 0a  opl} {.  1   ||.
05f0: 20 20 32 20 20 20 7b 2a 20 2f 20 25 7d 0a 20 20    2   {* / %}.  
0600: 33 20 20 20 7b 2b 20 2d 7d 0a 20 20 34 20 20 20  3   {+ -}.  4   
0610: 7b 3c 3c 20 3e 3e 20 26 20 7c 7d 0a 20 20 35 20  {<< >> & |}.  5 
0620: 20 20 7b 3c 20 3c 3d 20 3e 20 3e 3d 7d 0a 20 20    {< <= > >=}.  
0630: 36 20 20 20 7b 3d 20 3d 3d 20 21 3d 20 3c 3e 20  6   {= == != <> 
0640: 49 53 20 7b 49 53 20 4e 4f 54 7d 20 4c 49 4b 45  IS {IS NOT} LIKE
0650: 20 47 4c 4f 42 20 4d 41 54 43 48 20 52 45 47 45   GLOB MATCH REGE
0660: 58 50 7d 0a 20 20 37 20 20 20 41 4e 44 0a 20 20  XP}.  7   AND.  
0670: 38 20 20 20 4f 52 0a 7d 20 7b 0a 20 20 66 6f 72  8   OR.} {.  for
0680: 65 61 63 68 20 6f 70 20 24 6f 70 6c 20 7b 20 0a  each op $opl { .
0690: 20 20 20 20 73 65 74 20 3a 3a 6f 70 70 72 65 63      set ::opprec
06a0: 28 24 6f 70 29 20 24 70 72 65 63 20 0a 20 20 20  ($op) $prec .   
06b0: 20 6c 61 70 70 65 6e 64 20 6f 70 6c 69 73 74 20   lappend oplist 
06c0: 24 6f 70 0a 20 20 7d 0a 7d 0a 0a 0a 23 20 48 6f  $op.  }.}...# Ho
06d0: 6f 6b 20 69 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ok in definition
06e0: 73 20 6f 66 20 4d 41 54 43 48 20 61 6e 64 20 52  s of MATCH and R
06f0: 45 47 45 58 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  EGEX. The follow
0700: 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
0710: 6f 6e 73 0a 23 20 63 61 75 73 65 20 4d 41 54 43  ons.# cause MATC
0720: 48 20 61 6e 64 20 52 45 47 45 58 20 74 6f 20 62  H and REGEX to b
0730: 65 68 61 76 65 20 73 69 6d 69 6c 61 72 6c 79 20  ehave similarly 
0740: 74 6f 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74  to the == operat
0750: 6f 72 2e 0a 23 0a 70 72 6f 63 20 6d 61 74 63 68  or..#.proc match
0760: 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20 72 65 74  func {a b} { ret
0770: 75 72 6e 20 5b 65 78 70 72 20 7b 24 61 3d 3d 24  urn [expr {$a==$
0780: 62 7d 5d 20 7d 0a 70 72 6f 63 20 72 65 67 65 78  b}] }.proc regex
0790: 66 75 6e 63 20 7b 61 20 62 7d 20 7b 20 72 65 74  func {a b} { ret
07a0: 75 72 6e 20 5b 65 78 70 72 20 7b 24 61 3d 3d 24  urn [expr {$a==$
07b0: 62 7d 5d 20 7d 0a 64 62 20 66 75 6e 63 20 6d 61  b}] }.db func ma
07c0: 74 63 68 20 20 2d 61 72 67 63 6f 75 6e 74 20 32  tch  -argcount 2
07d0: 20 6d 61 74 63 68 66 75 6e 63 0a 64 62 20 66 75   matchfunc.db fu
07e0: 6e 63 20 72 65 67 65 78 70 20 2d 61 72 67 63 6f  nc regexp -argco
07f0: 75 6e 74 20 32 20 72 65 67 65 78 66 75 6e 63 0a  unt 2 regexfunc.
0800: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
0850: 73 74 20 63 61 73 65 73 20 65 5f 65 78 70 72 2d  st cases e_expr-
0860: 31 2e 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 76  1.* attempt to v
0870: 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 62  erify that all b
0880: 69 6e 61 72 79 20 6f 70 65 72 61 74 6f 72 73 20  inary operators 
0890: 6c 69 73 74 65 64 0a 23 20 69 6e 20 74 68 65 20  listed.# in the 
08a0: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 65 78  documentation ex
08b0: 69 73 74 20 61 6e 64 20 74 68 61 74 20 74 68 65  ist and that the
08c0: 20 72 65 6c 61 74 69 76 65 20 70 72 65 63 65 64   relative preced
08d0: 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 23 20 6f  ences of the.# o
08e0: 70 65 72 61 74 6f 72 73 20 61 72 65 20 61 6c 73  perators are als
08f0: 6f 20 61 73 20 74 68 65 20 64 6f 63 75 6d 65 6e  o as the documen
0900: 74 61 74 69 6f 6e 20 73 75 67 67 65 73 74 73 2e  tation suggests.
0910: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
0920: 3a 20 52 2d 31 35 35 31 34 2d 36 35 31 36 33 20  : R-15514-65163 
0930: 53 51 4c 69 74 65 20 75 6e 64 65 72 73 74 61 6e  SQLite understan
0940: 64 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ds the following
0950: 20 62 69 6e 61 72 79 0a 23 20 6f 70 65 72 61 74   binary.# operat
0960: 6f 72 73 2c 20 69 6e 20 6f 72 64 65 72 20 66 72  ors, in order fr
0970: 6f 6d 20 68 69 67 68 65 73 74 20 74 6f 20 6c 6f  om highest to lo
0980: 77 65 73 74 20 70 72 65 63 65 64 65 6e 63 65 3a  west precedence:
0990: 20 7c 7c 20 2a 20 2f 20 25 20 2b 20 2d 0a 23 20   || * / % + -.# 
09a0: 3c 3c 20 3e 3e 20 26 20 7c 20 3c 20 3c 3d 20 3e  << >> & | < <= >
09b0: 20 3e 3d 20 3d 20 3d 3d 20 21 3d 20 3c 3e 20 49   >= = == != <> I
09c0: 53 20 49 53 0a 23 20 4e 4f 54 20 49 4e 20 4c 49  S IS.# NOT IN LI
09d0: 4b 45 20 47 4c 4f 42 20 4d 41 54 43 48 20 52 45  KE GLOB MATCH RE
09e0: 47 45 58 50 20 41 4e 44 20 4f 52 0a 23 0a 23 20  GEXP AND OR.#.# 
09f0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
0a00: 38 37 35 39 2d 33 38 37 38 39 20 4f 70 65 72 61  8759-38789 Opera
0a10: 74 6f 72 73 20 49 53 20 61 6e 64 20 49 53 20 4e  tors IS and IS N
0a20: 4f 54 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  OT have the same
0a30: 0a 23 20 70 72 65 63 65 64 65 6e 63 65 20 61 73  .# precedence as
0a40: 20 3d 2e 0a 23 0a 0a 75 6e 73 65 74 20 2d 6e 6f   =..#..unset -no
0a50: 63 6f 6d 70 6c 61 69 6e 20 75 6e 74 65 73 74 65  complain unteste
0a60: 64 0a 66 6f 72 65 61 63 68 20 6f 70 31 20 24 6f  d.foreach op1 $o
0a70: 70 6c 69 73 74 20 7b 0a 20 20 66 6f 72 65 61 63  plist {.  foreac
0a80: 68 20 6f 70 32 20 24 6f 70 6c 69 73 74 20 7b 0a  h op2 $oplist {.
0a90: 20 20 20 20 73 65 74 20 75 6e 74 65 73 74 65 64      set untested
0aa0: 28 24 6f 70 31 2c 24 6f 70 32 29 20 31 0a 20 20  ($op1,$op2) 1.  
0ab0: 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 20 41 20    foreach {tn A 
0ac0: 42 20 43 7d 20 7b 0a 20 20 20 20 20 20 20 31 20  B C} {.       1 
0ad0: 20 20 20 20 32 32 20 20 20 34 35 20 20 20 20 36      22   45    6
0ae0: 36 0a 20 20 20 20 20 20 20 32 20 20 20 20 20 20  6.       2      
0af0: 30 20 20 20 20 30 20 20 20 20 20 30 0a 20 20 20  0    0     0.   
0b00: 20 20 20 20 33 20 20 20 20 20 20 30 20 20 20 20      3      0    
0b10: 30 20 20 20 20 20 31 0a 20 20 20 20 20 20 20 34  0     1.       4
0b20: 20 20 20 20 20 20 30 20 20 20 20 31 20 20 20 20        0    1    
0b30: 20 30 0a 20 20 20 20 20 20 20 35 20 20 20 20 20   0.       5     
0b40: 20 30 20 20 20 20 31 20 20 20 20 20 31 0a 20 20   0    1     1.  
0b50: 20 20 20 20 20 36 20 20 20 20 20 20 31 20 20 20       6      1   
0b60: 20 30 20 20 20 20 20 30 0a 20 20 20 20 20 20 20   0     0.       
0b70: 37 20 20 20 20 20 20 31 20 20 20 20 30 20 20 20  7      1    0   
0b80: 20 20 31 0a 20 20 20 20 20 20 20 38 20 20 20 20    1.       8    
0b90: 20 20 31 20 20 20 20 31 20 20 20 20 20 30 0a 20    1    1     0. 
0ba0: 20 20 20 20 20 20 39 20 20 20 20 20 20 31 20 20        9      1  
0bb0: 20 20 31 20 20 20 20 20 31 0a 20 20 20 20 20 20    1     1.      
0bc0: 31 30 20 20 20 20 20 20 35 20 20 20 20 36 20 20  10      5    6  
0bd0: 20 20 20 31 0a 20 20 20 20 20 20 31 31 20 20 20     1.      11   
0be0: 20 20 20 31 20 20 20 20 35 20 20 20 20 20 36 0a     1    5     6.
0bf0: 20 20 20 20 20 20 31 32 20 20 20 20 20 20 31 20        12      1 
0c00: 20 20 20 35 20 20 20 20 20 35 0a 20 20 20 20 20     5     5.     
0c10: 20 31 33 20 20 20 20 20 20 35 20 20 20 20 35 20   13      5    5 
0c20: 20 20 20 20 31 0a 0a 20 20 20 20 20 20 31 34 20      1..      14 
0c30: 20 20 20 20 20 35 20 20 20 20 32 20 20 20 20 20       5    2     
0c40: 31 0a 20 20 20 20 20 20 31 35 20 20 20 20 20 20  1.      15      
0c50: 31 20 20 20 20 34 20 20 20 20 20 31 0a 20 20 20  1    4     1.   
0c60: 20 20 20 31 36 20 20 20 20 20 2d 31 20 20 20 20     16     -1    
0c70: 30 20 20 20 20 20 31 0a 20 20 20 20 20 20 31 37  0     1.      17
0c80: 20 20 20 20 20 20 30 20 20 20 20 31 20 20 20 20        0    1    
0c90: 2d 31 0a 0a 20 20 20 20 7d 20 7b 0a 20 20 20 20  -1..    } {.    
0ca0: 20 20 73 65 74 20 74 65 73 74 6e 61 6d 65 20 22    set testname "
0cb0: 65 5f 65 78 70 72 2d 31 2e 24 6f 70 6e 61 6d 65  e_expr-1.$opname
0cc0: 28 24 6f 70 31 29 2e 24 6f 70 6e 61 6d 65 28 24  ($op1).$opname($
0cd0: 6f 70 32 29 2e 24 74 6e 22 0a 0a 20 20 20 20 20  op2).$tn"..     
0ce0: 20 23 20 49 66 20 24 6f 70 32 20 67 72 6f 75 70   # If $op2 group
0cf0: 73 20 6d 6f 72 65 20 74 69 67 68 74 6c 79 20 74  s more tightly t
0d00: 68 61 6e 20 24 6f 70 31 2c 20 74 68 65 6e 20 74  han $op1, then t
0d10: 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
0d20: 23 20 6f 66 20 65 78 65 63 75 74 69 6e 67 20 24  # of executing $
0d30: 73 71 6c 31 20 77 68 6f 75 6c 64 20 62 65 20 74  sql1 whould be t
0d40: 68 65 20 73 61 6d 65 20 61 73 20 65 78 65 63 75  he same as execu
0d50: 74 69 6e 67 20 24 73 71 6c 33 2e 0a 20 20 20 20  ting $sql3..    
0d60: 20 20 23 20 49 66 20 24 6f 70 31 20 67 72 6f 75    # If $op1 grou
0d70: 70 73 20 6d 6f 72 65 20 74 69 67 68 74 6c 79 2c  ps more tightly,
0d80: 20 6f 72 20 69 66 20 24 6f 70 31 20 61 6e 64 20   or if $op1 and 
0d90: 24 6f 70 32 20 68 61 76 65 20 0a 20 20 20 20 20  $op2 have .     
0da0: 20 23 20 74 68 65 20 73 61 6d 65 20 70 72 65 63   # the same prec
0db0: 65 64 65 6e 63 65 2c 20 74 68 65 6e 20 65 78 65  edence, then exe
0dc0: 63 75 74 69 6e 67 20 24 73 71 6c 31 20 73 68 6f  cuting $sql1 sho
0dd0: 75 6c 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20  uld return.     
0de0: 20 23 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75   # the same valu
0df0: 65 20 61 73 20 24 73 71 6c 32 2e 0a 20 20 20 20  e as $sql2..    
0e00: 20 20 23 0a 20 20 20 20 20 20 73 65 74 20 73 71    #.      set sq
0e10: 6c 31 20 22 53 45 4c 45 43 54 20 24 41 20 24 6f  l1 "SELECT $A $o
0e20: 70 31 20 24 42 20 24 6f 70 32 20 24 43 22 0a 20  p1 $B $op2 $C". 
0e30: 20 20 20 20 20 73 65 74 20 73 71 6c 32 20 22 53       set sql2 "S
0e40: 45 4c 45 43 54 20 28 24 41 20 24 6f 70 31 20 24  ELECT ($A $op1 $
0e50: 42 29 20 24 6f 70 32 20 24 43 22 0a 20 20 20 20  B) $op2 $C".    
0e60: 20 20 73 65 74 20 73 71 6c 33 20 22 53 45 4c 45    set sql3 "SELE
0e70: 43 54 20 24 41 20 24 6f 70 31 20 28 24 42 20 24  CT $A $op1 ($B $
0e80: 6f 70 32 20 24 43 29 22 0a 0a 20 20 20 20 20 20  op2 $C)"..      
0e90: 73 65 74 20 61 32 20 5b 64 62 20 6f 6e 65 20 24  set a2 [db one $
0ea0: 73 71 6c 32 5d 0a 20 20 20 20 20 20 73 65 74 20  sql2].      set 
0eb0: 61 33 20 5b 64 62 20 6f 6e 65 20 24 73 71 6c 33  a3 [db one $sql3
0ec0: 5d 0a 0a 20 20 20 20 20 20 64 6f 5f 65 78 65 63  ]..      do_exec
0ed0: 73 71 6c 5f 74 65 73 74 20 24 74 65 73 74 6e 61  sql_test $testna
0ee0: 6d 65 20 24 73 71 6c 31 20 5b 6c 69 73 74 20 5b  me $sql1 [list [
0ef0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 6f 70  .        if {$op
0f00: 70 72 65 63 28 24 6f 70 32 29 20 3c 20 24 6f 70  prec($op2) < $op
0f10: 70 72 65 63 28 24 6f 70 31 29 7d 20 7b 73 65 74  prec($op1)} {set
0f20: 20 61 33 7d 20 7b 73 65 74 20 61 32 7d 0a 20 20   a3} {set a2}.  
0f30: 20 20 20 20 5d 5d 0a 20 20 20 20 20 20 69 66 20      ]].      if 
0f40: 7b 24 61 32 20 21 3d 20 24 61 33 7d 20 7b 20 75  {$a2 != $a3} { u
0f50: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
0f60: 20 75 6e 74 65 73 74 65 64 28 24 6f 70 31 2c 24   untested($op1,$
0f70: 6f 70 32 29 20 7d 0a 20 20 20 20 7d 0a 20 20 7d  op2) }.    }.  }
0f80: 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 6f 70 20 7b  .}..foreach op {
0f90: 2a 20 41 4e 44 20 4f 52 20 2b 20 7c 7c 20 26 20  * AND OR + || & 
0fa0: 7c 7d 20 7b 20 75 6e 73 65 74 20 75 6e 74 65 73  |} { unset untes
0fb0: 74 65 64 28 24 6f 70 2c 24 6f 70 29 20 7d 0a 75  ted($op,$op) }.u
0fc0: 6e 73 65 74 20 75 6e 74 65 73 74 65 64 28 2b 2c  nset untested(+,
0fd0: 2d 29 20 20 3b 23 20 20 20 20 20 20 20 53 69 6e  -)  ;#       Sin
0fe0: 63 65 20 20 20 20 28 61 2b 62 29 2d 63 20 3d 3d  ce    (a+b)-c ==
0ff0: 20 61 2b 28 62 2d 63 29 0a 75 6e 73 65 74 20 75   a+(b-c).unset u
1000: 6e 74 65 73 74 65 64 28 2a 2c 3c 3c 29 20 3b 23  ntested(*,<<) ;#
1010: 20 20 20 20 20 20 20 53 69 6e 63 65 20 20 20 20         Since    
1020: 28 61 2a 62 29 3c 3c 63 20 3d 3d 20 61 2a 28 62  (a*b)<<c == a*(b
1030: 3c 3c 63 29 0a 0a 64 6f 5f 74 65 73 74 20 65 5f  <<c)..do_test e_
1040: 65 78 70 72 2d 31 2e 31 20 7b 20 61 72 72 61 79  expr-1.1 { array
1050: 20 6e 61 6d 65 73 20 75 6e 74 65 73 74 65 64 20   names untested 
1060: 7d 20 7b 7d 0a 0a 23 20 41 74 20 6f 6e 65 20 70  } {}..# At one p
1070: 6f 69 6e 74 2c 20 74 65 73 74 20 31 2e 32 2e 32  oint, test 1.2.2
1080: 20 77 61 73 20 66 61 69 6c 69 6e 67 2e 20 49 6e   was failing. In
1090: 73 74 65 61 64 20 6f 66 20 74 68 65 20 63 6f 72  stead of the cor
10a0: 72 65 63 74 20 72 65 73 75 6c 74 2c 20 69 74 0a  rect result, it.
10b0: 23 20 77 61 73 20 72 65 74 75 72 6e 69 6e 67 20  # was returning 
10c0: 7b 31 20 31 20 30 7d 2e 20 54 68 69 73 20 77 6f  {1 1 0}. This wo
10d0: 75 6c 64 20 73 65 65 6d 20 74 6f 20 69 6e 64 69  uld seem to indi
10e0: 63 61 74 65 20 74 68 61 74 20 4c 49 4b 45 20 68  cate that LIKE h
10f0: 61 73 20 74 68 65 0a 23 20 73 61 6d 65 20 70 72  as the.# same pr
1100: 65 63 65 64 65 6e 63 65 20 61 73 20 27 3c 27 2e  ecedence as '<'.
1110: 20 57 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72   Which is incorr
1120: 65 63 74 2e 20 49 74 20 68 61 73 20 6c 6f 77 65  ect. It has lowe
1130: 72 20 70 72 65 63 65 64 65 6e 63 65 2e 0a 23 0a  r precedence..#.
1140: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1150: 65 5f 65 78 70 72 2d 31 2e 32 2e 31 20 7b 20 0a  e_expr-1.2.1 { .
1160: 20 20 53 45 4c 45 43 54 20 30 20 3c 20 32 20 4c    SELECT 0 < 2 L
1170: 49 4b 45 20 31 2c 20 20 20 28 30 20 3c 20 32 29  IKE 1,   (0 < 2)
1180: 20 4c 49 4b 45 20 31 2c 20 20 20 30 20 3c 20 28   LIKE 1,   0 < (
1190: 32 20 4c 49 4b 45 20 31 29 0a 7d 20 7b 31 20 31  2 LIKE 1).} {1 1
11a0: 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   0}.do_execsql_t
11b0: 65 73 74 20 65 5f 65 78 70 72 2d 31 2e 32 2e 32  est e_expr-1.2.2
11c0: 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 30 20 4c   { .  SELECT 0 L
11d0: 49 4b 45 20 30 20 3c 20 32 2c 20 20 20 28 30 20  IKE 0 < 2,   (0 
11e0: 4c 49 4b 45 20 30 29 20 3c 20 32 2c 20 20 20 30  LIKE 0) < 2,   0
11f0: 20 4c 49 4b 45 20 28 30 20 3c 20 32 29 0a 7d 20   LIKE (0 < 2).} 
1200: 7b 30 20 31 20 30 7d 0a 0a 23 20 53 68 6f 77 69  {0 1 0}..# Showi
1210: 6e 67 20 74 68 61 74 20 4c 49 4b 45 20 61 6e 64  ng that LIKE and
1220: 20 3d 3d 20 68 61 76 65 20 74 68 65 20 73 61 6d   == have the sam
1230: 65 20 70 72 65 63 65 64 65 6e 63 65 0a 23 0a 64  e precedence.#.d
1240: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
1250: 5f 65 78 70 72 2d 31 2e 32 2e 33 20 7b 20 0a 20  _expr-1.2.3 { . 
1260: 20 53 45 4c 45 43 54 20 32 20 4c 49 4b 45 20 32   SELECT 2 LIKE 2
1270: 20 3d 3d 20 31 2c 20 20 20 28 32 20 4c 49 4b 45   == 1,   (2 LIKE
1280: 20 32 29 20 3d 3d 20 31 2c 20 20 20 20 32 20 4c   2) == 1,    2 L
1290: 49 4b 45 20 28 32 20 3d 3d 20 31 29 0a 7d 20 7b  IKE (2 == 1).} {
12a0: 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71  1 1 0}.do_execsq
12b0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 2e  l_test e_expr-1.
12c0: 32 2e 34 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  2.4 { .  SELECT 
12d0: 32 20 3d 3d 20 32 20 4c 49 4b 45 20 31 2c 20 20  2 == 2 LIKE 1,  
12e0: 20 28 32 20 3d 3d 20 32 29 20 4c 49 4b 45 20 31   (2 == 2) LIKE 1
12f0: 2c 20 20 20 20 32 20 3d 3d 20 28 32 20 4c 49 4b  ,    2 == (2 LIK
1300: 45 20 31 29 0a 7d 20 7b 31 20 31 20 30 7d 0a 0a  E 1).} {1 1 0}..
1310: 23 20 53 68 6f 77 69 6e 67 20 74 68 61 74 20 3c  # Showing that <
1320: 20 67 72 6f 75 70 73 20 6d 6f 72 65 20 74 69 67   groups more tig
1330: 68 74 6c 79 20 74 68 61 6e 20 3d 3d 20 28 3c 20  htly than == (< 
1340: 68 61 73 20 68 69 67 68 65 72 20 70 72 65 63 65  has higher prece
1350: 64 65 6e 63 65 29 2e 20 0a 23 0a 64 6f 5f 65 78  dence). .#.do_ex
1360: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
1370: 72 2d 31 2e 32 2e 35 20 7b 20 0a 20 20 53 45 4c  r-1.2.5 { .  SEL
1380: 45 43 54 20 30 20 3c 20 32 20 3d 3d 20 31 2c 20  ECT 0 < 2 == 1, 
1390: 20 20 28 30 20 3c 20 32 29 20 3d 3d 20 31 2c 20    (0 < 2) == 1, 
13a0: 20 20 30 20 3c 20 28 32 20 3d 3d 20 31 29 0a 7d    0 < (2 == 1).}
13b0: 20 7b 31 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63   {1 1 0}.do_exec
13c0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
13d0: 31 2e 36 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  1.6 { .  SELECT 
13e0: 30 20 3d 3d 20 30 20 3c 20 32 2c 20 20 20 28 30  0 == 0 < 2,   (0
13f0: 20 3d 3d 20 30 29 20 3c 20 32 2c 20 20 20 30 20   == 0) < 2,   0 
1400: 3d 3d 20 28 30 20 3c 20 32 29 0a 7d 20 7b 30 20  == (0 < 2).} {0 
1410: 31 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  1 0}..#---------
1420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1460: 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  .# Check that th
1470: 65 20 66 6f 75 72 20 75 6e 61 72 79 20 70 72 65  e four unary pre
1480: 66 69 78 20 6f 70 65 72 61 74 6f 72 73 20 6d 65  fix operators me
1490: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 0a  ntioned in the .
14a0: 23 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  # documentation 
14b0: 65 78 69 73 74 2e 0a 23 0a 23 20 45 56 49 44 45  exist..#.# EVIDE
14c0: 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 39 35 38 2d  NCE-OF: R-13958-
14d0: 35 33 34 31 39 20 53 75 70 70 6f 72 74 65 64 20  53419 Supported 
14e0: 75 6e 61 72 79 20 70 72 65 66 69 78 20 6f 70 65  unary prefix ope
14f0: 72 61 74 6f 72 73 20 61 72 65 20 74 68 65 73 65  rators are these
1500: 3a 0a 23 20 2d 20 2b 20 7e 20 4e 4f 54 0a 23 0a  :.# - + ~ NOT.#.
1510: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1520: 65 5f 65 78 70 72 2d 32 2e 31 20 7b 20 53 45 4c  e_expr-2.1 { SEL
1530: 45 43 54 20 2d 20 20 20 31 30 20 20 20 7d 20 7b  ECT -   10   } {
1540: 2d 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  -10}.do_execsql_
1550: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 2e 32 20  test e_expr-2.2 
1560: 7b 20 53 45 4c 45 43 54 20 2b 20 20 20 31 30 20  { SELECT +   10 
1570: 20 20 7d 20 7b 31 30 7d 0a 64 6f 5f 65 78 65 63    } {10}.do_exec
1580: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
1590: 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 7e 20 20  2.3 { SELECT ~  
15a0: 20 31 30 20 20 20 7d 20 7b 2d 31 31 7d 0a 64 6f   10   } {-11}.do
15b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
15c0: 65 78 70 72 2d 32 2e 34 20 7b 20 53 45 4c 45 43  expr-2.4 { SELEC
15d0: 54 20 4e 4f 54 20 31 30 20 20 20 7d 20 7b 30 7d  T NOT 10   } {0}
15e0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
1630: 65 73 74 73 20 66 6f 72 20 74 68 65 20 74 77 6f  ests for the two
1640: 20 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 64 65   statements made
1650: 20 72 65 67 61 72 64 69 6e 67 20 74 68 65 20 75   regarding the u
1660: 6e 61 72 79 20 2b 20 6f 70 65 72 61 74 6f 72 2e  nary + operator.
1670: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
1680: 3a 20 52 2d 35 33 36 37 30 2d 30 33 33 37 33 20  : R-53670-03373 
1690: 54 68 65 20 75 6e 61 72 79 20 6f 70 65 72 61 74  The unary operat
16a0: 6f 72 20 2b 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  or + is a no-op.
16b0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
16c0: 3a 20 52 2d 31 39 34 38 30 2d 33 30 39 36 38 20  : R-19480-30968 
16d0: 49 74 20 63 61 6e 20 62 65 20 61 70 70 6c 69 65  It can be applie
16e0: 64 20 74 6f 20 73 74 72 69 6e 67 73 2c 20 6e 75  d to strings, nu
16f0: 6d 62 65 72 73 2c 0a 23 20 62 6c 6f 62 73 20 6f  mbers,.# blobs o
1700: 72 20 4e 55 4c 4c 20 61 6e 64 20 69 74 20 61 6c  r NULL and it al
1710: 77 61 79 73 20 72 65 74 75 72 6e 73 20 61 20 72  ways returns a r
1720: 65 73 75 6c 74 20 77 69 74 68 20 74 68 65 20 73  esult with the s
1730: 61 6d 65 20 76 61 6c 75 65 20 61 73 0a 23 20 74  ame value as.# t
1740: 68 65 20 6f 70 65 72 61 6e 64 2e 0a 23 0a 66 6f  he operand..#.fo
1750: 72 65 61 63 68 20 7b 74 6e 20 6c 69 74 65 72 61  reach {tn litera
1760: 6c 20 74 79 70 65 7d 20 7b 0a 20 20 31 20 20 20  l type} {.  1   
1770: 20 20 27 68 65 6c 6c 6f 77 6f 72 6c 64 27 20 20    'helloworld'  
1780: 20 74 65 78 74 0a 20 20 32 20 20 20 20 20 34 35   text.  2     45
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
17a0: 65 67 65 72 0a 20 20 33 20 20 20 20 20 34 35 2e  eger.  3     45.
17b0: 32 20 20 20 20 20 20 20 20 20 20 20 72 65 61 6c  2           real
17c0: 0a 20 20 34 20 20 20 20 20 34 35 2e 30 20 20 20  .  4     45.0   
17d0: 20 20 20 20 20 20 20 20 72 65 61 6c 0a 20 20 35          real.  5
17e0: 20 20 20 20 20 58 27 41 42 43 44 45 46 27 20 20       X'ABCDEF'  
17f0: 20 20 20 20 62 6c 6f 62 0a 20 20 36 20 20 20 20      blob.  6    
1800: 20 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20 20   NULL           
1810: 6e 75 6c 6c 0a 7d 20 7b 0a 20 20 73 65 74 20 73  null.} {.  set s
1820: 71 6c 20 22 20 53 45 4c 45 43 54 20 71 75 6f 74  ql " SELECT quot
1830: 65 28 20 2b 20 24 6c 69 74 65 72 61 6c 20 29 2c  e( + $literal ),
1840: 20 74 79 70 65 6f 66 28 20 2b 20 24 6c 69 74 65   typeof( + $lite
1850: 72 61 6c 29 20 22 0a 20 20 64 6f 5f 65 78 65 63  ral) ".  do_exec
1860: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
1870: 33 2e 24 74 6e 20 24 73 71 6c 20 5b 6c 69 73 74  3.$tn $sql [list
1880: 20 24 6c 69 74 65 72 61 6c 20 24 74 79 70 65 5d   $literal $type]
1890: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
18e0: 20 43 68 65 63 6b 20 74 68 61 74 20 62 6f 74 68   Check that both
18f0: 20 3d 20 61 6e 64 20 3d 3d 20 61 72 65 20 62 6f   = and == are bo
1900: 74 68 20 61 63 63 65 70 74 61 62 6c 65 20 61 73  th acceptable as
1910: 20 74 68 65 20 22 65 71 75 61 6c 73 22 20 6f 70   the "equals" op
1920: 65 72 61 74 6f 72 2e 0a 23 20 53 69 6d 69 6c 61  erator..# Simila
1930: 72 6c 79 2c 20 65 69 74 68 65 72 20 21 3d 20 6f  rly, either != o
1940: 72 20 3c 3e 20 77 6f 72 6b 20 61 73 20 74 68 65  r <> work as the
1950: 20 6e 6f 74 2d 65 71 75 61 6c 73 20 6f 70 65 72   not-equals oper
1960: 61 74 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e  ator..#.# EVIDEN
1970: 43 45 2d 4f 46 3a 20 52 2d 30 33 36 37 39 2d 36  CE-OF: R-03679-6
1980: 30 36 33 39 20 45 71 75 61 6c 73 20 63 61 6e 20  0639 Equals can 
1990: 62 65 20 65 69 74 68 65 72 20 3d 20 6f 72 20 3d  be either = or =
19a0: 3d 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  =..#.# EVIDENCE-
19b0: 4f 46 3a 20 52 2d 33 30 30 38 32 2d 33 38 39 39  OF: R-30082-3899
19c0: 36 20 54 68 65 20 6e 6f 6e 2d 65 71 75 61 6c 73  6 The non-equals
19d0: 20 6f 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65   operator can be
19e0: 20 65 69 74 68 65 72 20 21 3d 20 6f 72 0a 23 20   either != or.# 
19f0: 3c 3e 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  <>..#.foreach {t
1a00: 6e 20 6c 69 74 65 72 61 6c 20 64 69 66 66 65 72  n literal differ
1a10: 65 6e 74 7d 20 7b 0a 20 20 31 20 20 20 27 68 65  ent} {.  1   'he
1a20: 6c 6c 6f 77 6f 72 6c 64 27 20 20 27 31 32 33 34  lloworld'  '1234
1a30: 35 27 0a 20 20 32 20 20 20 32 32 20 20 20 20 20  5'.  2   22     
1a40: 20 20 20 20 20 20 20 32 33 0a 20 20 33 20 20 20         23.  3   
1a50: 27 78 79 7a 27 20 20 20 20 20 20 20 20 20 58 27  'xyz'         X'
1a60: 37 38 37 39 37 41 27 0a 20 20 34 20 20 20 58 27  78797A'.  4   X'
1a70: 37 38 37 39 37 41 30 30 27 20 20 20 27 78 79 7a  78797A00'   'xyz
1a80: 27 0a 7d 20 7b 0a 20 20 64 6f 5f 65 78 65 63 73  '.} {.  do_execs
1a90: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 34  ql_test e_expr-4
1aa0: 2e 24 74 6e 20 22 0a 20 20 20 20 53 45 4c 45 43  .$tn ".    SELEC
1ab0: 54 20 24 6c 69 74 65 72 61 6c 20 20 3d 20 24 6c  T $literal  = $l
1ac0: 69 74 65 72 61 6c 2c 20 20 20 24 6c 69 74 65 72  iteral,   $liter
1ad0: 61 6c 20 3d 3d 20 24 6c 69 74 65 72 61 6c 2c 0a  al == $literal,.
1ae0: 20 20 20 20 20 20 20 20 20 20 20 24 6c 69 74 65             $lite
1af0: 72 61 6c 20 20 3d 20 24 64 69 66 66 65 72 65 6e  ral  = $differen
1b00: 74 2c 20 24 6c 69 74 65 72 61 6c 20 3d 3d 20 24  t, $literal == $
1b10: 64 69 66 66 65 72 65 6e 74 2c 0a 20 20 20 20 20  different,.     
1b20: 20 20 20 20 20 20 24 6c 69 74 65 72 61 6c 20 20        $literal  
1b30: 3d 20 4e 55 4c 4c 2c 20 20 20 20 20 20 20 24 6c  = NULL,       $l
1b40: 69 74 65 72 61 6c 20 3d 3d 20 4e 55 4c 4c 2c 0a  iteral == NULL,.
1b50: 20 20 20 20 20 20 20 20 20 20 20 24 6c 69 74 65             $lite
1b60: 72 61 6c 20 21 3d 20 24 6c 69 74 65 72 61 6c 2c  ral != $literal,
1b70: 20 20 20 24 6c 69 74 65 72 61 6c 20 3c 3e 20 24     $literal <> $
1b80: 6c 69 74 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  literal,.       
1b90: 20 20 20 20 24 6c 69 74 65 72 61 6c 20 21 3d 20      $literal != 
1ba0: 24 64 69 66 66 65 72 65 6e 74 2c 20 24 6c 69 74  $different, $lit
1bb0: 65 72 61 6c 20 3c 3e 20 24 64 69 66 66 65 72 65  eral <> $differe
1bc0: 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 24  nt,.           $
1bd0: 6c 69 74 65 72 61 6c 20 21 3d 20 4e 55 4c 4c 2c  literal != NULL,
1be0: 20 20 20 20 20 20 20 24 6c 69 74 65 72 61 6c 20         $literal 
1bf0: 21 3d 20 4e 55 4c 4c 0a 0a 20 20 22 20 7b 31 20  != NULL..  " {1 
1c00: 31 20 30 20 30 20 7b 7d 20 7b 7d 20 30 20 30 20  1 0 0 {} {} 0 0 
1c10: 31 20 31 20 7b 7d 20 7b 7d 7d 0a 7d 0a 0a 23 2d  1 1 {} {}}.}..#-
1c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
1c70: 74 68 65 20 7c 7c 20 6f 70 65 72 61 74 6f 72 2e  the || operator.
1c80: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
1c90: 3a 20 52 2d 34 34 34 30 39 2d 36 32 36 34 31 20  : R-44409-62641 
1ca0: 54 68 65 20 7c 7c 20 6f 70 65 72 61 74 6f 72 20  The || operator 
1cb0: 69 73 20 22 63 6f 6e 63 61 74 65 6e 61 74 65 22  is "concatenate"
1cc0: 20 2d 20 69 74 20 6a 6f 69 6e 73 0a 23 20 74 6f   - it joins.# to
1cd0: 67 65 74 68 65 72 20 74 68 65 20 74 77 6f 20 73  gether the two s
1ce0: 74 72 69 6e 67 73 20 6f 66 20 69 74 73 20 6f 70  trings of its op
1cf0: 65 72 61 6e 64 73 2e 0a 23 0a 66 6f 72 65 61 63  erands..#.foreac
1d00: 68 20 7b 74 6e 20 61 20 62 7d 20 7b 0a 20 20 31  h {tn a b} {.  1
1d10: 20 20 20 27 68 65 6c 6c 6f 77 6f 72 6c 64 27 20     'helloworld' 
1d20: 20 27 31 32 33 34 35 27 0a 20 20 32 20 20 20 32   '12345'.  2   2
1d30: 32 20 20 20 20 20 20 20 20 20 20 20 20 32 33 0a  2            23.
1d40: 7d 20 7b 0a 20 20 73 65 74 20 61 73 20 5b 64 62  } {.  set as [db
1d50: 20 6f 6e 65 20 22 53 45 4c 45 43 54 20 24 61 22   one "SELECT $a"
1d60: 5d 0a 20 20 73 65 74 20 62 73 20 5b 64 62 20 6f  ].  set bs [db o
1d70: 6e 65 20 22 53 45 4c 45 43 54 20 24 62 22 5d 0a  ne "SELECT $b"].
1d80: 20 20 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f    .  do_execsql_
1d90: 74 65 73 74 20 65 5f 65 78 70 72 2d 35 2e 24 74  test e_expr-5.$t
1da0: 6e 20 22 53 45 4c 45 43 54 20 24 61 20 7c 7c 20  n "SELECT $a || 
1db0: 24 62 22 20 5b 6c 69 73 74 20 22 24 7b 61 73 7d  $b" [list "${as}
1dc0: 24 7b 62 73 7d 22 5d 0a 7d 0a 0a 23 2d 2d 2d 2d  ${bs}"].}..#----
1dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e10: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65  -----.# Test the
1e20: 20 25 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 23   % operator..#.#
1e30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1e40: 30 38 39 31 34 2d 36 33 37 39 30 20 54 68 65 20  08914-63790 The 
1e50: 6f 70 65 72 61 74 6f 72 20 25 20 6f 75 74 70 75  operator % outpu
1e60: 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ts the value of 
1e70: 69 74 73 0a 23 20 6c 65 66 74 20 6f 70 65 72 61  its.# left opera
1e80: 6e 64 20 6d 6f 64 75 6c 6f 20 69 74 73 20 72 69  nd modulo its ri
1e90: 67 68 74 20 6f 70 65 72 61 6e 64 2e 0a 23 0a 64  ght operand..#.d
1ea0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
1eb0: 5f 65 78 70 72 2d 36 2e 31 20 7b 53 45 4c 45 43  _expr-6.1 {SELEC
1ec0: 54 20 20 37 32 25 35 7d 20 20 7b 32 7d 0a 64 6f  T  72%5}  {2}.do
1ed0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
1ee0: 65 78 70 72 2d 36 2e 32 20 7b 53 45 4c 45 43 54  expr-6.2 {SELECT
1ef0: 20 20 37 32 25 2d 35 7d 20 7b 32 7d 0a 64 6f 5f    72%-5} {2}.do_
1f00: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
1f10: 78 70 72 2d 36 2e 33 20 7b 53 45 4c 45 43 54 20  xpr-6.3 {SELECT 
1f20: 2d 37 32 25 2d 35 7d 20 7b 2d 32 7d 0a 64 6f 5f  -72%-5} {-2}.do_
1f30: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
1f40: 78 70 72 2d 36 2e 34 20 7b 53 45 4c 45 43 54 20  xpr-6.4 {SELECT 
1f50: 2d 37 32 25 35 7d 20 20 7b 2d 32 7d 0a 0a 23 2d  -72%5}  {-2}..#-
1f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
1fb0: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73  that the results
1fc0: 20 6f 66 20 61 6c 6c 20 62 69 6e 61 72 79 20 6f   of all binary o
1fd0: 70 65 72 61 74 6f 72 73 20 61 72 65 20 65 69 74  perators are eit
1fe0: 68 65 72 20 6e 75 6d 65 72 69 63 20 6f 72 20 0a  her numeric or .
1ff0: 23 20 4e 55 4c 4c 2c 20 65 78 63 65 70 74 20 66  # NULL, except f
2000: 6f 72 20 74 68 65 20 7c 7c 20 6f 70 65 72 61 74  or the || operat
2010: 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20 65 76  or, which may ev
2020: 61 6c 75 61 74 65 20 74 6f 20 65 69 74 68 65 72  aluate to either
2030: 20 61 20 74 65 78 74 0a 23 20 76 61 6c 75 65 20   a text.# value 
2040: 6f 72 20 4e 55 4c 4c 2e 0a 23 0a 23 20 45 56 49  or NULL..#.# EVI
2050: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 36 36  DENCE-OF: R-2066
2060: 35 2d 31 37 37 39 32 20 54 68 65 20 72 65 73 75  5-17792 The resu
2070: 6c 74 20 6f 66 20 61 6e 79 20 62 69 6e 61 72 79  lt of any binary
2080: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 65 69 74   operator is eit
2090: 68 65 72 0a 23 20 61 20 6e 75 6d 65 72 69 63 20  her.# a numeric 
20a0: 76 61 6c 75 65 20 6f 72 20 4e 55 4c 4c 2c 20 65  value or NULL, e
20b0: 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7c 7c  xcept for the ||
20c0: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f   concatenation o
20d0: 70 65 72 61 74 6f 72 0a 23 20 77 68 69 63 68 20  perator.# which 
20e0: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
20f0: 20 74 6f 20 65 69 74 68 65 72 20 4e 55 4c 4c 20   to either NULL 
2100: 6f 72 20 61 20 74 65 78 74 20 76 61 6c 75 65 2e  or a text value.
2110: 0a 23 0a 73 65 74 20 6c 69 74 65 72 61 6c 73 20  .#.set literals 
2120: 7b 0a 20 20 31 20 27 61 62 63 27 20 20 20 20 20  {.  1 'abc'     
2130: 20 20 20 32 20 27 68 65 78 61 64 65 63 69 6d 61     2 'hexadecima
2140: 6c 27 20 20 20 20 20 20 20 33 20 27 27 0a 20 20  l'       3 ''.  
2150: 34 20 31 32 33 20 20 20 20 20 20 20 20 20 20 35  4 123          5
2160: 20 2d 31 32 33 20 20 20 20 20 20 20 20 20 20 20   -123           
2170: 20 20 20 20 20 36 20 30 0a 20 20 37 20 31 32 33       6 0.  7 123
2180: 2e 34 20 20 20 20 20 20 20 20 38 20 30 2e 30 20  .4        8 0.0 
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 39 20 2d 31 32 33 2e 34 0a 20 31 30 20 58 27 41  9 -123.4. 10 X'A
21b0: 42 43 44 45 46 27 20 20 20 31 31 20 58 27 27 20  BCDEF'   11 X'' 
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
21d0: 32 20 58 27 30 30 30 30 27 0a 20 31 33 20 20 20  2 X'0000'. 13   
21e0: 20 20 4e 55 4c 4c 0a 7d 0a 66 6f 72 65 61 63 68    NULL.}.foreach
21f0: 20 6f 70 20 24 6f 70 6c 69 73 74 20 7b 0a 20 20   op $oplist {.  
2200: 66 6f 72 65 61 63 68 20 7b 6e 31 20 72 68 73 7d  foreach {n1 rhs}
2210: 20 24 6c 69 74 65 72 61 6c 73 20 7b 20 0a 20 20   $literals { .  
2220: 66 6f 72 65 61 63 68 20 7b 6e 32 20 6c 68 73 7d  foreach {n2 lhs}
2230: 20 24 6c 69 74 65 72 61 6c 73 20 7b 0a 0a 20 20   $literals {..  
2240: 20 20 73 65 74 20 74 20 5b 64 62 20 6f 6e 65 20    set t [db one 
2250: 22 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28  " SELECT typeof(
2260: 24 6c 68 73 20 24 6f 70 20 24 72 68 73 29 20 22  $lhs $op $rhs) "
2270: 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 65 5f  ].    do_test e_
2280: 65 78 70 72 2d 37 2e 24 6f 70 6e 61 6d 65 28 24  expr-7.$opname($
2290: 6f 70 29 2e 24 6e 31 2e 24 6e 32 20 7b 0a 20 20  op).$n1.$n2 {.  
22a0: 20 20 20 20 65 78 70 72 20 7b 0a 20 20 20 20 20      expr {.     
22b0: 20 20 20 20 20 20 28 24 6f 70 3d 3d 22 7c 7c 22        ($op=="||"
22c0: 20 26 26 20 28 24 74 20 3d 3d 20 22 74 65 78 74   && ($t == "text
22d0: 22 20 7c 7c 20 24 74 20 3d 3d 20 22 6e 75 6c 6c  " || $t == "null
22e0: 22 29 29 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  ")).        || (
22f0: 24 6f 70 21 3d 22 7c 7c 22 20 26 26 20 28 24 74  $op!="||" && ($t
2300: 20 3d 3d 20 22 69 6e 74 65 67 65 72 22 20 7c 7c   == "integer" ||
2310: 20 24 74 20 3d 3d 20 22 72 65 61 6c 22 20 7c 7c   $t == "real" ||
2320: 20 24 74 20 3d 3d 20 22 6e 75 6c 6c 22 29 29 0a   $t == "null")).
2330: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 31 0a        }.    } 1.
2340: 0a 20 20 7d 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  .  }}.}..#------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2390: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20 49  ---.# Test the I
23a0: 53 20 61 6e 64 20 49 53 20 4e 4f 54 20 6f 70 65  S and IS NOT ope
23b0: 72 61 74 6f 72 73 2e 0a 23 0a 23 20 45 56 49 44  rators..#.# EVID
23c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 37 33 31  ENCE-OF: R-24731
23d0: 2d 34 35 37 37 33 20 54 68 65 20 49 53 20 61 6e  -45773 The IS an
23e0: 64 20 49 53 20 4e 4f 54 20 6f 70 65 72 61 74 6f  d IS NOT operato
23f0: 72 73 20 77 6f 72 6b 20 6c 69 6b 65 20 3d 20 61  rs work like = a
2400: 6e 64 0a 23 20 21 3d 20 65 78 63 65 70 74 20 77  nd.# != except w
2410: 68 65 6e 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20  hen one or both 
2420: 6f 66 20 74 68 65 20 6f 70 65 72 61 6e 64 73 20  of the operands 
2430: 61 72 65 20 4e 55 4c 4c 2e 0a 23 0a 23 20 45 56  are NULL..#.# EV
2440: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 33  IDENCE-OF: R-063
2450: 32 35 2d 31 35 33 31 35 20 49 6e 20 74 68 69 73  25-15315 In this
2460: 20 63 61 73 65 2c 20 69 66 20 62 6f 74 68 20 6f   case, if both o
2470: 70 65 72 61 6e 64 73 20 61 72 65 20 4e 55 4c 4c  perands are NULL
2480: 2c 0a 23 20 74 68 65 6e 20 74 68 65 20 49 53 20  ,.# then the IS 
2490: 6f 70 65 72 61 74 6f 72 20 65 76 61 6c 75 61 74  operator evaluat
24a0: 65 73 20 74 6f 20 31 20 28 74 72 75 65 29 20 61  es to 1 (true) a
24b0: 6e 64 20 74 68 65 20 49 53 20 4e 4f 54 20 6f 70  nd the IS NOT op
24c0: 65 72 61 74 6f 72 0a 23 20 65 76 61 6c 75 61 74  erator.# evaluat
24d0: 65 73 20 74 6f 20 30 20 28 66 61 6c 73 65 29 2e  es to 0 (false).
24e0: 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  .#.# EVIDENCE-OF
24f0: 3a 20 52 2d 31 39 38 31 32 2d 33 36 37 37 39 20  : R-19812-36779 
2500: 49 66 20 6f 6e 65 20 6f 70 65 72 61 6e 64 20 69  If one operand i
2510: 73 20 4e 55 4c 4c 20 61 6e 64 20 74 68 65 20 6f  s NULL and the o
2520: 74 68 65 72 20 69 73 0a 23 20 6e 6f 74 2c 20 74  ther is.# not, t
2530: 68 65 6e 20 74 68 65 20 49 53 20 6f 70 65 72 61  hen the IS opera
2540: 74 6f 72 20 65 76 61 6c 75 61 74 65 73 20 74 6f  tor evaluates to
2550: 20 30 20 28 66 61 6c 73 65 29 20 61 6e 64 20 74   0 (false) and t
2560: 68 65 20 49 53 20 4e 4f 54 0a 23 20 6f 70 65 72  he IS NOT.# oper
2570: 61 74 6f 72 20 69 73 20 31 20 28 74 72 75 65 29  ator is 1 (true)
2580: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
2590: 46 3a 20 52 2d 36 31 39 37 35 2d 31 33 34 31 30  F: R-61975-13410
25a0: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
25b0: 62 6c 65 20 66 6f 72 20 61 6e 20 49 53 20 6f 72  ble for an IS or
25c0: 20 49 53 20 4e 4f 54 0a 23 20 65 78 70 72 65 73   IS NOT.# expres
25d0: 73 69 6f 6e 20 74 6f 20 65 76 61 6c 75 61 74 65  sion to evaluate
25e0: 20 74 6f 20 4e 55 4c 4c 2e 0a 23 0a 64 6f 5f 65   to NULL..#.do_e
25f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
2600: 70 72 2d 38 2e 31 2e 31 20 20 7b 20 53 45 4c 45  pr-8.1.1  { SELE
2610: 43 54 20 4e 55 4c 4c 20 49 53 20 20 20 20 20 4e  CT NULL IS     N
2620: 55 4c 4c 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65  ULL } {1}.do_exe
2630: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
2640: 2d 38 2e 31 2e 32 20 20 7b 20 53 45 4c 45 43 54  -8.1.2  { SELECT
2650: 20 27 61 62 27 20 49 53 20 20 20 20 20 4e 55 4c   'ab' IS     NUL
2660: 4c 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73  L } {0}.do_execs
2670: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38  ql_test e_expr-8
2680: 2e 31 2e 33 20 20 7b 20 53 45 4c 45 43 54 20 4e  .1.3  { SELECT N
2690: 55 4c 4c 20 49 53 20 20 20 20 20 27 61 62 27 20  ULL IS     'ab' 
26a0: 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {0}.do_execsql
26b0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31  _test e_expr-8.1
26c0: 2e 34 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .4  { SELECT 'ab
26d0: 27 20 49 53 20 20 20 20 20 27 61 62 27 20 7d 20  ' IS     'ab' } 
26e0: 7b 31 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {1}.do_execsql_t
26f0: 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 35  est e_expr-8.1.5
2700: 20 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20    { SELECT NULL 
2710: 3d 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b  ==     NULL } {{
2720: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
2730: 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 36 20  st e_expr-8.1.6 
2740: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27 20 3d   { SELECT 'ab' =
2750: 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20 7b 7b 7d  =     NULL } {{}
2760: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
2770: 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 37 20 20  t e_expr-8.1.7  
2780: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 3d 3d  { SELECT NULL ==
2790: 20 20 20 20 20 27 61 62 27 20 7d 20 7b 7b 7d 7d       'ab' } {{}}
27a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
27b0: 20 65 5f 65 78 70 72 2d 38 2e 31 2e 38 20 20 7b   e_expr-8.1.8  {
27c0: 20 53 45 4c 45 43 54 20 27 61 62 27 20 3d 3d 20   SELECT 'ab' == 
27d0: 20 20 20 20 27 61 62 27 20 7d 20 7b 31 7d 0a 64      'ab' } {1}.d
27e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
27f0: 5f 65 78 70 72 2d 38 2e 31 2e 39 20 20 7b 20 53  _expr-8.1.9  { S
2800: 45 4c 45 43 54 20 4e 55 4c 4c 20 49 53 20 4e 4f  ELECT NULL IS NO
2810: 54 20 4e 55 4c 4c 20 7d 20 7b 30 7d 0a 64 6f 5f  T NULL } {0}.do_
2820: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
2830: 78 70 72 2d 38 2e 31 2e 31 30 20 7b 20 53 45 4c  xpr-8.1.10 { SEL
2840: 45 43 54 20 27 61 62 27 20 49 53 20 4e 4f 54 20  ECT 'ab' IS NOT 
2850: 4e 55 4c 4c 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78  NULL } {1}.do_ex
2860: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
2870: 72 2d 38 2e 31 2e 31 31 20 7b 20 53 45 4c 45 43  r-8.1.11 { SELEC
2880: 54 20 4e 55 4c 4c 20 49 53 20 4e 4f 54 20 27 61  T NULL IS NOT 'a
2890: 62 27 20 7d 20 7b 31 7d 0a 64 6f 5f 65 78 65 63  b' } {1}.do_exec
28a0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
28b0: 38 2e 31 2e 31 32 20 7b 20 53 45 4c 45 43 54 20  8.1.12 { SELECT 
28c0: 27 61 62 27 20 49 53 20 4e 4f 54 20 27 61 62 27  'ab' IS NOT 'ab'
28d0: 20 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71   } {0}.do_execsq
28e0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e  l_test e_expr-8.
28f0: 31 2e 31 33 20 7b 20 53 45 4c 45 43 54 20 4e 55  1.13 { SELECT NU
2900: 4c 4c 20 21 3d 20 20 20 20 20 4e 55 4c 4c 20 7d  LL !=     NULL }
2910: 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {{}}.do_execsql
2920: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31  _test e_expr-8.1
2930: 2e 31 34 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .14 { SELECT 'ab
2940: 27 20 21 3d 20 20 20 20 20 4e 55 4c 4c 20 7d 20  ' !=     NULL } 
2950: 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {{}}.do_execsql_
2960: 74 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e  test e_expr-8.1.
2970: 31 35 20 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c  15 { SELECT NULL
2980: 20 21 3d 20 20 20 20 20 27 61 62 27 20 7d 20 7b   !=     'ab' } {
2990: 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {}}.do_execsql_t
29a0: 65 73 74 20 65 5f 65 78 70 72 2d 38 2e 31 2e 31  est e_expr-8.1.1
29b0: 36 20 7b 20 53 45 4c 45 43 54 20 27 61 62 27 20  6 { SELECT 'ab' 
29c0: 21 3d 20 20 20 20 20 27 61 62 27 20 7d 20 7b 30  !=     'ab' } {0
29d0: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 6e 31 20 72  }..foreach {n1 r
29e0: 68 73 7d 20 24 6c 69 74 65 72 61 6c 73 20 7b 20  hs} $literals { 
29f0: 0a 20 20 66 6f 72 65 61 63 68 20 7b 6e 32 20 6c  .  foreach {n2 l
2a00: 68 73 7d 20 24 6c 69 74 65 72 61 6c 73 20 7b 0a  hs} $literals {.
2a10: 20 20 20 20 69 66 20 7b 24 72 68 73 21 3d 22 4e      if {$rhs!="N
2a20: 55 4c 4c 22 20 26 26 20 24 6c 68 73 21 3d 22 4e  ULL" && $lhs!="N
2a30: 55 4c 4c 22 7d 20 7b 0a 20 20 20 20 20 20 73 65  ULL"} {.      se
2a40: 74 20 65 71 20 5b 65 78 65 63 73 71 6c 20 22 53  t eq [execsql "S
2a50: 45 4c 45 43 54 20 24 6c 68 73 20 3d 20 24 72 68  ELECT $lhs = $rh
2a60: 73 2c 20 24 6c 68 73 20 21 3d 20 24 72 68 73 22  s, $lhs != $rhs"
2a70: 5d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ].    } else {. 
2a80: 20 20 20 20 20 73 65 74 20 65 71 20 5b 6c 69 73       set eq [lis
2a90: 74 20 5b 65 78 70 72 20 7b 24 6c 68 73 3d 3d 22  t [expr {$lhs=="
2aa0: 4e 55 4c 4c 22 20 26 26 20 24 72 68 73 3d 3d 22  NULL" && $rhs=="
2ab0: 4e 55 4c 4c 22 7d 5d 20 5c 0a 20 20 20 20 20 20  NULL"}] \.      
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 65 78               [ex
2ad0: 70 72 20 7b 24 6c 68 73 21 3d 22 4e 55 4c 4c 22  pr {$lhs!="NULL"
2ae0: 20 7c 7c 20 24 72 68 73 21 3d 22 4e 55 4c 4c 22   || $rhs!="NULL"
2af0: 7d 5d 0a 20 20 20 20 20 20 5d 0a 20 20 20 20 7d  }].      ].    }
2b00: 0a 20 20 20 20 73 65 74 20 74 65 73 74 20 65 5f  .    set test e_
2b10: 65 78 70 72 2d 38 2e 32 2e 24 6e 31 2e 24 6e 32  expr-8.2.$n1.$n2
2b20: 0a 20 20 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  .    do_execsql_
2b30: 74 65 73 74 20 24 74 65 73 74 2e 31 20 22 53 45  test $test.1 "SE
2b40: 4c 45 43 54 20 24 6c 68 73 20 49 53 20 24 72 68  LECT $lhs IS $rh
2b50: 73 2c 20 24 6c 68 73 20 49 53 20 4e 4f 54 20 24  s, $lhs IS NOT $
2b60: 72 68 73 22 20 24 65 71 0a 20 20 20 20 64 6f 5f  rhs" $eq.    do_
2b70: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 24 74 65  execsql_test $te
2b80: 73 74 2e 32 20 22 0a 20 20 20 20 20 20 53 45 4c  st.2 ".      SEL
2b90: 45 43 54 20 28 24 6c 68 73 20 49 53 20 24 72 68  ECT ($lhs IS $rh
2ba0: 73 29 20 49 53 20 4e 55 4c 4c 2c 20 28 24 6c 68  s) IS NULL, ($lh
2bb0: 73 20 49 53 20 4e 4f 54 20 24 72 68 73 29 20 49  s IS NOT $rhs) I
2bc0: 53 20 4e 55 4c 4c 0a 20 20 20 20 22 20 7b 30 20  S NULL.    " {0 
2bd0: 30 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  0}.  }.}..#-----
2be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c20: 2d 2d 2d 2d 0a 23 20 52 75 6e 20 73 6f 6d 65 20  ----.# Run some 
2c30: 74 65 73 74 73 20 6f 6e 20 74 68 65 20 43 4f 4c  tests on the COL
2c40: 4c 41 54 45 20 22 75 6e 61 72 79 20 70 6f 73 74  LATE "unary post
2c50: 66 69 78 20 6f 70 65 72 61 74 6f 72 22 2e 0a 23  fix operator"..#
2c60: 0a 23 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6f  .# This collatio
2c70: 6e 20 73 65 71 75 65 6e 63 65 20 72 65 76 65 72  n sequence rever
2c80: 73 65 73 20 62 6f 74 68 20 61 72 67 75 6d 65 6e  ses both argumen
2c90: 74 73 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20  ts before using 
2ca0: 0a 23 20 5b 73 74 72 69 6e 67 20 63 6f 6d 70 61  .# [string compa
2cb0: 72 65 5d 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  re] to compare t
2cc0: 68 65 6d 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  hem. For example
2cd0: 2c 20 77 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  , when comparing
2ce0: 20 74 68 65 0a 23 20 73 74 72 69 6e 67 73 20 27   the.# strings '
2cf0: 6f 6e 65 27 20 61 6e 64 20 27 66 6f 75 72 27 2c  one' and 'four',
2d00: 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   return the resu
2d10: 6c 74 20 6f 66 3a 0a 23 20 20 20 0a 23 20 20 20  lt of:.#   .#   
2d20: 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65 20 65  string compare e
2d30: 6e 6f 20 72 75 6f 66 0a 23 0a 70 72 6f 63 20 72  no ruof.#.proc r
2d40: 65 76 65 72 73 65 5f 73 74 72 20 7b 7a 53 74 72  everse_str {zStr
2d50: 7d 20 7b 0a 20 20 73 65 74 20 6f 75 74 20 22 22  } {.  set out ""
2d60: 0a 20 20 66 6f 72 65 61 63 68 20 63 20 5b 73 70  .  foreach c [sp
2d70: 6c 69 74 20 24 7a 53 74 72 20 7b 7d 5d 20 7b 20  lit $zStr {}] { 
2d80: 73 65 74 20 6f 75 74 20 22 24 7b 63 7d 24 7b 6f  set out "${c}${o
2d90: 75 74 7d 22 20 7d 0a 20 20 73 65 74 20 6f 75 74  ut}" }.  set out
2da0: 0a 7d 0a 70 72 6f 63 20 72 65 76 65 72 73 65 5f  .}.proc reverse_
2db0: 63 6f 6c 6c 61 74 65 20 7b 7a 4c 65 66 74 20 7a  collate {zLeft z
2dc0: 52 69 67 68 74 7d 20 7b 0a 20 20 73 74 72 69 6e  Right} {.  strin
2dd0: 67 20 63 6f 6d 70 61 72 65 20 5b 72 65 76 65 72  g compare [rever
2de0: 73 65 5f 73 74 72 20 24 7a 4c 65 66 74 5d 20 5b  se_str $zLeft] [
2df0: 72 65 76 65 72 73 65 5f 73 74 72 20 24 7a 52 69  reverse_str $zRi
2e00: 67 68 74 5d 0a 7d 0a 64 62 20 63 6f 6c 6c 61 74  ght].}.db collat
2e10: 65 20 72 65 76 65 72 73 65 20 72 65 76 65 72 73  e reverse revers
2e20: 65 5f 63 6f 6c 6c 61 74 65 0a 0a 23 20 45 56 49  e_collate..# EVI
2e30: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 35 37  DENCE-OF: R-5957
2e40: 37 2d 33 33 34 37 31 20 54 68 65 20 43 4f 4c 4c  7-33471 The COLL
2e50: 41 54 45 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ATE operator is 
2e60: 61 20 75 6e 61 72 79 20 70 6f 73 74 66 69 78 0a  a unary postfix.
2e70: 23 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 20  # operator that 
2e80: 61 73 73 69 67 6e 73 20 61 20 63 6f 6c 6c 61 74  assigns a collat
2e90: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
2ea0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 23  an expression..#
2eb0: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
2ec0: 52 2d 32 33 34 34 31 2d 32 32 35 34 31 20 54 68  R-23441-22541 Th
2ed0: 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74  e COLLATE operat
2ee0: 6f 72 20 68 61 73 20 61 20 68 69 67 68 65 72 0a  or has a higher.
2ef0: 23 20 70 72 65 63 65 64 65 6e 63 65 20 28 62 69  # precedence (bi
2f00: 6e 64 73 20 6d 6f 72 65 20 74 69 67 68 74 6c 79  nds more tightly
2f10: 29 20 74 68 61 6e 20 61 6e 79 20 70 72 65 66 69  ) than any prefi
2f20: 78 20 75 6e 61 72 79 20 6f 70 65 72 61 74 6f 72  x unary operator
2f30: 20 6f 72 20 61 6e 79 0a 23 20 62 69 6e 61 72 79   or any.# binary
2f40: 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 64 6f 5f   operator..#.do_
2f50: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
2f60: 78 70 72 2d 39 2e 31 20 7b 20 53 45 4c 45 43 54  xpr-9.1 { SELECT
2f70: 20 20 27 61 62 63 64 27 20 3c 20 27 62 62 62 62    'abcd' < 'bbbb
2f80: 27 20 20 20 20 43 4f 4c 4c 41 54 45 20 72 65 76  '    COLLATE rev
2f90: 65 72 73 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63  erse } 0.do_exec
2fa0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
2fb0: 39 2e 32 20 7b 20 53 45 4c 45 43 54 20 28 27 61  9.2 { SELECT ('a
2fc0: 62 63 64 27 20 3c 20 27 62 62 62 62 27 29 20 20  bcd' < 'bbbb')  
2fd0: 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73 65   COLLATE reverse
2fe0: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
2ff0: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 33 20  test e_expr-9.3 
3000: 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64 27  { SELECT  'abcd'
3010: 20 3c 3d 20 27 62 62 62 62 27 20 20 20 43 4f 4c   <= 'bbbb'   COL
3020: 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d 20 30  LATE reverse } 0
3030: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3040: 20 65 5f 65 78 70 72 2d 39 2e 34 20 7b 20 53 45   e_expr-9.4 { SE
3050: 4c 45 43 54 20 28 27 61 62 63 64 27 20 3c 3d 20  LECT ('abcd' <= 
3060: 27 62 62 62 62 27 29 20 20 43 4f 4c 4c 41 54 45  'bbbb')  COLLATE
3070: 20 72 65 76 65 72 73 65 20 7d 20 31 0a 0a 64 6f   reverse } 1..do
3080: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
3090: 65 78 70 72 2d 39 2e 35 20 7b 20 53 45 4c 45 43  expr-9.5 { SELEC
30a0: 54 20 20 27 61 62 63 64 27 20 3e 20 27 62 62 62  T  'abcd' > 'bbb
30b0: 62 27 20 20 20 20 43 4f 4c 4c 41 54 45 20 72 65  b'    COLLATE re
30c0: 76 65 72 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65  verse } 1.do_exe
30d0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
30e0: 2d 39 2e 36 20 7b 20 53 45 4c 45 43 54 20 28 27  -9.6 { SELECT ('
30f0: 61 62 63 64 27 20 3e 20 27 62 62 62 62 27 29 20  abcd' > 'bbbb') 
3100: 20 20 43 4f 4c 4c 41 54 45 20 72 65 76 65 72 73    COLLATE revers
3110: 65 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  e } 0.do_execsql
3120: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 37  _test e_expr-9.7
3130: 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64   { SELECT  'abcd
3140: 27 20 3e 3d 20 27 62 62 62 62 27 20 20 20 43 4f  ' >= 'bbbb'   CO
3150: 4c 4c 41 54 45 20 72 65 76 65 72 73 65 20 7d 20  LLATE reverse } 
3160: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
3170: 74 20 65 5f 65 78 70 72 2d 39 2e 38 20 7b 20 53  t e_expr-9.8 { S
3180: 45 4c 45 43 54 20 28 27 61 62 63 64 27 20 3e 3d  ELECT ('abcd' >=
3190: 20 27 62 62 62 62 27 29 20 20 43 4f 4c 4c 41 54   'bbbb')  COLLAT
31a0: 45 20 72 65 76 65 72 73 65 20 7d 20 30 0a 0a 64  E reverse } 0..d
31b0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
31c0: 5f 65 78 70 72 2d 39 2e 31 30 20 7b 20 53 45 4c  _expr-9.10 { SEL
31d0: 45 43 54 20 20 27 61 62 63 64 27 20 3d 20 20 27  ECT  'abcd' =  '
31e0: 41 42 43 44 27 20 20 43 4f 4c 4c 41 54 45 20 6e  ABCD'  COLLATE n
31f0: 6f 63 61 73 65 20 7d 20 31 0a 64 6f 5f 65 78 65  ocase } 1.do_exe
3200: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3210: 2d 39 2e 31 31 20 7b 20 53 45 4c 45 43 54 20 28  -9.11 { SELECT (
3220: 27 61 62 63 64 27 20 3d 20 20 27 41 42 43 44 27  'abcd' =  'ABCD'
3230: 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ) COLLATE nocase
3240: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
3250: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31 32  test e_expr-9.12
3260: 20 7b 20 53 45 4c 45 43 54 20 20 27 61 62 63 64   { SELECT  'abcd
3270: 27 20 3d 3d 20 27 41 42 43 44 27 20 20 43 4f 4c  ' == 'ABCD'  COL
3280: 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a  LATE nocase } 1.
3290: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
32a0: 65 5f 65 78 70 72 2d 39 2e 31 33 20 7b 20 53 45  e_expr-9.13 { SE
32b0: 4c 45 43 54 20 28 27 61 62 63 64 27 20 3d 3d 20  LECT ('abcd' == 
32c0: 27 41 42 43 44 27 29 20 43 4f 4c 4c 41 54 45 20  'ABCD') COLLATE 
32d0: 6e 6f 63 61 73 65 20 7d 20 30 0a 64 6f 5f 65 78  nocase } 0.do_ex
32e0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
32f0: 72 2d 39 2e 31 34 20 7b 20 53 45 4c 45 43 54 20  r-9.14 { SELECT 
3300: 20 27 61 62 63 64 27 20 49 53 20 27 41 42 43 44   'abcd' IS 'ABCD
3310: 27 20 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  '  COLLATE nocas
3320: 65 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  e } 1.do_execsql
3330: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 31  _test e_expr-9.1
3340: 35 20 7b 20 53 45 4c 45 43 54 20 28 27 61 62 63  5 { SELECT ('abc
3350: 64 27 20 49 53 20 27 41 42 43 44 27 29 20 43 4f  d' IS 'ABCD') CO
3360: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 30  LLATE nocase } 0
3370: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
3380: 74 20 65 5f 65 78 70 72 2d 39 2e 31 36 20 7b 20  t e_expr-9.16 { 
3390: 53 45 4c 45 43 54 20 20 27 61 62 63 64 27 20 21  SELECT  'abcd' !
33a0: 3d 20 27 41 42 43 44 27 20 20 20 20 20 20 43 4f  = 'ABCD'      CO
33b0: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 30  LLATE nocase } 0
33c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
33d0: 20 65 5f 65 78 70 72 2d 39 2e 31 37 20 7b 20 53   e_expr-9.17 { S
33e0: 45 4c 45 43 54 20 28 27 61 62 63 64 27 20 21 3d  ELECT ('abcd' !=
33f0: 20 27 41 42 43 44 27 29 20 20 20 20 20 43 4f 4c   'ABCD')     COL
3400: 4c 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a  LATE nocase } 1.
3410: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3420: 65 5f 65 78 70 72 2d 39 2e 31 38 20 7b 20 53 45  e_expr-9.18 { SE
3430: 4c 45 43 54 20 20 27 61 62 63 64 27 20 3c 3e 20  LECT  'abcd' <> 
3440: 27 41 42 43 44 27 20 20 20 20 20 20 43 4f 4c 4c  'ABCD'      COLL
3450: 41 54 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64  ATE nocase } 0.d
3460: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
3470: 5f 65 78 70 72 2d 39 2e 31 39 20 7b 20 53 45 4c  _expr-9.19 { SEL
3480: 45 43 54 20 28 27 61 62 63 64 27 20 3c 3e 20 27  ECT ('abcd' <> '
3490: 41 42 43 44 27 29 20 20 20 20 20 43 4f 4c 4c 41  ABCD')     COLLA
34a0: 54 45 20 6e 6f 63 61 73 65 20 7d 20 31 0a 64 6f  TE nocase } 1.do
34b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
34c0: 65 78 70 72 2d 39 2e 32 30 20 7b 20 53 45 4c 45  expr-9.20 { SELE
34d0: 43 54 20 20 27 61 62 63 64 27 20 49 53 20 4e 4f  CT  'abcd' IS NO
34e0: 54 20 27 41 42 43 44 27 20 20 43 4f 4c 4c 41 54  T 'ABCD'  COLLAT
34f0: 45 20 6e 6f 63 61 73 65 20 7d 20 30 0a 64 6f 5f  E nocase } 0.do_
3500: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3510: 78 70 72 2d 39 2e 32 31 20 7b 20 53 45 4c 45 43  xpr-9.21 { SELEC
3520: 54 20 28 27 61 62 63 64 27 20 49 53 20 4e 4f 54  T ('abcd' IS NOT
3530: 20 27 41 42 43 44 27 29 20 43 4f 4c 4c 41 54 45   'ABCD') COLLATE
3540: 20 6e 6f 63 61 73 65 20 7d 20 31 0a 0a 64 6f 5f   nocase } 1..do_
3550: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3560: 78 70 72 2d 39 2e 32 32 20 7b 20 0a 20 20 53 45  xpr-9.22 { .  SE
3570: 4c 45 43 54 20 27 62 62 62 27 20 42 45 54 57 45  LECT 'bbb' BETWE
3580: 45 4e 20 27 41 41 41 27 20 41 4e 44 20 27 43 43  EN 'AAA' AND 'CC
3590: 43 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  C' COLLATE nocas
35a0: 65 20 0a 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71  e .} 1.do_execsq
35b0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e  l_test e_expr-9.
35c0: 32 33 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 28  23 { .  SELECT (
35d0: 27 62 62 62 27 20 42 45 54 57 45 45 4e 20 27 41  'bbb' BETWEEN 'A
35e0: 41 41 27 20 41 4e 44 20 27 43 43 43 27 29 20 43  AA' AND 'CCC') C
35f0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 0a 7d  OLLATE nocase .}
3600: 20 30 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f   0..# EVIDENCE-O
3610: 46 3a 20 52 2d 35 38 37 33 31 2d 32 35 34 33 39  F: R-58731-25439
3620: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
3630: 65 71 75 65 6e 63 65 20 73 65 74 20 62 79 20 74  equence set by t
3640: 68 65 20 43 4f 4c 4c 41 54 45 0a 23 20 6f 70 65  he COLLATE.# ope
3650: 72 61 74 6f 72 20 6f 76 65 72 72 69 64 65 73 20  rator overrides 
3660: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
3670: 71 75 65 6e 63 65 20 64 65 74 65 72 6d 69 6e 65  quence determine
3680: 64 20 62 79 20 74 68 65 20 43 4f 4c 4c 41 54 45  d by the COLLATE
3690: 0a 23 20 63 6c 61 75 73 65 20 69 6e 20 61 20 74  .# clause in a t
36a0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69  able column defi
36b0: 6e 69 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 65 78 65  nition..#.do_exe
36c0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
36d0: 2d 39 2e 32 34 20 7b 20 0a 20 20 43 52 45 41 54  -9.24 { .  CREAT
36e0: 45 20 54 41 42 4c 45 20 74 32 34 28 61 20 43 4f  E TABLE t24(a CO
36f0: 4c 4c 41 54 45 20 4e 4f 43 41 53 45 2c 20 62 29  LLATE NOCASE, b)
3700: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
3710: 74 32 34 20 56 41 4c 55 45 53 28 27 61 61 61 27  t24 VALUES('aaa'
3720: 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 1);.  INSERT I
3730: 4e 54 4f 20 74 32 34 20 56 41 4c 55 45 53 28 27  NTO t24 VALUES('
3740: 62 62 62 27 2c 20 32 29 3b 0a 20 20 49 4e 53 45  bbb', 2);.  INSE
3750: 52 54 20 49 4e 54 4f 20 74 32 34 20 56 41 4c 55  RT INTO t24 VALU
3760: 45 53 28 27 63 63 63 27 2c 20 33 29 3b 0a 7d 20  ES('ccc', 3);.} 
3770: 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  {}.do_execsql_te
3780: 73 74 20 65 5f 65 78 70 72 2d 39 2e 32 35 20 7b  st e_expr-9.25 {
3790: 20 53 45 4c 45 43 54 20 27 42 42 42 27 20 3d 20   SELECT 'BBB' = 
37a0: 61 20 46 52 4f 4d 20 74 32 34 20 7d 20 7b 30 20  a FROM t24 } {0 
37b0: 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  1 0}.do_execsql_
37c0: 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e 32 35  test e_expr-9.25
37d0: 20 7b 20 53 45 4c 45 43 54 20 61 20 3d 20 27 42   { SELECT a = 'B
37e0: 42 42 27 20 46 52 4f 4d 20 74 32 34 20 7d 20 7b  BB' FROM t24 } {
37f0: 30 20 31 20 30 7d 0a 64 6f 5f 65 78 65 63 73 71  0 1 0}.do_execsq
3800: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39 2e  l_test e_expr-9.
3810: 32 35 20 7b 20 53 45 4c 45 43 54 20 27 42 42 42  25 { SELECT 'BBB
3820: 27 20 3d 20 61 20 43 4f 4c 4c 41 54 45 20 62 69  ' = a COLLATE bi
3830: 6e 61 72 79 20 46 52 4f 4d 20 74 32 34 20 7d 20  nary FROM t24 } 
3840: 7b 30 20 30 20 30 7d 0a 64 6f 5f 65 78 65 63 73  {0 0 0}.do_execs
3850: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 39  ql_test e_expr-9
3860: 2e 32 35 20 7b 20 53 45 4c 45 43 54 20 61 20 43  .25 { SELECT a C
3870: 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 3d 20  OLLATE binary = 
3880: 27 42 42 42 27 20 46 52 4f 4d 20 74 32 34 20 7d  'BBB' FROM t24 }
3890: 20 7b 30 20 30 20 30 7d 0a 0a 23 2d 2d 2d 2d 2d   {0 0 0}..#-----
38a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38e0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73 74 61 74  ----.# Test stat
38f0: 65 6d 65 6e 74 73 20 72 65 6c 61 74 65 64 20 74  ements related t
3900: 6f 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 73  o literal values
3910: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
3920: 46 3a 20 52 2d 33 31 35 33 36 2d 33 32 30 30 38  F: R-31536-32008
3930: 20 4c 69 74 65 72 61 6c 20 76 61 6c 75 65 73 20   Literal values 
3940: 6d 61 79 20 62 65 20 69 6e 74 65 67 65 72 73 2c  may be integers,
3950: 20 66 6c 6f 61 74 69 6e 67 0a 23 20 70 6f 69 6e   floating.# poin
3960: 74 20 6e 75 6d 62 65 72 73 2c 20 73 74 72 69 6e  t numbers, strin
3970: 67 73 2c 20 42 4c 4f 42 73 2c 20 6f 72 20 4e 55  gs, BLOBs, or NU
3980: 4c 4c 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71  LLs..#.do_execsq
3990: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30  l_test e_expr-10
39a0: 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 74 79  .1.1 { SELECT ty
39b0: 70 65 6f 66 28 35 29 20 20 20 20 20 20 20 7d 20  peof(5)       } 
39c0: 7b 69 6e 74 65 67 65 72 7d 0a 64 6f 5f 65 78 65  {integer}.do_exe
39d0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
39e0: 2d 31 30 2e 31 2e 32 20 7b 20 53 45 4c 45 43 54  -10.1.2 { SELECT
39f0: 20 74 79 70 65 6f 66 28 35 2e 31 29 20 20 20 20   typeof(5.1)    
3a00: 20 7d 20 7b 72 65 61 6c 7d 0a 64 6f 5f 65 78 65   } {real}.do_exe
3a10: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3a20: 2d 31 30 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54  -10.1.3 { SELECT
3a30: 20 74 79 70 65 6f 66 28 27 35 2e 31 27 29 20 20   typeof('5.1')  
3a40: 20 7d 20 7b 74 65 78 74 7d 0a 64 6f 5f 65 78 65   } {text}.do_exe
3a50: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3a60: 2d 31 30 2e 31 2e 34 20 7b 20 53 45 4c 45 43 54  -10.1.4 { SELECT
3a70: 20 74 79 70 65 6f 66 28 58 27 41 42 43 44 27 29   typeof(X'ABCD')
3a80: 20 7d 20 7b 62 6c 6f 62 7d 0a 64 6f 5f 65 78 65   } {blob}.do_exe
3a90: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3aa0: 2d 31 30 2e 31 2e 35 20 7b 20 53 45 4c 45 43 54  -10.1.5 { SELECT
3ab0: 20 74 79 70 65 6f 66 28 4e 55 4c 4c 29 20 20 20   typeof(NULL)   
3ac0: 20 7d 20 7b 6e 75 6c 6c 7d 0a 0a 23 20 45 56 49   } {null}..# EVI
3ad0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 32  DENCE-OF: R-2692
3ae0: 31 2d 35 39 32 39 38 20 53 63 69 65 6e 74 69 66  1-59298 Scientif
3af0: 69 63 20 6e 6f 74 61 74 69 6f 6e 20 69 73 20 73  ic notation is s
3b00: 75 70 70 6f 72 74 65 64 20 66 6f 72 0a 23 20 66  upported for.# f
3b10: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6c 69  loating point li
3b20: 74 65 72 61 6c 20 76 61 6c 75 65 73 2e 0a 23 0a  teral values..#.
3b30: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3b40: 65 5f 65 78 70 72 2d 31 30 2e 32 2e 31 20 7b 20  e_expr-10.2.1 { 
3b50: 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 33 2e  SELECT typeof(3.
3b60: 34 65 2d 30 32 29 20 20 20 20 7d 20 7b 72 65 61  4e-02)    } {rea
3b70: 6c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  l}.do_execsql_te
3b80: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 32 2e 32  st e_expr-10.2.2
3b90: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3ba0: 28 33 65 2b 35 29 20 20 20 20 20 20 20 7d 20 7b  (3e+5)       } {
3bb0: 72 65 61 6c 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  real}.do_execsql
3bc0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e  _test e_expr-10.
3bd0: 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 33 2e 34  2.3 { SELECT 3.4
3be0: 65 2d 30 32 20 20 20 20 20 20 20 20 20 20 20 20  e-02            
3bf0: 7d 20 7b 30 2e 30 33 34 7d 0a 64 6f 5f 65 78 65  } {0.034}.do_exe
3c00: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
3c10: 2d 31 30 2e 32 2e 34 20 7b 20 53 45 4c 45 43 54  -10.2.4 { SELECT
3c20: 20 33 65 2b 34 20 20 20 20 20 20 20 20 20 20 20   3e+4           
3c30: 20 20 20 20 7d 20 7b 33 30 30 30 30 2e 30 7d 0a      } {30000.0}.
3c40: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
3c50: 52 2d 33 35 32 32 39 2d 31 37 38 33 30 20 41 20  R-35229-17830 A 
3c60: 73 74 72 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20  string constant 
3c70: 69 73 20 66 6f 72 6d 65 64 20 62 79 20 65 6e 63  is formed by enc
3c80: 6c 6f 73 69 6e 67 0a 23 20 74 68 65 20 73 74 72  losing.# the str
3c90: 69 6e 67 20 69 6e 20 73 69 6e 67 6c 65 20 71 75  ing in single qu
3ca0: 6f 74 65 73 20 28 27 29 2e 0a 23 0a 23 20 45 56  otes (')..#.# EV
3cb0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 31  IDENCE-OF: R-071
3cc0: 30 30 2d 30 36 36 30 36 20 41 20 73 69 6e 67 6c  00-06606 A singl
3cd0: 65 20 71 75 6f 74 65 20 77 69 74 68 69 6e 20 74  e quote within t
3ce0: 68 65 20 73 74 72 69 6e 67 20 63 61 6e 20 62 65  he string can be
3cf0: 0a 23 20 65 6e 63 6f 64 65 64 20 62 79 20 70 75  .# encoded by pu
3d00: 74 74 69 6e 67 20 74 77 6f 20 73 69 6e 67 6c 65  tting two single
3d10: 20 71 75 6f 74 65 73 20 69 6e 20 61 20 72 6f 77   quotes in a row
3d20: 20 2d 20 61 73 20 69 6e 20 50 61 73 63 61 6c 2e   - as in Pascal.
3d30: 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .#.do_execsql_te
3d40: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 33 2e 31  st e_expr-10.3.1
3d50: 20 7b 20 53 45 4c 45 43 54 20 27 69 73 20 6e 6f   { SELECT 'is no
3d60: 74 27 20 7d 20 20 20 20 20 20 20 20 20 7b 7b 69  t' }         {{i
3d70: 73 20 6e 6f 74 7d 7d 0a 64 6f 5f 65 78 65 63 73  s not}}.do_execs
3d80: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
3d90: 30 2e 33 2e 32 20 7b 20 53 45 4c 45 43 54 20 74  0.3.2 { SELECT t
3da0: 79 70 65 6f 66 28 27 69 73 20 6e 6f 74 27 29 20  ypeof('is not') 
3db0: 7d 20 7b 74 65 78 74 7d 0a 64 6f 5f 65 78 65 63  } {text}.do_exec
3dc0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3dd0: 31 30 2e 33 2e 33 20 7b 20 53 45 4c 45 43 54 20  10.3.3 { SELECT 
3de0: 27 69 73 6e 27 27 74 27 20 7d 20 20 20 20 20 20  'isn''t' }      
3df0: 20 20 20 7b 69 73 6e 27 74 7d 0a 64 6f 5f 65 78     {isn't}.do_ex
3e00: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
3e10: 72 2d 31 30 2e 33 2e 34 20 7b 20 53 45 4c 45 43  r-10.3.4 { SELEC
3e20: 54 20 74 79 70 65 6f 66 28 27 69 73 6e 27 27 74  T typeof('isn''t
3e30: 27 29 20 7d 20 7b 74 65 78 74 7d 0a 0a 23 20 45  ') } {text}..# E
3e40: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 39  VIDENCE-OF: R-09
3e50: 35 39 33 2d 30 33 33 32 31 20 42 4c 4f 42 20 6c  593-03321 BLOB l
3e60: 69 74 65 72 61 6c 73 20 61 72 65 20 73 74 72 69  iterals are stri
3e70: 6e 67 20 6c 69 74 65 72 61 6c 73 0a 23 20 63 6f  ng literals.# co
3e80: 6e 74 61 69 6e 69 6e 67 20 68 65 78 61 64 65 63  ntaining hexadec
3e90: 69 6d 61 6c 20 64 61 74 61 20 61 6e 64 20 70 72  imal data and pr
3ea0: 65 63 65 64 65 64 20 62 79 20 61 20 73 69 6e 67  eceded by a sing
3eb0: 6c 65 20 22 78 22 20 6f 72 20 22 58 22 0a 23 20  le "x" or "X".# 
3ec0: 63 68 61 72 61 63 74 65 72 2e 0a 23 0a 23 20 45  character..#.# E
3ed0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39  VIDENCE-OF: R-39
3ee0: 33 34 34 2d 35 39 37 38 37 20 46 6f 72 20 65 78  344-59787 For ex
3ef0: 61 6d 70 6c 65 3a 20 58 27 35 33 35 31 34 43 36  ample: X'53514C6
3f00: 39 37 34 36 35 27 0a 23 0a 64 6f 5f 65 78 65 63  97465'.#.do_exec
3f10: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
3f20: 31 30 2e 34 2e 31 20 7b 20 53 45 4c 45 43 54 20  10.4.1 { SELECT 
3f30: 74 79 70 65 6f 66 28 58 27 30 31 32 33 34 35 36  typeof(X'0123456
3f40: 37 38 39 41 42 43 44 45 46 27 29 20 7d 20 62 6c  789ABCDEF') } bl
3f50: 6f 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  ob.do_execsql_te
3f60: 73 74 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e 32  st e_expr-10.4.2
3f70: 20 7b 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66   { SELECT typeof
3f80: 28 78 27 30 31 32 33 34 35 36 37 38 39 41 42 43  (x'0123456789ABC
3f90: 44 45 46 27 29 20 7d 20 62 6c 6f 62 0a 64 6f 5f  DEF') } blob.do_
3fa0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
3fb0: 78 70 72 2d 31 30 2e 34 2e 33 20 7b 20 53 45 4c  xpr-10.4.3 { SEL
3fc0: 45 43 54 20 74 79 70 65 6f 66 28 58 27 30 31 32  ECT typeof(X'012
3fd0: 33 34 35 36 37 38 39 61 62 63 64 65 66 27 29 20  3456789abcdef') 
3fe0: 7d 20 62 6c 6f 62 0a 64 6f 5f 65 78 65 63 73 71  } blob.do_execsq
3ff0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30  l_test e_expr-10
4000: 2e 34 2e 34 20 7b 20 53 45 4c 45 43 54 20 74 79  .4.4 { SELECT ty
4010: 70 65 6f 66 28 78 27 30 31 32 33 34 35 36 37 38  peof(x'012345678
4020: 39 61 62 63 64 65 66 27 29 20 7d 20 62 6c 6f 62  9abcdef') } blob
4030: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
4040: 20 65 5f 65 78 70 72 2d 31 30 2e 34 2e 35 20 7b   e_expr-10.4.5 {
4050: 20 53 45 4c 45 43 54 20 74 79 70 65 6f 66 28 58   SELECT typeof(X
4060: 27 35 33 35 31 34 43 36 39 37 34 36 35 27 29 20  '53514C697465') 
4070: 20 20 20 20 7d 20 62 6c 6f 62 0a 0a 23 20 45 56      } blob..# EV
4080: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 39  IDENCE-OF: R-239
4090: 31 34 2d 35 31 34 37 36 20 41 20 6c 69 74 65 72  14-51476 A liter
40a0: 61 6c 20 76 61 6c 75 65 20 63 61 6e 20 61 6c 73  al value can als
40b0: 6f 20 62 65 20 74 68 65 20 74 6f 6b 65 6e 0a 23  o be the token.#
40c0: 20 22 4e 55 4c 4c 22 2e 0a 23 0a 64 6f 5f 65 78   "NULL"..#.do_ex
40d0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
40e0: 72 2d 31 30 2e 35 2e 31 20 7b 20 53 45 4c 45 43  r-10.5.1 { SELEC
40f0: 54 20 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 7d  T NULL         }
4100: 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {{}}.do_execsql
4110: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 30 2e  _test e_expr-10.
4120: 35 2e 32 20 7b 20 53 45 4c 45 43 54 20 74 79 70  5.2 { SELECT typ
4130: 65 6f 66 28 4e 55 4c 4c 29 20 7d 20 7b 6e 75 6c  eof(NULL) } {nul
4140: 6c 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  l}..#-----------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
4190: 20 54 65 73 74 20 73 74 61 74 65 6d 65 6e 74 73   Test statements
41a0: 20 72 65 6c 61 74 65 64 20 74 6f 20 62 6f 75 6e   related to boun
41b0: 64 20 70 61 72 61 6d 65 74 65 72 73 0a 23 0a 0a  d parameters.#..
41c0: 70 72 6f 63 20 70 61 72 61 6d 65 74 65 72 5f 74  proc parameter_t
41d0: 65 73 74 20 7b 74 6e 20 73 71 6c 20 70 61 72 61  est {tn sql para
41e0: 6d 73 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 73  ms result} {.  s
41f0: 65 74 20 73 74 6d 74 20 5b 73 71 6c 69 74 65 33  et stmt [sqlite3
4200: 5f 70 72 65 70 61 72 65 5f 76 32 20 64 62 20 24  _prepare_v2 db $
4210: 73 71 6c 20 2d 31 5d 0a 0a 20 20 66 6f 72 65 61  sql -1]..  forea
4220: 63 68 20 7b 6e 75 6d 62 65 72 20 6e 61 6d 65 7d  ch {number name}
4230: 20 24 70 61 72 61 6d 73 20 7b 0a 20 20 20 20 73   $params {.    s
4240: 65 74 20 6e 6d 20 5b 73 71 6c 69 74 65 33 5f 62  et nm [sqlite3_b
4250: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
4260: 6d 65 20 24 73 74 6d 74 20 24 6e 75 6d 62 65 72  me $stmt $number
4270: 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 24 74  ].    do_test $t
4280: 6e 2e 6e 61 6d 65 2e 24 6e 75 6d 62 65 72 20 5b  n.name.$number [
4290: 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 6e 6d 5d  list set {} $nm]
42a0: 20 24 6e 61 6d 65 0a 20 20 20 20 73 71 6c 69 74   $name.    sqlit
42b0: 65 33 5f 62 69 6e 64 5f 69 6e 74 20 24 73 74 6d  e3_bind_int $stm
42c0: 74 20 24 6e 75 6d 62 65 72 20 5b 65 78 70 72 20  t $number [expr 
42d0: 2d 31 20 2a 20 24 6e 75 6d 62 65 72 5d 0a 20 20  -1 * $number].  
42e0: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65  }..  sqlite3_ste
42f0: 70 20 24 73 74 6d 74 0a 0a 20 20 73 65 74 20 72  p $stmt..  set r
4300: 65 73 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 20  es [list].  for 
4310: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20  {set i 0} {$i < 
4320: 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  [sqlite3_column_
4330: 63 6f 75 6e 74 20 24 73 74 6d 74 5d 7d 20 7b 69  count $stmt]} {i
4340: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 6c 61 70  ncr i} {.    lap
4350: 70 65 6e 64 20 72 65 73 20 5b 73 71 6c 69 74 65  pend res [sqlite
4360: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 24 73  3_column_text $s
4370: 74 6d 74 20 24 69 5d 0a 20 20 7d 0a 0a 20 20 73  tmt $i].  }..  s
4380: 65 74 20 72 63 20 5b 73 71 6c 69 74 65 33 5f 66  et rc [sqlite3_f
4390: 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 5d 0a 20  inalize $stmt]. 
43a0: 20 64 6f 5f 74 65 73 74 20 24 74 6e 2e 72 63 20   do_test $tn.rc 
43b0: 5b 6c 69 73 74 20 73 65 74 20 7b 7d 20 24 72 63  [list set {} $rc
43c0: 5d 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 64 6f  ] SQLITE_OK.  do
43d0: 5f 74 65 73 74 20 24 74 6e 2e 72 65 73 20 5b 6c  _test $tn.res [l
43e0: 69 73 74 20 73 65 74 20 7b 7d 20 24 72 65 73 5d  ist set {} $res]
43f0: 20 24 72 65 73 75 6c 74 0a 7d 0a 0a 23 20 45 56   $result.}..# EV
4400: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 35  IDENCE-OF: R-335
4410: 30 39 2d 33 39 34 35 38 20 41 20 71 75 65 73 74  09-39458 A quest
4420: 69 6f 6e 20 6d 61 72 6b 20 66 6f 6c 6c 6f 77 65  ion mark followe
4430: 64 20 62 79 20 61 20 6e 75 6d 62 65 72 20 4e 4e  d by a number NN
4440: 4e 0a 23 20 68 6f 6c 64 73 20 61 20 73 70 6f 74  N.# holds a spot
4450: 20 66 6f 72 20 74 68 65 20 4e 4e 4e 2d 74 68 20   for the NNN-th 
4460: 70 61 72 61 6d 65 74 65 72 2e 20 4e 4e 4e 20 6d  parameter. NNN m
4470: 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31  ust be between 1
4480: 20 61 6e 64 0a 23 20 53 51 4c 49 54 45 5f 4d 41   and.# SQLITE_MA
4490: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
44a0: 52 2e 0a 23 0a 73 65 74 20 6d 76 6e 20 24 53 51  R..#.set mvn $SQ
44b0: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
44c0: 45 5f 4e 55 4d 42 45 52 0a 70 61 72 61 6d 65 74  E_NUMBER.paramet
44d0: 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  er_test e_expr-1
44e0: 31 2e 31 20 22 0a 20 20 53 45 4c 45 43 54 20 3f  1.1 ".  SELECT ?
44f0: 31 2c 20 3f 31 32 33 2c 20 3f 24 53 51 4c 49 54  1, ?123, ?$SQLIT
4500: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
4510: 55 4d 42 45 52 2c 20 3f 31 32 33 2c 20 3f 34 0a  UMBER, ?123, ?4.
4520: 22 20 20 20 22 31 20 3f 31 20 20 31 32 33 20 3f  "   "1 ?1  123 ?
4530: 31 32 33 20 24 6d 76 6e 20 3f 24 6d 76 6e 20 34  123 $mvn ?$mvn 4
4540: 20 3f 34 22 20 20 20 22 2d 31 20 2d 31 32 33 20   ?4"   "-1 -123 
4550: 2d 24 6d 76 6e 20 2d 31 32 33 20 2d 34 22 0a 0a  -$mvn -123 -4"..
4560: 73 65 74 20 65 72 72 6d 73 67 20 22 76 61 72 69  set errmsg "vari
4570: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
4580: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
4590: 6e 64 20 3f 24 53 51 4c 49 54 45 5f 4d 41 58 5f  nd ?$SQLITE_MAX_
45a0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22  VARIABLE_NUMBER"
45b0: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 70 61 72  .foreach {tn par
45c0: 61 6d 5f 6e 75 6d 62 65 72 7d 20 5b 6c 69 73 74  am_number} [list
45d0: 20 5c 0a 20 20 32 20 20 30 20 20 20 20 20 20 20   \.  2  0       
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
4600: 20 33 20 20 5b 65 78 70 72 20 24 53 51 4c 49 54   3  [expr $SQLIT
4610: 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
4620: 55 4d 42 45 52 2b 31 5d 20 5c 0a 20 20 34 20 20  UMBER+1] \.  4  
4630: 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41  [expr $SQLITE_MA
4640: 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
4650: 52 2b 32 5d 20 5c 0a 20 20 35 20 20 31 32 33 34  R+2] \.  5  1234
4660: 35 36 37 38 39 30 33 34 35 36 37 38 39 30 33 34  5678903456789034
4670: 35 36 37 38 39 30 32 33 34 35 36 37 38 39 30 20  567890234567890 
4680: 20 5c 0a 20 20 36 20 20 32 31 34 37 34 38 33 36   \.  6  21474836
4690: 34 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20  48              
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
46b0: 20 37 20 20 32 31 34 37 34 38 33 36 34 39 20 20   7  2147483649  
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 38 20 20           \.  8  
46e0: 34 32 39 34 39 36 37 32 39 36 20 20 20 20 20 20  4294967296      
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 20 20 5c 0a 20 20 39 20 20 34 32 39 34       \.  9  4294
4710: 39 36 37 32 39 37 20 20 20 20 20 20 20 20 20 20  967297          
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 20 5c 0a 20 20 31 30 20 39 32 32 33 33 37 32 30   \.  10 92233720
4740: 33 36 38 35 34 37 37 35 38 30 38 20 20 20 20 20  36854775808     
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
4760: 20 31 31 20 39 32 32 33 33 37 32 30 33 36 38 35   11 922337203685
4770: 34 37 37 35 38 30 39 20 20 20 20 20 20 20 20 20  4775809         
4780: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 31 32 20           \.  12 
4790: 31 38 34 34 36 37 34 34 30 37 33 37 30 39 35 35  1844674407370955
47a0: 31 36 31 36 20 20 20 20 20 20 20 20 20 20 20 20  1616            
47b0: 20 20 20 20 20 5c 0a 20 20 31 33 20 31 38 34 34       \.  13 1844
47c0: 36 37 34 34 30 37 33 37 30 39 35 35 31 36 31 37  6744073709551617
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 5c 0a 5d 20 7b 0a 20 20 64 6f 5f 63 61 74 63   \.] {.  do_catc
47f0: 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  hsql_test e_expr
4800: 2d 31 31 2e 31 2e 24 74 6e 20 22 53 45 4c 45 43  -11.1.$tn "SELEC
4810: 54 20 3f 24 70 61 72 61 6d 5f 6e 75 6d 62 65 72  T ?$param_number
4820: 22 20 5b 6c 69 73 74 20 31 20 24 65 72 72 6d 73  " [list 1 $errms
4830: 67 5d 0a 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  g].}..# EVIDENCE
4840: 2d 4f 46 3a 20 52 2d 33 33 36 37 30 2d 33 36 30  -OF: R-33670-360
4850: 39 37 20 41 20 71 75 65 73 74 69 6f 6e 20 6d 61  97 A question ma
4860: 72 6b 20 74 68 61 74 20 69 73 20 6e 6f 74 20 66  rk that is not f
4870: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 0a 23 20 6e  ollowed by a.# n
4880: 75 6d 62 65 72 20 63 72 65 61 74 65 73 20 61 20  umber creates a 
4890: 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 61  parameter with a
48a0: 20 6e 75 6d 62 65 72 20 6f 6e 65 20 67 72 65 61   number one grea
48b0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ter than the lar
48c0: 67 65 73 74 0a 23 20 70 61 72 61 6d 65 74 65 72  gest.# parameter
48d0: 20 6e 75 6d 62 65 72 20 61 6c 72 65 61 64 79 20   number already 
48e0: 61 73 73 69 67 6e 65 64 2e 0a 23 0a 23 20 45 56  assigned..#.# EV
48f0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32 39  IDENCE-OF: R-429
4900: 33 38 2d 30 37 30 33 30 20 49 66 20 74 68 69 73  38-07030 If this
4910: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 72 61 6d   means the param
4920: 65 74 65 72 20 6e 75 6d 62 65 72 20 69 73 0a 23  eter number is.#
4930: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51   greater than SQ
4940: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
4950: 45 5f 4e 55 4d 42 45 52 2c 20 69 74 20 69 73 20  E_NUMBER, it is 
4960: 61 6e 20 65 72 72 6f 72 2e 0a 23 0a 70 61 72 61  an error..#.para
4970: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
4980: 72 2d 31 31 2e 32 2e 31 20 22 53 45 4c 45 43 54  r-11.2.1 "SELECT
4990: 20 3f 22 20 20 20 20 20 20 20 20 20 20 7b 31 20   ?"          {1 
49a0: 7b 7d 7d 20 20 20 20 20 20 20 2d 31 0a 70 61 72  {}}       -1.par
49b0: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
49c0: 70 72 2d 31 31 2e 32 2e 32 20 22 53 45 4c 45 43  pr-11.2.2 "SELEC
49d0: 54 20 3f 2c 20 3f 22 20 20 20 20 20 20 20 7b 31  T ?, ?"       {1
49e0: 20 7b 7d 20 32 20 7b 7d 7d 20 20 7b 2d 31 20 2d   {} 2 {}}  {-1 -
49f0: 32 7d 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73  2}.parameter_tes
4a00: 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 33 20  t e_expr-11.2.3 
4a10: 22 53 45 4c 45 43 54 20 3f 35 2c 20 3f 22 20 20  "SELECT ?5, ?"  
4a20: 20 20 20 20 7b 35 20 3f 35 20 36 20 7b 7d 7d 20      {5 ?5 6 {}} 
4a30: 20 7b 2d 35 20 2d 36 7d 0a 70 61 72 61 6d 65 74   {-5 -6}.paramet
4a40: 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  er_test e_expr-1
4a50: 31 2e 32 2e 34 20 22 53 45 4c 45 43 54 20 3f 2c  1.2.4 "SELECT ?,
4a60: 20 3f 35 22 20 20 20 20 20 20 7b 31 20 7b 7d 20   ?5"      {1 {} 
4a70: 35 20 3f 35 7d 20 20 7b 2d 31 20 2d 35 7d 0a 70  5 ?5}  {-1 -5}.p
4a80: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
4a90: 65 78 70 72 2d 31 31 2e 32 2e 35 20 22 53 45 4c  expr-11.2.5 "SEL
4aa0: 45 43 54 20 3f 2c 20 3f 34 35 36 2c 20 3f 22 20  ECT ?, ?456, ?" 
4ab0: 7b 0a 20 20 31 20 7b 7d 20 34 35 36 20 3f 34 35  {.  1 {} 456 ?45
4ac0: 36 20 34 35 37 20 7b 7d 0a 7d 20 20 7b 2d 31 20  6 457 {}.}  {-1 
4ad0: 2d 34 35 36 20 2d 34 35 37 7d 0a 70 61 72 61 6d  -456 -457}.param
4ae0: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
4af0: 2d 31 31 2e 32 2e 35 20 22 53 45 4c 45 43 54 20  -11.2.5 "SELECT 
4b00: 3f 2c 20 3f 34 35 36 2c 20 3f 34 2c 20 3f 22 20  ?, ?456, ?4, ?" 
4b10: 7b 0a 20 20 31 20 7b 7d 20 34 35 36 20 3f 34 35  {.  1 {} 456 ?45
4b20: 36 20 34 20 3f 34 20 34 35 37 20 7b 7d 0a 7d 20  6 4 ?4 457 {}.} 
4b30: 20 7b 2d 31 20 2d 34 35 36 20 2d 34 20 2d 34 35   {-1 -456 -4 -45
4b40: 37 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  7}.foreach {tn s
4b50: 71 6c 7d 20 5b 6c 69 73 74 20 20 20 20 20 20 20  ql} [list       
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 20 20 20 20 5c 0a 20 20 31 20 20 22 53 45 4c 45      \.  1  "SELE
4b80: 43 54 20 3f 24 6d 76 6e 2c 20 3f 22 20 20 20 20  CT ?$mvn, ?"    
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 20 20 20 20 20 5c 0a 20 20 32 20 20 22 53         \.  2  "S
4bb0: 45 4c 45 43 54 20 3f 5b 65 78 70 72 20 24 6d 76  ELECT ?[expr $mv
4bc0: 6e 2d 35 5d 2c 20 3f 2c 20 3f 2c 20 3f 2c 20 3f  n-5], ?, ?, ?, ?
4bd0: 2c 20 3f 2c 20 3f 22 20 20 20 5c 0a 20 20 33 20  , ?, ?"   \.  3 
4be0: 20 22 53 45 4c 45 43 54 20 3f 5b 65 78 70 72 20   "SELECT ?[expr 
4bf0: 24 6d 76 6e 5d 2c 20 3f 35 2c 20 3f 36 2c 20 3f  $mvn], ?5, ?6, ?
4c00: 22 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 5d  "            \.]
4c10: 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c   {.  do_catchsql
4c20: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
4c30: 33 2e 24 74 6e 20 24 73 71 6c 20 5b 6c 69 73 74  3.$tn $sql [list
4c40: 20 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 53 51 4c   1 {too many SQL
4c50: 20 76 61 72 69 61 62 6c 65 73 7d 5d 0a 7d 0a 0a   variables}].}..
4c60: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
4c70: 2d 31 31 36 32 30 2d 32 32 37 34 33 20 41 20 63  -11620-22743 A c
4c80: 6f 6c 6f 6e 20 66 6f 6c 6c 6f 77 65 64 20 62 79  olon followed by
4c90: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6e   an identifier n
4ca0: 61 6d 65 0a 23 20 68 6f 6c 64 73 20 61 20 73 70  ame.# holds a sp
4cb0: 6f 74 20 66 6f 72 20 61 20 6e 61 6d 65 64 20 70  ot for a named p
4cc0: 61 72 61 6d 65 74 65 72 20 77 69 74 68 20 74 68  arameter with th
4cd0: 65 20 6e 61 6d 65 20 3a 41 41 41 41 2e 0a 23 0a  e name :AAAA..#.
4ce0: 23 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e  # Identifiers in
4cf0: 20 53 51 4c 69 74 65 20 63 6f 6e 73 69 73 74 20   SQLite consist 
4d00: 6f 66 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 2c  of alphanumeric,
4d10: 20 27 5f 27 20 61 6e 64 20 27 24 27 20 63 68 61   '_' and '$' cha
4d20: 72 61 63 74 65 72 73 2c 0a 23 20 61 6e 64 20 61  racters,.# and a
4d30: 6e 79 20 55 54 46 20 63 68 61 72 61 63 74 65 72  ny UTF character
4d40: 73 20 77 69 74 68 20 63 6f 64 65 70 6f 69 6e 74  s with codepoint
4d50: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 31 32  s larger than 12
4d60: 37 20 28 6e 6f 6e 2d 41 53 43 49 49 20 0a 23 20  7 (non-ASCII .# 
4d70: 63 68 61 72 61 63 74 65 72 73 29 2e 0a 23 0a 70  characters)..#.p
4d80: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
4d90: 65 78 70 72 2d 31 31 2e 32 2e 31 20 7b 53 45 4c  expr-11.2.1 {SEL
4da0: 45 43 54 20 3a 41 41 41 41 7d 20 20 20 20 20 20  ECT :AAAA}      
4db0: 20 20 20 7b 31 20 3a 41 41 41 41 7d 20 20 20 20     {1 :AAAA}    
4dc0: 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f     -1.parameter_
4dd0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32  test e_expr-11.2
4de0: 2e 32 20 7b 53 45 4c 45 43 54 20 3a 31 32 33 7d  .2 {SELECT :123}
4df0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 3a 31 32            {1 :12
4e00: 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72  3}        -1.par
4e10: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
4e20: 70 72 2d 31 31 2e 32 2e 33 20 7b 53 45 4c 45 43  pr-11.2.3 {SELEC
4e30: 54 20 3a 5f 5f 7d 20 20 20 20 20 20 20 20 20 20  T :__}          
4e40: 20 7b 31 20 3a 5f 5f 7d 20 20 20 20 20 20 20 20   {1 :__}        
4e50: 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65   -1.parameter_te
4e60: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 32 2e 34  st e_expr-11.2.4
4e70: 20 7b 53 45 4c 45 43 54 20 3a 5f 24 5f 7d 20 20   {SELECT :_$_}  
4e80: 20 20 20 20 20 20 20 20 7b 31 20 3a 5f 24 5f 7d          {1 :_$_}
4e90: 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61 6d          -1.param
4ea0: 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72  eter_test e_expr
4eb0: 2d 31 31 2e 32 2e 35 20 22 0a 20 20 53 45 4c 45  -11.2.5 ".  SELE
4ec0: 43 54 20 3a 5c 75 30 65 34 30 5c 75 30 65 32 64  CT :\u0e40\u0e2d
4ed0: 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75 30 65  \u0e28\u0e02\u0e
4ee0: 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64 5c 75  39\u0e40\u0e2d\u
4ef0: 30 65 32 35 0a 22 20 22 31 20 3a 5c 75 30 65 34  0e25." "1 :\u0e4
4f00: 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75 30  0\u0e2d\u0e28\u0
4f10: 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30 5c  e02\u0e39\u0e40\
4f20: 75 30 65 32 64 5c 75 30 65 32 35 22 20 2d 31 0a  u0e2d\u0e25" -1.
4f30: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
4f40: 5f 65 78 70 72 2d 31 31 2e 32 2e 36 20 22 53 45  _expr-11.2.6 "SE
4f50: 4c 45 43 54 20 3a 5c 75 30 30 38 30 22 20 22 31  LECT :\u0080" "1
4f60: 20 3a 5c 75 30 30 38 30 22 20 2d 31 0a 0a 23 20   :\u0080" -1..# 
4f70: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
4f80: 39 37 38 33 2d 36 31 32 37 39 20 41 6e 20 22 61  9783-61279 An "a
4f90: 74 22 20 73 69 67 6e 20 77 6f 72 6b 73 20 65 78  t" sign works ex
4fa0: 61 63 74 6c 79 20 6c 69 6b 65 20 61 20 63 6f 6c  actly like a col
4fb0: 6f 6e 2c 0a 23 20 65 78 63 65 70 74 20 74 68 61  on,.# except tha
4fc0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
4fd0: 65 20 70 61 72 61 6d 65 74 65 72 20 63 72 65 61  e parameter crea
4fe0: 74 65 64 20 69 73 20 40 41 41 41 41 2e 0a 23 0a  ted is @AAAA..#.
4ff0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
5000: 5f 65 78 70 72 2d 31 31 2e 33 2e 31 20 7b 53 45  _expr-11.3.1 {SE
5010: 4c 45 43 54 20 40 41 41 41 41 7d 20 20 20 20 20  LECT @AAAA}     
5020: 20 20 20 20 7b 31 20 40 41 41 41 41 7d 20 20 20      {1 @AAAA}   
5030: 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72      -1.parameter
5040: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5050: 33 2e 32 20 7b 53 45 4c 45 43 54 20 40 31 32 33  3.2 {SELECT @123
5060: 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 40 31  }          {1 @1
5070: 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61  23}        -1.pa
5080: 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65  rameter_test e_e
5090: 78 70 72 2d 31 31 2e 33 2e 33 20 7b 53 45 4c 45  xpr-11.3.3 {SELE
50a0: 43 54 20 40 5f 5f 7d 20 20 20 20 20 20 20 20 20  CT @__}         
50b0: 20 20 7b 31 20 40 5f 5f 7d 20 20 20 20 20 20 20    {1 @__}       
50c0: 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74    -1.parameter_t
50d0: 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 33 2e  est e_expr-11.3.
50e0: 34 20 7b 53 45 4c 45 43 54 20 40 5f 24 5f 7d 20  4 {SELECT @_$_} 
50f0: 20 20 20 20 20 20 20 20 20 7b 31 20 40 5f 24 5f           {1 @_$_
5100: 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72 61  }        -1.para
5110: 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70  meter_test e_exp
5120: 72 2d 31 31 2e 33 2e 35 20 22 0a 20 20 53 45 4c  r-11.3.5 ".  SEL
5130: 45 43 54 20 40 5c 75 30 65 34 30 5c 75 30 65 32  ECT @\u0e40\u0e2
5140: 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c 75 30  d\u0e28\u0e02\u0
5150: 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32 64 5c  e39\u0e40\u0e2d\
5160: 75 30 65 32 35 0a 22 20 22 31 20 40 5c 75 30 65  u0e25." "1 @\u0e
5170: 34 30 5c 75 30 65 32 64 5c 75 30 65 32 38 5c 75  40\u0e2d\u0e28\u
5180: 30 65 30 32 5c 75 30 65 33 39 5c 75 30 65 34 30  0e02\u0e39\u0e40
5190: 5c 75 30 65 32 64 5c 75 30 65 32 35 22 20 2d 31  \u0e2d\u0e25" -1
51a0: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
51b0: 65 5f 65 78 70 72 2d 31 31 2e 33 2e 36 20 22 53  e_expr-11.3.6 "S
51c0: 45 4c 45 43 54 20 40 5c 75 30 30 38 30 22 20 22  ELECT @\u0080" "
51d0: 31 20 40 5c 75 30 30 38 30 22 20 2d 31 0a 0a 23  1 @\u0080" -1..#
51e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
51f0: 36 32 36 31 30 2d 35 31 33 32 39 20 41 20 64 6f  62610-51329 A do
5200: 6c 6c 61 72 2d 73 69 67 6e 20 66 6f 6c 6c 6f 77  llar-sign follow
5210: 65 64 20 62 79 20 61 6e 20 69 64 65 6e 74 69 66  ed by an identif
5220: 69 65 72 0a 23 20 6e 61 6d 65 20 61 6c 73 6f 20  ier.# name also 
5230: 68 6f 6c 64 73 20 61 20 73 70 6f 74 20 66 6f 72  holds a spot for
5240: 20 61 20 6e 61 6d 65 64 20 70 61 72 61 6d 65 74   a named paramet
5250: 65 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  er with the name
5260: 20 24 41 41 41 41 2e 0a 23 0a 23 20 45 56 49 44   $AAAA..#.# EVID
5270: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 30 32 35  ENCE-OF: R-55025
5280: 2d 32 31 30 34 32 20 54 68 65 20 69 64 65 6e 74  -21042 The ident
5290: 69 66 69 65 72 20 6e 61 6d 65 20 69 6e 20 74 68  ifier name in th
52a0: 69 73 20 63 61 73 65 20 63 61 6e 0a 23 20 69 6e  is case can.# in
52b0: 63 6c 75 64 65 20 6f 6e 65 20 6f 72 20 6d 6f 72  clude one or mor
52c0: 65 20 6f 63 63 75 72 72 65 6e 63 65 73 20 6f 66  e occurrences of
52d0: 20 22 3a 3a 22 20 61 6e 64 20 61 20 73 75 66 66   "::" and a suff
52e0: 69 78 20 65 6e 63 6c 6f 73 65 64 20 69 6e 0a 23  ix enclosed in.#
52f0: 20 22 28 2e 2e 2e 29 22 20 63 6f 6e 74 61 69 6e   "(...)" contain
5300: 69 6e 67 20 61 6e 79 20 74 65 78 74 20 61 74 20  ing any text at 
5310: 61 6c 6c 2e 0a 23 0a 23 20 4e 6f 74 65 3a 20 4c  all..#.# Note: L
5320: 6f 6f 6b 73 20 6c 69 6b 65 20 61 6e 20 69 64 65  ooks like an ide
5330: 6e 74 69 66 69 65 72 20 63 61 6e 6e 6f 74 20 63  ntifier cannot c
5340: 6f 6e 73 69 73 74 20 65 6e 74 69 72 65 6c 79 20  onsist entirely 
5350: 6f 66 20 22 3a 3a 22 20 0a 23 20 63 68 61 72 61  of "::" .# chara
5360: 63 74 65 72 73 20 6f 72 20 6a 75 73 74 20 61 20  cters or just a 
5370: 73 75 66 66 69 78 2e 20 41 6c 73 6f 2c 20 74 68  suffix. Also, th
5380: 65 20 6f 74 68 65 72 20 6e 61 6d 65 64 20 76 61  e other named va
5390: 72 69 61 62 6c 65 20 63 68 61 72 61 63 74 65 72  riable character
53a0: 73 0a 23 20 28 3a 20 61 6e 64 20 40 29 20 77 6f  s.# (: and @) wo
53b0: 72 6b 20 74 68 65 20 73 61 6d 65 20 77 61 79 20  rk the same way 
53c0: 69 6e 74 65 72 6e 61 6c 6c 79 2e 20 57 68 79 20  internally. Why 
53d0: 6e 6f 74 20 6a 75 73 74 20 64 6f 63 75 6d 65 6e  not just documen
53e0: 74 20 69 74 20 74 68 61 74 20 77 61 79 3f 0a 23  t it that way?.#
53f0: 0a 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20  .parameter_test 
5400: 65 5f 65 78 70 72 2d 31 31 2e 34 2e 31 20 7b 53  e_expr-11.4.1 {S
5410: 45 4c 45 43 54 20 24 41 41 41 41 7d 20 20 20 20  ELECT $AAAA}    
5420: 20 20 20 20 20 7b 31 20 24 41 41 41 41 7d 20 20       {1 $AAAA}  
5430: 20 20 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65       -1.paramete
5440: 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  r_test e_expr-11
5450: 2e 34 2e 32 20 7b 53 45 4c 45 43 54 20 24 31 32  .4.2 {SELECT $12
5460: 33 7d 20 20 20 20 20 20 20 20 20 20 7b 31 20 24  3}          {1 $
5470: 31 32 33 7d 20 20 20 20 20 20 20 20 2d 31 0a 70  123}        -1.p
5480: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
5490: 65 78 70 72 2d 31 31 2e 34 2e 33 20 7b 53 45 4c  expr-11.4.3 {SEL
54a0: 45 43 54 20 24 5f 5f 7d 20 20 20 20 20 20 20 20  ECT $__}        
54b0: 20 20 20 7b 31 20 24 5f 5f 7d 20 20 20 20 20 20     {1 $__}      
54c0: 20 20 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f     -1.parameter_
54d0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34  test e_expr-11.4
54e0: 2e 34 20 7b 53 45 4c 45 43 54 20 24 5f 24 5f 7d  .4 {SELECT $_$_}
54f0: 20 20 20 20 20 20 20 20 20 20 7b 31 20 24 5f 24            {1 $_$
5500: 5f 7d 20 20 20 20 20 20 20 20 2d 31 0a 70 61 72  _}        -1.par
5510: 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f 65 78  ameter_test e_ex
5520: 70 72 2d 31 31 2e 34 2e 35 20 22 0a 20 20 53 45  pr-11.4.5 ".  SE
5530: 4c 45 43 54 20 5c 24 5c 75 30 65 34 30 5c 75 30  LECT \$\u0e40\u0
5540: 65 32 64 5c 75 30 65 32 38 5c 75 30 65 30 32 5c  e2d\u0e28\u0e02\
5550: 75 30 65 33 39 5c 75 30 65 34 30 5c 75 30 65 32  u0e39\u0e40\u0e2
5560: 64 5c 75 30 65 32 35 0a 22 20 22 31 20 5c 24 5c  d\u0e25." "1 \$\
5570: 75 30 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32  u0e40\u0e2d\u0e2
5580: 38 5c 75 30 65 30 32 5c 75 30 65 33 39 5c 75 30  8\u0e02\u0e39\u0
5590: 65 34 30 5c 75 30 65 32 64 5c 75 30 65 32 35 22  e40\u0e2d\u0e25"
55a0: 20 2d 31 0a 70 61 72 61 6d 65 74 65 72 5f 74 65   -1.parameter_te
55b0: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 34 2e 36  st e_expr-11.4.6
55c0: 20 22 53 45 4c 45 43 54 20 5c 24 5c 75 30 30 38   "SELECT \$\u008
55d0: 30 22 20 22 31 20 5c 24 5c 75 30 30 38 30 22 20  0" "1 \$\u0080" 
55e0: 2d 31 0a 0a 70 61 72 61 6d 65 74 65 72 5f 74 65  -1..parameter_te
55f0: 73 74 20 65 5f 65 78 70 72 2d 31 31 2e 35 2e 31  st e_expr-11.5.1
5600: 20 7b 53 45 4c 45 43 54 20 24 3a 3a 3a 3a 61 28   {SELECT $::::a(
5610: 2b 2b 2d 2d 2b 2b 29 7d 20 7b 31 20 24 3a 3a 3a  ++--++)} {1 $:::
5620: 3a 61 28 2b 2b 2d 2d 2b 2b 29 7d 20 2d 31 0a 70  :a(++--++)} -1.p
5630: 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65 5f  arameter_test e_
5640: 65 78 70 72 2d 31 31 2e 35 2e 32 20 7b 53 45 4c  expr-11.5.2 {SEL
5650: 45 43 54 20 24 3a 3a 61 28 29 7d 20 7b 31 20 24  ECT $::a()} {1 $
5660: 3a 3a 61 28 29 7d 20 2d 31 0a 70 61 72 61 6d 65  ::a()} -1.parame
5670: 74 65 72 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  ter_test e_expr-
5680: 31 31 2e 35 2e 33 20 7b 53 45 4c 45 43 54 20 24  11.5.3 {SELECT $
5690: 3a 3a 31 28 3a 3a 23 24 29 7d 20 7b 31 20 24 3a  ::1(::#$)} {1 $:
56a0: 3a 31 28 3a 3a 23 24 29 7d 20 2d 31 0a 20 0a 23  :1(::#$)} -1. .#
56b0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
56c0: 31 31 33 37 30 2d 30 34 35 32 30 20 4e 61 6d 65  11370-04520 Name
56d0: 64 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  d parameters are
56e0: 20 61 6c 73 6f 20 6e 75 6d 62 65 72 65 64 2e 20   also numbered. 
56f0: 54 68 65 0a 23 20 6e 75 6d 62 65 72 20 61 73 73  The.# number ass
5700: 69 67 6e 65 64 20 69 73 20 6f 6e 65 20 67 72 65  igned is one gre
5710: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  ater than the la
5720: 72 67 65 73 74 20 70 61 72 61 6d 65 74 65 72 20  rgest parameter 
5730: 6e 75 6d 62 65 72 0a 23 20 61 6c 72 65 61 64 79  number.# already
5740: 20 61 73 73 69 67 6e 65 64 2e 0a 23 0a 23 20 45   assigned..#.# E
5750: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32  VIDENCE-OF: R-42
5760: 36 32 30 2d 32 32 31 38 34 20 49 66 20 74 68 69  620-22184 If thi
5770: 73 20 6d 65 61 6e 73 20 74 68 65 20 70 61 72 61  s means the para
5780: 6d 65 74 65 72 20 77 6f 75 6c 64 20 62 65 0a 23  meter would be.#
5790: 20 61 73 73 69 67 6e 65 64 20 61 20 6e 75 6d 62   assigned a numb
57a0: 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
57b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
57c0: 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 69 74 20 69  BLE_NUMBER, it i
57d0: 73 20 61 6e 0a 23 20 65 72 72 6f 72 2e 0a 23 0a  s an.# error..#.
57e0: 70 61 72 61 6d 65 74 65 72 5f 74 65 73 74 20 65  parameter_test e
57f0: 5f 65 78 70 72 2d 31 31 2e 36 2e 31 20 22 53 45  _expr-11.6.1 "SE
5800: 4c 45 43 54 20 3f 2c 20 40 61 62 63 22 20 20 20  LECT ?, @abc"   
5810: 20 7b 31 20 7b 7d 20 32 20 40 61 62 63 7d 20 7b   {1 {} 2 @abc} {
5820: 2d 31 20 2d 32 7d 0a 70 61 72 61 6d 65 74 65 72  -1 -2}.parameter
5830: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5840: 36 2e 32 20 22 53 45 4c 45 43 54 20 3f 31 32 33  6.2 "SELECT ?123
5850: 2c 20 3a 61 31 22 20 20 7b 31 32 33 20 3f 31 32  , :a1"  {123 ?12
5860: 33 20 31 32 34 20 3a 61 31 7d 20 7b 2d 31 32 33  3 124 :a1} {-123
5870: 20 2d 31 32 34 7d 0a 70 61 72 61 6d 65 74 65 72   -124}.parameter
5880: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31 2e  _test e_expr-11.
5890: 36 2e 33 20 7b 53 45 4c 45 43 54 20 24 61 2c 20  6.3 {SELECT $a, 
58a0: 3f 38 2c 20 3f 2c 20 24 62 2c 20 3f 32 2c 20 24  ?8, ?, $b, ?2, $
58b0: 63 7d 20 7b 0a 20 20 31 20 24 61 20 38 20 3f 38  c} {.  1 $a 8 ?8
58c0: 20 39 20 7b 7d 20 31 30 20 24 62 20 32 20 3f 32   9 {} 10 $b 2 ?2
58d0: 20 31 31 20 24 63 0a 7d 20 7b 2d 31 20 2d 38 20   11 $c.} {-1 -8 
58e0: 2d 39 20 2d 31 30 20 2d 32 20 2d 31 31 7d 0a 66  -9 -10 -2 -11}.f
58f0: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20  oreach {tn sql} 
5900: 5b 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  [list           
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 5c 0a 20 20 31 20 20 22 53 45 4c 45 43 54 20 3f  \.  1  "SELECT ?
5930: 24 6d 76 6e 2c 20 5c 24 3a 3a 61 22 20 20 20 20  $mvn, \$::a"    
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5950: 20 20 20 5c 0a 20 20 32 20 20 22 53 45 4c 45 43     \.  2  "SELEC
5960: 54 20 3f 24 6d 76 6e 2c 20 3f 34 2c 20 40 61 31  T ?$mvn, ?4, @a1
5970: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
5980: 20 20 20 20 20 20 5c 0a 20 20 33 20 20 22 53 45        \.  3  "SE
5990: 4c 45 43 54 20 3f 5b 65 78 70 72 20 24 6d 76 6e  LECT ?[expr $mvn
59a0: 2d 32 5d 2c 20 3a 62 61 67 2c 20 40 31 32 33 2c  -2], :bag, @123,
59b0: 20 5c 24 78 22 20 20 20 20 5c 0a 5d 20 7b 0a 20   \$x"    \.] {. 
59c0: 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73   do_catchsql_tes
59d0: 74 20 65 5f 65 78 70 72 2d 31 31 2e 37 2e 24 74  t e_expr-11.7.$t
59e0: 6e 20 24 73 71 6c 20 5b 6c 69 73 74 20 31 20 7b  n $sql [list 1 {
59f0: 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20 76 61 72  too many SQL var
5a00: 69 61 62 6c 65 73 7d 5d 0a 7d 0a 0a 23 20 45 56  iables}].}..# EV
5a10: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 30  IDENCE-OF: R-140
5a20: 36 38 2d 34 39 36 37 31 20 50 61 72 61 6d 65 74  68-49671 Paramet
5a30: 65 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ers that are not
5a40: 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65 73   assigned values
5a50: 0a 23 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  .# using sqlite3
5a60: 5f 62 69 6e 64 28 29 20 61 72 65 20 74 72 65 61  _bind() are trea
5a70: 74 65 64 20 61 73 20 4e 55 4c 4c 2e 0a 23 0a 64  ted as NULL..#.d
5a80: 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  o_test e_expr-11
5a90: 2e 37 2e 31 20 7b 0a 20 20 73 65 74 20 73 74 6d  .7.1 {.  set stm
5aa0: 74 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  t [sqlite3_prepa
5ab0: 72 65 5f 76 32 20 64 62 20 7b 20 53 45 4c 45 43  re_v2 db { SELEC
5ac0: 54 20 3f 2c 20 3a 61 2c 20 40 62 2c 20 24 64 20  T ?, :a, @b, $d 
5ad0: 7d 20 2d 31 5d 0a 20 20 73 71 6c 69 74 65 33 5f  } -1].  sqlite3_
5ae0: 73 74 65 70 20 24 73 74 6d 74 0a 0a 20 20 6c 69  step $stmt..  li
5af0: 73 74 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75  st [sqlite3_colu
5b00: 6d 6e 5f 74 79 70 65 20 24 73 74 6d 74 20 30 5d  mn_type $stmt 0]
5b10: 20 5c 0a 20 20 20 20 20 20 20 5b 73 71 6c 69 74   \.       [sqlit
5b20: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24  e3_column_type $
5b30: 73 74 6d 74 20 31 5d 20 5c 0a 20 20 20 20 20 20  stmt 1] \.      
5b40: 20 5b 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   [sqlite3_column
5b50: 5f 74 79 70 65 20 24 73 74 6d 74 20 32 5d 20 5c  _type $stmt 2] \
5b60: 0a 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  .       [sqlite3
5b70: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 24 73 74  _column_type $st
5b80: 6d 74 20 33 5d 20 0a 7d 20 7b 4e 55 4c 4c 20 4e  mt 3] .} {NULL N
5b90: 55 4c 4c 20 4e 55 4c 4c 20 4e 55 4c 4c 7d 0a 64  ULL NULL NULL}.d
5ba0: 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 31  o_test e_expr-11
5bb0: 2e 37 2e 31 20 7b 20 73 71 6c 69 74 65 33 5f 66  .7.1 { sqlite3_f
5bc0: 69 6e 61 6c 69 7a 65 20 24 73 74 6d 74 20 7d 20  inalize $stmt } 
5bd0: 53 51 4c 49 54 45 5f 4f 4b 0a 0a 23 2d 2d 2d 2d  SQLITE_OK..#----
5be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c20: 2d 2d 2d 2d 2d 0a 23 20 22 54 65 73 74 22 20 74  -----.# "Test" t
5c30: 68 65 20 73 79 6e 74 61 78 20 64 69 61 67 72 61  he syntax diagra
5c40: 6d 73 20 69 6e 20 6c 61 6e 67 5f 65 78 70 72 2e  ms in lang_expr.
5c50: 68 74 6d 6c 2e 0a 23 0a 23 20 45 56 49 44 45 4e  html..#.# EVIDEN
5c60: 43 45 2d 4f 46 3a 20 52 2d 30 34 31 37 37 2d 32  CE-OF: R-04177-2
5c70: 30 36 38 38 20 2d 2d 20 73 79 6e 74 61 78 20 64  0688 -- syntax d
5c80: 69 61 67 72 61 6d 20 73 69 67 6e 65 64 2d 6e 75  iagram signed-nu
5c90: 6d 62 65 72 0a 23 0a 64 6f 5f 65 78 65 63 73 71  mber.#.do_execsq
5ca0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  l_test e_expr-12
5cb0: 2e 31 2e 31 20 7b 20 53 45 4c 45 43 54 20 30 2c  .1.1 { SELECT 0,
5cc0: 20 2b 30 2c 20 2d 30 20 7d 20 7b 30 20 30 20 30   +0, -0 } {0 0 0
5cd0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
5ce0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 31 2e 32 20  t e_expr-12.1.2 
5cf0: 7b 20 53 45 4c 45 43 54 20 31 2c 20 2b 31 2c 20  { SELECT 1, +1, 
5d00: 2d 31 20 7d 20 7b 31 20 31 20 2d 31 7d 0a 64 6f  -1 } {1 1 -1}.do
5d10: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
5d20: 65 78 70 72 2d 31 32 2e 31 2e 33 20 7b 20 53 45  expr-12.1.3 { SE
5d30: 4c 45 43 54 20 32 2c 20 2b 32 2c 20 2d 32 20 7d  LECT 2, +2, -2 }
5d40: 20 7b 32 20 32 20 2d 32 7d 0a 64 6f 5f 65 78 65   {2 2 -2}.do_exe
5d50: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
5d60: 2d 31 32 2e 31 2e 34 20 7b 20 0a 20 20 53 45 4c  -12.1.4 { .  SEL
5d70: 45 43 54 20 31 2e 34 2c 20 2b 31 2e 34 2c 20 2d  ECT 1.4, +1.4, -
5d80: 31 2e 34 20 0a 7d 20 7b 31 2e 34 20 31 2e 34 20  1.4 .} {1.4 1.4 
5d90: 2d 31 2e 34 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  -1.4}.do_execsql
5da0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e  _test e_expr-12.
5db0: 31 2e 35 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  1.5 { .  SELECT 
5dc0: 31 2e 35 65 2b 35 2c 20 2b 31 2e 35 65 2b 35 2c  1.5e+5, +1.5e+5,
5dd0: 20 2d 31 2e 35 65 2b 35 20 0a 7d 20 7b 31 35 30   -1.5e+5 .} {150
5de0: 30 30 30 2e 30 20 31 35 30 30 30 30 2e 30 20 2d  000.0 150000.0 -
5df0: 31 35 30 30 30 30 2e 30 7d 0a 64 6f 5f 65 78 65  150000.0}.do_exe
5e00: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
5e10: 2d 31 32 2e 31 2e 36 20 7b 20 0a 20 20 53 45 4c  -12.1.6 { .  SEL
5e20: 45 43 54 20 30 2e 30 30 30 31 2c 20 2b 30 2e 30  ECT 0.0001, +0.0
5e30: 30 30 31 2c 20 2d 30 2e 30 30 30 31 20 0a 7d 20  001, -0.0001 .} 
5e40: 7b 30 2e 30 30 30 31 20 30 2e 30 30 30 31 20 2d  {0.0001 0.0001 -
5e50: 30 2e 30 30 30 31 7d 0a 0a 23 20 45 56 49 44 45  0.0001}..# EVIDE
5e60: 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 37 34 30 2d  NCE-OF: R-30740-
5e70: 32 36 37 32 33 20 2d 2d 20 73 79 6e 74 61 78 20  26723 -- syntax 
5e80: 64 69 61 67 72 61 6d 20 6c 69 74 65 72 61 6c 2d  diagram literal-
5e90: 76 61 6c 75 65 0a 23 0a 73 65 74 20 73 71 6c 69  value.#.set sqli
5ea0: 74 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  te_current_time 
5eb0: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
5ec0: 74 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 31 20  t e_expr-12.2.1 
5ed0: 7b 53 45 4c 45 43 54 20 31 32 33 7d 20 20 20 20  {SELECT 123}    
5ee0: 20 20 20 20 20 20 20 20 20 20 20 7b 31 32 33 7d             {123}
5ef0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
5f00: 20 65 5f 65 78 70 72 2d 31 32 2e 32 2e 32 20 7b   e_expr-12.2.2 {
5f10: 53 45 4c 45 43 54 20 31 32 33 2e 34 65 30 35 7d  SELECT 123.4e05}
5f20: 20 20 20 20 20 20 20 20 20 20 7b 31 32 33 34 30            {12340
5f30: 30 30 30 2e 30 7d 0a 64 6f 5f 65 78 65 63 73 71  000.0}.do_execsq
5f40: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  l_test e_expr-12
5f50: 2e 32 2e 33 20 7b 53 45 4c 45 43 54 20 27 61 62  .2.3 {SELECT 'ab
5f60: 63 64 65 27 7d 20 20 20 20 20 20 20 20 20 20 20  cde'}           
5f70: 7b 61 62 63 64 65 7d 0a 64 6f 5f 65 78 65 63 73  {abcde}.do_execs
5f80: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
5f90: 32 2e 32 2e 34 20 7b 53 45 4c 45 43 54 20 58 27  2.2.4 {SELECT X'
5fa0: 34 31 34 32 34 33 27 7d 20 20 20 20 20 20 20 20  414243'}        
5fb0: 20 7b 41 42 43 7d 0a 64 6f 5f 65 78 65 63 73 71   {ABC}.do_execsq
5fc0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32  l_test e_expr-12
5fd0: 2e 32 2e 35 20 7b 53 45 4c 45 43 54 20 4e 55 4c  .2.5 {SELECT NUL
5fe0: 4c 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L}              
5ff0: 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {{}}.do_execsql_
6000: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 32  test e_expr-12.2
6010: 2e 36 20 7b 53 45 4c 45 43 54 20 43 55 52 52 45  .6 {SELECT CURRE
6020: 4e 54 5f 54 49 4d 45 7d 20 20 20 20 20 20 7b 30  NT_TIME}      {0
6030: 30 3a 30 30 3a 30 31 7d 0a 64 6f 5f 65 78 65 63  0:00:01}.do_exec
6040: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
6050: 31 32 2e 32 2e 37 20 7b 53 45 4c 45 43 54 20 43  12.2.7 {SELECT C
6060: 55 52 52 45 4e 54 5f 44 41 54 45 7d 20 20 20 20  URRENT_DATE}    
6070: 20 20 7b 31 39 37 30 2d 30 31 2d 30 31 7d 0a 64    {1970-01-01}.d
6080: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
6090: 5f 65 78 70 72 2d 31 32 2e 32 2e 38 20 7b 53 45  _expr-12.2.8 {SE
60a0: 4c 45 43 54 20 43 55 52 52 45 4e 54 5f 54 49 4d  LECT CURRENT_TIM
60b0: 45 53 54 41 4d 50 7d 20 7b 7b 31 39 37 30 2d 30  ESTAMP} {{1970-0
60c0: 31 2d 30 31 20 30 30 3a 30 30 3a 30 31 7d 7d 0a  1-01 00:00:01}}.
60d0: 73 65 74 20 73 71 6c 69 74 65 5f 63 75 72 72 65  set sqlite_curre
60e0: 6e 74 5f 74 69 6d 65 20 30 0a 0a 23 20 45 56 49  nt_time 0..# EVI
60f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 35 39  DENCE-OF: R-5759
6100: 38 2d 35 39 33 33 32 20 2d 2d 20 73 79 6e 74 61  8-59332 -- synta
6110: 78 20 64 69 61 67 72 61 6d 20 65 78 70 72 0a 23  x diagram expr.#
6120: 0a 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f  .file delete -fo
6130: 72 63 65 20 74 65 73 74 2e 64 62 32 0a 65 78 65  rce test.db2.exe
6140: 63 73 71 6c 20 7b 0a 20 20 41 54 54 41 43 48 20  csql {.  ATTACH 
6150: 27 74 65 73 74 2e 64 62 32 27 20 41 53 20 64 62  'test.db2' AS db
6160: 6e 61 6d 65 3b 0a 20 20 43 52 45 41 54 45 20 54  name;.  CREATE T
6170: 41 42 4c 45 20 64 62 6e 61 6d 65 2e 74 62 6c 6e  ABLE dbname.tbln
6180: 61 6d 65 28 63 6e 61 6d 65 29 3b 0a 7d 0a 0a 70  ame(cname);.}..p
6190: 72 6f 63 20 67 6c 6f 62 20 7b 61 72 67 73 7d 20  roc glob {args} 
61a0: 7b 72 65 74 75 72 6e 20 31 7d 0a 64 62 20 66 75  {return 1}.db fu
61b0: 6e 63 74 69 6f 6e 20 67 6c 6f 62 20 67 6c 6f 62  nction glob glob
61c0: 0a 64 62 20 66 75 6e 63 74 69 6f 6e 20 6d 61 74  .db function mat
61d0: 63 68 20 67 6c 6f 62 0a 64 62 20 66 75 6e 63 74  ch glob.db funct
61e0: 69 6f 6e 20 72 65 67 65 78 70 20 67 6c 6f 62 0a  ion regexp glob.
61f0: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 65 78 70  .foreach {tn exp
6200: 72 7d 20 7b 0a 20 20 31 20 31 32 33 0a 20 20 32  r} {.  1 123.  2
6210: 20 31 32 33 2e 34 65 30 35 0a 20 20 33 20 27 61   123.4e05.  3 'a
6220: 62 63 64 65 27 0a 20 20 34 20 58 27 34 31 34 32  bcde'.  4 X'4142
6230: 34 33 27 0a 20 20 35 20 4e 55 4c 4c 0a 20 20 36  43'.  5 NULL.  6
6240: 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 0a 20 20   CURRENT_TIME.  
6250: 37 20 43 55 52 52 45 4e 54 5f 44 41 54 45 0a 20  7 CURRENT_DATE. 
6260: 20 38 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 53   8 CURRENT_TIMES
6270: 54 41 4d 50 0a 0a 20 20 39 20 3f 0a 20 31 30 20  TAMP..  9 ?. 10 
6280: 3f 31 32 33 0a 20 31 31 20 40 68 65 6c 6c 6f 0a  ?123. 11 @hello.
6290: 20 31 32 20 3a 77 6f 72 6c 64 0a 20 31 33 20 24   12 :world. 13 $
62a0: 74 63 6c 0a 20 31 34 20 24 74 63 6c 28 61 72 72  tcl. 14 $tcl(arr
62b0: 61 79 29 0a 20 20 0a 20 20 31 35 20 63 6e 61 6d  ay).  .  15 cnam
62c0: 65 0a 20 20 31 36 20 74 62 6c 6e 61 6d 65 2e 63  e.  16 tblname.c
62d0: 6e 61 6d 65 0a 20 20 31 37 20 64 62 6e 61 6d 65  name.  17 dbname
62e0: 2e 74 62 6c 6e 61 6d 65 2e 63 6e 61 6d 65 0a 0a  .tblname.cname..
62f0: 20 20 31 38 20 22 2b 20 45 58 50 52 22 0a 20 20    18 "+ EXPR".  
6300: 31 39 20 22 2d 20 45 58 50 52 22 0a 20 20 32 30  19 "- EXPR".  20
6310: 20 22 4e 4f 54 20 45 58 50 52 22 0a 20 20 32 31   "NOT EXPR".  21
6320: 20 22 7e 20 45 58 50 52 22 0a 0a 20 20 32 32 20   "~ EXPR"..  22 
6330: 22 45 58 50 52 31 20 7c 7c 20 45 58 50 52 32 22  "EXPR1 || EXPR2"
6340: 0a 20 20 32 33 20 22 45 58 50 52 31 20 2a 20 45  .  23 "EXPR1 * E
6350: 58 50 52 32 22 0a 20 20 32 34 20 22 45 58 50 52  XPR2".  24 "EXPR
6360: 31 20 2f 20 45 58 50 52 32 22 0a 20 20 32 35 20  1 / EXPR2".  25 
6370: 22 45 58 50 52 31 20 25 20 45 58 50 52 32 22 0a  "EXPR1 % EXPR2".
6380: 20 20 32 36 20 22 45 58 50 52 31 20 2b 20 45 58    26 "EXPR1 + EX
6390: 50 52 32 22 0a 20 20 32 37 20 22 45 58 50 52 31  PR2".  27 "EXPR1
63a0: 20 2d 20 45 58 50 52 32 22 0a 20 20 32 38 20 22   - EXPR2".  28 "
63b0: 45 58 50 52 31 20 3c 3c 20 45 58 50 52 32 22 0a  EXPR1 << EXPR2".
63c0: 20 20 32 39 20 22 45 58 50 52 31 20 3e 3e 20 45    29 "EXPR1 >> E
63d0: 58 50 52 32 22 0a 20 20 33 30 20 22 45 58 50 52  XPR2".  30 "EXPR
63e0: 31 20 26 20 45 58 50 52 32 22 0a 20 20 33 31 20  1 & EXPR2".  31 
63f0: 22 45 58 50 52 31 20 7c 20 45 58 50 52 32 22 0a  "EXPR1 | EXPR2".
6400: 20 20 33 32 20 22 45 58 50 52 31 20 3c 20 45 58    32 "EXPR1 < EX
6410: 50 52 32 22 0a 20 20 33 33 20 22 45 58 50 52 31  PR2".  33 "EXPR1
6420: 20 3c 3d 20 45 58 50 52 32 22 0a 20 20 33 34 20   <= EXPR2".  34 
6430: 22 45 58 50 52 31 20 3e 20 45 58 50 52 32 22 0a  "EXPR1 > EXPR2".
6440: 20 20 33 35 20 22 45 58 50 52 31 20 3e 3d 20 45    35 "EXPR1 >= E
6450: 58 50 52 32 22 0a 20 20 33 36 20 22 45 58 50 52  XPR2".  36 "EXPR
6460: 31 20 3d 20 45 58 50 52 32 22 0a 20 20 33 37 20  1 = EXPR2".  37 
6470: 22 45 58 50 52 31 20 3d 3d 20 45 58 50 52 32 22  "EXPR1 == EXPR2"
6480: 0a 20 20 33 38 20 22 45 58 50 52 31 20 21 3d 20  .  38 "EXPR1 != 
6490: 45 58 50 52 32 22 0a 20 20 33 39 20 22 45 58 50  EXPR2".  39 "EXP
64a0: 52 31 20 3c 3e 20 45 58 50 52 32 22 0a 20 20 34  R1 <> EXPR2".  4
64b0: 30 20 22 45 58 50 52 31 20 49 53 20 45 58 50 52  0 "EXPR1 IS EXPR
64c0: 32 22 0a 20 20 34 31 20 22 45 58 50 52 31 20 49  2".  41 "EXPR1 I
64d0: 53 20 4e 4f 54 20 45 58 50 52 32 22 0a 20 20 34  S NOT EXPR2".  4
64e0: 32 20 22 45 58 50 52 31 20 41 4e 44 20 45 58 50  2 "EXPR1 AND EXP
64f0: 52 32 22 0a 20 20 34 33 20 22 45 58 50 52 31 20  R2".  43 "EXPR1 
6500: 4f 52 20 45 58 50 52 32 22 0a 20 0a 20 20 34 34  OR EXPR2". .  44
6510: 20 22 63 6f 75 6e 74 28 2a 29 22 0a 20 20 34 35   "count(*)".  45
6520: 20 22 63 6f 75 6e 74 28 44 49 53 54 49 4e 43 54   "count(DISTINCT
6530: 20 45 58 50 52 29 22 0a 20 20 34 36 20 22 73 75   EXPR)".  46 "su
6540: 62 73 74 72 28 45 58 50 52 2c 20 31 30 2c 20 32  bstr(EXPR, 10, 2
6550: 30 29 22 0a 20 20 34 37 20 22 63 68 61 6e 67 65  0)".  47 "change
6560: 73 28 29 22 0a 20 0a 20 20 34 38 20 22 28 20 45  s()". .  48 "( E
6570: 58 50 52 20 29 22 0a 20 0a 20 20 34 39 20 22 43  XPR )". .  49 "C
6580: 41 53 54 20 28 20 45 58 50 52 20 41 53 20 69 6e  AST ( EXPR AS in
6590: 74 65 67 65 72 20 29 22 0a 20 20 35 30 20 22 43  teger )".  50 "C
65a0: 41 53 54 20 28 20 45 58 50 52 20 41 53 20 27 61  AST ( EXPR AS 'a
65b0: 62 63 64 27 20 29 22 0a 20 20 35 31 20 22 43 41  bcd' )".  51 "CA
65c0: 53 54 20 28 20 45 58 50 52 20 41 53 20 27 61 62  ST ( EXPR AS 'ab
65d0: 24 20 24 63 64 27 20 29 22 0a 20 0a 20 20 35 32  $ $cd' )". .  52
65e0: 20 22 45 58 50 52 20 43 4f 4c 4c 41 54 45 20 6e   "EXPR COLLATE n
65f0: 6f 63 61 73 65 22 0a 20 20 35 33 20 22 45 58 50  ocase".  53 "EXP
6600: 52 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79  R COLLATE binary
6610: 22 0a 20 0a 20 20 35 34 20 22 45 58 50 52 31 20  ". .  54 "EXPR1 
6620: 4c 49 4b 45 20 45 58 50 52 32 22 0a 20 20 35 35  LIKE EXPR2".  55
6630: 20 22 45 58 50 52 31 20 4c 49 4b 45 20 45 58 50   "EXPR1 LIKE EXP
6640: 52 32 20 45 53 43 41 50 45 20 45 58 50 52 22 0a  R2 ESCAPE EXPR".
6650: 20 20 35 36 20 22 45 58 50 52 31 20 47 4c 4f 42    56 "EXPR1 GLOB
6660: 20 45 58 50 52 32 22 0a 20 20 35 37 20 22 45 58   EXPR2".  57 "EX
6670: 50 52 31 20 47 4c 4f 42 20 45 58 50 52 32 20 45  PR1 GLOB EXPR2 E
6680: 53 43 41 50 45 20 45 58 50 52 22 0a 20 20 35 38  SCAPE EXPR".  58
6690: 20 22 45 58 50 52 31 20 52 45 47 45 58 50 20 45   "EXPR1 REGEXP E
66a0: 58 50 52 32 22 0a 20 20 35 39 20 22 45 58 50 52  XPR2".  59 "EXPR
66b0: 31 20 52 45 47 45 58 50 20 45 58 50 52 32 20 45  1 REGEXP EXPR2 E
66c0: 53 43 41 50 45 20 45 58 50 52 22 0a 20 20 36 30  SCAPE EXPR".  60
66d0: 20 22 45 58 50 52 31 20 4d 41 54 43 48 20 45 58   "EXPR1 MATCH EX
66e0: 50 52 32 22 0a 20 20 36 31 20 22 45 58 50 52 31  PR2".  61 "EXPR1
66f0: 20 4d 41 54 43 48 20 45 58 50 52 32 20 45 53 43   MATCH EXPR2 ESC
6700: 41 50 45 20 45 58 50 52 22 0a 20 20 36 32 20 22  APE EXPR".  62 "
6710: 45 58 50 52 31 20 4e 4f 54 20 4c 49 4b 45 20 45  EXPR1 NOT LIKE E
6720: 58 50 52 32 22 0a 20 20 36 33 20 22 45 58 50 52  XPR2".  63 "EXPR
6730: 31 20 4e 4f 54 20 4c 49 4b 45 20 45 58 50 52 32  1 NOT LIKE EXPR2
6740: 20 45 53 43 41 50 45 20 45 58 50 52 22 0a 20 20   ESCAPE EXPR".  
6750: 36 34 20 22 45 58 50 52 31 20 4e 4f 54 20 47 4c  64 "EXPR1 NOT GL
6760: 4f 42 20 45 58 50 52 32 22 0a 20 20 36 35 20 22  OB EXPR2".  65 "
6770: 45 58 50 52 31 20 4e 4f 54 20 47 4c 4f 42 20 45  EXPR1 NOT GLOB E
6780: 58 50 52 32 20 45 53 43 41 50 45 20 45 58 50 52  XPR2 ESCAPE EXPR
6790: 22 0a 20 20 36 36 20 22 45 58 50 52 31 20 4e 4f  ".  66 "EXPR1 NO
67a0: 54 20 52 45 47 45 58 50 20 45 58 50 52 32 22 0a  T REGEXP EXPR2".
67b0: 20 20 36 37 20 22 45 58 50 52 31 20 4e 4f 54 20    67 "EXPR1 NOT 
67c0: 52 45 47 45 58 50 20 45 58 50 52 32 20 45 53 43  REGEXP EXPR2 ESC
67d0: 41 50 45 20 45 58 50 52 22 0a 20 20 36 38 20 22  APE EXPR".  68 "
67e0: 45 58 50 52 31 20 4e 4f 54 20 4d 41 54 43 48 20  EXPR1 NOT MATCH 
67f0: 45 58 50 52 32 22 0a 20 20 36 39 20 22 45 58 50  EXPR2".  69 "EXP
6800: 52 31 20 4e 4f 54 20 4d 41 54 43 48 20 45 58 50  R1 NOT MATCH EXP
6810: 52 32 20 45 53 43 41 50 45 20 45 58 50 52 22 0a  R2 ESCAPE EXPR".
6820: 20 0a 20 20 37 30 20 22 45 58 50 52 20 49 53 4e   .  70 "EXPR ISN
6830: 55 4c 4c 22 0a 20 20 37 31 20 22 45 58 50 52 20  ULL".  71 "EXPR 
6840: 4e 4f 54 4e 55 4c 4c 22 0a 20 20 37 32 20 22 45  NOTNULL".  72 "E
6850: 58 50 52 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 0a  XPR NOT NULL". .
6860: 20 20 37 33 20 22 45 58 50 52 31 20 49 53 20 45    73 "EXPR1 IS E
6870: 58 50 52 32 22 0a 20 20 37 34 20 22 45 58 50 52  XPR2".  74 "EXPR
6880: 31 20 49 53 20 4e 4f 54 20 45 58 50 52 32 22 0a  1 IS NOT EXPR2".
6890: 0a 20 20 37 35 20 22 45 58 50 52 20 4e 4f 54 20  .  75 "EXPR NOT 
68a0: 42 45 54 57 45 45 4e 20 45 58 50 52 31 20 41 4e  BETWEEN EXPR1 AN
68b0: 44 20 45 58 50 52 32 22 0a 20 20 37 36 20 22 45  D EXPR2".  76 "E
68c0: 58 50 52 20 42 45 54 57 45 45 4e 20 45 58 50 52  XPR BETWEEN EXPR
68d0: 31 20 41 4e 44 20 45 58 50 52 32 22 0a 0a 20 20  1 AND EXPR2"..  
68e0: 37 37 20 22 45 58 50 52 20 4e 4f 54 20 49 4e 20  77 "EXPR NOT IN 
68f0: 28 53 45 4c 45 43 54 20 63 6e 61 6d 65 20 46 52  (SELECT cname FR
6900: 4f 4d 20 74 62 6c 6e 61 6d 65 29 22 0a 20 20 37  OM tblname)".  7
6910: 38 20 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 28  8 "EXPR NOT IN (
6920: 31 29 22 0a 20 20 37 39 20 22 45 58 50 52 20 4e  1)".  79 "EXPR N
6930: 4f 54 20 49 4e 20 28 31 2c 20 32 2c 20 33 29 22  OT IN (1, 2, 3)"
6940: 0a 20 20 38 30 20 22 45 58 50 52 20 4e 4f 54 20  .  80 "EXPR NOT 
6950: 49 4e 20 74 62 6c 6e 61 6d 65 22 0a 20 20 38 31  IN tblname".  81
6960: 20 22 45 58 50 52 20 4e 4f 54 20 49 4e 20 64 62   "EXPR NOT IN db
6970: 6e 61 6d 65 2e 74 62 6c 6e 61 6d 65 22 0a 20 20  name.tblname".  
6980: 38 32 20 22 45 58 50 52 20 49 4e 20 28 53 45 4c  82 "EXPR IN (SEL
6990: 45 43 54 20 63 6e 61 6d 65 20 46 52 4f 4d 20 74  ECT cname FROM t
69a0: 62 6c 6e 61 6d 65 29 22 0a 20 20 38 33 20 22 45  blname)".  83 "E
69b0: 58 50 52 20 49 4e 20 28 31 29 22 0a 20 20 38 34  XPR IN (1)".  84
69c0: 20 22 45 58 50 52 20 49 4e 20 28 31 2c 20 32 2c   "EXPR IN (1, 2,
69d0: 20 33 29 22 0a 20 20 38 35 20 22 45 58 50 52 20   3)".  85 "EXPR 
69e0: 49 4e 20 74 62 6c 6e 61 6d 65 22 0a 20 20 38 36  IN tblname".  86
69f0: 20 22 45 58 50 52 20 49 4e 20 64 62 6e 61 6d 65   "EXPR IN dbname
6a00: 2e 74 62 6c 6e 61 6d 65 22 0a 0a 20 20 38 37 20  .tblname"..  87 
6a10: 22 45 58 49 53 54 53 20 28 53 45 4c 45 43 54 20  "EXISTS (SELECT 
6a20: 63 6e 61 6d 65 20 46 52 4f 4d 20 74 62 6c 6e 61  cname FROM tblna
6a30: 6d 65 29 22 0a 20 20 38 38 20 22 4e 4f 54 20 45  me)".  88 "NOT E
6a40: 58 49 53 54 53 20 28 53 45 4c 45 43 54 20 63 6e  XISTS (SELECT cn
6a50: 61 6d 65 20 46 52 4f 4d 20 74 62 6c 6e 61 6d 65  ame FROM tblname
6a60: 29 22 0a 0a 20 20 38 39 20 22 43 41 53 45 20 45  )"..  89 "CASE E
6a70: 58 50 52 20 57 48 45 4e 20 45 58 50 52 31 20 54  XPR WHEN EXPR1 T
6a80: 48 45 4e 20 45 58 50 52 32 20 45 4c 53 45 20 45  HEN EXPR2 ELSE E
6a90: 58 50 52 20 45 4e 44 22 0a 20 20 39 30 20 22 43  XPR END".  90 "C
6aa0: 41 53 45 20 45 58 50 52 20 57 48 45 4e 20 45 58  ASE EXPR WHEN EX
6ab0: 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20 45  PR1 THEN EXPR2 E
6ac0: 4e 44 22 0a 20 20 39 31 20 22 43 41 53 45 20 45  ND".  91 "CASE E
6ad0: 58 50 52 20 57 48 45 4e 20 45 58 50 52 31 20 54  XPR WHEN EXPR1 T
6ae0: 48 45 4e 20 45 58 50 52 32 20 57 48 45 4e 20 45  HEN EXPR2 WHEN E
6af0: 58 50 52 20 54 48 45 4e 20 45 58 50 52 31 20 45  XPR THEN EXPR1 E
6b00: 4c 53 45 20 45 58 50 52 32 20 45 4e 44 22 0a 20  LSE EXPR2 END". 
6b10: 20 39 32 20 22 43 41 53 45 20 45 58 50 52 20 57   92 "CASE EXPR W
6b20: 48 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20 45  HEN EXPR1 THEN E
6b30: 58 50 52 32 20 57 48 45 4e 20 45 58 50 52 20 54  XPR2 WHEN EXPR T
6b40: 48 45 4e 20 45 58 50 52 31 20 45 4e 44 22 0a 20  HEN EXPR1 END". 
6b50: 20 39 33 20 22 43 41 53 45 20 57 48 45 4e 20 45   93 "CASE WHEN E
6b60: 58 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20  XPR1 THEN EXPR2 
6b70: 45 4c 53 45 20 45 58 50 52 20 45 4e 44 22 0a 20  ELSE EXPR END". 
6b80: 20 39 34 20 22 43 41 53 45 20 57 48 45 4e 20 45   94 "CASE WHEN E
6b90: 58 50 52 31 20 54 48 45 4e 20 45 58 50 52 32 20  XPR1 THEN EXPR2 
6ba0: 45 4e 44 22 0a 20 20 39 35 20 22 43 41 53 45 20  END".  95 "CASE 
6bb0: 57 48 45 4e 20 45 58 50 52 31 20 54 48 45 4e 20  WHEN EXPR1 THEN 
6bc0: 45 58 50 52 32 20 57 48 45 4e 20 45 58 50 52 20  EXPR2 WHEN EXPR 
6bd0: 54 48 45 4e 20 45 58 50 52 31 20 45 4c 53 45 20  THEN EXPR1 ELSE 
6be0: 45 58 50 52 32 20 45 4e 44 22 0a 20 20 39 36 20  EXPR2 END".  96 
6bf0: 22 43 41 53 45 20 57 48 45 4e 20 45 58 50 52 31  "CASE WHEN EXPR1
6c00: 20 54 48 45 4e 20 45 58 50 52 32 20 57 48 45 4e   THEN EXPR2 WHEN
6c10: 20 45 58 50 52 20 54 48 45 4e 20 45 58 50 52 31   EXPR THEN EXPR1
6c20: 20 45 4e 44 22 0a 7d 20 7b 0a 0a 20 20 23 20 49   END".} {..  # I
6c30: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
6c40: 20 73 74 72 69 6e 67 20 62 65 69 6e 67 20 70 61   string being pa
6c50: 72 73 65 64 20 63 6f 6e 74 61 69 6e 73 20 22 45  rsed contains "E
6c60: 58 50 52 32 22 2c 20 74 68 65 6e 20 72 65 70 6c  XPR2", then repl
6c70: 61 63 65 0a 20 20 23 20 73 74 72 69 6e 67 20 22  ace.  # string "
6c80: 45 58 50 52 31 22 20 61 6e 64 20 22 45 58 50 52  EXPR1" and "EXPR
6c90: 32 22 20 77 69 74 68 20 61 72 62 69 74 72 61 72  2" with arbitrar
6ca0: 79 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  y SQL expression
6cb0: 73 2e 20 49 66 20 69 74 20 0a 20 20 23 20 63 6f  s. If it .  # co
6cc0: 6e 74 61 69 6e 73 20 22 45 58 50 52 22 2c 20 74  ntains "EXPR", t
6cd0: 68 65 6e 20 72 65 70 6c 61 63 65 20 45 58 50 52  hen replace EXPR
6ce0: 20 77 69 74 68 20 61 6e 20 61 72 62 69 74 72 61   with an arbitra
6cf0: 72 79 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f  ry SQL expressio
6d00: 6e 2e 0a 20 20 23 20 0a 20 20 73 65 74 20 65 6c  n..  # .  set el
6d10: 69 73 74 20 5b 6c 69 73 74 20 24 65 78 70 72 5d  ist [list $expr]
6d20: 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  .  if {[string m
6d30: 61 74 63 68 20 2a 45 58 50 52 32 2a 20 24 65 78  atch *EXPR2* $ex
6d40: 70 72 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 65  pr]} {.    set e
6d50: 6c 69 73 74 20 5b 6c 69 73 74 5d 0a 20 20 20 20  list [list].    
6d60: 66 6f 72 65 61 63 68 20 7b 65 31 20 65 32 7d 20  foreach {e1 e2} 
6d70: 7b 20 63 6e 61 6d 65 20 22 33 34 2b 32 32 22 20  { cname "34+22" 
6d80: 7d 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e  } {.      lappen
6d90: 64 20 65 6c 69 73 74 20 5b 73 74 72 69 6e 67 20  d elist [string 
6da0: 6d 61 70 20 5b 6c 69 73 74 20 45 58 50 52 31 20  map [list EXPR1 
6db0: 24 65 31 20 45 58 50 52 32 20 24 65 32 5d 20 24  $e1 EXPR2 $e2] $
6dc0: 65 78 70 72 5d 0a 20 20 20 20 7d 0a 20 20 7d 20  expr].    }.  } 
6dd0: 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d  .  if {[string m
6de0: 61 74 63 68 20 2a 45 58 50 52 2a 20 24 65 78 70  atch *EXPR* $exp
6df0: 72 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 65 6c  r]} {.    set el
6e00: 69 73 74 32 20 5b 6c 69 73 74 5d 0a 20 20 20 20  ist2 [list].    
6e10: 66 6f 72 65 61 63 68 20 65 6c 20 24 65 6c 69 73  foreach el $elis
6e20: 74 20 7b 0a 20 20 20 20 20 20 66 6f 72 65 61 63  t {.      foreac
6e30: 68 20 65 20 7b 20 63 6e 61 6d 65 20 22 33 34 2b  h e { cname "34+
6e40: 32 32 22 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  22" } {.        
6e50: 6c 61 70 70 65 6e 64 20 65 6c 69 73 74 32 20 5b  lappend elist2 [
6e60: 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
6e70: 20 45 58 50 52 20 24 65 5d 20 24 65 6c 5d 0a 20   EXPR $e] $el]. 
6e80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6e90: 20 73 65 74 20 65 6c 69 73 74 20 24 65 6c 69 73   set elist $elis
6ea0: 74 32 0a 20 20 7d 0a 0a 20 20 73 65 74 20 78 20  t2.  }..  set x 
6eb0: 30 0a 20 20 66 6f 72 65 61 63 68 20 65 20 24 65  0.  foreach e $e
6ec0: 6c 69 73 74 20 7b 0a 20 20 20 20 69 6e 63 72 20  list {.    incr 
6ed0: 78 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 65 5f  x.    do_test e_
6ee0: 65 78 70 72 2d 31 32 2e 33 2e 24 74 6e 2e 24 78  expr-12.3.$tn.$x
6ef0: 20 7b 20 0a 20 20 20 20 20 20 73 65 74 20 72 63   { .      set rc
6f00: 20 5b 63 61 74 63 68 20 7b 20 65 78 65 63 73 71   [catch { execsq
6f10: 6c 20 22 53 45 4c 45 43 54 20 24 65 20 46 52 4f  l "SELECT $e FRO
6f20: 4d 20 74 62 6c 6e 61 6d 65 22 20 7d 20 6d 73 67  M tblname" } msg
6f30: 5d 0a 20 20 20 20 7d 20 7b 30 7d 0a 20 20 7d 0a  ].    } {0}.  }.
6f40: 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46  }..# EVIDENCE-OF
6f50: 3a 20 52 2d 34 39 34 36 32 2d 35 36 30 37 39 20  : R-49462-56079 
6f60: 2d 2d 20 73 79 6e 74 61 78 20 64 69 61 67 72 61  -- syntax diagra
6f70: 6d 20 72 61 69 73 65 2d 66 75 6e 63 74 69 6f 6e  m raise-function
6f80: 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 72  .#.foreach {tn r
6f90: 61 69 73 65 65 78 70 72 7d 20 7b 0a 20 20 31 20  aiseexpr} {.  1 
6fa0: 22 52 41 49 53 45 28 49 47 4e 4f 52 45 29 22 0a  "RAISE(IGNORE)".
6fb0: 20 20 32 20 22 52 41 49 53 45 28 52 4f 4c 4c 42    2 "RAISE(ROLLB
6fc0: 41 43 4b 2c 20 27 65 72 72 6f 72 20 6d 65 73 73  ACK, 'error mess
6fd0: 61 67 65 27 29 22 0a 20 20 33 20 22 52 41 49 53  age')".  3 "RAIS
6fe0: 45 28 41 42 4f 52 54 2c 20 27 65 72 72 6f 72 20  E(ABORT, 'error 
6ff0: 6d 65 73 73 61 67 65 27 29 22 0a 20 20 34 20 22  message')".  4 "
7000: 52 41 49 53 45 28 46 41 49 4c 2c 20 27 65 72 72  RAISE(FAIL, 'err
7010: 6f 72 20 6d 65 73 73 61 67 65 27 29 22 0a 7d 20  or message')".} 
7020: 7b 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {.  do_execsql_t
7030: 65 73 74 20 65 5f 65 78 70 72 2d 31 32 2e 34 2e  est e_expr-12.4.
7040: 24 74 6e 20 22 0a 20 20 20 20 43 52 45 41 54 45  $tn ".    CREATE
7050: 20 54 52 49 47 47 45 52 20 64 62 6e 61 6d 65 2e   TRIGGER dbname.
7060: 74 72 24 74 6e 20 42 45 46 4f 52 45 20 44 45 4c  tr$tn BEFORE DEL
7070: 45 54 45 20 4f 4e 20 74 62 6c 6e 61 6d 65 20 42  ETE ON tblname B
7080: 45 47 49 4e 0a 20 20 20 20 20 20 53 45 4c 45 43  EGIN.      SELEC
7090: 54 20 24 72 61 69 73 65 65 78 70 72 20 3b 0a 20  T $raiseexpr ;. 
70a0: 20 20 20 45 4e 44 3b 0a 20 20 22 20 7b 7d 0a 7d     END;.  " {}.}
70b0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
70c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
7100: 65 73 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  est the statemen
7110: 74 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68  ts related to th
7120: 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74  e BETWEEN operat
7130: 6f 72 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  or..#.# EVIDENCE
7140: 2d 4f 46 3a 20 52 2d 34 30 30 37 39 2d 35 34 35  -OF: R-40079-545
7150: 30 33 20 54 68 65 20 42 45 54 57 45 45 4e 20 6f  03 The BETWEEN o
7160: 70 65 72 61 74 6f 72 20 69 73 20 6c 6f 67 69 63  perator is logic
7170: 61 6c 6c 79 0a 23 20 65 71 75 69 76 61 6c 65 6e  ally.# equivalen
7180: 74 20 74 6f 20 61 20 70 61 69 72 20 6f 66 20 63  t to a pair of c
7190: 6f 6d 70 61 72 69 73 6f 6e 73 2e 20 22 78 20 42  omparisons. "x B
71a0: 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20  ETWEEN y AND z" 
71b0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 23 20  is equivalent.# 
71c0: 74 6f 20 22 78 3e 3d 79 20 41 4e 44 20 78 3c 3d  to "x>=y AND x<=
71d0: 7a 22 20 65 78 63 65 70 74 20 74 68 61 74 20 77  z" except that w
71e0: 69 74 68 20 42 45 54 57 45 45 4e 2c 20 74 68 65  ith BETWEEN, the
71f0: 20 78 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73   x expression is
7200: 0a 23 20 6f 6e 6c 79 20 65 76 61 6c 75 61 74 65  .# only evaluate
7210: 64 20 6f 6e 63 65 2e 0a 23 0a 64 62 20 66 75 6e  d once..#.db fun
7220: 63 20 78 20 78 0a 70 72 6f 63 20 78 20 7b 7d 20  c x x.proc x {} 
7230: 7b 20 69 6e 63 72 20 3a 3a 78 63 6f 75 6e 74 20  { incr ::xcount 
7240: 3b 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 24  ; return [expr $
7250: 3a 3a 78 5d 20 7d 0a 66 6f 72 65 61 63 68 20 7b  ::x] }.foreach {
7260: 74 6e 20 78 20 65 78 70 72 20 72 65 73 20 6e 45  tn x expr res nE
7270: 76 61 6c 7d 20 7b 0a 20 20 31 20 20 31 30 20 20  val} {.  1  10  
7280: 22 78 28 29 20 3e 3d 20 35 20 41 4e 44 20 78 28  "x() >= 5 AND x(
7290: 29 20 3c 3d 20 31 35 22 20 20 31 20 20 32 0a 20  ) <= 15"  1  2. 
72a0: 20 32 20 20 31 30 20 20 22 78 28 29 20 42 45 54   2  10  "x() BET
72b0: 57 45 45 4e 20 35 20 41 4e 44 20 31 35 22 20 20  WEEN 5 AND 15"  
72c0: 20 20 31 20 20 31 0a 0a 20 20 33 20 20 20 35 20    1  1..  3   5 
72d0: 20 22 78 28 29 20 3e 3d 20 35 20 41 4e 44 20 78   "x() >= 5 AND x
72e0: 28 29 20 3c 3d 20 35 22 20 20 20 31 20 20 32 0a  () <= 5"   1  2.
72f0: 20 20 34 20 20 20 35 20 20 22 78 28 29 20 42 45    4   5  "x() BE
7300: 54 57 45 45 4e 20 35 20 41 4e 44 20 35 22 20 20  TWEEN 5 AND 5"  
7310: 20 20 20 31 20 20 31 0a 7d 20 7b 0a 20 20 64 6f     1  1.} {.  do
7320: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7330: 31 2e 24 74 6e 20 7b 0a 20 20 20 20 73 65 74 20  1.$tn {.    set 
7340: 3a 3a 78 63 6f 75 6e 74 20 30 0a 20 20 20 20 73  ::xcount 0.    s
7350: 65 74 20 61 20 5b 65 78 65 63 73 71 6c 20 22 53  et a [execsql "S
7360: 45 4c 45 43 54 20 24 65 78 70 72 22 5d 0a 20 20  ELECT $expr"].  
7370: 20 20 6c 69 73 74 20 24 3a 3a 78 63 6f 75 6e 74    list $::xcount
7380: 20 24 61 0a 20 20 7d 20 5b 6c 69 73 74 20 24 6e   $a.  } [list $n
7390: 45 76 61 6c 20 24 72 65 73 5d 0a 7d 0a 0a 23 20  Eval $res].}..# 
73a0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
73b0: 35 31 35 35 2d 33 34 34 35 34 20 54 68 65 20 70  5155-34454 The p
73c0: 72 65 63 65 64 65 6e 63 65 20 6f 66 20 74 68 65  recedence of the
73d0: 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
73e0: 72 20 69 73 0a 23 20 74 68 65 20 73 61 6d 65 20  r is.# the same 
73f0: 61 73 20 74 68 65 20 70 72 65 63 65 64 65 6e 63  as the precedenc
7400: 65 20 61 73 20 6f 70 65 72 61 74 6f 72 73 20 3d  e as operators =
7410: 3d 20 61 6e 64 20 21 3d 20 61 6e 64 20 4c 49 4b  = and != and LIK
7420: 45 20 61 6e 64 20 67 72 6f 75 70 73 0a 23 20 6c  E and groups.# l
7430: 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 23 20  eft to right..# 
7440: 0a 23 20 54 68 65 72 65 66 6f 72 65 2c 20 42 45  .# Therefore, BE
7450: 54 57 45 45 4e 20 67 72 6f 75 70 73 20 6d 6f 72  TWEEN groups mor
7460: 65 20 74 69 67 68 74 6c 79 20 74 68 61 6e 20 6f  e tightly than o
7470: 70 65 72 61 74 6f 72 20 22 41 4e 44 22 2c 20 62  perator "AND", b
7480: 75 74 20 6c 65 73 73 0a 23 20 73 6f 20 74 68 61  ut less.# so tha
7490: 6e 20 22 3c 22 2e 0a 23 0a 64 6f 5f 65 78 65 63  n "<"..#.do_exec
74a0: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
74b0: 31 33 2e 32 2e 31 20 20 7b 20 53 45 4c 45 43 54  13.2.1  { SELECT
74c0: 20 31 20 3d 3d 20 31 30 20 42 45 54 57 45 45 4e   1 == 10 BETWEEN
74d0: 20 30 20 41 4e 44 20 32 20 20 20 7d 20 20 31 0a   0 AND 2   }  1.
74e0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
74f0: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 20 20 7b  e_expr-13.2.2  {
7500: 20 53 45 4c 45 43 54 20 28 31 20 3d 3d 20 31 30   SELECT (1 == 10
7510: 29 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20  ) BETWEEN 0 AND 
7520: 32 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71  2 }  1.do_execsq
7530: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
7540: 2e 32 2e 33 20 20 7b 20 53 45 4c 45 43 54 20 31  .2.3  { SELECT 1
7550: 20 3d 3d 20 28 31 30 20 42 45 54 57 45 45 4e 20   == (10 BETWEEN 
7560: 30 20 41 4e 44 20 32 29 20 7d 20 20 30 0a 64 6f  0 AND 2) }  0.do
7570: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7580: 65 78 70 72 2d 31 33 2e 32 2e 34 20 20 7b 20 53  expr-13.2.4  { S
7590: 45 4c 45 43 54 20 20 36 20 42 45 54 57 45 45 4e  ELECT  6 BETWEEN
75a0: 20 34 20 41 4e 44 20 38 20 3d 3d 20 31 20 7d 20   4 AND 8 == 1 } 
75b0: 20 20 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f     1.do_execsql_
75c0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32  test e_expr-13.2
75d0: 2e 35 20 20 7b 20 53 45 4c 45 43 54 20 28 36 20  .5  { SELECT (6 
75e0: 42 45 54 57 45 45 4e 20 34 20 41 4e 44 20 38 29  BETWEEN 4 AND 8)
75f0: 20 3d 3d 20 31 20 7d 20 20 20 31 0a 64 6f 5f 65   == 1 }   1.do_e
7600: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7610: 70 72 2d 31 33 2e 32 2e 36 20 20 7b 20 53 45 4c  pr-13.2.6  { SEL
7620: 45 43 54 20 20 36 20 42 45 54 57 45 45 4e 20 34  ECT  6 BETWEEN 4
7630: 20 41 4e 44 20 28 38 20 3d 3d 20 31 29 20 7d 20   AND (8 == 1) } 
7640: 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   0..do_execsql_t
7650: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
7660: 37 20 20 7b 20 53 45 4c 45 43 54 20 20 35 20 42  7  { SELECT  5 B
7670: 45 54 57 45 45 4e 20 30 20 41 4e 44 20 30 20 20  ETWEEN 0 AND 0  
7680: 21 3d 20 31 20 7d 20 20 20 31 0a 64 6f 5f 65 78  != 1 }   1.do_ex
7690: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
76a0: 72 2d 31 33 2e 32 2e 38 20 20 7b 20 53 45 4c 45  r-13.2.8  { SELE
76b0: 43 54 20 28 35 20 42 45 54 57 45 45 4e 20 30 20  CT (5 BETWEEN 0 
76c0: 41 4e 44 20 30 29 20 21 3d 20 31 20 7d 20 20 20  AND 0) != 1 }   
76d0: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
76e0: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 39 20  t e_expr-13.2.9 
76f0: 20 7b 20 53 45 4c 45 43 54 20 20 35 20 42 45 54   { SELECT  5 BET
7700: 57 45 45 4e 20 30 20 41 4e 44 20 28 30 20 21 3d  WEEN 0 AND (0 !=
7710: 20 31 29 20 7d 20 20 30 0a 64 6f 5f 65 78 65 63   1) }  0.do_exec
7720: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
7730: 31 33 2e 32 2e 31 30 20 7b 20 53 45 4c 45 43 54  13.2.10 { SELECT
7740: 20 20 31 20 21 3d 20 30 20 20 42 45 54 57 45 45    1 != 0  BETWEE
7750: 4e 20 30 20 41 4e 44 20 32 20 20 7d 20 20 31 0a  N 0 AND 2  }  1.
7760: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
7770: 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 31 20 7b  e_expr-13.2.11 {
7780: 20 53 45 4c 45 43 54 20 28 31 20 21 3d 20 30 29   SELECT (1 != 0)
7790: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
77a0: 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73 71    }  1.do_execsq
77b0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33  l_test e_expr-13
77c0: 2e 32 2e 31 32 20 7b 20 53 45 4c 45 43 54 20 20  .2.12 { SELECT  
77d0: 31 20 21 3d 20 28 30 20 42 45 54 57 45 45 4e 20  1 != (0 BETWEEN 
77e0: 30 20 41 4e 44 20 32 29 20 7d 20 20 30 0a 0a 64  0 AND 2) }  0..d
77f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7800: 5f 65 78 70 72 2d 31 33 2e 32 2e 31 33 20 7b 20  _expr-13.2.13 { 
7810: 53 45 4c 45 43 54 20 31 20 4c 49 4b 45 20 31 30  SELECT 1 LIKE 10
7820: 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20 32   BETWEEN 0 AND 2
7830: 20 20 20 7d 20 20 31 0a 64 6f 5f 65 78 65 63 73     }  1.do_execs
7840: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7850: 33 2e 32 2e 31 34 20 7b 20 53 45 4c 45 43 54 20  3.2.14 { SELECT 
7860: 28 31 20 4c 49 4b 45 20 31 30 29 20 42 45 54 57  (1 LIKE 10) BETW
7870: 45 45 4e 20 30 20 41 4e 44 20 32 20 7d 20 20 31  EEN 0 AND 2 }  1
7880: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7890: 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31 35 20   e_expr-13.2.15 
78a0: 7b 20 53 45 4c 45 43 54 20 31 20 4c 49 4b 45 20  { SELECT 1 LIKE 
78b0: 28 31 30 20 42 45 54 57 45 45 4e 20 30 20 41 4e  (10 BETWEEN 0 AN
78c0: 44 20 32 29 20 7d 20 20 30 0a 64 6f 5f 65 78 65  D 2) }  0.do_exe
78d0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
78e0: 2d 31 33 2e 32 2e 31 36 20 7b 20 53 45 4c 45 43  -13.2.16 { SELEC
78f0: 54 20 20 36 20 42 45 54 57 45 45 4e 20 34 20 41  T  6 BETWEEN 4 A
7900: 4e 44 20 38 20 4c 49 4b 45 20 31 20 20 20 7d 20  ND 8 LIKE 1   } 
7910: 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   1.do_execsql_te
7920: 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 31  st e_expr-13.2.1
7930: 37 20 7b 20 53 45 4c 45 43 54 20 28 36 20 42 45  7 { SELECT (6 BE
7940: 54 57 45 45 4e 20 34 20 41 4e 44 20 38 29 20 4c  TWEEN 4 AND 8) L
7950: 49 4b 45 20 31 20 20 7d 20 20 31 0a 64 6f 5f 65  IKE 1  }  1.do_e
7960: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7970: 70 72 2d 31 33 2e 32 2e 31 38 20 7b 20 53 45 4c  pr-13.2.18 { SEL
7980: 45 43 54 20 20 36 20 42 45 54 57 45 45 4e 20 34  ECT  6 BETWEEN 4
7990: 20 41 4e 44 20 28 38 20 4c 49 4b 45 20 31 29 20   AND (8 LIKE 1) 
79a0: 7d 20 20 30 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  }  0..do_execsql
79b0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
79c0: 32 2e 31 39 20 7b 20 53 45 4c 45 43 54 20 30 20  2.19 { SELECT 0 
79d0: 41 4e 44 20 30 20 42 45 54 57 45 45 4e 20 30 20  AND 0 BETWEEN 0 
79e0: 41 4e 44 20 31 20 20 20 7d 20 30 0a 64 6f 5f 65  AND 1   } 0.do_e
79f0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
7a00: 70 72 2d 31 33 2e 32 2e 32 30 20 7b 20 53 45 4c  pr-13.2.20 { SEL
7a10: 45 43 54 20 30 20 41 4e 44 20 28 30 20 42 45 54  ECT 0 AND (0 BET
7a20: 57 45 45 4e 20 30 20 41 4e 44 20 31 29 20 7d 20  WEEN 0 AND 1) } 
7a30: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
7a40: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 31  t e_expr-13.2.21
7a50: 20 7b 20 53 45 4c 45 43 54 20 28 30 20 41 4e 44   { SELECT (0 AND
7a60: 20 30 29 20 42 45 54 57 45 45 4e 20 30 20 41 4e   0) BETWEEN 0 AN
7a70: 44 20 31 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73  D 1 } 1.do_execs
7a80: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7a90: 33 2e 32 2e 32 32 20 7b 20 53 45 4c 45 43 54 20  3.2.22 { SELECT 
7aa0: 30 20 42 45 54 57 45 45 4e 20 2d 31 20 41 4e 44  0 BETWEEN -1 AND
7ab0: 20 31 20 41 4e 44 20 30 20 20 20 7d 20 30 0a 64   1 AND 0   } 0.d
7ac0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7ad0: 5f 65 78 70 72 2d 31 33 2e 32 2e 32 33 20 7b 20  _expr-13.2.23 { 
7ae0: 53 45 4c 45 43 54 20 28 30 20 42 45 54 57 45 45  SELECT (0 BETWEE
7af0: 4e 20 2d 31 20 41 4e 44 20 31 29 20 41 4e 44 20  N -1 AND 1) AND 
7b00: 30 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  0 } 0.do_execsql
7b10: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7b20: 32 2e 32 34 20 7b 20 53 45 4c 45 43 54 20 30 20  2.24 { SELECT 0 
7b30: 42 45 54 57 45 45 4e 20 2d 31 20 41 4e 44 20 28  BETWEEN -1 AND (
7b40: 31 20 41 4e 44 20 30 29 20 7d 20 31 0a 0a 64 6f  1 AND 0) } 1..do
7b50: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7b60: 65 78 70 72 2d 31 33 2e 32 2e 32 35 20 7b 20 53  expr-13.2.25 { S
7b70: 45 4c 45 43 54 20 32 20 3c 20 33 20 42 45 54 57  ELECT 2 < 3 BETW
7b80: 45 45 4e 20 30 20 41 4e 44 20 31 20 20 20 7d 20  EEN 0 AND 1   } 
7b90: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
7ba0: 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e 32 36  t e_expr-13.2.26
7bb0: 20 7b 20 53 45 4c 45 43 54 20 28 32 20 3c 20 33   { SELECT (2 < 3
7bc0: 29 20 42 45 54 57 45 45 4e 20 30 20 41 4e 44 20  ) BETWEEN 0 AND 
7bd0: 31 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c  1 } 1.do_execsql
7be0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e  _test e_expr-13.
7bf0: 32 2e 32 37 20 7b 20 53 45 4c 45 43 54 20 32 20  2.27 { SELECT 2 
7c00: 3c 20 28 33 20 42 45 54 57 45 45 4e 20 30 20 41  < (3 BETWEEN 0 A
7c10: 4e 44 20 31 29 20 7d 20 30 0a 64 6f 5f 65 78 65  ND 1) } 0.do_exe
7c20: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7c30: 2d 31 33 2e 32 2e 32 38 20 7b 20 53 45 4c 45 43  -13.2.28 { SELEC
7c40: 54 20 32 20 42 45 54 57 45 45 4e 20 31 20 41 4e  T 2 BETWEEN 1 AN
7c50: 44 20 32 20 3c 20 33 20 20 20 20 7d 20 30 0a 64  D 2 < 3    } 0.d
7c60: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
7c70: 5f 65 78 70 72 2d 31 33 2e 32 2e 32 39 20 7b 20  _expr-13.2.29 { 
7c80: 53 45 4c 45 43 54 20 32 20 42 45 54 57 45 45 4e  SELECT 2 BETWEEN
7c90: 20 31 20 41 4e 44 20 28 32 20 3c 20 33 29 20 20   1 AND (2 < 3)  
7ca0: 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 0.do_execsql_t
7cb0: 65 73 74 20 65 5f 65 78 70 72 2d 31 33 2e 32 2e  est e_expr-13.2.
7cc0: 33 30 20 7b 20 53 45 4c 45 43 54 20 28 32 20 42  30 { SELECT (2 B
7cd0: 45 54 57 45 45 4e 20 31 20 41 4e 44 20 32 29 20  ETWEEN 1 AND 2) 
7ce0: 3c 20 33 20 20 7d 20 31 0a 0a 23 2d 2d 2d 2d 2d  < 3  } 1..#-----
7cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 65 20  ----.# Test the 
7d40: 73 74 61 74 65 6d 65 6e 74 73 20 72 65 6c 61 74  statements relat
7d50: 65 64 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 61  ed to the LIKE a
7d60: 6e 64 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  nd GLOB operator
7d70: 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  s..#.# EVIDENCE-
7d80: 4f 46 3a 20 52 2d 31 36 35 38 34 2d 36 30 31 38  OF: R-16584-6018
7d90: 39 20 54 68 65 20 4c 49 4b 45 20 6f 70 65 72 61  9 The LIKE opera
7da0: 74 6f 72 20 64 6f 65 73 20 61 20 70 61 74 74 65  tor does a patte
7db0: 72 6e 20 6d 61 74 63 68 69 6e 67 0a 23 20 63 6f  rn matching.# co
7dc0: 6d 70 61 72 69 73 6f 6e 2e 0a 23 0a 23 20 45 56  mparison..#.# EV
7dd0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 32  IDENCE-OF: R-112
7de0: 39 35 2d 30 34 36 35 37 20 54 68 65 20 6f 70 65  95-04657 The ope
7df0: 72 61 6e 64 20 74 6f 20 74 68 65 20 72 69 67 68  rand to the righ
7e00: 74 20 6f 66 20 74 68 65 20 4c 49 4b 45 0a 23 20  t of the LIKE.# 
7e10: 6f 70 65 72 61 74 6f 72 20 63 6f 6e 74 61 69 6e  operator contain
7e20: 73 20 74 68 65 20 70 61 74 74 65 72 6e 20 61 6e  s the pattern an
7e30: 64 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  d the left hand 
7e40: 6f 70 65 72 61 6e 64 20 63 6f 6e 74 61 69 6e 73  operand contains
7e50: 20 74 68 65 0a 23 20 73 74 72 69 6e 67 20 74 6f   the.# string to
7e60: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
7e70: 68 65 20 70 61 74 74 65 72 6e 2e 0a 23 0a 64 6f  he pattern..#.do
7e80: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
7e90: 65 78 70 72 2d 31 34 2e 31 2e 31 20 7b 20 53 45  expr-14.1.1 { SE
7ea0: 4c 45 43 54 20 27 61 62 63 25 27 20 4c 49 4b 45  LECT 'abc%' LIKE
7eb0: 20 27 61 62 63 64 65 27 20 7d 20 30 0a 64 6f 5f   'abcde' } 0.do_
7ec0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
7ed0: 78 70 72 2d 31 34 2e 31 2e 32 20 7b 20 53 45 4c  xpr-14.1.2 { SEL
7ee0: 45 43 54 20 27 61 62 63 64 65 27 20 4c 49 4b 45  ECT 'abcde' LIKE
7ef0: 20 27 61 62 63 25 27 20 7d 20 31 0a 0a 23 20 45   'abc%' } 1..# E
7f00: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35  VIDENCE-OF: R-55
7f10: 34 30 36 2d 33 38 35 32 34 20 41 20 70 65 72 63  406-38524 A perc
7f20: 65 6e 74 20 73 79 6d 62 6f 6c 20 28 22 25 22 29  ent symbol ("%")
7f30: 20 69 6e 20 74 68 65 20 4c 49 4b 45 20 70 61 74   in the LIKE pat
7f40: 74 65 72 6e 0a 23 20 6d 61 74 63 68 65 73 20 61  tern.# matches a
7f50: 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a  ny sequence of z
7f60: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72  ero or more char
7f70: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 74  acters in the st
7f80: 72 69 6e 67 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ring..#.do_execs
7f90: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
7fa0: 34 2e 32 2e 31 20 7b 20 53 45 4c 45 43 54 20 27  4.2.1 { SELECT '
7fb0: 61 62 64 65 27 20 20 20 20 4c 49 4b 45 20 27 61  abde'    LIKE 'a
7fc0: 62 25 64 65 27 20 7d 20 31 0a 64 6f 5f 65 78 65  b%de' } 1.do_exe
7fd0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
7fe0: 2d 31 34 2e 32 2e 32 20 7b 20 53 45 4c 45 43 54  -14.2.2 { SELECT
7ff0: 20 27 61 62 58 64 65 27 20 20 20 4c 49 4b 45 20   'abXde'   LIKE 
8000: 27 61 62 25 64 65 27 20 7d 20 31 0a 64 6f 5f 65  'ab%de' } 1.do_e
8010: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
8020: 70 72 2d 31 34 2e 32 2e 33 20 7b 20 53 45 4c 45  pr-14.2.3 { SELE
8030: 43 54 20 27 61 62 41 42 43 64 65 27 20 4c 49 4b  CT 'abABCde' LIK
8040: 45 20 27 61 62 25 64 65 27 20 7d 20 31 0a 0a 23  E 'ab%de' } 1..#
8050: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
8060: 33 30 34 33 33 2d 32 35 34 34 33 20 41 6e 20 75  30433-25443 An u
8070: 6e 64 65 72 73 63 6f 72 65 20 28 22 5f 22 29 20  nderscore ("_") 
8080: 69 6e 20 74 68 65 20 4c 49 4b 45 20 70 61 74 74  in the LIKE patt
8090: 65 72 6e 0a 23 20 6d 61 74 63 68 65 73 20 61 6e  ern.# matches an
80a0: 79 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74  y single charact
80b0: 65 72 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67  er in the string
80c0: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
80d0: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 33 2e  est e_expr-14.3.
80e0: 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62 64 65  1 { SELECT 'abde
80f0: 27 20 20 20 20 4c 49 4b 45 20 27 61 62 5f 64 65  '    LIKE 'ab_de
8100: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
8110: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e  _test e_expr-14.
8120: 33 2e 32 20 7b 20 53 45 4c 45 43 54 20 27 61 62  3.2 { SELECT 'ab
8130: 58 64 65 27 20 20 20 4c 49 4b 45 20 27 61 62 5f  Xde'   LIKE 'ab_
8140: 64 65 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73  de' } 1.do_execs
8150: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
8160: 34 2e 33 2e 33 20 7b 20 53 45 4c 45 43 54 20 27  4.3.3 { SELECT '
8170: 61 62 41 42 43 64 65 27 20 4c 49 4b 45 20 27 61  abABCde' LIKE 'a
8180: 62 5f 64 65 27 20 7d 20 30 0a 0a 23 20 45 56 49  b_de' } 0..# EVI
8190: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 30 30  DENCE-OF: R-5900
81a0: 37 2d 32 30 34 35 34 20 41 6e 79 20 6f 74 68 65  7-20454 Any othe
81b0: 72 20 63 68 61 72 61 63 74 65 72 20 6d 61 74 63  r character matc
81c0: 68 65 73 20 69 74 73 65 6c 66 20 6f 72 20 69 74  hes itself or it
81d0: 73 0a 23 20 6c 6f 77 65 72 2f 75 70 70 65 72 20  s.# lower/upper 
81e0: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 20  case equivalent 
81f0: 28 69 2e 65 2e 20 63 61 73 65 2d 69 6e 73 65 6e  (i.e. case-insen
8200: 73 69 74 69 76 65 20 6d 61 74 63 68 69 6e 67 29  sitive matching)
8210: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
8220: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 34 2e  est e_expr-14.4.
8230: 31 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 27  1 { SELECT 'abc'
8240: 20 4c 49 4b 45 20 27 61 42 63 27 20 7d 20 31 0a   LIKE 'aBc' } 1.
8250: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
8260: 65 5f 65 78 70 72 2d 31 34 2e 34 2e 32 20 7b 20  e_expr-14.4.2 { 
8270: 53 45 4c 45 43 54 20 27 61 42 63 27 20 4c 49 4b  SELECT 'aBc' LIK
8280: 45 20 27 61 42 63 27 20 7d 20 31 0a 64 6f 5f 65  E 'aBc' } 1.do_e
8290: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
82a0: 70 72 2d 31 34 2e 34 2e 33 20 7b 20 53 45 4c 45  pr-14.4.3 { SELE
82b0: 43 54 20 27 61 63 27 20 20 4c 49 4b 45 20 27 61  CT 'ac'  LIKE 'a
82c0: 42 63 27 20 7d 20 30 0a 0a 23 20 45 56 49 44 45  Bc' } 0..# EVIDE
82d0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 36 34 38 2d  NCE-OF: R-23648-
82e0: 35 38 35 32 37 20 53 51 4c 69 74 65 20 6f 6e 6c  58527 SQLite onl
82f0: 79 20 75 6e 64 65 72 73 74 61 6e 64 73 20 75 70  y understands up
8300: 70 65 72 2f 6c 6f 77 65 72 20 63 61 73 65 0a 23  per/lower case.#
8310: 20 66 6f 72 20 41 53 43 49 49 20 63 68 61 72 61   for ASCII chara
8320: 63 74 65 72 73 20 62 79 20 64 65 66 61 75 6c 74  cters by default
8330: 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  ..#.# EVIDENCE-O
8340: 46 3a 20 52 2d 30 34 35 33 32 2d 31 31 35 32 37  F: R-04532-11527
8350: 20 54 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74   The LIKE operat
8360: 6f 72 20 69 73 20 63 61 73 65 20 73 65 6e 73 69  or is case sensi
8370: 74 69 76 65 20 62 79 0a 23 20 64 65 66 61 75 6c  tive by.# defaul
8380: 74 20 66 6f 72 20 75 6e 69 63 6f 64 65 20 63 68  t for unicode ch
8390: 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61 72  aracters that ar
83a0: 65 20 62 65 79 6f 6e 64 20 74 68 65 20 41 53 43  e beyond the ASC
83b0: 49 49 20 72 61 6e 67 65 2e 0a 23 0a 23 20 45 56  II range..#.# EV
83c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 33  IDENCE-OF: R-443
83d0: 38 31 2d 31 31 36 36 39 20 74 68 65 20 65 78 70  81-11669 the exp
83e0: 72 65 73 73 69 6f 6e 0a 23 20 27 61 27 26 6e 62  ression.# 'a'&nb
83f0: 73 70 3b 4c 49 4b 45 26 6e 62 73 70 3b 27 41 27  sp;LIKE&nbsp;'A'
8400: 20 69 73 20 54 52 55 45 20 62 75 74 0a 23 20 27   is TRUE but.# '
8410: 26 61 65 6c 69 67 3b 27 26 6e 62 73 70 3b 4c 49  &aelig;'&nbsp;LI
8420: 4b 45 26 6e 62 73 70 3b 27 26 41 45 6c 69 67 3b  KE&nbsp;'&AElig;
8430: 27 20 69 73 20 46 41 4c 53 45 2e 0a 23 0a 64 6f  ' is FALSE..#.do
8440: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8450: 65 78 70 72 2d 31 34 2e 35 2e 31 20 7b 20 53 45  expr-14.5.1 { SE
8460: 4c 45 43 54 20 27 41 27 20 4c 49 4b 45 20 27 61  LECT 'A' LIKE 'a
8470: 27 20 20 20 20 20 20 20 20 20 7d 20 31 0a 64 6f  '         } 1.do
8480: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8490: 65 78 70 72 2d 31 34 2e 35 2e 32 20 22 53 45 4c  expr-14.5.2 "SEL
84a0: 45 43 54 20 27 5c 75 30 30 63 36 27 20 4c 49 4b  ECT '\u00c6' LIK
84b0: 45 20 27 5c 75 30 30 65 36 27 22 20 30 0a 0a 23  E '\u00e6'" 0..#
84c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
84d0: 35 36 36 38 33 2d 31 33 37 33 31 20 49 66 20 74  56683-13731 If t
84e0: 68 65 20 6f 70 74 69 6f 6e 61 6c 20 45 53 43 41  he optional ESCA
84f0: 50 45 20 63 6c 61 75 73 65 20 69 73 20 70 72 65  PE clause is pre
8500: 73 65 6e 74 2c 0a 23 20 74 68 65 6e 20 74 68 65  sent,.# then the
8510: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 6f 6c 6c   expression foll
8520: 6f 77 69 6e 67 20 74 68 65 20 45 53 43 41 50 45  owing the ESCAPE
8530: 20 6b 65 79 77 6f 72 64 20 6d 75 73 74 20 65 76   keyword must ev
8540: 61 6c 75 61 74 65 20 74 6f 20 61 0a 23 20 73 74  aluate to a.# st
8550: 72 69 6e 67 20 63 6f 6e 73 69 73 74 69 6e 67 20  ring consisting 
8560: 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 68 61 72  of a single char
8570: 61 63 74 65 72 2e 0a 23 0a 64 6f 5f 63 61 74 63  acter..#.do_catc
8580: 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  hsql_test e_expr
8590: 2d 31 34 2e 36 2e 31 20 7b 20 0a 20 20 53 45 4c  -14.6.1 { .  SEL
85a0: 45 43 54 20 27 41 27 20 4c 49 4b 45 20 27 61 27  ECT 'A' LIKE 'a'
85b0: 20 45 53 43 41 50 45 20 27 31 32 27 20 0a 7d 20   ESCAPE '12' .} 
85c0: 7b 31 20 7b 45 53 43 41 50 45 20 65 78 70 72 65  {1 {ESCAPE expre
85d0: 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 20  ssion must be a 
85e0: 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65 72  single character
85f0: 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }}.do_catchsql_t
8600: 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 36 2e  est e_expr-14.6.
8610: 32 20 7b 20 0a 20 20 53 45 4c 45 43 54 20 27 41  2 { .  SELECT 'A
8620: 27 20 4c 49 4b 45 20 27 61 27 20 45 53 43 41 50  ' LIKE 'a' ESCAP
8630: 45 20 27 27 20 0a 7d 20 7b 31 20 7b 45 53 43 41  E '' .} {1 {ESCA
8640: 50 45 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 75  PE expression mu
8650: 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
8660: 68 61 72 61 63 74 65 72 7d 7d 0a 64 6f 5f 63 61  haracter}}.do_ca
8670: 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  tchsql_test e_ex
8680: 70 72 2d 31 34 2e 36 2e 33 20 7b 20 53 45 4c 45  pr-14.6.3 { SELE
8690: 43 54 20 27 41 27 20 4c 49 4b 45 20 27 61 27 20  CT 'A' LIKE 'a' 
86a0: 45 53 43 41 50 45 20 27 78 27 20 7d 20 20 20 20  ESCAPE 'x' }    
86b0: 7b 30 20 31 7d 0a 64 6f 5f 63 61 74 63 68 73 71  {0 1}.do_catchsq
86c0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34  l_test e_expr-14
86d0: 2e 36 2e 34 20 22 53 45 4c 45 43 54 20 27 41 27  .6.4 "SELECT 'A'
86e0: 20 4c 49 4b 45 20 27 61 27 20 45 53 43 41 50 45   LIKE 'a' ESCAPE
86f0: 20 27 5c 75 30 30 65 36 27 22 20 7b 30 20 31 7d   '\u00e6'" {0 1}
8700: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
8710: 20 52 2d 30 32 30 34 35 2d 32 33 37 36 32 20 54   R-02045-23762 T
8720: 68 69 73 20 63 68 61 72 61 63 74 65 72 20 6d 61  his character ma
8730: 79 20 62 65 20 75 73 65 64 20 69 6e 20 74 68 65  y be used in the
8740: 20 4c 49 4b 45 0a 23 20 70 61 74 74 65 72 6e 20   LIKE.# pattern 
8750: 74 6f 20 69 6e 63 6c 75 64 65 20 6c 69 74 65 72  to include liter
8760: 61 6c 20 70 65 72 63 65 6e 74 20 6f 72 20 75 6e  al percent or un
8770: 64 65 72 73 63 6f 72 65 20 63 68 61 72 61 63 74  derscore charact
8780: 65 72 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ers..#.# EVIDENC
8790: 45 2d 4f 46 3a 20 52 2d 31 33 33 34 35 2d 33 31  E-OF: R-13345-31
87a0: 38 33 30 20 54 68 65 20 65 73 63 61 70 65 20 63  830 The escape c
87b0: 68 61 72 61 63 74 65 72 20 66 6f 6c 6c 6f 77 65  haracter followe
87c0: 64 20 62 79 20 61 20 70 65 72 63 65 6e 74 0a 23  d by a percent.#
87d0: 20 73 79 6d 62 6f 6c 20 28 25 29 2c 20 75 6e 64   symbol (%), und
87e0: 65 72 73 63 6f 72 65 20 28 5f 29 2c 20 6f 72 20  erscore (_), or 
87f0: 61 20 73 65 63 6f 6e 64 20 69 6e 73 74 61 6e 63  a second instanc
8800: 65 20 6f 66 20 74 68 65 20 65 73 63 61 70 65 0a  e of the escape.
8810: 23 20 63 68 61 72 61 63 74 65 72 20 69 74 73 65  # character itse
8820: 6c 66 20 6d 61 74 63 68 65 73 20 61 20 6c 69 74  lf matches a lit
8830: 65 72 61 6c 20 70 65 72 63 65 6e 74 20 73 79 6d  eral percent sym
8840: 62 6f 6c 2c 20 75 6e 64 65 72 73 63 6f 72 65 2c  bol, underscore,
8850: 20 6f 72 20 61 0a 23 20 73 69 6e 67 6c 65 20 65   or a.# single e
8860: 73 63 61 70 65 20 63 68 61 72 61 63 74 65 72 2c  scape character,
8870: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 23   respectively..#
8880: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8890: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31 20 20   e_expr-14.7.1  
88a0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 25 27 20  { SELECT 'abc%' 
88b0: 20 4c 49 4b 45 20 27 61 62 63 58 25 27 20 45 53   LIKE 'abcX%' ES
88c0: 43 41 50 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f  CAPE 'X' } 1.do_
88d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
88e0: 78 70 72 2d 31 34 2e 37 2e 32 20 20 7b 20 53 45  xpr-14.7.2  { SE
88f0: 4c 45 43 54 20 27 61 62 63 35 27 20 20 4c 49 4b  LECT 'abc5'  LIK
8900: 45 20 27 61 62 63 58 25 27 20 45 53 43 41 50 45  E 'abcX%' ESCAPE
8910: 20 27 58 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63   'X' } 0.do_exec
8920: 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d  sql_test e_expr-
8930: 31 34 2e 37 2e 33 20 20 7b 20 53 45 4c 45 43 54  14.7.3  { SELECT
8940: 20 27 61 62 63 27 20 20 20 4c 49 4b 45 20 27 61   'abc'   LIKE 'a
8950: 62 63 58 25 27 20 45 53 43 41 50 45 20 27 58 27  bcX%' ESCAPE 'X'
8960: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
8970: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37  test e_expr-14.7
8980: 2e 34 20 20 7b 20 53 45 4c 45 43 54 20 27 61 62  .4  { SELECT 'ab
8990: 63 58 25 27 20 4c 49 4b 45 20 27 61 62 63 58 25  cX%' LIKE 'abcX%
89a0: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 30  ' ESCAPE 'X' } 0
89b0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
89c0: 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 35 20 20   e_expr-14.7.5  
89d0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 25 25 27  { SELECT 'abc%%'
89e0: 20 4c 49 4b 45 20 27 61 62 63 58 25 27 20 45 53   LIKE 'abcX%' ES
89f0: 43 41 50 45 20 27 58 27 20 7d 20 30 0a 0a 64 6f  CAPE 'X' } 0..do
8a00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
8a10: 65 78 70 72 2d 31 34 2e 37 2e 36 20 20 7b 20 53  expr-14.7.6  { S
8a20: 45 4c 45 43 54 20 27 61 62 63 5f 27 20 20 4c 49  ELECT 'abc_'  LI
8a30: 4b 45 20 27 61 62 63 58 5f 27 20 45 53 43 41 50  KE 'abcX_' ESCAP
8a40: 45 20 27 58 27 20 7d 20 31 0a 64 6f 5f 65 78 65  E 'X' } 1.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 37 20 20 7b 20 53 45 4c 45 43  -14.7.7  { SELEC
8a70: 54 20 27 61 62 63 35 27 20 20 4c 49 4b 45 20 27  T 'abc5'  LIKE '
8a80: 61 62 63 58 5f 27 20 45 53 43 41 50 45 20 27 58  abcX_' ESCAPE 'X
8a90: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.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 38 20 20 7b 20 53 45 4c 45 43 54 20 27 61  7.8  { SELECT 'a
8ac0: 62 63 27 20 20 20 4c 49 4b 45 20 27 61 62 63 58  bc'   LIKE 'abcX
8ad0: 5f 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 39 20  t e_expr-14.7.9 
8b00: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 58 5f   { SELECT 'abcX_
8b10: 27 20 4c 49 4b 45 20 27 61 62 63 58 5f 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 31 30 20 7b 20 53  expr-14.7.10 { S
8b50: 45 4c 45 43 54 20 27 61 62 63 5f 5f 27 20 4c 49  ELECT 'abc__' LI
8b60: 4b 45 20 27 61 62 63 58 5f 27 20 45 53 43 41 50  KE 'abcX_' ESCAP
8b70: 45 20 27 58 27 20 7d 20 30 0a 0a 64 6f 5f 65 78  E 'X' } 0..do_ex
8b80: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
8b90: 72 2d 31 34 2e 37 2e 31 31 20 7b 20 53 45 4c 45  r-14.7.11 { SELE
8ba0: 43 54 20 27 61 62 63 58 27 20 20 4c 49 4b 45 20  CT 'abcX'  LIKE 
8bb0: 27 61 62 63 58 58 27 20 45 53 43 41 50 45 20 27  'abcXX' ESCAPE '
8bc0: 58 27 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71  X' } 1.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 31 32 20 7b 20 53 45 4c 45 43 54 20 27  .7.12 { SELECT '
8bf0: 61 62 63 35 27 20 20 4c 49 4b 45 20 27 61 62 63  abc5'  LIKE 'abc
8c00: 58 58 27 20 45 53 43 41 50 45 20 27 58 27 20 7d  XX' ESCAPE 'X' }
8c10: 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65   0.do_execsql_te
8c20: 73 74 20 65 5f 65 78 70 72 2d 31 34 2e 37 2e 31  st e_expr-14.7.1
8c30: 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 27  3 { SELECT 'abc'
8c40: 20 20 20 4c 49 4b 45 20 27 61 62 63 58 58 27 20     LIKE 'abcXX' 
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 31 34 20 7b 20  _expr-14.7.14 { 
8c80: 53 45 4c 45 43 54 20 27 61 62 63 58 58 27 20 4c  SELECT 'abcXX' L
8c90: 49 4b 45 20 27 61 62 63 58 58 27 20 45 53 43 41  IKE 'abcXX' ESCA
8ca0: 50 45 20 27 58 27 20 7d 20 30 0a 0a 23 20 45 56  PE 'X' } 0..# EV
8cb0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 33  IDENCE-OF: R-513
8cc0: 35 39 2d 31 37 34 39 36 20 54 68 65 20 69 6e 66  59-17496 The inf
8cd0: 69 78 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  ix LIKE operator
8ce0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
8cf0: 62 79 0a 23 20 63 61 6c 6c 69 6e 67 20 74 68 65  by.# calling the
8d00: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66   application-def
8d10: 69 6e 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f  ined SQL functio
8d20: 6e 73 20 6c 69 6b 65 28 59 2c 58 29 20 6f 72 20  ns like(Y,X) or 
8d30: 6c 69 6b 65 28 59 2c 58 2c 5a 29 2e 0a 23 0a 70  like(Y,X,Z)..#.p
8d40: 72 6f 63 20 6c 69 6b 65 66 75 6e 63 20 7b 61 72  roc likefunc {ar
8d50: 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20 6c 61 70  gs} {.  eval lap
8d60: 70 65 6e 64 20 3a 3a 6c 69 6b 65 61 72 67 73 20  pend ::likeargs 
8d70: 24 61 72 67 73 0a 20 20 72 65 74 75 72 6e 20 31  $args.  return 1
8d80: 0a 7d 0a 64 62 20 66 75 6e 63 20 6c 69 6b 65 20  .}.db func like 
8d90: 6c 69 6b 65 66 75 6e 63 0a 73 65 74 20 3a 3a 6c  likefunc.set ::l
8da0: 69 6b 65 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64  ikeargs [list].d
8db0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
8dc0: 5f 65 78 70 72 2d 31 35 2e 31 2e 31 20 7b 20 53  _expr-15.1.1 { S
8dd0: 45 4c 45 43 54 20 27 61 62 63 27 20 4c 49 4b 45  ELECT 'abc' LIKE
8de0: 20 27 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65   'def' } 1.do_te
8df0: 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78 70  st         e_exp
8e00: 72 2d 31 35 2e 31 2e 32 20 7b 20 73 65 74 20 6c  r-15.1.2 { set l
8e10: 69 6b 65 61 72 67 73 20 7d 20 7b 64 65 66 20 61  ikeargs } {def a
8e20: 62 63 7d 0a 73 65 74 20 3a 3a 6c 69 6b 65 61 72  bc}.set ::likear
8e30: 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65  gs [list].do_exe
8e40: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
8e50: 2d 31 35 2e 31 2e 33 20 7b 20 53 45 4c 45 43 54  -15.1.3 { SELECT
8e60: 20 27 61 62 63 27 20 4c 49 4b 45 20 27 64 65 66   'abc' LIKE 'def
8e70: 27 20 45 53 43 41 50 45 20 27 58 27 20 7d 20 31  ' ESCAPE 'X' } 1
8e80: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
8e90: 20 65 5f 65 78 70 72 2d 31 35 2e 31 2e 34 20 7b   e_expr-15.1.4 {
8ea0: 20 73 65 74 20 6c 69 6b 65 61 72 67 73 20 7d 20   set likeargs } 
8eb0: 7b 64 65 66 20 61 62 63 20 58 7d 0a 64 62 20 63  {def abc X}.db c
8ec0: 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20  lose.sqlite3 db 
8ed0: 74 65 73 74 2e 64 62 0a 0a 23 20 45 56 49 44 45  test.db..# EVIDE
8ee0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 38 36 38 2d  NCE-OF: R-22868-
8ef0: 32 35 38 38 30 20 54 68 65 20 4c 49 4b 45 20 6f  25880 The LIKE o
8f00: 70 65 72 61 74 6f 72 20 63 61 6e 20 62 65 20 6d  perator can be m
8f10: 61 64 65 20 63 61 73 65 0a 23 20 73 65 6e 73 69  ade case.# sensi
8f20: 74 69 76 65 20 75 73 69 6e 67 20 74 68 65 20 63  tive using the c
8f30: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
8f40: 6b 65 20 70 72 61 67 6d 61 2e 0a 23 0a 64 6f 5f  ke pragma..#.do_
8f50: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8f60: 78 70 72 2d 31 36 2e 31 2e 31 20 7b 20 53 45 4c  xpr-16.1.1 { SEL
8f70: 45 43 54 20 27 61 62 63 78 79 7a 27 20 4c 49 4b  ECT 'abcxyz' LIK
8f80: 45 20 27 41 42 43 25 27 20 7d 20 31 0a 64 6f 5f  E 'ABC%' } 1.do_
8f90: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
8fa0: 78 70 72 2d 31 36 2e 31 2e 32 20 7b 20 50 52 41  xpr-16.1.2 { PRA
8fb0: 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69  GMA case_sensiti
8fc0: 76 65 5f 6c 69 6b 65 20 3d 20 31 20 7d 20 7b 7d  ve_like = 1 } {}
8fd0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
8fe0: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 33 20 7b   e_expr-16.1.3 {
8ff0: 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27   SELECT 'abcxyz'
9000: 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20 30   LIKE 'ABC%' } 0
9010: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9020: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 34 20 7b   e_expr-16.1.4 {
9030: 20 53 45 4c 45 43 54 20 27 41 42 43 78 79 7a 27   SELECT 'ABCxyz'
9040: 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20 31   LIKE 'ABC%' } 1
9050: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9060: 20 65 5f 65 78 70 72 2d 31 36 2e 31 2e 35 20 7b   e_expr-16.1.5 {
9070: 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e   PRAGMA case_sen
9080: 73 69 74 69 76 65 5f 6c 69 6b 65 20 3d 20 30 20  sitive_like = 0 
9090: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
90a0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
90b0: 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .6 { SELECT 'abc
90c0: 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25 27  xyz' LIKE 'ABC%'
90d0: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
90e0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 36 2e 31  test e_expr-16.1
90f0: 2e 37 20 7b 20 53 45 4c 45 43 54 20 27 41 42 43  .7 { SELECT 'ABC
9100: 78 79 7a 27 20 4c 49 4b 45 20 27 41 42 43 25 27  xyz' LIKE 'ABC%'
9110: 20 7d 20 31 0a 0a 23 20 45 56 49 44 45 4e 43 45   } 1..# EVIDENCE
9120: 2d 4f 46 3a 20 52 2d 35 32 30 38 37 2d 31 32 30  -OF: R-52087-120
9130: 34 33 20 54 68 65 20 47 4c 4f 42 20 6f 70 65 72  43 The GLOB oper
9140: 61 74 6f 72 20 69 73 20 73 69 6d 69 6c 61 72 20  ator is similar 
9150: 74 6f 20 4c 49 4b 45 20 62 75 74 0a 23 20 75 73  to LIKE but.# us
9160: 65 73 20 74 68 65 20 55 6e 69 78 20 66 69 6c 65  es the Unix file
9170: 20 67 6c 6f 62 62 69 6e 67 20 73 79 6e 74 61 78   globbing syntax
9180: 20 66 6f 72 20 69 74 73 20 77 69 6c 64 63 61 72   for its wildcar
9190: 64 73 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45  ds..#.# EVIDENCE
91a0: 2d 4f 46 3a 20 52 2d 30 39 38 31 33 2d 31 37 32  -OF: R-09813-172
91b0: 37 39 20 41 6c 73 6f 2c 20 47 4c 4f 42 20 69 73  79 Also, GLOB is
91c0: 20 63 61 73 65 20 73 65 6e 73 69 74 69 76 65 2c   case sensitive,
91d0: 20 75 6e 6c 69 6b 65 20 4c 49 4b 45 2e 0a 23 0a   unlike LIKE..#.
91e0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
91f0: 65 5f 65 78 70 72 2d 31 37 2e 31 2e 31 20 7b 20  e_expr-17.1.1 { 
9200: 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20  SELECT 'abcxyz' 
9210: 47 4c 4f 42 20 27 61 62 63 25 27 20 7d 20 30 0a  GLOB 'abc%' } 0.
9220: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9230: 65 5f 65 78 70 72 2d 31 37 2e 31 2e 32 20 7b 20  e_expr-17.1.2 { 
9240: 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20  SELECT 'abcxyz' 
9250: 47 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20 31 0a  GLOB 'abc*' } 1.
9260: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
9270: 65 5f 65 78 70 72 2d 31 37 2e 31 2e 33 20 7b 20  e_expr-17.1.3 { 
9280: 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20  SELECT 'abcxyz' 
9290: 47 4c 4f 42 20 27 61 62 63 5f 5f 5f 27 20 7d 20  GLOB 'abc___' } 
92a0: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
92b0: 74 20 65 5f 65 78 70 72 2d 31 37 2e 31 2e 34 20  t e_expr-17.1.4 
92c0: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
92d0: 27 20 47 4c 4f 42 20 27 61 62 63 3f 3f 3f 27 20  ' GLOB 'abc???' 
92e0: 7d 20 31 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } 1..do_execsql_
92f0: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31  test e_expr-17.1
9300: 2e 35 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .5 { SELECT 'abc
9310: 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 2a 27  xyz' GLOB 'abc*'
9320: 20 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 1.do_execsql_
9330: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31  test e_expr-17.1
9340: 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 41 42 43  .6 { SELECT 'ABC
9350: 78 79 7a 27 20 47 4c 4f 42 20 27 61 62 63 2a 27  xyz' GLOB 'abc*'
9360: 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   } 0.do_execsql_
9370: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 31  test e_expr-17.1
9380: 2e 37 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .7 { SELECT 'abc
9390: 78 79 7a 27 20 47 4c 4f 42 20 27 41 42 43 2a 27  xyz' GLOB 'ABC*'
93a0: 20 7d 20 30 0a 0a 23 20 45 56 49 44 45 4e 43 45   } 0..# EVIDENCE
93b0: 2d 4f 46 3a 20 52 2d 33 39 36 31 36 2d 32 30 35  -OF: R-39616-205
93c0: 35 35 20 42 6f 74 68 20 47 4c 4f 42 20 61 6e 64  55 Both GLOB and
93d0: 20 4c 49 4b 45 20 6d 61 79 20 62 65 20 70 72 65   LIKE may be pre
93e0: 63 65 64 65 64 20 62 79 20 74 68 65 0a 23 20 4e  ceded by the.# N
93f0: 4f 54 20 6b 65 79 77 6f 72 64 20 74 6f 20 69 6e  OT keyword to in
9400: 76 65 72 74 20 74 68 65 20 73 65 6e 73 65 20 6f  vert the sense o
9410: 66 20 74 68 65 20 74 65 73 74 2e 0a 23 0a 64 6f  f the test..#.do
9420: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9430: 65 78 70 72 2d 31 37 2e 32 2e 31 20 7b 20 53 45  expr-17.2.1 { SE
9440: 4c 45 43 54 20 27 61 62 63 78 79 7a 27 20 4e 4f  LECT 'abcxyz' NO
9450: 54 20 47 4c 4f 42 20 27 41 42 43 2a 27 20 7d 20  T GLOB 'ABC*' } 
9460: 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  1.do_execsql_tes
9470: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 32 20  t e_expr-17.2.2 
9480: 7b 20 53 45 4c 45 43 54 20 27 61 62 63 78 79 7a  { SELECT 'abcxyz
9490: 27 20 4e 4f 54 20 47 4c 4f 42 20 27 61 62 63 2a  ' NOT GLOB 'abc*
94a0: 27 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ' } 0.do_execsql
94b0: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e  _test e_expr-17.
94c0: 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 27 61 62  2.3 { SELECT 'ab
94d0: 63 78 79 7a 27 20 4e 4f 54 20 4c 49 4b 45 20 27  cxyz' NOT LIKE '
94e0: 41 42 43 25 27 20 7d 20 30 0a 64 6f 5f 65 78 65  ABC%' } 0.do_exe
94f0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
9500: 2d 31 37 2e 32 2e 34 20 7b 20 53 45 4c 45 43 54  -17.2.4 { SELECT
9510: 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 4c 49   'abcxyz' NOT LI
9520: 4b 45 20 27 61 62 63 25 27 20 7d 20 30 0a 64 6f  KE 'abc%' } 0.do
9530: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f  _execsql_test e_
9540: 65 78 70 72 2d 31 37 2e 32 2e 35 20 7b 20 53 45  expr-17.2.5 { SE
9550: 4c 45 43 54 20 27 61 62 64 78 79 7a 27 20 4e 4f  LECT 'abdxyz' NO
9560: 54 20 4c 49 4b 45 20 27 61 62 63 25 27 20 7d 20  T LIKE 'abc%' } 
9570: 31 0a 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20  1..db nullvalue 
9580: 6e 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  null.do_execsql_
9590: 74 65 73 74 20 65 5f 65 78 70 72 2d 31 37 2e 32  test e_expr-17.2
95a0: 2e 36 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63  .6 { SELECT 'abc
95b0: 78 79 7a 27 20 4e 4f 54 20 47 4c 4f 42 20 4e 55  xyz' NOT GLOB NU
95c0: 4c 4c 20 7d 20 6e 75 6c 6c 0a 64 6f 5f 65 78 65  LL } null.do_exe
95d0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
95e0: 2d 31 37 2e 32 2e 37 20 7b 20 53 45 4c 45 43 54  -17.2.7 { SELECT
95f0: 20 27 61 62 63 78 79 7a 27 20 4e 4f 54 20 4c 49   'abcxyz' NOT LI
9600: 4b 45 20 4e 55 4c 4c 20 7d 20 6e 75 6c 6c 0a 64  KE NULL } null.d
9610: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
9620: 5f 65 78 70 72 2d 31 37 2e 32 2e 38 20 7b 20 53  _expr-17.2.8 { S
9630: 45 4c 45 43 54 20 4e 55 4c 4c 20 4e 4f 54 20 47  ELECT NULL NOT G
9640: 4c 4f 42 20 27 61 62 63 2a 27 20 7d 20 6e 75 6c  LOB 'abc*' } nul
9650: 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  l.do_execsql_tes
9660: 74 20 65 5f 65 78 70 72 2d 31 37 2e 32 2e 39 20  t e_expr-17.2.9 
9670: 7b 20 53 45 4c 45 43 54 20 4e 55 4c 4c 20 4e 4f  { SELECT NULL NO
9680: 54 20 4c 49 4b 45 20 27 41 42 43 25 27 20 7d 20  T LIKE 'ABC%' } 
9690: 6e 75 6c 6c 0a 64 62 20 6e 75 6c 6c 76 61 6c 75  null.db nullvalu
96a0: 65 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45  e {}..# EVIDENCE
96b0: 2d 4f 46 3a 20 52 2d 33 39 34 31 34 2d 33 35 34  -OF: R-39414-354
96c0: 38 39 20 54 68 65 20 69 6e 66 69 78 20 47 4c 4f  89 The infix GLO
96d0: 42 20 6f 70 65 72 61 74 6f 72 20 69 73 20 69 6d  B operator is im
96e0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 23 20 63  plemented by.# c
96f0: 61 6c 6c 69 6e 67 20 74 68 65 20 66 75 6e 63 74  alling the funct
9700: 69 6f 6e 20 67 6c 6f 62 28 59 2c 58 29 20 61 6e  ion glob(Y,X) an
9710: 64 20 63 61 6e 20 62 65 20 6d 6f 64 69 66 69 65  d can be modifie
9720: 64 20 62 79 20 6f 76 65 72 72 69 64 69 6e 67 20  d by overriding 
9730: 74 68 61 74 0a 23 20 66 75 6e 63 74 69 6f 6e 2e  that.# function.
9740: 0a 70 72 6f 63 20 67 6c 6f 62 66 75 6e 63 20 7b  .proc globfunc {
9750: 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20 6c  args} {.  eval l
9760: 61 70 70 65 6e 64 20 3a 3a 67 6c 6f 62 61 72 67  append ::globarg
9770: 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72 6e  s $args.  return
9780: 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 67 6c 6f   1.}.db func glo
9790: 62 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 67 6c  b -argcount 2 gl
97a0: 6f 62 66 75 6e 63 0a 73 65 74 20 3a 3a 67 6c 6f  obfunc.set ::glo
97b0: 62 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64 6f 5f  bargs [list].do_
97c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65  execsql_test e_e
97d0: 78 70 72 2d 31 37 2e 33 2e 31 20 7b 20 53 45 4c  xpr-17.3.1 { SEL
97e0: 45 43 54 20 27 61 62 63 27 20 47 4c 4f 42 20 27  ECT 'abc' GLOB '
97f0: 64 65 66 27 20 7d 20 31 0a 64 6f 5f 74 65 73 74  def' } 1.do_test
9800: 20 20 20 20 20 20 20 20 20 65 5f 65 78 70 72 2d           e_expr-
9810: 31 37 2e 33 2e 32 20 7b 20 73 65 74 20 67 6c 6f  17.3.2 { set glo
9820: 62 61 72 67 73 20 7d 20 7b 64 65 66 20 61 62 63  bargs } {def abc
9830: 7d 0a 73 65 74 20 3a 3a 67 6c 6f 62 61 72 67 73  }.set ::globargs
9840: 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73   [list].do_execs
9850: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31  ql_test e_expr-1
9860: 37 2e 33 2e 33 20 7b 20 53 45 4c 45 43 54 20 27  7.3.3 { SELECT '
9870: 58 27 20 4e 4f 54 20 47 4c 4f 42 20 27 59 27 20  X' NOT GLOB 'Y' 
9880: 7d 20 30 0a 64 6f 5f 74 65 73 74 20 20 20 20 20  } 0.do_test     
9890: 20 20 20 20 65 5f 65 78 70 72 2d 31 37 2e 33 2e      e_expr-17.3.
98a0: 34 20 7b 20 73 65 74 20 67 6c 6f 62 61 72 67 73  4 { set globargs
98b0: 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69 74 65 33   } {Y X}.sqlite3
98c0: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 23 20 45   db test.db..# E
98d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31  VIDENCE-OF: R-41
98e0: 36 35 30 2d 32 30 38 37 32 20 4e 6f 20 72 65 67  650-20872 No reg
98f0: 65 78 70 28 29 20 75 73 65 72 20 66 75 6e 63 74  exp() user funct
9900: 69 6f 6e 20 69 73 20 64 65 66 69 6e 65 64 20 62  ion is defined b
9910: 79 0a 23 20 64 65 66 61 75 6c 74 20 61 6e 64 20  y.# default and 
9920: 73 6f 20 75 73 65 20 6f 66 20 74 68 65 20 52 45  so use of the RE
9930: 47 45 58 50 20 6f 70 65 72 61 74 6f 72 20 77 69  GEXP operator wi
9940: 6c 6c 20 6e 6f 72 6d 61 6c 6c 79 20 72 65 73 75  ll normally resu
9950: 6c 74 20 69 6e 20 61 6e 0a 23 20 65 72 72 6f 72  lt in an.# error
9960: 20 6d 65 73 73 61 67 65 2e 0a 23 0a 64 6f 5f 63   message..#.do_c
9970: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65 5f 65  atchsql_test e_e
9980: 78 70 72 2d 31 38 2e 31 2e 31 20 7b 20 0a 20 20  xpr-18.1.1 { .  
9990: 53 45 4c 45 43 54 20 72 65 67 65 78 70 28 27 61  SELECT regexp('a
99a0: 62 63 27 2c 20 27 64 65 66 27 29 20 0a 7d 20 7b  bc', 'def') .} {
99b0: 31 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  1 {no such funct
99c0: 69 6f 6e 3a 20 72 65 67 65 78 70 7d 7d 0a 64 6f  ion: regexp}}.do
99d0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 65  _catchsql_test e
99e0: 5f 65 78 70 72 2d 31 38 2e 31 2e 32 20 7b 20 0a  _expr-18.1.2 { .
99f0: 20 20 53 45 4c 45 43 54 20 27 61 62 63 27 20 52    SELECT 'abc' R
9a00: 45 47 45 58 50 20 27 64 65 66 27 0a 7d 20 7b 31  EGEXP 'def'.} {1
9a10: 20 7b 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69   {no such functi
9a20: 6f 6e 3a 20 52 45 47 45 58 50 7d 7d 0a 0a 23 20  on: REGEXP}}..# 
9a30: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
9a40: 33 36 39 33 2d 35 30 31 38 30 20 54 68 65 20 52  3693-50180 The R
9a50: 45 47 45 58 50 20 6f 70 65 72 61 74 6f 72 20 69  EGEXP operator i
9a60: 73 20 61 20 73 70 65 63 69 61 6c 20 73 79 6e 74  s a special synt
9a70: 61 78 20 66 6f 72 0a 23 20 74 68 65 20 72 65 67  ax for.# the reg
9a80: 65 78 70 28 29 20 75 73 65 72 20 66 75 6e 63 74  exp() user funct
9a90: 69 6f 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43  ion..#.# EVIDENC
9aa0: 45 2d 4f 46 3a 20 52 2d 35 37 32 38 39 2d 31 33  E-OF: R-57289-13
9ab0: 35 37 38 20 49 66 20 61 20 61 70 70 6c 69 63 61  578 If a applica
9ac0: 74 69 6f 6e 2d 64 65 66 69 6e 65 64 20 53 51 4c  tion-defined SQL
9ad0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 0a   function named.
9ae0: 23 20 22 72 65 67 65 78 70 22 20 69 73 20 61 64  # "regexp" is ad
9af0: 64 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 2c  ded at run-time,
9b00: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 77   that function w
9b10: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 69 6e  ill be called in
9b20: 20 6f 72 64 65 72 0a 23 20 74 6f 20 69 6d 70 6c   order.# to impl
9b30: 65 6d 65 6e 74 20 74 68 65 20 52 45 47 45 58 50  ement the REGEXP
9b40: 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 70 72 6f   operator..#.pro
9b50: 63 20 72 65 67 65 78 70 66 75 6e 63 20 7b 61 72  c regexpfunc {ar
9b60: 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20 6c 61 70  gs} {.  eval lap
9b70: 70 65 6e 64 20 3a 3a 72 65 67 65 78 70 61 72 67  pend ::regexparg
9b80: 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72 6e  s $args.  return
9b90: 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 72 65 67   1.}.db func reg
9ba0: 65 78 70 20 2d 61 72 67 63 6f 75 6e 74 20 32 20  exp -argcount 2 
9bb0: 72 65 67 65 78 70 66 75 6e 63 0a 73 65 74 20 3a  regexpfunc.set :
9bc0: 3a 72 65 67 65 78 70 61 72 67 73 20 5b 6c 69 73  :regexpargs [lis
9bd0: 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  t].do_execsql_te
9be0: 73 74 20 65 5f 65 78 70 72 2d 31 38 2e 32 2e 31  st e_expr-18.2.1
9bf0: 20 7b 20 53 45 4c 45 43 54 20 27 61 62 63 27 20   { SELECT 'abc' 
9c00: 52 45 47 45 58 50 20 27 64 65 66 27 20 7d 20 31  REGEXP 'def' } 1
9c10: 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20 20  .do_test        
9c20: 20 65 5f 65 78 70 72 2d 31 38 2e 32 2e 32 20 7b   e_expr-18.2.2 {
9c30: 20 73 65 74 20 72 65 67 65 78 70 61 72 67 73 20   set regexpargs 
9c40: 7d 20 7b 64 65 66 20 61 62 63 7d 0a 73 65 74 20  } {def abc}.set 
9c50: 3a 3a 72 65 67 65 78 70 61 72 67 73 20 5b 6c 69  ::regexpargs [li
9c60: 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  st].do_execsql_t
9c70: 65 73 74 20 65 5f 65 78 70 72 2d 31 38 2e 32 2e  est e_expr-18.2.
9c80: 33 20 7b 20 53 45 4c 45 43 54 20 27 58 27 20 4e  3 { SELECT 'X' N
9c90: 4f 54 20 52 45 47 45 58 50 20 27 59 27 20 7d 20  OT REGEXP 'Y' } 
9ca0: 30 0a 64 6f 5f 74 65 73 74 20 20 20 20 20 20 20  0.do_test       
9cb0: 20 20 65 5f 65 78 70 72 2d 31 38 2e 32 2e 34 20    e_expr-18.2.4 
9cc0: 7b 20 73 65 74 20 72 65 67 65 78 70 61 72 67 73  { set regexpargs
9cd0: 20 7d 20 7b 59 20 58 7d 0a 73 71 6c 69 74 65 33   } {Y X}.sqlite3
9ce0: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 23 20 45   db test.db..# E
9cf0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 32  VIDENCE-OF: R-42
9d00: 30 33 37 2d 33 37 38 32 36 20 54 68 65 20 64 65  037-37826 The de
9d10: 66 61 75 6c 74 20 6d 61 74 63 68 28 29 20 66 75  fault match() fu
9d20: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
9d30: 61 74 69 6f 6e 0a 23 20 72 61 69 73 65 73 20 61  ation.# raises a
9d40: 6e 20 65 78 63 65 70 74 69 6f 6e 20 61 6e 64 20  n exception and 
9d50: 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 75 73  is not really us
9d60: 65 66 75 6c 20 66 6f 72 20 61 6e 79 74 68 69 6e  eful for anythin
9d70: 67 2e 0a 23 0a 64 6f 5f 63 61 74 63 68 73 71 6c  g..#.do_catchsql
9d80: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 31 39 2e  _test e_expr-19.
9d90: 31 2e 31 20 7b 20 0a 20 20 53 45 4c 45 43 54 20  1.1 { .  SELECT 
9da0: 27 61 62 63 27 20 4d 41 54 43 48 20 27 64 65 66  'abc' MATCH 'def
9db0: 27 20 0a 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20  ' .} {1 {unable 
9dc0: 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20  to use function 
9dd0: 4d 41 54 43 48 20 69 6e 20 74 68 65 20 72 65 71  MATCH in the req
9de0: 75 65 73 74 65 64 20 63 6f 6e 74 65 78 74 7d 7d  uested context}}
9df0: 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73  .do_catchsql_tes
9e00: 74 20 65 5f 65 78 70 72 2d 31 39 2e 31 2e 32 20  t e_expr-19.1.2 
9e10: 7b 20 0a 20 20 53 45 4c 45 43 54 20 6d 61 74 63  { .  SELECT matc
9e20: 68 28 27 61 62 63 27 2c 20 27 64 65 66 27 29 0a  h('abc', 'def').
9e30: 7d 20 7b 31 20 7b 75 6e 61 62 6c 65 20 74 6f 20  } {1 {unable to 
9e40: 75 73 65 20 66 75 6e 63 74 69 6f 6e 20 4d 41 54  use function MAT
9e50: 43 48 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  CH in the reques
9e60: 74 65 64 20 63 6f 6e 74 65 78 74 7d 7d 0a 0a 23  ted context}}..#
9e70: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
9e80: 33 37 39 31 36 2d 34 37 34 30 37 20 54 68 65 20  37916-47407 The 
9e90: 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 20 69  MATCH operator i
9ea0: 73 20 61 20 73 70 65 63 69 61 6c 20 73 79 6e 74  s a special synt
9eb0: 61 78 20 66 6f 72 0a 23 20 74 68 65 20 6d 61 74  ax for.# the mat
9ec0: 63 68 28 29 20 61 70 70 6c 69 63 61 74 69 6f 6e  ch() application
9ed0: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
9ee0: 6e 2e 0a 23 0a 23 20 45 56 49 44 45 4e 43 45 2d  n..#.# EVIDENCE-
9ef0: 4f 46 3a 20 52 2d 30 36 30 32 31 2d 30 39 33 37  OF: R-06021-0937
9f00: 33 20 42 75 74 20 65 78 74 65 6e 73 69 6f 6e 73  3 But extensions
9f10: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 74 68   can override th
9f20: 65 20 6d 61 74 63 68 28 29 0a 23 20 66 75 6e 63  e match().# func
9f30: 74 69 6f 6e 20 77 69 74 68 20 6d 6f 72 65 20 68  tion with more h
9f40: 65 6c 70 66 75 6c 20 6c 6f 67 69 63 2e 0a 23 0a  elpful logic..#.
9f50: 70 72 6f 63 20 6d 61 74 63 68 66 75 6e 63 20 7b  proc matchfunc {
9f60: 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c 20 6c  args} {.  eval l
9f70: 61 70 70 65 6e 64 20 3a 3a 6d 61 74 63 68 61 72  append ::matchar
9f80: 67 73 20 24 61 72 67 73 0a 20 20 72 65 74 75 72  gs $args.  retur
9f90: 6e 20 31 0a 7d 0a 64 62 20 66 75 6e 63 20 6d 61  n 1.}.db func ma
9fa0: 74 63 68 20 2d 61 72 67 63 6f 75 6e 74 20 32 20  tch -argcount 2 
9fb0: 6d 61 74 63 68 66 75 6e 63 0a 73 65 74 20 3a 3a  matchfunc.set ::
9fc0: 6d 61 74 63 68 61 72 67 73 20 5b 6c 69 73 74 5d  matchargs [list]
9fd0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
9fe0: 20 65 5f 65 78 70 72 2d 31 39 2e 32 2e 31 20 7b   e_expr-19.2.1 {
9ff0: 20 53 45 4c 45 43 54 20 27 61 62 63 27 20 4d 41   SELECT 'abc' MA
a000: 54 43 48 20 27 64 65 66 27 20 7d 20 31 0a 64 6f  TCH 'def' } 1.do
a010: 5f 74 65 73 74 20 20 20 20 20 20 20 20 20 65 5f  _test         e_
a020: 65 78 70 72 2d 31 39 2e 32 2e 32 20 7b 20 73 65  expr-19.2.2 { se
a030: 74 20 6d 61 74 63 68 61 72 67 73 20 7d 20 7b 64  t matchargs } {d
a040: 65 66 20 61 62 63 7d 0a 73 65 74 20 3a 3a 6d 61  ef abc}.set ::ma
a050: 74 63 68 61 72 67 73 20 5b 6c 69 73 74 5d 0a 64  tchargs [list].d
a060: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
a070: 5f 65 78 70 72 2d 31 39 2e 32 2e 33 20 7b 20 53  _expr-19.2.3 { S
a080: 45 4c 45 43 54 20 27 58 27 20 4e 4f 54 20 4d 41  ELECT 'X' NOT MA
a090: 54 43 48 20 27 59 27 20 7d 20 30 0a 64 6f 5f 74  TCH 'Y' } 0.do_t
a0a0: 65 73 74 20 20 20 20 20 20 20 20 20 65 5f 65 78  est         e_ex
a0b0: 70 72 2d 31 39 2e 32 2e 34 20 7b 20 73 65 74 20  pr-19.2.4 { set 
a0c0: 6d 61 74 63 68 61 72 67 73 20 7d 20 7b 59 20 58  matchargs } {Y X
a0d0: 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  }.sqlite3 db tes
a0e0: 74 2e 64 62 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.db..#---------
a0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a130: 0a 23 20 54 65 73 74 20 63 61 73 65 73 20 66 6f  .# Test cases fo
a140: 72 20 74 68 65 20 74 65 73 74 61 62 6c 65 20 73  r the testable s
a150: 74 61 74 65 6d 65 6e 74 73 20 72 65 6c 61 74 65  tatements relate
a160: 64 20 74 6f 20 74 68 65 20 43 41 53 45 20 65 78  d to the CASE ex
a170: 70 72 65 73 73 69 6f 6e 2e 0a 23 0a 23 20 45 56  pression..#.# EV
a180: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 31  IDENCE-OF: R-151
a190: 39 39 2d 36 31 33 38 39 20 54 68 65 72 65 20 61  99-61389 There a
a1a0: 72 65 20 74 77 6f 20 62 61 73 69 63 20 66 6f 72  re two basic for
a1b0: 6d 73 20 6f 66 20 74 68 65 20 43 41 53 45 0a 23  ms of the CASE.#
a1c0: 20 65 78 70 72 65 73 73 69 6f 6e 3a 20 74 68 6f   expression: tho
a1d0: 73 65 20 77 69 74 68 20 61 20 62 61 73 65 20 65  se with a base e
a1e0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68  xpression and th
a1f0: 6f 73 65 20 77 69 74 68 6f 75 74 2e 0a 23 0a 64  ose without..#.d
a200: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
a210: 5f 65 78 70 72 2d 32 30 2e 31 20 7b 0a 20 20 53  _expr-20.1 {.  S
a220: 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20  ELECT CASE WHEN 
a230: 31 20 54 48 45 4e 20 27 74 72 75 65 27 20 57 48  1 THEN 'true' WH
a240: 45 4e 20 30 20 54 48 45 4e 20 27 66 61 6c 73 65  EN 0 THEN 'false
a250: 27 20 45 4c 53 45 20 27 65 6c 73 65 27 20 45 4e  ' ELSE 'else' EN
a260: 44 3b 0a 7d 20 7b 74 72 75 65 7d 0a 64 6f 5f 65  D;.} {true}.do_e
a270: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
a280: 70 72 2d 32 30 2e 32 20 7b 0a 20 20 53 45 4c 45  pr-20.2 {.  SELE
a290: 43 54 20 43 41 53 45 20 30 20 57 48 45 4e 20 31  CT CASE 0 WHEN 1
a2a0: 20 54 48 45 4e 20 27 74 72 75 65 27 20 57 48 45   THEN 'true' WHE
a2b0: 4e 20 30 20 54 48 45 4e 20 27 66 61 6c 73 65 27  N 0 THEN 'false'
a2c0: 20 45 4c 53 45 20 27 65 6c 73 65 27 20 45 4e 44   ELSE 'else' END
a2d0: 3b 0a 7d 20 7b 66 61 6c 73 65 7d 0a 0a 70 72 6f  ;.} {false}..pro
a2e0: 63 20 76 61 72 20 7b 6e 6d 7d 20 7b 0a 20 20 6c  c var {nm} {.  l
a2f0: 61 70 70 65 6e 64 20 3a 3a 76 61 72 6c 69 73 74  append ::varlist
a300: 20 24 6e 6d 0a 20 20 72 65 74 75 72 6e 20 5b 73   $nm.  return [s
a310: 65 74 20 22 3a 3a 24 6e 6d 22 5d 0a 7d 0a 64 62  et "::$nm"].}.db
a320: 20 66 75 6e 63 20 76 61 72 20 76 61 72 0a 0a 23   func var var..#
a330: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
a340: 33 30 36 33 38 2d 35 39 39 35 34 20 49 6e 20 61  30638-59954 In a
a350: 20 43 41 53 45 20 77 69 74 68 6f 75 74 20 61 20   CASE without a 
a360: 62 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 2c  base expression,
a370: 20 65 61 63 68 0a 23 20 57 48 45 4e 20 65 78 70   each.# WHEN exp
a380: 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
a390: 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 73  ated and the res
a3a0: 75 6c 74 20 74 72 65 61 74 65 64 20 61 73 20 61  ult treated as a
a3b0: 20 62 6f 6f 6c 65 61 6e 2c 0a 23 20 73 74 61 72   boolean,.# star
a3c0: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6c 65  ting with the le
a3d0: 66 74 6d 6f 73 74 20 61 6e 64 20 63 6f 6e 74 69  ftmost and conti
a3e0: 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 72 69 67  nuing to the rig
a3f0: 68 74 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 61  ht..#.foreach {a
a400: 20 62 20 63 7d 20 7b 30 20 30 20 30 7d 20 62 72   b c} {0 0 0} br
a410: 65 61 6b 0a 73 65 74 20 76 61 72 6c 69 73 74 20  eak.set varlist 
a420: 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71  [list].do_execsq
a430: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31  l_test e_expr-21
a440: 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.1 {.  SELECT 
a450: 43 41 53 45 20 57 48 45 4e 20 76 61 72 28 27 61  CASE WHEN var('a
a460: 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20  ') THEN 'A' .   
a470: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
a480: 76 61 72 28 27 62 27 29 20 54 48 45 4e 20 27 42  var('b') THEN 'B
a490: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
a4a0: 20 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54   WHEN var('c') T
a4b0: 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20 7b 7b  HEN 'C' END.} {{
a4c0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78 70  }}.do_test e_exp
a4d0: 72 2d 32 31 2e 31 2e 32 20 7b 20 73 65 74 20 76  r-21.1.2 { set v
a4e0: 61 72 6c 69 73 74 20 7d 20 7b 61 20 62 20 63 7d  arlist } {a b c}
a4f0: 0a 73 65 74 20 76 61 72 6c 69 73 74 20 5b 6c 69  .set varlist [li
a500: 73 74 5d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  st].do_execsql_t
a510: 65 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 31 2e  est e_expr-21.1.
a520: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  3 {.  SELECT CAS
a530: 45 20 57 48 45 4e 20 76 61 72 28 27 63 27 29 20  E WHEN var('c') 
a540: 54 48 45 4e 20 27 43 27 20 0a 20 20 20 20 20 20  THEN 'C' .      
a550: 20 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72          WHEN var
a560: 28 27 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a  ('b') THEN 'B' .
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
a580: 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e  EN var('a') THEN
a590: 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20   'A' .          
a5a0: 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72 65 73      ELSE 'no res
a5b0: 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b 7b 6e  ult'.  END.} {{n
a5c0: 6f 20 72 65 73 75 6c 74 7d 7d 0a 64 6f 5f 74 65  o result}}.do_te
a5d0: 73 74 20 65 5f 65 78 70 72 2d 32 31 2e 31 2e 34  st e_expr-21.1.4
a5e0: 20 7b 20 73 65 74 20 76 61 72 6c 69 73 74 20 7d   { set varlist }
a5f0: 20 7b 63 20 62 20 61 7d 0a 0a 23 20 45 56 49 44   {c b a}..# EVID
a600: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 30 30 39  ENCE-OF: R-39009
a610: 2d 32 35 35 39 36 20 54 68 65 20 72 65 73 75 6c  -25596 The resul
a620: 74 20 6f 66 20 74 68 65 20 43 41 53 45 20 65 78  t of the CASE ex
a630: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 0a  pression is the.
a640: 23 20 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20  # evaluation of 
a650: 74 68 65 20 54 48 45 4e 20 65 78 70 72 65 73 73  the THEN express
a660: 69 6f 6e 20 74 68 61 74 20 63 6f 72 72 65 73 70  ion that corresp
a670: 6f 6e 64 73 20 74 6f 20 74 68 65 20 66 69 72 73  onds to the firs
a680: 74 20 57 48 45 4e 0a 23 20 65 78 70 72 65 73 73  t WHEN.# express
a690: 69 6f 6e 20 74 68 61 74 20 65 76 61 6c 75 61 74  ion that evaluat
a6a0: 65 73 20 74 6f 20 74 72 75 65 2e 0a 23 0a 66 6f  es to true..#.fo
a6b0: 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30  reach {a b c} {0
a6c0: 20 31 20 30 7d 20 62 72 65 61 6b 0a 64 6f 5f 65   1 0} break.do_e
a6d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
a6e0: 70 72 2d 32 31 2e 32 2e 31 20 7b 0a 20 20 53 45  pr-21.2.1 {.  SE
a6f0: 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76  LECT CASE WHEN v
a700: 61 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27  ar('a') THEN 'A'
a710: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
a720: 57 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48  WHEN var('b') TH
a730: 45 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20  EN 'B' .        
a740: 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27        WHEN var('
a750: 63 27 29 20 54 48 45 4e 20 27 43 27 20 0a 20 20  c') THEN 'C' .  
a760: 20 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 45              ELSE
a770: 20 27 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20 45   'no result'.  E
a780: 4e 44 0a 7d 20 7b 42 7d 0a 66 6f 72 65 61 63 68  ND.} {B}.foreach
a790: 20 7b 61 20 62 20 63 7d 20 7b 30 20 31 20 31 7d   {a b c} {0 1 1}
a7a0: 20 62 72 65 61 6b 0a 64 6f 5f 65 78 65 63 73 71   break.do_execsq
a7b0: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 31  l_test e_expr-21
a7c0: 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .2.2 {.  SELECT 
a7d0: 43 41 53 45 20 57 48 45 4e 20 76 61 72 28 27 61  CASE WHEN var('a
a7e0: 27 29 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20  ') THEN 'A' .   
a7f0: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
a800: 76 61 72 28 27 62 27 29 20 54 48 45 4e 20 27 42  var('b') THEN 'B
a810: 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
a820: 20 57 48 45 4e 20 76 61 72 28 27 63 27 29 20 54   WHEN var('c') T
a830: 48 45 4e 20 27 43 27 0a 20 20 20 20 20 20 20 20  HEN 'C'.        
a840: 20 20 20 20 20 20 45 4c 53 45 20 27 6e 6f 20 72        ELSE 'no r
a850: 65 73 75 6c 74 27 0a 20 20 45 4e 44 0a 7d 20 7b  esult'.  END.} {
a860: 42 7d 0a 66 6f 72 65 61 63 68 20 7b 61 20 62 20  B}.foreach {a b 
a870: 63 7d 20 7b 30 20 30 20 31 7d 20 62 72 65 61 6b  c} {0 0 1} break
a880: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
a890: 20 65 5f 65 78 70 72 2d 32 31 2e 32 2e 33 20 7b   e_expr-21.2.3 {
a8a0: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57  .  SELECT CASE W
a8b0: 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45  HEN var('a') THE
a8c0: 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20  N 'A' .         
a8d0: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62       WHEN var('b
a8e0: 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20  ') THEN 'B' .   
a8f0: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
a900: 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43  var('c') THEN 'C
a910: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  '.              
a920: 45 4c 53 45 20 27 6e 6f 20 72 65 73 75 6c 74 27  ELSE 'no result'
a930: 0a 20 20 45 4e 44 0a 7d 20 7b 43 7d 0a 0a 23 20  .  END.} {C}..# 
a940: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
a950: 34 32 32 37 2d 30 34 38 30 37 20 4f 72 2c 20 69  4227-04807 Or, i
a960: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 57 48  f none of the WH
a970: 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 23  EN expressions.#
a980: 20 65 76 61 6c 75 61 74 65 20 74 6f 20 74 72 75   evaluate to tru
a990: 65 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  e, the result of
a9a0: 20 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20   evaluating the 
a9b0: 45 4c 53 45 20 65 78 70 72 65 73 73 69 6f 6e 2c  ELSE expression,
a9c0: 20 69 66 0a 23 20 61 6e 79 2e 0a 23 0a 66 6f 72   if.# any..#.for
a9d0: 65 61 63 68 20 7b 61 20 62 20 63 7d 20 7b 30 20  each {a b c} {0 
a9e0: 30 20 30 7d 20 62 72 65 61 6b 0a 64 6f 5f 65 78  0 0} break.do_ex
a9f0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
aa00: 72 2d 32 31 2e 33 2e 31 20 7b 0a 20 20 53 45 4c  r-21.3.1 {.  SEL
aa10: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 76 61  ECT CASE WHEN va
aa20: 72 28 27 61 27 29 20 54 48 45 4e 20 27 41 27 20  r('a') THEN 'A' 
aa30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57  .              W
aa40: 48 45 4e 20 76 61 72 28 27 62 27 29 20 54 48 45  HEN var('b') THE
aa50: 4e 20 27 42 27 20 0a 20 20 20 20 20 20 20 20 20  N 'B' .         
aa60: 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 63       WHEN var('c
aa70: 27 29 20 54 48 45 4e 20 27 43 27 0a 20 20 20 20  ') THEN 'C'.    
aa80: 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 27            ELSE '
aa90: 6e 6f 20 72 65 73 75 6c 74 27 0a 20 20 45 4e 44  no result'.  END
aaa0: 0a 7d 20 7b 7b 6e 6f 20 72 65 73 75 6c 74 7d 7d  .} {{no result}}
aab0: 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ..# EVIDENCE-OF:
aac0: 20 52 2d 31 34 31 36 38 2d 30 37 35 37 39 20 49   R-14168-07579 I
aad0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 45 4c  f there is no EL
aae0: 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  SE expression an
aaf0: 64 20 6e 6f 6e 65 20 6f 66 0a 23 20 74 68 65 20  d none of.# the 
ab00: 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 73  WHEN expressions
ab10: 20 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20   are true, then 
ab20: 74 68 65 20 6f 76 65 72 61 6c 6c 20 72 65 73 75  the overall resu
ab30: 6c 74 20 69 73 20 4e 55 4c 4c 2e 0a 23 0a 64 62  lt is NULL..#.db
ab40: 20 6e 75 6c 6c 76 61 6c 75 65 20 6e 75 6c 6c 0a   nullvalue null.
ab50: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
ab60: 65 5f 65 78 70 72 2d 32 31 2e 33 2e 32 20 7b 0a  e_expr-21.3.2 {.
ab70: 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48    SELECT CASE WH
ab80: 45 4e 20 76 61 72 28 27 61 27 29 20 54 48 45 4e  EN var('a') THEN
ab90: 20 27 41 27 20 0a 20 20 20 20 20 20 20 20 20 20   'A' .          
aba0: 20 20 20 20 57 48 45 4e 20 76 61 72 28 27 62 27      WHEN var('b'
abb0: 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20 20 20  ) THEN 'B' .    
abc0: 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 76            WHEN v
abd0: 61 72 28 27 63 27 29 20 54 48 45 4e 20 27 43 27  ar('c') THEN 'C'
abe0: 0a 20 20 45 4e 44 0a 7d 20 7b 6e 75 6c 6c 7d 0a  .  END.} {null}.
abf0: 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 7b 7d 0a  db nullvalue {}.
ac00: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
ac10: 52 2d 31 33 39 34 33 2d 31 33 35 39 32 20 41 20  R-13943-13592 A 
ac20: 4e 55 4c 4c 20 72 65 73 75 6c 74 20 69 73 20 63  NULL result is c
ac30: 6f 6e 73 69 64 65 72 65 64 20 75 6e 74 72 75 65  onsidered untrue
ac40: 20 77 68 65 6e 0a 23 20 65 76 61 6c 75 61 74 69   when.# evaluati
ac50: 6e 67 20 57 48 45 4e 20 74 65 72 6d 73 2e 0a 23  ng WHEN terms..#
ac60: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
ac70: 20 65 5f 65 78 70 72 2d 32 31 2e 34 2e 31 20 7b   e_expr-21.4.1 {
ac80: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57  .  SELECT CASE W
ac90: 48 45 4e 20 4e 55 4c 4c 20 54 48 45 4e 20 27 41  HEN NULL THEN 'A
aca0: 27 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27 42  ' WHEN 1 THEN 'B
acb0: 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f 65  ' END.} {B}.do_e
acc0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
acd0: 70 72 2d 32 31 2e 34 2e 32 20 7b 0a 20 20 53 45  pr-21.4.2 {.  SE
ace0: 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 30  LECT CASE WHEN 0
acf0: 20 54 48 45 4e 20 27 41 27 20 57 48 45 4e 20 4e   THEN 'A' WHEN N
ad00: 55 4c 4c 20 54 48 45 4e 20 27 42 27 20 45 4c 53  ULL THEN 'B' ELS
ad10: 45 20 27 43 27 20 45 4e 44 0a 7d 20 7b 43 7d 0a  E 'C' END.} {C}.
ad20: 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  .# EVIDENCE-OF: 
ad30: 52 2d 33 38 36 32 30 2d 31 39 34 39 39 20 49 6e  R-38620-19499 In
ad40: 20 61 20 43 41 53 45 20 77 69 74 68 20 61 20 62   a CASE with a b
ad50: 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ase expression, 
ad60: 74 68 65 20 62 61 73 65 0a 23 20 65 78 70 72 65  the base.# expre
ad70: 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
ad80: 65 64 20 6a 75 73 74 20 6f 6e 63 65 20 61 6e 64  ed just once and
ad90: 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 63   the result is c
ada0: 6f 6d 70 61 72 65 64 20 61 67 61 69 6e 73 74 0a  ompared against.
adb0: 23 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e  # the evaluation
adc0: 20 6f 66 20 65 61 63 68 20 57 48 45 4e 20 65 78   of each WHEN ex
add0: 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 6c 65  pression from le
ade0: 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 23 0a 23  ft to right..#.#
adf0: 20 4e 6f 74 65 3a 20 54 68 69 73 20 74 65 73 74   Note: This test
ae00: 20 63 61 73 65 20 74 65 73 74 73 20 74 68 65 20   case tests the 
ae10: 22 65 76 61 6c 75 61 74 65 64 20 6a 75 73 74 20  "evaluated just 
ae20: 6f 6e 63 65 22 20 70 61 72 74 20 6f 66 20 74 68  once" part of th
ae30: 65 20 61 62 6f 76 65 0a 23 20 73 74 61 74 65 6d  e above.# statem
ae40: 65 6e 74 2e 20 54 65 73 74 73 20 61 73 73 6f 63  ent. Tests assoc
ae50: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  iated with the n
ae60: 65 78 74 20 74 77 6f 20 73 74 61 74 65 6d 65 6e  ext two statemen
ae70: 74 73 20 74 65 73 74 20 74 68 61 74 20 74 68 65  ts test that the
ae80: 0a 23 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 74  .# comparisons t
ae90: 61 6b 65 20 70 6c 61 63 65 2e 0a 23 0a 66 6f 72  ake place..#.for
aea0: 65 61 63 68 20 7b 61 20 62 20 63 7d 20 5b 6c 69  each {a b c} [li
aeb0: 73 74 20 5b 65 78 70 72 20 33 5d 20 5b 65 78 70  st [expr 3] [exp
aec0: 72 20 34 5d 20 5b 65 78 70 72 20 35 5d 5d 20 62  r 4] [expr 5]] b
aed0: 72 65 61 6b 0a 73 65 74 20 3a 3a 76 61 72 6c 69  reak.set ::varli
aee0: 73 74 20 5b 6c 69 73 74 5d 0a 64 6f 5f 65 78 65  st [list].do_exe
aef0: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
af00: 2d 32 32 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45  -22.1.1 {.  SELE
af10: 43 54 20 43 41 53 45 20 76 61 72 28 27 61 27 29  CT CASE var('a')
af20: 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27   WHEN 1 THEN 'A'
af30: 20 57 48 45 4e 20 32 20 54 48 45 4e 20 27 42 27   WHEN 2 THEN 'B'
af40: 20 57 48 45 4e 20 33 20 54 48 45 4e 20 27 43 27   WHEN 3 THEN 'C'
af50: 20 45 4e 44 0a 7d 20 7b 43 7d 0a 64 6f 5f 74 65   END.} {C}.do_te
af60: 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 31 2e 32  st e_expr-22.1.2
af70: 20 7b 20 73 65 74 20 3a 3a 76 61 72 6c 69 73 74   { set ::varlist
af80: 20 7d 20 7b 61 7d 0a 0a 23 20 45 56 49 44 45 4e   } {a}..# EVIDEN
af90: 43 45 2d 4f 46 3a 20 52 2d 30 37 36 36 37 2d 34  CE-OF: R-07667-4
afa0: 39 35 33 37 20 54 68 65 20 72 65 73 75 6c 74 20  9537 The result 
afb0: 6f 66 20 74 68 65 20 43 41 53 45 20 65 78 70 72  of the CASE expr
afc0: 65 73 73 69 6f 6e 20 69 73 20 74 68 65 0a 23 20  ession is the.# 
afd0: 65 76 61 6c 75 61 74 69 6f 6e 20 6f 66 20 74 68  evaluation of th
afe0: 65 20 54 48 45 4e 20 65 78 70 72 65 73 73 69 6f  e THEN expressio
aff0: 6e 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  n that correspon
b000: 64 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ds to the first 
b010: 57 48 45 4e 0a 23 20 65 78 70 72 65 73 73 69 6f  WHEN.# expressio
b020: 6e 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  n for which the 
b030: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 72  comparison is tr
b040: 75 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ue..#.do_execsql
b050: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e  _test e_expr-22.
b060: 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  2.1 {.  SELECT C
b070: 41 53 45 20 32 33 20 57 48 45 4e 20 31 20 54 48  ASE 23 WHEN 1 TH
b080: 45 4e 20 27 41 27 20 57 48 45 4e 20 32 33 20 54  EN 'A' WHEN 23 T
b090: 48 45 4e 20 27 42 27 20 57 48 45 4e 20 32 33 20  HEN 'B' WHEN 23 
b0a0: 54 48 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20 7b  THEN 'C' END.} {
b0b0: 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  B}.do_execsql_te
b0c0: 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 32 2e 32  st e_expr-22.2.2
b0d0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45   {.  SELECT CASE
b0e0: 20 31 20 57 48 45 4e 20 31 20 54 48 45 4e 20 27   1 WHEN 1 THEN '
b0f0: 41 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20  A' WHEN 23 THEN 
b100: 27 42 27 20 57 48 45 4e 20 32 33 20 54 48 45 4e  'B' WHEN 23 THEN
b110: 20 27 43 27 20 45 4e 44 0a 7d 20 7b 41 7d 0a 0a   'C' END.} {A}..
b120: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
b130: 2d 34 37 35 34 33 2d 33 32 31 34 35 20 4f 72 2c  -47543-32145 Or,
b140: 20 69 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   if none of the 
b150: 57 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 73  WHEN expressions
b160: 0a 23 20 65 76 61 6c 75 61 74 65 20 74 6f 20 61  .# evaluate to a
b170: 20 76 61 6c 75 65 20 65 71 75 61 6c 20 74 6f 20   value equal to 
b180: 74 68 65 20 62 61 73 65 20 65 78 70 72 65 73 73  the base express
b190: 69 6f 6e 2c 20 74 68 65 20 72 65 73 75 6c 74 20  ion, the result 
b1a0: 6f 66 0a 23 20 65 76 61 6c 75 61 74 69 6e 67 20  of.# evaluating 
b1b0: 74 68 65 20 45 4c 53 45 20 65 78 70 72 65 73 73  the ELSE express
b1c0: 69 6f 6e 2c 20 69 66 20 61 6e 79 2e 0a 23 0a 64  ion, if any..#.d
b1d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
b1e0: 5f 65 78 70 72 2d 32 32 2e 33 2e 31 20 7b 0a 20  _expr-22.3.1 {. 
b1f0: 20 53 45 4c 45 43 54 20 43 41 53 45 20 32 34 20   SELECT CASE 24 
b200: 57 48 45 4e 20 31 20 54 48 45 4e 20 27 41 27 20  WHEN 1 THEN 'A' 
b210: 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 42 27  WHEN 23 THEN 'B'
b220: 20 57 48 45 4e 20 32 33 20 54 48 45 4e 20 27 43   WHEN 23 THEN 'C
b230: 27 20 45 4c 53 45 20 27 44 27 20 45 4e 44 0a 7d  ' ELSE 'D' END.}
b240: 20 7b 44 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45   {D}..# EVIDENCE
b250: 2d 4f 46 3a 20 52 2d 35 34 37 32 31 2d 34 38 35  -OF: R-54721-485
b260: 35 37 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  57 If there is n
b270: 6f 20 45 4c 53 45 20 65 78 70 72 65 73 73 69 6f  o ELSE expressio
b280: 6e 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 0a 23 20  n and none of.# 
b290: 74 68 65 20 57 48 45 4e 20 65 78 70 72 65 73 73  the WHEN express
b2a0: 69 6f 6e 73 20 70 72 6f 64 75 63 65 20 61 20 72  ions produce a r
b2b0: 65 73 75 6c 74 20 65 71 75 61 6c 20 74 6f 20 74  esult equal to t
b2c0: 68 65 20 62 61 73 65 20 65 78 70 72 65 73 73 69  he base expressi
b2d0: 6f 6e 2c 0a 23 20 74 68 65 20 6f 76 65 72 61 6c  on,.# the overal
b2e0: 6c 20 72 65 73 75 6c 74 20 69 73 20 4e 55 4c 4c  l result is NULL
b2f0: 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ..#.do_execsql_t
b300: 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 34 2e  est e_expr-22.4.
b310: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  1 {.  SELECT CAS
b320: 45 20 32 34 20 57 48 45 4e 20 31 20 54 48 45 4e  E 24 WHEN 1 THEN
b330: 20 27 41 27 20 57 48 45 4e 20 32 33 20 54 48 45   'A' WHEN 23 THE
b340: 4e 20 27 42 27 20 57 48 45 4e 20 32 33 20 54 48  N 'B' WHEN 23 TH
b350: 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20 7b 7b 7d  EN 'C' END.} {{}
b360: 7d 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65 20 6e  }.db nullvalue n
b370: 75 6c 6c 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ull.do_execsql_t
b380: 65 73 74 20 65 5f 65 78 70 72 2d 32 32 2e 34 2e  est e_expr-22.4.
b390: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  2 {.  SELECT CAS
b3a0: 45 20 32 34 20 57 48 45 4e 20 31 20 54 48 45 4e  E 24 WHEN 1 THEN
b3b0: 20 27 41 27 20 57 48 45 4e 20 32 33 20 54 48 45   'A' WHEN 23 THE
b3c0: 4e 20 27 42 27 20 57 48 45 4e 20 32 33 20 54 48  N 'B' WHEN 23 TH
b3d0: 45 4e 20 27 43 27 20 45 4e 44 0a 7d 20 7b 6e 75  EN 'C' END.} {nu
b3e0: 6c 6c 7d 0a 64 62 20 6e 75 6c 6c 76 61 6c 75 65  ll}.db nullvalue
b3f0: 20 7b 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d   {}..# EVIDENCE-
b400: 4f 46 3a 20 52 2d 31 31 34 37 39 2d 36 32 37 37  OF: R-11479-6277
b410: 34 20 57 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  4 When comparing
b420: 20 61 20 62 61 73 65 20 65 78 70 72 65 73 73 69   a base expressi
b430: 6f 6e 20 61 67 61 69 6e 73 74 20 61 0a 23 20 57  on against a.# W
b440: 48 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  HEN expression, 
b450: 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69  the same collati
b460: 6e 67 20 73 65 71 75 65 6e 63 65 2c 20 61 66 66  ng sequence, aff
b470: 69 6e 69 74 79 2c 20 61 6e 64 0a 23 20 4e 55 4c  inity, and.# NUL
b480: 4c 2d 68 61 6e 64 6c 69 6e 67 20 72 75 6c 65 73  L-handling rules
b490: 20 61 70 70 6c 79 20 61 73 20 69 66 20 74 68 65   apply as if the
b4a0: 20 62 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e   base expression
b4b0: 20 61 6e 64 20 57 48 45 4e 0a 23 20 65 78 70 72   and WHEN.# expr
b4c0: 65 73 73 69 6f 6e 20 61 72 65 20 72 65 73 70 65  ession are respe
b4d0: 63 74 69 76 65 6c 79 20 74 68 65 20 6c 65 66 74  ctively the left
b4e0: 2d 20 61 6e 64 20 72 69 67 68 74 2d 68 61 6e 64  - and right-hand
b4f0: 20 6f 70 65 72 61 6e 64 73 20 6f 66 20 61 6e 20   operands of an 
b500: 3d 0a 23 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a  =.# operator..#.
b510: 70 72 6f 63 20 72 65 76 20 7b 73 74 72 7d 20 7b  proc rev {str} {
b520: 0a 20 20 73 65 74 20 72 65 74 20 22 22 0a 20 20  .  set ret "".  
b530: 73 65 74 20 63 68 61 72 73 20 5b 73 70 6c 69 74  set chars [split
b540: 20 24 73 74 72 5d 0a 20 20 66 6f 72 20 7b 73 65   $str].  for {se
b550: 74 20 69 20 5b 65 78 70 72 20 5b 6c 6c 65 6e 67  t i [expr [lleng
b560: 74 68 20 24 63 68 61 72 73 5d 2d 31 5d 7d 20 7b  th $chars]-1]} {
b570: 24 69 3e 3d 30 7d 20 7b 69 6e 63 72 20 69 20 2d  $i>=0} {incr i -
b580: 31 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20  1} {.    append 
b590: 72 65 74 20 5b 6c 69 6e 64 65 78 20 24 63 68 61  ret [lindex $cha
b5a0: 72 73 20 24 69 5d 0a 20 20 7d 0a 20 20 73 65 74  rs $i].  }.  set
b5b0: 20 72 65 74 0a 7d 0a 70 72 6f 63 20 72 65 76 65   ret.}.proc reve
b5c0: 72 73 65 20 7b 6c 68 73 20 72 68 73 7d 20 7b 0a  rse {lhs rhs} {.
b5d0: 20 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65    string compare
b5e0: 20 5b 72 65 76 20 24 6c 68 73 5d 20 5b 72 65 66   [rev $lhs] [ref
b5f0: 20 24 72 68 73 5d 0a 7d 0a 64 62 20 63 6f 6c 6c   $rhs].}.db coll
b600: 61 74 65 20 72 65 76 65 72 73 65 20 72 65 76 65  ate reverse reve
b610: 72 73 65 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  rse.do_execsql_t
b620: 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31 2e  est e_expr-23.1.
b630: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  1 {.  CREATE TAB
b640: 4c 45 20 74 31 28 0a 20 20 20 20 61 20 54 45 58  LE t1(.    a TEX
b650: 54 20 20 20 20 20 43 4f 4c 4c 41 54 45 20 4e 4f  T     COLLATE NO
b660: 43 41 53 45 2c 0a 20 20 20 20 62 20 20 20 20 20  CASE,.    b     
b670: 20 20 20 20 20 43 4f 4c 4c 41 54 45 20 52 45 56       COLLATE REV
b680: 45 52 53 45 2c 0a 20 20 20 20 63 20 49 4e 54 45  ERSE,.    c INTE
b690: 47 45 52 2c 0a 20 20 20 20 64 20 42 4c 4f 42 0a  GER,.    d BLOB.
b6a0: 20 20 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e    );.  INSERT IN
b6b0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 62  TO t1 VALUES('ab
b6c0: 63 27 2c 20 27 63 62 61 27 2c 20 35 35 2c 20 33  c', 'cba', 55, 3
b6d0: 34 2e 35 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78  4.5);.} {}.do_ex
b6e0: 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70  ecsql_test e_exp
b6f0: 72 2d 32 33 2e 31 2e 32 20 7b 0a 20 20 53 45 4c  r-23.1.2 {.  SEL
b700: 45 43 54 20 43 41 53 45 20 61 20 57 48 45 4e 20  ECT CASE a WHEN 
b710: 27 78 79 7a 27 20 54 48 45 4e 20 27 41 27 20 57  'xyz' THEN 'A' W
b720: 48 45 4e 20 27 41 62 43 27 20 54 48 45 4e 20 27  HEN 'AbC' THEN '
b730: 42 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d  B' END FROM t1.}
b740: 20 7b 42 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {B}.do_execsql_
b750: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31  test e_expr-23.1
b760: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .3 {.  SELECT CA
b770: 53 45 20 27 41 62 43 27 20 57 48 45 4e 20 27 61  SE 'AbC' WHEN 'a
b780: 62 63 27 20 54 48 45 4e 20 27 41 27 20 57 48 45  bc' THEN 'A' WHE
b790: 4e 20 61 20 54 48 45 4e 20 27 42 27 20 45 4e 44  N a THEN 'B' END
b7a0: 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 42 7d 0a 64   FROM t1.} {B}.d
b7b0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
b7c0: 5f 65 78 70 72 2d 32 33 2e 31 2e 34 20 7b 0a 20  _expr-23.1.4 {. 
b7d0: 20 53 45 4c 45 43 54 20 43 41 53 45 20 61 20 57   SELECT CASE a W
b7e0: 48 45 4e 20 62 20 54 48 45 4e 20 27 41 27 20 45  HEN b THEN 'A' E
b7f0: 4c 53 45 20 27 42 27 20 45 4e 44 20 46 52 4f 4d  LSE 'B' END FROM
b800: 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65   t1.} {B}.do_exe
b810: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
b820: 2d 32 33 2e 31 2e 35 20 7b 0a 20 20 53 45 4c 45  -23.1.5 {.  SELE
b830: 43 54 20 43 41 53 45 20 62 20 57 48 45 4e 20 61  CT CASE b WHEN a
b840: 20 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27   THEN 'A' ELSE '
b850: 42 27 20 45 4e 44 20 46 52 4f 4d 20 74 31 0a 7d  B' END FROM t1.}
b860: 20 7b 41 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {A}.do_execsql_
b870: 74 65 73 74 20 65 5f 65 78 70 72 2d 32 33 2e 31  test e_expr-23.1
b880: 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41  .6 {.  SELECT CA
b890: 53 45 20 35 35 20 57 48 45 4e 20 27 35 35 27 20  SE 55 WHEN '55' 
b8a0: 54 48 45 4e 20 27 41 27 20 45 4c 53 45 20 27 42  THEN 'A' ELSE 'B
b8b0: 27 20 45 4e 44 0a 7d 20 7b 42 7d 0a 64 6f 5f 65  ' END.} {B}.do_e
b8c0: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
b8d0: 70 72 2d 32 33 2e 31 2e 37 20 7b 0a 20 20 53 45  pr-23.1.7 {.  SE
b8e0: 4c 45 43 54 20 43 41 53 45 20 63 20 57 48 45 4e  LECT CASE c WHEN
b8f0: 20 27 35 35 27 20 54 48 45 4e 20 27 41 27 20 45   '55' THEN 'A' E
b900: 4c 53 45 20 27 42 27 20 45 4e 44 20 46 52 4f 4d  LSE 'B' END FROM
b910: 20 74 31 0a 7d 20 7b 41 7d 0a 64 6f 5f 65 78 65   t1.} {A}.do_exe
b920: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
b930: 2d 32 33 2e 31 2e 38 20 7b 0a 20 20 53 45 4c 45  -23.1.8 {.  SELE
b940: 43 54 20 43 41 53 45 20 27 33 34 2e 35 27 20 57  CT CASE '34.5' W
b950: 48 45 4e 20 64 20 54 48 45 4e 20 27 41 27 20 45  HEN d THEN 'A' E
b960: 4c 53 45 20 27 42 27 20 45 4e 44 20 46 52 4f 4d  LSE 'B' END FROM
b970: 20 74 31 0a 7d 20 7b 42 7d 0a 64 6f 5f 65 78 65   t1.} {B}.do_exe
b980: 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72  csql_test e_expr
b990: 2d 32 33 2e 31 2e 39 20 7b 0a 20 20 53 45 4c 45  -23.1.9 {.  SELE
b9a0: 43 54 20 43 41 53 45 20 4e 55 4c 4c 20 57 48 45  CT CASE NULL WHE
b9b0: 4e 20 4e 55 4c 4c 20 54 48 45 4e 20 27 41 27 20  N NULL THEN 'A' 
b9c0: 45 4c 53 45 20 27 42 27 20 45 4e 44 0a 7d 20 7b  ELSE 'B' END.} {
b9d0: 42 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45 2d 4f  B}..# EVIDENCE-O
b9e0: 46 3a 20 52 2d 33 37 33 30 34 2d 33 39 34 30 35  F: R-37304-39405
b9f0: 20 49 66 20 74 68 65 20 62 61 73 65 20 65 78 70   If the base exp
ba00: 72 65 73 73 69 6f 6e 20 69 73 20 4e 55 4c 4c 20  ression is NULL 
ba10: 74 68 65 6e 20 74 68 65 0a 23 20 72 65 73 75 6c  then the.# resul
ba20: 74 20 6f 66 20 74 68 65 20 43 41 53 45 20 69 73  t of the CASE is
ba30: 20 61 6c 77 61 79 73 20 74 68 65 20 72 65 73 75   always the resu
ba40: 6c 74 20 6f 66 20 65 76 61 6c 75 61 74 69 6e 67  lt of evaluating
ba50: 20 74 68 65 20 45 4c 53 45 0a 23 20 65 78 70 72   the ELSE.# expr
ba60: 65 73 73 69 6f 6e 20 69 66 20 69 74 20 65 78 69  ession if it exi
ba70: 73 74 73 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  sts, or NULL if 
ba80: 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 23 0a 64  it does not..#.d
ba90: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 65  o_execsql_test e
baa0: 5f 65 78 70 72 2d 32 34 2e 31 2e 31 20 7b 0a 20  _expr-24.1.1 {. 
bab0: 20 53 45 4c 45 43 54 20 43 41 53 45 20 4e 55 4c   SELECT CASE NUL
bac0: 4c 20 57 48 45 4e 20 27 61 62 63 27 20 54 48 45  L WHEN 'abc' THE
bad0: 4e 20 27 41 27 20 57 48 45 4e 20 27 64 65 66 27  N 'A' WHEN 'def'
bae0: 20 54 48 45 4e 20 27 42 27 20 45 4e 44 3b 0a 7d   THEN 'B' END;.}
baf0: 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c   {{}}.do_execsql
bb00: 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 34 2e  _test e_expr-24.
bb10: 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 43  1.2 {.  SELECT C
bb20: 41 53 45 20 4e 55 4c 4c 20 57 48 45 4e 20 27 61  ASE NULL WHEN 'a
bb30: 62 63 27 20 54 48 45 4e 20 27 41 27 20 57 48 45  bc' THEN 'A' WHE
bb40: 4e 20 27 64 65 66 27 20 54 48 45 4e 20 27 42 27  N 'def' THEN 'B'
bb50: 20 45 4c 53 45 20 27 43 27 20 45 4e 44 3b 0a 7d   ELSE 'C' END;.}
bb60: 20 7b 43 7d 0a 0a 23 20 45 56 49 44 45 4e 43 45   {C}..# EVIDENCE
bb70: 2d 4f 46 3a 20 52 2d 35 36 32 38 30 2d 31 37 33  -OF: R-56280-173
bb80: 36 39 20 42 6f 74 68 20 66 6f 72 6d 73 20 6f 66  69 Both forms of
bb90: 20 74 68 65 20 43 41 53 45 20 65 78 70 72 65 73   the CASE expres
bba0: 73 69 6f 6e 20 75 73 65 20 6c 61 7a 79 2c 0a 23  sion use lazy,.#
bbb0: 20 6f 72 20 73 68 6f 72 74 2d 63 69 72 63 75 69   or short-circui
bbc0: 74 2c 20 65 76 61 6c 75 61 74 69 6f 6e 2e 0a 23  t, evaluation..#
bbd0: 0a 73 65 74 20 76 61 72 6c 69 73 74 20 5b 6c 69  .set varlist [li
bbe0: 73 74 5d 0a 66 6f 72 65 61 63 68 20 7b 61 20 62  st].foreach {a b
bbf0: 20 63 7d 20 7b 30 20 31 20 30 7d 20 62 72 65 61   c} {0 1 0} brea
bc00: 6b 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  k.do_execsql_tes
bc10: 74 20 65 5f 65 78 70 72 2d 32 35 2e 31 2e 31 20  t e_expr-25.1.1 
bc20: 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20  {.  SELECT CASE 
bc30: 57 48 45 4e 20 76 61 72 28 27 61 27 29 20 54 48  WHEN var('a') TH
bc40: 45 4e 20 27 41 27 20 0a 20 20 20 20 20 20 20 20  EN 'A' .        
bc50: 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28 27        WHEN var('
bc60: 62 27 29 20 54 48 45 4e 20 27 42 27 20 0a 20 20  b') THEN 'B' .  
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e              WHEN
bc80: 20 76 61 72 28 27 63 27 29 20 54 48 45 4e 20 27   var('c') THEN '
bc90: 43 27 20 0a 20 20 45 4e 44 0a 7d 20 7b 42 7d 0a  C' .  END.} {B}.
bca0: 64 6f 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  do_test e_expr-2
bcb0: 35 2e 31 2e 32 20 7b 20 73 65 74 20 3a 3a 76 61  5.1.2 { set ::va
bcc0: 72 6c 69 73 74 20 7d 20 7b 61 20 62 7d 0a 73 65  rlist } {a b}.se
bcd0: 74 20 76 61 72 6c 69 73 74 20 5b 6c 69 73 74 5d  t varlist [list]
bce0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
bcf0: 20 65 5f 65 78 70 72 2d 32 35 2e 31 2e 33 20 7b   e_expr-25.1.3 {
bd00: 0a 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 27  .  SELECT CASE '
bd10: 30 27 20 57 48 45 4e 20 76 61 72 28 27 61 27 29  0' WHEN var('a')
bd20: 20 54 48 45 4e 20 27 41 27 20 0a 20 20 20 20 20   THEN 'A' .     
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
bd40: 4e 20 76 61 72 28 27 62 27 29 20 54 48 45 4e 20  N var('b') THEN 
bd50: 27 42 27 20 0a 20 20 20 20 20 20 20 20 20 20 20  'B' .           
bd60: 20 20 20 20 20 20 20 57 48 45 4e 20 76 61 72 28         WHEN var(
bd70: 27 63 27 29 20 54 48 45 4e 20 27 43 27 20 0a 20  'c') THEN 'C' . 
bd80: 20 45 4e 44 0a 7d 20 7b 41 7d 0a 64 6f 5f 74 65   END.} {A}.do_te
bd90: 73 74 20 65 5f 65 78 70 72 2d 32 35 2e 31 2e 34  st e_expr-25.1.4
bda0: 20 7b 20 73 65 74 20 3a 3a 76 61 72 6c 69 73 74   { set ::varlist
bdb0: 20 7d 20 7b 61 7d 0a 0a 23 20 45 56 49 44 45 4e   } {a}..# EVIDEN
bdc0: 43 45 2d 4f 46 3a 20 52 2d 33 34 37 37 33 2d 36  CE-OF: R-34773-6
bdd0: 32 32 35 33 20 54 68 65 20 6f 6e 6c 79 20 64 69  2253 The only di
bde0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
bdf0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 23   the following.#
be00: 20 74 77 6f 20 43 41 53 45 20 65 78 70 72 65 73   two CASE expres
be10: 73 69 6f 6e 73 20 69 73 20 74 68 61 74 20 74 68  sions is that th
be20: 65 20 78 20 65 78 70 72 65 73 73 69 6f 6e 20 69  e x expression i
be30: 73 20 65 76 61 6c 75 61 74 65 64 20 65 78 61 63  s evaluated exac
be40: 74 6c 79 0a 23 20 6f 6e 63 65 20 69 6e 20 74 68  tly.# once in th
be50: 65 20 66 69 72 73 74 20 65 78 61 6d 70 6c 65 20  e first example 
be60: 62 75 74 20 6d 69 67 68 74 20 62 65 20 65 76 61  but might be eva
be70: 6c 75 61 74 65 64 20 6d 75 6c 74 69 70 6c 65 20  luated multiple 
be80: 74 69 6d 65 73 20 69 6e 20 74 68 65 0a 23 20 73  times in the.# s
be90: 65 63 6f 6e 64 3a 20 43 41 53 45 20 78 20 57 48  econd: CASE x WH
bea0: 45 4e 20 77 31 20 54 48 45 4e 20 72 31 20 57 48  EN w1 THEN r1 WH
beb0: 45 4e 20 77 32 20 54 48 45 4e 20 72 32 20 45 4c  EN w2 THEN r2 EL
bec0: 53 45 20 72 33 20 45 4e 44 20 43 41 53 45 20 57  SE r3 END CASE W
bed0: 48 45 4e 0a 23 20 78 3d 77 31 20 54 48 45 4e 20  HEN.# x=w1 THEN 
bee0: 72 31 20 57 48 45 4e 20 78 3d 77 32 20 54 48 45  r1 WHEN x=w2 THE
bef0: 4e 20 72 32 20 45 4c 53 45 20 72 33 20 45 4e 44  N r2 ELSE r3 END
bf00: 0a 23 0a 70 72 6f 63 20 63 65 76 61 6c 20 7b 78  .#.proc ceval {x
bf10: 7d 20 7b 0a 20 20 69 6e 63 72 20 3a 3a 65 76 61  } {.  incr ::eva
bf20: 6c 63 6f 75 6e 74 0a 20 20 72 65 74 75 72 6e 20  lcount.  return 
bf30: 24 78 0a 7d 0a 64 62 20 66 75 6e 63 20 63 65 76  $x.}.db func cev
bf40: 61 6c 20 63 65 76 61 6c 0a 73 65 74 20 3a 3a 65  al ceval.set ::e
bf50: 76 61 6c 63 6f 75 6e 74 20 30 0a 0a 64 6f 5f 65  valcount 0..do_e
bf60: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
bf70: 70 72 2d 32 36 2e 31 2e 31 20 7b 0a 20 20 43 52  pr-26.1.1 {.  CR
bf80: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c  EATE TABLE t2(x,
bf90: 20 77 31 2c 20 72 31 2c 20 77 32 2c 20 72 32 2c   w1, r1, w2, r2,
bfa0: 20 72 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49   r3);.  INSERT I
bfb0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
bfc0: 20 31 2c 20 27 52 31 27 2c 20 32 2c 20 27 52 32   1, 'R1', 2, 'R2
bfd0: 27 2c 20 27 52 33 27 29 3b 0a 20 20 49 4e 53 45  ', 'R3');.  INSE
bfe0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
bff0: 53 28 32 2c 20 31 2c 20 27 52 31 27 2c 20 32 2c  S(2, 1, 'R1', 2,
c000: 20 27 52 32 27 2c 20 27 52 33 27 29 3b 0a 20 20   'R2', 'R3');.  
c010: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
c020: 41 4c 55 45 53 28 33 2c 20 31 2c 20 27 52 31 27  ALUES(3, 1, 'R1'
c030: 2c 20 32 2c 20 27 52 32 27 2c 20 27 52 33 27 29  , 2, 'R2', 'R3')
c040: 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71  ;.} {}.do_execsq
c050: 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32 36  l_test e_expr-26
c060: 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.2 {.  SELECT 
c070: 43 41 53 45 20 78 20 57 48 45 4e 20 77 31 20 54  CASE x WHEN w1 T
c080: 48 45 4e 20 72 31 20 57 48 45 4e 20 77 32 20 54  HEN r1 WHEN w2 T
c090: 48 45 4e 20 72 32 20 45 4c 53 45 20 72 33 20 45  HEN r2 ELSE r3 E
c0a0: 4e 44 20 46 52 4f 4d 20 74 32 0a 7d 20 7b 52 31  ND FROM t2.} {R1
c0b0: 20 52 32 20 52 33 7d 0a 64 6f 5f 65 78 65 63 73   R2 R3}.do_execs
c0c0: 71 6c 5f 74 65 73 74 20 65 5f 65 78 70 72 2d 32  ql_test e_expr-2
c0d0: 36 2e 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  6.1.3 {.  SELECT
c0e0: 20 43 41 53 45 20 57 48 45 4e 20 78 3d 77 31 20   CASE WHEN x=w1 
c0f0: 54 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 77  THEN r1 WHEN x=w
c100: 32 20 54 48 45 4e 20 72 32 20 45 4c 53 45 20 72  2 THEN r2 ELSE r
c110: 33 20 45 4e 44 20 46 52 4f 4d 20 74 32 0a 7d 20  3 END FROM t2.} 
c120: 7b 52 31 20 52 32 20 52 33 7d 0a 0a 64 6f 5f 65  {R1 R2 R3}..do_e
c130: 78 65 63 73 71 6c 5f 74 65 73 74 20 65 5f 65 78  xecsql_test e_ex
c140: 70 72 2d 32 36 2e 31 2e 34 20 7b 0a 20 20 53 45  pr-26.1.4 {.  SE
c150: 4c 45 43 54 20 43 41 53 45 20 63 65 76 61 6c 28  LECT CASE ceval(
c160: 78 29 20 57 48 45 4e 20 77 31 20 54 48 45 4e 20  x) WHEN w1 THEN 
c170: 72 31 20 57 48 45 4e 20 77 32 20 54 48 45 4e 20  r1 WHEN w2 THEN 
c180: 72 32 20 45 4c 53 45 20 72 33 20 45 4e 44 20 46  r2 ELSE r3 END F
c190: 52 4f 4d 20 74 32 0a 7d 20 7b 52 31 20 52 32 20  ROM t2.} {R1 R2 
c1a0: 52 33 7d 0a 64 6f 5f 74 65 73 74 20 65 5f 65 78  R3}.do_test e_ex
c1b0: 70 72 2d 32 36 2e 31 2e 35 20 7b 20 73 65 74 20  pr-26.1.5 { set 
c1c0: 3a 3a 65 76 61 6c 63 6f 75 6e 74 20 7d 20 7b 33  ::evalcount } {3
c1d0: 7d 0a 73 65 74 20 3a 3a 65 76 61 6c 63 6f 75 6e  }.set ::evalcoun
c1e0: 74 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  t 0.do_execsql_t
c1f0: 65 73 74 20 65 5f 65 78 70 72 2d 32 36 2e 31 2e  est e_expr-26.1.
c200: 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 43 41 53  6 {.  SELECT CAS
c210: 45 20 0a 20 20 20 20 57 48 45 4e 20 63 65 76 61  E .    WHEN ceva
c220: 6c 28 78 29 3d 77 31 20 54 48 45 4e 20 72 31 20  l(x)=w1 THEN r1 
c230: 0a 20 20 20 20 57 48 45 4e 20 63 65 76 61 6c 28  .    WHEN ceval(
c240: 78 29 3d 77 32 20 54 48 45 4e 20 72 32 20 0a 20  x)=w2 THEN r2 . 
c250: 20 20 20 45 4c 53 45 20 72 33 20 45 4e 44 20 0a     ELSE r3 END .
c260: 20 20 46 52 4f 4d 20 74 32 0a 7d 20 7b 52 31 20    FROM t2.} {R1 
c270: 52 32 20 52 33 7d 0a 64 6f 5f 74 65 73 74 20 65  R2 R3}.do_test e
c280: 5f 65 78 70 72 2d 32 36 2e 31 2e 36 20 7b 20 73  _expr-26.1.6 { s
c290: 65 74 20 3a 3a 65 76 61 6c 63 6f 75 6e 74 20 7d  et ::evalcount }
c2a0: 20 7b 35 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73   {5}..finish_tes
c2b0: 74 0a                                            t.