xref: /sqlite-3.40.0/test/backup_malloc.test (revision e0251d44)
1dc2c4915Sdrh# 2009 January 30
20410302eSdanielk1977#
30410302eSdanielk1977# The author disclaims copyright to this source code.  In place of
40410302eSdanielk1977# a legal notice, here is a blessing:
50410302eSdanielk1977#
60410302eSdanielk1977#    May you do good and not evil.
70410302eSdanielk1977#    May you find forgiveness for yourself and forgive others.
80410302eSdanielk1977#    May you share freely, never taking more than you give.
90410302eSdanielk1977#
100410302eSdanielk1977#***********************************************************************
110410302eSdanielk1977# This file implements regression tests for SQLite library.  The
120410302eSdanielk1977# focus of this file is testing the handling of OOM errors by the
130410302eSdanielk1977# sqlite3_backup_XXX APIs.
140410302eSdanielk1977#
15dc2c4915Sdrh# $Id: backup_malloc.test,v 1.2 2009/02/04 22:46:47 drh Exp $
160410302eSdanielk1977
170410302eSdanielk1977set testdir [file dirname $argv0]
180410302eSdanielk1977source $testdir/tester.tcl
190410302eSdanielk1977
200410302eSdanielk1977source $testdir/malloc_common.tcl
210410302eSdanielk1977
220410302eSdanielk1977do_malloc_test backup_malloc-1 -tclprep {
230410302eSdanielk1977  execsql {
240410302eSdanielk1977    PRAGMA cache_size = 10;
250410302eSdanielk1977    BEGIN;
260410302eSdanielk1977    CREATE TABLE t1(a, b);
270410302eSdanielk1977    INSERT INTO t1 VALUES(1, randstr(1000,1000));
280410302eSdanielk1977    INSERT INTO t1 SELECT a+ 1, randstr(1000,1000) FROM t1;
290410302eSdanielk1977    INSERT INTO t1 SELECT a+ 2, randstr(1000,1000) FROM t1;
300410302eSdanielk1977    INSERT INTO t1 SELECT a+ 4, randstr(1000,1000) FROM t1;
310410302eSdanielk1977    INSERT INTO t1 SELECT a+ 8, randstr(1000,1000) FROM t1;
320410302eSdanielk1977    INSERT INTO t1 SELECT a+16, randstr(1000,1000) FROM t1;
330410302eSdanielk1977    INSERT INTO t1 SELECT a+32, randstr(1000,1000) FROM t1;
340410302eSdanielk1977    INSERT INTO t1 SELECT a+64, randstr(1000,1000) FROM t1;
350410302eSdanielk1977    CREATE INDEX i1 ON t1(b);
360410302eSdanielk1977    COMMIT;
370410302eSdanielk1977  }
380410302eSdanielk1977  sqlite3 db2 test2.db
390410302eSdanielk1977  execsql { PRAGMA cache_size = 10 } db2
400410302eSdanielk1977} -tclbody {
410410302eSdanielk1977
420410302eSdanielk1977  # Create a backup object.
430410302eSdanielk1977  #
440410302eSdanielk1977  set rc [catch {sqlite3_backup B db2 main db main}]
450410302eSdanielk1977  if {$rc && [sqlite3_errcode db2] == "SQLITE_NOMEM"} {
460410302eSdanielk1977    error "out of memory"
470410302eSdanielk1977  }
480410302eSdanielk1977
490410302eSdanielk1977  # Run the backup process some.
500410302eSdanielk1977  #
510410302eSdanielk1977  set rc [B step 50]
520410302eSdanielk1977  if {$rc == "SQLITE_NOMEM" || $rc == "SQLITE_IOERR_NOMEM"} {
530410302eSdanielk1977    error "out of memory"
540410302eSdanielk1977  }
550410302eSdanielk1977
560410302eSdanielk1977  # Update the database.
570410302eSdanielk1977  #
580410302eSdanielk1977  execsql { UPDATE t1 SET a = a + 1 }
590410302eSdanielk1977
600410302eSdanielk1977  # Finish doing the backup.
610410302eSdanielk1977  #
620410302eSdanielk1977  set rc [B step 5000]
630410302eSdanielk1977  if {$rc == "SQLITE_NOMEM" || $rc == "SQLITE_IOERR_NOMEM"} {
640410302eSdanielk1977    error "out of memory"
650410302eSdanielk1977  }
660410302eSdanielk1977
670410302eSdanielk1977  # Finalize the backup.
680410302eSdanielk1977  B finish
690410302eSdanielk1977} -cleanup {
700410302eSdanielk1977  catch { B finish }
71afdc5fa5Sshaneh  catch { db2 close }
720410302eSdanielk1977}
730410302eSdanielk1977
74afdc5fa5Sshanehdo_malloc_test backup_malloc-2 -tclprep {
750410302eSdanielk1977  sqlite3 db2 test2.db
760410302eSdanielk1977} -tclbody {
770410302eSdanielk1977  set rc [catch {sqlite3_backup B db2 temp db main}]
780410302eSdanielk1977  set errcode [sqlite3_errcode db2]
790410302eSdanielk1977  if {$rc && ($errcode == "SQLITE_NOMEM" || $errcode == "SQLITE_IOERR_NOMEM")} {
800410302eSdanielk1977    error "out of memory"
810410302eSdanielk1977  }
820410302eSdanielk1977} -cleanup {
830410302eSdanielk1977  catch { B finish }
840410302eSdanielk1977  db2 close
850410302eSdanielk1977}
860410302eSdanielk1977
87c6952addSdanreset_db
88c6952addSdando_execsql_test 3.0 {
89c6952addSdan  PRAGMA page_size = 16384;
90c6952addSdan  BEGIN;
91c6952addSdan  CREATE TABLE t1(a, b);
92c6952addSdan  INSERT INTO t1 VALUES(1, 2);
93c6952addSdan  COMMIT;
94c6952addSdan}
95c6952addSdan
96c6952addSdando_faultsim_test 3 -faults oom* -prep {
97c6952addSdan  catch { db close }
98*e0251d44Sdrh  catch { db2 close }
99c6952addSdan
100c6952addSdan  forcedelete test2.db
101c6952addSdan  sqlite3 db2 test2.db
102c6952addSdan  sqlite3 db test.db
103c6952addSdan  sqlite3_backup B db2 main db main
104c6952addSdan} -body {
105c6952addSdan
106c6952addSdan  set rc [B step 50]
107c6952addSdan  if {$rc == "SQLITE_NOMEM" || $rc == "SQLITE_IOERR_NOMEM"} {
108c6952addSdan    error "out of memory"
109c6952addSdan  }
110c6952addSdan
111c6952addSdan} -test {
112c6952addSdan  faultsim_test_result {0 {}}
113c6952addSdan  faultsim_integrity_check
114c6952addSdan
115c6952addSdan  # Finalize the backup.
116c6952addSdan  catch { B finish }
117c6952addSdan}
118c6952addSdan
1190410302eSdanielk1977finish_test
120