diff --git a/manifest b/manifest index e5d1e3964d..2b8b1b16ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssome\sUTF-8\stest\sinfrastructure.\s\sTreat\sNaN\sas\sNULL.\s\sThe\sprintf\sroutines\nprint\sinfinity\sas\s"Inf"\snot\sas\s"NaN".\s\sTicket\s#2345.\s(CVS\s3972) -D 2007-05-10T17:23:12 +C Add\scases\sto\sfuzz.test.\sSome\stests\sin\sthis\sfile\sfail\sat\sthe\smoment.\s(CVS\s3973) +D 2007-05-10T17:32:48 F Makefile.in 87b200ad9970907f76df734d29dff3d294c10935 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -132,10 +132,10 @@ F src/update.c 3359041db390a8f856d67272f299600e2104f350 F src/utf.c be7c64eed83fa3c01e0c42905e1c311dcd1be704 F src/util.c 4f6bbcec2b2b1884d652b82c9f8949ede4618d68 F src/vacuum.c 8bd895d29e7074e78d4e80f948e35ddc9cf2beef -F src/vdbe.c a2e2a5d6f9105a36d38cbdd8ff47486ea0ba7c1c +F src/vdbe.c c0b1cd6c7dc40f836184af1cf041cfcadd61c9a5 F src/vdbe.h 001c5b257567c1d3de7feb2203aac71d0d7b16a3 F src/vdbeInt.h bddb7931fc1216fda6f6720e18d2a9b1e0f8fc96 -F src/vdbeapi.c 120e04492e98e3cfd5545dd7130c76987e40e8b3 +F src/vdbeapi.c 3ca7808c67a10b5c20150108b431d520d141e93e F src/vdbeaux.c 62011e2ccf5fa9b3dcc7fa6ff5f0e0638d324a70 F src/vdbeblob.c 96f3572fdc45eda5be06e6372b612bc30742d9f0 F src/vdbefifo.c 3ca8049c561d5d67cbcb94dc909ae9bb68c0bf8f @@ -144,7 +144,7 @@ F src/vtab.c c5ebebf615b2f29499fbe97a584c4bb342632aa0 F src/where.c f3920748cc650fc25ac916215500bdb90dee568e F tclinstaller.tcl 4356d9d94d2b5ed5e68f9f0c80c4df3048dd7617 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 -F test/all.test 1f54c95fea0baa503d5f4788d9d33ef4dd635c86 +F test/all.test 93a40a7612b3c5e6efd1f5b98496a8b02a45cfdb F test/alter.test 088d82f140b7fcf0be2f712c826dd70387470aef F test/alter2.test 50c3f554b8236d179d72511c0a4f23c5eb7f2af3 F test/alter3.test a6eec8f454be9b6ce73d8d7dc711453675a10ce7 @@ -248,7 +248,7 @@ F test/fts2l.test 4c53c89ce3919003765ff4fd8d98ecf724d97dd3 F test/fts2m.test 4b30142ead6f3ed076e880a2a464064c5ad58c51 F test/fts2n.test a70357e72742681eaebfdbe9007b87ff3b771638 F test/func.test 6f230b25b235cc1afcc7bd5a41baf7317018a8d1 -F test/fuzz.test 71f1a03e8249f14f15b39562525e5450a1713fd5 +F test/fuzz.test ac67727e8edea39d9ec3a55d3eba4f95231f329b F test/hook.test 7e7645fd9a033f79cce8fdff151e32715e7ec50a F test/icu.test e6bfae7f625c88fd14df6f540fe835bdfc1e4329 F test/in.test 369cb2aa1eab02296b4ec470732fe8c131260b1d @@ -487,7 +487,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5 -P 1e9e6fe75d01d8cf4e1a23505c45f28491f1e902 -R 3021e7397e47b6679eee0e86458d86ce -U drh -Z 62c7f31e1b53396b98122862f404dfd2 +P ffe615a71107a38b6f60c7baf4284a5b0aecdc22 +R e35a9f0b80527b9d0b19209722d26b22 +U danielk1977 +Z 29917b781f3cb872f013bdcb708a70d5 diff --git a/manifest.uuid b/manifest.uuid index 9f7f1d2ed6..89e20a973b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ffe615a71107a38b6f60c7baf4284a5b0aecdc22 \ No newline at end of file +1e8fcb3fbed7beb8bb1370953ecf3d4b9db01ede \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 440e1df358..07eea5f15f 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -43,7 +43,7 @@ ** in this file for details. If in doubt, do not deviate from existing ** commenting and indentation practices when changing or adding code. ** -** $Id: vdbe.c,v 1.613 2007/05/10 17:23:12 drh Exp $ +** $Id: vdbe.c,v 1.614 2007/05/10 17:32:48 danielk1977 Exp $ */ #include "sqliteInt.h" #include "os.h" @@ -918,7 +918,7 @@ case OP_Pull: { /* no-push */ Deephemeralize(pTos); for(i=0; ip1; i++, pFrom++){ Deephemeralize(&pFrom[1]); - assert( (pFrom->flags & MEM_Ephem)==0 ); + assert( (pFrom[1].flags & MEM_Ephem)==0 ); *pFrom = pFrom[1]; if( pFrom->flags & MEM_Short ){ assert( pFrom->flags & (MEM_Str|MEM_Blob) ); @@ -2275,6 +2275,9 @@ case OP_MakeRecord: { if( pRec->flags&MEM_Null ){ containsNull = 1; } + if( pRec->flags&MEM_Zero && pRec->n>0 ){ + sqlite3VdbeMemExpandBlob(pRec); + } serial_type = sqlite3VdbeSerialType(pRec, file_format); len = sqlite3VdbeSerialTypeLen(serial_type); nData += len; @@ -2282,7 +2285,6 @@ case OP_MakeRecord: { if( pRec->flags & MEM_Zero ){ /* Only pure zero-filled BLOBs can be input to this Opcode. ** We do not allow blobs with a prefix and a zero-filled tail. */ - assert( pRec->n==0 ); nZero += pRec->u.i; }else if( len ){ nZero = 0; diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 7ff9ba2979..91fb9a926e 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -498,9 +498,7 @@ static void columnMallocFailure(sqlite3_stmt *pStmt) */ const void *sqlite3_column_blob(sqlite3_stmt *pStmt, int i){ const void *val; - sqlite3MallocDisallow(); val = sqlite3_value_blob( columnMem(pStmt,i) ); - sqlite3MallocAllow(); return val; } int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){ diff --git a/test/all.test b/test/all.test index 3b30875c94..4e6c0b5db2 100644 --- a/test/all.test +++ b/test/all.test @@ -10,7 +10,7 @@ #*********************************************************************** # This file runs all tests. # -# $Id: all.test,v 1.41 2007/05/08 15:59:06 danielk1977 Exp $ +# $Id: all.test,v 1.42 2007/05/10 17:32:48 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -60,6 +60,7 @@ set EXCLUDE { misuse.test memleak.test sqllimits1.test + fuzz.test } # Files to include in the test. If this list is empty then everything diff --git a/test/fuzz.test b/test/fuzz.test index 42287abc88..c21387bd26 100644 --- a/test/fuzz.test +++ b/test/fuzz.test @@ -12,7 +12,7 @@ # This file implements regression tests for SQLite library. The # focus of this file is testing the SELECT statement. # -# $Id: fuzz.test,v 1.1 2007/05/10 15:37:53 danielk1977 Exp $ +# $Id: fuzz.test,v 1.2 2007/05/10 17:32:48 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -23,7 +23,9 @@ proc fuzz {TemplateList} { return [subst -novar [lindex $TemplateList $i]] } -proc Value {} { +# Returns a string representing an SQL literal. +# +proc Literal {} { set TemplateList { 456 0 -456 1 -1 2147483648 2147483647 2147483649 -2147483647 -2147483648 -2147483649 @@ -50,33 +52,53 @@ set ::ExprDepth 0 proc Expr {} { incr ::ExprDepth - set TemplateList {[Value]} + set TemplateList {[Literal]} if {$::ExprDepth < 100} { lappend TemplateList \ {[Expr] [BinaryOp] [Expr]} \ - {[UnaryOp] [Expr]} \ - {([Select])} \ - {[Value]} + {[UnaryOp] [Expr]} } if {$::SelectDepth < 10} { - lappend TemplateList {([Select])} + lappend TemplateList {([Select 1])} } set res [fuzz $TemplateList] incr ::ExprDepth -1 return $res } +set ::TableList [list] +proc Table {} { + set TemplateList [concat sqlite_master $::TableList] + fuzz $TemplateList +} + set ::SelectDepth 0 -proc Select {} { +proc Select {{isExpr 0}} { incr ::SelectDepth set TemplateList { {SELECT [Expr]} } + if {$::SelectDepth < 5} { + lappend TemplateList \ + {SELECT [Expr] FROM ([Select])} \ + {SELECT [Expr] FROM [Table]} + + if {0 == $isExpr} { + lappend TemplateList \ + {SELECT [Expr], [Expr] FROM ([Select]) ORDER BY [Expr]} \ + {SELECT * FROM ([Select]) ORDER BY [Expr]} \ + } + } set res [fuzz $TemplateList] incr ::SelectDepth -1 set res } +######################################################################## + +#---------------------------------------------------------------- +# These tests caused errors that were first caught by the tests +# in this file. They are still here. do_test fuzz-1.1 { execsql { SELECT 'abc' LIKE X'ABCD'; @@ -97,14 +119,76 @@ do_test fuzz-1.4 { SELECT (- -21) % NOT (456 LIKE zeroblob(10)); } } {0} - -do_test fuzz-2.1 { - for {set ii 0} {$ii < 2000} {incr ii} { - set ::expr [Expr] - execsql "SELECT $::expr" +do_test fuzz-1.5 { + execsql { + SELECT (SELECT ( + SELECT (SELECT -2147483648) FROM (SELECT 1) ORDER BY 1 + )) + } +} {-2147483648} +do_test fuzz-1.6 { + execsql { + SELECT 'abc', zeroblob(1) FROM (SELECT 1) ORDER BY 1 + } +} [execsql {SELECT 'abc', zeroblob(1)}] + +do_test fuzz-1.7 { + execsql { +SELECT + (SELECT (SELECT 'fault' / + -2147483648 % - 123456789.1234567899 * (SELECT 'experiments' OR NOT 'first' / 'hardware' FROM (SELECT 2147483647, + (SELECT 'injection') FROM (SELECT 2147483649) ORDER BY + NULL AND (SELECT 'hardware') GLOB 2147483648))) FROM (SELECT * FROM (SELECT (SELECT (SELECT + (SELECT 456 * -2147483648)) LIKE (SELECT (SELECT (SELECT 'fault') - -56.1)) AND -2147483648) FROM (SELECT * FROM (SELECT 2147483648) ORDER BY (SELECT 56.1))) ORDER BY zeroblob(1)) } - set a "" } {} +#---------------------------------------------------------------- +# Test some fuzzily generated expressions. +# +for {set ii 0} {$ii < 2000} {incr ii} { + do_test fuzz-2.1.$ii { + set ::expr [Expr] + set rc [catch {execsql "SELECT $::expr"} msg] + set e [expr { + $rc == 0 || + $msg eq "parser stack overflow" || + 0 == [string first "ORDER BY column number" $msg] + }] + if {$e == 0} { + puts "" + puts "SELECT $::expr" + puts $msg + } + set e + } {1} +} + +do_test fuzz-3.1 { + execsql { + CREATE TABLE abc(a, b, c); + CREATE TABLE def(d, e, f); + CREATE TABLE ghi(g, h, i); + } +} {} +set ::TableList [list abc def ghi] + +#---------------------------------------------------------------- +# Test some fuzzily generated SELECT statements. +# +for {set ii 0} {$ii < 2000} {incr ii} { + do_test fuzz-2.2.$ii { + set ::select [Select] + set rc [catch {execsql $::select} msg] + set e [expr {$rc == 0 || $msg eq "parser stack overflow"}] + set e [expr { + $rc == 0 || + $msg eq "parser stack overflow" || + 0 == [string first "ORDER BY column number" $msg] + }] + if {$e == 0} { + puts "" + puts $::select + puts $msg + } + set e + } {1} +} + finish_test