github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/mmap2.test (about) 1 # 2013 March 20 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 # 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 20 set testdir [file dirname $argv0] 21 source $testdir/tester.tcl 22 set testprefix mmap2 23 24 if {$::tcl_platform(platform)!="unix" || [test_syscall defaultvfs] != "unix"} { 25 finish_test 26 return 27 } 28 ifcapable !mmap { 29 finish_test 30 return 31 } 32 33 db close 34 sqlite3_shutdown 35 test_sqlite3_log xLog 36 proc xLog {error_code msg} { 37 if {[string match os_unix.c* $msg]} { 38 lappend ::log $msg 39 } 40 } 41 42 foreach syscall {mmap mremap} { 43 test_syscall uninstall 44 if {[catch {test_syscall install $syscall}]} continue 45 46 for {set i 1} {$i < 20} {incr i} { 47 reset_db 48 execsql { PRAGMA mmap_size = 8000000 } 49 50 test_syscall fault $i 1 51 test_syscall errno $syscall ENOMEM 52 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}.*" $::log 78 } [expr $nFail>0] 79 } 80 } 81 82 db close 83 test_syscall uninstall 84 sqlite3_shutdown 85 test_sqlite3_log 86 sqlite3_initialize 87 finish_test