| # 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 |