11573Srgrimes#!/bin/sh -
21573Srgrimes#
314272Spst#	@(#)run.test	8.10 (Berkeley) 7/26/94
41573Srgrimes#
51573Srgrimes
61573Srgrimes# db regression tests
71573Srgrimesmain()
81573Srgrimes{
91573Srgrimes
1014272Spst	PROG=./dbtest
1114272Spst	TMP1=t1
1214272Spst	TMP2=t2
1314272Spst	TMP3=t3
141573Srgrimes
1514272Spst	if [ -f /usr/share/dict/words ]; then
1614272Spst		DICT=/usr/share/dict/words
1714272Spst	elif [ -f /usr/dict/words ]; then
1814272Spst		DICT=/usr/dict/words
1914272Spst	else
2014272Spst		echo 'run.test: no dictionary'
2114272Spst		exit 1
2214272Spst	fi
2314272Spst	
241573Srgrimes	if [ $# -eq 0 ]; then
251573Srgrimes		for t in 1 2 3 4 5 6 7 8 9 10 11 12 13 20; do
261573Srgrimes			test$t
271573Srgrimes		done
281573Srgrimes	else
291573Srgrimes		while [ $# -gt 0 ]
301573Srgrimes			do case "$1" in
311573Srgrimes			test*)
321573Srgrimes				$1;;
331573Srgrimes			[0-9]*)
341573Srgrimes				test$1;;
351573Srgrimes			btree)
361573Srgrimes				for t in 1 2 3 7 8 9 10 12 13; do
371573Srgrimes					test$t
381573Srgrimes				done;;
391573Srgrimes			hash)
401573Srgrimes				for t in 1 2 3 8 13 20; do
411573Srgrimes					test$t
421573Srgrimes				done;;
431573Srgrimes			recno)
441573Srgrimes				for t in 1 2 3 4 5 6 7 10 11; do
451573Srgrimes					test$t
461573Srgrimes				done;;
471573Srgrimes			*)
481573Srgrimes				echo "run.test: unknown test $1"
491573Srgrimes				echo "usage: run.test test# | type"
501573Srgrimes				exit 1
511573Srgrimes			esac
521573Srgrimes			shift
531573Srgrimes		done
541573Srgrimes	fi
551573Srgrimes	rm -f $TMP1 $TMP2 $TMP3
561573Srgrimes	exit 0
571573Srgrimes}
581573Srgrimes
591573Srgrimes# Take the first hundred entries in the dictionary, and make them
601573Srgrimes# be key/data pairs.
611573Srgrimestest1()
621573Srgrimes{
631573Srgrimes	echo "Test 1: btree, hash: small key, small data pairs"
641573Srgrimes	sed 200q $DICT > $TMP1
651573Srgrimes	for type in btree hash; do
661573Srgrimes		rm -f $TMP2 $TMP3
671573Srgrimes		for i in `sed 200q $DICT`; do
681573Srgrimes			echo p
691573Srgrimes			echo k$i
701573Srgrimes			echo d$i
711573Srgrimes			echo g
721573Srgrimes			echo k$i
731573Srgrimes		done > $TMP2
741573Srgrimes		$PROG -o $TMP3 $type $TMP2
751573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
761573Srgrimes		else
771573Srgrimes			echo "test1: type $type: failed"
781573Srgrimes			exit 1
791573Srgrimes		fi
801573Srgrimes	done
811573Srgrimes	echo "Test 1: recno: small key, small data pairs"
821573Srgrimes	rm -f $TMP2 $TMP3
831573Srgrimes	sed 200q $DICT |
841573Srgrimes	awk '{ 
851573Srgrimes		++i;
861573Srgrimes		printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
871573Srgrimes	}' > $TMP2
881573Srgrimes	$PROG -o $TMP3 recno $TMP2
891573Srgrimes	if (cmp -s $TMP1 $TMP3) ; then :
901573Srgrimes	else
911573Srgrimes		echo "test1: type recno: failed"
921573Srgrimes		exit 1
931573Srgrimes	fi
941573Srgrimes}
951573Srgrimes
961573Srgrimes# Take the first 200 entries in the dictionary, and give them
971573Srgrimes# each a medium size data entry.
981573Srgrimestest2()
991573Srgrimes{
1001573Srgrimes	echo "Test 2: btree, hash: small key, medium data pairs"
1011573Srgrimes	mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
1021573Srgrimes	echo $mdata |
1031573Srgrimes	awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1
1041573Srgrimes	for type in hash btree; do
1051573Srgrimes		rm -f $TMP2 $TMP3
1061573Srgrimes		for i in `sed 200q $DICT`; do
1071573Srgrimes			echo p
1081573Srgrimes			echo k$i
1091573Srgrimes			echo d$mdata
1101573Srgrimes			echo g
1111573Srgrimes			echo k$i
1121573Srgrimes		done > $TMP2
1131573Srgrimes		$PROG -o $TMP3 $type $TMP2
1141573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
1151573Srgrimes		else
1161573Srgrimes			echo "test2: type $type: failed"
1171573Srgrimes			exit 1
1181573Srgrimes		fi
1191573Srgrimes	done
1201573Srgrimes	echo "Test 2: recno: small key, medium data pairs"
1211573Srgrimes	rm -f $TMP2 $TMP3
1221573Srgrimes	echo $mdata | 
1231573Srgrimes	awk '{  for (i = 1; i < 201; ++i)
1241573Srgrimes		printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i);
1251573Srgrimes	}' > $TMP2
1261573Srgrimes	$PROG -o $TMP3 recno $TMP2
1271573Srgrimes	if (cmp -s $TMP1 $TMP3) ; then :
1281573Srgrimes	else
1291573Srgrimes		echo "test2: type recno: failed"
1301573Srgrimes		exit 1
1311573Srgrimes	fi
1321573Srgrimes}
1331573Srgrimes
1341573Srgrimes# Insert the programs in /bin with their paths as their keys.
1351573Srgrimestest3()
1361573Srgrimes{
1371573Srgrimes	echo "Test 3: hash: small key, big data pairs"
1381573Srgrimes	rm -f $TMP1
1391573Srgrimes	(find /bin -type f -print | xargs cat) > $TMP1
1401573Srgrimes	for type in hash; do
1411573Srgrimes		rm -f $TMP2 $TMP3
1421573Srgrimes		for i in `find /bin -type f -print`; do
1431573Srgrimes			echo p
1441573Srgrimes			echo k$i
1451573Srgrimes			echo D$i
1461573Srgrimes			echo g
1471573Srgrimes			echo k$i
1481573Srgrimes		done > $TMP2
1491573Srgrimes		$PROG -o $TMP3 $type $TMP2
1501573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
1511573Srgrimes		else
1521573Srgrimes			echo "test3: $type: failed"
1531573Srgrimes			exit 1
1541573Srgrimes		fi
1551573Srgrimes	done
1561573Srgrimes	echo "Test 3: btree: small key, big data pairs"
1571573Srgrimes	for psize in 512 16384 65536; do
1581573Srgrimes		echo "    page size $psize"
1591573Srgrimes		for type in btree; do
1601573Srgrimes			rm -f $TMP2 $TMP3
1611573Srgrimes			for i in `find /bin -type f -print`; do
1621573Srgrimes				echo p
1631573Srgrimes				echo k$i
1641573Srgrimes				echo D$i
1651573Srgrimes				echo g
1661573Srgrimes				echo k$i
1671573Srgrimes			done > $TMP2
1681573Srgrimes			$PROG -i psize=$psize -o $TMP3 $type $TMP2
1691573Srgrimes			if (cmp -s $TMP1 $TMP3) ; then :
1701573Srgrimes			else
1711573Srgrimes				echo "test3: $type: page size $psize: failed"
1721573Srgrimes				exit 1
1731573Srgrimes			fi
1741573Srgrimes		done
1751573Srgrimes	done
1761573Srgrimes	echo "Test 3: recno: big data pairs"
1771573Srgrimes	rm -f $TMP2 $TMP3
1781573Srgrimes	find /bin -type f -print | 
1791573Srgrimes	awk '{
1801573Srgrimes		++i;
1811573Srgrimes		printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i);
1821573Srgrimes	}' > $TMP2
1831573Srgrimes	for psize in 512 16384 65536; do
1841573Srgrimes		echo "    page size $psize"
1851573Srgrimes		$PROG -i psize=$psize -o $TMP3 recno $TMP2
1861573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
1871573Srgrimes		else
1881573Srgrimes			echo "test3: recno: page size $psize: failed"
1891573Srgrimes			exit 1
1901573Srgrimes		fi
1911573Srgrimes	done
1921573Srgrimes}
1931573Srgrimes
1941573Srgrimes# Do random recno entries.
1951573Srgrimestest4()
1961573Srgrimes{
1971573Srgrimes	echo "Test 4: recno: random entries"
1981573Srgrimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
1991573Srgrimes	awk '{
2001573Srgrimes		for (i = 37; i <= 37 + 88 * 17; i += 17) {
2011573Srgrimes			if (i % 41)
2021573Srgrimes				s = substr($0, 1, i % 41);
2031573Srgrimes			else
2041573Srgrimes				s = substr($0, 1);
2051573Srgrimes			printf("input key %d: %s\n", i, s);
2061573Srgrimes		}
2071573Srgrimes		for (i = 1; i <= 15; ++i) {
2081573Srgrimes			if (i % 41)
2091573Srgrimes				s = substr($0, 1, i % 41);
2101573Srgrimes			else
2111573Srgrimes				s = substr($0, 1);
2121573Srgrimes			printf("input key %d: %s\n", i, s);
2131573Srgrimes		}
2141573Srgrimes		for (i = 19234; i <= 19234 + 61 * 27; i += 27) {
2151573Srgrimes			if (i % 41)
2161573Srgrimes				s = substr($0, 1, i % 41);
2171573Srgrimes			else
2181573Srgrimes				s = substr($0, 1);
2191573Srgrimes			printf("input key %d: %s\n", i, s);
2201573Srgrimes		}
2211573Srgrimes		exit
2221573Srgrimes	}' > $TMP1
2231573Srgrimes	rm -f $TMP2 $TMP3
2241573Srgrimes	cat $TMP1 |
2251573Srgrimes	awk 'BEGIN {
2261573Srgrimes			i = 37;
2271573Srgrimes			incr = 17;
2281573Srgrimes		}
2291573Srgrimes		{
2301573Srgrimes			printf("p\nk%d\nd%s\n", i, $0);
2311573Srgrimes			if (i == 19234 + 61 * 27)
2321573Srgrimes				exit;
2331573Srgrimes			if (i == 37 + 88 * 17) {
2341573Srgrimes				i = 1;
2351573Srgrimes				incr = 1;
2361573Srgrimes			} else if (i == 15) {
2371573Srgrimes				i = 19234;
2381573Srgrimes				incr = 27;
2391573Srgrimes			} else
2401573Srgrimes				i += incr;
2411573Srgrimes		}
2421573Srgrimes		END {
2431573Srgrimes			for (i = 37; i <= 37 + 88 * 17; i += 17)
2441573Srgrimes				printf("g\nk%d\n", i);
2451573Srgrimes			for (i = 1; i <= 15; ++i)
2461573Srgrimes				printf("g\nk%d\n", i);
2471573Srgrimes			for (i = 19234; i <= 19234 + 61 * 27; i += 27)
2481573Srgrimes				printf("g\nk%d\n", i);
2491573Srgrimes		}' > $TMP2
2501573Srgrimes	$PROG -o $TMP3 recno $TMP2
2511573Srgrimes	if (cmp -s $TMP1 $TMP3) ; then :
2521573Srgrimes	else
2531573Srgrimes		echo "test4: type recno: failed"
2541573Srgrimes		exit 1
2551573Srgrimes	fi
2561573Srgrimes}
2571573Srgrimes
2581573Srgrimes# Do reverse order recno entries.
2591573Srgrimestest5()
2601573Srgrimes{
2611573Srgrimes	echo "Test 5: recno: reverse order entries"
2621573Srgrimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
2631573Srgrimes	awk ' {
2641573Srgrimes		for (i = 1500; i; --i) {
2651573Srgrimes			if (i % 34)
2661573Srgrimes				s = substr($0, 1, i % 34);
2671573Srgrimes			else
2681573Srgrimes				s = substr($0, 1);
2691573Srgrimes			printf("input key %d: %s\n", i, s);
2701573Srgrimes		}
2711573Srgrimes		exit;
2721573Srgrimes	}' > $TMP1
2731573Srgrimes	rm -f $TMP2 $TMP3
2741573Srgrimes	cat $TMP1 |
2751573Srgrimes	awk 'BEGIN {
2761573Srgrimes			i = 1500;
2771573Srgrimes		}
2781573Srgrimes		{
2791573Srgrimes			printf("p\nk%d\nd%s\n", i, $0);
2801573Srgrimes			--i;
2811573Srgrimes		}
2821573Srgrimes		END {
2831573Srgrimes			for (i = 1500; i; --i) 
2841573Srgrimes				printf("g\nk%d\n", i);
2851573Srgrimes		}' > $TMP2
2861573Srgrimes	$PROG -o $TMP3 recno $TMP2
2871573Srgrimes	if (cmp -s $TMP1 $TMP3) ; then :
2881573Srgrimes	else
2891573Srgrimes		echo "test5: type recno: failed"
2901573Srgrimes		exit 1
2911573Srgrimes	fi
2921573Srgrimes}
2931573Srgrimes		
2941573Srgrimes# Do alternating order recno entries.
2951573Srgrimestest6()
2961573Srgrimes{
2971573Srgrimes	echo "Test 6: recno: alternating order entries"
2981573Srgrimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
2991573Srgrimes	awk ' {
3001573Srgrimes		for (i = 1; i < 1200; i += 2) {
3011573Srgrimes			if (i % 34)
3021573Srgrimes				s = substr($0, 1, i % 34);
3031573Srgrimes			else
3041573Srgrimes				s = substr($0, 1);
3051573Srgrimes			printf("input key %d: %s\n", i, s);
3061573Srgrimes		}
3071573Srgrimes		for (i = 2; i < 1200; i += 2) {
3081573Srgrimes			if (i % 34)
3091573Srgrimes				s = substr($0, 1, i % 34);
3101573Srgrimes			else
3111573Srgrimes				s = substr($0, 1);
3121573Srgrimes			printf("input key %d: %s\n", i, s);
3131573Srgrimes		}
3141573Srgrimes		exit;
3151573Srgrimes	}' > $TMP1
3161573Srgrimes	rm -f $TMP2 $TMP3
3171573Srgrimes	cat $TMP1 |
3181573Srgrimes	awk 'BEGIN {
3191573Srgrimes			i = 1;
3201573Srgrimes			even = 0;
3211573Srgrimes		}
3221573Srgrimes		{
3231573Srgrimes			printf("p\nk%d\nd%s\n", i, $0);
3241573Srgrimes			i += 2;
3251573Srgrimes			if (i >= 1200) {
3261573Srgrimes				if (even == 1)
3271573Srgrimes					exit;
3281573Srgrimes				even = 1;
3291573Srgrimes				i = 2;
3301573Srgrimes			}
3311573Srgrimes		}
3321573Srgrimes		END {
3331573Srgrimes			for (i = 1; i < 1200; ++i) 
3341573Srgrimes				printf("g\nk%d\n", i);
3351573Srgrimes		}' > $TMP2
3361573Srgrimes	$PROG -o $TMP3 recno $TMP2
3371573Srgrimes	sort -o $TMP1 $TMP1
3381573Srgrimes	sort -o $TMP3 $TMP3
3391573Srgrimes	if (cmp -s $TMP1 $TMP3) ; then :
3401573Srgrimes	else
3411573Srgrimes		echo "test6: type recno: failed"
3421573Srgrimes		exit 1
3431573Srgrimes	fi
3441573Srgrimes}
3451573Srgrimes
3461573Srgrimes# Delete cursor record
3471573Srgrimestest7()
3481573Srgrimes{
3491573Srgrimes	echo "Test 7: btree, recno: delete cursor record"
3501573Srgrimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
3511573Srgrimes	awk '{
3521573Srgrimes		for (i = 1; i <= 120; ++i)
3531573Srgrimes			printf("%05d: input key %d: %s\n", i, i, $0);
3541573Srgrimes		printf("%05d: input key %d: %s\n", 120, 120, $0);
35514272Spst		printf("seq failed, no such key\n");
3561573Srgrimes		printf("%05d: input key %d: %s\n", 1, 1, $0);
3571573Srgrimes		printf("%05d: input key %d: %s\n", 2, 2, $0);
3581573Srgrimes		exit;
3591573Srgrimes	}' > $TMP1
3601573Srgrimes	rm -f $TMP2 $TMP3
3611573Srgrimes
3621573Srgrimes	for type in btree recno; do
3631573Srgrimes		cat $TMP1 |
3641573Srgrimes		awk '{
3651573Srgrimes			if (i == 120)
3661573Srgrimes				exit;
3671573Srgrimes			printf("p\nk%d\nd%s\n", ++i, $0);
3681573Srgrimes		}
3691573Srgrimes		END {
3701573Srgrimes			printf("fR_NEXT\n");
3711573Srgrimes			for (i = 1; i <= 120; ++i)
3721573Srgrimes				printf("s\n");
3731573Srgrimes			printf("fR_CURSOR\ns\nk120\n");
37414272Spst			printf("r\n");
3751573Srgrimes			printf("fR_NEXT\ns\n");
3761573Srgrimes			printf("fR_CURSOR\ns\nk1\n");
37714272Spst			printf("r\n");
3781573Srgrimes			printf("fR_FIRST\ns\n");
3791573Srgrimes		}' > $TMP2
3801573Srgrimes		$PROG -o $TMP3 recno $TMP2
3811573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
3821573Srgrimes		else
3831573Srgrimes			echo "test7: type $type: failed"
3841573Srgrimes			exit 1
3851573Srgrimes		fi
3861573Srgrimes	done
3871573Srgrimes}
3881573Srgrimes
3891573Srgrimes# Make sure that overflow pages are reused.
3901573Srgrimestest8()
3911573Srgrimes{
3921573Srgrimes	echo "Test 8: btree, hash: repeated small key, big data pairs"
3931573Srgrimes	rm -f $TMP1
3941573Srgrimes	echo "" | 
3951573Srgrimes	awk 'BEGIN {
3961573Srgrimes		for (i = 1; i <= 10; ++i) {
3971573Srgrimes			printf("p\nkkey1\nD/bin/sh\n");
3981573Srgrimes			printf("p\nkkey2\nD/bin/csh\n");
3991573Srgrimes			if (i % 8 == 0) {
4001573Srgrimes				printf("c\nkkey2\nD/bin/csh\n");
4011573Srgrimes				printf("c\nkkey1\nD/bin/sh\n");
40214272Spst				printf("e\t%d of 10 (comparison)\n", i);
4031573Srgrimes			} else
40414272Spst				printf("e\t%d of 10             \n", i);
4051573Srgrimes			printf("r\nkkey1\nr\nkkey2\n");
4061573Srgrimes		}
4071573Srgrimes	}' > $TMP1
4081573Srgrimes	$PROG btree $TMP1
4091573Srgrimes#	$PROG hash $TMP1
4101573Srgrimes	# No explicit test for success.
4111573Srgrimes}
4121573Srgrimes
4131573Srgrimes# Test btree duplicate keys
4141573Srgrimestest9()
4151573Srgrimes{
4161573Srgrimes	echo "Test 9: btree: duplicate keys"
4171573Srgrimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
4181573Srgrimes	awk '{
4191573Srgrimes		for (i = 1; i <= 543; ++i)
4201573Srgrimes			printf("%05d: input key %d: %s\n", i, i, $0);
4211573Srgrimes		exit;
4221573Srgrimes	}' > $TMP1
4231573Srgrimes	rm -f $TMP2 $TMP3
4241573Srgrimes
4251573Srgrimes	for type in btree; do
4261573Srgrimes		cat $TMP1 | 
4271573Srgrimes		awk '{
4281573Srgrimes			if (i++ % 2)
4291573Srgrimes				printf("p\nkduplicatekey\nd%s\n", $0);
4301573Srgrimes			else
4311573Srgrimes				printf("p\nkunique%dkey\nd%s\n", i, $0);
4321573Srgrimes		}
4331573Srgrimes		END {
4341573Srgrimes				printf("o\n");
4351573Srgrimes		}' > $TMP2
4361573Srgrimes		$PROG -iflags=1 -o $TMP3 $type $TMP2
4371573Srgrimes		sort -o $TMP3 $TMP3
4381573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
4391573Srgrimes		else
4401573Srgrimes			echo "test9: type $type: failed"
4411573Srgrimes			exit 1
4421573Srgrimes		fi
4431573Srgrimes	done
4441573Srgrimes}
4451573Srgrimes
4461573Srgrimes# Test use of cursor flags without initialization
4471573Srgrimestest10()
4481573Srgrimes{
4491573Srgrimes	echo "Test 10: btree, recno: test cursor flag use"
4501573Srgrimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
4511573Srgrimes	awk '{
4521573Srgrimes		for (i = 1; i <= 20; ++i)
4531573Srgrimes			printf("%05d: input key %d: %s\n", i, i, $0);
4541573Srgrimes		exit;
4551573Srgrimes	}' > $TMP1
4561573Srgrimes	rm -f $TMP2 $TMP3
4571573Srgrimes
4581573Srgrimes	# Test that R_CURSOR doesn't succeed before cursor initialized
4591573Srgrimes	for type in btree recno; do
4601573Srgrimes		cat $TMP1 |
4611573Srgrimes		awk '{
4621573Srgrimes			if (i == 10)
4631573Srgrimes				exit;
4641573Srgrimes			printf("p\nk%d\nd%s\n", ++i, $0);
4651573Srgrimes		}
4661573Srgrimes		END {
46714272Spst			printf("fR_CURSOR\nr\n");
4681573Srgrimes			printf("eR_CURSOR SHOULD HAVE FAILED\n");
4691573Srgrimes		}' > $TMP2
4701573Srgrimes		$PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
4711573Srgrimes		if [ -s $TMP3 ] ; then
4721573Srgrimes			echo "Test 10: delete: R_CURSOR SHOULD HAVE FAILED"
4731573Srgrimes			exit 1
4741573Srgrimes		fi
4751573Srgrimes	done
4761573Srgrimes	for type in btree recno; do
4771573Srgrimes		cat $TMP1 |
4781573Srgrimes		awk '{
4791573Srgrimes			if (i == 10)
4801573Srgrimes				exit;
4811573Srgrimes			printf("p\nk%d\nd%s\n", ++i, $0);
4821573Srgrimes		}
4831573Srgrimes		END {
4841573Srgrimes			printf("fR_CURSOR\np\nk1\ndsome data\n");
4851573Srgrimes			printf("eR_CURSOR SHOULD HAVE FAILED\n");
4861573Srgrimes		}' > $TMP2
4871573Srgrimes		$PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1
4881573Srgrimes		if [ -s $TMP3 ] ; then
4891573Srgrimes			echo "Test 10: put: R_CURSOR SHOULD HAVE FAILED"
4901573Srgrimes			exit 1
4911573Srgrimes		fi
4921573Srgrimes	done
4931573Srgrimes}
4941573Srgrimes
4951573Srgrimes# Test insert in reverse order.
4961573Srgrimestest11()
4971573Srgrimes{
4981573Srgrimes	echo "Test 11: recno: reverse order insert"
4991573Srgrimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
5001573Srgrimes	awk '{
5011573Srgrimes		for (i = 1; i <= 779; ++i)
5021573Srgrimes			printf("%05d: input key %d: %s\n", i, i, $0);
5031573Srgrimes		exit;
5041573Srgrimes	}' > $TMP1
5051573Srgrimes	rm -f $TMP2 $TMP3
5061573Srgrimes
5071573Srgrimes	for type in recno; do
5081573Srgrimes		cat $TMP1 |
5091573Srgrimes		awk '{
5101573Srgrimes			if (i == 0) {
5111573Srgrimes				i = 1;
5121573Srgrimes				printf("p\nk1\nd%s\n", $0);
5131573Srgrimes				printf("%s\n", "fR_IBEFORE");
5141573Srgrimes			} else
5151573Srgrimes				printf("p\nk1\nd%s\n", $0);
5161573Srgrimes		}
5171573Srgrimes		END {
5181573Srgrimes				printf("or\n");
5191573Srgrimes		}' > $TMP2
5201573Srgrimes		$PROG -o $TMP3 $type $TMP2
5211573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
5221573Srgrimes		else
5231573Srgrimes			echo "test11: type $type: failed"
5241573Srgrimes			exit 1
5251573Srgrimes		fi
5261573Srgrimes	done
5271573Srgrimes}
5281573Srgrimes
5291573Srgrimes# Take the first 20000 entries in the dictionary, reverse them, and give
5301573Srgrimes# them each a small size data entry.  Use a small page size to make sure
5311573Srgrimes# the btree split code gets hammered.
5321573Srgrimestest12()
5331573Srgrimes{
5341573Srgrimes	echo "Test 12: btree: lots of keys, small page size"
5351573Srgrimes	mdata=abcdefghijklmnopqrstuvwxy
5361573Srgrimes	echo $mdata |
5371573Srgrimes	awk '{ for (i = 1; i < 20001; ++i) print $0 }' > $TMP1
5381573Srgrimes	for type in btree; do
5391573Srgrimes		rm -f $TMP2 $TMP3
5401573Srgrimes		for i in `sed 20000q $DICT | rev`; do
5411573Srgrimes			echo p
5421573Srgrimes			echo k$i
5431573Srgrimes			echo d$mdata
5441573Srgrimes			echo g
5451573Srgrimes			echo k$i
5461573Srgrimes		done > $TMP2
5471573Srgrimes		$PROG -i psize=512 -o $TMP3 $type $TMP2
5481573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
5491573Srgrimes		else
5501573Srgrimes			echo "test12: type $type: failed"
5511573Srgrimes			exit 1
5521573Srgrimes		fi
5531573Srgrimes	done
5541573Srgrimes}
5551573Srgrimes
5561573Srgrimes# Test different byte orders.
5571573Srgrimestest13()
5581573Srgrimes{
5591573Srgrimes	echo "Test 13: btree, hash: differing byte orders"
5601573Srgrimes	sed 50q $DICT > $TMP1
5611573Srgrimes	for order in 1234 4321; do
5621573Srgrimes		for type in btree hash; do
5631573Srgrimes			rm -f byte.file $TMP2 $TMP3
5641573Srgrimes			for i in `sed 50q $DICT`; do
5651573Srgrimes				echo p
5661573Srgrimes				echo k$i
5671573Srgrimes				echo d$i
5681573Srgrimes				echo g
5691573Srgrimes				echo k$i
5701573Srgrimes			done > $TMP2
5711573Srgrimes			$PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
5721573Srgrimes			if (cmp -s $TMP1 $TMP3) ; then :
5731573Srgrimes			else
5741573Srgrimes				echo "test13: $type/$order put failed"
5751573Srgrimes				exit 1
5761573Srgrimes			fi
5771573Srgrimes			for i in `sed 50q $DICT`; do
5781573Srgrimes				echo g
5791573Srgrimes				echo k$i
5801573Srgrimes			done > $TMP2
58114272Spst			$PROG -s \
58214272Spst			    -ilorder=$order -f byte.file -o $TMP3 $type $TMP2
5831573Srgrimes			if (cmp -s $TMP1 $TMP3) ; then :
5841573Srgrimes			else
5851573Srgrimes				echo "test13: $type/$order get failed"
5861573Srgrimes				exit 1
5871573Srgrimes			fi
5881573Srgrimes		done
5891573Srgrimes	done
5901573Srgrimes	rm -f byte.file
5911573Srgrimes}
5921573Srgrimes
5931573Srgrimes# Try a variety of bucketsizes and fill factors for hashing
5941573Srgrimestest20()
5951573Srgrimes{
5961573Srgrimes	echo\
5971573Srgrimes    "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536"
5981573Srgrimes	echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" |
5991573Srgrimes	awk '{
6001573Srgrimes		for (i = 1; i <= 10000; ++i) {
6011573Srgrimes			if (i % 34)
6021573Srgrimes				s = substr($0, 1, i % 34);
6031573Srgrimes			else
6041573Srgrimes				s = substr($0, 1);
6051573Srgrimes			printf("%s\n", s);
6061573Srgrimes		}
6071573Srgrimes		exit;
6081573Srgrimes	}' > $TMP1
6091573Srgrimes	sed 10000q $DICT |
6101573Srgrimes	awk 'BEGIN {
6111573Srgrimes		ds="abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg"
6121573Srgrimes	}
6131573Srgrimes	{
6141573Srgrimes		if (++i % 34)
6151573Srgrimes			s = substr(ds, 1, i % 34);
6161573Srgrimes		else
6171573Srgrimes			s = substr(ds, 1);
6181573Srgrimes		printf("p\nk%s\nd%s\n", $0, s);
6191573Srgrimes	}' > $TMP2
6201573Srgrimes	sed 10000q $DICT |
6211573Srgrimes	awk '{
6221573Srgrimes		++i;
6231573Srgrimes		printf("g\nk%s\n", $0);
6241573Srgrimes	}' >> $TMP2
6251573Srgrimes	bsize=256
6261573Srgrimes	for ffactor in 11 14 21; do
6271573Srgrimes		echo "    bucketsize $bsize, fill factor $ffactor"
6281573Srgrimes		$PROG -o$TMP3 \
6291573Srgrimes		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
6301573Srgrimes		    hash $TMP2
6311573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
6321573Srgrimes		else
6331573Srgrimes			echo "test20: type hash:\
6341573Srgrimesbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
6351573Srgrimes			exit 1
6361573Srgrimes		fi
6371573Srgrimes	done
6381573Srgrimes	bsize=512
6391573Srgrimes	for ffactor in 21 28 43; do
6401573Srgrimes		echo "    bucketsize $bsize, fill factor $ffactor"
6411573Srgrimes		$PROG -o$TMP3 \
6421573Srgrimes		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
6431573Srgrimes		    hash $TMP2
6441573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
6451573Srgrimes		else
6461573Srgrimes			echo "test20: type hash:\
6471573Srgrimesbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
6481573Srgrimes			exit 1
6491573Srgrimes		fi
6501573Srgrimes	done
6511573Srgrimes	bsize=1024
6521573Srgrimes	for ffactor in 43 57 85; do
6531573Srgrimes		echo "    bucketsize $bsize, fill factor $ffactor"
6541573Srgrimes		$PROG -o$TMP3 \
6551573Srgrimes		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
6561573Srgrimes		    hash $TMP2
6571573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
6581573Srgrimes		else
6591573Srgrimes			echo "test20: type hash:\
6601573Srgrimesbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
6611573Srgrimes			exit 1
6621573Srgrimes		fi
6631573Srgrimes	done
6641573Srgrimes	bsize=2048
6651573Srgrimes	for ffactor in 85 114 171; do
6661573Srgrimes		echo "    bucketsize $bsize, fill factor $ffactor"
6671573Srgrimes		$PROG -o$TMP3 \
6681573Srgrimes		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
6691573Srgrimes		    hash $TMP2
6701573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
6711573Srgrimes		else
6721573Srgrimes			echo "test20: type hash:\
6731573Srgrimesbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
6741573Srgrimes			exit 1
6751573Srgrimes		fi
6761573Srgrimes	done
6771573Srgrimes	bsize=4096
6781573Srgrimes	for ffactor in 171 228 341; do
6791573Srgrimes		echo "    bucketsize $bsize, fill factor $ffactor"
6801573Srgrimes		$PROG -o$TMP3 \
6811573Srgrimes		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
6821573Srgrimes		    hash $TMP2
6831573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
6841573Srgrimes		else
6851573Srgrimes			echo "test20: type hash:\
6861573Srgrimesbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
6871573Srgrimes			exit 1
6881573Srgrimes		fi
6891573Srgrimes	done
6901573Srgrimes	bsize=8192
6911573Srgrimes	for ffactor in 341 455 683; do
6921573Srgrimes		echo "    bucketsize $bsize, fill factor $ffactor"
6931573Srgrimes		$PROG -o$TMP3 \
6941573Srgrimes		    -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\
6951573Srgrimes		    hash $TMP2
6961573Srgrimes		if (cmp -s $TMP1 $TMP3) ; then :
6971573Srgrimes		else
6981573Srgrimes			echo "test20: type hash:\
6991573Srgrimesbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed"
7001573Srgrimes			exit 1
7011573Srgrimes		fi
7021573Srgrimes	done
7031573Srgrimes}
7041573Srgrimes
7051573Srgrimesmain $*
706