persistentstorage/sqlite3api/TEST/TclScript/incrblob_err.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     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