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