| 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 set ::testprefix incrblob_err | |
| 18 | |
| 19 ifcapable {!incrblob || !memdebug || !tclvar} { | |
| 20 finish_test | |
| 21 return | |
| 22 } | |
| 23 | |
| 24 source $testdir/malloc_common.tcl | |
| 25 | |
| 26 unset -nocomplain ::fd ::data | |
| 27 set ::fd [open [info script]] | |
| 28 set ::data [read $::fd] | |
| 29 close $::fd | |
| 30 | |
| 31 do_malloc_test 1 -tclprep { | |
| 32 set bytes [file size [info script]] | |
| 33 execsql { | |
| 34 CREATE TABLE blobs(k, v BLOB); | |
| 35 INSERT INTO blobs VALUES(1, zeroblob($::bytes)); | |
| 36 } | |
| 37 } -tclbody { | |
| 38 set ::blob [db incrblob blobs v 1] | |
| 39 fconfigure $::blob -translation binary | |
| 40 set rc [catch {puts -nonewline $::blob $::data}] | |
| 41 if {$rc} { error "out of memory" } | |
| 42 } | |
| 43 | |
| 44 do_malloc_test 2 -tclprep { | |
| 45 execsql { | |
| 46 CREATE TABLE blobs(k, v BLOB); | |
| 47 INSERT INTO blobs VALUES(1, $::data); | |
| 48 } | |
| 49 } -tclbody { | |
| 50 set ::blob [db incrblob blobs v 1] | |
| 51 set rc [catch {set ::r [read $::blob]}] | |
| 52 if {$rc} { | |
| 53 error "out of memory" | |
| 54 } elseif {$::r ne $::data} { | |
| 55 error "Bad data read..." | |
| 56 } | |
| 57 } | |
| 58 | |
| 59 do_malloc_test 3 -tclprep { | |
| 60 execsql { | |
| 61 CREATE TABLE blobs(k, v BLOB); | |
| 62 INSERT INTO blobs VALUES(1, $::data); | |
| 63 } | |
| 64 } -tclbody { | |
| 65 set ::blob [db incrblob blobs v 1] | |
| 66 set rc [catch {set ::r [read $::blob]}] | |
| 67 if {$rc} { | |
| 68 error "out of memory" | |
| 69 } elseif {$::r ne $::data} { | |
| 70 error "Bad data read..." | |
| 71 } | |
| 72 set rc [catch {close $::blob}] | |
| 73 if {$rc} { | |
| 74 error "out of memory" | |
| 75 } | |
| 76 } | |
| 77 | |
| 78 do_ioerr_test incrblob_err-4 -cksum 1 -sqlprep { | |
| 79 CREATE TABLE blobs(k, v BLOB); | |
| 80 INSERT INTO blobs VALUES(1, $::data); | |
| 81 } -tclbody { | |
| 82 set ::blob [db incrblob blobs v 1] | |
| 83 read $::blob | |
| 84 } | |
| 85 | |
| 86 do_ioerr_test incrblob_err-5 -cksum 1 -sqlprep { | |
| 87 CREATE TABLE blobs(k, v BLOB); | |
| 88 INSERT INTO blobs VALUES(1, zeroblob(length(CAST($::data AS BLOB)))); | |
| 89 } -tclbody { | |
| 90 set ::blob [db incrblob blobs v 1] | |
| 91 fconfigure $::blob -translation binary | |
| 92 puts -nonewline $::blob $::data | |
| 93 close $::blob | |
| 94 } | |
| 95 | |
| 96 do_ioerr_test incrblob_err-6 -cksum 1 -sqlprep { | |
| 97 CREATE TABLE blobs(k, v BLOB); | |
| 98 INSERT INTO blobs VALUES(1, $::data || $::data || $::data); | |
| 99 } -tclbody { | |
| 100 set ::blob [db incrblob blobs v 1] | |
| 101 fconfigure $::blob -translation binary | |
| 102 seek $::blob -20 end | |
| 103 puts -nonewline $::blob "12345678900987654321" | |
| 104 close $::blob | |
| 105 } | |
| 106 | |
| 107 do_ioerr_test incrblob_err-7 -cksum 1 -sqlprep { | |
| 108 PRAGMA auto_vacuum = 1; | |
| 109 CREATE TABLE blobs(k INTEGER PRIMARY KEY, v BLOB); | |
| 110 INSERT INTO blobs VALUES(1, zeroblob(500 * 1020)); | |
| 111 } -tclbody { | |
| 112 # Read some data from the end of the large blob inserted into table | |
| 113 # "blobs". This forces the IO error to occur while reading a pointer | |
| 114 # map page for the purposes of seeking to the end of the blob. | |
| 115 # | |
| 116 sqlite3 db2 test.db | |
| 117 set ::blob [db2 incrblob blobs v 1] | |
| 118 sqlite3_blob_read $::blob [expr 500*1020-20] 20 | |
| 119 close $::blob | |
| 120 } | |
| 121 catch {db2 close} | |
| 122 | |
| 123 do_ioerr_test incrblob_err-8 -cksum 1 -sqlprep { | |
| 124 PRAGMA auto_vacuum = 1; | |
| 125 CREATE TABLE blobs(k INTEGER PRIMARY KEY, v BLOB); | |
| 126 INSERT INTO blobs VALUES(1, zeroblob(500 * 1020)); | |
| 127 } -tclbody { | |
| 128 # Read some data from the end of the large blob inserted into table | |
| 129 # "blobs". This forces the IO error to occur while reading a pointer | |
| 130 # map page for the purposes of seeking to the end of the blob. | |
| 131 # | |
| 132 sqlite3 db2 test.db | |
| 133 set ::blob [db2 incrblob blobs v 1] | |
| 134 sqlite3_blob_write $::blob [expr 500*1020-20] 12345678900987654321 | |
| 135 close $::blob | |
| 136 } | |
| 137 | |
| 138 catch {db2 close} | |
| 139 | |
| 140 finish_test | |
| OLD | NEW |