15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 2007 May 10
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#***********************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This file tests malloc failures in concert with fuzzy SQL generation.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# $Id: fuzz_malloc.test,v 1.10 2008/08/20 16:35:10 drh Exp $
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set testdir [file dirname $argv0]
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)source $testdir/tester.tcl
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ifcapable !memdebug {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  finish_test
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)source $testdir/malloc_common.tcl
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)source $testdir/fuzz_common.tcl
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if {[info exists G(isquick)]} {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set ::REPEATS 20
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} elseif {[info exists G(issoak)]} {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set ::REPEATS 100
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} else {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set ::REPEATS 40
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Usage: do_fuzzy_malloc_test <testname> ?<options>?
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     -template
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     -sqlprep
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     -repeats
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#     
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)proc do_fuzzy_malloc_test {testname args} {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set ::fuzzyopts(-repeats) $::REPEATS
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set ::fuzzyopts(-sqlprep) {}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  array set ::fuzzyopts $args
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3_memdebug_fail -1
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db close
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file delete test.db test.db-journal
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3 db test.db
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set ::prep $::fuzzyopts(-sqlprep)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  execsql $::prep
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set jj 0
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for {set ii 0} {$ii < $::fuzzyopts(-repeats)} {incr ii} {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expr srand($jj)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    incr jj
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set ::sql [subst $::fuzzyopts(-template)]
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # puts fuzyy-sql=\[$::sql\]; flush stdout
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    foreach {rc res} [catchsql "$::sql"] {}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if {$rc==0} {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      do_malloc_test $testname-$ii -sqlbody $::sql -sqlprep $::prep
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      incr ii -1
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#----------------------------------------------------------------
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Test malloc failure during parsing (and execution) of a fuzzily 
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# generated expressions.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do_fuzzy_malloc_test fuzzy_malloc-1 -template {Select [Expr]}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do_fuzzy_malloc_test fuzzy_malloc-2 -template {[Select]}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set ::SQLPREP {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BEGIN;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CREATE TABLE abc(a, b, c);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CREATE TABLE def(a, b, c);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CREATE TABLE ghi(a, b, c);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSERT INTO abc VALUES(1.5, 3, 'a short string');
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSERT INTO def VALUES(NULL, X'ABCDEF', 
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        'a longer string. Long enough that it doesn''t fit in Mem.zShort');
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSERT INTO ghi VALUES(zeroblob(1000), 'hello world', -1257900987654321);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMMIT;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set ::TableList  [list abc def ghi]
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set ::ColumnList [list a b c]
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do_fuzzy_malloc_test fuzzy_malloc-3 \
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  -template {[Select]}              \
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  -sqlprep $::SQLPREP
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)finish_test
95