Home | History | Annotate | Download | only in test
      1 # 2007 May 1
      2 #
      3 # The author disclaims copyright to this source code.  In place of
      4 # a legal notice, here is a blessing:
      5 #
      6 #    May you do good and not evil.
      7 #    May you find forgiveness for yourself and forgive others.
      8 #    May you share freely, never taking more than you give.
      9 #
     10 #***********************************************************************
     11 #
     12 # $Id: incrblob_err.test,v 1.14 2008/07/18 17:16:27 drh Exp $
     13 #
     14 
     15 set testdir [file dirname $argv0]
     16 source $testdir/tester.tcl
     17 
     18 ifcapable {!incrblob  || !memdebug || !tclvar} {
     19   finish_test
     20   return
     21 }
     22 
     23 source $testdir/malloc_common.tcl
     24 
     25 unset -nocomplain ::fd ::data
     26 set ::fd [open [info script]]
     27 set ::data [read $::fd]
     28 close $::fd
     29 
     30 do_malloc_test 1 -tclprep {
     31   set bytes [file size [info script]]
     32   execsql {
     33     CREATE TABLE blobs(k, v BLOB);
     34     INSERT INTO blobs VALUES(1, zeroblob($::bytes));
     35   }
     36 } -tclbody {
     37   set ::blob [db incrblob blobs v 1]
     38   set rc [catch {puts -nonewline $::blob $::data}]
     39   if {$rc} { error "out of memory" }
     40 } 
     41 
     42 do_malloc_test 2 -tclprep {
     43   execsql {
     44     CREATE TABLE blobs(k, v BLOB);
     45     INSERT INTO blobs VALUES(1, $::data);
     46   }
     47 } -tclbody {
     48   set ::blob [db incrblob blobs v 1]
     49   set rc [catch {set ::r [read $::blob]}]
     50   if {$rc} { 
     51     error "out of memory" 
     52   } elseif {$::r ne $::data} {
     53     error "Bad data read..."
     54   }
     55 }
     56 
     57 do_malloc_test 3 -tclprep {
     58   execsql {
     59     CREATE TABLE blobs(k, v BLOB);
     60     INSERT INTO blobs VALUES(1, $::data);
     61   }
     62 } -tclbody {
     63   set ::blob [db incrblob blobs v 1]
     64   set rc [catch {set ::r [read $::blob]}]
     65   if {$rc} { 
     66     error "out of memory" 
     67   } elseif {$::r ne $::data} {
     68     error "Bad data read..."
     69   }
     70   set rc [catch {close $::blob}]
     71   if {$rc} { 
     72     error "out of memory" 
     73   }
     74 } 
     75 
     76 
     77 do_ioerr_test incrblob_err-4 -cksum 1 -sqlprep {
     78   CREATE TABLE blobs(k, v BLOB);
     79   INSERT INTO blobs VALUES(1, $::data);
     80 } -tclbody {
     81   set ::blob [db incrblob blobs v 1]
     82   read $::blob
     83 }
     84 
     85 do_ioerr_test incrblob_err-5 -cksum 1 -sqlprep {
     86   CREATE TABLE blobs(k, v BLOB);
     87   INSERT INTO blobs VALUES(1, zeroblob(length(CAST($::data AS BLOB))));
     88 } -tclbody {
     89   set ::blob [db incrblob blobs v 1]
     90   puts -nonewline $::blob $::data
     91   close $::blob
     92 }
     93 
     94 do_ioerr_test incrblob_err-6 -cksum 1 -sqlprep {
     95   CREATE TABLE blobs(k, v BLOB);
     96   INSERT INTO blobs VALUES(1, $::data || $::data || $::data);
     97 } -tclbody {
     98   set ::blob [db incrblob blobs v 1]
     99   seek $::blob -20 end
    100   puts -nonewline $::blob "12345678900987654321"
    101   close $::blob
    102 }
    103 
    104 do_ioerr_test incrblob_err-7 -cksum 1 -sqlprep {
    105   PRAGMA auto_vacuum = 1;
    106   CREATE TABLE blobs(k INTEGER PRIMARY KEY, v BLOB);
    107   INSERT INTO blobs VALUES(1, zeroblob(500 * 1020));
    108 } -tclbody {
    109   # Read some data from the end of the large blob inserted into table 
    110   # "blobs". This forces the IO error to occur while reading a pointer
    111   # map page for the purposes of seeking to the end of the blob.
    112   #
    113   sqlite3 db2 test.db
    114   set ::blob [db2 incrblob blobs v 1]
    115   sqlite3_blob_read $::blob [expr 500*1020-20] 20
    116   close $::blob
    117 }
    118 catch {db2 close}
    119 
    120 do_ioerr_test incrblob_err-8 -cksum 1 -sqlprep {
    121   PRAGMA auto_vacuum = 1;
    122   CREATE TABLE blobs(k INTEGER PRIMARY KEY, v BLOB);
    123   INSERT INTO blobs VALUES(1, zeroblob(500 * 1020));
    124 } -tclbody {
    125   # Read some data from the end of the large blob inserted into table 
    126   # "blobs". This forces the IO error to occur while reading a pointer
    127   # map page for the purposes of seeking to the end of the blob.
    128   #
    129   sqlite3 db2 test.db
    130   set ::blob [db2 incrblob blobs v 1]
    131   sqlite3_blob_write $::blob [expr 500*1020-20] 12345678900987654321
    132   close $::blob
    133 }
    134 
    135 catch {db2 close}
    136 
    137 finish_test
    138