94331d406a
FossilOrigin-Name: ec6bffa3b0fbf7cdee852cb0208de1f5869dafd88e2ee64c23cec89634219adc
88 lines
1.7 KiB
Plaintext
88 lines
1.7 KiB
Plaintext
# 2023-10-26
|
|
#
|
|
# 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 bestindexB
|
|
|
|
ifcapable !vtab {
|
|
finish_test
|
|
return
|
|
}
|
|
|
|
register_tcl_module db
|
|
|
|
proc vtab_command {method args} {
|
|
switch -- $method {
|
|
xConnect {
|
|
return "CREATE TABLE t1(a, b, c)"
|
|
}
|
|
|
|
xBestIndex {
|
|
set hdl [lindex $args 0]
|
|
set clist [$hdl constraints]
|
|
set orderby [$hdl orderby]
|
|
|
|
if {[info exists ::xbestindex_sql]} {
|
|
explain_i $::xbestindex_sql
|
|
set ::xbestindex_res [ execsql $::xbestindex_sql ]
|
|
}
|
|
|
|
return "cost 1000000 rows 1000000 idxnum 0 idxstr hello"
|
|
}
|
|
|
|
xFilter {
|
|
return "sql {SELECT 0, 1, 2, 3}"
|
|
}
|
|
}
|
|
|
|
return {}
|
|
}
|
|
|
|
do_execsql_test 1.0 {
|
|
CREATE VIRTUAL TABLE x1 USING tcl(vtab_command);
|
|
CREATE TABLE y1(a, b);
|
|
CREATE TABLE y2(a, b);
|
|
} {}
|
|
|
|
do_execsql_test 1.1 {
|
|
SELECT * FROM x1
|
|
} {1 2 3}
|
|
|
|
do_execsql_test 1.2 {
|
|
INSERT INTO y1 VALUES(1, 2) RETURNING rowid;
|
|
} {1}
|
|
|
|
do_execsql_test 1.3 {
|
|
CREATE TRIGGER y1tr BEFORE INSERT ON y1 BEGIN
|
|
SELECT * FROM x1;
|
|
END;
|
|
INSERT INTO y1 VALUES(3, 4) RETURNING rowid;
|
|
} {2}
|
|
|
|
|
|
# This time, rig the xBestIndex() method of the vtab to invoke an SQL
|
|
# statement that uses RETURNING.
|
|
set ::xbestindex_sql {
|
|
INSERT INTO y2 VALUES(NULL, NULL) RETURNING rowid;
|
|
}
|
|
do_execsql_test 1.4 {
|
|
INSERT INTO y1 VALUES(5, 6) RETURNING rowid;
|
|
} {3}
|
|
|
|
do_test 1.5 {
|
|
set ::xbestindex_res
|
|
} {1}
|
|
|
|
finish_test
|