| OLD | NEW | 
 | (Empty) | 
|    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 |  | 
| OLD | NEW |