diff options
Diffstat (limited to 'libraries/sqlite/unix/sqlite-3.5.1/test/bigrow.test')
-rw-r--r-- | libraries/sqlite/unix/sqlite-3.5.1/test/bigrow.test | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/libraries/sqlite/unix/sqlite-3.5.1/test/bigrow.test b/libraries/sqlite/unix/sqlite-3.5.1/test/bigrow.test new file mode 100644 index 0000000..fa59c36 --- /dev/null +++ b/libraries/sqlite/unix/sqlite-3.5.1/test/bigrow.test | |||
@@ -0,0 +1,223 @@ | |||
1 | # 2001 September 23 | ||
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 | # This file implements regression tests for SQLite library. The | ||
12 | # focus of this file is stressing the library by putting large amounts | ||
13 | # of data in a single row of a table. | ||
14 | # | ||
15 | # $Id: bigrow.test,v 1.5 2004/08/07 23:54:48 drh Exp $ | ||
16 | |||
17 | set testdir [file dirname $argv0] | ||
18 | source $testdir/tester.tcl | ||
19 | |||
20 | # Make a big string that we can use for test data | ||
21 | # | ||
22 | do_test bigrow-1.0 { | ||
23 | set ::bigstr {} | ||
24 | for {set i 1} {$i<=9999} {incr i} { | ||
25 | set sep [string index "abcdefghijklmnopqrstuvwxyz" [expr {$i%26}]] | ||
26 | append ::bigstr "$sep [format %04d $i] " | ||
27 | } | ||
28 | string length $::bigstr | ||
29 | } {69993} | ||
30 | |||
31 | # Make a table into which we can insert some but records. | ||
32 | # | ||
33 | do_test bigrow-1.1 { | ||
34 | execsql { | ||
35 | CREATE TABLE t1(a text, b text, c text); | ||
36 | SELECT name FROM sqlite_master | ||
37 | WHERE type='table' OR type='index' | ||
38 | ORDER BY name | ||
39 | } | ||
40 | } {t1} | ||
41 | |||
42 | do_test bigrow-1.2 { | ||
43 | set ::big1 [string range $::bigstr 0 65519] | ||
44 | set sql "INSERT INTO t1 VALUES('abc'," | ||
45 | append sql "'$::big1', 'xyz');" | ||
46 | execsql $sql | ||
47 | execsql {SELECT a, c FROM t1} | ||
48 | } {abc xyz} | ||
49 | do_test bigrow-1.3 { | ||
50 | execsql {SELECT b FROM t1} | ||
51 | } [list $::big1] | ||
52 | do_test bigrow-1.4 { | ||
53 | set ::big2 [string range $::bigstr 0 65520] | ||
54 | set sql "INSERT INTO t1 VALUES('abc2'," | ||
55 | append sql "'$::big2', 'xyz2');" | ||
56 | set r [catch {execsql $sql} msg] | ||
57 | lappend r $msg | ||
58 | } {0 {}} | ||
59 | do_test bigrow-1.4.1 { | ||
60 | execsql {SELECT b FROM t1 ORDER BY c} | ||
61 | } [list $::big1 $::big2] | ||
62 | do_test bigrow-1.4.2 { | ||
63 | execsql {SELECT c FROM t1 ORDER BY c} | ||
64 | } {xyz xyz2} | ||
65 | do_test bigrow-1.4.3 { | ||
66 | execsql {DELETE FROM t1 WHERE a='abc2'} | ||
67 | execsql {SELECT c FROM t1} | ||
68 | } {xyz} | ||
69 | |||
70 | do_test bigrow-1.5 { | ||
71 | execsql { | ||
72 | UPDATE t1 SET a=b, b=a; | ||
73 | SELECT b,c FROM t1 | ||
74 | } | ||
75 | } {abc xyz} | ||
76 | do_test bigrow-1.6 { | ||
77 | execsql { | ||
78 | SELECT * FROM t1 | ||
79 | } | ||
80 | } [list $::big1 abc xyz] | ||
81 | do_test bigrow-1.7 { | ||
82 | execsql { | ||
83 | INSERT INTO t1 VALUES('1','2','3'); | ||
84 | INSERT INTO t1 VALUES('A','B','C'); | ||
85 | SELECT b FROM t1 WHERE a=='1'; | ||
86 | } | ||
87 | } {2} | ||
88 | do_test bigrow-1.8 { | ||
89 | execsql "SELECT b FROM t1 WHERE a=='$::big1'" | ||
90 | } {abc} | ||
91 | do_test bigrow-1.9 { | ||
92 | execsql "SELECT b FROM t1 WHERE a!='$::big1' ORDER BY a" | ||
93 | } {2 B} | ||
94 | |||
95 | # Try doing some indexing on big columns | ||
96 | # | ||
97 | do_test bigrow-2.1 { | ||
98 | execsql { | ||
99 | CREATE INDEX i1 ON t1(a) | ||
100 | } | ||
101 | execsql "SELECT b FROM t1 WHERE a=='$::big1'" | ||
102 | } {abc} | ||
103 | do_test bigrow-2.2 { | ||
104 | execsql { | ||
105 | UPDATE t1 SET a=b, b=a | ||
106 | } | ||
107 | execsql "SELECT b FROM t1 WHERE a=='abc'" | ||
108 | } [list $::big1] | ||
109 | do_test bigrow-2.3 { | ||
110 | execsql { | ||
111 | UPDATE t1 SET a=b, b=a | ||
112 | } | ||
113 | execsql "SELECT b FROM t1 WHERE a=='$::big1'" | ||
114 | } {abc} | ||
115 | catch {unset ::bigstr} | ||
116 | catch {unset ::big1} | ||
117 | catch {unset ::big2} | ||
118 | |||
119 | # Mosts of the tests above were created back when rows were limited in | ||
120 | # size to 64K. Now rows can be much bigger. Test that logic. Also | ||
121 | # make sure things work correctly at the transition boundries between | ||
122 | # row sizes of 256 to 257 bytes and from 65536 to 65537 bytes. | ||
123 | # | ||
124 | # We begin by testing the 256..257 transition. | ||
125 | # | ||
126 | do_test bigrow-3.1 { | ||
127 | execsql { | ||
128 | DELETE FROM t1; | ||
129 | INSERT INTO t1(a,b,c) VALUES('one','abcdefghijklmnopqrstuvwxyz0123','hi'); | ||
130 | } | ||
131 | execsql {SELECT a,length(b),c FROM t1} | ||
132 | } {one 30 hi} | ||
133 | do_test bigrow-3.2 { | ||
134 | execsql { | ||
135 | UPDATE t1 SET b=b||b; | ||
136 | UPDATE t1 SET b=b||b; | ||
137 | UPDATE t1 SET b=b||b; | ||
138 | } | ||
139 | execsql {SELECT a,length(b),c FROM t1} | ||
140 | } {one 240 hi} | ||
141 | for {set i 1} {$i<10} {incr i} { | ||
142 | do_test bigrow-3.3.$i { | ||
143 | execsql "UPDATE t1 SET b=b||'$i'" | ||
144 | execsql {SELECT a,length(b),c FROM t1} | ||
145 | } "one [expr {240+$i}] hi" | ||
146 | } | ||
147 | |||
148 | # Now test the 65536..65537 row-size transition. | ||
149 | # | ||
150 | do_test bigrow-4.1 { | ||
151 | execsql { | ||
152 | DELETE FROM t1; | ||
153 | INSERT INTO t1(a,b,c) VALUES('one','abcdefghijklmnopqrstuvwxyz0123','hi'); | ||
154 | } | ||
155 | execsql {SELECT a,length(b),c FROM t1} | ||
156 | } {one 30 hi} | ||
157 | do_test bigrow-4.2 { | ||
158 | execsql { | ||
159 | UPDATE t1 SET b=b||b; | ||
160 | UPDATE t1 SET b=b||b; | ||
161 | UPDATE t1 SET b=b||b; | ||
162 | UPDATE t1 SET b=b||b; | ||
163 | UPDATE t1 SET b=b||b; | ||
164 | UPDATE t1 SET b=b||b; | ||
165 | UPDATE t1 SET b=b||b; | ||
166 | UPDATE t1 SET b=b||b; | ||
167 | UPDATE t1 SET b=b||b; | ||
168 | UPDATE t1 SET b=b||b; | ||
169 | UPDATE t1 SET b=b||b; | ||
170 | UPDATE t1 SET b=b||b; | ||
171 | } | ||
172 | execsql {SELECT a,length(b),c FROM t1} | ||
173 | } {one 122880 hi} | ||
174 | do_test bigrow-4.3 { | ||
175 | execsql { | ||
176 | UPDATE t1 SET b=substr(b,1,65515) | ||
177 | } | ||
178 | execsql {SELECT a,length(b),c FROM t1} | ||
179 | } {one 65515 hi} | ||
180 | for {set i 1} {$i<10} {incr i} { | ||
181 | do_test bigrow-4.4.$i { | ||
182 | execsql "UPDATE t1 SET b=b||'$i'" | ||
183 | execsql {SELECT a,length(b),c FROM t1} | ||
184 | } "one [expr {65515+$i}] hi" | ||
185 | } | ||
186 | |||
187 | # Check to make sure the library recovers safely if a row contains | ||
188 | # too much data. | ||
189 | # | ||
190 | do_test bigrow-5.1 { | ||
191 | execsql { | ||
192 | DELETE FROM t1; | ||
193 | INSERT INTO t1(a,b,c) VALUES('one','abcdefghijklmnopqrstuvwxyz0123','hi'); | ||
194 | } | ||
195 | execsql {SELECT a,length(b),c FROM t1} | ||
196 | } {one 30 hi} | ||
197 | set i 1 | ||
198 | for {set sz 60} {$sz<1048560} {incr sz $sz} { | ||
199 | do_test bigrow-5.2.$i { | ||
200 | execsql { | ||
201 | UPDATE t1 SET b=b||b; | ||
202 | SELECT a,length(b),c FROM t1; | ||
203 | } | ||
204 | } "one $sz hi" | ||
205 | incr i | ||
206 | } | ||
207 | do_test bigrow-5.3 { | ||
208 | catchsql {UPDATE t1 SET b=b||b} | ||
209 | } {0 {}} | ||
210 | do_test bigrow-5.4 { | ||
211 | execsql {SELECT length(b) FROM t1} | ||
212 | } 1966080 | ||
213 | do_test bigrow-5.5 { | ||
214 | catchsql {UPDATE t1 SET b=b||b} | ||
215 | } {0 {}} | ||
216 | do_test bigrow-5.6 { | ||
217 | execsql {SELECT length(b) FROM t1} | ||
218 | } 3932160 | ||
219 | do_test bigrow-5.99 { | ||
220 | execsql {DROP TABLE t1} | ||
221 | } {} | ||
222 | |||
223 | finish_test | ||