1df930be7Sderaadt#!/bin/sh - 2df930be7Sderaadt# 3*133306f0Sniklas# $OpenBSD: run.test,v 1.3 2001/01/29 02:05:41 niklas Exp $ 4bec2d00aSderaadt# $NetBSD: run.test,v 1.8 1996/05/03 21:57:51 cgd Exp $ 5bec2d00aSderaadt# @(#)run.test 8.10 (Berkeley) 7/26/94 6df930be7Sderaadt# 7df930be7Sderaadt 8df930be7Sderaadt# db regression tests 9df930be7Sderaadtmain() 10df930be7Sderaadt{ 11df930be7Sderaadt 12df930be7Sderaadt PROG=./dbtest 13df930be7Sderaadt TMP1=t1 14df930be7Sderaadt TMP2=t2 15df930be7Sderaadt TMP3=t3 16df930be7Sderaadt 17bec2d00aSderaadt if [ -f /usr/share/dict/words ]; then 18bec2d00aSderaadt DICT=/usr/share/dict/words 19bec2d00aSderaadt elif [ -f /usr/dict/words ]; then 20bec2d00aSderaadt DICT=/usr/dict/words 21bec2d00aSderaadt else 22bec2d00aSderaadt echo 'run.test: no dictionary' 23bec2d00aSderaadt exit 1 24bec2d00aSderaadt fi 25bec2d00aSderaadt 26df930be7Sderaadt if [ $# -eq 0 ]; then 27df930be7Sderaadt for t in 1 2 3 4 5 6 7 8 9 10 11 12 13 20; do 28df930be7Sderaadt test$t 29df930be7Sderaadt done 30df930be7Sderaadt else 31df930be7Sderaadt while [ $# -gt 0 ] 32df930be7Sderaadt do case "$1" in 33df930be7Sderaadt test*) 34df930be7Sderaadt $1;; 35df930be7Sderaadt [0-9]*) 36df930be7Sderaadt test$1;; 37df930be7Sderaadt btree) 38df930be7Sderaadt for t in 1 2 3 7 8 9 10 12 13; do 39df930be7Sderaadt test$t 40df930be7Sderaadt done;; 41df930be7Sderaadt hash) 42df930be7Sderaadt for t in 1 2 3 8 13 20; do 43df930be7Sderaadt test$t 44df930be7Sderaadt done;; 45df930be7Sderaadt recno) 46df930be7Sderaadt for t in 1 2 3 4 5 6 7 10 11; do 47df930be7Sderaadt test$t 48df930be7Sderaadt done;; 49df930be7Sderaadt *) 50df930be7Sderaadt echo "run.test: unknown test $1" 51df930be7Sderaadt echo "usage: run.test test# | type" 52df930be7Sderaadt exit 1 53df930be7Sderaadt esac 54df930be7Sderaadt shift 55df930be7Sderaadt done 56df930be7Sderaadt fi 57df930be7Sderaadt rm -f $TMP1 $TMP2 $TMP3 58df930be7Sderaadt exit 0 59df930be7Sderaadt} 60df930be7Sderaadt 61df930be7Sderaadt# Take the first hundred entries in the dictionary, and make them 62df930be7Sderaadt# be key/data pairs. 63df930be7Sderaadttest1() 64df930be7Sderaadt{ 65df930be7Sderaadt echo "Test 1: btree, hash: small key, small data pairs" 66df930be7Sderaadt sed 200q $DICT > $TMP1 67df930be7Sderaadt for type in btree hash; do 68df930be7Sderaadt rm -f $TMP2 $TMP3 69df930be7Sderaadt for i in `sed 200q $DICT`; do 70df930be7Sderaadt echo p 71df930be7Sderaadt echo k$i 72df930be7Sderaadt echo d$i 73df930be7Sderaadt echo g 74df930be7Sderaadt echo k$i 75df930be7Sderaadt done > $TMP2 76df930be7Sderaadt $PROG -o $TMP3 $type $TMP2 77df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 78df930be7Sderaadt else 79df930be7Sderaadt echo "test1: type $type: failed" 80df930be7Sderaadt exit 1 81df930be7Sderaadt fi 82df930be7Sderaadt done 83df930be7Sderaadt echo "Test 1: recno: small key, small data pairs" 84df930be7Sderaadt rm -f $TMP2 $TMP3 85df930be7Sderaadt sed 200q $DICT | 86df930be7Sderaadt awk '{ 87df930be7Sderaadt ++i; 88df930be7Sderaadt printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i); 89df930be7Sderaadt }' > $TMP2 90df930be7Sderaadt $PROG -o $TMP3 recno $TMP2 91df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 92df930be7Sderaadt else 93df930be7Sderaadt echo "test1: type recno: failed" 94df930be7Sderaadt exit 1 95df930be7Sderaadt fi 96df930be7Sderaadt} 97df930be7Sderaadt 98df930be7Sderaadt# Take the first 200 entries in the dictionary, and give them 99df930be7Sderaadt# each a medium size data entry. 100df930be7Sderaadttest2() 101df930be7Sderaadt{ 102df930be7Sderaadt echo "Test 2: btree, hash: small key, medium data pairs" 103df930be7Sderaadt mdata=abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz 104df930be7Sderaadt echo $mdata | 105df930be7Sderaadt awk '{ for (i = 1; i < 201; ++i) print $0 }' > $TMP1 106df930be7Sderaadt for type in hash btree; do 107df930be7Sderaadt rm -f $TMP2 $TMP3 108df930be7Sderaadt for i in `sed 200q $DICT`; do 109df930be7Sderaadt echo p 110df930be7Sderaadt echo k$i 111df930be7Sderaadt echo d$mdata 112df930be7Sderaadt echo g 113df930be7Sderaadt echo k$i 114df930be7Sderaadt done > $TMP2 115df930be7Sderaadt $PROG -o $TMP3 $type $TMP2 116df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 117df930be7Sderaadt else 118df930be7Sderaadt echo "test2: type $type: failed" 119df930be7Sderaadt exit 1 120df930be7Sderaadt fi 121df930be7Sderaadt done 122df930be7Sderaadt echo "Test 2: recno: small key, medium data pairs" 123df930be7Sderaadt rm -f $TMP2 $TMP3 124df930be7Sderaadt echo $mdata | 125df930be7Sderaadt awk '{ for (i = 1; i < 201; ++i) 126df930be7Sderaadt printf("p\nk%d\nd%s\ng\nk%d\n", i, $0, i); 127df930be7Sderaadt }' > $TMP2 128df930be7Sderaadt $PROG -o $TMP3 recno $TMP2 129df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 130df930be7Sderaadt else 131df930be7Sderaadt echo "test2: type recno: failed" 132df930be7Sderaadt exit 1 133df930be7Sderaadt fi 134df930be7Sderaadt} 135df930be7Sderaadt 136df930be7Sderaadt# Insert the programs in /bin with their paths as their keys. 137df930be7Sderaadttest3() 138df930be7Sderaadt{ 139df930be7Sderaadt echo "Test 3: hash: small key, big data pairs" 140df930be7Sderaadt rm -f $TMP1 141df930be7Sderaadt (find /bin -type f -print | xargs cat) > $TMP1 142df930be7Sderaadt for type in hash; do 143df930be7Sderaadt rm -f $TMP2 $TMP3 144df930be7Sderaadt for i in `find /bin -type f -print`; do 145df930be7Sderaadt echo p 146df930be7Sderaadt echo k$i 147df930be7Sderaadt echo D$i 148df930be7Sderaadt echo g 149df930be7Sderaadt echo k$i 150df930be7Sderaadt done > $TMP2 151df930be7Sderaadt $PROG -o $TMP3 $type $TMP2 152df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 153df930be7Sderaadt else 154df930be7Sderaadt echo "test3: $type: failed" 155df930be7Sderaadt exit 1 156df930be7Sderaadt fi 157df930be7Sderaadt done 158df930be7Sderaadt echo "Test 3: btree: small key, big data pairs" 159df930be7Sderaadt for psize in 512 16384 65536; do 160df930be7Sderaadt echo " page size $psize" 161df930be7Sderaadt for type in btree; do 162df930be7Sderaadt rm -f $TMP2 $TMP3 163df930be7Sderaadt for i in `find /bin -type f -print`; do 164df930be7Sderaadt echo p 165df930be7Sderaadt echo k$i 166df930be7Sderaadt echo D$i 167df930be7Sderaadt echo g 168df930be7Sderaadt echo k$i 169df930be7Sderaadt done > $TMP2 170df930be7Sderaadt $PROG -i psize=$psize -o $TMP3 $type $TMP2 171df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 172df930be7Sderaadt else 173df930be7Sderaadt echo "test3: $type: page size $psize: failed" 174df930be7Sderaadt exit 1 175df930be7Sderaadt fi 176df930be7Sderaadt done 177df930be7Sderaadt done 178df930be7Sderaadt echo "Test 3: recno: big data pairs" 179df930be7Sderaadt rm -f $TMP2 $TMP3 180df930be7Sderaadt find /bin -type f -print | 181df930be7Sderaadt awk '{ 182df930be7Sderaadt ++i; 183df930be7Sderaadt printf("p\nk%d\nD%s\ng\nk%d\n", i, $0, i); 184df930be7Sderaadt }' > $TMP2 185df930be7Sderaadt for psize in 512 16384 65536; do 186df930be7Sderaadt echo " page size $psize" 187df930be7Sderaadt $PROG -i psize=$psize -o $TMP3 recno $TMP2 188df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 189df930be7Sderaadt else 190df930be7Sderaadt echo "test3: recno: page size $psize: failed" 191df930be7Sderaadt exit 1 192df930be7Sderaadt fi 193df930be7Sderaadt done 194df930be7Sderaadt} 195df930be7Sderaadt 196df930be7Sderaadt# Do random recno entries. 197df930be7Sderaadttest4() 198df930be7Sderaadt{ 199df930be7Sderaadt echo "Test 4: recno: random entries" 200df930be7Sderaadt echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 201df930be7Sderaadt awk '{ 202df930be7Sderaadt for (i = 37; i <= 37 + 88 * 17; i += 17) { 203df930be7Sderaadt if (i % 41) 204df930be7Sderaadt s = substr($0, 1, i % 41); 205df930be7Sderaadt else 206df930be7Sderaadt s = substr($0, 1); 207df930be7Sderaadt printf("input key %d: %s\n", i, s); 208df930be7Sderaadt } 209df930be7Sderaadt for (i = 1; i <= 15; ++i) { 210df930be7Sderaadt if (i % 41) 211df930be7Sderaadt s = substr($0, 1, i % 41); 212df930be7Sderaadt else 213df930be7Sderaadt s = substr($0, 1); 214df930be7Sderaadt printf("input key %d: %s\n", i, s); 215df930be7Sderaadt } 216df930be7Sderaadt for (i = 19234; i <= 19234 + 61 * 27; i += 27) { 217df930be7Sderaadt if (i % 41) 218df930be7Sderaadt s = substr($0, 1, i % 41); 219df930be7Sderaadt else 220df930be7Sderaadt s = substr($0, 1); 221df930be7Sderaadt printf("input key %d: %s\n", i, s); 222df930be7Sderaadt } 223df930be7Sderaadt exit 224df930be7Sderaadt }' > $TMP1 225df930be7Sderaadt rm -f $TMP2 $TMP3 226df930be7Sderaadt cat $TMP1 | 227df930be7Sderaadt awk 'BEGIN { 228df930be7Sderaadt i = 37; 229df930be7Sderaadt incr = 17; 230df930be7Sderaadt } 231df930be7Sderaadt { 232df930be7Sderaadt printf("p\nk%d\nd%s\n", i, $0); 233df930be7Sderaadt if (i == 19234 + 61 * 27) 234df930be7Sderaadt exit; 235df930be7Sderaadt if (i == 37 + 88 * 17) { 236df930be7Sderaadt i = 1; 237df930be7Sderaadt incr = 1; 238df930be7Sderaadt } else if (i == 15) { 239df930be7Sderaadt i = 19234; 240df930be7Sderaadt incr = 27; 241df930be7Sderaadt } else 242df930be7Sderaadt i += incr; 243df930be7Sderaadt } 244df930be7Sderaadt END { 245df930be7Sderaadt for (i = 37; i <= 37 + 88 * 17; i += 17) 246df930be7Sderaadt printf("g\nk%d\n", i); 247df930be7Sderaadt for (i = 1; i <= 15; ++i) 248df930be7Sderaadt printf("g\nk%d\n", i); 249df930be7Sderaadt for (i = 19234; i <= 19234 + 61 * 27; i += 27) 250df930be7Sderaadt printf("g\nk%d\n", i); 251df930be7Sderaadt }' > $TMP2 252df930be7Sderaadt $PROG -o $TMP3 recno $TMP2 253df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 254df930be7Sderaadt else 255df930be7Sderaadt echo "test4: type recno: failed" 256df930be7Sderaadt exit 1 257df930be7Sderaadt fi 258df930be7Sderaadt} 259df930be7Sderaadt 260df930be7Sderaadt# Do reverse order recno entries. 261df930be7Sderaadttest5() 262df930be7Sderaadt{ 263df930be7Sderaadt echo "Test 5: recno: reverse order entries" 264df930be7Sderaadt echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 265df930be7Sderaadt awk ' { 266df930be7Sderaadt for (i = 1500; i; --i) { 267df930be7Sderaadt if (i % 34) 268df930be7Sderaadt s = substr($0, 1, i % 34); 269df930be7Sderaadt else 270df930be7Sderaadt s = substr($0, 1); 271df930be7Sderaadt printf("input key %d: %s\n", i, s); 272df930be7Sderaadt } 273df930be7Sderaadt exit; 274df930be7Sderaadt }' > $TMP1 275df930be7Sderaadt rm -f $TMP2 $TMP3 276df930be7Sderaadt cat $TMP1 | 277df930be7Sderaadt awk 'BEGIN { 278df930be7Sderaadt i = 1500; 279df930be7Sderaadt } 280df930be7Sderaadt { 281df930be7Sderaadt printf("p\nk%d\nd%s\n", i, $0); 282df930be7Sderaadt --i; 283df930be7Sderaadt } 284df930be7Sderaadt END { 285df930be7Sderaadt for (i = 1500; i; --i) 286df930be7Sderaadt printf("g\nk%d\n", i); 287df930be7Sderaadt }' > $TMP2 288df930be7Sderaadt $PROG -o $TMP3 recno $TMP2 289df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 290df930be7Sderaadt else 291df930be7Sderaadt echo "test5: type recno: failed" 292df930be7Sderaadt exit 1 293df930be7Sderaadt fi 294df930be7Sderaadt} 295df930be7Sderaadt 296df930be7Sderaadt# Do alternating order recno entries. 297df930be7Sderaadttest6() 298df930be7Sderaadt{ 299df930be7Sderaadt echo "Test 6: recno: alternating order entries" 300df930be7Sderaadt echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 301df930be7Sderaadt awk ' { 302df930be7Sderaadt for (i = 1; i < 1200; i += 2) { 303df930be7Sderaadt if (i % 34) 304df930be7Sderaadt s = substr($0, 1, i % 34); 305df930be7Sderaadt else 306df930be7Sderaadt s = substr($0, 1); 307df930be7Sderaadt printf("input key %d: %s\n", i, s); 308df930be7Sderaadt } 309df930be7Sderaadt for (i = 2; i < 1200; i += 2) { 310df930be7Sderaadt if (i % 34) 311df930be7Sderaadt s = substr($0, 1, i % 34); 312df930be7Sderaadt else 313df930be7Sderaadt s = substr($0, 1); 314df930be7Sderaadt printf("input key %d: %s\n", i, s); 315df930be7Sderaadt } 316df930be7Sderaadt exit; 317df930be7Sderaadt }' > $TMP1 318df930be7Sderaadt rm -f $TMP2 $TMP3 319df930be7Sderaadt cat $TMP1 | 320df930be7Sderaadt awk 'BEGIN { 321df930be7Sderaadt i = 1; 322df930be7Sderaadt even = 0; 323df930be7Sderaadt } 324df930be7Sderaadt { 325df930be7Sderaadt printf("p\nk%d\nd%s\n", i, $0); 326df930be7Sderaadt i += 2; 327df930be7Sderaadt if (i >= 1200) { 328df930be7Sderaadt if (even == 1) 329df930be7Sderaadt exit; 330df930be7Sderaadt even = 1; 331df930be7Sderaadt i = 2; 332df930be7Sderaadt } 333df930be7Sderaadt } 334df930be7Sderaadt END { 335df930be7Sderaadt for (i = 1; i < 1200; ++i) 336df930be7Sderaadt printf("g\nk%d\n", i); 337df930be7Sderaadt }' > $TMP2 338df930be7Sderaadt $PROG -o $TMP3 recno $TMP2 339df930be7Sderaadt sort -o $TMP1 $TMP1 340df930be7Sderaadt sort -o $TMP3 $TMP3 341df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 342df930be7Sderaadt else 343df930be7Sderaadt echo "test6: type recno: failed" 344df930be7Sderaadt exit 1 345df930be7Sderaadt fi 346df930be7Sderaadt} 347df930be7Sderaadt 348df930be7Sderaadt# Delete cursor record 349df930be7Sderaadttest7() 350df930be7Sderaadt{ 351df930be7Sderaadt echo "Test 7: btree, recno: delete cursor record" 352df930be7Sderaadt echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 353df930be7Sderaadt awk '{ 354df930be7Sderaadt for (i = 1; i <= 120; ++i) 355df930be7Sderaadt printf("%05d: input key %d: %s\n", i, i, $0); 356df930be7Sderaadt printf("%05d: input key %d: %s\n", 120, 120, $0); 357bec2d00aSderaadt printf("seq failed, no such key\n"); 358df930be7Sderaadt printf("%05d: input key %d: %s\n", 1, 1, $0); 359df930be7Sderaadt printf("%05d: input key %d: %s\n", 2, 2, $0); 360df930be7Sderaadt exit; 361df930be7Sderaadt }' > $TMP1 362df930be7Sderaadt rm -f $TMP2 $TMP3 363df930be7Sderaadt 364df930be7Sderaadt for type in btree recno; do 365df930be7Sderaadt cat $TMP1 | 366df930be7Sderaadt awk '{ 367df930be7Sderaadt if (i == 120) 368df930be7Sderaadt exit; 369df930be7Sderaadt printf("p\nk%d\nd%s\n", ++i, $0); 370df930be7Sderaadt } 371df930be7Sderaadt END { 372df930be7Sderaadt printf("fR_NEXT\n"); 373df930be7Sderaadt for (i = 1; i <= 120; ++i) 374df930be7Sderaadt printf("s\n"); 375df930be7Sderaadt printf("fR_CURSOR\ns\nk120\n"); 376bec2d00aSderaadt printf("r\n"); 377df930be7Sderaadt printf("fR_NEXT\ns\n"); 378df930be7Sderaadt printf("fR_CURSOR\ns\nk1\n"); 379bec2d00aSderaadt printf("r\n"); 380df930be7Sderaadt printf("fR_FIRST\ns\n"); 381df930be7Sderaadt }' > $TMP2 382df930be7Sderaadt $PROG -o $TMP3 recno $TMP2 383df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 384df930be7Sderaadt else 385df930be7Sderaadt echo "test7: type $type: failed" 386df930be7Sderaadt exit 1 387df930be7Sderaadt fi 388df930be7Sderaadt done 389df930be7Sderaadt} 390df930be7Sderaadt 391df930be7Sderaadt# Make sure that overflow pages are reused. 392df930be7Sderaadttest8() 393df930be7Sderaadt{ 394df930be7Sderaadt echo "Test 8: btree, hash: repeated small key, big data pairs" 395df930be7Sderaadt rm -f $TMP1 396df930be7Sderaadt echo "" | 397df930be7Sderaadt awk 'BEGIN { 398df930be7Sderaadt for (i = 1; i <= 10; ++i) { 399df930be7Sderaadt printf("p\nkkey1\nD/bin/sh\n"); 400df930be7Sderaadt printf("p\nkkey2\nD/bin/csh\n"); 401df930be7Sderaadt if (i % 8 == 0) { 402df930be7Sderaadt printf("c\nkkey2\nD/bin/csh\n"); 403df930be7Sderaadt printf("c\nkkey1\nD/bin/sh\n"); 404df930be7Sderaadt printf("e\t%d of 10 (comparison)\n", i); 405df930be7Sderaadt } else 406df930be7Sderaadt printf("e\t%d of 10 \n", i); 407df930be7Sderaadt printf("r\nkkey1\nr\nkkey2\n"); 408df930be7Sderaadt } 409df930be7Sderaadt }' > $TMP1 410df930be7Sderaadt $PROG btree $TMP1 411df930be7Sderaadt# $PROG hash $TMP1 412df930be7Sderaadt # No explicit test for success. 413df930be7Sderaadt} 414df930be7Sderaadt 415df930be7Sderaadt# Test btree duplicate keys 416df930be7Sderaadttest9() 417df930be7Sderaadt{ 418df930be7Sderaadt echo "Test 9: btree: duplicate keys" 419df930be7Sderaadt echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 420df930be7Sderaadt awk '{ 421df930be7Sderaadt for (i = 1; i <= 543; ++i) 422df930be7Sderaadt printf("%05d: input key %d: %s\n", i, i, $0); 423df930be7Sderaadt exit; 424df930be7Sderaadt }' > $TMP1 425df930be7Sderaadt rm -f $TMP2 $TMP3 426df930be7Sderaadt 427df930be7Sderaadt for type in btree; do 428df930be7Sderaadt cat $TMP1 | 429df930be7Sderaadt awk '{ 430df930be7Sderaadt if (i++ % 2) 431df930be7Sderaadt printf("p\nkduplicatekey\nd%s\n", $0); 432df930be7Sderaadt else 433df930be7Sderaadt printf("p\nkunique%dkey\nd%s\n", i, $0); 434df930be7Sderaadt } 435df930be7Sderaadt END { 436df930be7Sderaadt printf("o\n"); 437df930be7Sderaadt }' > $TMP2 438df930be7Sderaadt $PROG -iflags=1 -o $TMP3 $type $TMP2 439df930be7Sderaadt sort -o $TMP3 $TMP3 440df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 441df930be7Sderaadt else 442df930be7Sderaadt echo "test9: type $type: failed" 443df930be7Sderaadt exit 1 444df930be7Sderaadt fi 445df930be7Sderaadt done 446df930be7Sderaadt} 447df930be7Sderaadt 448df930be7Sderaadt# Test use of cursor flags without initialization 449df930be7Sderaadttest10() 450df930be7Sderaadt{ 451df930be7Sderaadt echo "Test 10: btree, recno: test cursor flag use" 452df930be7Sderaadt echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 453df930be7Sderaadt awk '{ 454df930be7Sderaadt for (i = 1; i <= 20; ++i) 455df930be7Sderaadt printf("%05d: input key %d: %s\n", i, i, $0); 456df930be7Sderaadt exit; 457df930be7Sderaadt }' > $TMP1 458df930be7Sderaadt rm -f $TMP2 $TMP3 459df930be7Sderaadt 460df930be7Sderaadt # Test that R_CURSOR doesn't succeed before cursor initialized 461df930be7Sderaadt for type in btree recno; do 462df930be7Sderaadt cat $TMP1 | 463df930be7Sderaadt awk '{ 464df930be7Sderaadt if (i == 10) 465df930be7Sderaadt exit; 466df930be7Sderaadt printf("p\nk%d\nd%s\n", ++i, $0); 467df930be7Sderaadt } 468df930be7Sderaadt END { 469bec2d00aSderaadt printf("fR_CURSOR\nr\n"); 470df930be7Sderaadt printf("eR_CURSOR SHOULD HAVE FAILED\n"); 471df930be7Sderaadt }' > $TMP2 472df930be7Sderaadt $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1 473df930be7Sderaadt if [ -s $TMP3 ] ; then 474df930be7Sderaadt echo "Test 10: delete: R_CURSOR SHOULD HAVE FAILED" 475df930be7Sderaadt exit 1 476df930be7Sderaadt fi 477df930be7Sderaadt done 478df930be7Sderaadt for type in btree recno; do 479df930be7Sderaadt cat $TMP1 | 480df930be7Sderaadt awk '{ 481df930be7Sderaadt if (i == 10) 482df930be7Sderaadt exit; 483df930be7Sderaadt printf("p\nk%d\nd%s\n", ++i, $0); 484df930be7Sderaadt } 485df930be7Sderaadt END { 486df930be7Sderaadt printf("fR_CURSOR\np\nk1\ndsome data\n"); 487df930be7Sderaadt printf("eR_CURSOR SHOULD HAVE FAILED\n"); 488df930be7Sderaadt }' > $TMP2 489df930be7Sderaadt $PROG -o $TMP3 $type $TMP2 > /dev/null 2>&1 490df930be7Sderaadt if [ -s $TMP3 ] ; then 491df930be7Sderaadt echo "Test 10: put: R_CURSOR SHOULD HAVE FAILED" 492df930be7Sderaadt exit 1 493df930be7Sderaadt fi 494df930be7Sderaadt done 495df930be7Sderaadt} 496df930be7Sderaadt 497df930be7Sderaadt# Test insert in reverse order. 498df930be7Sderaadttest11() 499df930be7Sderaadt{ 500df930be7Sderaadt echo "Test 11: recno: reverse order insert" 501df930be7Sderaadt echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 502df930be7Sderaadt awk '{ 503df930be7Sderaadt for (i = 1; i <= 779; ++i) 504df930be7Sderaadt printf("%05d: input key %d: %s\n", i, i, $0); 505df930be7Sderaadt exit; 506df930be7Sderaadt }' > $TMP1 507df930be7Sderaadt rm -f $TMP2 $TMP3 508df930be7Sderaadt 509df930be7Sderaadt for type in recno; do 510df930be7Sderaadt cat $TMP1 | 511df930be7Sderaadt awk '{ 512df930be7Sderaadt if (i == 0) { 513df930be7Sderaadt i = 1; 514df930be7Sderaadt printf("p\nk1\nd%s\n", $0); 515df930be7Sderaadt printf("%s\n", "fR_IBEFORE"); 516df930be7Sderaadt } else 517df930be7Sderaadt printf("p\nk1\nd%s\n", $0); 518df930be7Sderaadt } 519df930be7Sderaadt END { 520df930be7Sderaadt printf("or\n"); 521df930be7Sderaadt }' > $TMP2 522df930be7Sderaadt $PROG -o $TMP3 $type $TMP2 523df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 524df930be7Sderaadt else 525df930be7Sderaadt echo "test11: type $type: failed" 526df930be7Sderaadt exit 1 527df930be7Sderaadt fi 528df930be7Sderaadt done 529df930be7Sderaadt} 530df930be7Sderaadt 531df930be7Sderaadt# Take the first 20000 entries in the dictionary, reverse them, and give 532df930be7Sderaadt# them each a small size data entry. Use a small page size to make sure 533df930be7Sderaadt# the btree split code gets hammered. 534df930be7Sderaadttest12() 535df930be7Sderaadt{ 536df930be7Sderaadt echo "Test 12: btree: lots of keys, small page size" 537df930be7Sderaadt mdata=abcdefghijklmnopqrstuvwxy 538df930be7Sderaadt echo $mdata | 539df930be7Sderaadt awk '{ for (i = 1; i < 20001; ++i) print $0 }' > $TMP1 540df930be7Sderaadt for type in btree; do 541df930be7Sderaadt rm -f $TMP2 $TMP3 542df930be7Sderaadt for i in `sed 20000q $DICT | rev`; do 543df930be7Sderaadt echo p 544df930be7Sderaadt echo k$i 545df930be7Sderaadt echo d$mdata 546df930be7Sderaadt echo g 547df930be7Sderaadt echo k$i 548df930be7Sderaadt done > $TMP2 549df930be7Sderaadt $PROG -i psize=512 -o $TMP3 $type $TMP2 550df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 551df930be7Sderaadt else 552df930be7Sderaadt echo "test12: type $type: failed" 553df930be7Sderaadt exit 1 554df930be7Sderaadt fi 555df930be7Sderaadt done 556df930be7Sderaadt} 557df930be7Sderaadt 558df930be7Sderaadt# Test different byte orders. 559df930be7Sderaadttest13() 560df930be7Sderaadt{ 561df930be7Sderaadt echo "Test 13: btree, hash: differing byte orders" 562df930be7Sderaadt sed 50q $DICT > $TMP1 563df930be7Sderaadt for order in 1234 4321; do 564df930be7Sderaadt for type in btree hash; do 565df930be7Sderaadt rm -f byte.file $TMP2 $TMP3 566df930be7Sderaadt for i in `sed 50q $DICT`; do 567df930be7Sderaadt echo p 568df930be7Sderaadt echo k$i 569df930be7Sderaadt echo d$i 570df930be7Sderaadt echo g 571df930be7Sderaadt echo k$i 572df930be7Sderaadt done > $TMP2 573df930be7Sderaadt $PROG -ilorder=$order -f byte.file -o $TMP3 $type $TMP2 574df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 575df930be7Sderaadt else 576df930be7Sderaadt echo "test13: $type/$order put failed" 577df930be7Sderaadt exit 1 578df930be7Sderaadt fi 579df930be7Sderaadt for i in `sed 50q $DICT`; do 580df930be7Sderaadt echo g 581df930be7Sderaadt echo k$i 582df930be7Sderaadt done > $TMP2 583bec2d00aSderaadt $PROG -s \ 584bec2d00aSderaadt -ilorder=$order -f byte.file -o $TMP3 $type $TMP2 585df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 586df930be7Sderaadt else 587df930be7Sderaadt echo "test13: $type/$order get failed" 588df930be7Sderaadt exit 1 589df930be7Sderaadt fi 590df930be7Sderaadt done 591df930be7Sderaadt done 592df930be7Sderaadt rm -f byte.file 593df930be7Sderaadt} 594df930be7Sderaadt 595df930be7Sderaadt# Try a variety of bucketsizes and fill factors for hashing 596df930be7Sderaadttest20() 597df930be7Sderaadt{ 598df930be7Sderaadt echo\ 599df930be7Sderaadt "Test 20: hash: bucketsize, fill factor; nelem 25000 cachesize 65536" 600df930be7Sderaadt echo "abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" | 601df930be7Sderaadt awk '{ 602df930be7Sderaadt for (i = 1; i <= 10000; ++i) { 603df930be7Sderaadt if (i % 34) 604df930be7Sderaadt s = substr($0, 1, i % 34); 605df930be7Sderaadt else 606df930be7Sderaadt s = substr($0, 1); 607df930be7Sderaadt printf("%s\n", s); 608df930be7Sderaadt } 609df930be7Sderaadt exit; 610df930be7Sderaadt }' > $TMP1 611df930be7Sderaadt sed 10000q $DICT | 612df930be7Sderaadt awk 'BEGIN { 613df930be7Sderaadt ds="abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg abcdefg" 614df930be7Sderaadt } 615df930be7Sderaadt { 616df930be7Sderaadt if (++i % 34) 617df930be7Sderaadt s = substr(ds, 1, i % 34); 618df930be7Sderaadt else 619df930be7Sderaadt s = substr(ds, 1); 620df930be7Sderaadt printf("p\nk%s\nd%s\n", $0, s); 621df930be7Sderaadt }' > $TMP2 622df930be7Sderaadt sed 10000q $DICT | 623df930be7Sderaadt awk '{ 624df930be7Sderaadt ++i; 625df930be7Sderaadt printf("g\nk%s\n", $0); 626df930be7Sderaadt }' >> $TMP2 627df930be7Sderaadt bsize=256 628df930be7Sderaadt for ffactor in 11 14 21; do 629df930be7Sderaadt echo " bucketsize $bsize, fill factor $ffactor" 630df930be7Sderaadt $PROG -o$TMP3 \ 631df930be7Sderaadt -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 632df930be7Sderaadt hash $TMP2 633df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 634df930be7Sderaadt else 635df930be7Sderaadt echo "test20: type hash:\ 636df930be7Sderaadtbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed" 637df930be7Sderaadt exit 1 638df930be7Sderaadt fi 639df930be7Sderaadt done 640df930be7Sderaadt bsize=512 641df930be7Sderaadt for ffactor in 21 28 43; do 642df930be7Sderaadt echo " bucketsize $bsize, fill factor $ffactor" 643df930be7Sderaadt $PROG -o$TMP3 \ 644df930be7Sderaadt -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 645df930be7Sderaadt hash $TMP2 646df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 647df930be7Sderaadt else 648df930be7Sderaadt echo "test20: type hash:\ 649df930be7Sderaadtbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed" 650df930be7Sderaadt exit 1 651df930be7Sderaadt fi 652df930be7Sderaadt done 653df930be7Sderaadt bsize=1024 654df930be7Sderaadt for ffactor in 43 57 85; do 655df930be7Sderaadt echo " bucketsize $bsize, fill factor $ffactor" 656df930be7Sderaadt $PROG -o$TMP3 \ 657df930be7Sderaadt -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 658df930be7Sderaadt hash $TMP2 659df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 660df930be7Sderaadt else 661df930be7Sderaadt echo "test20: type hash:\ 662df930be7Sderaadtbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed" 663df930be7Sderaadt exit 1 664df930be7Sderaadt fi 665df930be7Sderaadt done 666df930be7Sderaadt bsize=2048 667df930be7Sderaadt for ffactor in 85 114 171; do 668df930be7Sderaadt echo " bucketsize $bsize, fill factor $ffactor" 669df930be7Sderaadt $PROG -o$TMP3 \ 670df930be7Sderaadt -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 671df930be7Sderaadt hash $TMP2 672df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 673df930be7Sderaadt else 674df930be7Sderaadt echo "test20: type hash:\ 675df930be7Sderaadtbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed" 676df930be7Sderaadt exit 1 677df930be7Sderaadt fi 678df930be7Sderaadt done 679df930be7Sderaadt bsize=4096 680df930be7Sderaadt for ffactor in 171 228 341; do 681df930be7Sderaadt echo " bucketsize $bsize, fill factor $ffactor" 682df930be7Sderaadt $PROG -o$TMP3 \ 683df930be7Sderaadt -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 684df930be7Sderaadt hash $TMP2 685df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 686df930be7Sderaadt else 687df930be7Sderaadt echo "test20: type hash:\ 688df930be7Sderaadtbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed" 689df930be7Sderaadt exit 1 690df930be7Sderaadt fi 691df930be7Sderaadt done 692df930be7Sderaadt bsize=8192 693df930be7Sderaadt for ffactor in 341 455 683; do 694df930be7Sderaadt echo " bucketsize $bsize, fill factor $ffactor" 695df930be7Sderaadt $PROG -o$TMP3 \ 696df930be7Sderaadt -ibsize=$bsize,ffactor=$ffactor,nelem=25000,cachesize=65536\ 697df930be7Sderaadt hash $TMP2 698df930be7Sderaadt if (cmp -s $TMP1 $TMP3) ; then : 699df930be7Sderaadt else 700df930be7Sderaadt echo "test20: type hash:\ 701df930be7Sderaadtbsize=$bsize ffactor=$ffactor nelem=25000 cachesize=65536 failed" 702df930be7Sderaadt exit 1 703df930be7Sderaadt fi 704df930be7Sderaadt done 705df930be7Sderaadt} 706df930be7Sderaadt 707df930be7Sderaadtmain $* 708