-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
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
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
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
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
-ffe615a71107a38b6f60c7baf4284a5b0aecdc22
\ No newline at end of file
+1e8fcb3fbed7beb8bb1370953ecf3d4b9db01ede
\ No newline at end of file
** 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"
Deephemeralize(pTos);
for(i=0; i<pOp->p1; 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) );
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;
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;
*/
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){
#***********************************************************************
# 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
misuse.test
memleak.test
sqllimits1.test
+ fuzz.test
}
# Files to include in the test. If this list is empty then everything
# 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
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
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';
SELECT (- -21) % NOT (456 LIKE zeroblob(10));
}
} {0}
+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))
+ }
+} {}
-do_test fuzz-2.1 {
- for {set ii 0} {$ii < 2000} {incr ii} {
+#----------------------------------------------------------------
+# Test some fuzzily generated expressions.
+#
+for {set ii 0} {$ii < 2000} {incr ii} {
+ do_test fuzz-2.1.$ii {
set ::expr [Expr]
- execsql "SELECT $::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 a ""
} {}
+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