From 3fd0a736bfa81524e7bba6152e5b868c5925aba8 Mon Sep 17 00:00:00 2001 From: danielk1977 Date: Thu, 27 May 2004 13:35:19 +0000 Subject: [PATCH] A couple of test cases and fixes for blob literals. (CVS 1474) FossilOrigin-Name: 6d552af67cf6fa6935373ba39de5c47ebf613eb9 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/sqliteInt.h | 3 ++- src/tclsqlite.c | 8 +++----- src/tokenize.c | 13 +++++++++---- src/util.c | 6 ++++-- src/vdbeaux.c | 26 ++++++++++++++------------ src/vdbemem.c | 6 ++++-- 8 files changed, 48 insertions(+), 38 deletions(-) diff --git a/manifest b/manifest index 123e64a487..757dde68a8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Alter\sthe\sTcl\seval\ssub-command\sso\sthat\sit\ssupports\sblobs.\s(CVS\s1473) -D 2004-05-27T12:11:32 +C A\scouple\sof\stest\scases\sand\sfixes\sfor\sblob\sliterals.\s(CVS\s1474) +D 2004-05-27T13:35:20 F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd @@ -56,26 +56,26 @@ F src/random.c eff68e3f257e05e81eae6c4d50a51eb88beb4ff3 F src/select.c 2ba142a490ab2777b6a086e7c0d078a952331109 F src/shell.c ed4d237b3e52a0a42512bfcc53530e46de20c28f F src/sqlite.h.in cda883efb11c6f767eaf3fea06b3e3419d9cfe7f -F src/sqliteInt.h dbf4fd06e89cdab13f4f1129d76bf79a38ec2b39 +F src/sqliteInt.h 9c528cc7a41efafb0443655d29eafd10d8378952 F src/table.c af14284fa36c8d41f6829e3f2819dce07d3e2de2 -F src/tclsqlite.c 6fab79639917c37dce1ddb2e9dcf3bc1b09001ec +F src/tclsqlite.c 877d0b96013a25b03ed6bd2d32917c42e84403bc F src/test1.c 08da53d31d5b3eb11ac988f933fc6efa508712e4 F src/test2.c 6195a1ca2c8d0d2d93644e86da3289b403486872 F src/test3.c 5e4a6d596f982f6f47a5f9f75ede9b4a3b739968 F src/test4.c 34848a9fd31aa65857b20a8bfc03aff77d8c3426 F src/test5.c 9a1f15133f6955f067c5246e564723b5f23ff221 -F src/tokenize.c 28ece63a104850f2e06bd7121aeb3449858a27f3 +F src/tokenize.c d40f90119182bf1a026a008453f28fcc6b101738 F src/trigger.c 11afe9abfba13a2ba142944c797c952e162d117f F src/update.c 96461bcf4e946697e83c09c77c7e61b545a2f66e F src/utf.c 59b5c8f06a4384a9f64933d6c57a2de02ce3673b -F src/util.c 179c1347c712dff6671fc5d2dc9d2b009b542a97 +F src/util.c d299404febd509556e720fbecadd880756b0f899 F src/vacuum.c 8734f89742f246abd91dbd3e087fc153bddbfbad F src/vdbe.c 54a758cc50b7eb9fe67fab9f2804d3b900536538 F src/vdbe.h e73f890e0f2a6c42b183d7d6937947930fe4fdeb F src/vdbeInt.h fab8bb7f7a7f4e0714d9b3217c3db97366e16b99 F src/vdbeapi.c b0bb1f98c899ba00c8a5cbca612c2a28a1bb79de -F src/vdbeaux.c f36130df1ceff0c461590304a3738cf9da506a0f -F src/vdbemem.c 9deb5973516c42a93d500956bd09d50ead35644c +F src/vdbeaux.c 5b886ac74a68e7e956259eba53e3d002a8ddc6a7 +F src/vdbemem.c b487e8a903012de1c0b7f603e8efeede2b51b21d F src/where.c efe5d25fe18cd7381722457898cd863e84097a0c F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242 F test/attach.test cb9b884344e6cfa5e165965d5b1adea679a24c83 @@ -205,7 +205,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604 F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 -P c9e3015faffb650d8dbf1f7f95a7057a36361bac -R f916301fbb891efd9f50955fcfaa0d10 +P b5d5f0ad717ef43a9714dd1cc40e20d1b94a3e58 +R 7c513f920546909cc1b3f1b4f4017169 U danielk1977 -Z c10836444240fdf809d1ebf5efde5c0a +Z b0c4aedb51c268e31583548cc1d9df58 diff --git a/manifest.uuid b/manifest.uuid index 9840f247a2..2e2eebdb44 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b5d5f0ad717ef43a9714dd1cc40e20d1b94a3e58 \ No newline at end of file +6d552af67cf6fa6935373ba39de5c47ebf613eb9 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 4b4b825f94..270d38382b 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -11,7 +11,7 @@ ************************************************************************* ** Internal interface definitions for SQLite. ** -** @(#) $Id: sqliteInt.h,v 1.254 2004/05/27 01:53:56 drh Exp $ +** @(#) $Id: sqliteInt.h,v 1.255 2004/05/27 13:35:20 danielk1977 Exp $ */ #include "config.h" #include "sqlite.h" @@ -1351,3 +1351,4 @@ int sqlite3atoi64(const char*, i64*); void sqlite3Error(sqlite *, int, const char*,...); int sqlite3utfTranslate(const void *, int , u8 , void **, int *, u8); u8 sqlite3UtfReadBom(const void *zData, int nData); +char *sqlite3HexToBlob(const char *z); diff --git a/src/tclsqlite.c b/src/tclsqlite.c index a8dc7c09ba..29e6093037 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -11,7 +11,7 @@ ************************************************************************* ** A TCL Interface to SQLite ** -** $Id: tclsqlite.c,v 1.74 2004/05/27 12:11:32 danielk1977 Exp $ +** $Id: tclsqlite.c,v 1.75 2004/05/27 13:35:20 danielk1977 Exp $ */ #ifndef NO_TCL /* Omit this whole file if TCL is unavailable */ @@ -815,10 +815,8 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ if( SQLITE3_BLOB!=sqlite3_column_type(pStmt, i) ){ pVal = Tcl_NewStringObj(sqlite3_column_text(pStmt, i), -1); }else{ - pVal = Tcl_NewByteArrayObj( - sqlite3_column_blob(pStmt, i), - sqlite3_column_bytes(pStmt, i) - ); + int bytes = sqlite3_column_bytes(pStmt, i); + pVal = Tcl_NewByteArrayObj(sqlite3_column_blob(pStmt, i), bytes); } if( objc==5 ){ diff --git a/src/tokenize.c b/src/tokenize.c index 122e614406..77d7600031 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -15,7 +15,7 @@ ** individual tokens and sends those tokens one-by-one over to the ** parser for analysis. ** -** $Id: tokenize.c,v 1.71 2004/05/27 09:28:43 danielk1977 Exp $ +** $Id: tokenize.c,v 1.72 2004/05/27 13:35:20 danielk1977 Exp $ */ #include "sqliteInt.h" #include "os.h" @@ -377,14 +377,19 @@ static int sqliteGetToken(const unsigned char *z, int *tokenType){ } case 'x': case 'X': { if( z[1]=='\'' || z[1]=='"' ){ - int delim = z[0]; - for(i=1; z[i]; i++){ + int delim = z[1]; + *tokenType = TK_BLOB; + for(i=2; z[i]; i++){ if( z[i]==delim ){ + if( i%2 ) *tokenType = TK_ILLEGAL; break; } + if( !isxdigit(z[i]) ){ + *tokenType = TK_ILLEGAL; + return i; + } } if( z[i] ) i++; - *tokenType = TK_BLOB; return i; } /* Otherwise fall through to the next case */ diff --git a/src/util.c b/src/util.c index 8f5334966e..27c94bc020 100644 --- a/src/util.c +++ b/src/util.c @@ -14,7 +14,7 @@ ** This file contains functions for allocating memory, comparing ** strings, and stuff like that. ** -** $Id: util.c,v 1.91 2004/05/27 09:28:43 danielk1977 Exp $ +** $Id: util.c,v 1.92 2004/05/27 13:35:20 danielk1977 Exp $ */ #include "sqliteInt.h" #include @@ -1307,7 +1307,7 @@ char * sqlite3HexToBlob(const char *z){ zBlob = (char *)sqliteMalloc(n/2); - for(i=0; i47 && z[i]<58 ) c = (z[i]-48)<<4; @@ -1317,6 +1317,7 @@ char * sqlite3HexToBlob(const char *z){ sqliteFree(zBlob); return 0; } + i++; if ( z[i]>47 && z[i]<58 ) c += (z[i]-48); else if( z[i]>64 && z[i]<71 ) c += (z[i]-55); else if( z[i]>96 && z[i]<103 ) c += (z[i]-87); @@ -1327,6 +1328,7 @@ char * sqlite3HexToBlob(const char *z){ zBlob[i/2] = c; } + return zBlob; } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 56155d9037..5028dc9381 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -612,20 +612,22 @@ int sqlite3VdbeList( */ static int translateOp(Op *pOp){ if( pOp->opcode==OP_HexBlob ){ - char *zBlob = sqlite3HexToBlob(pOp->p3); - if( !zBlob ){ - if( sqlite3_malloc_failed ){ - return SQLITE_NOMEM; - } - return SQLITE_ERROR; - } pOp->p1 = strlen(pOp->p3)/2; - if( pOp->p3type==P3_DYNAMIC ){ - sqliteFree(pOp->p3); + if( pOp->p1 ){ + char *zBlob = sqlite3HexToBlob(pOp->p3); + if( !zBlob ) return SQLITE_NOMEM; + if( pOp->p3type==P3_DYNAMIC ){ + sqliteFree(pOp->p3); + } + pOp->p3 = zBlob; + pOp->p3type = P3_DYNAMIC; + }else{ + pOp->p3type = P3_STATIC; + pOp->p3 = ""; } - pOp->p3 = zBlob; - pOp->p3type = P3_DYNAMIC; + pOp->opcode = OP_Blob; } + return SQLITE_OK; } /* @@ -699,7 +701,7 @@ void sqlite3VdbeMakeReady( } } #endif - { + if( !isExplain ){ int i; for(i=0; inOp; i++){ translateOp(&p->aOp[i]); diff --git a/src/vdbemem.c b/src/vdbemem.c index 3cf07d58ba..205150e038 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -315,9 +315,9 @@ int sqlite3VdbeMemSetStr( pMem->z = (char *)z; if( eCopy ){ - pMem->flags = MEM_Ephem|MEM_Str; + pMem->flags = MEM_Ephem; }else{ - pMem->flags = MEM_Static|MEM_Str; + pMem->flags = MEM_Static; } pMem->enc = enc; pMem->type = enc==0 ? SQLITE3_BLOB : SQLITE3_TEXT; @@ -328,6 +328,7 @@ int sqlite3VdbeMemSetStr( break; case TEXT_Utf8: + pMem->flags |= MEM_Str; if( n<0 ){ pMem->n = strlen(z); pMem->flags |= MEM_Term; @@ -336,6 +337,7 @@ int sqlite3VdbeMemSetStr( case TEXT_Utf16le: case TEXT_Utf16be: + pMem->flags |= MEM_Str; if( n<0 ){ pMem->n = sqlite3utf16ByteLen(z,-1); pMem->flags |= MEM_Term;