000001 # 2014-09-25
000002 #
000003 # The author disclaims copyright to this source code. In place of
000004 # a legal notice, here is a blessing:
000005 #
000006 # May you do good and not evil.
000007 # May you find forgiveness for yourself and forgive others.
000008 # May you share freely, never taking more than you give.
000009 #
000010 #***********************************************************************
000011 #
000012 # This file contains tests for the "truncate" option in the multiplexor.
000013 #
000014
000015 set testdir [file dirname $argv0]
000016 source $testdir/tester.tcl
000017 set ::testprefix multiplex4
000018
000019 db close
000020 sqlite3_shutdown
000021 sqlite3_multiplex_initialize {} 0
000022
000023 # delete all filesl with the base name of $basename
000024 #
000025 proc multiplex_delete_db {basename} {
000026 foreach file [glob -nocomplain $basename.*] {
000027 forcedelete $file
000028 }
000029 }
000030
000031 # Return a sorted list of all files with the base name of $basename.
000032 # Except, delete all text from the end of $basename through the NNN
000033 # suffix on the end of the filename.
000034 #
000035 proc multiplex_file_list {basename} {
000036 set x {}
000037 foreach file [glob -nocomplain $basename.*] {
000038 regsub "^$basename\\..*(\\d\\d\\d)\$" $file $basename.\\1 file
000039 lappend x $file
000040 }
000041 return [lsort $x]
000042 }
000043
000044 do_test multiplex4-1.0 {
000045 multiplex_delete_db mx4test
000046 sqlite3 db {file:mx4test.db?chunksize=10&truncate=1} -uri 1 -vfs multiplex
000047 db eval {
000048 CREATE TABLE t1(x);
000049 INSERT INTO t1(x) VALUES(randomblob(250000));
000050 }
000051 multiplex_file_list mx4test
000052 } {mx4test.001 mx4test.db}
000053
000054 do_test multiplex4-1.1 {
000055 db eval {
000056 DELETE FROM t1;
000057 VACUUM;
000058 }
000059 multiplex_file_list mx4test
000060 } {mx4test.db}
000061
000062 # NB: The PRAGMA multiplex_truncate command is implemented using the
000063 # SQLITE_FCNTL_PRAGMA file-control...
000064 #
000065 # EVIDENCE-OF: R-12238-55120 Whenever a PRAGMA statement is parsed, an
000066 # SQLITE_FCNTL_PRAGMA file control is sent to the open sqlite3_file
000067 # object corresponding to the database file to which the pragma
000068 # statement refers.
000069 #
000070 do_test multiplex4-1.2 {
000071 db eval {PRAGMA multiplex_truncate}
000072 } {on}
000073 do_test multiplex4-1.3 {
000074 db eval {PRAGMA multiplex_truncate=off}
000075 } {off}
000076 do_test multiplex4-1.4 {
000077 db eval {PRAGMA multiplex_truncate}
000078 } {off}
000079 do_test multiplex4-1.5 {
000080 db eval {PRAGMA multiplex_truncate=on}
000081 } {on}
000082 do_test multiplex4-1.6 {
000083 db eval {PRAGMA multiplex_truncate}
000084 } {on}
000085 do_test multiplex4-1.7 {
000086 db eval {PRAGMA multiplex_truncate=0}
000087 } {off}
000088 do_test multiplex4-1.8 {
000089 db eval {PRAGMA multiplex_truncate=1}
000090 } {on}
000091 do_test multiplex4-1.9 {
000092 db eval {PRAGMA multiplex_truncate=0}
000093 } {off}
000094
000095 # EVIDENCE-OF: R-26188-08449 If the SQLITE_FCNTL_PRAGMA file control
000096 # returns SQLITE_OK, then the parser assumes that the VFS has handled
000097 # the PRAGMA itself and the parser generates a no-op prepared statement
000098 # if result string is NULL, or that returns a copy of the result string
000099 # if the string is non-NULL.
000100 #
000101 do_test multiplex4-1.9-explain {
000102 db eval {EXPLAIN PRAGMA multiplex_truncate=0;}
000103 } {/String8 \d \d \d off/}
000104
000105 do_test multiplex4-1.10 {
000106 db eval {
000107 INSERT INTO t1(x) VALUES(randomblob(250000));
000108 }
000109 multiplex_file_list mx4test
000110 } {mx4test.001 mx4test.db}
000111
000112 do_test multiplex4-1.11 {
000113 db eval {
000114 DELETE FROM t1;
000115 VACUUM;
000116 }
000117 multiplex_file_list mx4test
000118 } {mx4test.001 mx4test.db}
000119
000120 do_test multiplex4-1.12 {
000121 db eval {
000122 PRAGMA multiplex_truncate=ON;
000123 DROP TABLE t1;
000124 VACUUM;
000125 }
000126 multiplex_file_list mx4test
000127 } {mx4test.db}
000128
000129 catch { db close }
000130 forcedelete mx4test.db
000131 sqlite3_multiplex_shutdown
000132 finish_test