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