# 2012 Jun 4
#
# 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 csr1
proc populate_db {} {
reset_db
execsql { CREATE TABLE t1(a, b) }
for {set i 0} {$i < 10} {incr i} {
execsql { INSERT INTO t1 VALUES($i, $i*$i) }
}
}
proc populate_db_2 {} {
reset_db
execsql { CREATE TABLE t1(a, b) }
for {set i 0} {$i < 10} {incr i} {
execsql { INSERT INTO t1 VALUES($i, randstr(900+$i, 900+$i)) }
}
}
#-------------------------------------------------------------------------
# Check that it is not possible to make an explicit call to lsm_work()
# while there is a read or write transaction open on the connection.
#
populate_db
do_execsql_test 1.1 { SELECT * FROM t1 } {
0 0 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 9 81
}
db eval { SELECT a, b FROM t1 } {
do_test 1.2.1 {
list [catch { sqlite4_lsm_work db main -nmerge 2 -npage 10 } msg] $msg
} {1 SQLITE4_MISUSE}
do_test 1.2.2 {
list [catch { sqlite4_lsm_work db main -nmerge 2 -npage 10 } msg] $msg
} {1 SQLITE4_MISUSE}
break
}
#-------------------------------------------------------------------------
#
populate_db
do_execsql_test 2.1 {
BEGIN;
INSERT INTO t1 VALUES(10, 100);
}
do_test 2.2 {
sqlite4 db2 ./test.db
list [catch { db2 eval { BEGIN ; INSERT INTO t1 VALUES(1, 2) } } msg] $msg
} {1 {database is locked}}
do_execsql_test 2.3 { COMMIT }
do_test 2.4 { sqlite4_lsm_work db2 main -npage 0 } {0}
db2 close
#-------------------------------------------------------------------------
# Check that if a transaction is committed and this causes the in-memory
# tree to be flushed to disk,
#
populate_db_2
do_execsql_test 3.1 {
BEGIN;
INSERT INTO t1 VALUES(10, randstr(910, 910));
}
do_test 3.2 { sqlite4_lsm_config db main autoflush } 1024
do_test 3.3 { sqlite4_lsm_config db main autoflush 4 } 4
do_test 3.4 {
set res [list]
db eval { SELECT a, length(b) AS l FROM t1 } {
lappend res $a $l
# The following commit will flush the in-memory tree to disk.
if {$a == 5} { db eval COMMIT }
}
set res
} [list \
0 900 1 901 2 902 3 903 4 904 5 905 \
6 906 7 907 8 908 9 909 10 910 \
]
finish_test