xref: /sqlite-3.40.0/test/instrfault.test (revision a369d98b)
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