xref: /freebsd/lib/libc/db/test/run.test (revision dc36d6f9bb1753f3808552f3afd30eda9a7b206a)
158f0484fSRodney W. Grimes#!/bin/sh -
258f0484fSRodney W. Grimes
358f0484fSRodney W. Grimes# db regression tests
458f0484fSRodney W. Grimesmain()
558f0484fSRodney W. Grimes{
658f0484fSRodney W. Grimes
758f0484fSRodney W. Grimes	PROG=./dbtest
858f0484fSRodney W. Grimes	TMP1=t1
958f0484fSRodney W. Grimes	TMP2=t2
1058f0484fSRodney W. Grimes	TMP3=t3
1158f0484fSRodney W. Grimes
12ef5d438eSPaul Traina	if [ -f /usr/share/dict/words ]; then
13ef5d438eSPaul Traina		DICT=/usr/share/dict/words
14ef5d438eSPaul Traina	elif [ -f /usr/dict/words ]; then
15ef5d438eSPaul Traina		DICT=/usr/dict/words
16ef5d438eSPaul Traina	else
17ef5d438eSPaul Traina		echo 'run.test: no dictionary'
18ef5d438eSPaul Traina		exit 1
19ef5d438eSPaul Traina	fi
20ef5d438eSPaul Traina
2158f0484fSRodney W. Grimes	if [ $# -eq 0 ]; then
2258f0484fSRodney W. Grimes		for t in 1 2 3 4 5 6 7 8 9 10 11 12 13 20; do
2358f0484fSRodney W. Grimes			test$t
2458f0484fSRodney W. Grimes		done
2558f0484fSRodney W. Grimes	else
2658f0484fSRodney W. Grimes		while [ $# -gt 0 ]
2758f0484fSRodney W. Grimes			do case "$1" in
2858f0484fSRodney W. Grimes			test*)
2958f0484fSRodney W. Grimes				$1;;
3058f0484fSRodney W. Grimes			[0-9]*)
3158f0484fSRodney W. Grimes				test$1;;
3258f0484fSRodney W. Grimes			btree)
3358f0484fSRodney W. Grimes				for t in 1 2 3 7 8 9 10 12 13; do
3458f0484fSRodney W. Grimes					test$t
3558f0484fSRodney W. Grimes				done;;
3658f0484fSRodney W. Grimes			hash)
3758f0484fSRodney W. Grimes				for t in 1 2 3 8 13 20; do
3858f0484fSRodney W. Grimes					test$t
3958f0484fSRodney W. Grimes				done;;
4058f0484fSRodney W. Grimes			recno)
4158f0484fSRodney W. Grimes				for t in 1 2 3 4 5 6 7 10 11; do
4258f0484fSRodney W. Grimes					test$t
4358f0484fSRodney W. Grimes				done;;
4458f0484fSRodney W. Grimes			*)
4558f0484fSRodney W. Grimes				echo "run.test: unknown test $1"
4658f0484fSRodney W. Grimes				echo "usage: run.test test# | type"
4758f0484fSRodney W. Grimes				exit 1
4858f0484fSRodney W. Grimes			esac
4958f0484fSRodney W. Grimes			shift
5058f0484fSRodney W. Grimes		done
5158f0484fSRodney W. Grimes	fi
5258f0484fSRodney W. Grimes	rm -f $TMP1 $TMP2 $TMP3
5358f0484fSRodney W. Grimes	exit 0
5458f0484fSRodney W. Grimes}
5558f0484fSRodney W. Grimes
5658f0484fSRodney W. Grimes# Take the first hundred entries in the dictionary, and make them
5758f0484fSRodney W. Grimes# be key/data pairs.
5858f0484fSRodney W. Grimestest1()
5958f0484fSRodney W. Grimes{
6058f0484fSRodney W. Grimes	echo "Test 1: btree, hash: small key, small data pairs"
6158f0484fSRodney W. Grimes	sed 200q $DICT > $TMP1
6258f0484fSRodney W. Grimes	for type in btree hash; do
6358f0484fSRodney W. Grimes		rm -f $TMP2 $TMP3
6458f0484fSRodney W. Grimes		for i in `sed 200q $DICT`; do
6558f0484fSRodney W. Grimes			echo p
6658f0484fSRodney W. Grimes			echo k$i
6758f0484fSRodney W. Grimes			echo d$i
6858f0484fSRodney W. Grimes			echo g
6958f0484fSRodney W. Grimes			echo k$i
7058f0484fSRodney W. Grimes		done > $TMP2
7158f0484fSRodney W. Grimes		$PROG -o $TMP3 $type $TMP2
7258f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
7358f0484fSRodney W. Grimes		else
7458f0484fSRodney W. Grimes			echo "test1: type $type: failed"
7558f0484fSRodney W. Grimes			exit 1
7658f0484fSRodney W. Grimes		fi
7758f0484fSRodney W. Grimes	done
7858f0484fSRodney W. Grimes	echo "Test 1: recno: small key, small data pairs"
7958f0484fSRodney W. Grimes	rm -f $TMP2 $TMP3
8058f0484fSRodney W. Grimes	sed 200q $DICT |
8158f0484fSRodney W. Grimes	awk '{
8258f0484fSRodney W. Grimes		++i;
8358f0484fSRodney W. Grimes		printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
8458f0484fSRodney W. Grimes	}' > $TMP2
8558f0484fSRodney W. Grimes	$PROG -o $TMP3 recno $TMP2
8658f0484fSRodney W. Grimes	if (cmp -s $TMP1 $TMP3) ; then :
8758f0484fSRodney W. Grimes	else
8858f0484fSRodney W. Grimes		echo "test1: type recno: failed"
8958f0484fSRodney W. Grimes		exit 1
9058f0484fSRodney W. Grimes	fi
9158f0484fSRodney W. Grimes}
9258f0484fSRodney W. Grimes
9358f0484fSRodney W. Grimes# Take the first 200 entries in the dictionary, and give them
9458f0484fSRodney W. Grimes# each a medium size data entry.
9558f0484fSRodney W. Grimestest2()
9658f0484fSRodney W. Grimes{
9758f0484fSRodney W. Grimes	echo "Test 2: btree, hash: small key, medium data pairs"
9858f0484fSRodney W. Grimes	mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
9958f0484fSRodney W. Grimes	echo $mdata |
10058f0484fSRodney W. Grimes	awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1
10158f0484fSRodney W. Grimes	for type in hash btree; do
10258f0484fSRodney W. Grimes		rm -f $TMP2 $TMP3
10358f0484fSRodney W. Grimes		for i in `sed 200q $DICT`; do
10458f0484fSRodney W. Grimes			echo p
10558f0484fSRodney W. Grimes			echo k$i
10658f0484fSRodney W. Grimes			echo d$mdata
10758f0484fSRodney W. Grimes			echo g
10858f0484fSRodney W. Grimes			echo k$i
10958f0484fSRodney W. Grimes		done > $TMP2
11058f0484fSRodney W. Grimes		$PROG -o $TMP3 $type $TMP2
11158f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
11258f0484fSRodney W. Grimes		else
11358f0484fSRodney W. Grimes			echo "test2: type $type: failed"
11458f0484fSRodney W. Grimes			exit 1
11558f0484fSRodney W. Grimes		fi
11658f0484fSRodney W. Grimes	done
11758f0484fSRodney W. Grimes	echo "Test 2: recno: small key, medium data pairs"
11858f0484fSRodney W. Grimes	rm -f $TMP2 $TMP3
11958f0484fSRodney W. Grimes	echo $mdata |
12058f0484fSRodney W. Grimes	awk '{  for (i = 1; i < 201; ++i)
12158f0484fSRodney W. Grimes		printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
12258f0484fSRodney W. Grimes	}' > $TMP2
12358f0484fSRodney W. Grimes	$PROG -o $TMP3 recno $TMP2
12458f0484fSRodney W. Grimes	if (cmp -s $TMP1 $TMP3) ; then :
12558f0484fSRodney W. Grimes	else
12658f0484fSRodney W. Grimes		echo "test2: type recno: failed"
12758f0484fSRodney W. Grimes		exit 1
12858f0484fSRodney W. Grimes	fi
12958f0484fSRodney W. Grimes}
13058f0484fSRodney W. Grimes
13158f0484fSRodney W. Grimes# Insert the programs in /bin with their paths as their keys.
13258f0484fSRodney W. Grimestest3()
13358f0484fSRodney W. Grimes{
13458f0484fSRodney W. Grimes	echo "Test 3: hash: small key, big data pairs"
13558f0484fSRodney W. Grimes	rm -f $TMP1
13658f0484fSRodney W. Grimes	(find /bin -type f -print | xargs cat) > $TMP1
13758f0484fSRodney W. Grimes	for type in hash; do
13858f0484fSRodney W. Grimes		rm -f $TMP2 $TMP3
13958f0484fSRodney W. Grimes		for i in `find /bin -type f -print`; do
14058f0484fSRodney W. Grimes			echo p
14158f0484fSRodney W. Grimes			echo k$i
14258f0484fSRodney W. Grimes			echo D$i
14358f0484fSRodney W. Grimes			echo g
14458f0484fSRodney W. Grimes			echo k$i
14558f0484fSRodney W. Grimes		done > $TMP2
14658f0484fSRodney W. Grimes		$PROG -o $TMP3 $type $TMP2
14758f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
14858f0484fSRodney W. Grimes		else
14958f0484fSRodney W. Grimes			echo "test3: $type: failed"
15058f0484fSRodney W. Grimes			exit 1
15158f0484fSRodney W. Grimes		fi
15258f0484fSRodney W. Grimes	done
15358f0484fSRodney W. Grimes	echo "Test 3: btree: small key, big data pairs"
15458f0484fSRodney W. Grimes	for psize in 512 16384 65536; do
15558f0484fSRodney W. Grimes		echo "    page size $psize"
15658f0484fSRodney W. Grimes		for type in btree; do
15758f0484fSRodney W. Grimes			rm -f $TMP2 $TMP3
15858f0484fSRodney W. Grimes			for i in `find /bin -type f -print`; do
15958f0484fSRodney W. Grimes				echo p
16058f0484fSRodney W. Grimes				echo k$i
16158f0484fSRodney W. Grimes				echo D$i
16258f0484fSRodney W. Grimes				echo g
16358f0484fSRodney W. Grimes				echo k$i
16458f0484fSRodney W. Grimes			done > $TMP2
16558f0484fSRodney W. Grimes			$PROG -i psize=$psize -o $TMP3 $type $TMP2
16658f0484fSRodney W. Grimes			if (cmp -s $TMP1 $TMP3) ; then :
16758f0484fSRodney W. Grimes			else
16858f0484fSRodney W. Grimes				echo "test3: $type: page size $psize: failed"
16958f0484fSRodney W. Grimes				exit 1
17058f0484fSRodney W. Grimes			fi
17158f0484fSRodney W. Grimes		done
17258f0484fSRodney W. Grimes	done
17358f0484fSRodney W. Grimes	echo "Test 3: recno: big data pairs"
17458f0484fSRodney W. Grimes	rm -f $TMP2 $TMP3
17558f0484fSRodney W. Grimes	find /bin -type f -print |
17658f0484fSRodney W. Grimes	awk '{
17758f0484fSRodney W. Grimes		++i;
17858f0484fSRodney W. Grimes		printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
17958f0484fSRodney W. Grimes	}' > $TMP2
18058f0484fSRodney W. Grimes	for psize in 512 16384 65536; do
18158f0484fSRodney W. Grimes		echo "    page size $psize"
18258f0484fSRodney W. Grimes		$PROG -i psize=$psize -o $TMP3 recno $TMP2
18358f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
18458f0484fSRodney W. Grimes		else
18558f0484fSRodney W. Grimes			echo "test3: recno: page size $psize: failed"
18658f0484fSRodney W. Grimes			exit 1
18758f0484fSRodney W. Grimes		fi
18858f0484fSRodney W. Grimes	done
18958f0484fSRodney W. Grimes}
19058f0484fSRodney W. Grimes
19158f0484fSRodney W. Grimes# Do random recno entries.
19258f0484fSRodney W. Grimestest4()
19358f0484fSRodney W. Grimes{
19458f0484fSRodney W. Grimes	echo "Test 4: recno: random entries"
19558f0484fSRodney W. Grimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
19658f0484fSRodney W. Grimes	awk '{
19758f0484fSRodney W. Grimes		for (i = 37; i <= 37 + 88 * 17; i += 17) {
19858f0484fSRodney W. Grimes			if (i % 41)
19958f0484fSRodney W. Grimes				s = substr($0, 1, i % 41);
20058f0484fSRodney W. Grimes			else
20158f0484fSRodney W. Grimes				s = substr($0, 1);
20258f0484fSRodney W. Grimes			printf("input key %d: %s\n", i, s);
20358f0484fSRodney W. Grimes		}
20458f0484fSRodney W. Grimes		for (i = 1; i <= 15; ++i) {
20558f0484fSRodney W. Grimes			if (i % 41)
20658f0484fSRodney W. Grimes				s = substr($0, 1, i % 41);
20758f0484fSRodney W. Grimes			else
20858f0484fSRodney W. Grimes				s = substr($0, 1);
20958f0484fSRodney W. Grimes			printf("input key %d: %s\n", i, s);
21058f0484fSRodney W. Grimes		}
21158f0484fSRodney W. Grimes		for (i = 19234; i <= 19234 + 61 * 27; i += 27) {
21258f0484fSRodney W. Grimes			if (i % 41)
21358f0484fSRodney W. Grimes				s = substr($0, 1, i % 41);
21458f0484fSRodney W. Grimes			else
21558f0484fSRodney W. Grimes				s = substr($0, 1);
21658f0484fSRodney W. Grimes			printf("input key %d: %s\n", i, s);
21758f0484fSRodney W. Grimes		}
21858f0484fSRodney W. Grimes		exit
21958f0484fSRodney W. Grimes	}' > $TMP1
22058f0484fSRodney W. Grimes	rm -f $TMP2 $TMP3
22158f0484fSRodney W. Grimes	cat $TMP1 |
22258f0484fSRodney W. Grimes	awk 'BEGIN {
22358f0484fSRodney W. Grimes			i = 37;
22458f0484fSRodney W. Grimes			incr = 17;
22558f0484fSRodney W. Grimes		}
22658f0484fSRodney W. Grimes		{
22758f0484fSRodney W. Grimes			printf("p\nk%d\nd%s\n", i, $0);
22858f0484fSRodney W. Grimes			if (i == 19234 + 61 * 27)
22958f0484fSRodney W. Grimes				exit;
23058f0484fSRodney W. Grimes			if (i == 37 + 88 * 17) {
23158f0484fSRodney W. Grimes				i = 1;
23258f0484fSRodney W. Grimes				incr = 1;
23358f0484fSRodney W. Grimes			} else if (i == 15) {
23458f0484fSRodney W. Grimes				i = 19234;
23558f0484fSRodney W. Grimes				incr = 27;
23658f0484fSRodney W. Grimes			} else
23758f0484fSRodney W. Grimes				i += incr;
23858f0484fSRodney W. Grimes		}
23958f0484fSRodney W. Grimes		END {
24058f0484fSRodney W. Grimes			for (i = 37; i <= 37 + 88 * 17; i += 17)
24158f0484fSRodney W. Grimes				printf("g\nk%d\n", i);
24258f0484fSRodney W. Grimes			for (i = 1; i <= 15; ++i)
24358f0484fSRodney W. Grimes				printf("g\nk%d\n", i);
24458f0484fSRodney W. Grimes			for (i = 19234; i <= 19234 + 61 * 27; i += 27)
24558f0484fSRodney W. Grimes				printf("g\nk%d\n", i);
24658f0484fSRodney W. Grimes		}' > $TMP2
24758f0484fSRodney W. Grimes	$PROG -o $TMP3 recno $TMP2
24858f0484fSRodney W. Grimes	if (cmp -s $TMP1 $TMP3) ; then :
24958f0484fSRodney W. Grimes	else
25058f0484fSRodney W. Grimes		echo "test4: type recno: failed"
25158f0484fSRodney W. Grimes		exit 1
25258f0484fSRodney W. Grimes	fi
25358f0484fSRodney W. Grimes}
25458f0484fSRodney W. Grimes
25558f0484fSRodney W. Grimes# Do reverse order recno entries.
25658f0484fSRodney W. Grimestest5()
25758f0484fSRodney W. Grimes{
25858f0484fSRodney W. Grimes	echo "Test 5: recno: reverse order entries"
25958f0484fSRodney W. Grimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
26058f0484fSRodney W. Grimes	awk ' {
26158f0484fSRodney W. Grimes		for (i = 1500; i; --i) {
26258f0484fSRodney W. Grimes			if (i % 34)
26358f0484fSRodney W. Grimes				s = substr($0, 1, i % 34);
26458f0484fSRodney W. Grimes			else
26558f0484fSRodney W. Grimes				s = substr($0, 1);
26658f0484fSRodney W. Grimes			printf("input key %d: %s\n", i, s);
26758f0484fSRodney W. Grimes		}
26858f0484fSRodney W. Grimes		exit;
26958f0484fSRodney W. Grimes	}' > $TMP1
27058f0484fSRodney W. Grimes	rm -f $TMP2 $TMP3
27158f0484fSRodney W. Grimes	cat $TMP1 |
27258f0484fSRodney W. Grimes	awk 'BEGIN {
27358f0484fSRodney W. Grimes			i = 1500;
27458f0484fSRodney W. Grimes		}
27558f0484fSRodney W. Grimes		{
27658f0484fSRodney W. Grimes			printf("p\nk%d\nd%s\n", i, $0);
27758f0484fSRodney W. Grimes			--i;
27858f0484fSRodney W. Grimes		}
27958f0484fSRodney W. Grimes		END {
28058f0484fSRodney W. Grimes			for (i = 1500; i; --i)
28158f0484fSRodney W. Grimes				printf("g\nk%d\n", i);
28258f0484fSRodney W. Grimes		}' > $TMP2
28358f0484fSRodney W. Grimes	$PROG -o $TMP3 recno $TMP2
28458f0484fSRodney W. Grimes	if (cmp -s $TMP1 $TMP3) ; then :
28558f0484fSRodney W. Grimes	else
28658f0484fSRodney W. Grimes		echo "test5: type recno: failed"
28758f0484fSRodney W. Grimes		exit 1
28858f0484fSRodney W. Grimes	fi
28958f0484fSRodney W. Grimes}
29058f0484fSRodney W. Grimes
29158f0484fSRodney W. Grimes# Do alternating order recno entries.
29258f0484fSRodney W. Grimestest6()
29358f0484fSRodney W. Grimes{
29458f0484fSRodney W. Grimes	echo "Test 6: recno: alternating order entries"
29558f0484fSRodney W. Grimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
29658f0484fSRodney W. Grimes	awk ' {
29758f0484fSRodney W. Grimes		for (i = 1; i < 1200; i += 2) {
29858f0484fSRodney W. Grimes			if (i % 34)
29958f0484fSRodney W. Grimes				s = substr($0, 1, i % 34);
30058f0484fSRodney W. Grimes			else
30158f0484fSRodney W. Grimes				s = substr($0, 1);
30258f0484fSRodney W. Grimes			printf("input key %d: %s\n", i, s);
30358f0484fSRodney W. Grimes		}
30458f0484fSRodney W. Grimes		for (i = 2; i < 1200; i += 2) {
30558f0484fSRodney W. Grimes			if (i % 34)
30658f0484fSRodney W. Grimes				s = substr($0, 1, i % 34);
30758f0484fSRodney W. Grimes			else
30858f0484fSRodney W. Grimes				s = substr($0, 1);
30958f0484fSRodney W. Grimes			printf("input key %d: %s\n", i, s);
31058f0484fSRodney W. Grimes		}
31158f0484fSRodney W. Grimes		exit;
31258f0484fSRodney W. Grimes	}' > $TMP1
31358f0484fSRodney W. Grimes	rm -f $TMP2 $TMP3
31458f0484fSRodney W. Grimes	cat $TMP1 |
31558f0484fSRodney W. Grimes	awk 'BEGIN {
31658f0484fSRodney W. Grimes			i = 1;
31758f0484fSRodney W. Grimes			even = 0;
31858f0484fSRodney W. Grimes		}
31958f0484fSRodney W. Grimes		{
32058f0484fSRodney W. Grimes			printf("p\nk%d\nd%s\n", i, $0);
32158f0484fSRodney W. Grimes			i += 2;
32258f0484fSRodney W. Grimes			if (i >= 1200) {
32358f0484fSRodney W. Grimes				if (even == 1)
32458f0484fSRodney W. Grimes					exit;
32558f0484fSRodney W. Grimes				even = 1;
32658f0484fSRodney W. Grimes				i = 2;
32758f0484fSRodney W. Grimes			}
32858f0484fSRodney W. Grimes		}
32958f0484fSRodney W. Grimes		END {
33058f0484fSRodney W. Grimes			for (i = 1; i < 1200; ++i)
33158f0484fSRodney W. Grimes				printf("g\nk%d\n", i);
33258f0484fSRodney W. Grimes		}' > $TMP2
33358f0484fSRodney W. Grimes	$PROG -o $TMP3 recno $TMP2
33458f0484fSRodney W. Grimes	sort -o $TMP1 $TMP1
33558f0484fSRodney W. Grimes	sort -o $TMP3 $TMP3
33658f0484fSRodney W. Grimes	if (cmp -s $TMP1 $TMP3) ; then :
33758f0484fSRodney W. Grimes	else
33858f0484fSRodney W. Grimes		echo "test6: type recno: failed"
33958f0484fSRodney W. Grimes		exit 1
34058f0484fSRodney W. Grimes	fi
34158f0484fSRodney W. Grimes}
34258f0484fSRodney W. Grimes
34358f0484fSRodney W. Grimes# Delete cursor record
34458f0484fSRodney W. Grimestest7()
34558f0484fSRodney W. Grimes{
34658f0484fSRodney W. Grimes	echo "Test 7: btree, recno: delete cursor record"
34758f0484fSRodney W. Grimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
34858f0484fSRodney W. Grimes	awk '{
34958f0484fSRodney W. Grimes		for (i = 1; i <= 120; ++i)
35058f0484fSRodney W. Grimes			printf("%05d: input key %d: %s\n", i, i, $0);
35158f0484fSRodney W. Grimes		printf("%05d: input key %d: %s\n", 120, 120, $0);
352ef5d438eSPaul Traina		printf("seq failed, no such key\n");
35358f0484fSRodney W. Grimes		printf("%05d: input key %d: %s\n", 1, 1, $0);
35458f0484fSRodney W. Grimes		printf("%05d: input key %d: %s\n", 2, 2, $0);
35558f0484fSRodney W. Grimes		exit;
35658f0484fSRodney W. Grimes	}' > $TMP1
35758f0484fSRodney W. Grimes	rm -f $TMP2 $TMP3
35858f0484fSRodney W. Grimes
35958f0484fSRodney W. Grimes	for type in btree recno; do
36058f0484fSRodney W. Grimes		cat $TMP1 |
36158f0484fSRodney W. Grimes		awk '{
36258f0484fSRodney W. Grimes			if (i == 120)
36358f0484fSRodney W. Grimes				exit;
36458f0484fSRodney W. Grimes			printf("p\nk%d\nd%s\n", ++i, $0);
36558f0484fSRodney W. Grimes		}
36658f0484fSRodney W. Grimes		END {
36758f0484fSRodney W. Grimes			printf("fR_NEXT\n");
36858f0484fSRodney W. Grimes			for (i = 1; i <= 120; ++i)
36958f0484fSRodney W. Grimes				printf("s\n");
37058f0484fSRodney W. Grimes			printf("fR_CURSOR\ns\nk120\n");
371ef5d438eSPaul Traina			printf("r\n");
37258f0484fSRodney W. Grimes			printf("fR_NEXT\ns\n");
37358f0484fSRodney W. Grimes			printf("fR_CURSOR\ns\nk1\n");
374ef5d438eSPaul Traina			printf("r\n");
37558f0484fSRodney W. Grimes			printf("fR_FIRST\ns\n");
37658f0484fSRodney W. Grimes		}' > $TMP2
37758f0484fSRodney W. Grimes		$PROG -o $TMP3 recno $TMP2
37858f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
37958f0484fSRodney W. Grimes		else
38058f0484fSRodney W. Grimes			echo "test7: type $type: failed"
38158f0484fSRodney W. Grimes			exit 1
38258f0484fSRodney W. Grimes		fi
38358f0484fSRodney W. Grimes	done
38458f0484fSRodney W. Grimes}
38558f0484fSRodney W. Grimes
38658f0484fSRodney W. Grimes# Make sure that overflow pages are reused.
38758f0484fSRodney W. Grimestest8()
38858f0484fSRodney W. Grimes{
38958f0484fSRodney W. Grimes	echo "Test 8: btree, hash: repeated small key, big data pairs"
39058f0484fSRodney W. Grimes	rm -f $TMP1
39158f0484fSRodney W. Grimes	echo "" |
39258f0484fSRodney W. Grimes	awk 'BEGIN {
39358f0484fSRodney W. Grimes		for (i = 1; i <= 10; ++i) {
39458f0484fSRodney W. Grimes			printf("p\nkkey1\nD/bin/sh\n");
39558f0484fSRodney W. Grimes			printf("p\nkkey2\nD/bin/csh\n");
39658f0484fSRodney W. Grimes			if (i % 8 == 0) {
39758f0484fSRodney W. Grimes				printf("c\nkkey2\nD/bin/csh\n");
39858f0484fSRodney W. Grimes				printf("c\nkkey1\nD/bin/sh\n");
399ef5d438eSPaul Traina				printf("e\t%d of 10 (comparison)\n", i);
40058f0484fSRodney W. Grimes			} else
401ef5d438eSPaul Traina				printf("e\t%d of 10             \n", i);
40258f0484fSRodney W. Grimes			printf("r\nkkey1\nr\nkkey2\n");
40358f0484fSRodney W. Grimes		}
40458f0484fSRodney W. Grimes	}' > $TMP1
40558f0484fSRodney W. Grimes	$PROG btree $TMP1
40658f0484fSRodney W. Grimes#	$PROG hash $TMP1
40758f0484fSRodney W. Grimes	# No explicit test for success.
40858f0484fSRodney W. Grimes}
40958f0484fSRodney W. Grimes
41058f0484fSRodney W. Grimes# Test btree duplicate keys
41158f0484fSRodney W. Grimestest9()
41258f0484fSRodney W. Grimes{
41358f0484fSRodney W. Grimes	echo "Test 9: btree: duplicate keys"
41458f0484fSRodney W. Grimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
41558f0484fSRodney W. Grimes	awk '{
41658f0484fSRodney W. Grimes		for (i = 1; i <= 543; ++i)
41758f0484fSRodney W. Grimes			printf("%05d: input key %d: %s\n", i, i, $0);
41858f0484fSRodney W. Grimes		exit;
41958f0484fSRodney W. Grimes	}' > $TMP1
42058f0484fSRodney W. Grimes	rm -f $TMP2 $TMP3
42158f0484fSRodney W. Grimes
42258f0484fSRodney W. Grimes	for type in btree; do
42358f0484fSRodney W. Grimes		cat $TMP1 |
42458f0484fSRodney W. Grimes		awk '{
42558f0484fSRodney W. Grimes			if (i++ % 2)
42658f0484fSRodney W. Grimes				printf("p\nkduplicatekey\nd%s\n", $0);
42758f0484fSRodney W. Grimes			else
42858f0484fSRodney W. Grimes				printf("p\nkunique%dkey\nd%s\n", i, $0);
42958f0484fSRodney W. Grimes		}
43058f0484fSRodney W. Grimes		END {
43158f0484fSRodney W. Grimes				printf("o\n");
43258f0484fSRodney W. Grimes		}' > $TMP2
43358f0484fSRodney W. Grimes		$PROG -iflags=1 -o $TMP3 $type $TMP2
43458f0484fSRodney W. Grimes		sort -o $TMP3 $TMP3
43558f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
43658f0484fSRodney W. Grimes		else
43758f0484fSRodney W. Grimes			echo "test9: type $type: failed"
43858f0484fSRodney W. Grimes			exit 1
43958f0484fSRodney W. Grimes		fi
44058f0484fSRodney W. Grimes	done
44158f0484fSRodney W. Grimes}
44258f0484fSRodney W. Grimes
44358f0484fSRodney W. Grimes# Test use of cursor flags without initialization
44458f0484fSRodney W. Grimestest10()
44558f0484fSRodney W. Grimes{
44658f0484fSRodney W. Grimes	echo "Test 10: btree, recno: test cursor flag use"
44758f0484fSRodney W. Grimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
44858f0484fSRodney W. Grimes	awk '{
44958f0484fSRodney W. Grimes		for (i = 1; i <= 20; ++i)
45058f0484fSRodney W. Grimes			printf("%05d: input key %d: %s\n", i, i, $0);
45158f0484fSRodney W. Grimes		exit;
45258f0484fSRodney W. Grimes	}' > $TMP1
45358f0484fSRodney W. Grimes	rm -f $TMP2 $TMP3
45458f0484fSRodney W. Grimes
45558f0484fSRodney W. Grimes	# Test that R_CURSOR doesn't succeed before cursor initialized
45658f0484fSRodney W. Grimes	for type in btree recno; do
45758f0484fSRodney W. Grimes		cat $TMP1 |
45858f0484fSRodney W. Grimes		awk '{
45958f0484fSRodney W. Grimes			if (i == 10)
46058f0484fSRodney W. Grimes				exit;
46158f0484fSRodney W. Grimes			printf("p\nk%d\nd%s\n", ++i, $0);
46258f0484fSRodney W. Grimes		}
46358f0484fSRodney W. Grimes		END {
464ef5d438eSPaul Traina			printf("fR_CURSOR\nr\n");
46558f0484fSRodney W. Grimes			printf("eR_CURSOR SHOULD HAVE FAILED\n");
46658f0484fSRodney W. Grimes		}' > $TMP2
46758f0484fSRodney W. Grimes		$PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
46858f0484fSRodney W. Grimes		if [ -s $TMP3 ] ; then
46958f0484fSRodney W. Grimes			echo "Test 10: delete: R_CURSOR SHOULD HAVE FAILED"
47058f0484fSRodney W. Grimes			exit 1
47158f0484fSRodney W. Grimes		fi
47258f0484fSRodney W. Grimes	done
47358f0484fSRodney W. Grimes	for type in btree recno; do
47458f0484fSRodney W. Grimes		cat $TMP1 |
47558f0484fSRodney W. Grimes		awk '{
47658f0484fSRodney W. Grimes			if (i == 10)
47758f0484fSRodney W. Grimes				exit;
47858f0484fSRodney W. Grimes			printf("p\nk%d\nd%s\n", ++i, $0);
47958f0484fSRodney W. Grimes		}
48058f0484fSRodney W. Grimes		END {
48158f0484fSRodney W. Grimes			printf("fR_CURSOR\np\nk1\ndsome data\n");
48258f0484fSRodney W. Grimes			printf("eR_CURSOR SHOULD HAVE FAILED\n");
48358f0484fSRodney W. Grimes		}' > $TMP2
48458f0484fSRodney W. Grimes		$PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
48558f0484fSRodney W. Grimes		if [ -s $TMP3 ] ; then
48658f0484fSRodney W. Grimes			echo "Test 10: put: R_CURSOR SHOULD HAVE FAILED"
48758f0484fSRodney W. Grimes			exit 1
48858f0484fSRodney W. Grimes		fi
48958f0484fSRodney W. Grimes	done
49058f0484fSRodney W. Grimes}
49158f0484fSRodney W. Grimes
49258f0484fSRodney W. Grimes# Test insert in reverse order.
49358f0484fSRodney W. Grimestest11()
49458f0484fSRodney W. Grimes{
49558f0484fSRodney W. Grimes	echo "Test 11: recno: reverse order insert"
49658f0484fSRodney W. Grimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
49758f0484fSRodney W. Grimes	awk '{
49858f0484fSRodney W. Grimes		for (i = 1; i <= 779; ++i)
49958f0484fSRodney W. Grimes			printf("%05d: input key %d: %s\n", i, i, $0);
50058f0484fSRodney W. Grimes		exit;
50158f0484fSRodney W. Grimes	}' > $TMP1
50258f0484fSRodney W. Grimes	rm -f $TMP2 $TMP3
50358f0484fSRodney W. Grimes
50458f0484fSRodney W. Grimes	for type in recno; do
50558f0484fSRodney W. Grimes		cat $TMP1 |
50658f0484fSRodney W. Grimes		awk '{
50758f0484fSRodney W. Grimes			if (i == 0) {
50858f0484fSRodney W. Grimes				i = 1;
50958f0484fSRodney W. Grimes				printf("p\nk1\nd%s\n", $0);
51058f0484fSRodney W. Grimes				printf("%s\n", "fR_IBEFORE");
51158f0484fSRodney W. Grimes			} else
51258f0484fSRodney W. Grimes				printf("p\nk1\nd%s\n", $0);
51358f0484fSRodney W. Grimes		}
51458f0484fSRodney W. Grimes		END {
51558f0484fSRodney W. Grimes				printf("or\n");
51658f0484fSRodney W. Grimes		}' > $TMP2
51758f0484fSRodney W. Grimes		$PROG -o $TMP3 $type $TMP2
51858f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
51958f0484fSRodney W. Grimes		else
52058f0484fSRodney W. Grimes			echo "test11: type $type: failed"
52158f0484fSRodney W. Grimes			exit 1
52258f0484fSRodney W. Grimes		fi
52358f0484fSRodney W. Grimes	done
52458f0484fSRodney W. Grimes}
52558f0484fSRodney W. Grimes
52658f0484fSRodney W. Grimes# Take the first 20000 entries in the dictionary, reverse them, and give
52758f0484fSRodney W. Grimes# them each a small size data entry.  Use a small page size to make sure
52858f0484fSRodney W. Grimes# the btree split code gets hammered.
52958f0484fSRodney W. Grimestest12()
53058f0484fSRodney W. Grimes{
53158f0484fSRodney W. Grimes	echo "Test 12: btree: lots of keys, small page size"
53258f0484fSRodney W. Grimes	mdata=abcdefghijklmnopqrstuvwxy
53358f0484fSRodney W. Grimes	echo $mdata |
53458f0484fSRodney W. Grimes	awk '{ for (i = 1; i < 20001; ++i) print $0 }' > $TMP1
53558f0484fSRodney W. Grimes	for type in btree; do
53658f0484fSRodney W. Grimes		rm -f $TMP2 $TMP3
53758f0484fSRodney W. Grimes		for i in `sed 20000q $DICT | rev`; do
53858f0484fSRodney W. Grimes			echo p
53958f0484fSRodney W. Grimes			echo k$i
54058f0484fSRodney W. Grimes			echo d$mdata
54158f0484fSRodney W. Grimes			echo g
54258f0484fSRodney W. Grimes			echo k$i
54358f0484fSRodney W. Grimes		done > $TMP2
54458f0484fSRodney W. Grimes		$PROG -i psize=512 -o $TMP3 $type $TMP2
54558f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
54658f0484fSRodney W. Grimes		else
54758f0484fSRodney W. Grimes			echo "test12: type $type: failed"
54858f0484fSRodney W. Grimes			exit 1
54958f0484fSRodney W. Grimes		fi
55058f0484fSRodney W. Grimes	done
55158f0484fSRodney W. Grimes}
55258f0484fSRodney W. Grimes
55358f0484fSRodney W. Grimes# Test different byte orders.
55458f0484fSRodney W. Grimestest13()
55558f0484fSRodney W. Grimes{
55658f0484fSRodney W. Grimes	echo "Test 13: btree, hash: differing byte orders"
55758f0484fSRodney W. Grimes	sed 50q $DICT > $TMP1
55858f0484fSRodney W. Grimes	for order in 1234 4321; do
55958f0484fSRodney W. Grimes		for type in btree hash; do
56058f0484fSRodney W. Grimes			rm -f byte.file $TMP2 $TMP3
56158f0484fSRodney W. Grimes			for i in `sed 50q $DICT`; do
56258f0484fSRodney W. Grimes				echo p
56358f0484fSRodney W. Grimes				echo k$i
56458f0484fSRodney W. Grimes				echo d$i
56558f0484fSRodney W. Grimes				echo g
56658f0484fSRodney W. Grimes				echo k$i
56758f0484fSRodney W. Grimes			done > $TMP2
56858f0484fSRodney W. Grimes			$PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
56958f0484fSRodney W. Grimes			if (cmp -s $TMP1 $TMP3) ; then :
57058f0484fSRodney W. Grimes			else
57158f0484fSRodney W. Grimes				echo "test13: $type/$order put failed"
57258f0484fSRodney W. Grimes				exit 1
57358f0484fSRodney W. Grimes			fi
57458f0484fSRodney W. Grimes			for i in `sed 50q $DICT`; do
57558f0484fSRodney W. Grimes				echo g
57658f0484fSRodney W. Grimes				echo k$i
57758f0484fSRodney W. Grimes			done > $TMP2
578ef5d438eSPaul Traina			$PROG -s \
579ef5d438eSPaul Traina			    -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
58058f0484fSRodney W. Grimes			if (cmp -s $TMP1 $TMP3) ; then :
58158f0484fSRodney W. Grimes			else
58258f0484fSRodney W. Grimes				echo "test13: $type/$order get failed"
58358f0484fSRodney W. Grimes				exit 1
58458f0484fSRodney W. Grimes			fi
58558f0484fSRodney W. Grimes		done
58658f0484fSRodney W. Grimes	done
58758f0484fSRodney W. Grimes	rm -f byte.file
58858f0484fSRodney W. Grimes}
58958f0484fSRodney W. Grimes
59058f0484fSRodney W. Grimes# Try a variety of bucketsizes and fill factors for hashing
59158f0484fSRodney W. Grimestest20()
59258f0484fSRodney W. Grimes{
59358f0484fSRodney W. Grimes	echo\
59458f0484fSRodney W. Grimes    "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536"
59558f0484fSRodney W. Grimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
59658f0484fSRodney W. Grimes	awk '{
59758f0484fSRodney W. Grimes		for (i = 1; i <= 10000; ++i) {
59858f0484fSRodney W. Grimes			if (i % 34)
59958f0484fSRodney W. Grimes				s = substr($0, 1, i % 34);
60058f0484fSRodney W. Grimes			else
60158f0484fSRodney W. Grimes				s = substr($0, 1);
60258f0484fSRodney W. Grimes			printf("%s\n", s);
60358f0484fSRodney W. Grimes		}
60458f0484fSRodney W. Grimes		exit;
60558f0484fSRodney W. Grimes	}' > $TMP1
60658f0484fSRodney W. Grimes	sed 10000q $DICT |
60758f0484fSRodney W. Grimes	awk 'BEGIN {
60858f0484fSRodney W. Grimes		ds="abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"
60958f0484fSRodney W. Grimes	}
61058f0484fSRodney W. Grimes	{
61158f0484fSRodney W. Grimes		if (++i % 34)
61258f0484fSRodney W. Grimes			s = substr(ds, 1, i % 34);
61358f0484fSRodney W. Grimes		else
61458f0484fSRodney W. Grimes			s = substr(ds, 1);
61558f0484fSRodney W. Grimes		printf("p\nk%s\nd%s\n", $0, s);
61658f0484fSRodney W. Grimes	}' > $TMP2
61758f0484fSRodney W. Grimes	sed 10000q $DICT |
61858f0484fSRodney W. Grimes	awk '{
61958f0484fSRodney W. Grimes		++i;
62058f0484fSRodney W. Grimes		printf("g\nk%s\n", $0);
62158f0484fSRodney W. Grimes	}' >> $TMP2
62258f0484fSRodney W. Grimes	bsize=256
62358f0484fSRodney W. Grimes	for ffactor in 11 14 21; do
62458f0484fSRodney W. Grimes		echo "    bucketsize $bsize, fill factor $ffactor"
62558f0484fSRodney W. Grimes		$PROG -o$TMP3 \
62658f0484fSRodney W. Grimes		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
62758f0484fSRodney W. Grimes		    hash $TMP2
62858f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
62958f0484fSRodney W. Grimes		else
63058f0484fSRodney W. Grimes			echo "test20: type hash:\
63158f0484fSRodney W. Grimesbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
63258f0484fSRodney W. Grimes			exit 1
63358f0484fSRodney W. Grimes		fi
63458f0484fSRodney W. Grimes	done
63558f0484fSRodney W. Grimes	bsize=512
63658f0484fSRodney W. Grimes	for ffactor in 21 28 43; do
63758f0484fSRodney W. Grimes		echo "    bucketsize $bsize, fill factor $ffactor"
63858f0484fSRodney W. Grimes		$PROG -o$TMP3 \
63958f0484fSRodney W. Grimes		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
64058f0484fSRodney W. Grimes		    hash $TMP2
64158f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
64258f0484fSRodney W. Grimes		else
64358f0484fSRodney W. Grimes			echo "test20: type hash:\
64458f0484fSRodney W. Grimesbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
64558f0484fSRodney W. Grimes			exit 1
64658f0484fSRodney W. Grimes		fi
64758f0484fSRodney W. Grimes	done
64858f0484fSRodney W. Grimes	bsize=1024
64958f0484fSRodney W. Grimes	for ffactor in 43 57 85; do
65058f0484fSRodney W. Grimes		echo "    bucketsize $bsize, fill factor $ffactor"
65158f0484fSRodney W. Grimes		$PROG -o$TMP3 \
65258f0484fSRodney W. Grimes		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
65358f0484fSRodney W. Grimes		    hash $TMP2
65458f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
65558f0484fSRodney W. Grimes		else
65658f0484fSRodney W. Grimes			echo "test20: type hash:\
65758f0484fSRodney W. Grimesbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
65858f0484fSRodney W. Grimes			exit 1
65958f0484fSRodney W. Grimes		fi
66058f0484fSRodney W. Grimes	done
66158f0484fSRodney W. Grimes	bsize=2048
66258f0484fSRodney W. Grimes	for ffactor in 85 114 171; do
66358f0484fSRodney W. Grimes		echo "    bucketsize $bsize, fill factor $ffactor"
66458f0484fSRodney W. Grimes		$PROG -o$TMP3 \
66558f0484fSRodney W. Grimes		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
66658f0484fSRodney W. Grimes		    hash $TMP2
66758f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
66858f0484fSRodney W. Grimes		else
66958f0484fSRodney W. Grimes			echo "test20: type hash:\
67058f0484fSRodney W. Grimesbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
67158f0484fSRodney W. Grimes			exit 1
67258f0484fSRodney W. Grimes		fi
67358f0484fSRodney W. Grimes	done
67458f0484fSRodney W. Grimes	bsize=4096
67558f0484fSRodney W. Grimes	for ffactor in 171 228 341; do
67658f0484fSRodney W. Grimes		echo "    bucketsize $bsize, fill factor $ffactor"
67758f0484fSRodney W. Grimes		$PROG -o$TMP3 \
67858f0484fSRodney W. Grimes		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
67958f0484fSRodney W. Grimes		    hash $TMP2
68058f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
68158f0484fSRodney W. Grimes		else
68258f0484fSRodney W. Grimes			echo "test20: type hash:\
68358f0484fSRodney W. Grimesbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
68458f0484fSRodney W. Grimes			exit 1
68558f0484fSRodney W. Grimes		fi
68658f0484fSRodney W. Grimes	done
68758f0484fSRodney W. Grimes	bsize=8192
68858f0484fSRodney W. Grimes	for ffactor in 341 455 683; do
68958f0484fSRodney W. Grimes		echo "    bucketsize $bsize, fill factor $ffactor"
69058f0484fSRodney W. Grimes		$PROG -o$TMP3 \
69158f0484fSRodney W. Grimes		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
69258f0484fSRodney W. Grimes		    hash $TMP2
69358f0484fSRodney W. Grimes		if (cmp -s $TMP1 $TMP3) ; then :
69458f0484fSRodney W. Grimes		else
69558f0484fSRodney W. Grimes			echo "test20: type hash:\
69658f0484fSRodney W. Grimesbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
69758f0484fSRodney W. Grimes			exit 1
69858f0484fSRodney W. Grimes		fi
69958f0484fSRodney W. Grimes	done
70058f0484fSRodney W. Grimes}
70158f0484fSRodney W. Grimes
70258f0484fSRodney W. Grimesmain $*
703