Deleted Added
full compact
run.test (1573) run.test (14272)
1#!/bin/sh -
2#
1#!/bin/sh -
2#
3# @(#)run.test 8.7 (Berkeley) 9/16/93
3# @(#)run.test 8.10 (Berkeley) 7/26/94
4#
5
6# db regression tests
7main()
8{
9
4#
5
6# db regression tests
7main()
8{
9
10DICT=/usr/share/dict/words
11#DICT=/usr/dict/words
12PROG=./dbtest
13TMP1=t1
14TMP2=t2
15TMP3=t3
10 PROG=./dbtest
11 TMP1=t1
12 TMP2=t2
13 TMP3=t3
16
14
15 if [ -f /usr/share/dict/words ]; then
16 DICT=/usr/share/dict/words
17 elif [ -f /usr/dict/words ]; then
18 DICT=/usr/dict/words
19 else
20 echo 'run.test: no dictionary'
21 exit 1
22 fi
23
17 if [ $# -eq 0 ]; then
18 for t in 1 2 3 4 5 6 7 8 9 10 11 12 13 20; do
19 test$t
20 done
21 else
22 while [ $# -gt 0 ]
23 do case "$1" in
24 test*)
25 $1;;
26 [0-9]*)
27 test$1;;
28 btree)
29 for t in 1 2 3 7 8 9 10 12 13; do
30 test$t
31 done;;
32 hash)
33 for t in 1 2 3 8 13 20; do
34 test$t
35 done;;
36 recno)
37 for t in 1 2 3 4 5 6 7 10 11; do
38 test$t
39 done;;
40 *)
41 echo "run.test: unknown test $1"
42 echo "usage: run.test test# | type"
43 exit 1
44 esac
45 shift
46 done
47 fi
48 rm -f $TMP1 $TMP2 $TMP3
49 exit 0
50}
51
52# Take the first hundred entries in the dictionary, and make them
53# be key/data pairs.
54test1()
55{
56 echo "Test 1: btree, hash: small key, small data pairs"
57 sed 200q $DICT > $TMP1
58 for type in btree hash; do
59 rm -f $TMP2 $TMP3
60 for i in `sed 200q $DICT`; do
61 echo p
62 echo k$i
63 echo d$i
64 echo g
65 echo k$i
66 done > $TMP2
67 $PROG -o $TMP3 $type $TMP2
68 if (cmp -s $TMP1 $TMP3) ; then :
69 else
70 echo "test1: type $type: failed"
71 exit 1
72 fi
73 done
74 echo "Test 1: recno: small key, small data pairs"
75 rm -f $TMP2 $TMP3
76 sed 200q $DICT |
77 awk '{
78 ++i;
79 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
80 }' > $TMP2
81 $PROG -o $TMP3 recno $TMP2
82 if (cmp -s $TMP1 $TMP3) ; then :
83 else
84 echo "test1: type recno: failed"
85 exit 1
86 fi
87}
88
89# Take the first 200 entries in the dictionary, and give them
90# each a medium size data entry.
91test2()
92{
93 echo "Test 2: btree, hash: small key, medium data pairs"
94 mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
95 echo $mdata |
96 awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1
97 for type in hash btree; do
98 rm -f $TMP2 $TMP3
99 for i in `sed 200q $DICT`; do
100 echo p
101 echo k$i
102 echo d$mdata
103 echo g
104 echo k$i
105 done > $TMP2
106 $PROG -o $TMP3 $type $TMP2
107 if (cmp -s $TMP1 $TMP3) ; then :
108 else
109 echo "test2: type $type: failed"
110 exit 1
111 fi
112 done
113 echo "Test 2: recno: small key, medium data pairs"
114 rm -f $TMP2 $TMP3
115 echo $mdata |
116 awk '{ for (i = 1; i < 201; ++i)
117 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
118 }' > $TMP2
119 $PROG -o $TMP3 recno $TMP2
120 if (cmp -s $TMP1 $TMP3) ; then :
121 else
122 echo "test2: type recno: failed"
123 exit 1
124 fi
125}
126
127# Insert the programs in /bin with their paths as their keys.
128test3()
129{
130 echo "Test 3: hash: small key, big data pairs"
131 rm -f $TMP1
132 (find /bin -type f -print | xargs cat) > $TMP1
133 for type in hash; do
134 rm -f $TMP2 $TMP3
135 for i in `find /bin -type f -print`; do
136 echo p
137 echo k$i
138 echo D$i
139 echo g
140 echo k$i
141 done > $TMP2
142 $PROG -o $TMP3 $type $TMP2
143 if (cmp -s $TMP1 $TMP3) ; then :
144 else
145 echo "test3: $type: failed"
146 exit 1
147 fi
148 done
149 echo "Test 3: btree: small key, big data pairs"
150 for psize in 512 16384 65536; do
151 echo " page size $psize"
152 for type in btree; do
153 rm -f $TMP2 $TMP3
154 for i in `find /bin -type f -print`; do
155 echo p
156 echo k$i
157 echo D$i
158 echo g
159 echo k$i
160 done > $TMP2
161 $PROG -i psize=$psize -o $TMP3 $type $TMP2
162 if (cmp -s $TMP1 $TMP3) ; then :
163 else
164 echo "test3: $type: page size $psize: failed"
165 exit 1
166 fi
167 done
168 done
169 echo "Test 3: recno: big data pairs"
170 rm -f $TMP2 $TMP3
171 find /bin -type f -print |
172 awk '{
173 ++i;
174 printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
175 }' > $TMP2
176 for psize in 512 16384 65536; do
177 echo " page size $psize"
178 $PROG -i psize=$psize -o $TMP3 recno $TMP2
179 if (cmp -s $TMP1 $TMP3) ; then :
180 else
181 echo "test3: recno: page size $psize: failed"
182 exit 1
183 fi
184 done
185}
186
187# Do random recno entries.
188test4()
189{
190 echo "Test 4: recno: random entries"
191 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
192 awk '{
193 for (i = 37; i <= 37 + 88 * 17; i += 17) {
194 if (i % 41)
195 s = substr($0, 1, i % 41);
196 else
197 s = substr($0, 1);
198 printf("input key %d: %s\n", i, s);
199 }
200 for (i = 1; i <= 15; ++i) {
201 if (i % 41)
202 s = substr($0, 1, i % 41);
203 else
204 s = substr($0, 1);
205 printf("input key %d: %s\n", i, s);
206 }
207 for (i = 19234; i <= 19234 + 61 * 27; i += 27) {
208 if (i % 41)
209 s = substr($0, 1, i % 41);
210 else
211 s = substr($0, 1);
212 printf("input key %d: %s\n", i, s);
213 }
214 exit
215 }' > $TMP1
216 rm -f $TMP2 $TMP3
217 cat $TMP1 |
218 awk 'BEGIN {
219 i = 37;
220 incr = 17;
221 }
222 {
223 printf("p\nk%d\nd%s\n", i, $0);
224 if (i == 19234 + 61 * 27)
225 exit;
226 if (i == 37 + 88 * 17) {
227 i = 1;
228 incr = 1;
229 } else if (i == 15) {
230 i = 19234;
231 incr = 27;
232 } else
233 i += incr;
234 }
235 END {
236 for (i = 37; i <= 37 + 88 * 17; i += 17)
237 printf("g\nk%d\n", i);
238 for (i = 1; i <= 15; ++i)
239 printf("g\nk%d\n", i);
240 for (i = 19234; i <= 19234 + 61 * 27; i += 27)
241 printf("g\nk%d\n", i);
242 }' > $TMP2
243 $PROG -o $TMP3 recno $TMP2
244 if (cmp -s $TMP1 $TMP3) ; then :
245 else
246 echo "test4: type recno: failed"
247 exit 1
248 fi
249}
250
251# Do reverse order recno entries.
252test5()
253{
254 echo "Test 5: recno: reverse order entries"
255 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
256 awk ' {
257 for (i = 1500; i; --i) {
258 if (i % 34)
259 s = substr($0, 1, i % 34);
260 else
261 s = substr($0, 1);
262 printf("input key %d: %s\n", i, s);
263 }
264 exit;
265 }' > $TMP1
266 rm -f $TMP2 $TMP3
267 cat $TMP1 |
268 awk 'BEGIN {
269 i = 1500;
270 }
271 {
272 printf("p\nk%d\nd%s\n", i, $0);
273 --i;
274 }
275 END {
276 for (i = 1500; i; --i)
277 printf("g\nk%d\n", i);
278 }' > $TMP2
279 $PROG -o $TMP3 recno $TMP2
280 if (cmp -s $TMP1 $TMP3) ; then :
281 else
282 echo "test5: type recno: failed"
283 exit 1
284 fi
285}
286
287# Do alternating order recno entries.
288test6()
289{
290 echo "Test 6: recno: alternating order entries"
291 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
292 awk ' {
293 for (i = 1; i < 1200; i += 2) {
294 if (i % 34)
295 s = substr($0, 1, i % 34);
296 else
297 s = substr($0, 1);
298 printf("input key %d: %s\n", i, s);
299 }
300 for (i = 2; i < 1200; i += 2) {
301 if (i % 34)
302 s = substr($0, 1, i % 34);
303 else
304 s = substr($0, 1);
305 printf("input key %d: %s\n", i, s);
306 }
307 exit;
308 }' > $TMP1
309 rm -f $TMP2 $TMP3
310 cat $TMP1 |
311 awk 'BEGIN {
312 i = 1;
313 even = 0;
314 }
315 {
316 printf("p\nk%d\nd%s\n", i, $0);
317 i += 2;
318 if (i >= 1200) {
319 if (even == 1)
320 exit;
321 even = 1;
322 i = 2;
323 }
324 }
325 END {
326 for (i = 1; i < 1200; ++i)
327 printf("g\nk%d\n", i);
328 }' > $TMP2
329 $PROG -o $TMP3 recno $TMP2
330 sort -o $TMP1 $TMP1
331 sort -o $TMP3 $TMP3
332 if (cmp -s $TMP1 $TMP3) ; then :
333 else
334 echo "test6: type recno: failed"
335 exit 1
336 fi
337}
338
339# Delete cursor record
340test7()
341{
342 echo "Test 7: btree, recno: delete cursor record"
343 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
344 awk '{
345 for (i = 1; i <= 120; ++i)
346 printf("%05d: input key %d: %s\n", i, i, $0);
347 printf("%05d: input key %d: %s\n", 120, 120, $0);
24 if [ $# -eq 0 ]; then
25 for t in 1 2 3 4 5 6 7 8 9 10 11 12 13 20; do
26 test$t
27 done
28 else
29 while [ $# -gt 0 ]
30 do case "$1" in
31 test*)
32 $1;;
33 [0-9]*)
34 test$1;;
35 btree)
36 for t in 1 2 3 7 8 9 10 12 13; do
37 test$t
38 done;;
39 hash)
40 for t in 1 2 3 8 13 20; do
41 test$t
42 done;;
43 recno)
44 for t in 1 2 3 4 5 6 7 10 11; do
45 test$t
46 done;;
47 *)
48 echo "run.test: unknown test $1"
49 echo "usage: run.test test# | type"
50 exit 1
51 esac
52 shift
53 done
54 fi
55 rm -f $TMP1 $TMP2 $TMP3
56 exit 0
57}
58
59# Take the first hundred entries in the dictionary, and make them
60# be key/data pairs.
61test1()
62{
63 echo "Test 1: btree, hash: small key, small data pairs"
64 sed 200q $DICT > $TMP1
65 for type in btree hash; do
66 rm -f $TMP2 $TMP3
67 for i in `sed 200q $DICT`; do
68 echo p
69 echo k$i
70 echo d$i
71 echo g
72 echo k$i
73 done > $TMP2
74 $PROG -o $TMP3 $type $TMP2
75 if (cmp -s $TMP1 $TMP3) ; then :
76 else
77 echo "test1: type $type: failed"
78 exit 1
79 fi
80 done
81 echo "Test 1: recno: small key, small data pairs"
82 rm -f $TMP2 $TMP3
83 sed 200q $DICT |
84 awk '{
85 ++i;
86 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
87 }' > $TMP2
88 $PROG -o $TMP3 recno $TMP2
89 if (cmp -s $TMP1 $TMP3) ; then :
90 else
91 echo "test1: type recno: failed"
92 exit 1
93 fi
94}
95
96# Take the first 200 entries in the dictionary, and give them
97# each a medium size data entry.
98test2()
99{
100 echo "Test 2: btree, hash: small key, medium data pairs"
101 mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
102 echo $mdata |
103 awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1
104 for type in hash btree; do
105 rm -f $TMP2 $TMP3
106 for i in `sed 200q $DICT`; do
107 echo p
108 echo k$i
109 echo d$mdata
110 echo g
111 echo k$i
112 done > $TMP2
113 $PROG -o $TMP3 $type $TMP2
114 if (cmp -s $TMP1 $TMP3) ; then :
115 else
116 echo "test2: type $type: failed"
117 exit 1
118 fi
119 done
120 echo "Test 2: recno: small key, medium data pairs"
121 rm -f $TMP2 $TMP3
122 echo $mdata |
123 awk '{ for (i = 1; i < 201; ++i)
124 printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
125 }' > $TMP2
126 $PROG -o $TMP3 recno $TMP2
127 if (cmp -s $TMP1 $TMP3) ; then :
128 else
129 echo "test2: type recno: failed"
130 exit 1
131 fi
132}
133
134# Insert the programs in /bin with their paths as their keys.
135test3()
136{
137 echo "Test 3: hash: small key, big data pairs"
138 rm -f $TMP1
139 (find /bin -type f -print | xargs cat) > $TMP1
140 for type in hash; do
141 rm -f $TMP2 $TMP3
142 for i in `find /bin -type f -print`; do
143 echo p
144 echo k$i
145 echo D$i
146 echo g
147 echo k$i
148 done > $TMP2
149 $PROG -o $TMP3 $type $TMP2
150 if (cmp -s $TMP1 $TMP3) ; then :
151 else
152 echo "test3: $type: failed"
153 exit 1
154 fi
155 done
156 echo "Test 3: btree: small key, big data pairs"
157 for psize in 512 16384 65536; do
158 echo " page size $psize"
159 for type in btree; do
160 rm -f $TMP2 $TMP3
161 for i in `find /bin -type f -print`; do
162 echo p
163 echo k$i
164 echo D$i
165 echo g
166 echo k$i
167 done > $TMP2
168 $PROG -i psize=$psize -o $TMP3 $type $TMP2
169 if (cmp -s $TMP1 $TMP3) ; then :
170 else
171 echo "test3: $type: page size $psize: failed"
172 exit 1
173 fi
174 done
175 done
176 echo "Test 3: recno: big data pairs"
177 rm -f $TMP2 $TMP3
178 find /bin -type f -print |
179 awk '{
180 ++i;
181 printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
182 }' > $TMP2
183 for psize in 512 16384 65536; do
184 echo " page size $psize"
185 $PROG -i psize=$psize -o $TMP3 recno $TMP2
186 if (cmp -s $TMP1 $TMP3) ; then :
187 else
188 echo "test3: recno: page size $psize: failed"
189 exit 1
190 fi
191 done
192}
193
194# Do random recno entries.
195test4()
196{
197 echo "Test 4: recno: random entries"
198 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
199 awk '{
200 for (i = 37; i <= 37 + 88 * 17; i += 17) {
201 if (i % 41)
202 s = substr($0, 1, i % 41);
203 else
204 s = substr($0, 1);
205 printf("input key %d: %s\n", i, s);
206 }
207 for (i = 1; i <= 15; ++i) {
208 if (i % 41)
209 s = substr($0, 1, i % 41);
210 else
211 s = substr($0, 1);
212 printf("input key %d: %s\n", i, s);
213 }
214 for (i = 19234; i <= 19234 + 61 * 27; i += 27) {
215 if (i % 41)
216 s = substr($0, 1, i % 41);
217 else
218 s = substr($0, 1);
219 printf("input key %d: %s\n", i, s);
220 }
221 exit
222 }' > $TMP1
223 rm -f $TMP2 $TMP3
224 cat $TMP1 |
225 awk 'BEGIN {
226 i = 37;
227 incr = 17;
228 }
229 {
230 printf("p\nk%d\nd%s\n", i, $0);
231 if (i == 19234 + 61 * 27)
232 exit;
233 if (i == 37 + 88 * 17) {
234 i = 1;
235 incr = 1;
236 } else if (i == 15) {
237 i = 19234;
238 incr = 27;
239 } else
240 i += incr;
241 }
242 END {
243 for (i = 37; i <= 37 + 88 * 17; i += 17)
244 printf("g\nk%d\n", i);
245 for (i = 1; i <= 15; ++i)
246 printf("g\nk%d\n", i);
247 for (i = 19234; i <= 19234 + 61 * 27; i += 27)
248 printf("g\nk%d\n", i);
249 }' > $TMP2
250 $PROG -o $TMP3 recno $TMP2
251 if (cmp -s $TMP1 $TMP3) ; then :
252 else
253 echo "test4: type recno: failed"
254 exit 1
255 fi
256}
257
258# Do reverse order recno entries.
259test5()
260{
261 echo "Test 5: recno: reverse order entries"
262 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
263 awk ' {
264 for (i = 1500; i; --i) {
265 if (i % 34)
266 s = substr($0, 1, i % 34);
267 else
268 s = substr($0, 1);
269 printf("input key %d: %s\n", i, s);
270 }
271 exit;
272 }' > $TMP1
273 rm -f $TMP2 $TMP3
274 cat $TMP1 |
275 awk 'BEGIN {
276 i = 1500;
277 }
278 {
279 printf("p\nk%d\nd%s\n", i, $0);
280 --i;
281 }
282 END {
283 for (i = 1500; i; --i)
284 printf("g\nk%d\n", i);
285 }' > $TMP2
286 $PROG -o $TMP3 recno $TMP2
287 if (cmp -s $TMP1 $TMP3) ; then :
288 else
289 echo "test5: type recno: failed"
290 exit 1
291 fi
292}
293
294# Do alternating order recno entries.
295test6()
296{
297 echo "Test 6: recno: alternating order entries"
298 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
299 awk ' {
300 for (i = 1; i < 1200; i += 2) {
301 if (i % 34)
302 s = substr($0, 1, i % 34);
303 else
304 s = substr($0, 1);
305 printf("input key %d: %s\n", i, s);
306 }
307 for (i = 2; i < 1200; i += 2) {
308 if (i % 34)
309 s = substr($0, 1, i % 34);
310 else
311 s = substr($0, 1);
312 printf("input key %d: %s\n", i, s);
313 }
314 exit;
315 }' > $TMP1
316 rm -f $TMP2 $TMP3
317 cat $TMP1 |
318 awk 'BEGIN {
319 i = 1;
320 even = 0;
321 }
322 {
323 printf("p\nk%d\nd%s\n", i, $0);
324 i += 2;
325 if (i >= 1200) {
326 if (even == 1)
327 exit;
328 even = 1;
329 i = 2;
330 }
331 }
332 END {
333 for (i = 1; i < 1200; ++i)
334 printf("g\nk%d\n", i);
335 }' > $TMP2
336 $PROG -o $TMP3 recno $TMP2
337 sort -o $TMP1 $TMP1
338 sort -o $TMP3 $TMP3
339 if (cmp -s $TMP1 $TMP3) ; then :
340 else
341 echo "test6: type recno: failed"
342 exit 1
343 fi
344}
345
346# Delete cursor record
347test7()
348{
349 echo "Test 7: btree, recno: delete cursor record"
350 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
351 awk '{
352 for (i = 1; i <= 120; ++i)
353 printf("%05d: input key %d: %s\n", i, i, $0);
354 printf("%05d: input key %d: %s\n", 120, 120, $0);
348 printf("get failed, no such key\n");
355 printf("seq failed, no such key\n");
349 printf("%05d: input key %d: %s\n", 1, 1, $0);
350 printf("%05d: input key %d: %s\n", 2, 2, $0);
351 exit;
352 }' > $TMP1
353 rm -f $TMP2 $TMP3
354
355 for type in btree recno; do
356 cat $TMP1 |
357 awk '{
358 if (i == 120)
359 exit;
360 printf("p\nk%d\nd%s\n", ++i, $0);
361 }
362 END {
363 printf("fR_NEXT\n");
364 for (i = 1; i <= 120; ++i)
365 printf("s\n");
366 printf("fR_CURSOR\ns\nk120\n");
356 printf("%05d: input key %d: %s\n", 1, 1, $0);
357 printf("%05d: input key %d: %s\n", 2, 2, $0);
358 exit;
359 }' > $TMP1
360 rm -f $TMP2 $TMP3
361
362 for type in btree recno; do
363 cat $TMP1 |
364 awk '{
365 if (i == 120)
366 exit;
367 printf("p\nk%d\nd%s\n", ++i, $0);
368 }
369 END {
370 printf("fR_NEXT\n");
371 for (i = 1; i <= 120; ++i)
372 printf("s\n");
373 printf("fR_CURSOR\ns\nk120\n");
367 printf("r\nk120\n");
374 printf("r\n");
368 printf("fR_NEXT\ns\n");
369 printf("fR_CURSOR\ns\nk1\n");
375 printf("fR_NEXT\ns\n");
376 printf("fR_CURSOR\ns\nk1\n");
370 printf("r\nk1\n");
377 printf("r\n");
371 printf("fR_FIRST\ns\n");
372 }' > $TMP2
373 $PROG -o $TMP3 recno $TMP2
374 if (cmp -s $TMP1 $TMP3) ; then :
375 else
376 echo "test7: type $type: failed"
377 exit 1
378 fi
379 done
380}
381
382# Make sure that overflow pages are reused.
383test8()
384{
385 echo "Test 8: btree, hash: repeated small key, big data pairs"
386 rm -f $TMP1
387 echo "" |
388 awk 'BEGIN {
389 for (i = 1; i <= 10; ++i) {
390 printf("p\nkkey1\nD/bin/sh\n");
391 printf("p\nkkey2\nD/bin/csh\n");
392 if (i % 8 == 0) {
393 printf("c\nkkey2\nD/bin/csh\n");
394 printf("c\nkkey1\nD/bin/sh\n");
378 printf("fR_FIRST\ns\n");
379 }' > $TMP2
380 $PROG -o $TMP3 recno $TMP2
381 if (cmp -s $TMP1 $TMP3) ; then :
382 else
383 echo "test7: type $type: failed"
384 exit 1
385 fi
386 done
387}
388
389# Make sure that overflow pages are reused.
390test8()
391{
392 echo "Test 8: btree, hash: repeated small key, big data pairs"
393 rm -f $TMP1
394 echo "" |
395 awk 'BEGIN {
396 for (i = 1; i <= 10; ++i) {
397 printf("p\nkkey1\nD/bin/sh\n");
398 printf("p\nkkey2\nD/bin/csh\n");
399 if (i % 8 == 0) {
400 printf("c\nkkey2\nD/bin/csh\n");
401 printf("c\nkkey1\nD/bin/sh\n");
395 printf("e\t%d of 10 (comparison)\r\n", i);
402 printf("e\t%d of 10 (comparison)\n", i);
396 } else
403 } else
397 printf("e\t%d of 10 \r\n", i);
404 printf("e\t%d of 10 \n", i);
398 printf("r\nkkey1\nr\nkkey2\n");
399 }
405 printf("r\nkkey1\nr\nkkey2\n");
406 }
400 printf("e\n");
401 printf("eend of test8 run\n");
402 }' > $TMP1
403 $PROG btree $TMP1
404# $PROG hash $TMP1
405 # No explicit test for success.
406}
407
408# Test btree duplicate keys
409test9()
410{
411 echo "Test 9: btree: duplicate keys"
412 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
413 awk '{
414 for (i = 1; i <= 543; ++i)
415 printf("%05d: input key %d: %s\n", i, i, $0);
416 exit;
417 }' > $TMP1
418 rm -f $TMP2 $TMP3
419
420 for type in btree; do
421 cat $TMP1 |
422 awk '{
423 if (i++ % 2)
424 printf("p\nkduplicatekey\nd%s\n", $0);
425 else
426 printf("p\nkunique%dkey\nd%s\n", i, $0);
427 }
428 END {
429 printf("o\n");
430 }' > $TMP2
431 $PROG -iflags=1 -o $TMP3 $type $TMP2
432 sort -o $TMP3 $TMP3
433 if (cmp -s $TMP1 $TMP3) ; then :
434 else
435 echo "test9: type $type: failed"
436 exit 1
437 fi
438 done
439}
440
441# Test use of cursor flags without initialization
442test10()
443{
444 echo "Test 10: btree, recno: test cursor flag use"
445 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
446 awk '{
447 for (i = 1; i <= 20; ++i)
448 printf("%05d: input key %d: %s\n", i, i, $0);
449 exit;
450 }' > $TMP1
451 rm -f $TMP2 $TMP3
452
453 # Test that R_CURSOR doesn't succeed before cursor initialized
454 for type in btree recno; do
455 cat $TMP1 |
456 awk '{
457 if (i == 10)
458 exit;
459 printf("p\nk%d\nd%s\n", ++i, $0);
460 }
461 END {
407 }' > $TMP1
408 $PROG btree $TMP1
409# $PROG hash $TMP1
410 # No explicit test for success.
411}
412
413# Test btree duplicate keys
414test9()
415{
416 echo "Test 9: btree: duplicate keys"
417 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
418 awk '{
419 for (i = 1; i <= 543; ++i)
420 printf("%05d: input key %d: %s\n", i, i, $0);
421 exit;
422 }' > $TMP1
423 rm -f $TMP2 $TMP3
424
425 for type in btree; do
426 cat $TMP1 |
427 awk '{
428 if (i++ % 2)
429 printf("p\nkduplicatekey\nd%s\n", $0);
430 else
431 printf("p\nkunique%dkey\nd%s\n", i, $0);
432 }
433 END {
434 printf("o\n");
435 }' > $TMP2
436 $PROG -iflags=1 -o $TMP3 $type $TMP2
437 sort -o $TMP3 $TMP3
438 if (cmp -s $TMP1 $TMP3) ; then :
439 else
440 echo "test9: type $type: failed"
441 exit 1
442 fi
443 done
444}
445
446# Test use of cursor flags without initialization
447test10()
448{
449 echo "Test 10: btree, recno: test cursor flag use"
450 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
451 awk '{
452 for (i = 1; i <= 20; ++i)
453 printf("%05d: input key %d: %s\n", i, i, $0);
454 exit;
455 }' > $TMP1
456 rm -f $TMP2 $TMP3
457
458 # Test that R_CURSOR doesn't succeed before cursor initialized
459 for type in btree recno; do
460 cat $TMP1 |
461 awk '{
462 if (i == 10)
463 exit;
464 printf("p\nk%d\nd%s\n", ++i, $0);
465 }
466 END {
462 printf("fR_CURSOR\nr\nk1\n");
467 printf("fR_CURSOR\nr\n");
463 printf("eR_CURSOR SHOULD HAVE FAILED\n");
464 }' > $TMP2
465 $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
466 if [ -s $TMP3 ] ; then
467 echo "Test 10: delete: R_CURSOR SHOULD HAVE FAILED"
468 exit 1
469 fi
470 done
471 for type in btree recno; do
472 cat $TMP1 |
473 awk '{
474 if (i == 10)
475 exit;
476 printf("p\nk%d\nd%s\n", ++i, $0);
477 }
478 END {
479 printf("fR_CURSOR\np\nk1\ndsome data\n");
480 printf("eR_CURSOR SHOULD HAVE FAILED\n");
481 }' > $TMP2
482 $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
483 if [ -s $TMP3 ] ; then
484 echo "Test 10: put: R_CURSOR SHOULD HAVE FAILED"
485 exit 1
486 fi
487 done
488}
489
490# Test insert in reverse order.
491test11()
492{
493 echo "Test 11: recno: reverse order insert"
494 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
495 awk '{
496 for (i = 1; i <= 779; ++i)
497 printf("%05d: input key %d: %s\n", i, i, $0);
498 exit;
499 }' > $TMP1
500 rm -f $TMP2 $TMP3
501
502 for type in recno; do
503 cat $TMP1 |
504 awk '{
505 if (i == 0) {
506 i = 1;
507 printf("p\nk1\nd%s\n", $0);
508 printf("%s\n", "fR_IBEFORE");
509 } else
510 printf("p\nk1\nd%s\n", $0);
511 }
512 END {
513 printf("or\n");
514 }' > $TMP2
515 $PROG -o $TMP3 $type $TMP2
516 if (cmp -s $TMP1 $TMP3) ; then :
517 else
518 echo "test11: type $type: failed"
519 exit 1
520 fi
521 done
522}
523
524# Take the first 20000 entries in the dictionary, reverse them, and give
525# them each a small size data entry. Use a small page size to make sure
526# the btree split code gets hammered.
527test12()
528{
529 echo "Test 12: btree: lots of keys, small page size"
530 mdata=abcdefghijklmnopqrstuvwxy
531 echo $mdata |
532 awk '{ for (i = 1; i < 20001; ++i) print $0 }' > $TMP1
533 for type in btree; do
534 rm -f $TMP2 $TMP3
535 for i in `sed 20000q $DICT | rev`; do
536 echo p
537 echo k$i
538 echo d$mdata
539 echo g
540 echo k$i
541 done > $TMP2
542 $PROG -i psize=512 -o $TMP3 $type $TMP2
543 if (cmp -s $TMP1 $TMP3) ; then :
544 else
545 echo "test12: type $type: failed"
546 exit 1
547 fi
548 done
549}
550
551# Test different byte orders.
552test13()
553{
554 echo "Test 13: btree, hash: differing byte orders"
555 sed 50q $DICT > $TMP1
556 for order in 1234 4321; do
557 for type in btree hash; do
558 rm -f byte.file $TMP2 $TMP3
559 for i in `sed 50q $DICT`; do
560 echo p
561 echo k$i
562 echo d$i
563 echo g
564 echo k$i
565 done > $TMP2
566 $PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
567 if (cmp -s $TMP1 $TMP3) ; then :
568 else
569 echo "test13: $type/$order put failed"
570 exit 1
571 fi
572 for i in `sed 50q $DICT`; do
573 echo g
574 echo k$i
575 done > $TMP2
468 printf("eR_CURSOR SHOULD HAVE FAILED\n");
469 }' > $TMP2
470 $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
471 if [ -s $TMP3 ] ; then
472 echo "Test 10: delete: R_CURSOR SHOULD HAVE FAILED"
473 exit 1
474 fi
475 done
476 for type in btree recno; do
477 cat $TMP1 |
478 awk '{
479 if (i == 10)
480 exit;
481 printf("p\nk%d\nd%s\n", ++i, $0);
482 }
483 END {
484 printf("fR_CURSOR\np\nk1\ndsome data\n");
485 printf("eR_CURSOR SHOULD HAVE FAILED\n");
486 }' > $TMP2
487 $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
488 if [ -s $TMP3 ] ; then
489 echo "Test 10: put: R_CURSOR SHOULD HAVE FAILED"
490 exit 1
491 fi
492 done
493}
494
495# Test insert in reverse order.
496test11()
497{
498 echo "Test 11: recno: reverse order insert"
499 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
500 awk '{
501 for (i = 1; i <= 779; ++i)
502 printf("%05d: input key %d: %s\n", i, i, $0);
503 exit;
504 }' > $TMP1
505 rm -f $TMP2 $TMP3
506
507 for type in recno; do
508 cat $TMP1 |
509 awk '{
510 if (i == 0) {
511 i = 1;
512 printf("p\nk1\nd%s\n", $0);
513 printf("%s\n", "fR_IBEFORE");
514 } else
515 printf("p\nk1\nd%s\n", $0);
516 }
517 END {
518 printf("or\n");
519 }' > $TMP2
520 $PROG -o $TMP3 $type $TMP2
521 if (cmp -s $TMP1 $TMP3) ; then :
522 else
523 echo "test11: type $type: failed"
524 exit 1
525 fi
526 done
527}
528
529# Take the first 20000 entries in the dictionary, reverse them, and give
530# them each a small size data entry. Use a small page size to make sure
531# the btree split code gets hammered.
532test12()
533{
534 echo "Test 12: btree: lots of keys, small page size"
535 mdata=abcdefghijklmnopqrstuvwxy
536 echo $mdata |
537 awk '{ for (i = 1; i < 20001; ++i) print $0 }' > $TMP1
538 for type in btree; do
539 rm -f $TMP2 $TMP3
540 for i in `sed 20000q $DICT | rev`; do
541 echo p
542 echo k$i
543 echo d$mdata
544 echo g
545 echo k$i
546 done > $TMP2
547 $PROG -i psize=512 -o $TMP3 $type $TMP2
548 if (cmp -s $TMP1 $TMP3) ; then :
549 else
550 echo "test12: type $type: failed"
551 exit 1
552 fi
553 done
554}
555
556# Test different byte orders.
557test13()
558{
559 echo "Test 13: btree, hash: differing byte orders"
560 sed 50q $DICT > $TMP1
561 for order in 1234 4321; do
562 for type in btree hash; do
563 rm -f byte.file $TMP2 $TMP3
564 for i in `sed 50q $DICT`; do
565 echo p
566 echo k$i
567 echo d$i
568 echo g
569 echo k$i
570 done > $TMP2
571 $PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
572 if (cmp -s $TMP1 $TMP3) ; then :
573 else
574 echo "test13: $type/$order put failed"
575 exit 1
576 fi
577 for i in `sed 50q $DICT`; do
578 echo g
579 echo k$i
580 done > $TMP2
576 $PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
581 $PROG -s \
582 -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
577 if (cmp -s $TMP1 $TMP3) ; then :
578 else
579 echo "test13: $type/$order get failed"
580 exit 1
581 fi
582 done
583 done
584 rm -f byte.file
585}
586
587# Try a variety of bucketsizes and fill factors for hashing
588test20()
589{
590 echo\
591 "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536"
592 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
593 awk '{
594 for (i = 1; i <= 10000; ++i) {
595 if (i % 34)
596 s = substr($0, 1, i % 34);
597 else
598 s = substr($0, 1);
599 printf("%s\n", s);
600 }
601 exit;
602 }' > $TMP1
603 sed 10000q $DICT |
604 awk 'BEGIN {
605 ds="abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"
606 }
607 {
608 if (++i % 34)
609 s = substr(ds, 1, i % 34);
610 else
611 s = substr(ds, 1);
612 printf("p\nk%s\nd%s\n", $0, s);
613 }' > $TMP2
614 sed 10000q $DICT |
615 awk '{
616 ++i;
617 printf("g\nk%s\n", $0);
618 }' >> $TMP2
619 bsize=256
620 for ffactor in 11 14 21; do
621 echo " bucketsize $bsize, fill factor $ffactor"
622 $PROG -o$TMP3 \
623 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
624 hash $TMP2
625 if (cmp -s $TMP1 $TMP3) ; then :
626 else
627 echo "test20: type hash:\
628bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
629 exit 1
630 fi
631 done
632 bsize=512
633 for ffactor in 21 28 43; do
634 echo " bucketsize $bsize, fill factor $ffactor"
635 $PROG -o$TMP3 \
636 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
637 hash $TMP2
638 if (cmp -s $TMP1 $TMP3) ; then :
639 else
640 echo "test20: type hash:\
641bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
642 exit 1
643 fi
644 done
645 bsize=1024
646 for ffactor in 43 57 85; do
647 echo " bucketsize $bsize, fill factor $ffactor"
648 $PROG -o$TMP3 \
649 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
650 hash $TMP2
651 if (cmp -s $TMP1 $TMP3) ; then :
652 else
653 echo "test20: type hash:\
654bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
655 exit 1
656 fi
657 done
658 bsize=2048
659 for ffactor in 85 114 171; do
660 echo " bucketsize $bsize, fill factor $ffactor"
661 $PROG -o$TMP3 \
662 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
663 hash $TMP2
664 if (cmp -s $TMP1 $TMP3) ; then :
665 else
666 echo "test20: type hash:\
667bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
668 exit 1
669 fi
670 done
671 bsize=4096
672 for ffactor in 171 228 341; do
673 echo " bucketsize $bsize, fill factor $ffactor"
674 $PROG -o$TMP3 \
675 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
676 hash $TMP2
677 if (cmp -s $TMP1 $TMP3) ; then :
678 else
679 echo "test20: type hash:\
680bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
681 exit 1
682 fi
683 done
684 bsize=8192
685 for ffactor in 341 455 683; do
686 echo " bucketsize $bsize, fill factor $ffactor"
687 $PROG -o$TMP3 \
688 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
689 hash $TMP2
690 if (cmp -s $TMP1 $TMP3) ; then :
691 else
692 echo "test20: type hash:\
693bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
694 exit 1
695 fi
696 done
697}
698
699main $*
583 if (cmp -s $TMP1 $TMP3) ; then :
584 else
585 echo "test13: $type/$order get failed"
586 exit 1
587 fi
588 done
589 done
590 rm -f byte.file
591}
592
593# Try a variety of bucketsizes and fill factors for hashing
594test20()
595{
596 echo\
597 "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536"
598 echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
599 awk '{
600 for (i = 1; i <= 10000; ++i) {
601 if (i % 34)
602 s = substr($0, 1, i % 34);
603 else
604 s = substr($0, 1);
605 printf("%s\n", s);
606 }
607 exit;
608 }' > $TMP1
609 sed 10000q $DICT |
610 awk 'BEGIN {
611 ds="abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"
612 }
613 {
614 if (++i % 34)
615 s = substr(ds, 1, i % 34);
616 else
617 s = substr(ds, 1);
618 printf("p\nk%s\nd%s\n", $0, s);
619 }' > $TMP2
620 sed 10000q $DICT |
621 awk '{
622 ++i;
623 printf("g\nk%s\n", $0);
624 }' >> $TMP2
625 bsize=256
626 for ffactor in 11 14 21; do
627 echo " bucketsize $bsize, fill factor $ffactor"
628 $PROG -o$TMP3 \
629 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
630 hash $TMP2
631 if (cmp -s $TMP1 $TMP3) ; then :
632 else
633 echo "test20: type hash:\
634bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
635 exit 1
636 fi
637 done
638 bsize=512
639 for ffactor in 21 28 43; do
640 echo " bucketsize $bsize, fill factor $ffactor"
641 $PROG -o$TMP3 \
642 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
643 hash $TMP2
644 if (cmp -s $TMP1 $TMP3) ; then :
645 else
646 echo "test20: type hash:\
647bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
648 exit 1
649 fi
650 done
651 bsize=1024
652 for ffactor in 43 57 85; do
653 echo " bucketsize $bsize, fill factor $ffactor"
654 $PROG -o$TMP3 \
655 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
656 hash $TMP2
657 if (cmp -s $TMP1 $TMP3) ; then :
658 else
659 echo "test20: type hash:\
660bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
661 exit 1
662 fi
663 done
664 bsize=2048
665 for ffactor in 85 114 171; do
666 echo " bucketsize $bsize, fill factor $ffactor"
667 $PROG -o$TMP3 \
668 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
669 hash $TMP2
670 if (cmp -s $TMP1 $TMP3) ; then :
671 else
672 echo "test20: type hash:\
673bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
674 exit 1
675 fi
676 done
677 bsize=4096
678 for ffactor in 171 228 341; do
679 echo " bucketsize $bsize, fill factor $ffactor"
680 $PROG -o$TMP3 \
681 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
682 hash $TMP2
683 if (cmp -s $TMP1 $TMP3) ; then :
684 else
685 echo "test20: type hash:\
686bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
687 exit 1
688 fi
689 done
690 bsize=8192
691 for ffactor in 341 455 683; do
692 echo " bucketsize $bsize, fill factor $ffactor"
693 $PROG -o$TMP3 \
694 -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
695 hash $TMP2
696 if (cmp -s $TMP1 $TMP3) ; then :
697 else
698 echo "test20: type hash:\
699bsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
700 exit 1
701 fi
702 done
703}
704
705main $*