Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Check in some changes to fuzz.test. Still failing. (CVS 3985) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
6f346a6be9803b84260509352315f8fa |
User & Date: | danielk1977 2007-05-11 16:58:04.000 |
Context
2007-05-12
| ||
06:11 | Bugfixes for assert() failures found by fuzz.test. (CVS 3986) (check-in: 2e80736d57 user: danielk1977 tags: trunk) | |
2007-05-11
| ||
16:58 | Check in some changes to fuzz.test. Still failing. (CVS 3985) (check-in: 6f346a6be9 user: danielk1977 tags: trunk) | |
12:30 | Avoid multiple storage class specifiers ("static extern") in the amalagmation. (CVS 3984) (check-in: 2f70159b1d user: drh tags: trunk) | |
Changes
Changes to test/fuzz.test.
︙ | ︙ | |||
9 10 11 12 13 14 15 | # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is generating semi-random strings of SQL # (a.k.a. "fuzz") and sending it into the parser to try to generate # errors. # | | > > > | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # #*********************************************************************** # This file implements regression tests for SQLite library. The # focus of this file is generating semi-random strings of SQL # (a.k.a. "fuzz") and sending it into the parser to try to generate # errors. # # $Id: fuzz.test,v 1.7 2007/05/11 16:58:04 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl set ::REPEATS 20 set ::REPEATS 5000 proc fuzz {TemplateList} { set n [llength $TemplateList] set i [expr {int(rand()*$n)}] return [uplevel 1 subst -novar [list [lindex $TemplateList $i]]] } # Fuzzy generation primitives: |
︙ | ︙ | |||
70 71 72 73 74 75 76 | # Return the complete text of an SQL expression. # set ::ExprDepth 0 proc Expr { {c {}} } { incr ::ExprDepth set TemplateList [concat $c {[Literal]}] | | > > > > > > > > > > > | 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | # Return the complete text of an SQL expression. # set ::ExprDepth 0 proc Expr { {c {}} } { incr ::ExprDepth set TemplateList [concat $c {[Literal]}] if {$::ExprDepth < 5} { lappend TemplateList \ {[Expr $c] [BinaryOp] [Expr $c]} \ {[UnaryOp] [Expr $c]} \ {[Expr $c] ISNULL} \ {[Expr $c] NOTNULL} \ {CAST([Expr $c] AS blob)} \ {CAST([Expr $c] AS text)} \ {CAST([Expr $c] AS integer)} \ {CAST([Expr $c] AS real)} \ {abs([Expr])} \ {coalesce([Expr], [Expr])} \ {hex([Expr])} \ {length([Expr])} \ {lower([Expr])} \ {upper([Expr])} \ {quote([Expr])} \ {random()} \ {randomblob(min(max([Expr],1), 500))} \ {typeof([Expr])} \ {substr([Expr],[Expr],[Expr])} \ {CASE WHEN [Expr $c] THEN [Expr $c] ELSE [Expr $c] END} \ {[Literal]} {[Literal]} {[Literal]} } if {$::SelectDepth < 10} { lappend TemplateList \ {([Select 1])} \ {[Expr $c] IN ([Select 1])} \ |
︙ | ︙ | |||
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | set TemplateList [concat sqlite_master $::TableList] fuzz $TemplateList } # Return a SELECT statement. # set ::SelectDepth 0 proc Select {{isExpr 0}} { incr ::SelectDepth set TemplateList { {SELECT [Expr]} {SELECT [Literal]} } if {$::SelectDepth < 5} { lappend TemplateList \ {SELECT [Expr] FROM ([Select])} \ | > | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 | set TemplateList [concat sqlite_master $::TableList] fuzz $TemplateList } # Return a SELECT statement. # set ::SelectDepth 0 set ::ColumnList [list] proc Select {{isExpr 0}} { incr ::SelectDepth set TemplateList { {SELECT [Expr]} {SELECT [Literal]} } if {$::SelectDepth < 5} { lappend TemplateList \ {SELECT [Expr] FROM ([Select])} \ {SELECT [Expr $::ColumnList] FROM [Table]} \ if {0 == $isExpr} { lappend TemplateList \ {SELECT [Expr], [Expr] FROM ([Select]) ORDER BY [Expr]} \ {SELECT * FROM ([Select]) ORDER BY [Expr]} \ {SELECT * FROM [Table]} \ {SELECT * FROM [Table] WHERE [Expr $::ColumnList]} \ {SELECT * FROM [Table],[Table] AS t2 WHERE [Expr $::ColumnList] LIMIT 1} } } set res [fuzz $TemplateList] incr ::SelectDepth -1 set res } # Generate and return a fuzzy INSERT statement. # proc Insert {} { set TemplateList { {INSERT INTO [Table] VALUES([Expr], [Expr], [Expr]);} {INSERT INTO [Table] VALUES([Expr], [Expr], [Expr], [Expr]);} {INSERT INTO [Table] VALUES([Expr], [Expr]);} } fuzz $TemplateList } proc Column {} { fuzz $::ColumnList } # Generate and return a fuzzy UPDATE statement. # proc Update {} { set TemplateList { {UPDATE [Table] SET [Column] = [Expr $::ColumnList] WHERE [Expr $::ColumnList]} } fuzz $TemplateList } proc Delete {} { set TemplateList { {DELETE FROM [Table] WHERE [Expr $::ColumnList]} } fuzz $TemplateList } proc Statement {} { set TemplateList { {[Update]} {[Insert]} {[Select]} {[Delete]} } fuzz $TemplateList } ######################################################################## set ::log [open fuzzy.log w] # # Usage: do_fuzzy_test <testname> ?<options>? # # -template # -errorlist # proc do_fuzzy_test {testname args} { set ::fuzzyopts(-errorlist) [list] array set ::fuzzyopts $args lappend ::fuzzyopts(-errorlist) {parser stack overflow} {ORDER BY column} for {set ii 0} {$ii < $::REPEATS} {incr ii} { do_test ${testname}.$ii { set ::sql [subst $::fuzzyopts(-template)] puts $::log $::sql flush $::log set rc [catch {execsql $::sql} msg] set e 1 if {$rc} { |
︙ | ︙ | |||
227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 | SELECT ( SELECT zeroblob(1000) FROM ( SELECT * FROM (SELECT 'first') ORDER BY NOT 'in') ) } } [execsql {SELECT zeroblob(1000)}] do_test fuzz-1.8 { execsql { SELECT CAST(zeroblob(1000) AS text); } } {{}} #---------------------------------------------------------------- # Test some fuzzily generated expressions. # do_fuzzy_test fuzz-2 -template { SELECT [Expr] } do_test fuzz-3.1 { execsql { CREATE TABLE abc(a, b, c); CREATE TABLE def(a, b, c); CREATE TABLE ghi(a, b, c); } } {} set ::TableList [list abc def ghi] | > > > > > > > > > > > > > > > > > > < | 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 | SELECT ( SELECT zeroblob(1000) FROM ( SELECT * FROM (SELECT 'first') ORDER BY NOT 'in') ) } } [execsql {SELECT zeroblob(1000)}] do_test fuzz-1.8 { # Problems with opcode OP_ToText (did not account for MEM_Zero). # Also MemExpandBlob() was marking expanded blobs as nul-terminated. # They are not. execsql { SELECT CAST(zeroblob(1000) AS text); } } {{}} do_test fuzz-1.9 { # This was causing a NULL pointer dereference of Expr.pList. execsql { SELECT 1 FROM (SELECT * FROM sqlite_master WHERE random()) } } {} do_test fuzz-1.10 { # Bug in calculation of Parse.ckOffset causing an assert() # to fail. Probably harmless. execsql { SELECT coalesce(1, substr( 1, 2, length('in' IN (SELECT 1)))) } } {1} #---------------------------------------------------------------- # Test some fuzzily generated expressions. # do_fuzzy_test fuzz-2 -template { SELECT [Expr] } do_test fuzz-3.1 { execsql { CREATE TABLE abc(a, b, c); CREATE TABLE def(a, b, c); CREATE TABLE ghi(a, b, c); } } {} set ::TableList [list abc def ghi] #---------------------------------------------------------------- # Test some fuzzily generated SELECT statements. # do_fuzzy_test fuzz-3.2 -template {[Select]} #---------------------------------------------------------------- |
︙ | ︙ | |||
283 284 285 286 287 288 289 | # do_test fuzz-5.1 {execsql BEGIN} {} do_fuzzy_test fuzz-5.2 -template {[Insert]} -errorlist table integrity_check fuzz-5.2.integrity do_test fuzz-5.3 {execsql COMMIT} {} integrity_check fuzz-5.4.integrity | > > > > > > | > > > > > > > > > > | 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 | # do_test fuzz-5.1 {execsql BEGIN} {} do_fuzzy_test fuzz-5.2 -template {[Insert]} -errorlist table integrity_check fuzz-5.2.integrity do_test fuzz-5.3 {execsql COMMIT} {} integrity_check fuzz-5.4.integrity #---------------------------------------------------------------- # Now that there is data in the datbase, run some more SELECT # statements # set ::ColumnList [list a b c] set E {{no such col} {ambiguous column name}} do_fuzzy_test fuzz-6.1 -template {[Select]} -errorlist $E #---------------------------------------------------------------- # Run some SELECTs, INSERTs, UPDATEs and DELETEs in a transaction. # set E {{no such col} {ambiguous column name} {table}} do_test fuzz-7.1 {execsql BEGIN} {} do_fuzzy_test fuzz-7.2 -template {[Statement]} -errorlist $E integrity_check fuzz-7.3.integrity do_test fuzz-7.4 {execsql COMMIT} {} integrity_check fuzz-7.5.integrity close $::log finish_test |