From 5b159dc312f455002a9daf168985e58c98abf355 Mon Sep 17 00:00:00 2001 From: danielk1977 Date: Thu, 17 May 2007 16:34:43 +0000 Subject: [PATCH] Fix a problem with casting blobs to numeric types. (CVS 4021) FossilOrigin-Name: f2ce727c4d798c666e95876a2b67e8a305d82e3a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/test1.c | 14 ++++++++++---- src/vdbemem.c | 2 ++ test/cast.test | 17 ++++++++++++++++- 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 5429e683f3..8d8d5bdc3c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sspeed3.test\sfile.\sFor\stesting\sperformance\sissues\srelated\sto\soverflow\spages.\s(CVS\s4020) -D 2007-05-17T14:45:13 +C Fix\sa\sproblem\swith\scasting\sblobs\sto\snumeric\stypes.\s(CVS\s4021) +D 2007-05-17T16:34:44 F Makefile.in 87b200ad9970907f76df734d29dff3d294c10935 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -107,7 +107,7 @@ F src/sqlite3ext.h 7d0d363ea7327e817ef0dfe1b7eee1f171b72890 F src/sqliteInt.h 58edde37943f4f8155986f0c33735ba31fc66e9f F src/table.c a8de75bcedf84d4060d804264b067ab3b1a3561d F src/tclsqlite.c f425c7583665ef78dd8397b2de0b8e0028e80ce2 -F src/test1.c 84c841e1088f743200b87581506e93f70344bd32 +F src/test1.c 0ec120a4652ee95268a5a45e1e1adee13be9ae28 F src/test2.c 24458b17ab2f3c90cbc1c8446bd7ffe69be62f88 F src/test3.c a280931fb40222b7c90da45eea926459beee8904 F src/test4.c 8b784cd82de158a2317cb4ac4bc86f91ad315e25 @@ -139,7 +139,7 @@ F src/vdbeapi.c f89d6bc5264e66f44589e454fbeeee96854d0dd3 F src/vdbeaux.c 47f483c35c27dc0806715182ef6b281320c4b9b5 F src/vdbeblob.c 96f3572fdc45eda5be06e6372b612bc30742d9f0 F src/vdbefifo.c 3ca8049c561d5d67cbcb94dc909ae9bb68c0bf8f -F src/vdbemem.c 89ffe903b4de158b29fe8459f6f816d1f860d4ee +F src/vdbemem.c 332875a5fc9ac482e00701db5487ceb7f6fc1adc F src/vtab.c c5ebebf615b2f29499fbe97a584c4bb342632aa0 F src/where.c f3920748cc650fc25ac916215500bdb90dee568e F tclinstaller.tcl 4356d9d94d2b5ed5e68f9f0c80c4df3048dd7617 @@ -185,7 +185,7 @@ F test/capi2.test 7ecc9b342cc9ec27b53bbf95724cf2e5874fd496 F test/capi3.test 1675323145d128e5942a9faffcfd5cf4e219a33f F test/capi3b.test 5f0bc94b104e11086b1103b20277e1910f59c7f4 F test/capi3c.test 96e35164739c6fe3357fa36f0fe74bc23abc8ef7 -F test/cast.test 6f5073af07723d15d51568508739e99855fd0fa3 +F test/cast.test 0302bbc8d1be2f94da1e16ad2eb01ea356e26d18 F test/check.test e5ea0c1a06c10e81e3434ca029e2c4a562f2b673 F test/collate1.test e3eaa48c21e150814be1a7b852d2a8af24458d04 F test/collate2.test 701d9651c5707024fd86a20649af9ea55e2c0eb8 @@ -493,7 +493,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5 -P 2ee959be4afa2cf05d183ff92a31dd1b5a84becf -R da5d5d48e56670e943a5c8c37e2f8834 +P 684f765df3e8a4836f254717d175a4a7b5e7d15f +R f94684259a9006337971361185f52b0b U danielk1977 -Z 35759e4b823e1a75e52d456c8ba860fe +Z 9940d343779fd35f92c8bf0b213dac54 diff --git a/manifest.uuid b/manifest.uuid index 012e97034c..13c5c55a58 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -684f765df3e8a4836f254717d175a4a7b5e7d15f \ No newline at end of file +f2ce727c4d798c666e95876a2b67e8a305d82e3a \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index d2e5dccd92..1028218806 100644 --- a/src/test1.c +++ b/src/test1.c @@ -13,7 +13,7 @@ ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** -** $Id: test1.c,v 1.253 2007/05/15 03:56:50 drh Exp $ +** $Id: test1.c,v 1.254 2007/05/17 16:34:44 danielk1977 Exp $ */ #include "sqliteInt.h" #include "tcl.h" @@ -2803,7 +2803,7 @@ static int test_bind_text16( } /* -** Usage: sqlite3_bind_blob STMT N DATA BYTES +** Usage: sqlite3_bind_blob ?-static? STMT N DATA BYTES ** ** Test the sqlite3_bind_blob interface. STMT is a prepared statement. ** N is the index of a wildcard in the prepared statement. This command @@ -2820,19 +2820,25 @@ static int test_bind_blob( int bytes; char *value; int rc; + sqlite3_destructor_type xDestructor = SQLITE_TRANSIENT; - if( objc!=5 ){ + if( objc!=5 && objc!=6 ){ Tcl_AppendResult(interp, "wrong # args: should be \"", Tcl_GetStringFromObj(objv[0], 0), " STMT N DATA BYTES", 0); return TCL_ERROR; } + if( objc==6 ){ + xDestructor = SQLITE_STATIC; + objv++; + } + if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; if( Tcl_GetIntFromObj(interp, objv[2], &idx) ) return TCL_ERROR; value = Tcl_GetString(objv[3]); if( Tcl_GetIntFromObj(interp, objv[4], &bytes) ) return TCL_ERROR; - rc = sqlite3_bind_blob(pStmt, idx, value, bytes, SQLITE_TRANSIENT); + rc = sqlite3_bind_blob(pStmt, idx, value, bytes, xDestructor); if( sqlite3TestErrCode(interp, StmtToDb(pStmt), rc) ) return TCL_ERROR; if( rc!=SQLITE_OK ){ return TCL_ERROR; diff --git a/src/vdbemem.c b/src/vdbemem.c index f65ac6aaff..c29454d7ce 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -295,6 +295,7 @@ i64 sqlite3VdbeIntValue(Mem *pMem){ return (i64)pMem->r; }else if( flags & (MEM_Str|MEM_Blob) ){ i64 value; + pMem->flags |= MEM_Str; if( sqlite3VdbeChangeEncoding(pMem, SQLITE_UTF8) || sqlite3VdbeMemNulTerminate(pMem) ){ return 0; @@ -320,6 +321,7 @@ double sqlite3VdbeRealValue(Mem *pMem){ return (double)pMem->u.i; }else if( pMem->flags & (MEM_Str|MEM_Blob) ){ double val = 0.0; + pMem->flags |= MEM_Str; if( sqlite3VdbeChangeEncoding(pMem, SQLITE_UTF8) || sqlite3VdbeMemNulTerminate(pMem) ){ return 0.0; diff --git a/test/cast.test b/test/cast.test index 0767e31ba6..820663eca6 100644 --- a/test/cast.test +++ b/test/cast.test @@ -11,7 +11,7 @@ # This file implements regression tests for SQLite library. The # focus of this file is testing the CAST operator. # -# $Id: cast.test,v 1.6 2007/05/16 11:55:57 drh Exp $ +# $Id: cast.test,v 1.7 2007/05/17 16:34:45 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -262,5 +262,20 @@ do_test case-3.31 { execsql {SELECT CAST(NULL AS numeric)} } {{}} +# Test to see if it is possible to trick SQLite into reading past +# the end of a blob when converting it to a number. +do_test cast-3.32.1 { + set blob "1234567890" + set DB [sqlite3_connection_pointer db] + set ::STMT [sqlite3_prepare $DB {SELECT CAST(? AS real)} -1 TAIL] + sqlite3_bind_blob -static $::STMT 1 $blob 5 + sqlite3_step $::STMT +} {SQLITE_ROW} +do_test cast-3.32.2 { + sqlite3_column_int $::STMT 0 +} {12345} +do_test cast-3.32.3 { + sqlite3_finalize $::STMT +} {SQLITE_OK} finish_test