gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/incrblob_err.test (about)

     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  || !tclvar} {
    20    finish_test
    21    return
    22  }
    23  
    24  source $testdir/malloc_common.tcl
    25  
    26  unset -nocomplain ::fd ::data
    27  set ::fd [open $::cmdlinearg(INFO_SCRIPT)]
    28  set ::data [read $::fd]
    29  close $::fd
    30  
    31  do_malloc_test 1 -tclprep {
    32    set bytes [file size $::cmdlinearg(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