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