# 2017-06-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. # #*********************************************************************** # # Testing of the STMT virtual table. # # This also validates the SQLITE_STMTSTATUS_REPREPARE and # SQLITE_STMTSTATUS_RUN values for sqlite3_stmt_status(). # set testdir [file dirname $argv0] source $testdir/tester.tcl ifcapable !stmtvtab { finish_test return } db cache flush db cache size 20 unset -nocomplain x y z set x giraffe set y mango set z alabama do_execsql_test stmtvtab1-100 { CREATE TABLE t1(a,b,c); INSERT INTO t1 VALUES($a,$b,$c); CREATE INDEX t1a ON t1(a); SELECT run, sql FROM sqlite_stmt ORDER BY 1; } {1 {SELECT run, sql FROM sqlite_stmt ORDER BY 1;} 1 {CREATE INDEX t1a ON t1(a);} 1 {INSERT INTO t1 VALUES($a,$b,$c);} 1 {CREATE TABLE t1(a,b,c);}} set x neon set y event set z future do_execsql_test stmtvtab1-110 { INSERT INTO t1 VALUES($a,$b,$c); SELECT reprep,run,SQL FROM sqlite_stmt WHERE sql LIKE '%INSERT%' AND NOT busy; } {1 2 {INSERT INTO t1 VALUES($a,$b,$c);}} set x network set y fit set z metal do_execsql_test stmtvtab1-120 { INSERT INTO t1 VALUES($a,$b,$c); SELECT reprep,run,SQL FROM sqlite_stmt WHERE sql LIKE '%INSERT%' AND NOT busy; } {1 3 {INSERT INTO t1 VALUES($a,$b,$c);}} set x history set y detail set z grace do_execsql_test stmtvtab1-130 { CREATE INDEX t1b ON t1(b); INSERT INTO t1 VALUES($a,$b,$c); SELECT reprep,run,SQL FROM sqlite_stmt WHERE sql LIKE '%INSERT%' AND NOT busy; } {2 4 {INSERT INTO t1 VALUES($a,$b,$c);}} # All statements are still in cache # do_execsql_test stmtvtab1-140 { SELECT count(*) FROM sqlite_stmt WHERE NOT busy; } {6} # None of the prepared statements should use more than a couple thousand # bytes of memory # #db eval {SELECT mem, sql FROM sqlite_stmt} {puts [format {%5d %s} $mem $sql]} do_execsql_test stmtvtab1-150 { SELECT count(*) FROM sqlite_stmt WHERE mem>5000; } {0} # Flushing the cache clears all of the prepared statements. # db cache flush do_execsql_test stmtvtab1-160 { SELECT * FROM sqlite_stmt WHERE NOT busy; } {} finish_test