1# 2017-06-29
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11#
12# Testing of the STMT virtual table.
13#
14# This also validates the SQLITE_STMTSTATUS_REPREPARE and
15# SQLITE_STMTSTATUS_RUN values for sqlite3_stmt_status().
16#
17
18set testdir [file dirname $argv0]
19source $testdir/tester.tcl
20
21ifcapable !stmtvtab {
22  finish_test
23  return
24}
25
26db cache flush
27db cache size 20
28unset -nocomplain x y z
29set x giraffe
30set y mango
31set z alabama
32do_execsql_test stmtvtab1-100 {
33  CREATE TABLE t1(a,b,c);
34  INSERT INTO t1 VALUES($a,$b,$c);
35  CREATE INDEX t1a ON t1(a);
36  SELECT run, sql FROM sqlite_stmt ORDER BY 1;
37} {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);}}
38set x neon
39set y event
40set z future
41do_execsql_test stmtvtab1-110 {
42  INSERT INTO t1 VALUES($a,$b,$c);
43  SELECT reprep,run,SQL FROM sqlite_stmt WHERE sql LIKE '%INSERT%' AND NOT busy;
44} {1 2 {INSERT INTO t1 VALUES($a,$b,$c);}}
45set x network
46set y fit
47set z metal
48do_execsql_test stmtvtab1-120 {
49  INSERT INTO t1 VALUES($a,$b,$c);
50  SELECT reprep,run,SQL FROM sqlite_stmt WHERE sql LIKE '%INSERT%' AND NOT busy;
51} {1 3 {INSERT INTO t1 VALUES($a,$b,$c);}}
52set x history
53set y detail
54set z grace
55do_execsql_test stmtvtab1-130 {
56  CREATE INDEX t1b ON t1(b);
57  INSERT INTO t1 VALUES($a,$b,$c);
58  SELECT reprep,run,SQL FROM sqlite_stmt WHERE sql LIKE '%INSERT%' AND NOT busy;
59} {2 4 {INSERT INTO t1 VALUES($a,$b,$c);}}
60
61# All statements are still in cache
62#
63do_execsql_test stmtvtab1-140 {
64  SELECT count(*) FROM sqlite_stmt WHERE NOT busy;
65} {6}
66
67# None of the prepared statements should use more than a couple thousand
68# bytes of memory
69#
70#db eval {SELECT mem, sql FROM sqlite_stmt} {puts [format {%5d %s} $mem $sql]}
71do_execsql_test stmtvtab1-150 {
72  SELECT count(*) FROM sqlite_stmt WHERE mem>5000;
73} {0}
74
75# Flushing the cache clears all of the prepared statements.
76#
77db cache flush
78do_execsql_test stmtvtab1-160 {
79  SELECT * FROM sqlite_stmt WHERE NOT busy;
80} {}
81
82finish_test
83