Fix a case where a corrupt stat4 record could go unrecognized due to integer overflow.
[sqlite.git] / test / index4.test
blob4fbfa5291b17d3b1f1b8a40f5eede38b04fa633e
1 # 2011 July 9
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.  The
12 # focus of this file is testing the CREATE INDEX statement.
15 set testdir [file dirname $argv0]
16 source $testdir/tester.tcl
18 set testprefix index4
20 do_execsql_test 1.1 {
21   BEGIN;
22     CREATE TABLE t1(x);
23     INSERT INTO t1 VALUES(randomblob(102));
24     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --     2
25     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --     4
26     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --     8
27     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --    16
28     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --    32
29     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --    64
30     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --   128
31     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --   256
32     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --   512
33     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --  1024
34     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --  2048
35     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --  4096
36     INSERT INTO t1 SELECT randomblob(102) FROM t1;     --  8192
37     INSERT INTO t1 SELECT randomblob(102) FROM t1;     -- 16384
38     INSERT INTO t1 SELECT randomblob(102) FROM t1;     -- 32768
39     INSERT INTO t1 SELECT randomblob(102) FROM t1;     -- 65536
40   COMMIT;
43 do_execsql_test 1.2 {
44   CREATE INDEX i1 ON t1(x);
46 do_execsql_test 1.3 {
47   PRAGMA integrity_check 
48 } {ok}
50 # The same test again - this time with limited memory.
52 ifcapable memorymanage {
53   set soft_limit [sqlite3_soft_heap_limit 50000]
55   db close
56   sqlite3 db test.db
58   do_execsql_test 1.4 {
59     PRAGMA cache_size = 10;
60     CREATE INDEX i2 ON t1(x);
61   }
62   do_execsql_test 1.5 {
63     PRAGMA integrity_check 
64   } {ok}
66   sqlite3_soft_heap_limit $soft_limit
70 do_execsql_test 1.6 {
71   BEGIN;
72     DROP TABLE t1;
73     CREATE TABLE t1(x);
74     INSERT INTO t1 VALUES('a');
75     INSERT INTO t1 VALUES('b');
76     INSERT INTO t1 VALUES('c');
77     INSERT INTO t1 VALUES('d');
78     INSERT INTO t1 VALUES('e');
79     INSERT INTO t1 VALUES('f');
80     INSERT INTO t1 VALUES('g');
81     INSERT INTO t1 VALUES(NULL);
82     INSERT INTO t1 SELECT randomblob(1202) FROM t1;     --    16
83     INSERT INTO t1 SELECT randomblob(2202) FROM t1;     --    32
84     INSERT INTO t1 SELECT randomblob(3202) FROM t1;     --    64
85     INSERT INTO t1 SELECT randomblob(4202) FROM t1;     --   128
86     INSERT INTO t1 SELECT randomblob(5202) FROM t1;     --   256
87   COMMIT;
88   CREATE INDEX i1 ON t1(x); 
89   PRAGMA integrity_check
90 } {ok}
92 do_execsql_test 1.7 {
93   BEGIN;
94     DROP TABLE t1;
95     CREATE TABLE t1(x);
96     INSERT INTO t1 VALUES('a');
97   COMMIT;
98   CREATE INDEX i1 ON t1(x); 
99   PRAGMA integrity_check
100 } {ok}
102 do_execsql_test 1.8 {
103   BEGIN;
104     DROP TABLE t1;
105     CREATE TABLE t1(x);
106   COMMIT;
107   CREATE INDEX i1 ON t1(x); 
108   PRAGMA integrity_check
109 } {ok}
111 do_execsql_test 2.1 {
112   BEGIN;
113     CREATE TABLE t2(x);
114     INSERT INTO t2 VALUES(14);
115     INSERT INTO t2 VALUES(35);
116     INSERT INTO t2 VALUES(15);
117     INSERT INTO t2 VALUES(35);
118     INSERT INTO t2 VALUES(16);
119   COMMIT;
121 do_catchsql_test 2.2 {
122   CREATE UNIQUE INDEX i3 ON t2(x);
123 } {1 {UNIQUE constraint failed: t2.x}}
126 finish_test