xref: /titanic_51/usr/src/lib/libsqlite/test/btree.test (revision c5c4113dfcabb1eed3d4bdf7609de5170027a794)
1*c5c4113dSnw141292
2*c5c4113dSnw141292#pragma ident	"%Z%%M%	%I%	%E% SMI"
3*c5c4113dSnw141292
4*c5c4113dSnw141292# 2001 September 15
5*c5c4113dSnw141292#
6*c5c4113dSnw141292# The author disclaims copyright to this source code.  In place of
7*c5c4113dSnw141292# a legal notice, here is a blessing:
8*c5c4113dSnw141292#
9*c5c4113dSnw141292#    May you do good and not evil.
10*c5c4113dSnw141292#    May you find forgiveness for yourself and forgive others.
11*c5c4113dSnw141292#    May you share freely, never taking more than you give.
12*c5c4113dSnw141292#
13*c5c4113dSnw141292#***********************************************************************
14*c5c4113dSnw141292# This file implements regression tests for SQLite library.  The
15*c5c4113dSnw141292# focus of this script is btree database backend
16*c5c4113dSnw141292#
17*c5c4113dSnw141292# $Id: btree.test,v 1.15 2004/02/10 01:54:28 drh Exp $
18*c5c4113dSnw141292
19*c5c4113dSnw141292
20*c5c4113dSnw141292set testdir [file dirname $argv0]
21*c5c4113dSnw141292source $testdir/tester.tcl
22*c5c4113dSnw141292
23*c5c4113dSnw141292if {[info commands btree_open]!="" && $SQLITE_PAGE_SIZE==1024
24*c5c4113dSnw141292     && $SQLITE_USABLE_SIZE==1024} {
25*c5c4113dSnw141292
26*c5c4113dSnw141292# Basic functionality.  Open and close a database.
27*c5c4113dSnw141292#
28*c5c4113dSnw141292do_test btree-1.1 {
29*c5c4113dSnw141292  file delete -force test1.bt
30*c5c4113dSnw141292  file delete -force test1.bt-journal
31*c5c4113dSnw141292  set rc [catch {btree_open test1.bt} ::b1]
32*c5c4113dSnw141292} {0}
33*c5c4113dSnw141292
34*c5c4113dSnw141292# The second element of the list returned by btree_pager_stats is the
35*c5c4113dSnw141292# number of pages currently checked out.  We'll be checking this value
36*c5c4113dSnw141292# frequently during this test script, to make sure the btree library
37*c5c4113dSnw141292# is properly releasing the pages it checks out, and thus avoiding
38*c5c4113dSnw141292# page leaks.
39*c5c4113dSnw141292#
40*c5c4113dSnw141292do_test btree-1.1.1 {
41*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
42*c5c4113dSnw141292} {0}
43*c5c4113dSnw141292do_test btree-1.2 {
44*c5c4113dSnw141292  set rc [catch {btree_open test1.bt} ::b2]
45*c5c4113dSnw141292} {0}
46*c5c4113dSnw141292do_test btree-1.3 {
47*c5c4113dSnw141292  set rc [catch {btree_close $::b2} msg]
48*c5c4113dSnw141292  lappend rc $msg
49*c5c4113dSnw141292} {0 {}}
50*c5c4113dSnw141292
51*c5c4113dSnw141292# Do an insert and verify that the database file grows in size.
52*c5c4113dSnw141292#
53*c5c4113dSnw141292do_test btree-1.4 {
54*c5c4113dSnw141292  set rc [catch {btree_begin_transaction $::b1} msg]
55*c5c4113dSnw141292  lappend rc $msg
56*c5c4113dSnw141292} {0 {}}
57*c5c4113dSnw141292do_test btree-1.4.1 {
58*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
59*c5c4113dSnw141292} {1}
60*c5c4113dSnw141292do_test btree-1.5 {
61*c5c4113dSnw141292  set rc [catch {btree_cursor $::b1 2 1} ::c1]
62*c5c4113dSnw141292  if {$rc} {lappend rc $::c1}
63*c5c4113dSnw141292  set rc
64*c5c4113dSnw141292} {0}
65*c5c4113dSnw141292do_test btree-1.6 {
66*c5c4113dSnw141292  set rc [catch {btree_insert $::c1 one 1.00} msg]
67*c5c4113dSnw141292  lappend rc $msg
68*c5c4113dSnw141292} {0 {}}
69*c5c4113dSnw141292do_test btree-1.7 {
70*c5c4113dSnw141292  btree_key $::c1
71*c5c4113dSnw141292} {one}
72*c5c4113dSnw141292do_test btree-1.8 {
73*c5c4113dSnw141292  btree_data $::c1
74*c5c4113dSnw141292} {1.00}
75*c5c4113dSnw141292do_test btree-1.9 {
76*c5c4113dSnw141292  set rc [catch {btree_close_cursor $::c1} msg]
77*c5c4113dSnw141292  lappend rc $msg
78*c5c4113dSnw141292} {0 {}}
79*c5c4113dSnw141292do_test btree-1.10 {
80*c5c4113dSnw141292  set rc [catch {btree_commit $::b1} msg]
81*c5c4113dSnw141292  lappend rc $msg
82*c5c4113dSnw141292} {0 {}}
83*c5c4113dSnw141292do_test btree-1.11 {
84*c5c4113dSnw141292  file size test1.bt
85*c5c4113dSnw141292} {2048}
86*c5c4113dSnw141292do_test btree-1.12 {
87*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
88*c5c4113dSnw141292} {0}
89*c5c4113dSnw141292
90*c5c4113dSnw141292# Reopen the database and attempt to read the record that we wrote.
91*c5c4113dSnw141292#
92*c5c4113dSnw141292do_test btree-2.1 {
93*c5c4113dSnw141292  set rc [catch {btree_cursor $::b1 2 1} ::c1]
94*c5c4113dSnw141292  if {$rc} {lappend rc $::c1}
95*c5c4113dSnw141292  set rc
96*c5c4113dSnw141292} {0}
97*c5c4113dSnw141292do_test btree-2.2 {
98*c5c4113dSnw141292  btree_move_to $::c1 abc
99*c5c4113dSnw141292} {1}
100*c5c4113dSnw141292do_test btree-2.3 {
101*c5c4113dSnw141292  btree_move_to $::c1 xyz
102*c5c4113dSnw141292} {-1}
103*c5c4113dSnw141292do_test btree-2.4 {
104*c5c4113dSnw141292  btree_move_to $::c1 one
105*c5c4113dSnw141292} {0}
106*c5c4113dSnw141292do_test btree-2.5 {
107*c5c4113dSnw141292  btree_key $::c1
108*c5c4113dSnw141292} {one}
109*c5c4113dSnw141292do_test btree-2.6 {
110*c5c4113dSnw141292  btree_data $::c1
111*c5c4113dSnw141292} {1.00}
112*c5c4113dSnw141292do_test btree-2.7 {
113*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
114*c5c4113dSnw141292} {2}
115*c5c4113dSnw141292
116*c5c4113dSnw141292# Do some additional inserts
117*c5c4113dSnw141292#
118*c5c4113dSnw141292do_test btree-3.1 {
119*c5c4113dSnw141292  btree_begin_transaction $::b1
120*c5c4113dSnw141292  btree_insert $::c1 two 2.00
121*c5c4113dSnw141292  btree_key $::c1
122*c5c4113dSnw141292} {two}
123*c5c4113dSnw141292do_test btree-3.1.1 {
124*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
125*c5c4113dSnw141292} {2}
126*c5c4113dSnw141292do_test btree-3.2 {
127*c5c4113dSnw141292  btree_insert $::c1 three 3.00
128*c5c4113dSnw141292  btree_key $::c1
129*c5c4113dSnw141292} {three}
130*c5c4113dSnw141292do_test btree-3.4 {
131*c5c4113dSnw141292  btree_insert $::c1 four 4.00
132*c5c4113dSnw141292  btree_key $::c1
133*c5c4113dSnw141292} {four}
134*c5c4113dSnw141292do_test btree-3.5 {
135*c5c4113dSnw141292  btree_insert $::c1 five 5.00
136*c5c4113dSnw141292  btree_key $::c1
137*c5c4113dSnw141292} {five}
138*c5c4113dSnw141292do_test btree-3.6 {
139*c5c4113dSnw141292  btree_insert $::c1 six 6.00
140*c5c4113dSnw141292  btree_key $::c1
141*c5c4113dSnw141292} {six}
142*c5c4113dSnw141292#btree_page_dump $::b1 2
143*c5c4113dSnw141292do_test btree-3.7 {
144*c5c4113dSnw141292  set rc [btree_move_to $::c1 {}]
145*c5c4113dSnw141292  expr {$rc>0}
146*c5c4113dSnw141292} {1}
147*c5c4113dSnw141292do_test btree-3.8 {
148*c5c4113dSnw141292  btree_key $::c1
149*c5c4113dSnw141292} {five}
150*c5c4113dSnw141292do_test btree-3.9 {
151*c5c4113dSnw141292  btree_data $::c1
152*c5c4113dSnw141292} {5.00}
153*c5c4113dSnw141292do_test btree-3.10 {
154*c5c4113dSnw141292  btree_next $::c1
155*c5c4113dSnw141292  btree_key $::c1
156*c5c4113dSnw141292} {four}
157*c5c4113dSnw141292do_test btree-3.11 {
158*c5c4113dSnw141292  btree_data $::c1
159*c5c4113dSnw141292} {4.00}
160*c5c4113dSnw141292do_test btree-3.12 {
161*c5c4113dSnw141292  btree_next $::c1
162*c5c4113dSnw141292  btree_key $::c1
163*c5c4113dSnw141292} {one}
164*c5c4113dSnw141292do_test btree-3.13 {
165*c5c4113dSnw141292  btree_data $::c1
166*c5c4113dSnw141292} {1.00}
167*c5c4113dSnw141292do_test btree-3.14 {
168*c5c4113dSnw141292  btree_next $::c1
169*c5c4113dSnw141292  btree_key $::c1
170*c5c4113dSnw141292} {six}
171*c5c4113dSnw141292do_test btree-3.15 {
172*c5c4113dSnw141292  btree_data $::c1
173*c5c4113dSnw141292} {6.00}
174*c5c4113dSnw141292do_test btree-3.16 {
175*c5c4113dSnw141292  btree_next $::c1
176*c5c4113dSnw141292  btree_key $::c1
177*c5c4113dSnw141292} {three}
178*c5c4113dSnw141292do_test btree-3.17 {
179*c5c4113dSnw141292  btree_data $::c1
180*c5c4113dSnw141292} {3.00}
181*c5c4113dSnw141292do_test btree-3.18 {
182*c5c4113dSnw141292  btree_next $::c1
183*c5c4113dSnw141292  btree_key $::c1
184*c5c4113dSnw141292} {two}
185*c5c4113dSnw141292do_test btree-3.19 {
186*c5c4113dSnw141292  btree_data $::c1
187*c5c4113dSnw141292} {2.00}
188*c5c4113dSnw141292do_test btree-3.20 {
189*c5c4113dSnw141292  btree_next $::c1
190*c5c4113dSnw141292  btree_key $::c1
191*c5c4113dSnw141292} {}
192*c5c4113dSnw141292do_test btree-3.21 {
193*c5c4113dSnw141292  btree_data $::c1
194*c5c4113dSnw141292} {}
195*c5c4113dSnw141292
196*c5c4113dSnw141292# Commit the changes, reopen and reread the data
197*c5c4113dSnw141292#
198*c5c4113dSnw141292do_test btree-3.22 {
199*c5c4113dSnw141292  set rc [catch {btree_close_cursor $::c1} msg]
200*c5c4113dSnw141292  lappend rc $msg
201*c5c4113dSnw141292} {0 {}}
202*c5c4113dSnw141292do_test btree-3.22.1 {
203*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
204*c5c4113dSnw141292} {1}
205*c5c4113dSnw141292do_test btree-3.23 {
206*c5c4113dSnw141292  set rc [catch {btree_commit $::b1} msg]
207*c5c4113dSnw141292  lappend rc $msg
208*c5c4113dSnw141292} {0 {}}
209*c5c4113dSnw141292do_test btree-3.23.1 {
210*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
211*c5c4113dSnw141292} {0}
212*c5c4113dSnw141292do_test btree-3.24 {
213*c5c4113dSnw141292  file size test1.bt
214*c5c4113dSnw141292} {2048}
215*c5c4113dSnw141292do_test btree-3.25 {
216*c5c4113dSnw141292  set rc [catch {btree_cursor $::b1 2 1} ::c1]
217*c5c4113dSnw141292  if {$rc} {lappend rc $::c1}
218*c5c4113dSnw141292  set rc
219*c5c4113dSnw141292} {0}
220*c5c4113dSnw141292do_test btree-3.25.1 {
221*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
222*c5c4113dSnw141292} {2}
223*c5c4113dSnw141292do_test btree-3.26 {
224*c5c4113dSnw141292  set rc [btree_move_to $::c1 {}]
225*c5c4113dSnw141292  expr {$rc>0}
226*c5c4113dSnw141292} {1}
227*c5c4113dSnw141292do_test btree-3.27 {
228*c5c4113dSnw141292  btree_key $::c1
229*c5c4113dSnw141292} {five}
230*c5c4113dSnw141292do_test btree-3.28 {
231*c5c4113dSnw141292  btree_data $::c1
232*c5c4113dSnw141292} {5.00}
233*c5c4113dSnw141292do_test btree-3.29 {
234*c5c4113dSnw141292  btree_next $::c1
235*c5c4113dSnw141292  btree_key $::c1
236*c5c4113dSnw141292} {four}
237*c5c4113dSnw141292do_test btree-3.30 {
238*c5c4113dSnw141292  btree_data $::c1
239*c5c4113dSnw141292} {4.00}
240*c5c4113dSnw141292do_test btree-3.31 {
241*c5c4113dSnw141292  btree_next $::c1
242*c5c4113dSnw141292  btree_key $::c1
243*c5c4113dSnw141292} {one}
244*c5c4113dSnw141292do_test btree-3.32 {
245*c5c4113dSnw141292  btree_data $::c1
246*c5c4113dSnw141292} {1.00}
247*c5c4113dSnw141292do_test btree-3.33 {
248*c5c4113dSnw141292  btree_next $::c1
249*c5c4113dSnw141292  btree_key $::c1
250*c5c4113dSnw141292} {six}
251*c5c4113dSnw141292do_test btree-3.34 {
252*c5c4113dSnw141292  btree_data $::c1
253*c5c4113dSnw141292} {6.00}
254*c5c4113dSnw141292do_test btree-3.35 {
255*c5c4113dSnw141292  btree_next $::c1
256*c5c4113dSnw141292  btree_key $::c1
257*c5c4113dSnw141292} {three}
258*c5c4113dSnw141292do_test btree-3.36 {
259*c5c4113dSnw141292  btree_data $::c1
260*c5c4113dSnw141292} {3.00}
261*c5c4113dSnw141292do_test btree-3.37 {
262*c5c4113dSnw141292  btree_next $::c1
263*c5c4113dSnw141292  btree_key $::c1
264*c5c4113dSnw141292} {two}
265*c5c4113dSnw141292do_test btree-3.38 {
266*c5c4113dSnw141292  btree_data $::c1
267*c5c4113dSnw141292} {2.00}
268*c5c4113dSnw141292do_test btree-3.39 {
269*c5c4113dSnw141292  btree_next $::c1
270*c5c4113dSnw141292  btree_key $::c1
271*c5c4113dSnw141292} {}
272*c5c4113dSnw141292do_test btree-3.40 {
273*c5c4113dSnw141292  btree_data $::c1
274*c5c4113dSnw141292} {}
275*c5c4113dSnw141292do_test btree-3.41 {
276*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
277*c5c4113dSnw141292} {2}
278*c5c4113dSnw141292
279*c5c4113dSnw141292
280*c5c4113dSnw141292# Now try a delete
281*c5c4113dSnw141292#
282*c5c4113dSnw141292do_test btree-4.1 {
283*c5c4113dSnw141292  btree_begin_transaction $::b1
284*c5c4113dSnw141292  btree_move_to $::c1 one
285*c5c4113dSnw141292  btree_key $::c1
286*c5c4113dSnw141292} {one}
287*c5c4113dSnw141292do_test btree-4.1.1 {
288*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
289*c5c4113dSnw141292} {2}
290*c5c4113dSnw141292do_test btree-4.2 {
291*c5c4113dSnw141292  btree_delete $::c1
292*c5c4113dSnw141292} {}
293*c5c4113dSnw141292do_test btree-4.3 {
294*c5c4113dSnw141292  btree_key $::c1
295*c5c4113dSnw141292} {six}
296*c5c4113dSnw141292do_test btree-4.4 {
297*c5c4113dSnw141292  btree_next $::c1
298*c5c4113dSnw141292  btree_key $::c1
299*c5c4113dSnw141292} {six}
300*c5c4113dSnw141292do_test btree-4.5 {
301*c5c4113dSnw141292  btree_next $::c1
302*c5c4113dSnw141292  btree_key $::c1
303*c5c4113dSnw141292} {three}
304*c5c4113dSnw141292do_test btree-4.4 {
305*c5c4113dSnw141292  btree_move_to $::c1 {}
306*c5c4113dSnw141292  set r {}
307*c5c4113dSnw141292  while 1 {
308*c5c4113dSnw141292    set key [btree_key $::c1]
309*c5c4113dSnw141292    if {$key==""} break
310*c5c4113dSnw141292    lappend r $key
311*c5c4113dSnw141292    lappend r [btree_data $::c1]
312*c5c4113dSnw141292    btree_next $::c1
313*c5c4113dSnw141292  }
314*c5c4113dSnw141292  set r
315*c5c4113dSnw141292} {five 5.00 four 4.00 six 6.00 three 3.00 two 2.00}
316*c5c4113dSnw141292
317*c5c4113dSnw141292# Commit and make sure the delete is still there.
318*c5c4113dSnw141292#
319*c5c4113dSnw141292do_test btree-4.5 {
320*c5c4113dSnw141292  btree_commit $::b1
321*c5c4113dSnw141292  btree_move_to $::c1 {}
322*c5c4113dSnw141292  set r {}
323*c5c4113dSnw141292  while 1 {
324*c5c4113dSnw141292    set key [btree_key $::c1]
325*c5c4113dSnw141292    if {$key==""} break
326*c5c4113dSnw141292    lappend r $key
327*c5c4113dSnw141292    lappend r [btree_data $::c1]
328*c5c4113dSnw141292    btree_next $::c1
329*c5c4113dSnw141292  }
330*c5c4113dSnw141292  set r
331*c5c4113dSnw141292} {five 5.00 four 4.00 six 6.00 three 3.00 two 2.00}
332*c5c4113dSnw141292
333*c5c4113dSnw141292# Completely close the database and reopen it.  Then check
334*c5c4113dSnw141292# the data again.
335*c5c4113dSnw141292#
336*c5c4113dSnw141292do_test btree-4.6 {
337*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
338*c5c4113dSnw141292} {2}
339*c5c4113dSnw141292do_test btree-4.7 {
340*c5c4113dSnw141292  btree_close_cursor $::c1
341*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
342*c5c4113dSnw141292} {0}
343*c5c4113dSnw141292do_test btree-4.8 {
344*c5c4113dSnw141292  btree_close $::b1
345*c5c4113dSnw141292  set ::b1 [btree_open test1.bt]
346*c5c4113dSnw141292  set ::c1 [btree_cursor $::b1 2 1]
347*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
348*c5c4113dSnw141292} {2}
349*c5c4113dSnw141292do_test btree-4.9 {
350*c5c4113dSnw141292  set r {}
351*c5c4113dSnw141292  btree_first $::c1
352*c5c4113dSnw141292  while 1 {
353*c5c4113dSnw141292    set key [btree_key $::c1]
354*c5c4113dSnw141292    if {$key==""} break
355*c5c4113dSnw141292    lappend r $key
356*c5c4113dSnw141292    lappend r [btree_data $::c1]
357*c5c4113dSnw141292    btree_next $::c1
358*c5c4113dSnw141292  }
359*c5c4113dSnw141292  set r
360*c5c4113dSnw141292} {five 5.00 four 4.00 six 6.00 three 3.00 two 2.00}
361*c5c4113dSnw141292
362*c5c4113dSnw141292# Try to read and write meta data
363*c5c4113dSnw141292#
364*c5c4113dSnw141292do_test btree-5.1 {
365*c5c4113dSnw141292  btree_get_meta $::b1
366*c5c4113dSnw141292} {0 0 0 0 0 0 0 0 0 0}
367*c5c4113dSnw141292do_test btree-5.2 {
368*c5c4113dSnw141292  set rc [catch {btree_update_meta $::b1 1 2 3 4 5 6 7 8 9 10} msg]
369*c5c4113dSnw141292  lappend rc $msg
370*c5c4113dSnw141292} {1 SQLITE_ERROR}
371*c5c4113dSnw141292do_test btree-5.3 {
372*c5c4113dSnw141292  btree_begin_transaction $::b1
373*c5c4113dSnw141292  set rc [catch {btree_update_meta $::b1 1 2 3 4 5 6 7 8 9 10} msg]
374*c5c4113dSnw141292  lappend rc $msg
375*c5c4113dSnw141292} {0 {}}
376*c5c4113dSnw141292do_test btree-5.4 {
377*c5c4113dSnw141292  btree_get_meta $::b1
378*c5c4113dSnw141292} {0 2 3 4 5 6 7 8 9 10}
379*c5c4113dSnw141292do_test btree-5.5 {
380*c5c4113dSnw141292  btree_close_cursor $::c1
381*c5c4113dSnw141292  btree_rollback $::b1
382*c5c4113dSnw141292  btree_get_meta $::b1
383*c5c4113dSnw141292} {0 0 0 0 0 0 0 0 0 0}
384*c5c4113dSnw141292do_test btree-5.6 {
385*c5c4113dSnw141292  btree_begin_transaction $::b1
386*c5c4113dSnw141292  btree_update_meta $::b1 999 10 20 30 40 50 60 70 80 90
387*c5c4113dSnw141292  btree_commit $::b1
388*c5c4113dSnw141292  btree_get_meta $::b1
389*c5c4113dSnw141292} {0 10 20 30 40 50 60 70 80 90}
390*c5c4113dSnw141292
391*c5c4113dSnw141292proc select_all {cursor} {
392*c5c4113dSnw141292  set r {}
393*c5c4113dSnw141292  btree_move_to $cursor {}
394*c5c4113dSnw141292  while 1 {
395*c5c4113dSnw141292    set key [btree_key $cursor]
396*c5c4113dSnw141292    if {$key==""} break
397*c5c4113dSnw141292    lappend r $key
398*c5c4113dSnw141292    lappend r [btree_data $cursor]
399*c5c4113dSnw141292    btree_next $cursor
400*c5c4113dSnw141292  }
401*c5c4113dSnw141292  return $r
402*c5c4113dSnw141292}
403*c5c4113dSnw141292proc select_keys {cursor} {
404*c5c4113dSnw141292  set r {}
405*c5c4113dSnw141292  btree_move_to $cursor {}
406*c5c4113dSnw141292  while 1 {
407*c5c4113dSnw141292    set key [btree_key $cursor]
408*c5c4113dSnw141292    if {$key==""} break
409*c5c4113dSnw141292    lappend r $key
410*c5c4113dSnw141292    btree_next $cursor
411*c5c4113dSnw141292  }
412*c5c4113dSnw141292  return $r
413*c5c4113dSnw141292}
414*c5c4113dSnw141292
415*c5c4113dSnw141292# Try to create a new table in the database file
416*c5c4113dSnw141292#
417*c5c4113dSnw141292do_test btree-6.1 {
418*c5c4113dSnw141292  set rc [catch {btree_create_table $::b1} msg]
419*c5c4113dSnw141292  lappend rc $msg
420*c5c4113dSnw141292} {1 SQLITE_ERROR}
421*c5c4113dSnw141292do_test btree-6.2 {
422*c5c4113dSnw141292  btree_begin_transaction $::b1
423*c5c4113dSnw141292  set ::t2 [btree_create_table $::b1]
424*c5c4113dSnw141292} {3}
425*c5c4113dSnw141292do_test btree-6.2.1 {
426*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
427*c5c4113dSnw141292} {1}
428*c5c4113dSnw141292do_test btree-6.2.2 {
429*c5c4113dSnw141292  set ::c2 [btree_cursor $::b1 $::t2 1]
430*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
431*c5c4113dSnw141292} {2}
432*c5c4113dSnw141292do_test btree-6.2.3 {
433*c5c4113dSnw141292  btree_insert $::c2 ten 10
434*c5c4113dSnw141292  btree_key $::c2
435*c5c4113dSnw141292} {ten}
436*c5c4113dSnw141292do_test btree-6.3 {
437*c5c4113dSnw141292  btree_commit $::b1
438*c5c4113dSnw141292  set ::c1 [btree_cursor $::b1 2 1]
439*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
440*c5c4113dSnw141292} {3}
441*c5c4113dSnw141292do_test btree-6.3.1 {
442*c5c4113dSnw141292  select_all $::c1
443*c5c4113dSnw141292} {five 5.00 four 4.00 six 6.00 three 3.00 two 2.00}
444*c5c4113dSnw141292#btree_page_dump $::b1 3
445*c5c4113dSnw141292do_test btree-6.4 {
446*c5c4113dSnw141292  select_all $::c2
447*c5c4113dSnw141292} {ten 10}
448*c5c4113dSnw141292
449*c5c4113dSnw141292# Drop the new table, then create it again anew.
450*c5c4113dSnw141292#
451*c5c4113dSnw141292do_test btree-6.5 {
452*c5c4113dSnw141292  btree_begin_transaction $::b1
453*c5c4113dSnw141292} {}
454*c5c4113dSnw141292do_test btree-6.6 {
455*c5c4113dSnw141292  btree_close_cursor $::c2
456*c5c4113dSnw141292} {}
457*c5c4113dSnw141292do_test btree-6.6.1 {
458*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
459*c5c4113dSnw141292} {2}
460*c5c4113dSnw141292do_test btree-6.7 {
461*c5c4113dSnw141292  btree_drop_table $::b1 $::t2
462*c5c4113dSnw141292} {}
463*c5c4113dSnw141292do_test btree-6.7.1 {
464*c5c4113dSnw141292  lindex [btree_get_meta $::b1] 0
465*c5c4113dSnw141292} {1}
466*c5c4113dSnw141292do_test btree-6.8 {
467*c5c4113dSnw141292  set ::t2 [btree_create_table $::b1]
468*c5c4113dSnw141292} {3}
469*c5c4113dSnw141292do_test btree-6.8.1 {
470*c5c4113dSnw141292  lindex [btree_get_meta $::b1] 0
471*c5c4113dSnw141292} {0}
472*c5c4113dSnw141292do_test btree-6.9 {
473*c5c4113dSnw141292  set ::c2 [btree_cursor $::b1 $::t2 1]
474*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
475*c5c4113dSnw141292} {3}
476*c5c4113dSnw141292
477*c5c4113dSnw141292do_test btree-6.9.1 {
478*c5c4113dSnw141292  btree_move_to $::c2 {}
479*c5c4113dSnw141292  btree_key $::c2
480*c5c4113dSnw141292} {}
481*c5c4113dSnw141292
482*c5c4113dSnw141292# If we drop table 2 it just clears the table.  Table 2 always exists.
483*c5c4113dSnw141292#
484*c5c4113dSnw141292do_test btree-6.10 {
485*c5c4113dSnw141292  btree_close_cursor $::c1
486*c5c4113dSnw141292  btree_drop_table $::b1 2
487*c5c4113dSnw141292  set ::c1 [btree_cursor $::b1 2 1]
488*c5c4113dSnw141292  btree_move_to $::c1 {}
489*c5c4113dSnw141292  btree_key $::c1
490*c5c4113dSnw141292} {}
491*c5c4113dSnw141292do_test btree-6.11 {
492*c5c4113dSnw141292  btree_commit $::b1
493*c5c4113dSnw141292  select_all $::c1
494*c5c4113dSnw141292} {}
495*c5c4113dSnw141292do_test btree-6.12 {
496*c5c4113dSnw141292  select_all $::c2
497*c5c4113dSnw141292} {}
498*c5c4113dSnw141292do_test btree-6.13 {
499*c5c4113dSnw141292  btree_close_cursor $::c2
500*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
501*c5c4113dSnw141292} {2}
502*c5c4113dSnw141292
503*c5c4113dSnw141292# Check to see that pages defragment properly.  To do this test we will
504*c5c4113dSnw141292#
505*c5c4113dSnw141292#   1.  Fill the first page table 2 with data.
506*c5c4113dSnw141292#   2.  Delete every other entry of table 2.
507*c5c4113dSnw141292#   3.  Insert a single entry that requires more contiguous
508*c5c4113dSnw141292#       space than is available.
509*c5c4113dSnw141292#
510*c5c4113dSnw141292do_test btree-7.1 {
511*c5c4113dSnw141292  btree_begin_transaction $::b1
512*c5c4113dSnw141292} {}
513*c5c4113dSnw141292catch {unset key}
514*c5c4113dSnw141292catch {unset data}
515*c5c4113dSnw141292do_test btree-7.2 {
516*c5c4113dSnw141292  for {set i 0} {$i<36} {incr i} {
517*c5c4113dSnw141292    set key [format %03d $i]
518*c5c4113dSnw141292    set data "*** $key ***"
519*c5c4113dSnw141292    btree_insert $::c1 $key $data
520*c5c4113dSnw141292  }
521*c5c4113dSnw141292  lrange [btree_cursor_dump $::c1] 4 5
522*c5c4113dSnw141292} {8 1}
523*c5c4113dSnw141292do_test btree-7.3 {
524*c5c4113dSnw141292  btree_move_to $::c1 000
525*c5c4113dSnw141292  while {[btree_key $::c1]!=""} {
526*c5c4113dSnw141292    btree_delete $::c1
527*c5c4113dSnw141292    btree_next $::c1
528*c5c4113dSnw141292    btree_next $::c1
529*c5c4113dSnw141292  }
530*c5c4113dSnw141292  lrange [btree_cursor_dump $::c1] 4 5
531*c5c4113dSnw141292} {512 19}
532*c5c4113dSnw141292#btree_page_dump $::b1 2
533*c5c4113dSnw141292do_test btree-7.4 {
534*c5c4113dSnw141292  btree_insert $::c1 018 {*** 018 ***+++}
535*c5c4113dSnw141292  btree_key $::c1
536*c5c4113dSnw141292} {018}
537*c5c4113dSnw141292do_test btree-7.5 {
538*c5c4113dSnw141292  lrange [btree_cursor_dump $::c1] 4 5
539*c5c4113dSnw141292} {480 1}
540*c5c4113dSnw141292#btree_page_dump $::b1 2
541*c5c4113dSnw141292
542*c5c4113dSnw141292# Delete an entry to make a hole of a known size, then immediately recreate
543*c5c4113dSnw141292# that entry.  This tests the path into allocateSpace where the hole exactly
544*c5c4113dSnw141292# matches the size of the desired space.
545*c5c4113dSnw141292#
546*c5c4113dSnw141292do_test btree-7.6 {
547*c5c4113dSnw141292  btree_move_to $::c1 007
548*c5c4113dSnw141292  btree_delete $::c1
549*c5c4113dSnw141292  btree_move_to $::c1 011
550*c5c4113dSnw141292  btree_delete $::c1
551*c5c4113dSnw141292} {}
552*c5c4113dSnw141292do_test btree-7.7 {
553*c5c4113dSnw141292  lindex [btree_cursor_dump $::c1] 5
554*c5c4113dSnw141292} {3}
555*c5c4113dSnw141292#btree_page_dump $::b1 2
556*c5c4113dSnw141292do_test btree-7.8 {
557*c5c4113dSnw141292  btree_insert $::c1 007 {*** 007 ***}
558*c5c4113dSnw141292  lindex [btree_cursor_dump $::c1] 5
559*c5c4113dSnw141292} {2}
560*c5c4113dSnw141292#btree_page_dump $::b1 2
561*c5c4113dSnw141292
562*c5c4113dSnw141292# Make sure the freeSpace() routine properly coaleses adjacent memory blocks
563*c5c4113dSnw141292#
564*c5c4113dSnw141292do_test btree-7.9 {
565*c5c4113dSnw141292  btree_move_to $::c1 013
566*c5c4113dSnw141292  btree_delete $::c1
567*c5c4113dSnw141292  lrange [btree_cursor_dump $::c1] 4 5
568*c5c4113dSnw141292} {536 2}
569*c5c4113dSnw141292do_test btree-7.10 {
570*c5c4113dSnw141292  btree_move_to $::c1 009
571*c5c4113dSnw141292  btree_delete $::c1
572*c5c4113dSnw141292  lrange [btree_cursor_dump $::c1] 4 5
573*c5c4113dSnw141292} {564 2}
574*c5c4113dSnw141292do_test btree-7.11 {
575*c5c4113dSnw141292  btree_move_to $::c1 018
576*c5c4113dSnw141292  btree_delete $::c1
577*c5c4113dSnw141292  lrange [btree_cursor_dump $::c1] 4 5
578*c5c4113dSnw141292} {596 2}
579*c5c4113dSnw141292do_test btree-7.13 {
580*c5c4113dSnw141292  btree_move_to $::c1 033
581*c5c4113dSnw141292  btree_delete $::c1
582*c5c4113dSnw141292  lrange [btree_cursor_dump $::c1] 4 5
583*c5c4113dSnw141292} {624 3}
584*c5c4113dSnw141292do_test btree-7.14 {
585*c5c4113dSnw141292  btree_move_to $::c1 035
586*c5c4113dSnw141292  btree_delete $::c1
587*c5c4113dSnw141292  lrange [btree_cursor_dump $::c1] 4 5
588*c5c4113dSnw141292} {652 2}
589*c5c4113dSnw141292#btree_page_dump $::b1 2
590*c5c4113dSnw141292do_test btree-7.15 {
591*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
592*c5c4113dSnw141292} {2}
593*c5c4113dSnw141292
594*c5c4113dSnw141292# Check to see that data on overflow pages work correctly.
595*c5c4113dSnw141292#
596*c5c4113dSnw141292do_test btree-8.1 {
597*c5c4113dSnw141292  set data "*** This is a very long key "
598*c5c4113dSnw141292  while {[string length $data]<256} {append data $data}
599*c5c4113dSnw141292  set ::data $data
600*c5c4113dSnw141292  btree_insert $::c1 020 $data
601*c5c4113dSnw141292} {}
602*c5c4113dSnw141292#btree_page_dump $::b1 2
603*c5c4113dSnw141292do_test btree-8.1.1 {
604*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
605*c5c4113dSnw141292} {2}
606*c5c4113dSnw141292#btree_pager_ref_dump $::b1
607*c5c4113dSnw141292do_test btree-8.2 {
608*c5c4113dSnw141292  string length [btree_data $::c1]
609*c5c4113dSnw141292} [string length $::data]
610*c5c4113dSnw141292do_test btree-8.3 {
611*c5c4113dSnw141292  btree_data $::c1
612*c5c4113dSnw141292} $::data
613*c5c4113dSnw141292do_test btree-8.4 {
614*c5c4113dSnw141292  btree_delete $::c1
615*c5c4113dSnw141292} {}
616*c5c4113dSnw141292do_test btree-8.4.1 {
617*c5c4113dSnw141292  lindex [btree_get_meta $::b1] 0
618*c5c4113dSnw141292} [expr {int(([string length $::data]-238+1019)/1020)}]
619*c5c4113dSnw141292do_test btree-8.5 {
620*c5c4113dSnw141292  set data "*** This is an even longer key"
621*c5c4113dSnw141292  while {[string length $data]<2000} {append data $data}
622*c5c4113dSnw141292  set ::data $data
623*c5c4113dSnw141292  btree_insert $::c1 020 $data
624*c5c4113dSnw141292} {}
625*c5c4113dSnw141292do_test btree-8.6 {
626*c5c4113dSnw141292  string length [btree_data $::c1]
627*c5c4113dSnw141292} [string length $::data]
628*c5c4113dSnw141292do_test btree-8.7 {
629*c5c4113dSnw141292  btree_data $::c1
630*c5c4113dSnw141292} $::data
631*c5c4113dSnw141292do_test btree-8.8 {
632*c5c4113dSnw141292  btree_commit $::b1
633*c5c4113dSnw141292  btree_data $::c1
634*c5c4113dSnw141292} $::data
635*c5c4113dSnw141292do_test btree-8.9 {
636*c5c4113dSnw141292  btree_close_cursor $::c1
637*c5c4113dSnw141292  btree_close $::b1
638*c5c4113dSnw141292  set ::b1 [btree_open test1.bt]
639*c5c4113dSnw141292  set ::c1 [btree_cursor $::b1 2 1]
640*c5c4113dSnw141292  btree_move_to $::c1 020
641*c5c4113dSnw141292  btree_data $::c1
642*c5c4113dSnw141292} $::data
643*c5c4113dSnw141292do_test btree-8.10 {
644*c5c4113dSnw141292  btree_begin_transaction $::b1
645*c5c4113dSnw141292  btree_delete $::c1
646*c5c4113dSnw141292} {}
647*c5c4113dSnw141292do_test btree-8.11 {
648*c5c4113dSnw141292  lindex [btree_get_meta $::b1] 0
649*c5c4113dSnw141292} [expr {int(([string length $::data]-238+1019)/1020)}]
650*c5c4113dSnw141292
651*c5c4113dSnw141292# Now check out keys on overflow pages.
652*c5c4113dSnw141292#
653*c5c4113dSnw141292do_test btree-8.12 {
654*c5c4113dSnw141292  set ::keyprefix "This is a long prefix to a key "
655*c5c4113dSnw141292  while {[string length $::keyprefix]<256} {append ::keyprefix $::keyprefix}
656*c5c4113dSnw141292  btree_close_cursor $::c1
657*c5c4113dSnw141292  btree_drop_table $::b1 2
658*c5c4113dSnw141292  lindex [btree_get_meta $::b1] 0
659*c5c4113dSnw141292} {4}
660*c5c4113dSnw141292do_test btree-8.12.1 {
661*c5c4113dSnw141292  set ::c1 [btree_cursor $::b1 2 1]
662*c5c4113dSnw141292  btree_insert $::c1 ${::keyprefix}1 1
663*c5c4113dSnw141292  btree_data $::c1
664*c5c4113dSnw141292} {1}
665*c5c4113dSnw141292do_test btree-8.13 {
666*c5c4113dSnw141292  btree_key $::c1
667*c5c4113dSnw141292} ${keyprefix}1
668*c5c4113dSnw141292do_test btree-8.14 {
669*c5c4113dSnw141292  btree_insert $::c1 ${::keyprefix}2 2
670*c5c4113dSnw141292  btree_insert $::c1 ${::keyprefix}3 3
671*c5c4113dSnw141292  btree_key $::c1
672*c5c4113dSnw141292} ${keyprefix}3
673*c5c4113dSnw141292do_test btree-8.15 {
674*c5c4113dSnw141292  btree_move_to $::c1 ${::keyprefix}2
675*c5c4113dSnw141292  btree_data $::c1
676*c5c4113dSnw141292} {2}
677*c5c4113dSnw141292do_test btree-8.16 {
678*c5c4113dSnw141292  btree_move_to $::c1 ${::keyprefix}1
679*c5c4113dSnw141292  btree_data $::c1
680*c5c4113dSnw141292} {1}
681*c5c4113dSnw141292do_test btree-8.17 {
682*c5c4113dSnw141292  btree_move_to $::c1 ${::keyprefix}3
683*c5c4113dSnw141292  btree_data $::c1
684*c5c4113dSnw141292} {3}
685*c5c4113dSnw141292do_test btree-8.18 {
686*c5c4113dSnw141292  lindex [btree_get_meta $::b1] 0
687*c5c4113dSnw141292} {1}
688*c5c4113dSnw141292do_test btree-8.19 {
689*c5c4113dSnw141292  btree_move_to $::c1 ${::keyprefix}2
690*c5c4113dSnw141292  btree_key $::c1
691*c5c4113dSnw141292} ${::keyprefix}2
692*c5c4113dSnw141292#btree_page_dump $::b1 2
693*c5c4113dSnw141292do_test btree-8.20 {
694*c5c4113dSnw141292  btree_delete $::c1
695*c5c4113dSnw141292  btree_next $::c1
696*c5c4113dSnw141292  btree_key $::c1
697*c5c4113dSnw141292} ${::keyprefix}3
698*c5c4113dSnw141292#btree_page_dump $::b1 2
699*c5c4113dSnw141292do_test btree-8.21 {
700*c5c4113dSnw141292  lindex [btree_get_meta $::b1] 0
701*c5c4113dSnw141292} {2}
702*c5c4113dSnw141292do_test btree-8.22 {
703*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
704*c5c4113dSnw141292} {2}
705*c5c4113dSnw141292do_test btree-8.23 {
706*c5c4113dSnw141292  btree_close_cursor $::c1
707*c5c4113dSnw141292  btree_drop_table $::b1 2
708*c5c4113dSnw141292  set ::c1 [btree_cursor $::b1 2 1]
709*c5c4113dSnw141292  lindex [btree_get_meta $::b1] 0
710*c5c4113dSnw141292} {4}
711*c5c4113dSnw141292do_test btree-8.24 {
712*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
713*c5c4113dSnw141292} {2}
714*c5c4113dSnw141292#btree_pager_ref_dump $::b1
715*c5c4113dSnw141292
716*c5c4113dSnw141292# Check page splitting logic
717*c5c4113dSnw141292#
718*c5c4113dSnw141292do_test btree-9.1 {
719*c5c4113dSnw141292  for {set i 1} {$i<=19} {incr i} {
720*c5c4113dSnw141292    set key [format %03d $i]
721*c5c4113dSnw141292    set data "*** $key *** $key *** $key *** $key ***"
722*c5c4113dSnw141292    btree_insert $::c1 $key $data
723*c5c4113dSnw141292  }
724*c5c4113dSnw141292} {}
725*c5c4113dSnw141292#btree_tree_dump $::b1 2
726*c5c4113dSnw141292#btree_pager_ref_dump $::b1
727*c5c4113dSnw141292#set pager_refinfo_enable 1
728*c5c4113dSnw141292do_test btree-9.2 {
729*c5c4113dSnw141292  btree_insert $::c1 020 {*** 020 *** 020 *** 020 *** 020 ***}
730*c5c4113dSnw141292  select_keys $::c1
731*c5c4113dSnw141292} {001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020}
732*c5c4113dSnw141292#btree_page_dump $::b1 5
733*c5c4113dSnw141292#btree_page_dump $::b1 2
734*c5c4113dSnw141292#btree_page_dump $::b1 7
735*c5c4113dSnw141292#btree_pager_ref_dump $::b1
736*c5c4113dSnw141292#set pager_refinfo_enable 0
737*c5c4113dSnw141292
738*c5c4113dSnw141292# The previous "select_keys" command left the cursor pointing at the root
739*c5c4113dSnw141292# page.  So there should only be two pages checked out.  2 (the root) and
740*c5c4113dSnw141292# page 1.
741*c5c4113dSnw141292do_test btree-9.2.1 {
742*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
743*c5c4113dSnw141292} {2}
744*c5c4113dSnw141292for {set i 1} {$i<=20} {incr i} {
745*c5c4113dSnw141292  do_test btree-9.3.$i.1 [subst {
746*c5c4113dSnw141292    btree_move_to $::c1 [format %03d $i]
747*c5c4113dSnw141292    btree_key $::c1
748*c5c4113dSnw141292  }] [format %03d $i]
749*c5c4113dSnw141292  do_test btree-9.3.$i.2 [subst {
750*c5c4113dSnw141292    btree_move_to $::c1 [format %03d $i]
751*c5c4113dSnw141292    string range \[btree_data $::c1\] 0 10
752*c5c4113dSnw141292  }] "*** [format %03d $i] ***"
753*c5c4113dSnw141292}
754*c5c4113dSnw141292do_test btree-9.4.1 {
755*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
756*c5c4113dSnw141292} {3}
757*c5c4113dSnw141292
758*c5c4113dSnw141292# Check the page joining logic.
759*c5c4113dSnw141292#
760*c5c4113dSnw141292#btree_page_dump $::b1 2
761*c5c4113dSnw141292#btree_pager_ref_dump $::b1
762*c5c4113dSnw141292do_test btree-9.4.2 {
763*c5c4113dSnw141292  btree_move_to $::c1 005
764*c5c4113dSnw141292  btree_delete $::c1
765*c5c4113dSnw141292} {}
766*c5c4113dSnw141292#btree_page_dump $::b1 2
767*c5c4113dSnw141292for {set i 1} {$i<=19} {incr i} {
768*c5c4113dSnw141292  if {$i==5} continue
769*c5c4113dSnw141292  do_test btree-9.5.$i.1 [subst {
770*c5c4113dSnw141292    btree_move_to $::c1 [format %03d $i]
771*c5c4113dSnw141292    btree_key $::c1
772*c5c4113dSnw141292  }] [format %03d $i]
773*c5c4113dSnw141292  do_test btree-9.5.$i.2 [subst {
774*c5c4113dSnw141292    btree_move_to $::c1 [format %03d $i]
775*c5c4113dSnw141292    string range \[btree_data $::c1\] 0 10
776*c5c4113dSnw141292  }] "*** [format %03d $i] ***"
777*c5c4113dSnw141292}
778*c5c4113dSnw141292#btree_pager_ref_dump $::b1
779*c5c4113dSnw141292do_test btree-9.6 {
780*c5c4113dSnw141292  btree_close_cursor $::c1
781*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
782*c5c4113dSnw141292} {1}
783*c5c4113dSnw141292do_test btree-9.7 {
784*c5c4113dSnw141292  btree_rollback $::b1
785*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
786*c5c4113dSnw141292} {0}
787*c5c4113dSnw141292
788*c5c4113dSnw141292# Create a tree of depth two.  That is, there is a single divider entry
789*c5c4113dSnw141292# on the root pages and two leaf pages.  Then delete the divider entry
790*c5c4113dSnw141292# see what happens.
791*c5c4113dSnw141292#
792*c5c4113dSnw141292do_test btree-10.1 {
793*c5c4113dSnw141292  btree_begin_transaction $::b1
794*c5c4113dSnw141292  btree_drop_table $::b1 2
795*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
796*c5c4113dSnw141292} {1}
797*c5c4113dSnw141292do_test btree-10.2 {
798*c5c4113dSnw141292  set ::c1 [btree_cursor $::b1 2 1]
799*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
800*c5c4113dSnw141292} {2}
801*c5c4113dSnw141292do_test btree-10.3 {
802*c5c4113dSnw141292  for {set i 1} {$i<=20} {incr i} {
803*c5c4113dSnw141292    set key [format %03d $i]
804*c5c4113dSnw141292    set data "*** $key *** $key *** $key *** $key ***"
805*c5c4113dSnw141292    btree_insert $::c1 $key $data
806*c5c4113dSnw141292  }
807*c5c4113dSnw141292  select_keys $::c1
808*c5c4113dSnw141292} {001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020}
809*c5c4113dSnw141292#btree_page_dump $::b1 7
810*c5c4113dSnw141292#btree_page_dump $::b1 2
811*c5c4113dSnw141292#btree_page_dump $::b1 6
812*c5c4113dSnw141292do_test btree-10.4 {
813*c5c4113dSnw141292  btree_move_to $::c1 011
814*c5c4113dSnw141292  btree_delete $::c1
815*c5c4113dSnw141292  select_keys $::c1
816*c5c4113dSnw141292} {001 002 003 004 005 006 007 008 009 010 012 013 014 015 016 017 018 019 020}
817*c5c4113dSnw141292#btree_tree_dump $::b1 2
818*c5c4113dSnw141292#btree_pager_ref_dump $::b1
819*c5c4113dSnw141292for {set i 1} {$i<=20} {incr i} {
820*c5c4113dSnw141292  do_test btree-10.5.$i {
821*c5c4113dSnw141292    btree_move_to $::c1 [format %03d $i]
822*c5c4113dSnw141292    lindex [btree_pager_stats $::b1] 1
823*c5c4113dSnw141292  } {2}
824*c5c4113dSnw141292  #btree_pager_ref_dump $::b1
825*c5c4113dSnw141292  #btree_tree_dump $::b1 2
826*c5c4113dSnw141292}
827*c5c4113dSnw141292
828*c5c4113dSnw141292# Create a tree with lots more pages
829*c5c4113dSnw141292#
830*c5c4113dSnw141292catch {unset ::data}
831*c5c4113dSnw141292catch {unset ::key}
832*c5c4113dSnw141292for {set i 21} {$i<=1000} {incr i} {
833*c5c4113dSnw141292  do_test btree-11.1.$i.1 {
834*c5c4113dSnw141292    set key [format %03d $i]
835*c5c4113dSnw141292    set ::data "*** $key *** $key *** $key *** $key ***"
836*c5c4113dSnw141292    btree_insert $::c1 $key $data
837*c5c4113dSnw141292    btree_key $::c1
838*c5c4113dSnw141292  } [format %03d $i]
839*c5c4113dSnw141292  do_test btree-11.1.$i.2 {
840*c5c4113dSnw141292    btree_data $::c1
841*c5c4113dSnw141292  } $::data
842*c5c4113dSnw141292  set ::key [format %03d [expr {$i/2}]]
843*c5c4113dSnw141292  if {$::key=="011"} {set ::key 010}
844*c5c4113dSnw141292  do_test btree-11.1.$i.3 {
845*c5c4113dSnw141292    btree_move_to $::c1 $::key
846*c5c4113dSnw141292    btree_key $::c1
847*c5c4113dSnw141292  } $::key
848*c5c4113dSnw141292}
849*c5c4113dSnw141292catch {unset ::data}
850*c5c4113dSnw141292catch {unset ::key}
851*c5c4113dSnw141292
852*c5c4113dSnw141292# Make sure our reference count is still correct.
853*c5c4113dSnw141292#
854*c5c4113dSnw141292do_test btree-11.2 {
855*c5c4113dSnw141292  btree_close_cursor $::c1
856*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
857*c5c4113dSnw141292} {1}
858*c5c4113dSnw141292do_test btree-11.3 {
859*c5c4113dSnw141292  set ::c1 [btree_cursor $::b1 2 1]
860*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
861*c5c4113dSnw141292} {2}
862*c5c4113dSnw141292#btree_page_dump $::b1 2
863*c5c4113dSnw141292
864*c5c4113dSnw141292# Delete the dividers on the root page
865*c5c4113dSnw141292#
866*c5c4113dSnw141292do_test btree-11.4 {
867*c5c4113dSnw141292  btree_move_to $::c1 257
868*c5c4113dSnw141292  btree_delete $::c1
869*c5c4113dSnw141292  btree_next $::c1
870*c5c4113dSnw141292  btree_key $::c1
871*c5c4113dSnw141292} {258}
872*c5c4113dSnw141292do_test btree-11.4.1 {
873*c5c4113dSnw141292  btree_move_to $::c1 256
874*c5c4113dSnw141292  btree_key $::c1
875*c5c4113dSnw141292} {256}
876*c5c4113dSnw141292do_test btree-11.4.2 {
877*c5c4113dSnw141292  btree_move_to $::c1 258
878*c5c4113dSnw141292  btree_key $::c1
879*c5c4113dSnw141292} {258}
880*c5c4113dSnw141292do_test btree-11.4.3 {
881*c5c4113dSnw141292  btree_move_to $::c1 259
882*c5c4113dSnw141292  btree_key $::c1
883*c5c4113dSnw141292} {259}
884*c5c4113dSnw141292do_test btree-11.4.4 {
885*c5c4113dSnw141292  btree_move_to $::c1 257
886*c5c4113dSnw141292  set n [btree_key $::c1]
887*c5c4113dSnw141292  expr {$n==256||$n==258}
888*c5c4113dSnw141292} {1}
889*c5c4113dSnw141292do_test btree-11.5 {
890*c5c4113dSnw141292  btree_move_to $::c1 513
891*c5c4113dSnw141292  btree_delete $::c1
892*c5c4113dSnw141292  btree_next $::c1
893*c5c4113dSnw141292  btree_key $::c1
894*c5c4113dSnw141292} {514}
895*c5c4113dSnw141292do_test btree-11.5.1 {
896*c5c4113dSnw141292  btree_move_to $::c1 512
897*c5c4113dSnw141292  btree_key $::c1
898*c5c4113dSnw141292} {512}
899*c5c4113dSnw141292do_test btree-11.5.2 {
900*c5c4113dSnw141292  btree_move_to $::c1 514
901*c5c4113dSnw141292  btree_key $::c1
902*c5c4113dSnw141292} {514}
903*c5c4113dSnw141292do_test btree-11.5.3 {
904*c5c4113dSnw141292  btree_move_to $::c1 515
905*c5c4113dSnw141292  btree_key $::c1
906*c5c4113dSnw141292} {515}
907*c5c4113dSnw141292do_test btree-11.5.4 {
908*c5c4113dSnw141292  btree_move_to $::c1 513
909*c5c4113dSnw141292  set n [btree_key $::c1]
910*c5c4113dSnw141292  expr {$n==512||$n==514}
911*c5c4113dSnw141292} {1}
912*c5c4113dSnw141292do_test btree-11.6 {
913*c5c4113dSnw141292  btree_move_to $::c1 769
914*c5c4113dSnw141292  btree_delete $::c1
915*c5c4113dSnw141292  btree_next $::c1
916*c5c4113dSnw141292  btree_key $::c1
917*c5c4113dSnw141292} {770}
918*c5c4113dSnw141292do_test btree-11.6.1 {
919*c5c4113dSnw141292  btree_move_to $::c1 768
920*c5c4113dSnw141292  btree_key $::c1
921*c5c4113dSnw141292} {768}
922*c5c4113dSnw141292do_test btree-11.6.2 {
923*c5c4113dSnw141292  btree_move_to $::c1 771
924*c5c4113dSnw141292  btree_key $::c1
925*c5c4113dSnw141292} {771}
926*c5c4113dSnw141292do_test btree-11.6.3 {
927*c5c4113dSnw141292  btree_move_to $::c1 770
928*c5c4113dSnw141292  btree_key $::c1
929*c5c4113dSnw141292} {770}
930*c5c4113dSnw141292do_test btree-11.6.4 {
931*c5c4113dSnw141292  btree_move_to $::c1 769
932*c5c4113dSnw141292  set n [btree_key $::c1]
933*c5c4113dSnw141292  expr {$n==768||$n==770}
934*c5c4113dSnw141292} {1}
935*c5c4113dSnw141292#btree_page_dump $::b1 2
936*c5c4113dSnw141292#btree_page_dump $::b1 25
937*c5c4113dSnw141292
938*c5c4113dSnw141292# Change the data on an intermediate node such that the node becomes overfull
939*c5c4113dSnw141292# and has to split.  We happen to know that intermediate nodes exist on
940*c5c4113dSnw141292# 337, 401 and 465 by the btree_page_dumps above
941*c5c4113dSnw141292#
942*c5c4113dSnw141292catch {unset ::data}
943*c5c4113dSnw141292set ::data {This is going to be a very long data segment}
944*c5c4113dSnw141292append ::data $::data
945*c5c4113dSnw141292append ::data $::data
946*c5c4113dSnw141292do_test btree-12.1 {
947*c5c4113dSnw141292  btree_insert $::c1 337 $::data
948*c5c4113dSnw141292  btree_data $::c1
949*c5c4113dSnw141292} $::data
950*c5c4113dSnw141292do_test btree-12.2 {
951*c5c4113dSnw141292  btree_insert $::c1 401 $::data
952*c5c4113dSnw141292  btree_data $::c1
953*c5c4113dSnw141292} $::data
954*c5c4113dSnw141292do_test btree-12.3 {
955*c5c4113dSnw141292  btree_insert $::c1 465 $::data
956*c5c4113dSnw141292  btree_data $::c1
957*c5c4113dSnw141292} $::data
958*c5c4113dSnw141292do_test btree-12.4 {
959*c5c4113dSnw141292  btree_move_to $::c1 337
960*c5c4113dSnw141292  btree_key $::c1
961*c5c4113dSnw141292} {337}
962*c5c4113dSnw141292do_test btree-12.5 {
963*c5c4113dSnw141292  btree_data $::c1
964*c5c4113dSnw141292} $::data
965*c5c4113dSnw141292do_test btree-12.6 {
966*c5c4113dSnw141292  btree_next $::c1
967*c5c4113dSnw141292  btree_key $::c1
968*c5c4113dSnw141292} {338}
969*c5c4113dSnw141292do_test btree-12.7 {
970*c5c4113dSnw141292  btree_move_to $::c1 464
971*c5c4113dSnw141292  btree_key $::c1
972*c5c4113dSnw141292} {464}
973*c5c4113dSnw141292do_test btree-12.8 {
974*c5c4113dSnw141292  btree_next $::c1
975*c5c4113dSnw141292  btree_data $::c1
976*c5c4113dSnw141292} $::data
977*c5c4113dSnw141292do_test btree-12.9 {
978*c5c4113dSnw141292  btree_next $::c1
979*c5c4113dSnw141292  btree_key $::c1
980*c5c4113dSnw141292} {466}
981*c5c4113dSnw141292do_test btree-12.10 {
982*c5c4113dSnw141292  btree_move_to $::c1 400
983*c5c4113dSnw141292  btree_key $::c1
984*c5c4113dSnw141292} {400}
985*c5c4113dSnw141292do_test btree-12.11 {
986*c5c4113dSnw141292  btree_next $::c1
987*c5c4113dSnw141292  btree_data $::c1
988*c5c4113dSnw141292} $::data
989*c5c4113dSnw141292do_test btree-12.12 {
990*c5c4113dSnw141292  btree_next $::c1
991*c5c4113dSnw141292  btree_key $::c1
992*c5c4113dSnw141292} {402}
993*c5c4113dSnw141292do_test btree-13.1 {
994*c5c4113dSnw141292  btree_integrity_check $::b1 2 3
995*c5c4113dSnw141292} {}
996*c5c4113dSnw141292
997*c5c4113dSnw141292# To Do:
998*c5c4113dSnw141292#
999*c5c4113dSnw141292#   1.  Do some deletes from the 3-layer tree
1000*c5c4113dSnw141292#   2.  Commit and reopen the database
1001*c5c4113dSnw141292#   3.  Read every 15th entry and make sure it works
1002*c5c4113dSnw141292#   4.  Implement btree_sanity and put it throughout this script
1003*c5c4113dSnw141292#
1004*c5c4113dSnw141292
1005*c5c4113dSnw141292do_test btree-15.98 {
1006*c5c4113dSnw141292  btree_close_cursor $::c1
1007*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
1008*c5c4113dSnw141292} {1}
1009*c5c4113dSnw141292do_test btree-15.99 {
1010*c5c4113dSnw141292  btree_rollback $::b1
1011*c5c4113dSnw141292  lindex [btree_pager_stats $::b1] 1
1012*c5c4113dSnw141292} {0}
1013*c5c4113dSnw141292btree_pager_ref_dump $::b1
1014*c5c4113dSnw141292
1015*c5c4113dSnw141292do_test btree-99.1 {
1016*c5c4113dSnw141292  btree_close $::b1
1017*c5c4113dSnw141292} {}
1018*c5c4113dSnw141292catch {unset data}
1019*c5c4113dSnw141292catch {unset key}
1020*c5c4113dSnw141292
1021*c5c4113dSnw141292} ;# end if( not mem: and has pager_open command );
1022*c5c4113dSnw141292
1023*c5c4113dSnw141292finish_test
1024