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