2 proc do_changeset_test
{tn session res
} {
4 foreach x
$res {lappend r
$x}
5 uplevel do_test
$tn [list [subst -nocommands {
7 sqlite3session_foreach c
[$session changeset
] { lappend x
[set c
] }
12 proc do_patchset_test
{tn session res
} {
14 foreach x
$res {lappend r
$x}
15 uplevel do_test
$tn [list [subst -nocommands {
17 sqlite3session_foreach c
[$session patchset
] { lappend x
[set c
] }
23 proc do_changeset_invert_test
{tn session res
} {
25 foreach x
$res {lappend r
$x}
26 uplevel do_test
$tn [list [subst -nocommands {
28 set changeset
[sqlite3changeset_invert
[$session changeset
]]
29 sqlite3session_foreach c
[set changeset
] { lappend x
[set c
] }
35 proc do_conflict_test
{tn args
} {
39 set O
(-conflicts) [list]
43 foreach key
[array names V
] {
44 if {![info exists O
($key)]} {error "no such option: $key"}
48 proc xConflict
{args
} [subst -nocommands {
49 lappend ::xConflict [set args
]
52 proc bgerror {args
} { set ::background_error $args }
54 sqlite3session S db main
55 S object_config rowid
1
56 foreach t
$O(-tables) { S attach
$t }
59 set ::xConflict [list]
60 sqlite3changeset_apply db2
[S changeset
] xConflict
63 foreach c
$O(-conflicts) {
70 uplevel do_test
$tn [list { set ::xConflict }] [list $conflicts]
74 proc do_common_sql
{sql
} {
79 proc changeset_from_sql
{sql
{dbname main
}} {
80 if {$dbname == "main"} {
81 return [sql_exec_changeset db
$sql]
84 sqlite3session S db
$dbname
85 S object_config rowid
1
86 db
eval "SELECT name FROM $dbname.sqlite_master WHERE type = 'table'" {
100 proc patchset_from_sql
{sql
{dbname main
}} {
102 sqlite3session S db
$dbname
103 db
eval "SELECT name FROM $dbname.sqlite_master WHERE type = 'table'" {
117 # Usage: do_then_apply_sql ?-ignorenoop? SQL ?DBNAME?
119 proc do_then_apply_sql
{args
} {
122 set a1
[lindex $args 0]
123 if {[string length
$a1]>1 && [string first
$a1 -ignorenoop]==0} {
125 set args
[lrange $args 1 end
]
128 if {[llength $args]!=1 && [llength $args]!=2} {
129 error "usage: do_then_apply_sql ?-ignorenoop? SQL ?DBNAME?"
132 set sql
[lindex $args 0]
133 if {[llength $args]==1} {
136 set dbname
[lindex $args 1]
140 proc xConflict args
{ incr ::n_conflict ; return "OMIT" }
142 sqlite3session S db
$dbname
143 S object_config rowid
1
144 db
eval "SELECT name FROM $dbname.sqlite_master WHERE type = 'table'" {
148 set ::changeset [S changeset
]
149 sqlite3changeset_apply db2
$::changeset xConflict
153 if {$rc} {error $msg}
156 set nSave
$::n_conflict
158 proc xConflict args
{ incr ::n_conflict ; return "OMIT" }
159 sqlite3changeset_apply_v2
-ignorenoop db2
$::changeset xConflict
160 if {$::n_conflict!=$nSave} {
161 error "-ignorenoop problem ($::n_conflict $nSave)..."
166 proc do_iterator_test
{tn tbl_list sql res
} {
167 sqlite3session S db main
168 S object_config rowid
1
170 if {[llength $tbl_list]==0} { S attach
* }
171 foreach t
$tbl_list {S attach
$t}
176 foreach v
$res { lappend r
$v }
179 # set ::c [S changeset] ; execsql_pp { SELECT quote($::c) }
180 sqlite3session_foreach c
[S changeset
] { lappend x
$c }
181 uplevel do_test
$tn [list [list set {} $x]] [list $r]
186 # Compare the contents of all tables in [db1] and [db2]. Throw an error if
187 # they are not identical, or return an empty string if they are.
189 proc compare_db
{db1 db2
} {
191 set sql
{SELECT name FROM sqlite_master WHERE type
= 'table' ORDER BY name
}
192 set lot1
[$db1 eval $sql]
193 set lot2
[$db2 eval $sql]
195 if {$lot1 != $lot2} {
198 error "databases contain different tables"
205 $db1 eval "PRAGMA table_info = $tbl" { lappend col1
$name }
206 $db2 eval "PRAGMA table_info = $tbl" { lappend col2
$name }
207 if {$col1 != $col2} { error "table $tbl schema mismatch" }
209 set sql
"SELECT * FROM $tbl ORDER BY [join $col1 ,]"
210 set data1
[$db1 eval $sql]
211 set data2
[$db2 eval $sql]
212 if {$data1 != $data2} {
215 error "table $tbl data mismatch"
222 proc changeset_to_list
{c
} {
224 sqlite3session_foreach elem
$c { lappend list $elem }
228 set ones
{zero one two three four five six seven eight nine
229 ten eleven twelve thirteen fourteen fifteen sixteen seventeen
231 set tens
{{} ten twenty thirty forty fifty sixty seventy eighty ninety
}
232 proc number_name
{n
} {
234 set txt
"[number_name [expr {$n/1000}]] thousand"
235 set n
[expr {$n%1000}]
240 append txt
" [lindex $::ones [expr {$n/100}]] hundred"
241 set n
[expr {$n%100}]
244 append txt
" [lindex $::tens [expr {$n/10}]]"
248 append txt
" [lindex $::ones $n]"
250 set txt
[string trim
$txt]
251 if {$txt==""} {set txt zero
}
255 proc scksum
{db dbname
} {
257 if {$dbname=="temp"} {
258 set master sqlite_temp_master
260 set master
$dbname.sqlite_master
263 set alltab
[$db eval "SELECT name FROM $master WHERE type='table'"]
264 set txt
[$db eval "SELECT * FROM $master ORDER BY type,name,sql"]
265 foreach tab
$alltab {
267 db
eval "PRAGMA $dbname.table_info = $tab" x
{
268 lappend cols
"quote($x(name))"
270 set cols
[join $cols ,]
271 append txt
[db
eval "SELECT $cols FROM $dbname.$tab ORDER BY $cols"]
276 proc do_diff_test
{tn setup
} {
279 execsql
{ ATTACH 'test.db2' AS aux
}
282 sqlite3session S db main
283 S object_config rowid
1
284 foreach tbl
[db
eval {SELECT name FROM sqlite_master WHERE type
='table'
}] {
293 sqlite3changeset_apply db2
$C ""
294 uplevel do_test
$tn.1 [list {execsql
{ PRAGMA integrity_check
} db2
}] ok
297 set cksum
[scksum db main
]
298 uplevel do_test
$tn.2 [list {scksum db aux
}] [list $cksum]