xref: /sqlite-3.40.0/test/bestindex7.test (revision d96ab995)
1# 2020-01-29
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
13set testdir [file dirname $argv0]
14source $testdir/tester.tcl
15set testprefix bestindex7
16
17ifcapable !vtab {
18  finish_test
19  return
20}
21
22register_tcl_module db
23
24proc vtab_command {src method args} {
25  switch -- $method {
26    xConnect {
27      return "CREATE TABLE xxx(a)"
28    }
29
30    xBestIndex {
31      set hdl [lindex $args 0]
32      set clist [$hdl constraints]
33      set orderby [$hdl orderby]
34      set mask [$hdl mask]
35
36      set iCons 0
37      set ret [list]
38      foreach cons $clist {
39        catch { array unset C }
40        array set C $cons
41        if {$C(usable)} {
42          lappend ret use $iCons
43        }
44        incr iCons
45      }
46      return $ret
47    }
48
49    xFilter {
50      return [list sql "SELECT rowid, x FROM $src"]
51    }
52
53  }
54
55  return {}
56}
57
58do_execsql_test 1.0 {
59  CREATE TABLE t1(x);
60  INSERT INTO t1 VALUES(0), (2);
61  CREATE VIRTUAL TABLE vt1 USING tcl(vtab_command t1);
62}
63
64do_execsql_test 1.1 { select * from vt1 } {0 2}
65do_execsql_test 1.2 { select * from vt1 WHERE a=0 } {0}
66do_execsql_test 1.3 { select * from vt1 WHERE a=1 } {}
67do_execsql_test 1.4 { select * from vt1 WHERE a=1 OR a=0} {0}
68
69do_execsql_test 1.5 {
70  UPDATE t1 SET x=NULL WHERE x=2;
71}
72
73do_execsql_test 1.6 { select * from vt1 } {0 {}}
74do_execsql_test 1.7 { select * from vt1 WHERE a=0 } {0}
75do_execsql_test 1.8 { select * from vt1 WHERE a=1 } {}
76do_execsql_test 1.9 { select * from vt1 WHERE a=1 OR a=0} {0}
77do_execsql_test 1.10 { select * from vt1 WHERE a IN (2) } {}
78do_execsql_test 1.10 { select * from vt1 WHERE a IN (0,1,2,3) } {0}
79do_execsql_test 1.11 { select * from vt1 WHERE a IN (0, NULL) } {0}
80do_execsql_test 1.12 { select * from vt1 WHERE a IN (NULL) } {}
81
82finish_test
83