summaryrefslogtreecommitdiffstats
path: root/test/bestindexA.test
diff options
context:
space:
mode:
Diffstat (limited to 'test/bestindexA.test')
-rw-r--r--test/bestindexA.test135
1 files changed, 135 insertions, 0 deletions
diff --git a/test/bestindexA.test b/test/bestindexA.test
new file mode 100644
index 0000000..1976986
--- /dev/null
+++ b/test/bestindexA.test
@@ -0,0 +1,135 @@
+# 2020-01-29
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+set testprefix bestindexA
+
+ifcapable !vtab {
+ finish_test
+ return
+}
+
+
+proc vtab_command {method args} {
+ switch -- $method {
+ xConnect {
+ return "CREATE TABLE x(a, b, c)"
+ }
+
+ xBestIndex {
+ set hdl [lindex $args 0]
+ set clist [$hdl constraints]
+ foreach c $clist {
+ array set C $c
+ lappend ::vtab_constraints [list $C(op) $C(column)]
+ }
+ return [list]
+ }
+
+ xFilter {
+ return ""
+ }
+
+ xFindFunction {
+ foreach {nArg name} $args {}
+ if {$nArg==2 && $name=="even"} {
+ return 152
+ }
+ return 0
+ }
+
+ }
+
+ return {}
+}
+
+register_tcl_module db
+do_execsql_test 1.0 {
+ CREATE VIRTUAL TABLE t1 USING tcl(vtab_command);
+}
+
+proc do_xbestindex_test {tn sql res} {
+ set script [subst {
+ execsql "$sql"
+ set ::vtab_constraints
+ }]
+
+ uplevel [list do_test $tn $script [list {*}$res]]
+ set ::vtab_constraints [list]
+}
+
+do_xbestindex_test 1.1 {
+ SELECT * FROM t1 WHERE a=?
+} {
+ {eq 0}
+}
+
+do_xbestindex_test 1.2 {
+ SELECT * FROM t1 WHERE a=? LIMIT 10
+} {
+ {eq 0}
+ {limit 0}
+}
+
+do_xbestindex_test 1.3 {
+ SELECT * FROM t1 WHERE a=? AND (b+1)=? LIMIT 10
+} {
+ {eq 0}
+}
+
+proc error_function {args} { error "not a function!" }
+db function even error_function
+
+do_xbestindex_test 1.4 {
+ SELECT * FROM t1 WHERE even(a, ?)
+} {
+ {152 0}
+}
+
+do_xbestindex_test 1.5 {
+ SELECT * FROM t1 WHERE b=10 AND even(a, ?)
+} {
+ {eq 1}
+ {152 0}
+}
+
+do_xbestindex_test 1.6 {
+ SELECT * FROM t1 WHERE b=10 LIMIT 10
+} {
+ {eq 1}
+ {limit 0}
+}
+
+do_xbestindex_test 1.7 {
+ SELECT * FROM t1 WHERE even(b,?) LIMIT 10
+} {
+ {152 1}
+ {limit 0}
+}
+
+do_xbestindex_test 1.8 {
+ SELECT * FROM t1 WHERE b!=? LIMIT 10
+} {
+ {ne 1}
+ {limit 0}
+}
+
+do_xbestindex_test 1.9 {
+ SELECT * FROM t1 WHERE ?=a LIMIT 10
+} {
+ {eq 0}
+ {limit 0}
+}
+
+
+finish_test