# 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