1a2bfa046Sdan# 2016 November 4 2a2bfa046Sdan# 3a2bfa046Sdan# The author disclaims copyright to this source code. In place of 4a2bfa046Sdan# a legal notice, here is a blessing: 5a2bfa046Sdan# 6a2bfa046Sdan# May you do good and not evil. 7a2bfa046Sdan# May you find forgiveness for yourself and forgive others. 8a2bfa046Sdan# May you share freely, never taking more than you give. 9a2bfa046Sdan# 10a2bfa046Sdan#*********************************************************************** 11a2bfa046Sdan# This file implements regression tests for SQLite library. The 12a2bfa046Sdan# focus of this file is testing OOM error handling within the built-in 13a2bfa046Sdan# INSTR() function. 14a2bfa046Sdan# 15a2bfa046Sdan 16a2bfa046Sdan 17a2bfa046Sdanset testdir [file dirname $argv0] 18a2bfa046Sdansource $testdir/tester.tcl 19a2bfa046Sdanset testprefix instrfault 20a2bfa046Sdan 21a2bfa046Sdan# Use big NEEDLE and HAYSTACK strings. Strings so large they cannot 22a2bfa046Sdan# use lookaside buffers. 23a2bfa046Sdan# 24a2bfa046Sdanset ::NEEDLE [string repeat "abcdefghijklmnopqrstuvwxyz" 10] 25a2bfa046Sdanset ::HAYSTACK "[string repeat 123 10]$NEEDLE[string repeat 456 10]" 26a2bfa046Sdan 27a2bfa046Sdanforeach {enc} { 28a2bfa046Sdan utf8 29a2bfa046Sdan utf16 30a2bfa046Sdan} { 31a2bfa046Sdan reset_db 323043b532Sdan sqlite3_db_config_lookaside db 0 0 0 333043b532Sdan 34a2bfa046Sdan execsql "PRAGMA encoding = $enc" 35a2bfa046Sdan do_execsql_test 1.$enc.1 { 36a2bfa046Sdan CREATE TABLE t1(n, h); 37a2bfa046Sdan INSERT INTO t1 VALUES($::NEEDLE, $::HAYSTACK); 38a2bfa046Sdan } {} 39a2bfa046Sdan 40a2bfa046Sdan do_faultsim_test 1.$enc.1 -faults oom-t* -prep { 41a2bfa046Sdan execsql { SELECT instr(h, n) FROM t1 } 42a2bfa046Sdan } -body { 43a2bfa046Sdan execsql { SELECT instr(h, n) FROM t1 } 44a2bfa046Sdan } -test { 45a2bfa046Sdan faultsim_test_result {0 31} 46a2bfa046Sdan } 47a2bfa046Sdan 48a2bfa046Sdan do_faultsim_test 1.$enc.2 -faults oom-t* -prep { 49a2bfa046Sdan execsql { SELECT instr($::HAYSTACK, $::NEEDLE) FROM t1 } 50a2bfa046Sdan } -body { 51a2bfa046Sdan execsql { SELECT instr($::HAYSTACK, $::NEEDLE) FROM t1 } 52a2bfa046Sdan } -test { 53a2bfa046Sdan faultsim_test_result {0 31} 54a2bfa046Sdan } 55a2bfa046Sdan 56a2bfa046Sdan do_faultsim_test 1.$enc.3 -faults oom-t* -prep { 57a2bfa046Sdan set ::stmt [sqlite3_prepare_v2 db "SELECT instr(?, ?)" -1 dummy] 58a2bfa046Sdan sqlite3_bind_text $::stmt 1 $::HAYSTACK [string length $::HAYSTACK] 59a2bfa046Sdan sqlite3_bind_text $::stmt 2 $::NEEDLE [string length $::NEEDLE] 60a2bfa046Sdan } -body { 61a2bfa046Sdan set rc [sqlite3_step $::stmt] 62a2bfa046Sdan if {$rc=="SQLITE_NOMEM"} { error "out of memory" } 63a2bfa046Sdan sqlite3_column_int $::stmt 0 64a2bfa046Sdan } -test { 65a2bfa046Sdan faultsim_test_result {0 31} 66a2bfa046Sdan sqlite3_finalize $::stmt 67a2bfa046Sdan } 683043b532Sdan 693043b532Sdan do_faultsim_test 1.$enc.4 -faults oom-t* -prep { 703043b532Sdan set ::stmt [sqlite3_prepare_v2 db "SELECT instr(?, ?)" -1 dummy] 713043b532Sdan sqlite3_bind_blob $::stmt 1 $::HAYSTACK [string length $::HAYSTACK] 72*a369d98bSdan sqlite3_bind_blob $::stmt 2 $::NEEDLE [string length $::NEEDLE] 733043b532Sdan } -body { 743043b532Sdan set rc [sqlite3_step $::stmt] 753043b532Sdan if {$rc=="SQLITE_NOMEM"} { error "out of memory" } 763043b532Sdan sqlite3_column_int $::stmt 0 773043b532Sdan } -test { 783043b532Sdan faultsim_test_result {0 31} 793043b532Sdan sqlite3_finalize $::stmt 803043b532Sdan } 813043b532Sdan 823043b532Sdan do_execsql_test 1.$enc.5.0 { 833043b532Sdan CREATE TABLE h1(a, b); 843043b532Sdan INSERT INTO h1 VALUES('abcdefg%200hijkl', randomblob(200)); 853043b532Sdan INSERT INTO h1 SELECT b, a FROM h1; 863043b532Sdan } 873043b532Sdan do_faultsim_test 1.$enc.5 -faults oom-t* -body { 883043b532Sdan execsql { SELECT rowid FROM h1 WHERE instr(a,b) } 893043b532Sdan } -test {} 90a2bfa046Sdan} 91a2bfa046Sdan 92a2bfa046Sdanfinish_test 93