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