xref: /dflybsd-src/lib/libc/db/test/run.test (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino#!/bin/sh -
286d7f5d3SJohn Marino#
386d7f5d3SJohn Marino#	@(#)run.test	8.10 (Berkeley) 7/26/94
486d7f5d3SJohn Marino#
586d7f5d3SJohn Marino
686d7f5d3SJohn Marino# db regression tests
786d7f5d3SJohn Marinomain()
886d7f5d3SJohn Marino{
986d7f5d3SJohn Marino
1086d7f5d3SJohn Marino	PROG=./dbtest
1186d7f5d3SJohn Marino	TMP1=t1
1286d7f5d3SJohn Marino	TMP2=t2
1386d7f5d3SJohn Marino	TMP3=t3
1486d7f5d3SJohn Marino
1586d7f5d3SJohn Marino	if [ -f /usr/share/dict/words ]; then
1686d7f5d3SJohn Marino		DICT=/usr/share/dict/words
1786d7f5d3SJohn Marino	elif [ -f /usr/dict/words ]; then
1886d7f5d3SJohn Marino		DICT=/usr/dict/words
1986d7f5d3SJohn Marino	else
2086d7f5d3SJohn Marino		echo 'run.test: no dictionary'
2186d7f5d3SJohn Marino		exit 1
2286d7f5d3SJohn Marino	fi
2386d7f5d3SJohn Marino
2486d7f5d3SJohn Marino	if [ $# -eq 0 ]; then
2586d7f5d3SJohn Marino		for t in 1 2 3 4 5 6 7 8 9 10 11 12 13 20; do
2686d7f5d3SJohn Marino			test$t
2786d7f5d3SJohn Marino		done
2886d7f5d3SJohn Marino	else
2986d7f5d3SJohn Marino		while [ $# -gt 0 ]
3086d7f5d3SJohn Marino			do case "$1" in
3186d7f5d3SJohn Marino			test*)
3286d7f5d3SJohn Marino				$1;;
3386d7f5d3SJohn Marino			[0-9]*)
3486d7f5d3SJohn Marino				test$1;;
3586d7f5d3SJohn Marino			btree)
3686d7f5d3SJohn Marino				for t in 1 2 3 7 8 9 10 12 13; do
3786d7f5d3SJohn Marino					test$t
3886d7f5d3SJohn Marino				done;;
3986d7f5d3SJohn Marino			hash)
4086d7f5d3SJohn Marino				for t in 1 2 3 8 13 20; do
4186d7f5d3SJohn Marino					test$t
4286d7f5d3SJohn Marino				done;;
4386d7f5d3SJohn Marino			recno)
4486d7f5d3SJohn Marino				for t in 1 2 3 4 5 6 7 10 11; do
4586d7f5d3SJohn Marino					test$t
4686d7f5d3SJohn Marino				done;;
4786d7f5d3SJohn Marino			*)
4886d7f5d3SJohn Marino				echo "run.test: unknown test $1"
4986d7f5d3SJohn Marino				echo "usage: run.test test# | type"
5086d7f5d3SJohn Marino				exit 1
5186d7f5d3SJohn Marino			esac
5286d7f5d3SJohn Marino			shift
5386d7f5d3SJohn Marino		done
5486d7f5d3SJohn Marino	fi
5586d7f5d3SJohn Marino	rm -f $TMP1 $TMP2 $TMP3
5686d7f5d3SJohn Marino	exit 0
5786d7f5d3SJohn Marino}
5886d7f5d3SJohn Marino
5986d7f5d3SJohn Marino# Take the first hundred entries in the dictionary, and make them
6086d7f5d3SJohn Marino# be key/data pairs.
6186d7f5d3SJohn Marinotest1()
6286d7f5d3SJohn Marino{
6386d7f5d3SJohn Marino	echo "Test 1: btree, hash: small key, small data pairs"
6486d7f5d3SJohn Marino	sed 200q $DICT > $TMP1
6586d7f5d3SJohn Marino	for type in btree hash; do
6686d7f5d3SJohn Marino		rm -f $TMP2 $TMP3
6786d7f5d3SJohn Marino		for i in `sed 200q $DICT`; do
6886d7f5d3SJohn Marino			echo p
6986d7f5d3SJohn Marino			echo k$i
7086d7f5d3SJohn Marino			echo d$i
7186d7f5d3SJohn Marino			echo g
7286d7f5d3SJohn Marino			echo k$i
7386d7f5d3SJohn Marino		done > $TMP2
7486d7f5d3SJohn Marino		$PROG -o $TMP3 $type $TMP2
7586d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
7686d7f5d3SJohn Marino		else
7786d7f5d3SJohn Marino			echo "test1: type $type: failed"
7886d7f5d3SJohn Marino			exit 1
7986d7f5d3SJohn Marino		fi
8086d7f5d3SJohn Marino	done
8186d7f5d3SJohn Marino	echo "Test 1: recno: small key, small data pairs"
8286d7f5d3SJohn Marino	rm -f $TMP2 $TMP3
8386d7f5d3SJohn Marino	sed 200q $DICT |
8486d7f5d3SJohn Marino	awk '{
8586d7f5d3SJohn Marino		++i;
8686d7f5d3SJohn Marino		printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
8786d7f5d3SJohn Marino	}' > $TMP2
8886d7f5d3SJohn Marino	$PROG -o $TMP3 recno $TMP2
8986d7f5d3SJohn Marino	if (cmp -s $TMP1 $TMP3) ; then :
9086d7f5d3SJohn Marino	else
9186d7f5d3SJohn Marino		echo "test1: type recno: failed"
9286d7f5d3SJohn Marino		exit 1
9386d7f5d3SJohn Marino	fi
9486d7f5d3SJohn Marino}
9586d7f5d3SJohn Marino
9686d7f5d3SJohn Marino# Take the first 200 entries in the dictionary, and give them
9786d7f5d3SJohn Marino# each a medium size data entry.
9886d7f5d3SJohn Marinotest2()
9986d7f5d3SJohn Marino{
10086d7f5d3SJohn Marino	echo "Test 2: btree, hash: small key, medium data pairs"
10186d7f5d3SJohn Marino	mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
10286d7f5d3SJohn Marino	echo $mdata |
10386d7f5d3SJohn Marino	awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1
10486d7f5d3SJohn Marino	for type in hash btree; do
10586d7f5d3SJohn Marino		rm -f $TMP2 $TMP3
10686d7f5d3SJohn Marino		for i in `sed 200q $DICT`; do
10786d7f5d3SJohn Marino			echo p
10886d7f5d3SJohn Marino			echo k$i
10986d7f5d3SJohn Marino			echo d$mdata
11086d7f5d3SJohn Marino			echo g
11186d7f5d3SJohn Marino			echo k$i
11286d7f5d3SJohn Marino		done > $TMP2
11386d7f5d3SJohn Marino		$PROG -o $TMP3 $type $TMP2
11486d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
11586d7f5d3SJohn Marino		else
11686d7f5d3SJohn Marino			echo "test2: type $type: failed"
11786d7f5d3SJohn Marino			exit 1
11886d7f5d3SJohn Marino		fi
11986d7f5d3SJohn Marino	done
12086d7f5d3SJohn Marino	echo "Test 2: recno: small key, medium data pairs"
12186d7f5d3SJohn Marino	rm -f $TMP2 $TMP3
12286d7f5d3SJohn Marino	echo $mdata |
12386d7f5d3SJohn Marino	awk '{  for (i = 1; i < 201; ++i)
12486d7f5d3SJohn Marino		printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
12586d7f5d3SJohn Marino	}' > $TMP2
12686d7f5d3SJohn Marino	$PROG -o $TMP3 recno $TMP2
12786d7f5d3SJohn Marino	if (cmp -s $TMP1 $TMP3) ; then :
12886d7f5d3SJohn Marino	else
12986d7f5d3SJohn Marino		echo "test2: type recno: failed"
13086d7f5d3SJohn Marino		exit 1
13186d7f5d3SJohn Marino	fi
13286d7f5d3SJohn Marino}
13386d7f5d3SJohn Marino
13486d7f5d3SJohn Marino# Insert the programs in /bin with their paths as their keys.
13586d7f5d3SJohn Marinotest3()
13686d7f5d3SJohn Marino{
13786d7f5d3SJohn Marino	echo "Test 3: hash: small key, big data pairs"
13886d7f5d3SJohn Marino	rm -f $TMP1
13986d7f5d3SJohn Marino	(find /bin -type f -print | xargs cat) > $TMP1
14086d7f5d3SJohn Marino	for type in hash; do
14186d7f5d3SJohn Marino		rm -f $TMP2 $TMP3
14286d7f5d3SJohn Marino		for i in `find /bin -type f -print`; do
14386d7f5d3SJohn Marino			echo p
14486d7f5d3SJohn Marino			echo k$i
14586d7f5d3SJohn Marino			echo D$i
14686d7f5d3SJohn Marino			echo g
14786d7f5d3SJohn Marino			echo k$i
14886d7f5d3SJohn Marino		done > $TMP2
14986d7f5d3SJohn Marino		$PROG -o $TMP3 $type $TMP2
15086d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
15186d7f5d3SJohn Marino		else
15286d7f5d3SJohn Marino			echo "test3: $type: failed"
15386d7f5d3SJohn Marino			exit 1
15486d7f5d3SJohn Marino		fi
15586d7f5d3SJohn Marino	done
15686d7f5d3SJohn Marino	echo "Test 3: btree: small key, big data pairs"
15786d7f5d3SJohn Marino	for psize in 512 16384 65536; do
15886d7f5d3SJohn Marino		echo "    page size $psize"
15986d7f5d3SJohn Marino		for type in btree; do
16086d7f5d3SJohn Marino			rm -f $TMP2 $TMP3
16186d7f5d3SJohn Marino			for i in `find /bin -type f -print`; do
16286d7f5d3SJohn Marino				echo p
16386d7f5d3SJohn Marino				echo k$i
16486d7f5d3SJohn Marino				echo D$i
16586d7f5d3SJohn Marino				echo g
16686d7f5d3SJohn Marino				echo k$i
16786d7f5d3SJohn Marino			done > $TMP2
16886d7f5d3SJohn Marino			$PROG -i psize=$psize -o $TMP3 $type $TMP2
16986d7f5d3SJohn Marino			if (cmp -s $TMP1 $TMP3) ; then :
17086d7f5d3SJohn Marino			else
17186d7f5d3SJohn Marino				echo "test3: $type: page size $psize: failed"
17286d7f5d3SJohn Marino				exit 1
17386d7f5d3SJohn Marino			fi
17486d7f5d3SJohn Marino		done
17586d7f5d3SJohn Marino	done
17686d7f5d3SJohn Marino	echo "Test 3: recno: big data pairs"
17786d7f5d3SJohn Marino	rm -f $TMP2 $TMP3
17886d7f5d3SJohn Marino	find /bin -type f -print |
17986d7f5d3SJohn Marino	awk '{
18086d7f5d3SJohn Marino		++i;
18186d7f5d3SJohn Marino		printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
18286d7f5d3SJohn Marino	}' > $TMP2
18386d7f5d3SJohn Marino	for psize in 512 16384 65536; do
18486d7f5d3SJohn Marino		echo "    page size $psize"
18586d7f5d3SJohn Marino		$PROG -i psize=$psize -o $TMP3 recno $TMP2
18686d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
18786d7f5d3SJohn Marino		else
18886d7f5d3SJohn Marino			echo "test3: recno: page size $psize: failed"
18986d7f5d3SJohn Marino			exit 1
19086d7f5d3SJohn Marino		fi
19186d7f5d3SJohn Marino	done
19286d7f5d3SJohn Marino}
19386d7f5d3SJohn Marino
19486d7f5d3SJohn Marino# Do random recno entries.
19586d7f5d3SJohn Marinotest4()
19686d7f5d3SJohn Marino{
19786d7f5d3SJohn Marino	echo "Test 4: recno: random entries"
19886d7f5d3SJohn Marino	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
19986d7f5d3SJohn Marino	awk '{
20086d7f5d3SJohn Marino		for (i = 37; i <= 37 + 88 * 17; i += 17) {
20186d7f5d3SJohn Marino			if (i % 41)
20286d7f5d3SJohn Marino				s = substr($0, 1, i % 41);
20386d7f5d3SJohn Marino			else
20486d7f5d3SJohn Marino				s = substr($0, 1);
20586d7f5d3SJohn Marino			printf("input key %d: %s\n", i, s);
20686d7f5d3SJohn Marino		}
20786d7f5d3SJohn Marino		for (i = 1; i <= 15; ++i) {
20886d7f5d3SJohn Marino			if (i % 41)
20986d7f5d3SJohn Marino				s = substr($0, 1, i % 41);
21086d7f5d3SJohn Marino			else
21186d7f5d3SJohn Marino				s = substr($0, 1);
21286d7f5d3SJohn Marino			printf("input key %d: %s\n", i, s);
21386d7f5d3SJohn Marino		}
21486d7f5d3SJohn Marino		for (i = 19234; i <= 19234 + 61 * 27; i += 27) {
21586d7f5d3SJohn Marino			if (i % 41)
21686d7f5d3SJohn Marino				s = substr($0, 1, i % 41);
21786d7f5d3SJohn Marino			else
21886d7f5d3SJohn Marino				s = substr($0, 1);
21986d7f5d3SJohn Marino			printf("input key %d: %s\n", i, s);
22086d7f5d3SJohn Marino		}
22186d7f5d3SJohn Marino		exit
22286d7f5d3SJohn Marino	}' > $TMP1
22386d7f5d3SJohn Marino	rm -f $TMP2 $TMP3
22486d7f5d3SJohn Marino	cat $TMP1 |
22586d7f5d3SJohn Marino	awk 'BEGIN {
22686d7f5d3SJohn Marino			i = 37;
22786d7f5d3SJohn Marino			incr = 17;
22886d7f5d3SJohn Marino		}
22986d7f5d3SJohn Marino		{
23086d7f5d3SJohn Marino			printf("p\nk%d\nd%s\n", i, $0);
23186d7f5d3SJohn Marino			if (i == 19234 + 61 * 27)
23286d7f5d3SJohn Marino				exit;
23386d7f5d3SJohn Marino			if (i == 37 + 88 * 17) {
23486d7f5d3SJohn Marino				i = 1;
23586d7f5d3SJohn Marino				incr = 1;
23686d7f5d3SJohn Marino			} else if (i == 15) {
23786d7f5d3SJohn Marino				i = 19234;
23886d7f5d3SJohn Marino				incr = 27;
23986d7f5d3SJohn Marino			} else
24086d7f5d3SJohn Marino				i += incr;
24186d7f5d3SJohn Marino		}
24286d7f5d3SJohn Marino		END {
24386d7f5d3SJohn Marino			for (i = 37; i <= 37 + 88 * 17; i += 17)
24486d7f5d3SJohn Marino				printf("g\nk%d\n", i);
24586d7f5d3SJohn Marino			for (i = 1; i <= 15; ++i)
24686d7f5d3SJohn Marino				printf("g\nk%d\n", i);
24786d7f5d3SJohn Marino			for (i = 19234; i <= 19234 + 61 * 27; i += 27)
24886d7f5d3SJohn Marino				printf("g\nk%d\n", i);
24986d7f5d3SJohn Marino		}' > $TMP2
25086d7f5d3SJohn Marino	$PROG -o $TMP3 recno $TMP2
25186d7f5d3SJohn Marino	if (cmp -s $TMP1 $TMP3) ; then :
25286d7f5d3SJohn Marino	else
25386d7f5d3SJohn Marino		echo "test4: type recno: failed"
25486d7f5d3SJohn Marino		exit 1
25586d7f5d3SJohn Marino	fi
25686d7f5d3SJohn Marino}
25786d7f5d3SJohn Marino
25886d7f5d3SJohn Marino# Do reverse order recno entries.
25986d7f5d3SJohn Marinotest5()
26086d7f5d3SJohn Marino{
26186d7f5d3SJohn Marino	echo "Test 5: recno: reverse order entries"
26286d7f5d3SJohn Marino	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
26386d7f5d3SJohn Marino	awk ' {
26486d7f5d3SJohn Marino		for (i = 1500; i; --i) {
26586d7f5d3SJohn Marino			if (i % 34)
26686d7f5d3SJohn Marino				s = substr($0, 1, i % 34);
26786d7f5d3SJohn Marino			else
26886d7f5d3SJohn Marino				s = substr($0, 1);
26986d7f5d3SJohn Marino			printf("input key %d: %s\n", i, s);
27086d7f5d3SJohn Marino		}
27186d7f5d3SJohn Marino		exit;
27286d7f5d3SJohn Marino	}' > $TMP1
27386d7f5d3SJohn Marino	rm -f $TMP2 $TMP3
27486d7f5d3SJohn Marino	cat $TMP1 |
27586d7f5d3SJohn Marino	awk 'BEGIN {
27686d7f5d3SJohn Marino			i = 1500;
27786d7f5d3SJohn Marino		}
27886d7f5d3SJohn Marino		{
27986d7f5d3SJohn Marino			printf("p\nk%d\nd%s\n", i, $0);
28086d7f5d3SJohn Marino			--i;
28186d7f5d3SJohn Marino		}
28286d7f5d3SJohn Marino		END {
28386d7f5d3SJohn Marino			for (i = 1500; i; --i)
28486d7f5d3SJohn Marino				printf("g\nk%d\n", i);
28586d7f5d3SJohn Marino		}' > $TMP2
28686d7f5d3SJohn Marino	$PROG -o $TMP3 recno $TMP2
28786d7f5d3SJohn Marino	if (cmp -s $TMP1 $TMP3) ; then :
28886d7f5d3SJohn Marino	else
28986d7f5d3SJohn Marino		echo "test5: type recno: failed"
29086d7f5d3SJohn Marino		exit 1
29186d7f5d3SJohn Marino	fi
29286d7f5d3SJohn Marino}
29386d7f5d3SJohn Marino
29486d7f5d3SJohn Marino# Do alternating order recno entries.
29586d7f5d3SJohn Marinotest6()
29686d7f5d3SJohn Marino{
29786d7f5d3SJohn Marino	echo "Test 6: recno: alternating order entries"
29886d7f5d3SJohn Marino	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
29986d7f5d3SJohn Marino	awk ' {
30086d7f5d3SJohn Marino		for (i = 1; i < 1200; i += 2) {
30186d7f5d3SJohn Marino			if (i % 34)
30286d7f5d3SJohn Marino				s = substr($0, 1, i % 34);
30386d7f5d3SJohn Marino			else
30486d7f5d3SJohn Marino				s = substr($0, 1);
30586d7f5d3SJohn Marino			printf("input key %d: %s\n", i, s);
30686d7f5d3SJohn Marino		}
30786d7f5d3SJohn Marino		for (i = 2; i < 1200; i += 2) {
30886d7f5d3SJohn Marino			if (i % 34)
30986d7f5d3SJohn Marino				s = substr($0, 1, i % 34);
31086d7f5d3SJohn Marino			else
31186d7f5d3SJohn Marino				s = substr($0, 1);
31286d7f5d3SJohn Marino			printf("input key %d: %s\n", i, s);
31386d7f5d3SJohn Marino		}
31486d7f5d3SJohn Marino		exit;
31586d7f5d3SJohn Marino	}' > $TMP1
31686d7f5d3SJohn Marino	rm -f $TMP2 $TMP3
31786d7f5d3SJohn Marino	cat $TMP1 |
31886d7f5d3SJohn Marino	awk 'BEGIN {
31986d7f5d3SJohn Marino			i = 1;
32086d7f5d3SJohn Marino			even = 0;
32186d7f5d3SJohn Marino		}
32286d7f5d3SJohn Marino		{
32386d7f5d3SJohn Marino			printf("p\nk%d\nd%s\n", i, $0);
32486d7f5d3SJohn Marino			i += 2;
32586d7f5d3SJohn Marino			if (i >= 1200) {
32686d7f5d3SJohn Marino				if (even == 1)
32786d7f5d3SJohn Marino					exit;
32886d7f5d3SJohn Marino				even = 1;
32986d7f5d3SJohn Marino				i = 2;
33086d7f5d3SJohn Marino			}
33186d7f5d3SJohn Marino		}
33286d7f5d3SJohn Marino		END {
33386d7f5d3SJohn Marino			for (i = 1; i < 1200; ++i)
33486d7f5d3SJohn Marino				printf("g\nk%d\n", i);
33586d7f5d3SJohn Marino		}' > $TMP2
33686d7f5d3SJohn Marino	$PROG -o $TMP3 recno $TMP2
33786d7f5d3SJohn Marino	sort -o $TMP1 $TMP1
33886d7f5d3SJohn Marino	sort -o $TMP3 $TMP3
33986d7f5d3SJohn Marino	if (cmp -s $TMP1 $TMP3) ; then :
34086d7f5d3SJohn Marino	else
34186d7f5d3SJohn Marino		echo "test6: type recno: failed"
34286d7f5d3SJohn Marino		exit 1
34386d7f5d3SJohn Marino	fi
34486d7f5d3SJohn Marino}
34586d7f5d3SJohn Marino
34686d7f5d3SJohn Marino# Delete cursor record
34786d7f5d3SJohn Marinotest7()
34886d7f5d3SJohn Marino{
34986d7f5d3SJohn Marino	echo "Test 7: btree, recno: delete cursor record"
35086d7f5d3SJohn Marino	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
35186d7f5d3SJohn Marino	awk '{
35286d7f5d3SJohn Marino		for (i = 1; i <= 120; ++i)
35386d7f5d3SJohn Marino			printf("%05d: input key %d: %s\n", i, i, $0);
35486d7f5d3SJohn Marino		printf("%05d: input key %d: %s\n", 120, 120, $0);
35586d7f5d3SJohn Marino		printf("seq failed, no such key\n");
35686d7f5d3SJohn Marino		printf("%05d: input key %d: %s\n", 1, 1, $0);
35786d7f5d3SJohn Marino		printf("%05d: input key %d: %s\n", 2, 2, $0);
35886d7f5d3SJohn Marino		exit;
35986d7f5d3SJohn Marino	}' > $TMP1
36086d7f5d3SJohn Marino	rm -f $TMP2 $TMP3
36186d7f5d3SJohn Marino
36286d7f5d3SJohn Marino	for type in btree recno; do
36386d7f5d3SJohn Marino		cat $TMP1 |
36486d7f5d3SJohn Marino		awk '{
36586d7f5d3SJohn Marino			if (i == 120)
36686d7f5d3SJohn Marino				exit;
36786d7f5d3SJohn Marino			printf("p\nk%d\nd%s\n", ++i, $0);
36886d7f5d3SJohn Marino		}
36986d7f5d3SJohn Marino		END {
37086d7f5d3SJohn Marino			printf("fR_NEXT\n");
37186d7f5d3SJohn Marino			for (i = 1; i <= 120; ++i)
37286d7f5d3SJohn Marino				printf("s\n");
37386d7f5d3SJohn Marino			printf("fR_CURSOR\ns\nk120\n");
37486d7f5d3SJohn Marino			printf("r\n");
37586d7f5d3SJohn Marino			printf("fR_NEXT\ns\n");
37686d7f5d3SJohn Marino			printf("fR_CURSOR\ns\nk1\n");
37786d7f5d3SJohn Marino			printf("r\n");
37886d7f5d3SJohn Marino			printf("fR_FIRST\ns\n");
37986d7f5d3SJohn Marino		}' > $TMP2
38086d7f5d3SJohn Marino		$PROG -o $TMP3 recno $TMP2
38186d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
38286d7f5d3SJohn Marino		else
38386d7f5d3SJohn Marino			echo "test7: type $type: failed"
38486d7f5d3SJohn Marino			exit 1
38586d7f5d3SJohn Marino		fi
38686d7f5d3SJohn Marino	done
38786d7f5d3SJohn Marino}
38886d7f5d3SJohn Marino
38986d7f5d3SJohn Marino# Make sure that overflow pages are reused.
39086d7f5d3SJohn Marinotest8()
39186d7f5d3SJohn Marino{
39286d7f5d3SJohn Marino	echo "Test 8: btree, hash: repeated small key, big data pairs"
39386d7f5d3SJohn Marino	rm -f $TMP1
39486d7f5d3SJohn Marino	echo "" |
39586d7f5d3SJohn Marino	awk 'BEGIN {
39686d7f5d3SJohn Marino		for (i = 1; i <= 10; ++i) {
39786d7f5d3SJohn Marino			printf("p\nkkey1\nD/bin/sh\n");
39886d7f5d3SJohn Marino			printf("p\nkkey2\nD/bin/csh\n");
39986d7f5d3SJohn Marino			if (i % 8 == 0) {
40086d7f5d3SJohn Marino				printf("c\nkkey2\nD/bin/csh\n");
40186d7f5d3SJohn Marino				printf("c\nkkey1\nD/bin/sh\n");
40286d7f5d3SJohn Marino				printf("e\t%d of 10 (comparison)\n", i);
40386d7f5d3SJohn Marino			} else
40486d7f5d3SJohn Marino				printf("e\t%d of 10             \n", i);
40586d7f5d3SJohn Marino			printf("r\nkkey1\nr\nkkey2\n");
40686d7f5d3SJohn Marino		}
40786d7f5d3SJohn Marino	}' > $TMP1
40886d7f5d3SJohn Marino	$PROG btree $TMP1
40986d7f5d3SJohn Marino#	$PROG hash $TMP1
41086d7f5d3SJohn Marino	# No explicit test for success.
41186d7f5d3SJohn Marino}
41286d7f5d3SJohn Marino
41386d7f5d3SJohn Marino# Test btree duplicate keys
41486d7f5d3SJohn Marinotest9()
41586d7f5d3SJohn Marino{
41686d7f5d3SJohn Marino	echo "Test 9: btree: duplicate keys"
41786d7f5d3SJohn Marino	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
41886d7f5d3SJohn Marino	awk '{
41986d7f5d3SJohn Marino		for (i = 1; i <= 543; ++i)
42086d7f5d3SJohn Marino			printf("%05d: input key %d: %s\n", i, i, $0);
42186d7f5d3SJohn Marino		exit;
42286d7f5d3SJohn Marino	}' > $TMP1
42386d7f5d3SJohn Marino	rm -f $TMP2 $TMP3
42486d7f5d3SJohn Marino
42586d7f5d3SJohn Marino	for type in btree; do
42686d7f5d3SJohn Marino		cat $TMP1 |
42786d7f5d3SJohn Marino		awk '{
42886d7f5d3SJohn Marino			if (i++ % 2)
42986d7f5d3SJohn Marino				printf("p\nkduplicatekey\nd%s\n", $0);
43086d7f5d3SJohn Marino			else
43186d7f5d3SJohn Marino				printf("p\nkunique%dkey\nd%s\n", i, $0);
43286d7f5d3SJohn Marino		}
43386d7f5d3SJohn Marino		END {
43486d7f5d3SJohn Marino				printf("o\n");
43586d7f5d3SJohn Marino		}' > $TMP2
43686d7f5d3SJohn Marino		$PROG -iflags=1 -o $TMP3 $type $TMP2
43786d7f5d3SJohn Marino		sort -o $TMP3 $TMP3
43886d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
43986d7f5d3SJohn Marino		else
44086d7f5d3SJohn Marino			echo "test9: type $type: failed"
44186d7f5d3SJohn Marino			exit 1
44286d7f5d3SJohn Marino		fi
44386d7f5d3SJohn Marino	done
44486d7f5d3SJohn Marino}
44586d7f5d3SJohn Marino
44686d7f5d3SJohn Marino# Test use of cursor flags without initialization
44786d7f5d3SJohn Marinotest10()
44886d7f5d3SJohn Marino{
44986d7f5d3SJohn Marino	echo "Test 10: btree, recno: test cursor flag use"
45086d7f5d3SJohn Marino	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
45186d7f5d3SJohn Marino	awk '{
45286d7f5d3SJohn Marino		for (i = 1; i <= 20; ++i)
45386d7f5d3SJohn Marino			printf("%05d: input key %d: %s\n", i, i, $0);
45486d7f5d3SJohn Marino		exit;
45586d7f5d3SJohn Marino	}' > $TMP1
45686d7f5d3SJohn Marino	rm -f $TMP2 $TMP3
45786d7f5d3SJohn Marino
45886d7f5d3SJohn Marino	# Test that R_CURSOR doesn't succeed before cursor initialized
45986d7f5d3SJohn Marino	for type in btree recno; do
46086d7f5d3SJohn Marino		cat $TMP1 |
46186d7f5d3SJohn Marino		awk '{
46286d7f5d3SJohn Marino			if (i == 10)
46386d7f5d3SJohn Marino				exit;
46486d7f5d3SJohn Marino			printf("p\nk%d\nd%s\n", ++i, $0);
46586d7f5d3SJohn Marino		}
46686d7f5d3SJohn Marino		END {
46786d7f5d3SJohn Marino			printf("fR_CURSOR\nr\n");
46886d7f5d3SJohn Marino			printf("eR_CURSOR SHOULD HAVE FAILED\n");
46986d7f5d3SJohn Marino		}' > $TMP2
47086d7f5d3SJohn Marino		$PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
47186d7f5d3SJohn Marino		if [ -s $TMP3 ] ; then
47286d7f5d3SJohn Marino			echo "Test 10: delete: R_CURSOR SHOULD HAVE FAILED"
47386d7f5d3SJohn Marino			exit 1
47486d7f5d3SJohn Marino		fi
47586d7f5d3SJohn Marino	done
47686d7f5d3SJohn Marino	for type in btree recno; do
47786d7f5d3SJohn Marino		cat $TMP1 |
47886d7f5d3SJohn Marino		awk '{
47986d7f5d3SJohn Marino			if (i == 10)
48086d7f5d3SJohn Marino				exit;
48186d7f5d3SJohn Marino			printf("p\nk%d\nd%s\n", ++i, $0);
48286d7f5d3SJohn Marino		}
48386d7f5d3SJohn Marino		END {
48486d7f5d3SJohn Marino			printf("fR_CURSOR\np\nk1\ndsome data\n");
48586d7f5d3SJohn Marino			printf("eR_CURSOR SHOULD HAVE FAILED\n");
48686d7f5d3SJohn Marino		}' > $TMP2
48786d7f5d3SJohn Marino		$PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
48886d7f5d3SJohn Marino		if [ -s $TMP3 ] ; then
48986d7f5d3SJohn Marino			echo "Test 10: put: R_CURSOR SHOULD HAVE FAILED"
49086d7f5d3SJohn Marino			exit 1
49186d7f5d3SJohn Marino		fi
49286d7f5d3SJohn Marino	done
49386d7f5d3SJohn Marino}
49486d7f5d3SJohn Marino
49586d7f5d3SJohn Marino# Test insert in reverse order.
49686d7f5d3SJohn Marinotest11()
49786d7f5d3SJohn Marino{
49886d7f5d3SJohn Marino	echo "Test 11: recno: reverse order insert"
49986d7f5d3SJohn Marino	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
50086d7f5d3SJohn Marino	awk '{
50186d7f5d3SJohn Marino		for (i = 1; i <= 779; ++i)
50286d7f5d3SJohn Marino			printf("%05d: input key %d: %s\n", i, i, $0);
50386d7f5d3SJohn Marino		exit;
50486d7f5d3SJohn Marino	}' > $TMP1
50586d7f5d3SJohn Marino	rm -f $TMP2 $TMP3
50686d7f5d3SJohn Marino
50786d7f5d3SJohn Marino	for type in recno; do
50886d7f5d3SJohn Marino		cat $TMP1 |
50986d7f5d3SJohn Marino		awk '{
51086d7f5d3SJohn Marino			if (i == 0) {
51186d7f5d3SJohn Marino				i = 1;
51286d7f5d3SJohn Marino				printf("p\nk1\nd%s\n", $0);
51386d7f5d3SJohn Marino				printf("%s\n", "fR_IBEFORE");
51486d7f5d3SJohn Marino			} else
51586d7f5d3SJohn Marino				printf("p\nk1\nd%s\n", $0);
51686d7f5d3SJohn Marino		}
51786d7f5d3SJohn Marino		END {
51886d7f5d3SJohn Marino				printf("or\n");
51986d7f5d3SJohn Marino		}' > $TMP2
52086d7f5d3SJohn Marino		$PROG -o $TMP3 $type $TMP2
52186d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
52286d7f5d3SJohn Marino		else
52386d7f5d3SJohn Marino			echo "test11: type $type: failed"
52486d7f5d3SJohn Marino			exit 1
52586d7f5d3SJohn Marino		fi
52686d7f5d3SJohn Marino	done
52786d7f5d3SJohn Marino}
52886d7f5d3SJohn Marino
52986d7f5d3SJohn Marino# Take the first 20000 entries in the dictionary, reverse them, and give
53086d7f5d3SJohn Marino# them each a small size data entry.  Use a small page size to make sure
53186d7f5d3SJohn Marino# the btree split code gets hammered.
53286d7f5d3SJohn Marinotest12()
53386d7f5d3SJohn Marino{
53486d7f5d3SJohn Marino	echo "Test 12: btree: lots of keys, small page size"
53586d7f5d3SJohn Marino	mdata=abcdefghijklmnopqrstuvwxy
53686d7f5d3SJohn Marino	echo $mdata |
53786d7f5d3SJohn Marino	awk '{ for (i = 1; i < 20001; ++i) print $0 }' > $TMP1
53886d7f5d3SJohn Marino	for type in btree; do
53986d7f5d3SJohn Marino		rm -f $TMP2 $TMP3
54086d7f5d3SJohn Marino		for i in `sed 20000q $DICT | rev`; do
54186d7f5d3SJohn Marino			echo p
54286d7f5d3SJohn Marino			echo k$i
54386d7f5d3SJohn Marino			echo d$mdata
54486d7f5d3SJohn Marino			echo g
54586d7f5d3SJohn Marino			echo k$i
54686d7f5d3SJohn Marino		done > $TMP2
54786d7f5d3SJohn Marino		$PROG -i psize=512 -o $TMP3 $type $TMP2
54886d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
54986d7f5d3SJohn Marino		else
55086d7f5d3SJohn Marino			echo "test12: type $type: failed"
55186d7f5d3SJohn Marino			exit 1
55286d7f5d3SJohn Marino		fi
55386d7f5d3SJohn Marino	done
55486d7f5d3SJohn Marino}
55586d7f5d3SJohn Marino
55686d7f5d3SJohn Marino# Test different byte orders.
55786d7f5d3SJohn Marinotest13()
55886d7f5d3SJohn Marino{
55986d7f5d3SJohn Marino	echo "Test 13: btree, hash: differing byte orders"
56086d7f5d3SJohn Marino	sed 50q $DICT > $TMP1
56186d7f5d3SJohn Marino	for order in 1234 4321; do
56286d7f5d3SJohn Marino		for type in btree hash; do
56386d7f5d3SJohn Marino			rm -f byte.file $TMP2 $TMP3
56486d7f5d3SJohn Marino			for i in `sed 50q $DICT`; do
56586d7f5d3SJohn Marino				echo p
56686d7f5d3SJohn Marino				echo k$i
56786d7f5d3SJohn Marino				echo d$i
56886d7f5d3SJohn Marino				echo g
56986d7f5d3SJohn Marino				echo k$i
57086d7f5d3SJohn Marino			done > $TMP2
57186d7f5d3SJohn Marino			$PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
57286d7f5d3SJohn Marino			if (cmp -s $TMP1 $TMP3) ; then :
57386d7f5d3SJohn Marino			else
57486d7f5d3SJohn Marino				echo "test13: $type/$order put failed"
57586d7f5d3SJohn Marino				exit 1
57686d7f5d3SJohn Marino			fi
57786d7f5d3SJohn Marino			for i in `sed 50q $DICT`; do
57886d7f5d3SJohn Marino				echo g
57986d7f5d3SJohn Marino				echo k$i
58086d7f5d3SJohn Marino			done > $TMP2
58186d7f5d3SJohn Marino			$PROG -s \
58286d7f5d3SJohn Marino			    -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
58386d7f5d3SJohn Marino			if (cmp -s $TMP1 $TMP3) ; then :
58486d7f5d3SJohn Marino			else
58586d7f5d3SJohn Marino				echo "test13: $type/$order get failed"
58686d7f5d3SJohn Marino				exit 1
58786d7f5d3SJohn Marino			fi
58886d7f5d3SJohn Marino		done
58986d7f5d3SJohn Marino	done
59086d7f5d3SJohn Marino	rm -f byte.file
59186d7f5d3SJohn Marino}
59286d7f5d3SJohn Marino
59386d7f5d3SJohn Marino# Try a variety of bucketsizes and fill factors for hashing
59486d7f5d3SJohn Marinotest20()
59586d7f5d3SJohn Marino{
59686d7f5d3SJohn Marino	echo\
59786d7f5d3SJohn Marino    "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536"
59886d7f5d3SJohn Marino	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
59986d7f5d3SJohn Marino	awk '{
60086d7f5d3SJohn Marino		for (i = 1; i <= 10000; ++i) {
60186d7f5d3SJohn Marino			if (i % 34)
60286d7f5d3SJohn Marino				s = substr($0, 1, i % 34);
60386d7f5d3SJohn Marino			else
60486d7f5d3SJohn Marino				s = substr($0, 1);
60586d7f5d3SJohn Marino			printf("%s\n", s);
60686d7f5d3SJohn Marino		}
60786d7f5d3SJohn Marino		exit;
60886d7f5d3SJohn Marino	}' > $TMP1
60986d7f5d3SJohn Marino	sed 10000q $DICT |
61086d7f5d3SJohn Marino	awk 'BEGIN {
61186d7f5d3SJohn Marino		ds="abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"
61286d7f5d3SJohn Marino	}
61386d7f5d3SJohn Marino	{
61486d7f5d3SJohn Marino		if (++i % 34)
61586d7f5d3SJohn Marino			s = substr(ds, 1, i % 34);
61686d7f5d3SJohn Marino		else
61786d7f5d3SJohn Marino			s = substr(ds, 1);
61886d7f5d3SJohn Marino		printf("p\nk%s\nd%s\n", $0, s);
61986d7f5d3SJohn Marino	}' > $TMP2
62086d7f5d3SJohn Marino	sed 10000q $DICT |
62186d7f5d3SJohn Marino	awk '{
62286d7f5d3SJohn Marino		++i;
62386d7f5d3SJohn Marino		printf("g\nk%s\n", $0);
62486d7f5d3SJohn Marino	}' >> $TMP2
62586d7f5d3SJohn Marino	bsize=256
62686d7f5d3SJohn Marino	for ffactor in 11 14 21; do
62786d7f5d3SJohn Marino		echo "    bucketsize $bsize, fill factor $ffactor"
62886d7f5d3SJohn Marino		$PROG -o$TMP3 \
62986d7f5d3SJohn Marino		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
63086d7f5d3SJohn Marino		    hash $TMP2
63186d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
63286d7f5d3SJohn Marino		else
63386d7f5d3SJohn Marino			echo "test20: type hash:\
63486d7f5d3SJohn Marinobsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
63586d7f5d3SJohn Marino			exit 1
63686d7f5d3SJohn Marino		fi
63786d7f5d3SJohn Marino	done
63886d7f5d3SJohn Marino	bsize=512
63986d7f5d3SJohn Marino	for ffactor in 21 28 43; do
64086d7f5d3SJohn Marino		echo "    bucketsize $bsize, fill factor $ffactor"
64186d7f5d3SJohn Marino		$PROG -o$TMP3 \
64286d7f5d3SJohn Marino		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
64386d7f5d3SJohn Marino		    hash $TMP2
64486d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
64586d7f5d3SJohn Marino		else
64686d7f5d3SJohn Marino			echo "test20: type hash:\
64786d7f5d3SJohn Marinobsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
64886d7f5d3SJohn Marino			exit 1
64986d7f5d3SJohn Marino		fi
65086d7f5d3SJohn Marino	done
65186d7f5d3SJohn Marino	bsize=1024
65286d7f5d3SJohn Marino	for ffactor in 43 57 85; do
65386d7f5d3SJohn Marino		echo "    bucketsize $bsize, fill factor $ffactor"
65486d7f5d3SJohn Marino		$PROG -o$TMP3 \
65586d7f5d3SJohn Marino		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
65686d7f5d3SJohn Marino		    hash $TMP2
65786d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
65886d7f5d3SJohn Marino		else
65986d7f5d3SJohn Marino			echo "test20: type hash:\
66086d7f5d3SJohn Marinobsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
66186d7f5d3SJohn Marino			exit 1
66286d7f5d3SJohn Marino		fi
66386d7f5d3SJohn Marino	done
66486d7f5d3SJohn Marino	bsize=2048
66586d7f5d3SJohn Marino	for ffactor in 85 114 171; do
66686d7f5d3SJohn Marino		echo "    bucketsize $bsize, fill factor $ffactor"
66786d7f5d3SJohn Marino		$PROG -o$TMP3 \
66886d7f5d3SJohn Marino		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
66986d7f5d3SJohn Marino		    hash $TMP2
67086d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
67186d7f5d3SJohn Marino		else
67286d7f5d3SJohn Marino			echo "test20: type hash:\
67386d7f5d3SJohn Marinobsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
67486d7f5d3SJohn Marino			exit 1
67586d7f5d3SJohn Marino		fi
67686d7f5d3SJohn Marino	done
67786d7f5d3SJohn Marino	bsize=4096
67886d7f5d3SJohn Marino	for ffactor in 171 228 341; do
67986d7f5d3SJohn Marino		echo "    bucketsize $bsize, fill factor $ffactor"
68086d7f5d3SJohn Marino		$PROG -o$TMP3 \
68186d7f5d3SJohn Marino		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
68286d7f5d3SJohn Marino		    hash $TMP2
68386d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
68486d7f5d3SJohn Marino		else
68586d7f5d3SJohn Marino			echo "test20: type hash:\
68686d7f5d3SJohn Marinobsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
68786d7f5d3SJohn Marino			exit 1
68886d7f5d3SJohn Marino		fi
68986d7f5d3SJohn Marino	done
69086d7f5d3SJohn Marino	bsize=8192
69186d7f5d3SJohn Marino	for ffactor in 341 455 683; do
69286d7f5d3SJohn Marino		echo "    bucketsize $bsize, fill factor $ffactor"
69386d7f5d3SJohn Marino		$PROG -o$TMP3 \
69486d7f5d3SJohn Marino		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
69586d7f5d3SJohn Marino		    hash $TMP2
69686d7f5d3SJohn Marino		if (cmp -s $TMP1 $TMP3) ; then :
69786d7f5d3SJohn Marino		else
69886d7f5d3SJohn Marino			echo "test20: type hash:\
69986d7f5d3SJohn Marinobsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
70086d7f5d3SJohn Marino			exit 1
70186d7f5d3SJohn Marino		fi
70286d7f5d3SJohn Marino	done
70386d7f5d3SJohn Marino}
70486d7f5d3SJohn Marino
70586d7f5d3SJohn Marinomain $*
706