github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/backup_malloc.test (about)

     1  # 2009 January 30
     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  # This file implements regression tests for SQLite library.  The
    12  # focus of this file is testing the handling of OOM errors by the
    13  # sqlite3_backup_XXX APIs.
    14  #
    15  # $Id: backup_malloc.test,v 1.2 2009/02/04 22:46:47 drh Exp $
    16  
    17  set testdir [file dirname $argv0]
    18  source $testdir/tester.tcl
    19  
    20  source $testdir/malloc_common.tcl
    21  
    22  do_malloc_test backup_malloc-1 -tclprep {
    23    execsql {
    24      PRAGMA cache_size = 10;
    25      BEGIN;
    26      CREATE TABLE t1(a, b);
    27      INSERT INTO t1 VALUES(1, randstr(1000,1000));
    28      INSERT INTO t1 SELECT a+ 1, randstr(1000,1000) FROM t1;
    29      INSERT INTO t1 SELECT a+ 2, randstr(1000,1000) FROM t1;
    30      INSERT INTO t1 SELECT a+ 4, randstr(1000,1000) FROM t1;
    31      INSERT INTO t1 SELECT a+ 8, randstr(1000,1000) FROM t1;
    32      INSERT INTO t1 SELECT a+16, randstr(1000,1000) FROM t1;
    33      INSERT INTO t1 SELECT a+32, randstr(1000,1000) FROM t1;
    34      INSERT INTO t1 SELECT a+64, randstr(1000,1000) FROM t1;
    35      CREATE INDEX i1 ON t1(b);
    36      COMMIT;
    37    }
    38    sqlite3 db2 test2.db
    39    execsql { PRAGMA cache_size = 10 } db2
    40  } -tclbody {
    41  
    42    # Create a backup object.
    43    #
    44    set rc [catch {sqlite3_backup B db2 main db main}]
    45    if {$rc && [sqlite3_errcode db2] == "SQLITE_NOMEM"} {
    46      error "out of memory"
    47    }
    48  
    49    # Run the backup process some.
    50    #
    51    set rc [B step 50]
    52    if {$rc == "SQLITE_NOMEM" || $rc == "SQLITE_IOERR_NOMEM"} {
    53      error "out of memory"
    54    }
    55    
    56    # Update the database.
    57    #
    58    execsql { UPDATE t1 SET a = a + 1 }
    59    
    60    # Finish doing the backup.
    61    #
    62    set rc [B step 5000]
    63    if {$rc == "SQLITE_NOMEM" || $rc == "SQLITE_IOERR_NOMEM"} {
    64      error "out of memory"
    65    }
    66   
    67    # Finalize the backup.
    68    B finish
    69  } -cleanup {
    70    catch { B finish }
    71    catch { db2 close }
    72  }
    73  
    74  do_malloc_test backup_malloc-2 -tclprep {
    75    sqlite3 db2 test2.db
    76  } -tclbody {
    77    set rc [catch {sqlite3_backup B db2 temp db main}]
    78    set errcode [sqlite3_errcode db2]
    79    if {$rc && ($errcode == "SQLITE_NOMEM" || $errcode == "SQLITE_IOERR_NOMEM")} {
    80      error "out of memory"
    81    }
    82  } -cleanup {
    83    catch { B finish }
    84    db2 close
    85  }
    86  
    87  reset_db
    88  do_execsql_test 3.0 {
    89    PRAGMA page_size = 16384;
    90    BEGIN;
    91    CREATE TABLE t1(a, b);
    92    INSERT INTO t1 VALUES(1, 2);
    93    COMMIT;
    94  }
    95  
    96  do_faultsim_test 3 -faults oom* -prep {
    97    catch { db close }
    98    catch { db2 close }
    99  
   100    forcedelete test2.db
   101    sqlite3 db2 test2.db
   102    sqlite3 db test.db
   103    sqlite3_backup B db2 main db main
   104  } -body {
   105  
   106    set rc [B step 50]
   107    if {$rc == "SQLITE_NOMEM" || $rc == "SQLITE_IOERR_NOMEM"} {
   108      error "out of memory"
   109    }
   110  
   111  } -test {
   112    faultsim_test_result {0 {}} 
   113    faultsim_integrity_check
   114    
   115    # Finalize the backup.
   116    catch { B finish }
   117  }
   118  
   119  finish_test