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