gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/e_expr.test (about)

     1  # 2010 July 16
     2  #
     3  # The author disclaims copyright to this source code.  In place of
     4  # a legal notice, here is a blessing:
     5  #
     6  #    May you do good and not evil.
     7  #    May you find forgiveness for yourself and forgive others.
     8  #    May you share freely, never taking more than you give.
     9  #
    10  #***********************************************************************
    11  #
    12  # This file implements tests to verify that the "testable statements" in 
    13  # the lang_expr.html document are correct.
    14  #
    15  
    16  set testdir [file dirname $argv0]
    17  source $testdir/tester.tcl
    18  source $testdir/malloc_common.tcl
    19  
    20  ifcapable !compound {
    21    finish_test
    22    return
    23  }
    24  
    25  proc do_expr_test {tn expr type value} {
    26    uplevel do_execsql_test $tn [list "SELECT typeof($expr), $expr"] [
    27      list [list $type $value]
    28    ]
    29  }
    30  
    31  proc do_qexpr_test {tn expr value} {
    32    uplevel do_execsql_test $tn [list "SELECT quote($expr)"] [list $value]
    33  }
    34  
    35  # Set up three global variables:
    36  #
    37  #   ::opname         An array mapping from SQL operator to an easy to parse
    38  #                    name. The names are used as part of test case names.
    39  #
    40  #   ::opprec         An array mapping from SQL operator to a numeric
    41  #                    precedence value. Operators that group more tightly
    42  #                    have lower numeric precedences.
    43  #
    44  #   ::oplist         A list of all SQL operators supported by SQLite.
    45  #
    46  foreach {op opn} {
    47        ||   cat     *   mul       /  div       %     mod       +      add
    48        -    sub     <<  lshift    >> rshift    &     bitand    |      bitor
    49        <    less    <=  lesseq    >  more      >=    moreeq    =      eq1
    50        ==   eq2     <>  ne1       != ne2       IS    is        LIKE   like
    51        GLOB glob    AND and       OR or        MATCH match     REGEXP regexp
    52        {IS NOT} isnt
    53  } {
    54    set ::opname($op) $opn
    55  }
    56  set oplist [list]
    57  foreach {prec opl} {
    58    1   ||
    59    2   {* / %}
    60    3   {+ -}
    61    4   {<< >> & |}
    62    5   {< <= > >=}
    63    6   {= == != <> IS {IS NOT} LIKE GLOB MATCH REGEXP}
    64    7   AND
    65    8   OR
    66  } {
    67    foreach op $opl { 
    68      set ::opprec($op) $prec 
    69      lappend oplist $op
    70    }
    71  }
    72  
    73  
    74  # Hook in definitions of MATCH and REGEX. The following implementations
    75  # cause MATCH and REGEX to behave similarly to the == operator.
    76  #
    77  proc matchfunc {a b} { return [expr {$a==$b}] }
    78  proc regexfunc {a b} { return [expr {$a==$b}] }
    79  db func match  -argcount 2 matchfunc
    80  db func regexp -argcount 2 regexfunc
    81  
    82  #-------------------------------------------------------------------------
    83  # Test cases e_expr-1.* attempt to verify that all binary operators listed
    84  # in the documentation exist and that the relative precedences of the
    85  # operators are also as the documentation suggests.
    86  #
    87  # X-EVIDENCE-OF: R-15514-65163 SQLite understands the following binary
    88  # operators, in order from highest to lowest precedence: || * / % + -
    89  # << >> & | < <= > >= = == != <> IS IS
    90  # NOT IN LIKE GLOB MATCH REGEXP AND OR
    91  #
    92  # X-EVIDENCE-OF: R-38759-38789 Operators IS and IS NOT have the same
    93  # precedence as =.
    94  #
    95  
    96  unset -nocomplain untested
    97  foreach op1 $oplist {
    98    foreach op2 $oplist {
    99      set untested($op1,$op2) 1
   100      foreach {tn A B C} {
   101         1     22   45    66
   102         2      0    0     0
   103         3      0    0     1
   104         4      0    1     0
   105         5      0    1     1
   106         6      1    0     0
   107         7      1    0     1
   108         8      1    1     0
   109         9      1    1     1
   110        10      5    6     1
   111        11      1    5     6
   112        12      1    5     5
   113        13      5    5     1
   114  
   115        14      5    2     1
   116        15      1    4     1
   117        16     -1    0     1
   118        17      0    1    -1
   119  
   120      } {
   121        set testname "e_expr-1.$opname($op1).$opname($op2).$tn"
   122  
   123        # If $op2 groups more tightly than $op1, then the result
   124        # of executing $sql1 whould be the same as executing $sql3.
   125        # If $op1 groups more tightly, or if $op1 and $op2 have 
   126        # the same precedence, then executing $sql1 should return
   127        # the same value as $sql2.
   128        #
   129        set sql1 "SELECT $A $op1 $B $op2 $C"
   130        set sql2 "SELECT ($A $op1 $B) $op2 $C"
   131        set sql3 "SELECT $A $op1 ($B $op2 $C)"
   132  
   133        set a2 [db one $sql2]
   134        set a3 [db one $sql3]
   135  
   136        do_execsql_test $testname $sql1 [list [
   137          if {$opprec($op2) < $opprec($op1)} {set a3} {set a2}
   138        ]]
   139        if {$a2 != $a3} { unset -nocomplain untested($op1,$op2) }
   140      }
   141    }
   142  }
   143  
   144  foreach op {* AND OR + || & |} { unset untested($op,$op) }
   145  unset untested(+,-)  ;#       Since    (a+b)-c == a+(b-c)
   146  unset untested(*,<<) ;#       Since    (a*b)<<c == a*(b<<c)
   147  
   148  do_test e_expr-1.1 { array names untested } {}
   149  
   150  # At one point, test 1.2.2 was failing. Instead of the correct result, it
   151  # was returning {1 1 0}. This would seem to indicate that LIKE has the
   152  # same precedence as '<'. Which is incorrect. It has lower precedence.
   153  #
   154  do_execsql_test e_expr-1.2.1 { 
   155    SELECT 0 < 2 LIKE 1,   (0 < 2) LIKE 1,   0 < (2 LIKE 1)
   156  } {1 1 0}
   157  do_execsql_test e_expr-1.2.2 { 
   158    SELECT 0 LIKE 0 < 2,   (0 LIKE 0) < 2,   0 LIKE (0 < 2)
   159  } {0 1 0}
   160  
   161  # Showing that LIKE and == have the same precedence
   162  #
   163  do_execsql_test e_expr-1.2.3 { 
   164    SELECT 2 LIKE 2 == 1,   (2 LIKE 2) == 1,    2 LIKE (2 == 1)
   165  } {1 1 0}
   166  do_execsql_test e_expr-1.2.4 { 
   167    SELECT 2 == 2 LIKE 1,   (2 == 2) LIKE 1,    2 == (2 LIKE 1)
   168  } {1 1 0}
   169  
   170  # Showing that < groups more tightly than == (< has higher precedence). 
   171  #
   172  do_execsql_test e_expr-1.2.5 { 
   173    SELECT 0 < 2 == 1,   (0 < 2) == 1,   0 < (2 == 1)
   174  } {1 1 0}
   175  do_execsql_test e_expr-1.6 { 
   176    SELECT 0 == 0 < 2,   (0 == 0) < 2,   0 == (0 < 2)
   177  } {0 1 0}
   178  
   179  #-------------------------------------------------------------------------
   180  # Check that the four unary prefix operators mentioned in the 
   181  # documentation exist.
   182  #
   183  # X-EVIDENCE-OF: R-13958-53419 Supported unary prefix operators are these:
   184  # - + ~ NOT
   185  #
   186  do_execsql_test e_expr-2.1 { SELECT -   10   } {-10}
   187  do_execsql_test e_expr-2.2 { SELECT +   10   } {10}
   188  do_execsql_test e_expr-2.3 { SELECT ~   10   } {-11}
   189  do_execsql_test e_expr-2.4 { SELECT NOT 10   } {0}
   190  
   191  #-------------------------------------------------------------------------
   192  # Tests for the two statements made regarding the unary + operator.
   193  #
   194  # EVIDENCE-OF: R-53670-03373 The unary operator + is a no-op.
   195  #
   196  # EVIDENCE-OF: R-19480-30968 It can be applied to strings, numbers,
   197  # blobs or NULL and it always returns a result with the same value as
   198  # the operand.
   199  #
   200  foreach {tn literal type} {
   201    1     'helloworld'   text
   202    2     45             integer
   203    3     45.2           real
   204    4     45.0           real
   205    5     X'ABCDEF'      blob
   206    6     NULL           null
   207  } {
   208    set sql " SELECT quote( + $literal ), typeof( + $literal) "
   209    do_execsql_test e_expr-3.$tn $sql [list $literal $type]
   210  }
   211  
   212  #-------------------------------------------------------------------------
   213  # Check that both = and == are both acceptable as the "equals" operator.
   214  # Similarly, either != or <> work as the not-equals operator.
   215  #
   216  # EVIDENCE-OF: R-03679-60639 Equals can be either = or ==.
   217  #
   218  # EVIDENCE-OF: R-30082-38996 The non-equals operator can be either != or
   219  # <>.
   220  #
   221  foreach {tn literal different} {
   222    1   'helloworld'  '12345'
   223    2   22            23
   224    3   'xyz'         X'78797A'
   225    4   X'78797A00'   'xyz'
   226  } {
   227    do_execsql_test e_expr-4.$tn "
   228      SELECT $literal  = $literal,   $literal == $literal,
   229             $literal  = $different, $literal == $different,
   230             $literal  = NULL,       $literal == NULL,
   231             $literal != $literal,   $literal <> $literal,
   232             $literal != $different, $literal <> $different,
   233             $literal != NULL,       $literal != NULL
   234  
   235    " {1 1 0 0 {} {} 0 0 1 1 {} {}}
   236  }
   237  
   238  #-------------------------------------------------------------------------
   239  # Test the || operator.
   240  #
   241  # EVIDENCE-OF: R-44409-62641 The || operator is "concatenate" - it joins
   242  # together the two strings of its operands.
   243  #
   244  foreach {tn a b} {
   245    1   'helloworld'  '12345'
   246    2   22            23
   247  } {
   248    set as [db one "SELECT $a"]
   249    set bs [db one "SELECT $b"]
   250    
   251    do_execsql_test e_expr-5.$tn "SELECT $a || $b" [list "${as}${bs}"]
   252  }
   253  
   254  #-------------------------------------------------------------------------
   255  # Test the % operator.
   256  #
   257  # EVIDENCE-OF: R-53431-59159 The % operator casts both of its operands
   258  # to type INTEGER and then computes the remainder after dividing the
   259  # left integer by the right integer.
   260  #
   261  do_execsql_test e_expr-6.1 {SELECT  72%5}  {2}
   262  do_execsql_test e_expr-6.2 {SELECT  72%-5} {2}
   263  do_execsql_test e_expr-6.3 {SELECT -72%-5} {-2}
   264  do_execsql_test e_expr-6.4 {SELECT -72%5}  {-2}
   265  do_execsql_test e_expr-6.5 {SELECT 72.35%5} {2.0}
   266  
   267  #-------------------------------------------------------------------------
   268  # EVIDENCE-OF: R-15904-00746 The result of any binary operator is either
   269  # a numeric value or NULL, except for the || concatenation operator, and
   270  # the -> and ->> extract operators which evaluate to either
   271  # NULL or a text value.
   272  #
   273  set literals {
   274    1 'abc'        2 'hexadecimal'       3 ''
   275    4 123          5 -123                6 0
   276    7 123.4        8 0.0                 9 -123.4
   277   10 X'ABCDEF'   11 X''                12 X'0000'
   278   13     NULL
   279  }
   280  foreach op $oplist {
   281    foreach {n1 rhs} $literals { 
   282    foreach {n2 lhs} $literals {
   283  
   284      set t [db one " SELECT typeof($lhs $op $rhs) "]
   285      do_test e_expr-7.$opname($op).$n1.$n2 {
   286        expr {
   287             ($op=="||" && ($t == "text" || $t == "null"))
   288          || ($op!="||" && ($t == "integer" || $t == "real" || $t == "null"))
   289        }
   290      } 1
   291  
   292    }}
   293  }
   294  
   295  #-------------------------------------------------------------------------
   296  # Test the IS and IS NOT operators.
   297  #
   298  # EVIDENCE-OF: R-24731-45773 The IS and IS NOT operators work like = and
   299  # != except when one or both of the operands are NULL.
   300  #
   301  # EVIDENCE-OF: R-06325-15315 In this case, if both operands are NULL,
   302  # then the IS operator evaluates to 1 (true) and the IS NOT operator
   303  # evaluates to 0 (false).
   304  #
   305  # EVIDENCE-OF: R-19812-36779 If one operand is NULL and the other is
   306  # not, then the IS operator evaluates to 0 (false) and the IS NOT
   307  # operator is 1 (true).
   308  #
   309  # EVIDENCE-OF: R-61975-13410 It is not possible for an IS or IS NOT
   310  # expression to evaluate to NULL.
   311  #
   312  do_execsql_test e_expr-8.1.1  { SELECT NULL IS     NULL } {1}
   313  do_execsql_test e_expr-8.1.2  { SELECT 'ab' IS     NULL } {0}
   314  do_execsql_test e_expr-8.1.3  { SELECT NULL IS     'ab' } {0}
   315  do_execsql_test e_expr-8.1.4  { SELECT 'ab' IS     'ab' } {1}
   316  do_execsql_test e_expr-8.1.5  { SELECT NULL ==     NULL } {{}}
   317  do_execsql_test e_expr-8.1.6  { SELECT 'ab' ==     NULL } {{}}
   318  do_execsql_test e_expr-8.1.7  { SELECT NULL ==     'ab' } {{}}
   319  do_execsql_test e_expr-8.1.8  { SELECT 'ab' ==     'ab' } {1}
   320  do_execsql_test e_expr-8.1.9  { SELECT NULL IS NOT NULL } {0}
   321  do_execsql_test e_expr-8.1.10 { SELECT 'ab' IS NOT NULL } {1}
   322  do_execsql_test e_expr-8.1.11 { SELECT NULL IS NOT 'ab' } {1}
   323  do_execsql_test e_expr-8.1.12 { SELECT 'ab' IS NOT 'ab' } {0}
   324  do_execsql_test e_expr-8.1.13 { SELECT NULL !=     NULL } {{}}
   325  do_execsql_test e_expr-8.1.14 { SELECT 'ab' !=     NULL } {{}}
   326  do_execsql_test e_expr-8.1.15 { SELECT NULL !=     'ab' } {{}}
   327  do_execsql_test e_expr-8.1.16 { SELECT 'ab' !=     'ab' } {0}
   328  
   329  foreach {n1 rhs} $literals { 
   330    foreach {n2 lhs} $literals {
   331      if {$rhs!="NULL" && $lhs!="NULL"} {
   332        set eq [execsql "SELECT $lhs = $rhs, $lhs != $rhs"]
   333      } else {
   334        set eq [list [expr {$lhs=="NULL" && $rhs=="NULL"}] \
   335                     [expr {$lhs!="NULL" || $rhs!="NULL"}]
   336        ]
   337      }
   338      set test e_expr-8.2.$n1.$n2
   339      do_execsql_test $test.1 "SELECT $lhs IS $rhs, $lhs IS NOT $rhs" $eq
   340      do_execsql_test $test.2 "
   341        SELECT ($lhs IS $rhs) IS NULL, ($lhs IS NOT $rhs) IS NULL
   342      " {0 0}
   343    }
   344  }
   345  
   346  #-------------------------------------------------------------------------
   347  # Run some tests on the COLLATE "unary postfix operator".
   348  #
   349  # This collation sequence reverses both arguments before using 
   350  # [string compare] to compare them. For example, when comparing the
   351  # strings 'one' and 'four', return the result of:
   352  #   
   353  #   string compare eno ruof
   354  #
   355  proc reverse_str {zStr} {
   356    set out ""
   357    foreach c [split $zStr {}] { set out "${c}${out}" }
   358    set out
   359  }
   360  proc reverse_collate {zLeft zRight} {
   361    string compare [reverse_str $zLeft] [reverse_str $zRight]
   362  }
   363  db collate reverse reverse_collate
   364  
   365  # EVIDENCE-OF: R-59577-33471 The COLLATE operator is a unary postfix
   366  # operator that assigns a collating sequence to an expression.
   367  #
   368  # X-EVIDENCE-OF: R-36231-30731 The COLLATE operator has a higher
   369  # precedence (binds more tightly) than any binary operator and any unary
   370  # prefix operator except "~".
   371  #
   372  do_execsql_test e_expr-9.1 { SELECT  'abcd' < 'bbbb'    COLLATE reverse } 0
   373  do_execsql_test e_expr-9.2 { SELECT ('abcd' < 'bbbb')   COLLATE reverse } 1
   374  do_execsql_test e_expr-9.3 { SELECT  'abcd' <= 'bbbb'   COLLATE reverse } 0
   375  do_execsql_test e_expr-9.4 { SELECT ('abcd' <= 'bbbb')  COLLATE reverse } 1
   376  
   377  do_execsql_test e_expr-9.5 { SELECT  'abcd' > 'bbbb'    COLLATE reverse } 1
   378  do_execsql_test e_expr-9.6 { SELECT ('abcd' > 'bbbb')   COLLATE reverse } 0
   379  do_execsql_test e_expr-9.7 { SELECT  'abcd' >= 'bbbb'   COLLATE reverse } 1
   380  do_execsql_test e_expr-9.8 { SELECT ('abcd' >= 'bbbb')  COLLATE reverse } 0
   381  
   382  do_execsql_test e_expr-9.10 { SELECT  'abcd' =  'ABCD'  COLLATE nocase } 1
   383  do_execsql_test e_expr-9.11 { SELECT ('abcd' =  'ABCD') COLLATE nocase } 0
   384  do_execsql_test e_expr-9.12 { SELECT  'abcd' == 'ABCD'  COLLATE nocase } 1
   385  do_execsql_test e_expr-9.13 { SELECT ('abcd' == 'ABCD') COLLATE nocase } 0
   386  do_execsql_test e_expr-9.14 { SELECT  'abcd' IS 'ABCD'  COLLATE nocase } 1
   387  do_execsql_test e_expr-9.15 { SELECT ('abcd' IS 'ABCD') COLLATE nocase } 0
   388  
   389  do_execsql_test e_expr-9.16 { SELECT  'abcd' != 'ABCD'      COLLATE nocase } 0
   390  do_execsql_test e_expr-9.17 { SELECT ('abcd' != 'ABCD')     COLLATE nocase } 1
   391  do_execsql_test e_expr-9.18 { SELECT  'abcd' <> 'ABCD'      COLLATE nocase } 0
   392  do_execsql_test e_expr-9.19 { SELECT ('abcd' <> 'ABCD')     COLLATE nocase } 1
   393  do_execsql_test e_expr-9.20 { SELECT  'abcd' IS NOT 'ABCD'  COLLATE nocase } 0
   394  do_execsql_test e_expr-9.21 { SELECT ('abcd' IS NOT 'ABCD') COLLATE nocase } 1
   395  
   396  do_execsql_test e_expr-9.22 { 
   397    SELECT 'bbb' BETWEEN 'AAA' AND 'CCC' COLLATE nocase 
   398  } 1
   399  do_execsql_test e_expr-9.23 { 
   400    SELECT ('bbb' BETWEEN 'AAA' AND 'CCC') COLLATE nocase 
   401  } 0
   402  
   403  # EVIDENCE-OF: R-58731-25439 The collating sequence set by the COLLATE
   404  # operator overrides the collating sequence determined by the COLLATE
   405  # clause in a table column definition.
   406  #
   407  do_execsql_test e_expr-9.24 { 
   408    CREATE TABLE t24(a COLLATE NOCASE, b);
   409    INSERT INTO t24 VALUES('aaa', 1);
   410    INSERT INTO t24 VALUES('bbb', 2);
   411    INSERT INTO t24 VALUES('ccc', 3);
   412  } {}
   413  do_execsql_test e_expr-9.25 { SELECT 'BBB' = a FROM t24 } {0 1 0}
   414  do_execsql_test e_expr-9.25 { SELECT a = 'BBB' FROM t24 } {0 1 0}
   415  do_execsql_test e_expr-9.25 { SELECT 'BBB' = a COLLATE binary FROM t24 } {0 0 0}
   416  do_execsql_test e_expr-9.25 { SELECT a COLLATE binary = 'BBB' FROM t24 } {0 0 0}
   417  
   418  #-------------------------------------------------------------------------
   419  # Test statements related to literal values.
   420  #
   421  # EVIDENCE-OF: R-31536-32008 Literal values may be integers, floating
   422  # point numbers, strings, BLOBs, or NULLs.
   423  #
   424  do_execsql_test e_expr-10.1.1 { SELECT typeof(5)       } {integer}
   425  do_execsql_test e_expr-10.1.2 { SELECT typeof(5.1)     } {real}
   426  do_execsql_test e_expr-10.1.3 { SELECT typeof('5.1')   } {text}
   427  do_execsql_test e_expr-10.1.4 { SELECT typeof(X'ABCD') } {blob}
   428  do_execsql_test e_expr-10.1.5 { SELECT typeof(NULL)    } {null}
   429  
   430  # "Scientific notation is supported for point literal values."
   431  #
   432  do_execsql_test e_expr-10.2.1 { SELECT typeof(3.4e-02)    } {real}
   433  do_execsql_test e_expr-10.2.2 { SELECT typeof(3e+5)       } {real}
   434  do_execsql_test e_expr-10.2.3 { SELECT 3.4e-02            } {0.034}
   435  do_execsql_test e_expr-10.2.4 { SELECT 3e+4               } {30000.0}
   436  
   437  # EVIDENCE-OF: R-35229-17830 A string constant is formed by enclosing
   438  # the string in single quotes (').
   439  #
   440  # EVIDENCE-OF: R-07100-06606 A single quote within the string can be
   441  # encoded by putting two single quotes in a row - as in Pascal.
   442  #
   443  do_execsql_test e_expr-10.3.1 { SELECT 'is not' }         {{is not}}
   444  do_execsql_test e_expr-10.3.2 { SELECT typeof('is not') } {text}
   445  do_execsql_test e_expr-10.3.3 { SELECT 'isn''t' }         {isn't}
   446  do_execsql_test e_expr-10.3.4 { SELECT typeof('isn''t') } {text}
   447  
   448  # EVIDENCE-OF: R-09593-03321 BLOB literals are string literals
   449  # containing hexadecimal data and preceded by a single "x" or "X"
   450  # character.
   451  #
   452  # EVIDENCE-OF: R-19836-11244 Example: X'53514C697465'
   453  #
   454  do_execsql_test e_expr-10.4.1 { SELECT typeof(X'0123456789ABCDEF') } blob
   455  do_execsql_test e_expr-10.4.2 { SELECT typeof(x'0123456789ABCDEF') } blob
   456  do_execsql_test e_expr-10.4.3 { SELECT typeof(X'0123456789abcdef') } blob
   457  do_execsql_test e_expr-10.4.4 { SELECT typeof(x'0123456789abcdef') } blob
   458  do_execsql_test e_expr-10.4.5 { SELECT typeof(X'53514C697465')     } blob
   459  
   460  # EVIDENCE-OF: R-23914-51476 A literal value can also be the token
   461  # "NULL".
   462  #
   463  do_execsql_test e_expr-10.5.1 { SELECT NULL         } {{}}
   464  do_execsql_test e_expr-10.5.2 { SELECT typeof(NULL) } {null}
   465  
   466  #-------------------------------------------------------------------------
   467  # Test statements related to bound parameters
   468  #
   469  
   470  proc parameter_test {tn sql params result} {
   471    set stmt [sqlite3_prepare_v2 db $sql -1]
   472  
   473    foreach {number name} $params {
   474      set nm [sqlite3_bind_parameter_name $stmt $number]
   475      do_test $tn.name.$number [list set {} $nm] $name
   476      sqlite3_bind_int $stmt $number [expr -1 * $number]
   477    }
   478  
   479    sqlite3_step $stmt
   480  
   481    set res [list]
   482    for {set i 0} {$i < [sqlite3_column_count $stmt]} {incr i} {
   483      lappend res [sqlite3_column_text $stmt $i]
   484    }
   485  
   486    set rc [sqlite3_finalize $stmt]
   487    do_test $tn.rc [list set {} $rc] SQLITE_OK
   488    do_test $tn.res [list set {} $res] $result
   489  }
   490  
   491  # EVIDENCE-OF: R-33509-39458 A question mark followed by a number NNN
   492  # holds a spot for the NNN-th parameter. NNN must be between 1 and
   493  # SQLITE_MAX_VARIABLE_NUMBER.
   494  #
   495  set mvn $SQLITE_MAX_VARIABLE_NUMBER
   496  parameter_test e_expr-11.1 "
   497    SELECT ?1, ?123, ?$SQLITE_MAX_VARIABLE_NUMBER, ?123, ?4
   498  "   "1 ?1  123 ?123 $mvn ?$mvn 4 ?4"   "-1 -123 -$mvn -123 -4"
   499  
   500  set errmsg "variable number must be between ?1 and ?$SQLITE_MAX_VARIABLE_NUMBER"
   501  foreach {tn param_number} [list \
   502    2  0                                    \
   503    3  [expr $SQLITE_MAX_VARIABLE_NUMBER+1] \
   504    4  [expr $SQLITE_MAX_VARIABLE_NUMBER+2] \
   505    5  12345678903456789034567890234567890  \
   506    6  2147483648                           \
   507    7  2147483649                           \
   508    8  4294967296                           \
   509    9  4294967297                           \
   510    10 9223372036854775808                  \
   511    11 9223372036854775809                  \
   512    12 18446744073709551616                 \
   513    13 18446744073709551617                 \
   514  ] {
   515    do_catchsql_test e_expr-11.1.$tn "SELECT ?$param_number" [list 1 $errmsg]
   516  }
   517  
   518  # EVIDENCE-OF: R-33670-36097 A question mark that is not followed by a
   519  # number creates a parameter with a number one greater than the largest
   520  # parameter number already assigned.
   521  #
   522  # EVIDENCE-OF: R-42938-07030 If this means the parameter number is
   523  # greater than SQLITE_MAX_VARIABLE_NUMBER, it is an error.
   524  #
   525  parameter_test e_expr-11.2.1 "SELECT ?"          {1 {}}       -1
   526  parameter_test e_expr-11.2.2 "SELECT ?, ?"       {1 {} 2 {}}  {-1 -2}
   527  parameter_test e_expr-11.2.3 "SELECT ?5, ?"      {5 ?5 6 {}}  {-5 -6}
   528  parameter_test e_expr-11.2.4 "SELECT ?, ?5"      {1 {} 5 ?5}  {-1 -5}
   529  parameter_test e_expr-11.2.5 "SELECT ?, ?456, ?" {
   530    1 {} 456 ?456 457 {}
   531  }  {-1 -456 -457}
   532  parameter_test e_expr-11.2.5 "SELECT ?, ?456, ?4, ?" {
   533    1 {} 456 ?456 4 ?4 457 {}
   534  }  {-1 -456 -4 -457}
   535  foreach {tn sql} [list                           \
   536    1  "SELECT ?$mvn, ?"                           \
   537    2  "SELECT ?[expr $mvn-5], ?, ?, ?, ?, ?, ?"   \
   538    3  "SELECT ?[expr $mvn], ?5, ?6, ?"            \
   539  ] {
   540    do_catchsql_test e_expr-11.3.$tn $sql [list 1 {too many SQL variables}]
   541  }
   542  
   543  # EVIDENCE-OF: R-11620-22743 A colon followed by an identifier name
   544  # holds a spot for a named parameter with the name :AAAA.
   545  #
   546  # Identifiers in SQLite consist of alphanumeric, '_' and '$' characters,
   547  # and any UTF characters with codepoints larger than 127 (non-ASCII 
   548  # characters).
   549  #
   550  parameter_test e_expr-11.2.1 {SELECT :AAAA}         {1 :AAAA}       -1
   551  parameter_test e_expr-11.2.2 {SELECT :123}          {1 :123}        -1
   552  parameter_test e_expr-11.2.3 {SELECT :__}           {1 :__}         -1
   553  parameter_test e_expr-11.2.4 {SELECT :_$_}          {1 :_$_}        -1
   554  parameter_test e_expr-11.2.5 "
   555    SELECT :\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25
   556  " "1 :\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25" -1
   557  parameter_test e_expr-11.2.6 "SELECT :\u0080" "1 :\u0080" -1
   558  
   559  # EVIDENCE-OF: R-49783-61279 An "at" sign works exactly like a colon,
   560  # except that the name of the parameter created is @AAAA.
   561  #
   562  parameter_test e_expr-11.3.1 {SELECT @AAAA}         {1 @AAAA}       -1
   563  parameter_test e_expr-11.3.2 {SELECT @123}          {1 @123}        -1
   564  parameter_test e_expr-11.3.3 {SELECT @__}           {1 @__}         -1
   565  parameter_test e_expr-11.3.4 {SELECT @_$_}          {1 @_$_}        -1
   566  parameter_test e_expr-11.3.5 "
   567    SELECT @\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25
   568  " "1 @\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25" -1
   569  parameter_test e_expr-11.3.6 "SELECT @\u0080" "1 @\u0080" -1
   570  
   571  # EVIDENCE-OF: R-62610-51329 A dollar-sign followed by an identifier
   572  # name also holds a spot for a named parameter with the name $AAAA.
   573  #
   574  # EVIDENCE-OF: R-55025-21042 The identifier name in this case can
   575  # include one or more occurrences of "::" and a suffix enclosed in
   576  # "(...)" containing any text at all.
   577  #
   578  # Note: Looks like an identifier cannot consist entirely of "::" 
   579  # characters or just a suffix. Also, the other named variable characters
   580  # (: and @) work the same way internally. Why not just document it that way?
   581  #
   582  parameter_test e_expr-11.4.1 {SELECT $AAAA}         {1 $AAAA}       -1
   583  parameter_test e_expr-11.4.2 {SELECT $123}          {1 $123}        -1
   584  parameter_test e_expr-11.4.3 {SELECT $__}           {1 $__}         -1
   585  parameter_test e_expr-11.4.4 {SELECT $_$_}          {1 $_$_}        -1
   586  parameter_test e_expr-11.4.5 "
   587    SELECT \$\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25
   588  " "1 \$\u0e40\u0e2d\u0e28\u0e02\u0e39\u0e40\u0e2d\u0e25" -1
   589  parameter_test e_expr-11.4.6 "SELECT \$\u0080" "1 \$\u0080" -1
   590  
   591  parameter_test e_expr-11.5.1 {SELECT $::::a(++--++)} {1 $::::a(++--++)} -1
   592  parameter_test e_expr-11.5.2 {SELECT $::a()} {1 $::a()} -1
   593  parameter_test e_expr-11.5.3 {SELECT $::1(::#$)} {1 $::1(::#$)} -1
   594   
   595  # EVIDENCE-OF: R-11370-04520 Named parameters are also numbered. The
   596  # number assigned is one greater than the largest parameter number
   597  # already assigned.
   598  #
   599  # EVIDENCE-OF: R-42620-22184 If this means the parameter would be
   600  # assigned a number greater than SQLITE_MAX_VARIABLE_NUMBER, it is an
   601  # error.
   602  #
   603  parameter_test e_expr-11.6.1 "SELECT ?, @abc"    {1 {} 2 @abc} {-1 -2}
   604  parameter_test e_expr-11.6.2 "SELECT ?123, :a1"  {123 ?123 124 :a1} {-123 -124}
   605  parameter_test e_expr-11.6.3 {SELECT $a, ?8, ?, $b, ?2, $c} {
   606    1 $a 8 ?8 9 {} 10 $b 2 ?2 11 $c
   607  } {-1 -8 -9 -10 -2 -11}
   608  foreach {tn sql} [list                           \
   609    1  "SELECT ?$mvn, \$::a"                       \
   610    2  "SELECT ?$mvn, ?4, @a1"                     \
   611    3  "SELECT ?[expr $mvn-2], :bag, @123, \$x"    \
   612  ] {
   613    do_catchsql_test e_expr-11.7.$tn $sql [list 1 {too many SQL variables}]
   614  }
   615  
   616  # EVIDENCE-OF: R-14068-49671 Parameters that are not assigned values
   617  # using sqlite3_bind() are treated as NULL.
   618  #
   619  do_test e_expr-11.7.1 {
   620    set stmt [sqlite3_prepare_v2 db { SELECT ?, :a, @b, $d } -1]
   621    sqlite3_step $stmt
   622  
   623    list [sqlite3_column_type $stmt 0] \
   624         [sqlite3_column_type $stmt 1] \
   625         [sqlite3_column_type $stmt 2] \
   626         [sqlite3_column_type $stmt 3] 
   627  } {NULL NULL NULL NULL}
   628  do_test e_expr-11.7.1 { sqlite3_finalize $stmt } SQLITE_OK
   629  
   630  #-------------------------------------------------------------------------
   631  # "Test" the syntax diagrams in lang_expr.html.
   632  #
   633  # -- syntax diagram signed-number
   634  #
   635  do_execsql_test e_expr-12.1.1 { SELECT 0, +0, -0 } {0 0 0}
   636  do_execsql_test e_expr-12.1.2 { SELECT 1, +1, -1 } {1 1 -1}
   637  do_execsql_test e_expr-12.1.3 { SELECT 2, +2, -2 } {2 2 -2}
   638  do_execsql_test e_expr-12.1.4 { 
   639    SELECT 1.4, +1.4, -1.4 
   640  } {1.4 1.4 -1.4}
   641  do_execsql_test e_expr-12.1.5 { 
   642    SELECT 1.5e+5, +1.5e+5, -1.5e+5 
   643  } {150000.0 150000.0 -150000.0}
   644  do_execsql_test e_expr-12.1.6 { 
   645    SELECT 0.0001, +0.0001, -0.0001 
   646  } {0.0001 0.0001 -0.0001}
   647  
   648  # -- syntax diagram literal-value
   649  #
   650  set sqlite_current_time 1
   651  do_execsql_test e_expr-12.2.1 {SELECT 123}               {123}
   652  do_execsql_test e_expr-12.2.2 {SELECT 123.4e05}          {12340000.0}
   653  do_execsql_test e_expr-12.2.3 {SELECT 'abcde'}           {abcde}
   654  do_execsql_test e_expr-12.2.4 {SELECT X'414243'}         {ABC}
   655  do_execsql_test e_expr-12.2.5 {SELECT NULL}              {{}}
   656  do_execsql_test e_expr-12.2.6 {SELECT CURRENT_TIME}      {00:00:01}
   657  do_execsql_test e_expr-12.2.7 {SELECT CURRENT_DATE}      {1970-01-01}
   658  do_execsql_test e_expr-12.2.8 {SELECT CURRENT_TIMESTAMP} {{1970-01-01 00:00:01}}
   659  set sqlite_current_time 0
   660  
   661  # -- syntax diagram expr
   662  #
   663  forcedelete test.db2
   664  execsql {
   665    ATTACH 'test.db2' AS dbname;
   666    CREATE TABLE dbname.tblname(cname);
   667  }
   668  
   669  proc glob {args} {return 1}
   670  db function glob glob
   671  db function match glob
   672  db function regexp glob
   673  
   674  foreach {tn expr} {
   675    1 123
   676    2 123.4e05
   677    3 'abcde'
   678    4 X'414243'
   679    5 NULL
   680    6 CURRENT_TIME
   681    7 CURRENT_DATE
   682    8 CURRENT_TIMESTAMP
   683  
   684    9 ?
   685   10 ?123
   686   11 @hello
   687   12 :world
   688   13 $tcl
   689   14 $tcl(array)
   690    
   691    15 cname
   692    16 tblname.cname
   693    17 dbname.tblname.cname
   694  
   695    18 "+ EXPR"
   696    19 "- EXPR"
   697    20 "NOT EXPR"
   698    21 "~ EXPR"
   699  
   700    22 "EXPR1 || EXPR2"
   701    23 "EXPR1 * EXPR2"
   702    24 "EXPR1 / EXPR2"
   703    25 "EXPR1 % EXPR2"
   704    26 "EXPR1 + EXPR2"
   705    27 "EXPR1 - EXPR2"
   706    28 "EXPR1 << EXPR2"
   707    29 "EXPR1 >> EXPR2"
   708    30 "EXPR1 & EXPR2"
   709    31 "EXPR1 | EXPR2"
   710    32 "EXPR1 < EXPR2"
   711    33 "EXPR1 <= EXPR2"
   712    34 "EXPR1 > EXPR2"
   713    35 "EXPR1 >= EXPR2"
   714    36 "EXPR1 = EXPR2"
   715    37 "EXPR1 == EXPR2"
   716    38 "EXPR1 != EXPR2"
   717    39 "EXPR1 <> EXPR2"
   718    40 "EXPR1 IS EXPR2"
   719    41 "EXPR1 IS NOT EXPR2"
   720    42 "EXPR1 AND EXPR2"
   721    43 "EXPR1 OR EXPR2"
   722   
   723    44 "count(*)"
   724    45 "count(DISTINCT EXPR)"
   725    46 "substr(EXPR, 10, 20)"
   726    47 "changes()"
   727   
   728    48 "( EXPR )"
   729   
   730    49 "CAST ( EXPR AS integer )"
   731    50 "CAST ( EXPR AS 'abcd' )"
   732    51 "CAST ( EXPR AS 'ab$ $cd' )"
   733   
   734    52 "EXPR COLLATE nocase"
   735    53 "EXPR COLLATE binary"
   736   
   737    54 "EXPR1 LIKE EXPR2"
   738    55 "EXPR1 LIKE EXPR2 ESCAPE EXPR"
   739    56 "EXPR1 GLOB EXPR2"
   740    57 "EXPR1 GLOB EXPR2 ESCAPE EXPR"
   741    58 "EXPR1 REGEXP EXPR2"
   742    59 "EXPR1 REGEXP EXPR2 ESCAPE EXPR"
   743    60 "EXPR1 MATCH EXPR2"
   744    61 "EXPR1 MATCH EXPR2 ESCAPE EXPR"
   745    62 "EXPR1 NOT LIKE EXPR2"
   746    63 "EXPR1 NOT LIKE EXPR2 ESCAPE EXPR"
   747    64 "EXPR1 NOT GLOB EXPR2"
   748    65 "EXPR1 NOT GLOB EXPR2 ESCAPE EXPR"
   749    66 "EXPR1 NOT REGEXP EXPR2"
   750    67 "EXPR1 NOT REGEXP EXPR2 ESCAPE EXPR"
   751    68 "EXPR1 NOT MATCH EXPR2"
   752    69 "EXPR1 NOT MATCH EXPR2 ESCAPE EXPR"
   753   
   754    70 "EXPR ISNULL"
   755    71 "EXPR NOTNULL"
   756    72 "EXPR NOT NULL"
   757   
   758    73 "EXPR1 IS EXPR2"
   759    74 "EXPR1 IS NOT EXPR2"
   760  
   761    75 "EXPR NOT BETWEEN EXPR1 AND EXPR2"
   762    76 "EXPR BETWEEN EXPR1 AND EXPR2"
   763  
   764    77 "EXPR NOT IN (SELECT cname FROM tblname)"
   765    78 "EXPR NOT IN (1)"
   766    79 "EXPR NOT IN (1, 2, 3)"
   767    80 "EXPR NOT IN tblname"
   768    81 "EXPR NOT IN dbname.tblname"
   769    82 "EXPR IN (SELECT cname FROM tblname)"
   770    83 "EXPR IN (1)"
   771    84 "EXPR IN (1, 2, 3)"
   772    85 "EXPR IN tblname"
   773    86 "EXPR IN dbname.tblname"
   774  
   775    87 "EXISTS (SELECT cname FROM tblname)"
   776    88 "NOT EXISTS (SELECT cname FROM tblname)"
   777  
   778    89 "CASE EXPR WHEN EXPR1 THEN EXPR2 ELSE EXPR END"
   779    90 "CASE EXPR WHEN EXPR1 THEN EXPR2 END"
   780    91 "CASE EXPR WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 ELSE EXPR2 END"
   781    92 "CASE EXPR WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 END"
   782    93 "CASE WHEN EXPR1 THEN EXPR2 ELSE EXPR END"
   783    94 "CASE WHEN EXPR1 THEN EXPR2 END"
   784    95 "CASE WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 ELSE EXPR2 END"
   785    96 "CASE WHEN EXPR1 THEN EXPR2 WHEN EXPR THEN EXPR1 END"
   786  } {
   787  
   788    # If the expression string being parsed contains "EXPR2", then replace
   789    # string "EXPR1" and "EXPR2" with arbitrary SQL expressions. If it 
   790    # contains "EXPR", then replace EXPR with an arbitrary SQL expression.
   791    # 
   792    set elist [list $expr]
   793    if {[string match *EXPR2* $expr]} {
   794      set elist [list]
   795      foreach {e1 e2} { cname "34+22" } {
   796        lappend elist [string map [list EXPR1 $e1 EXPR2 $e2] $expr]
   797      }
   798    } 
   799    if {[string match *EXPR* $expr]} {
   800      set elist2 [list]
   801      foreach el $elist {
   802        foreach e { cname "34+22" } {
   803          lappend elist2 [string map [list EXPR $e] $el]
   804        }
   805      }
   806      set elist $elist2
   807    }
   808  
   809    set x 0
   810    foreach e $elist {
   811      incr x
   812      do_test e_expr-12.3.$tn.$x { 
   813        set rc [catch { execsql "SELECT $e FROM tblname" } msg]
   814      } {0}
   815    }
   816  }
   817  
   818  # -- syntax diagram raise-function
   819  #
   820  foreach {tn raiseexpr} {
   821    1 "RAISE(IGNORE)"
   822    2 "RAISE(ROLLBACK, 'error message')"
   823    3 "RAISE(ABORT, 'error message')"
   824    4 "RAISE(FAIL, 'error message')"
   825  } {
   826    do_execsql_test e_expr-12.4.$tn "
   827      CREATE TRIGGER dbname.tr$tn BEFORE DELETE ON tblname BEGIN
   828        SELECT $raiseexpr ;
   829      END;
   830    " {}
   831  }
   832  
   833  #-------------------------------------------------------------------------
   834  # Test the statements related to the BETWEEN operator.
   835  #
   836  # EVIDENCE-OF: R-40079-54503 The BETWEEN operator is logically
   837  # equivalent to a pair of comparisons. "x BETWEEN y AND z" is equivalent
   838  # to "x>=y AND x<=z" except that with BETWEEN, the x expression is
   839  # only evaluated once.
   840  #
   841  db func x x
   842  proc x {} { incr ::xcount ; return [expr $::x] }
   843  foreach {tn x expr res nEval} {
   844    1  10  "x() >= 5 AND x() <= 15"  1  2
   845    2  10  "x() BETWEEN 5 AND 15"    1  1
   846  
   847    3   5  "x() >= 5 AND x() <= 5"   1  2
   848    4   5  "x() BETWEEN 5 AND 5"     1  1
   849  
   850    5   9  "(x(),8) >= (9,7) AND (x(),8)<=(9,10)"  1 2
   851    6   9  "(x(),8) BETWEEN (9,7) AND (9,10)"      1 1
   852  } {
   853    do_test e_expr-13.1.$tn {
   854      set ::xcount 0
   855      set a [execsql "SELECT $expr"]
   856      list $::xcount $a
   857    } [list $nEval $res]
   858  }
   859  
   860  # X-EVIDENCE-OF: R-05155-34454 The precedence of the BETWEEN operator is
   861  # the same as the precedence as operators == and != and LIKE and groups
   862  # left to right.
   863  # 
   864  # Therefore, BETWEEN groups more tightly than operator "AND", but less
   865  # so than "<".
   866  #
   867  do_execsql_test e_expr-13.2.1  { SELECT 1 == 10 BETWEEN 0 AND 2   }  1
   868  do_execsql_test e_expr-13.2.2  { SELECT (1 == 10) BETWEEN 0 AND 2 }  1
   869  do_execsql_test e_expr-13.2.3  { SELECT 1 == (10 BETWEEN 0 AND 2) }  0
   870  do_execsql_test e_expr-13.2.4  { SELECT  6 BETWEEN 4 AND 8 == 1 }    1
   871  do_execsql_test e_expr-13.2.5  { SELECT (6 BETWEEN 4 AND 8) == 1 }   1
   872  do_execsql_test e_expr-13.2.6  { SELECT  6 BETWEEN 4 AND (8 == 1) }  0
   873  
   874  do_execsql_test e_expr-13.2.7  { SELECT  5 BETWEEN 0 AND 0  != 1 }   1
   875  do_execsql_test e_expr-13.2.8  { SELECT (5 BETWEEN 0 AND 0) != 1 }   1
   876  do_execsql_test e_expr-13.2.9  { SELECT  5 BETWEEN 0 AND (0 != 1) }  0
   877  do_execsql_test e_expr-13.2.10 { SELECT  1 != 0  BETWEEN 0 AND 2  }  1
   878  do_execsql_test e_expr-13.2.11 { SELECT (1 != 0) BETWEEN 0 AND 2  }  1
   879  do_execsql_test e_expr-13.2.12 { SELECT  1 != (0 BETWEEN 0 AND 2) }  0
   880  
   881  do_execsql_test e_expr-13.2.13 { SELECT 1 LIKE 10 BETWEEN 0 AND 2   }  1
   882  do_execsql_test e_expr-13.2.14 { SELECT (1 LIKE 10) BETWEEN 0 AND 2 }  1
   883  do_execsql_test e_expr-13.2.15 { SELECT 1 LIKE (10 BETWEEN 0 AND 2) }  0
   884  do_execsql_test e_expr-13.2.16 { SELECT  6 BETWEEN 4 AND 8 LIKE 1   }  1
   885  do_execsql_test e_expr-13.2.17 { SELECT (6 BETWEEN 4 AND 8) LIKE 1  }  1
   886  do_execsql_test e_expr-13.2.18 { SELECT  6 BETWEEN 4 AND (8 LIKE 1) }  0
   887  
   888  do_execsql_test e_expr-13.2.19 { SELECT 0 AND 0 BETWEEN 0 AND 1   } 0
   889  do_execsql_test e_expr-13.2.20 { SELECT 0 AND (0 BETWEEN 0 AND 1) } 0
   890  do_execsql_test e_expr-13.2.21 { SELECT (0 AND 0) BETWEEN 0 AND 1 } 1
   891  do_execsql_test e_expr-13.2.22 { SELECT 0 BETWEEN -1 AND 1 AND 0   } 0
   892  do_execsql_test e_expr-13.2.23 { SELECT (0 BETWEEN -1 AND 1) AND 0 } 0
   893  do_execsql_test e_expr-13.2.24 { SELECT 0 BETWEEN -1 AND (1 AND 0) } 1
   894  
   895  do_execsql_test e_expr-13.2.25 { SELECT 2 < 3 BETWEEN 0 AND 1   } 1
   896  do_execsql_test e_expr-13.2.26 { SELECT (2 < 3) BETWEEN 0 AND 1 } 1
   897  do_execsql_test e_expr-13.2.27 { SELECT 2 < (3 BETWEEN 0 AND 1) } 0
   898  do_execsql_test e_expr-13.2.28 { SELECT 2 BETWEEN 1 AND 2 < 3    } 0
   899  do_execsql_test e_expr-13.2.29 { SELECT 2 BETWEEN 1 AND (2 < 3)  } 0
   900  do_execsql_test e_expr-13.2.30 { SELECT (2 BETWEEN 1 AND 2) < 3  } 1
   901  
   902  #-------------------------------------------------------------------------
   903  # Test the statements related to the LIKE and GLOB operators.
   904  #
   905  # EVIDENCE-OF: R-16584-60189 The LIKE operator does a pattern matching
   906  # comparison.
   907  #
   908  # EVIDENCE-OF: R-11295-04657 The operand to the right of the LIKE
   909  # operator contains the pattern and the left hand operand contains the
   910  # string to match against the pattern.
   911  #
   912  do_execsql_test e_expr-14.1.1 { SELECT 'abc%' LIKE 'abcde' } 0
   913  do_execsql_test e_expr-14.1.2 { SELECT 'abcde' LIKE 'abc%' } 1
   914  
   915  # EVIDENCE-OF: R-55406-38524 A percent symbol ("%") in the LIKE pattern
   916  # matches any sequence of zero or more characters in the string.
   917  #
   918  do_execsql_test e_expr-14.2.1 { SELECT 'abde'    LIKE 'ab%de' } 1
   919  do_execsql_test e_expr-14.2.2 { SELECT 'abXde'   LIKE 'ab%de' } 1
   920  do_execsql_test e_expr-14.2.3 { SELECT 'abABCde' LIKE 'ab%de' } 1
   921  
   922  # EVIDENCE-OF: R-30433-25443 An underscore ("_") in the LIKE pattern
   923  # matches any single character in the string.
   924  #
   925  do_execsql_test e_expr-14.3.1 { SELECT 'abde'    LIKE 'ab_de' } 0
   926  do_execsql_test e_expr-14.3.2 { SELECT 'abXde'   LIKE 'ab_de' } 1
   927  do_execsql_test e_expr-14.3.3 { SELECT 'abABCde' LIKE 'ab_de' } 0
   928  
   929  # EVIDENCE-OF: R-59007-20454 Any other character matches itself or its
   930  # lower/upper case equivalent (i.e. case-insensitive matching).
   931  #
   932  do_execsql_test e_expr-14.4.1 { SELECT 'abc' LIKE 'aBc' } 1
   933  do_execsql_test e_expr-14.4.2 { SELECT 'aBc' LIKE 'aBc' } 1
   934  do_execsql_test e_expr-14.4.3 { SELECT 'ac'  LIKE 'aBc' } 0
   935  
   936  # EVIDENCE-OF: R-23648-58527 SQLite only understands upper/lower case
   937  # for ASCII characters by default.
   938  #
   939  # EVIDENCE-OF: R-04532-11527 The LIKE operator is case sensitive by
   940  # default for unicode characters that are beyond the ASCII range.
   941  #
   942  # EVIDENCE-OF: R-44381-11669 the expression
   943  # 'a'&nbsp;LIKE&nbsp;'A' is TRUE but
   944  # '&aelig;'&nbsp;LIKE&nbsp;'&AElig;' is FALSE.
   945  #
   946  #   The restriction to ASCII characters does not apply if the ICU
   947  #   library is compiled in. When ICU is enabled SQLite does not act
   948  #   as it does "by default".
   949  #
   950  do_execsql_test e_expr-14.5.1 { SELECT 'A' LIKE 'a'         } 1
   951  ifcapable !icu {
   952    do_execsql_test e_expr-14.5.2 "SELECT '\u00c6' LIKE '\u00e6'" 0
   953  }
   954  
   955  # EVIDENCE-OF: R-56683-13731 If the optional ESCAPE clause is present,
   956  # then the expression following the ESCAPE keyword must evaluate to a
   957  # string consisting of a single character.
   958  #
   959  do_catchsql_test e_expr-14.6.1 { 
   960    SELECT 'A' LIKE 'a' ESCAPE '12' 
   961  } {1 {ESCAPE expression must be a single character}}
   962  do_catchsql_test e_expr-14.6.2 { 
   963    SELECT 'A' LIKE 'a' ESCAPE '' 
   964  } {1 {ESCAPE expression must be a single character}}
   965  do_catchsql_test e_expr-14.6.3 { SELECT 'A' LIKE 'a' ESCAPE 'x' }    {0 1}
   966  do_catchsql_test e_expr-14.6.4 "SELECT 'A' LIKE 'a' ESCAPE '\u00e6'" {0 1}
   967  
   968  # EVIDENCE-OF: R-02045-23762 This character may be used in the LIKE
   969  # pattern to include literal percent or underscore characters.
   970  #
   971  # EVIDENCE-OF: R-13345-31830 The escape character followed by a percent
   972  # symbol (%), underscore (_), or a second instance of the escape
   973  # character itself matches a literal percent symbol, underscore, or a
   974  # single escape character, respectively.
   975  #
   976  do_execsql_test e_expr-14.7.1  { SELECT 'abc%'  LIKE 'abcX%' ESCAPE 'X' } 1
   977  do_execsql_test e_expr-14.7.2  { SELECT 'abc5'  LIKE 'abcX%' ESCAPE 'X' } 0
   978  do_execsql_test e_expr-14.7.3  { SELECT 'abc'   LIKE 'abcX%' ESCAPE 'X' } 0
   979  do_execsql_test e_expr-14.7.4  { SELECT 'abcX%' LIKE 'abcX%' ESCAPE 'X' } 0
   980  do_execsql_test e_expr-14.7.5  { SELECT 'abc%%' LIKE 'abcX%' ESCAPE 'X' } 0
   981  
   982  do_execsql_test e_expr-14.7.6  { SELECT 'abc_'  LIKE 'abcX_' ESCAPE 'X' } 1
   983  do_execsql_test e_expr-14.7.7  { SELECT 'abc5'  LIKE 'abcX_' ESCAPE 'X' } 0
   984  do_execsql_test e_expr-14.7.8  { SELECT 'abc'   LIKE 'abcX_' ESCAPE 'X' } 0
   985  do_execsql_test e_expr-14.7.9  { SELECT 'abcX_' LIKE 'abcX_' ESCAPE 'X' } 0
   986  do_execsql_test e_expr-14.7.10 { SELECT 'abc__' LIKE 'abcX_' ESCAPE 'X' } 0
   987  
   988  do_execsql_test e_expr-14.7.11 { SELECT 'abcX'  LIKE 'abcXX' ESCAPE 'X' } 1
   989  do_execsql_test e_expr-14.7.12 { SELECT 'abc5'  LIKE 'abcXX' ESCAPE 'X' } 0
   990  do_execsql_test e_expr-14.7.13 { SELECT 'abc'   LIKE 'abcXX' ESCAPE 'X' } 0
   991  do_execsql_test e_expr-14.7.14 { SELECT 'abcXX' LIKE 'abcXX' ESCAPE 'X' } 0
   992  
   993  # EVIDENCE-OF: R-51359-17496 The infix LIKE operator is implemented by
   994  # calling the application-defined SQL functions like(Y,X) or like(Y,X,Z).
   995  #
   996  proc likefunc {args} {
   997    eval lappend ::likeargs $args
   998    return 1
   999  }
  1000  db func like -argcount 2 likefunc
  1001  db func like -argcount 3 likefunc
  1002  set ::likeargs [list]
  1003  do_execsql_test e_expr-15.1.1 { SELECT 'abc' LIKE 'def' } 1
  1004  do_test         e_expr-15.1.2 { set likeargs } {def abc}
  1005  set ::likeargs [list]
  1006  do_execsql_test e_expr-15.1.3 { SELECT 'abc' LIKE 'def' ESCAPE 'X' } 1
  1007  do_test         e_expr-15.1.4 { set likeargs } {def abc X}
  1008  db close
  1009  sqlite3 db test.db
  1010  
  1011  # EVIDENCE-OF: R-22868-25880 The LIKE operator can be made case
  1012  # sensitive using the case_sensitive_like pragma.
  1013  #
  1014  do_execsql_test e_expr-16.1.1  { SELECT 'abcxyz' LIKE 'ABC%' } 1
  1015  do_execsql_test e_expr-16.1.1b { SELECT 'abc%xyz' LIKE 'ABC\%x%' ESCAPE '\' } 1
  1016  do_execsql_test e_expr-16.1.2  { PRAGMA case_sensitive_like = 1 } {}
  1017  do_execsql_test e_expr-16.1.3  { SELECT 'abcxyz' LIKE 'ABC%' } 0
  1018  do_execsql_test e_expr-16.1.3b { SELECT 'abc%xyz' LIKE 'ABC\%X%' ESCAPE '\' } 0
  1019  do_execsql_test e_expr-16.1.4  { SELECT 'ABCxyz' LIKE 'ABC%' } 1
  1020  do_execsql_test e_expr-16.1.4b { SELECT 'ABC%xyz' LIKE 'ABC\%x%' ESCAPE '\' } 1
  1021  do_execsql_test e_expr-16.1.5  { PRAGMA case_sensitive_like = 0 } {}
  1022  do_execsql_test e_expr-16.1.6  { SELECT 'abcxyz' LIKE 'ABC%' } 1
  1023  do_execsql_test e_expr-16.1.6b { SELECT 'abc%xyz' LIKE 'ABC\%X%' ESCAPE '\' } 1
  1024  do_execsql_test e_expr-16.1.7  { SELECT 'ABCxyz' LIKE 'ABC%' } 1
  1025  do_execsql_test e_expr-16.1.7b { SELECT 'ABC%xyz' LIKE 'ABC\%X%' ESCAPE '\' } 1
  1026  
  1027  # EVIDENCE-OF: R-52087-12043 The GLOB operator is similar to LIKE but
  1028  # uses the Unix file globbing syntax for its wildcards.
  1029  #
  1030  # EVIDENCE-OF: R-09813-17279 Also, GLOB is case sensitive, unlike LIKE.
  1031  #
  1032  do_execsql_test e_expr-17.1.1 { SELECT 'abcxyz' GLOB 'abc%' } 0
  1033  do_execsql_test e_expr-17.1.2 { SELECT 'abcxyz' GLOB 'abc*' } 1
  1034  do_execsql_test e_expr-17.1.3 { SELECT 'abcxyz' GLOB 'abc___' } 0
  1035  do_execsql_test e_expr-17.1.4 { SELECT 'abcxyz' GLOB 'abc???' } 1
  1036  
  1037  do_execsql_test e_expr-17.1.5 { SELECT 'abcxyz' GLOB 'abc*' } 1
  1038  do_execsql_test e_expr-17.1.6 { SELECT 'ABCxyz' GLOB 'abc*' } 0
  1039  do_execsql_test e_expr-17.1.7 { SELECT 'abcxyz' GLOB 'ABC*' } 0
  1040  
  1041  # EVIDENCE-OF: R-39616-20555 Both GLOB and LIKE may be preceded by the
  1042  # NOT keyword to invert the sense of the test.
  1043  #
  1044  do_execsql_test e_expr-17.2.1 { SELECT 'abcxyz' NOT GLOB 'ABC*' } 1
  1045  do_execsql_test e_expr-17.2.2 { SELECT 'abcxyz' NOT GLOB 'abc*' } 0
  1046  do_execsql_test e_expr-17.2.3 { SELECT 'abcxyz' NOT LIKE 'ABC%' } 0
  1047  do_execsql_test e_expr-17.2.4 { SELECT 'abcxyz' NOT LIKE 'abc%' } 0
  1048  do_execsql_test e_expr-17.2.5 { SELECT 'abdxyz' NOT LIKE 'abc%' } 1
  1049  
  1050  db nullvalue null
  1051  do_execsql_test e_expr-17.2.6 { SELECT 'abcxyz' NOT GLOB NULL } null
  1052  do_execsql_test e_expr-17.2.7 { SELECT 'abcxyz' NOT LIKE NULL } null
  1053  do_execsql_test e_expr-17.2.8 { SELECT NULL NOT GLOB 'abc*' } null
  1054  do_execsql_test e_expr-17.2.9 { SELECT NULL NOT LIKE 'ABC%' } null
  1055  db nullvalue {}
  1056  
  1057  # EVIDENCE-OF: R-39414-35489 The infix GLOB operator is implemented by
  1058  # calling the function glob(Y,X) and can be modified by overriding that
  1059  # function.
  1060  proc globfunc {args} {
  1061    eval lappend ::globargs $args
  1062    return 1
  1063  }
  1064  db func glob -argcount 2 globfunc
  1065  set ::globargs [list]
  1066  do_execsql_test e_expr-17.3.1 { SELECT 'abc' GLOB 'def' } 1
  1067  do_test         e_expr-17.3.2 { set globargs } {def abc}
  1068  set ::globargs [list]
  1069  do_execsql_test e_expr-17.3.3 { SELECT 'X' NOT GLOB 'Y' } 0
  1070  do_test         e_expr-17.3.4 { set globargs } {Y X}
  1071  sqlite3 db test.db
  1072  
  1073  # EVIDENCE-OF: R-41650-20872 No regexp() user function is defined by
  1074  # default and so use of the REGEXP operator will normally result in an
  1075  # error message.
  1076  #
  1077  #   There is a regexp function if ICU is enabled though.
  1078  #
  1079  ifcapable !icu {
  1080    do_catchsql_test e_expr-18.1.1 { 
  1081      SELECT regexp('abc', 'def') 
  1082    } {1 {no such function: regexp}}
  1083    do_catchsql_test e_expr-18.1.2 { 
  1084      SELECT 'abc' REGEXP 'def'
  1085    } {1 {no such function: REGEXP}}
  1086  }
  1087  
  1088  # EVIDENCE-OF: R-33693-50180 The REGEXP operator is a special syntax for
  1089  # the regexp() user function.
  1090  #
  1091  # EVIDENCE-OF: R-65524-61849 If an application-defined SQL function
  1092  # named "regexp" is added at run-time, then the "X REGEXP Y" operator
  1093  # will be implemented as a call to "regexp(Y,X)".
  1094  #
  1095  proc regexpfunc {args} {
  1096    eval lappend ::regexpargs $args
  1097    return 1
  1098  }
  1099  db func regexp -argcount 2 regexpfunc
  1100  set ::regexpargs [list]
  1101  do_execsql_test e_expr-18.2.1 { SELECT 'abc' REGEXP 'def' } 1
  1102  do_test         e_expr-18.2.2 { set regexpargs } {def abc}
  1103  set ::regexpargs [list]
  1104  do_execsql_test e_expr-18.2.3 { SELECT 'X' NOT REGEXP 'Y' } 0
  1105  do_test         e_expr-18.2.4 { set regexpargs } {Y X}
  1106  sqlite3 db test.db
  1107  
  1108  # EVIDENCE-OF: R-42037-37826 The default match() function implementation
  1109  # raises an exception and is not really useful for anything.
  1110  #
  1111  do_catchsql_test e_expr-19.1.1 { 
  1112    SELECT 'abc' MATCH 'def' 
  1113  } {1 {unable to use function MATCH in the requested context}}
  1114  do_catchsql_test e_expr-19.1.2 { 
  1115    SELECT match('abc', 'def')
  1116  } {1 {unable to use function MATCH in the requested context}}
  1117  
  1118  # EVIDENCE-OF: R-37916-47407 The MATCH operator is a special syntax for
  1119  # the match() application-defined function.
  1120  #
  1121  # EVIDENCE-OF: R-06021-09373 But extensions can override the match()
  1122  # function with more helpful logic.
  1123  #
  1124  proc matchfunc {args} {
  1125    eval lappend ::matchargs $args
  1126    return 1
  1127  }
  1128  db func match -argcount 2 matchfunc
  1129  set ::matchargs [list]
  1130  do_execsql_test e_expr-19.2.1 { SELECT 'abc' MATCH 'def' } 1
  1131  do_test         e_expr-19.2.2 { set matchargs } {def abc}
  1132  set ::matchargs [list]
  1133  do_execsql_test e_expr-19.2.3 { SELECT 'X' NOT MATCH 'Y' } 0
  1134  do_test         e_expr-19.2.4 { set matchargs } {Y X}
  1135  sqlite3 db test.db
  1136  
  1137  #-------------------------------------------------------------------------
  1138  # Test cases for the testable statements related to the CASE expression.
  1139  #
  1140  # EVIDENCE-OF: R-57495-24088 There are two fundamental forms of the CASE
  1141  # expression: those with a base expression and those without.
  1142  #
  1143  do_execsql_test e_expr-20.1 {
  1144    SELECT CASE WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE 'else' END;
  1145  } {true}
  1146  do_execsql_test e_expr-20.2 {
  1147    SELECT CASE 0 WHEN 1 THEN 'true' WHEN 0 THEN 'false' ELSE 'else' END;
  1148  } {false}
  1149  
  1150  proc var {nm} {
  1151    lappend ::varlist $nm
  1152    return [set "::$nm"]
  1153  }
  1154  db func var var
  1155  
  1156  # EVIDENCE-OF: R-30638-59954 In a CASE without a base expression, each
  1157  # WHEN expression is evaluated and the result treated as a boolean,
  1158  # starting with the leftmost and continuing to the right.
  1159  #
  1160  foreach {a b c} {0 0 0} break
  1161  set varlist [list]
  1162  do_execsql_test e_expr-21.1.1 {
  1163    SELECT CASE WHEN var('a') THEN 'A' 
  1164                WHEN var('b') THEN 'B' 
  1165                WHEN var('c') THEN 'C' END
  1166  } {{}}
  1167  do_test e_expr-21.1.2 { set varlist } {a b c}
  1168  set varlist [list]
  1169  do_execsql_test e_expr-21.1.3 {
  1170    SELECT CASE WHEN var('c') THEN 'C' 
  1171                WHEN var('b') THEN 'B' 
  1172                WHEN var('a') THEN 'A' 
  1173                ELSE 'no result'
  1174    END
  1175  } {{no result}}
  1176  do_test e_expr-21.1.4 { set varlist } {c b a}
  1177  
  1178  # EVIDENCE-OF: R-39009-25596 The result of the CASE expression is the
  1179  # evaluation of the THEN expression that corresponds to the first WHEN
  1180  # expression that evaluates to true.
  1181  #
  1182  foreach {a b c} {0 1 0} break
  1183  do_execsql_test e_expr-21.2.1 {
  1184    SELECT CASE WHEN var('a') THEN 'A' 
  1185                WHEN var('b') THEN 'B' 
  1186                WHEN var('c') THEN 'C' 
  1187                ELSE 'no result'
  1188    END
  1189  } {B}
  1190  foreach {a b c} {0 1 1} break
  1191  do_execsql_test e_expr-21.2.2 {
  1192    SELECT CASE WHEN var('a') THEN 'A' 
  1193                WHEN var('b') THEN 'B' 
  1194                WHEN var('c') THEN 'C'
  1195                ELSE 'no result'
  1196    END
  1197  } {B}
  1198  foreach {a b c} {0 0 1} break
  1199  do_execsql_test e_expr-21.2.3 {
  1200    SELECT CASE WHEN var('a') THEN 'A' 
  1201                WHEN var('b') THEN 'B' 
  1202                WHEN var('c') THEN 'C'
  1203                ELSE 'no result'
  1204    END
  1205  } {C}
  1206  
  1207  # EVIDENCE-OF: R-24227-04807 Or, if none of the WHEN expressions
  1208  # evaluate to true, the result of evaluating the ELSE expression, if
  1209  # any.
  1210  #
  1211  foreach {a b c} {0 0 0} break
  1212  do_execsql_test e_expr-21.3.1 {
  1213    SELECT CASE WHEN var('a') THEN 'A' 
  1214                WHEN var('b') THEN 'B' 
  1215                WHEN var('c') THEN 'C'
  1216                ELSE 'no result'
  1217    END
  1218  } {{no result}}
  1219  
  1220  # EVIDENCE-OF: R-14168-07579 If there is no ELSE expression and none of
  1221  # the WHEN expressions are true, then the overall result is NULL.
  1222  #
  1223  db nullvalue null
  1224  do_execsql_test e_expr-21.3.2 {
  1225    SELECT CASE WHEN var('a') THEN 'A' 
  1226                WHEN var('b') THEN 'B' 
  1227                WHEN var('c') THEN 'C'
  1228    END
  1229  } {null}
  1230  db nullvalue {}
  1231  
  1232  # EVIDENCE-OF: R-13943-13592 A NULL result is considered untrue when
  1233  # evaluating WHEN terms.
  1234  #
  1235  do_execsql_test e_expr-21.4.1 {
  1236    SELECT CASE WHEN NULL THEN 'A' WHEN 1 THEN 'B' END, iif(NULL,8,99);
  1237  } {B 99}
  1238  do_execsql_test e_expr-21.4.2 {
  1239    SELECT CASE WHEN 0 THEN 'A' WHEN NULL THEN 'B' ELSE 'C' END, iif(0,8,99);
  1240  } {C 99}
  1241  
  1242  # EVIDENCE-OF: R-38620-19499 In a CASE with a base expression, the base
  1243  # expression is evaluated just once and the result is compared against
  1244  # the evaluation of each WHEN expression from left to right.
  1245  #
  1246  # Note: This test case tests the "evaluated just once" part of the above
  1247  # statement. Tests associated with the next two statements test that the
  1248  # comparisons take place.
  1249  #
  1250  foreach {a b c} [list [expr 3] [expr 4] [expr 5]] break
  1251  set ::varlist [list]
  1252  do_execsql_test e_expr-22.1.1 {
  1253    SELECT CASE var('a') WHEN 1 THEN 'A' WHEN 2 THEN 'B' WHEN 3 THEN 'C' END
  1254  } {C}
  1255  do_test e_expr-22.1.2 { set ::varlist } {a}
  1256  
  1257  # EVIDENCE-OF: R-07667-49537 The result of the CASE expression is the
  1258  # evaluation of the THEN expression that corresponds to the first WHEN
  1259  # expression for which the comparison is true.
  1260  #
  1261  do_execsql_test e_expr-22.2.1 {
  1262    SELECT CASE 23 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END
  1263  } {B}
  1264  do_execsql_test e_expr-22.2.2 {
  1265    SELECT CASE 1 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END
  1266  } {A}
  1267  
  1268  # EVIDENCE-OF: R-47543-32145 Or, if none of the WHEN expressions
  1269  # evaluate to a value equal to the base expression, the result of
  1270  # evaluating the ELSE expression, if any.
  1271  #
  1272  do_execsql_test e_expr-22.3.1 {
  1273    SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' ELSE 'D' END
  1274  } {D}
  1275  
  1276  # EVIDENCE-OF: R-54721-48557 If there is no ELSE expression and none of
  1277  # the WHEN expressions produce a result equal to the base expression,
  1278  # the overall result is NULL.
  1279  #
  1280  do_execsql_test e_expr-22.4.1 {
  1281    SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END
  1282  } {{}}
  1283  db nullvalue null
  1284  do_execsql_test e_expr-22.4.2 {
  1285    SELECT CASE 24 WHEN 1 THEN 'A' WHEN 23 THEN 'B' WHEN 23 THEN 'C' END
  1286  } {null}
  1287  db nullvalue {}
  1288  
  1289  # EVIDENCE-OF: R-11479-62774 When comparing a base expression against a
  1290  # WHEN expression, the same collating sequence, affinity, and
  1291  # NULL-handling rules apply as if the base expression and WHEN
  1292  # expression are respectively the left- and right-hand operands of an =
  1293  # operator.
  1294  #
  1295  proc rev {str} {
  1296    set ret ""
  1297    set chars [split $str]
  1298    for {set i [expr [llength $chars]-1]} {$i>=0} {incr i -1} {
  1299      append ret [lindex $chars $i]
  1300    }
  1301    set ret
  1302  }
  1303  proc reverse {lhs rhs} {
  1304    string compare [rev $lhs] [rev $rhs]
  1305  }
  1306  db collate reverse reverse
  1307  do_execsql_test e_expr-23.1.1 {
  1308    CREATE TABLE t1(
  1309      a TEXT     COLLATE NOCASE,
  1310      b          COLLATE REVERSE,
  1311      c INTEGER,
  1312      d BLOB
  1313    );
  1314    INSERT INTO t1 VALUES('abc', 'cba', 55, 34.5);
  1315  } {}
  1316  do_execsql_test e_expr-23.1.2 {
  1317    SELECT CASE a WHEN 'xyz' THEN 'A' WHEN 'AbC' THEN 'B' END FROM t1
  1318  } {B}
  1319  do_execsql_test e_expr-23.1.3 {
  1320    SELECT CASE 'AbC' WHEN 'abc' THEN 'A' WHEN a THEN 'B' END FROM t1
  1321  } {B}
  1322  do_execsql_test e_expr-23.1.4 {
  1323    SELECT CASE a WHEN b THEN 'A' ELSE 'B' END FROM t1
  1324  } {B}
  1325  do_execsql_test e_expr-23.1.5 {
  1326    SELECT CASE b WHEN a THEN 'A' ELSE 'B' END FROM t1
  1327  } {B}
  1328  do_execsql_test e_expr-23.1.6 {
  1329    SELECT CASE 55 WHEN '55' THEN 'A' ELSE 'B' END
  1330  } {B}
  1331  do_execsql_test e_expr-23.1.7 {
  1332    SELECT CASE c WHEN '55' THEN 'A' ELSE 'B' END FROM t1
  1333  } {A}
  1334  do_execsql_test e_expr-23.1.8 {
  1335    SELECT CASE '34.5' WHEN d THEN 'A' ELSE 'B' END FROM t1
  1336  } {B}
  1337  do_execsql_test e_expr-23.1.9 {
  1338    SELECT CASE NULL WHEN NULL THEN 'A' ELSE 'B' END
  1339  } {B}
  1340  
  1341  # EVIDENCE-OF: R-37304-39405 If the base expression is NULL then the
  1342  # result of the CASE is always the result of evaluating the ELSE
  1343  # expression if it exists, or NULL if it does not.
  1344  #
  1345  do_execsql_test e_expr-24.1.1 {
  1346    SELECT CASE NULL WHEN 'abc' THEN 'A' WHEN 'def' THEN 'B' END;
  1347  } {{}}
  1348  do_execsql_test e_expr-24.1.2 {
  1349    SELECT CASE NULL WHEN 'abc' THEN 'A' WHEN 'def' THEN 'B' ELSE 'C' END;
  1350  } {C}
  1351  
  1352  # EVIDENCE-OF: R-56280-17369 Both forms of the CASE expression use lazy,
  1353  # or short-circuit, evaluation.
  1354  #
  1355  set varlist [list]
  1356  foreach {a b c} {0 1 0} break
  1357  do_execsql_test e_expr-25.1.1 {
  1358    SELECT CASE WHEN var('a') THEN 'A' 
  1359                WHEN var('b') THEN 'B' 
  1360                WHEN var('c') THEN 'C' 
  1361    END
  1362  } {B}
  1363  do_test e_expr-25.1.2 { set ::varlist } {a b}
  1364  set varlist [list]
  1365  do_execsql_test e_expr-25.1.3 {
  1366    SELECT CASE '0' WHEN var('a') THEN 'A' 
  1367                    WHEN var('b') THEN 'B' 
  1368                    WHEN var('c') THEN 'C' 
  1369    END
  1370  } {A}
  1371  do_test e_expr-25.1.4 { set ::varlist } {a}
  1372  
  1373  # EVIDENCE-OF: R-34773-62253 The only difference between the following
  1374  # two CASE expressions is that the x expression is evaluated exactly
  1375  # once in the first example but might be evaluated multiple times in the
  1376  # second: CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END CASE WHEN
  1377  # x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END
  1378  #
  1379  proc ceval {x} {
  1380    incr ::evalcount
  1381    return $x
  1382  }
  1383  db func ceval ceval
  1384  set ::evalcount 0
  1385  
  1386  do_execsql_test e_expr-26.1.1 {
  1387    CREATE TABLE t2(x, w1, r1, w2, r2, r3);
  1388    INSERT INTO t2 VALUES(1, 1, 'R1', 2, 'R2', 'R3');
  1389    INSERT INTO t2 VALUES(2, 1, 'R1', 2, 'R2', 'R3');
  1390    INSERT INTO t2 VALUES(3, 1, 'R1', 2, 'R2', 'R3');
  1391  } {}
  1392  do_execsql_test e_expr-26.1.2 {
  1393    SELECT CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END FROM t2
  1394  } {R1 R2 R3}
  1395  do_execsql_test e_expr-26.1.3 {
  1396    SELECT CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END FROM t2
  1397  } {R1 R2 R3}
  1398  
  1399  do_execsql_test e_expr-26.1.4 {
  1400    SELECT CASE ceval(x) WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END FROM t2
  1401  } {R1 R2 R3}
  1402  do_test e_expr-26.1.5 { set ::evalcount } {3}
  1403  set ::evalcount 0
  1404  do_execsql_test e_expr-26.1.6 {
  1405    SELECT CASE 
  1406      WHEN ceval(x)=w1 THEN r1 
  1407      WHEN ceval(x)=w2 THEN r2 
  1408      ELSE r3 END 
  1409    FROM t2
  1410  } {R1 R2 R3}
  1411  do_test e_expr-26.1.6 { set ::evalcount } {5}
  1412  
  1413  
  1414  #-------------------------------------------------------------------------
  1415  # Test statements related to CAST expressions.
  1416  #
  1417  # EVIDENCE-OF: R-20854-17109 A CAST conversion is similar to the
  1418  # conversion that takes place when a column affinity is applied to a
  1419  # value except that with the CAST operator the conversion always takes
  1420  # place even if the conversion lossy and irreversible, whereas column
  1421  # affinity only changes the data type of a value if the change is
  1422  # lossless and reversible.
  1423  #
  1424  do_execsql_test e_expr-27.1.1 {
  1425    CREATE TABLE t3(a TEXT, b REAL, c INTEGER);
  1426    INSERT INTO t3 VALUES(X'555655', '1.23abc', 4.5);
  1427    SELECT typeof(a), a, typeof(b), b, typeof(c), c FROM t3;
  1428  } {blob UVU text 1.23abc real 4.5}
  1429  do_execsql_test e_expr-27.1.2 {
  1430    SELECT 
  1431      typeof(CAST(X'555655' as TEXT)), CAST(X'555655' as TEXT),
  1432      typeof(CAST('1.23abc' as REAL)), CAST('1.23abc' as REAL),
  1433      typeof(CAST(4.5 as INTEGER)), CAST(4.5 as INTEGER)
  1434  } {text UVU real 1.23 integer 4}
  1435  
  1436  # EVIDENCE-OF: R-32434-09092 If the value of expr is NULL, then the
  1437  # result of the CAST expression is also NULL.
  1438  #
  1439  do_expr_test e_expr-27.2.1 { CAST(NULL AS integer) } null {}
  1440  do_expr_test e_expr-27.2.2 { CAST(NULL AS text) }    null {}
  1441  do_expr_test e_expr-27.2.3 { CAST(NULL AS blob) }    null {}
  1442  do_expr_test e_expr-27.2.4 { CAST(NULL AS number) }  null {}
  1443  
  1444  # EVIDENCE-OF: R-29283-15561 Otherwise, the storage class of the result
  1445  # is determined by applying the rules for determining column affinity to
  1446  # the type-name.
  1447  #
  1448  # The R-29283-15561 requirement above is demonstrated by all of the 
  1449  # subsequent e_expr-26 tests.
  1450  #
  1451  # EVIDENCE-OF: R-43522-35548 Casting a value to a type-name with no
  1452  # affinity causes the value to be converted into a BLOB.
  1453  #
  1454  do_expr_test e_expr-27.3.1 { CAST('abc' AS blob)       } blob abc
  1455  do_expr_test e_expr-27.3.2 { CAST('def' AS shobblob_x) } blob def
  1456  do_expr_test e_expr-27.3.3 { CAST('ghi' AS abbLOb10)   } blob ghi
  1457  
  1458  # EVIDENCE-OF: R-22956-37754 Casting to a BLOB consists of first casting
  1459  # the value to TEXT in the encoding of the database connection, then
  1460  # interpreting the resulting byte sequence as a BLOB instead of as TEXT.
  1461  #
  1462  do_qexpr_test e_expr-27.4.1 { CAST('ghi' AS blob) } X'676869'
  1463  do_qexpr_test e_expr-27.4.2 { CAST(456 AS blob) }   X'343536'
  1464  do_qexpr_test e_expr-27.4.3 { CAST(1.78 AS blob) }  X'312E3738'
  1465  rename db db2
  1466  sqlite3 db :memory:
  1467  ifcapable {utf16} {
  1468  db eval { PRAGMA encoding = 'utf-16le' }
  1469  do_qexpr_test e_expr-27.4.4 { CAST('ghi' AS blob) } X'670068006900'
  1470  do_qexpr_test e_expr-27.4.5 { CAST(456 AS blob) }   X'340035003600'
  1471  do_qexpr_test e_expr-27.4.6 { CAST(1.78 AS blob) }  X'31002E0037003800'
  1472  }
  1473  db close
  1474  sqlite3 db :memory:
  1475  db eval { PRAGMA encoding = 'utf-16be' }
  1476  ifcapable {utf16} {
  1477  do_qexpr_test e_expr-27.4.7 { CAST('ghi' AS blob) } X'006700680069'
  1478  do_qexpr_test e_expr-27.4.8 { CAST(456 AS blob) }   X'003400350036'
  1479  do_qexpr_test e_expr-27.4.9 { CAST(1.78 AS blob) }  X'0031002E00370038'
  1480  }
  1481  db close
  1482  rename db2 db
  1483  
  1484  # EVIDENCE-OF: R-04207-37981 To cast a BLOB value to TEXT, the sequence
  1485  # of bytes that make up the BLOB is interpreted as text encoded using
  1486  # the database encoding.
  1487  #
  1488  do_expr_test e_expr-28.1.1 { CAST (X'676869' AS text) } text ghi
  1489  do_expr_test e_expr-28.1.2 { CAST (X'670068006900' AS text) } text g
  1490  rename db db2
  1491  sqlite3 db :memory:
  1492  db eval { PRAGMA encoding = 'utf-16le' }
  1493  ifcapable {utf16} {
  1494  do_expr_test e_expr-28.1.3 { CAST (X'676869' AS text) == 'ghi' } integer 0
  1495  do_expr_test e_expr-28.1.4 { CAST (X'670068006900' AS text) } text ghi
  1496  }
  1497  db close
  1498  rename db2 db
  1499  
  1500  # EVIDENCE-OF: R-22235-47006 Casting an INTEGER or REAL value into TEXT
  1501  # renders the value as if via sqlite3_snprintf() except that the
  1502  # resulting TEXT uses the encoding of the database connection.
  1503  #
  1504  do_expr_test e_expr-28.2.1 { CAST (1 AS text)   }     text 1
  1505  do_expr_test e_expr-28.2.2 { CAST (45 AS text)  }     text 45
  1506  do_expr_test e_expr-28.2.3 { CAST (-45 AS text) }     text -45
  1507  do_expr_test e_expr-28.2.4 { CAST (8.8 AS text)    }  text 8.8
  1508  do_expr_test e_expr-28.2.5 { CAST (2.3e+5 AS text) }  text 230000.0
  1509  do_expr_test e_expr-28.2.6 { CAST (-2.3e-5 AS text) } text -2.3e-05
  1510  do_expr_test e_expr-28.2.7 { CAST (0.0 AS text) }     text 0.0
  1511  do_expr_test e_expr-28.2.7 { CAST (0 AS text) }       text 0
  1512  
  1513  # EVIDENCE-OF: R-26346-36443 When casting a BLOB value to a REAL, the
  1514  # value is first converted to TEXT.
  1515  #
  1516  do_expr_test e_expr-29.1.1 { CAST (X'312E3233' AS REAL) } real 1.23
  1517  do_expr_test e_expr-29.1.2 { CAST (X'3233302E30' AS REAL) } real 230.0
  1518  do_expr_test e_expr-29.1.3 { CAST (X'2D392E3837' AS REAL) } real -9.87
  1519  do_expr_test e_expr-29.1.4 { CAST (X'302E30303031' AS REAL) } real 0.0001
  1520  rename db db2
  1521  sqlite3 db :memory:
  1522  ifcapable {utf16} {
  1523  db eval { PRAGMA encoding = 'utf-16le' }
  1524  do_expr_test e_expr-29.1.5 { 
  1525      CAST (X'31002E0032003300' AS REAL) } real 1.23
  1526  do_expr_test e_expr-29.1.6 { 
  1527      CAST (X'3200330030002E003000' AS REAL) } real 230.0
  1528  do_expr_test e_expr-29.1.7 { 
  1529      CAST (X'2D0039002E0038003700' AS REAL) } real -9.87
  1530  do_expr_test e_expr-29.1.8 { 
  1531      CAST (X'30002E003000300030003100' AS REAL) } real 0.0001
  1532  }
  1533  db close
  1534  rename db2 db
  1535  
  1536  # EVIDENCE-OF: R-54898-34554 When casting a TEXT value to REAL, the
  1537  # longest possible prefix of the value that can be interpreted as a real
  1538  # number is extracted from the TEXT value and the remainder ignored.
  1539  #
  1540  do_expr_test e_expr-29.2.1 { CAST('1.23abcd' AS REAL) } real 1.23
  1541  do_expr_test e_expr-29.2.2 { CAST('1.45.23abcd' AS REAL) } real 1.45
  1542  do_expr_test e_expr-29.2.3 { CAST('-2.12e-01ABC' AS REAL) } real -0.212
  1543  do_expr_test e_expr-29.2.4 { CAST('1 2 3 4' AS REAL) } real 1.0
  1544  
  1545  # EVIDENCE-OF: R-11321-47427 Any leading spaces in the TEXT value are
  1546  # ignored when converging from TEXT to REAL.
  1547  #
  1548  do_expr_test e_expr-29.3.1 { CAST(' 1.23abcd' AS REAL) } real 1.23
  1549  do_expr_test e_expr-29.3.2 { CAST('    1.45.23abcd' AS REAL) } real 1.45
  1550  do_expr_test e_expr-29.3.3 { CAST('   -2.12e-01ABC' AS REAL) } real -0.212
  1551  do_expr_test e_expr-29.3.4 { CAST(' 1 2 3 4' AS REAL) } real 1.0
  1552  
  1553  # EVIDENCE-OF: R-22662-28218 If there is no prefix that can be
  1554  # interpreted as a real number, the result of the conversion is 0.0.
  1555  #
  1556  do_expr_test e_expr-29.4.1 { CAST('' AS REAL) } real 0.0
  1557  do_expr_test e_expr-29.4.2 { CAST('not a number' AS REAL) } real 0.0
  1558  do_expr_test e_expr-29.4.3 { CAST('XXI' AS REAL) } real 0.0
  1559  
  1560  # EVIDENCE-OF: R-21829-14563 When casting a BLOB value to INTEGER, the
  1561  # value is first converted to TEXT.
  1562  #
  1563  do_expr_test e_expr-30.1.1 { CAST(X'313233' AS INTEGER) } integer 123
  1564  do_expr_test e_expr-30.1.2 { CAST(X'2D363738' AS INTEGER) } integer -678
  1565  do_expr_test e_expr-30.1.3 { 
  1566    CAST(X'31303030303030' AS INTEGER) 
  1567  } integer 1000000
  1568  do_expr_test e_expr-30.1.4 { 
  1569    CAST(X'2D31313235383939393036383432363234' AS INTEGER) 
  1570  } integer -1125899906842624
  1571  
  1572  rename db db2
  1573  sqlite3 db :memory:
  1574  ifcapable {utf16} {
  1575  execsql { PRAGMA encoding = 'utf-16be' }
  1576  do_expr_test e_expr-30.1.5 { CAST(X'003100320033' AS INTEGER) } integer 123
  1577  do_expr_test e_expr-30.1.6 { CAST(X'002D003600370038' AS INTEGER) } integer -678
  1578  do_expr_test e_expr-30.1.7 { 
  1579    CAST(X'0031003000300030003000300030' AS INTEGER) 
  1580  } integer 1000000
  1581  do_expr_test e_expr-30.1.8 { 
  1582    CAST(X'002D0031003100320035003800390039003900300036003800340032003600320034' AS INTEGER) 
  1583  } integer -1125899906842624
  1584  }
  1585  db close
  1586  rename db2 db
  1587  
  1588  # EVIDENCE-OF: R-47612-45842 When casting a TEXT value to INTEGER, the
  1589  # longest possible prefix of the value that can be interpreted as an
  1590  # integer number is extracted from the TEXT value and the remainder
  1591  # ignored.
  1592  #
  1593  do_expr_test e_expr-30.2.1 { CAST('123abcd' AS INT) } integer 123
  1594  do_expr_test e_expr-30.2.2 { CAST('14523abcd' AS INT) } integer 14523
  1595  do_expr_test e_expr-30.2.3 { CAST('-2.12e-01ABC' AS INT) } integer -2
  1596  do_expr_test e_expr-30.2.4 { CAST('1 2 3 4' AS INT) } integer 1
  1597  
  1598  # EVIDENCE-OF: R-34400-33772 Any leading spaces in the TEXT value when
  1599  # converting from TEXT to INTEGER are ignored.
  1600  #
  1601  do_expr_test e_expr-30.3.1 { CAST('   123abcd' AS INT) } integer 123
  1602  do_expr_test e_expr-30.3.2 { CAST('  14523abcd' AS INT) } integer 14523
  1603  do_expr_test e_expr-30.3.3 { CAST(' -2.12e-01ABC' AS INT) } integer -2
  1604  do_expr_test e_expr-30.3.4 { CAST('     1 2 3 4' AS INT) } integer 1
  1605  
  1606  # EVIDENCE-OF: R-43164-44276 If there is no prefix that can be
  1607  # interpreted as an integer number, the result of the conversion is 0.
  1608  #
  1609  do_expr_test e_expr-30.4.1 { CAST('' AS INTEGER) } integer 0
  1610  do_expr_test e_expr-30.4.2 { CAST('not a number' AS INTEGER) } integer 0
  1611  do_expr_test e_expr-30.4.3 { CAST('XXI' AS INTEGER) } integer 0
  1612  
  1613  # EVIDENCE-OF: R-08980-53124 The CAST operator understands decimal
  1614  # integers only &mdash; conversion of hexadecimal integers stops at
  1615  # the "x" in the "0x" prefix of the hexadecimal integer string and thus
  1616  # result of the CAST is always zero.
  1617  do_expr_test e_expr-30.5.1 { CAST('0x1234' AS INTEGER) } integer 0
  1618  do_expr_test e_expr-30.5.2 { CAST('0X1234' AS INTEGER) } integer 0
  1619  
  1620  # EVIDENCE-OF: R-02752-50091 A cast of a REAL value into an INTEGER
  1621  # results in the integer between the REAL value and zero that is closest
  1622  # to the REAL value.
  1623  #
  1624  do_expr_test e_expr-31.1.1 { CAST(3.14159 AS INTEGER) } integer 3
  1625  do_expr_test e_expr-31.1.2 { CAST(1.99999 AS INTEGER) } integer 1
  1626  do_expr_test e_expr-31.1.3 { CAST(-1.99999 AS INTEGER) } integer -1
  1627  do_expr_test e_expr-31.1.4 { CAST(-0.99999 AS INTEGER) } integer 0
  1628  
  1629  # EVIDENCE-OF: R-51517-40824 If a REAL is greater than the greatest
  1630  # possible signed integer (+9223372036854775807) then the result is the
  1631  # greatest possible signed integer and if the REAL is less than the
  1632  # least possible signed integer (-9223372036854775808) then the result
  1633  # is the least possible signed integer.
  1634  #
  1635  do_expr_test e_expr-31.2.1 { CAST(2e+50 AS INT) } integer 9223372036854775807
  1636  do_expr_test e_expr-31.2.2 { CAST(-2e+50 AS INT) } integer -9223372036854775808
  1637  do_expr_test e_expr-31.2.3 { 
  1638    CAST(-9223372036854775809.0 AS INT)
  1639  } integer -9223372036854775808
  1640  do_expr_test e_expr-31.2.4 { 
  1641    CAST(9223372036854775809.0 AS INT)
  1642  } integer 9223372036854775807
  1643  
  1644  
  1645  # EVIDENCE-OF: R-55084-10555 Casting a TEXT or BLOB value into NUMERIC
  1646  # yields either an INTEGER or a REAL result.
  1647  #
  1648  # EVIDENCE-OF: R-48945-04866 If the input text looks like an integer
  1649  # (there is no decimal point nor exponent) and the value is small enough
  1650  # to fit in a 64-bit signed integer, then the result will be INTEGER.
  1651  #
  1652  # EVIDENCE-OF: R-47045-23194 Input text that looks like floating point
  1653  # (there is a decimal point and/or an exponent) and the text describes a
  1654  # value that can be losslessly converted back and forth between IEEE 754
  1655  # 64-bit float and a 51-bit signed integer, then the result is INTEGER.
  1656  #
  1657  do_expr_test e_expr-32.1.1 { CAST('45'   AS NUMERIC)  } integer 45
  1658  do_expr_test e_expr-32.1.2 { CAST('45.0' AS NUMERIC)  } integer 45
  1659  do_expr_test e_expr-32.1.3 { CAST('45.2' AS NUMERIC)  } real 45.2
  1660  do_expr_test e_expr-32.1.4 { CAST('11abc' AS NUMERIC) } integer 11
  1661  do_expr_test e_expr-32.1.5 { CAST('11.1abc' AS NUMERIC) } real 11.1
  1662  do_expr_test e_expr-32.1.6 {CAST( '9.223372036e14' AS NUMERIC)} integer  922337203600000
  1663  do_expr_test e_expr-32.1.7 {CAST('-9.223372036e14' AS NUMERIC)} integer -922337203600000
  1664  do_test e_expr-32.1.8 {
  1665    set expr {CAST( '9.223372036e15' AS NUMERIC)}
  1666    db eval "SELECT typeof($expr) AS type, printf('%.5e',$expr) AS value"  break;
  1667    list $type $value
  1668  } {real 9.22337e+15}
  1669  do_test e_expr-32.1.9 {
  1670    set expr {CAST('-9.223372036e15' AS NUMERIC)}
  1671    db eval "SELECT typeof($expr) AS type, printf('%.5e',$expr) AS value"  break;
  1672    list $type $value
  1673  } {real -9.22337e+15}
  1674  
  1675  # EVIDENCE-OF: R-50300-26941 Any text input that describes a value
  1676  # outside the range of a 64-bit signed integer yields a REAL result.
  1677  #
  1678  do_expr_test e_expr-32.1.20 { CAST('9223372036854775807' AS numeric) } \
  1679     integer 9223372036854775807
  1680  do_expr_test e_expr-32.1.21 { CAST('9223372036854775808' AS numeric) } \
  1681     real 9.22337203685478e+18
  1682  do_expr_test e_expr-32.1.22 { CAST('-9223372036854775808' AS numeric) } \
  1683     integer -9223372036854775808
  1684  do_expr_test e_expr-32.1.23 { CAST('-9223372036854775809' AS numeric) } \
  1685     real -9.22337203685478e+18
  1686  
  1687  # EVIDENCE-OF: R-30347-18702 Casting a REAL or INTEGER value to NUMERIC
  1688  # is a no-op, even if a real value could be losslessly converted to an
  1689  # integer.
  1690  #
  1691  do_expr_test e_expr-32.2.1 { CAST(13.0 AS NUMERIC) } real 13.0
  1692  do_expr_test e_expr-32.2.2 { CAST(13.5 AS NUMERIC) } real 13.5
  1693  
  1694  do_expr_test e_expr-32.2.3 { 
  1695    CAST(-9223372036854775808 AS NUMERIC)
  1696  } integer -9223372036854775808
  1697  do_expr_test e_expr-32.2.4 { 
  1698    CAST(9223372036854775807 AS NUMERIC)
  1699  } integer 9223372036854775807
  1700  do_expr_test e_expr-32.2.5 { 
  1701    CAST('9223372036854775807 ' AS NUMERIC)
  1702  } integer 9223372036854775807
  1703  do_expr_test e_expr-32.2.6 { 
  1704    CAST('   9223372036854775807   ' AS NUMERIC)
  1705  } integer 9223372036854775807
  1706  do_expr_test e_expr-32.2.7 { 
  1707    CAST('  ' AS NUMERIC)
  1708  } integer 0
  1709  do_execsql_test e_expr-32.2.8 {
  1710    WITH t1(x) AS (VALUES
  1711       ('9000000000000000001'),
  1712       ('9000000000000000001x'),
  1713       ('9000000000000000001 '),
  1714       (' 9000000000000000001 '),
  1715       (' 9000000000000000001'),
  1716       (' 9000000000000000001.'),
  1717       ('9223372036854775807'),
  1718       ('9223372036854775807 '),
  1719       ('   9223372036854775807   '),
  1720       ('9223372036854775808'),
  1721       ('   9223372036854775808   '),
  1722       ('9223372036854775807.0'),
  1723       ('9223372036854775807e+0'),
  1724       ('-5.0'),
  1725       ('-5e+0'))
  1726    SELECT typeof(CAST(x AS NUMERIC)), CAST(x AS NUMERIC)||'' FROM t1;
  1727  } [list \
  1728   integer 9000000000000000001 \
  1729   integer 9000000000000000001 \
  1730   integer 9000000000000000001 \
  1731   integer 9000000000000000001 \
  1732   integer 9000000000000000001 \
  1733   real 9.0e+18 \
  1734   integer 9223372036854775807 \
  1735   integer 9223372036854775807 \
  1736   integer 9223372036854775807 \
  1737   real 9.22337203685478e+18 \
  1738   real 9.22337203685478e+18 \
  1739   real 9.22337203685478e+18 \
  1740   real 9.22337203685478e+18 \
  1741   integer -5 \
  1742   integer -5 \
  1743  ]
  1744  
  1745  # EVIDENCE-OF: R-64550-29191 Note that the result from casting any
  1746  # non-BLOB value into a BLOB and the result from casting any BLOB value
  1747  # into a non-BLOB value may be different depending on whether the
  1748  # database encoding is UTF-8, UTF-16be, or UTF-16le.
  1749  #
  1750  ifcapable {utf16} {
  1751  sqlite3 db1 :memory: ; db1 eval { PRAGMA encoding = 'utf-8' }
  1752  sqlite3 db2 :memory: ; db2 eval { PRAGMA encoding = 'utf-16le' }
  1753  sqlite3 db3 :memory: ; db3 eval { PRAGMA encoding = 'utf-16be' }
  1754  foreach {tn castexpr differs} {
  1755    1 { CAST(123 AS BLOB)    } 1
  1756    2 { CAST('' AS BLOB)     } 0
  1757    3 { CAST('abcd' AS BLOB) } 1
  1758  
  1759    4 { CAST(X'abcd' AS TEXT) } 1
  1760    5 { CAST(X'' AS TEXT)     } 0
  1761  } {
  1762    set r1 [db1 eval "SELECT typeof($castexpr), quote($castexpr)"]
  1763    set r2 [db2 eval "SELECT typeof($castexpr), quote($castexpr)"]
  1764    set r3 [db3 eval "SELECT typeof($castexpr), quote($castexpr)"]
  1765  
  1766    if {$differs} {
  1767      set res [expr {$r1!=$r2 && $r2!=$r3}]
  1768    } else {
  1769      set res [expr {$r1==$r2 && $r2==$r3}]
  1770    }
  1771  
  1772    do_test e_expr-33.1.$tn {set res} 1
  1773  }
  1774  db1 close
  1775  db2 close
  1776  db3 close
  1777  }
  1778  
  1779  #-------------------------------------------------------------------------
  1780  # Test statements related to the EXISTS and NOT EXISTS operators.
  1781  #
  1782  catch { db close }
  1783  forcedelete test.db
  1784  sqlite3 db test.db
  1785  
  1786  do_execsql_test e_expr-34.1 {
  1787    CREATE TABLE t1(a, b);
  1788    INSERT INTO t1 VALUES(1, 2);
  1789    INSERT INTO t1 VALUES(NULL, 2);
  1790    INSERT INTO t1 VALUES(1, NULL);
  1791    INSERT INTO t1 VALUES(NULL, NULL);
  1792  } {}
  1793  
  1794  # EVIDENCE-OF: R-25588-27181 The EXISTS operator always evaluates to one
  1795  # of the integer values 0 and 1.
  1796  #
  1797  # This statement is not tested by itself. Instead, all e_expr-34.* tests 
  1798  # following this point explicitly test that specific invocations of EXISTS
  1799  # return either integer 0 or integer 1.
  1800  #
  1801  
  1802  # EVIDENCE-OF: R-58553-63740 If executing the SELECT statement specified
  1803  # as the right-hand operand of the EXISTS operator would return one or
  1804  # more rows, then the EXISTS operator evaluates to 1.
  1805  #
  1806  foreach {tn expr} {
  1807      1 { EXISTS ( SELECT a FROM t1 ) }
  1808      2 { EXISTS ( SELECT b FROM t1 ) }
  1809      3 { EXISTS ( SELECT 24 ) }
  1810      4 { EXISTS ( SELECT NULL ) }
  1811      5 { EXISTS ( SELECT a FROM t1 WHERE a IS NULL ) }
  1812  } {
  1813    do_expr_test e_expr-34.2.$tn $expr integer 1
  1814  }
  1815  
  1816  # EVIDENCE-OF: R-19673-40972 If executing the SELECT would return no
  1817  # rows at all, then the EXISTS operator evaluates to 0.
  1818  #
  1819  foreach {tn expr} {
  1820      1 { EXISTS ( SELECT a FROM t1 WHERE 0) }
  1821      2 { EXISTS ( SELECT b FROM t1 WHERE a = 5) }
  1822      3 { EXISTS ( SELECT 24 WHERE 0) }
  1823      4 { EXISTS ( SELECT NULL WHERE 1=2) }
  1824  } {
  1825    do_expr_test e_expr-34.3.$tn $expr integer 0
  1826  }
  1827  
  1828  # EVIDENCE-OF: R-35109-49139 The number of columns in each row returned
  1829  # by the SELECT statement (if any) and the specific values returned have
  1830  # no effect on the results of the EXISTS operator.
  1831  #
  1832  foreach {tn expr res} {
  1833      1 { EXISTS ( SELECT * FROM t1 ) }                          1
  1834      2 { EXISTS ( SELECT *, *, * FROM t1 ) }                    1
  1835      3 { EXISTS ( SELECT 24, 25 ) }                             1
  1836      4 { EXISTS ( SELECT NULL, NULL, NULL ) }                   1
  1837      5 { EXISTS ( SELECT a,b,a||b FROM t1 WHERE a IS NULL ) }   1
  1838  
  1839      6 { EXISTS ( SELECT a, a FROM t1 WHERE 0) }                0
  1840      7 { EXISTS ( SELECT b, b, a FROM t1 WHERE a = 5) }         0
  1841      8 { EXISTS ( SELECT 24, 46, 89 WHERE 0) }                  0
  1842      9 { EXISTS ( SELECT NULL, NULL WHERE 1=2) }                0
  1843  } {
  1844    do_expr_test e_expr-34.4.$tn $expr integer $res
  1845  }
  1846  
  1847  # EVIDENCE-OF: R-10645-12439 In particular, rows containing NULL values
  1848  # are not handled any differently from rows without NULL values.
  1849  #
  1850  foreach {tn e1 e2} {
  1851    1 { EXISTS (SELECT 'not null') }    { EXISTS (SELECT NULL) }
  1852    2 { EXISTS (SELECT NULL FROM t1) }  { EXISTS (SELECT 'bread' FROM t1) }
  1853  } {
  1854    set res [db one "SELECT $e1"]
  1855    do_expr_test e_expr-34.5.${tn}a $e1 integer $res
  1856    do_expr_test e_expr-34.5.${tn}b $e2 integer $res
  1857  }
  1858  
  1859  #-------------------------------------------------------------------------
  1860  # Test statements related to scalar sub-queries.
  1861  #
  1862  
  1863  catch { db close }
  1864  forcedelete test.db
  1865  sqlite3 db test.db
  1866  do_test e_expr-35.0 {
  1867    execsql {
  1868      CREATE TABLE t2(a, b);
  1869      INSERT INTO t2 VALUES('one', 'two');
  1870      INSERT INTO t2 VALUES('three', NULL);
  1871      INSERT INTO t2 VALUES(4, 5.0);
  1872    }
  1873  } {}
  1874  
  1875  # EVIDENCE-OF: R-43573-23448 A SELECT statement enclosed in parentheses
  1876  # is a subquery.
  1877  #
  1878  # EVIDENCE-OF: R-56294-03966 All types of SELECT statement, including
  1879  # aggregate and compound SELECT queries (queries with keywords like
  1880  # UNION or EXCEPT) are allowed as scalar subqueries.
  1881  #
  1882  do_expr_test e_expr-35.1.1 { (SELECT 35)   } integer 35
  1883  do_expr_test e_expr-35.1.2 { (SELECT NULL) } null {}
  1884  
  1885  do_expr_test e_expr-35.1.3 { (SELECT count(*) FROM t2) } integer 3
  1886  do_expr_test e_expr-35.1.4 { (SELECT 4 FROM t2) } integer 4
  1887  
  1888  do_expr_test e_expr-35.1.5 { 
  1889    (SELECT b FROM t2 UNION SELECT a+1 FROM t2)
  1890  } null {}
  1891  do_expr_test e_expr-35.1.6 { 
  1892    (SELECT a FROM t2 UNION SELECT COALESCE(b, 55) FROM t2 ORDER BY 1)
  1893  } integer 4
  1894  
  1895  # EVIDENCE-OF: R-22239-33740 A subquery that returns two or more columns
  1896  # is a row value subquery and can only be used as the operand of a
  1897  # comparison operator.
  1898  #
  1899  # The following block tests that errors are returned in a bunch of cases
  1900  # where a subquery returns more than one column.
  1901  #
  1902  set M {/1 {sub-select returns [23] columns - expected 1}/}
  1903  foreach {tn sql} {
  1904    1     { SELECT (SELECT * FROM t2 UNION SELECT a+1, b+1 FROM t2) }
  1905    2     { SELECT (SELECT * FROM t2 UNION SELECT a+1, b+1 FROM t2 ORDER BY 1) }
  1906    3     { SELECT (SELECT 1, 2) }
  1907    4     { SELECT (SELECT NULL, NULL, NULL) }
  1908    5     { SELECT (SELECT * FROM t2) }
  1909    6     { SELECT (SELECT * FROM (SELECT 1, 2, 3)) }
  1910  } {
  1911    do_catchsql_test e_expr-35.2.$tn $sql $M
  1912  }
  1913  
  1914  # EVIDENCE-OF: R-18318-14995 The value of a subquery expression is the
  1915  # first row of the result from the enclosed SELECT statement.
  1916  #
  1917  do_execsql_test e_expr-36.3.1 {
  1918    CREATE TABLE t4(x, y);
  1919    INSERT INTO t4 VALUES(1, 'one');
  1920    INSERT INTO t4 VALUES(2, 'two');
  1921    INSERT INTO t4 VALUES(3, 'three');
  1922  } {}
  1923  
  1924  foreach {tn expr restype resval} {
  1925      2  { ( SELECT x FROM t4 ORDER BY x )      }        integer 1
  1926      3  { ( SELECT x FROM t4 ORDER BY y )      }        integer 1
  1927      4  { ( SELECT x FROM t4 ORDER BY x DESC ) }        integer 3
  1928      5  { ( SELECT x FROM t4 ORDER BY y DESC ) }        integer 2
  1929      6  { ( SELECT y FROM t4 ORDER BY y DESC ) }        text    two
  1930  
  1931      7  { ( SELECT sum(x) FROM t4 )           }         integer 6
  1932      8  { ( SELECT group_concat(y,'') FROM t4 ) }       text    onetwothree
  1933      9  { ( SELECT max(x) FROM t4 WHERE y LIKE '___') } integer 2 
  1934  
  1935  } {
  1936    do_expr_test e_expr-36.3.$tn $expr $restype $resval
  1937  }
  1938  
  1939  # EVIDENCE-OF: R-52325-25449 The value of a subquery expression is NULL
  1940  # if the enclosed SELECT statement returns no rows.
  1941  #
  1942  foreach {tn expr} {
  1943      1  { ( SELECT x FROM t4 WHERE x>3 ORDER BY x )      }
  1944      2  { ( SELECT x FROM t4 WHERE y<'one' ORDER BY y )  }
  1945  } {
  1946    do_expr_test e_expr-36.4.$tn $expr null {}
  1947  }
  1948  
  1949  # EVIDENCE-OF: R-62477-06476 For example, the values NULL, 0.0, 0,
  1950  # 'english' and '0' are all considered to be false.
  1951  #
  1952  do_execsql_test e_expr-37.1 {
  1953     SELECT CASE WHEN NULL THEN 'true' ELSE 'false' END, iif(NULL,'true','false');
  1954  } {false false}
  1955  do_execsql_test e_expr-37.2 {
  1956     SELECT CASE WHEN 0.0 THEN 'true' ELSE 'false' END, iif(0.0,'true','false');
  1957  } {false false}
  1958  do_execsql_test e_expr-37.3 {
  1959     SELECT CASE WHEN 0 THEN 'true' ELSE 'false' END, iif(0,'true','false');
  1960  } {false false}
  1961  do_execsql_test e_expr-37.4 {
  1962     SELECT CASE WHEN 'engligh' THEN 'true' ELSE 'false' END, iif('engligh','true','false');
  1963  } {false false}
  1964  do_execsql_test e_expr-37.5 {
  1965     SELECT CASE WHEN '0' THEN 'true' ELSE 'false' END, iif('0','true','false');
  1966  } {false false}
  1967  
  1968  # EVIDENCE-OF: R-55532-10108 Values 1, 1.0, 0.1, -0.1 and '1english' are
  1969  # considered to be true.
  1970  #
  1971  do_execsql_test e_expr-37.6 {
  1972     SELECT CASE WHEN 1 THEN 'true' ELSE 'false' END, iif(1,'true','false');
  1973  } {true true}
  1974  do_execsql_test e_expr-37.7 {
  1975     SELECT CASE WHEN 1.0 THEN 'true' ELSE 'false' END, iif(1.0,'true','false');
  1976  } {true true}
  1977  do_execsql_test e_expr-37.8 {
  1978     SELECT CASE WHEN 0.1 THEN 'true' ELSE 'false' END, iif(0.1,'true','false');
  1979  } {true true}
  1980  do_execsql_test e_expr-37.9 {
  1981     SELECT CASE WHEN -0.1 THEN 'true' ELSE 'false' END, iif(-0.1,'true','false');
  1982  } {true true}
  1983  do_execsql_test e_expr-37.10 {
  1984     SELECT CASE WHEN '1english' THEN 'true' ELSE 'false' END, iif('1engl','true','false');
  1985  } {true true}
  1986  
  1987  
  1988  finish_test