summaryrefslogtreecommitdiffstats
path: root/test/multiplex4.test
blob: 2caebeadb70f512971234ef972317f7626a49991 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# 2014-09-25
#
# 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.
#
#***********************************************************************
#
# This file contains tests for the "truncate" option in the multiplexor.
#

set testdir [file dirname $argv0]
source $testdir/tester.tcl
set ::testprefix multiplex4

db close
sqlite3_shutdown
sqlite3_multiplex_initialize {} 0

# delete all filesl with the base name of $basename
#
proc multiplex_delete_db {basename} {
  foreach file [glob -nocomplain $basename.*] {
    forcedelete $file
  }
}

# Return a sorted list of all files with the base name of $basename.
# Except, delete all text from the end of $basename through the NNN
# suffix on the end of the filename.
#
proc multiplex_file_list {basename} {
  set x {}
  foreach file [glob -nocomplain $basename.*] {
    regsub "^$basename\\..*(\\d\\d\\d)\$" $file $basename.\\1 file
    lappend x $file
  }
  return [lsort $x]
}

do_test multiplex4-1.0 {
  multiplex_delete_db mx4test
  sqlite3 db {file:mx4test.db?chunksize=10&truncate=1} -uri 1 -vfs multiplex
  db eval {
    CREATE TABLE t1(x);
    INSERT INTO t1(x) VALUES(randomblob(250000));
  }
  multiplex_file_list mx4test
} {mx4test.001 mx4test.db}

do_test multiplex4-1.1 {
  db eval {
    DELETE FROM t1;
    VACUUM;
  }
  multiplex_file_list mx4test
} {mx4test.db}

# NB:  The PRAGMA multiplex_truncate command is implemented using the
# SQLITE_FCNTL_PRAGMA file-control...
#
# EVIDENCE-OF: R-12238-55120 Whenever a PRAGMA statement is parsed, an
# SQLITE_FCNTL_PRAGMA file control is sent to the open sqlite3_file
# object corresponding to the database file to which the pragma
# statement refers.
#
do_test multiplex4-1.2 {
  db eval {PRAGMA multiplex_truncate}
} {on}
do_test multiplex4-1.3 {
  db eval {PRAGMA multiplex_truncate=off}
} {off}
do_test multiplex4-1.4 {
  db eval {PRAGMA multiplex_truncate}
} {off}
do_test multiplex4-1.5 {
  db eval {PRAGMA multiplex_truncate=on}
} {on}
do_test multiplex4-1.6 {
  db eval {PRAGMA multiplex_truncate}
} {on}
do_test multiplex4-1.7 {
  db eval {PRAGMA multiplex_truncate=0}
} {off}
do_test multiplex4-1.8 {
  db eval {PRAGMA multiplex_truncate=1}
} {on}
do_test multiplex4-1.9 {
  db eval {PRAGMA multiplex_truncate=0}
} {off}

# EVIDENCE-OF: R-26188-08449 If the SQLITE_FCNTL_PRAGMA file control
# returns SQLITE_OK, then the parser assumes that the VFS has handled
# the PRAGMA itself and the parser generates a no-op prepared statement
# if result string is NULL, or that returns a copy of the result string
# if the string is non-NULL.
#
do_test multiplex4-1.9-explain {
  db eval {EXPLAIN PRAGMA multiplex_truncate=0;}
} {/String8 \d \d \d off/}

do_test multiplex4-1.10 {
  db eval {
    INSERT INTO t1(x) VALUES(randomblob(250000));
  }
  multiplex_file_list mx4test
} {mx4test.001 mx4test.db}

do_test multiplex4-1.11 {
  db eval {
    DELETE FROM t1;
    VACUUM;
  }
  multiplex_file_list mx4test
} {mx4test.001 mx4test.db}

do_test multiplex4-1.12 {
  db eval {
    PRAGMA multiplex_truncate=ON;
    DROP TABLE t1;
    VACUUM;
  }
  multiplex_file_list mx4test
} {mx4test.db}

catch { db close }
forcedelete mx4test.db
sqlite3_multiplex_shutdown
finish_test