AryaWu/sqlite
0
1# 2013 March 202#3# The author disclaims copyright to this source code. In place of4# 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# This file tests the effect of the mmap() or mremap() system calls 13# returning an error on the library. 14#15# If either mmap() or mremap() fails, SQLite should log an error 16# message, then continue accessing the database using read() and 17# write() exclusively.18#19 20set testdir [file dirname $argv0]21source $testdir/tester.tcl22set testprefix mmap223 24if {[llength [info commands test_syscall]]==0} {25 finish_test26 return27} 28ifcapable !mmap {29 finish_test30 return31}32 33db close34sqlite3_shutdown35test_sqlite3_log xLog36proc xLog {error_code msg} {37 if {[string match os_unix.c* $msg]} {38 lappend ::log $msg 39 }40}41 42foreach syscall {mmap mremap} {43 test_syscall uninstall 44 if {[catch {test_syscall install $syscall}]} continue45 46 for {set i 1} {$i < 20} {incr i} {47 reset_db48 execsql { PRAGMA mmap_size = 8000000 }49 50 test_syscall fault $i 151 test_syscall errno $syscall ENOMEM52 set ::log ""53 54 do_execsql_test 1.$syscall.$i.1 {55 CREATE TABLE t1(a, b, UNIQUE(a, b));56 INSERT INTO t1 VALUES(randomblob(1000), randomblob(1000));57 INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1;58 INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1;59 INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1;60 INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1;61 INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1;62 INSERT INTO t1 SELECT randomblob(1000), randomblob(1000) FROM t1;63 }64 65 set nFail [test_syscall fault 0 0]66 67 do_execsql_test 1.$syscall.$i.2 {68 SELECT count(*) FROM t1;69 PRAGMA integrity_check;70 } {64 ok}71 72 do_test 1.$syscall.$i.3 {73 expr {$nFail==0 || $nFail==1}74 } {1}75 76 do_test 1.$syscall.$i.4.nFail=$nFail {77 regexp ".*${syscall}.*" $::log78 } [expr $nFail>0]79 }80}81 82db close83test_syscall uninstall 84sqlite3_shutdown85test_sqlite3_log 86sqlite3_initialize87finish_test88 