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