From a5c1416d64b4b857721f085258b6ef1dcaeb6f5b Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 17 Dec 2013 15:03:06 +0000 Subject: [PATCH 01/25] Add the printf() SQL function. FossilOrigin-Name: 6db7052eeefafdbf26b3153bc38600fecfb53ae6 --- manifest | 22 +++++----- manifest.uuid | 2 +- src/func.c | 27 +++++++++++++ src/printf.c | 100 ++++++++++++++++++++++++++++++++++++---------- src/sqliteInt.h | 19 +++++++-- src/vdbetrace.c | 20 ++++++---- test/printf2.test | 56 ++++++++++++++++++++++++++ 7 files changed, 203 insertions(+), 43 deletions(-) create mode 100644 test/printf2.test diff --git a/manifest b/manifest index 92e7b53f9f..04c30af9ed 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sthe\sSQLITE_DETERMINISTIC\sflag\sto\sbe\sORed\sinto\sthe\spreferred\stext\sencoding\nof\sapplication-defined\sfunctions,\sto\smark\sthe\sfunction\sas\sdeterministic. -D 2013-12-14T13:44:22.886 +C Add\sthe\sprintf()\sSQL\sfunction. +D 2013-12-17T15:03:06.814 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -178,7 +178,7 @@ F src/delete.c b36db1f79ee50eaca979660c9dd36437f5410b93 F src/expr.c 31a2b65339f6c3795d4cfa5e99798cd72f9fdfdf F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 2ab0f5384b70594468ef3ac5c7ed8ca24bfd17d5 -F src/func.c fed87f35cf4da4a798b726d84abefc209b48d831 +F src/func.c 6325ac2ec10833ccf4d5c36d323709221d37ea19 F src/global.c 1d7bb7ea8254ae6a68ed9bfaf65fcb3d1690b486 F src/hash.c ac3470bbf1ca4ae4e306a8ecb0fdf1731810ffe4 F src/hash.h 8890a25af81fb85a9ad7790d32eedab4b994da22 @@ -215,7 +215,7 @@ F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache1.c 57fee9a9a617218f5037afbbe49b09da65bde56b F src/pragma.c 5ab7279d132143feb77f773688a24ab05da75fd7 F src/prepare.c 359d1a1e9c9bd4488e4dd3a1aaaf2d2ebb9bb768 -F src/printf.c ba8b28e9d4ce984430e9f33f6ef1c85a1826d1dd +F src/printf.c 0c0cb58e43410d6237afe0f2751f265fc62eac59 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 @@ -224,7 +224,7 @@ F src/shell.c 18924f6ccfa70da98bf9e388bab512c0fd1e792e F src/sqlite.h.in 4ef56464aeaa3785a2c5ca37fb3a0fb229d68b2e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc -F src/sqliteInt.h 3c1c14a551b019c94e1addcb67d92dd14a62e058 +F src/sqliteInt.h b7e9da87740488671cfe4c70038a8eef3a1d317e F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -288,7 +288,7 @@ F src/vdbeaux.c a22cbd91b24503b82690cb03324ffec9f4ef63f6 F src/vdbeblob.c 8cd05a5630e6d5563ad017bf82edaf812b28acde F src/vdbemem.c 0e69351b2c6ff7d8b638688c0ae336a26befa6b2 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147 -F src/vdbetrace.c f7eb148eb3b4fa3401b20024630dcb43d322e73c +F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767 F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 @@ -739,6 +739,7 @@ F test/permutations.test af3278cbea3a19e025d5169be8193ff48dc3f862 F test/pragma.test e882183ecd21d064cec5c7aaea174fbd36293429 F test/pragma2.test aea7b3d82c76034a2df2b38a13745172ddc0bc13 F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552 +F test/printf2.test 7b1c2c27826702723ad2b1fcd92bce2ffc9f45f3 F test/progress.test a282973d1d17f08071bc58a77d6b80f2a81c354d F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca @@ -1146,7 +1147,10 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P bc5febef921bd12ca7760e9d07d3be0e67140320 -R 08fd6b0f6ffb77c364a2bec4efb57810 +P 5716fc2341ddd8cf64139e7168597f864da4e10b +R 2b8d4659fa3fad9afbe93191f7aa6089 +T *branch * printf-sql-function +T *sym-printf-sql-function * +T -sym-trunk * U drh -Z d2313ea9b793ebbfa6428f7e8b022d58 +Z 77c6ba366806353f9c00efecee393357 diff --git a/manifest.uuid b/manifest.uuid index 0d64591d7b..ce69d4e663 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5716fc2341ddd8cf64139e7168597f864da4e10b \ No newline at end of file +6db7052eeefafdbf26b3153bc38600fecfb53ae6 \ No newline at end of file diff --git a/src/func.c b/src/func.c index 951af97b35..1d6ec9f6ee 100644 --- a/src/func.c +++ b/src/func.c @@ -218,6 +218,32 @@ static void instrFunc( sqlite3_result_int(context, N); } +/* +** Implementation of the printf() function. +*/ +static void printfFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + PrintfArguments x; + StrAccum str; + const char *zFormat; + int n; + + if( argc>=1 && (zFormat = (const char*)sqlite3_value_text(argv[0]))!=0 ){ + x.nArg = argc-1; + x.nUsed = 0; + x.apArg = argv+1; + sqlite3StrAccumInit(&str, 0, 0, SQLITE_MAX_LENGTH); + str.db = sqlite3_context_db_handle(context); + sqlite3XPrintf(&str, SQLITE_PRINTF_SQLFUNC, zFormat, &x); + n = str.nChar; + sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n, + SQLITE_DYNAMIC); + } +} + /* ** Implementation of the substr() function. ** @@ -1648,6 +1674,7 @@ void sqlite3RegisterGlobalFunctions(void){ FUNCTION(instr, 2, 0, 0, instrFunc ), FUNCTION(substr, 2, 0, 0, substrFunc ), FUNCTION(substr, 3, 0, 0, substrFunc ), + FUNCTION(printf, -1, 0, 0, printfFunc ), FUNCTION(unicode, 1, 0, 0, unicodeFunc ), FUNCTION(char, -1, 0, 0, charFunc ), FUNCTION(abs, 1, 0, 0, absFunc ), diff --git a/src/printf.c b/src/printf.c index 3279a54f21..da118818bb 100644 --- a/src/printf.c +++ b/src/printf.c @@ -151,11 +151,28 @@ void sqlite3AppendSpace(StrAccum *pAccum, int N){ /* ** Set the StrAccum object to an error mode. */ -void setStrAccumError(StrAccum *p, u8 eError){ +static void setStrAccumError(StrAccum *p, u8 eError){ p->accError = eError; p->nAlloc = 0; } +/* +** Extra argument values from a PrintfArguments object +*/ +static sqlite3_int64 getIntArg(PrintfArguments *p){ + if( p->nArg<=p->nUsed ) return 0; + return sqlite3_value_int64(p->apArg[p->nUsed++]); +} +static double getDoubleArg(PrintfArguments *p){ + if( p->nArg<=p->nUsed ) return 0.0; + return sqlite3_value_double(p->apArg[p->nUsed++]); +} +static char *getTextArg(PrintfArguments *p){ + if( p->nArg<=p->nUsed ) return 0; + return (char*)sqlite3_value_text(p->apArg[p->nUsed++]); +} + + /* ** On machines with a small stack size, you can redefine the ** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired. @@ -169,10 +186,10 @@ void setStrAccumError(StrAccum *p, u8 eError){ ** Render a string given by "fmt" into the StrAccum object. */ void sqlite3VXPrintf( - StrAccum *pAccum, /* Accumulate results here */ - int useExtended, /* Allow extended %-conversions */ - const char *fmt, /* Format string */ - va_list ap /* arguments */ + StrAccum *pAccum, /* Accumulate results here */ + u32 bFlags, /* SQLITE_PRINTF_* flags */ + const char *fmt, /* Format string */ + va_list ap /* arguments */ ){ int c; /* Next character in the format string */ char *bufpt; /* Pointer to the conversion buffer */ @@ -190,6 +207,8 @@ void sqlite3VXPrintf( etByte flag_longlong; /* True if the "ll" flag is present */ etByte done; /* Loop termination flag */ etByte xtype = 0; /* Conversion paradigm */ + u8 bArgList; /* True for SQLITE_PRINTF_SQLFUNC */ + u8 useIntern; /* Ok to use internal conversions (ex: %T) */ char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */ sqlite_uint64 longvalue; /* Value for integer types */ LONGDOUBLE_TYPE realvalue; /* Value for real types */ @@ -204,9 +223,18 @@ void sqlite3VXPrintf( etByte flag_dp; /* True if decimal point should be shown */ etByte flag_rtz; /* True if trailing zeros should be removed */ #endif + PrintfArguments *pArgList = 0; /* Arguments for SQLITE_PRINTF_SQLFUNC */ char buf[etBUFSIZE]; /* Conversion buffer */ bufpt = 0; + if( bFlags ){ + if( (bArgList = (bFlags & SQLITE_PRINTF_SQLFUNC))!=0 ){ + pArgList = va_arg(ap, PrintfArguments*); + } + useIntern = bFlags & SQLITE_PRINTF_INTERNAL; + }else{ + bArgList = useIntern = 0; + } for(; (c=(*fmt))!=0; ++fmt){ if( c!='%' ){ int amt; @@ -238,7 +266,11 @@ void sqlite3VXPrintf( /* Get the field width */ width = 0; if( c=='*' ){ - width = va_arg(ap,int); + if( bArgList ){ + width = (int)getIntArg(pArgList); + }else{ + width = va_arg(ap,int); + } if( width<0 ){ flag_leftjustify = 1; width = -width; @@ -255,7 +287,11 @@ void sqlite3VXPrintf( precision = 0; c = *++fmt; if( c=='*' ){ - precision = va_arg(ap,int); + if( bArgList ){ + precision = (int)getIntArg(pArgList); + }else{ + precision = va_arg(ap,int); + } if( precision<0 ) precision = -precision; c = *++fmt; }else{ @@ -286,7 +322,7 @@ void sqlite3VXPrintf( for(idx=0; idxflags & FLAG_INTERN)==0 ){ + if( useIntern || (infop->flags & FLAG_INTERN)==0 ){ xtype = infop->type; }else{ return; @@ -326,7 +362,9 @@ void sqlite3VXPrintf( case etRADIX: if( infop->flags & FLAG_SIGNED ){ i64 v; - if( flag_longlong ){ + if( bArgList ){ + v = getIntArg(pArgList); + }else if( flag_longlong ){ v = va_arg(ap,i64); }else if( flag_long ){ v = va_arg(ap,long int); @@ -347,7 +385,9 @@ void sqlite3VXPrintf( else prefix = 0; } }else{ - if( flag_longlong ){ + if( bArgList ){ + longvalue = (u64)getIntArg(pArgList); + }else if( flag_longlong ){ longvalue = va_arg(ap,u64); }else if( flag_long ){ longvalue = va_arg(ap,unsigned long int); @@ -407,7 +447,11 @@ void sqlite3VXPrintf( case etFLOAT: case etEXP: case etGENERIC: - realvalue = va_arg(ap,double); + if( bArgList ){ + realvalue = getDoubleArg(pArgList); + }else{ + realvalue = va_arg(ap,double); + } #ifdef SQLITE_OMIT_FLOATING_POINT length = 0; #else @@ -562,7 +606,7 @@ void sqlite3VXPrintf( #endif /* !defined(SQLITE_OMIT_FLOATING_POINT) */ break; case etSIZE: - *(va_arg(ap,int*)) = pAccum->nChar; + if( !bArgList ) *(va_arg(ap,int*)) = pAccum->nChar; length = width = 0; break; case etPERCENT: @@ -571,7 +615,11 @@ void sqlite3VXPrintf( length = 1; break; case etCHARX: - c = va_arg(ap,int); + if( bArgList ){ + c = (int)getIntArg(pArgList); + }else{ + c = va_arg(ap,int); + } buf[0] = (char)c; if( precision>=0 ){ for(idx=1; idx=0 ){ @@ -602,7 +654,13 @@ void sqlite3VXPrintf( int needQuote; char ch; char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */ - char *escarg = va_arg(ap,char*); + char *escarg; + + if( bArgList ){ + escarg = getTextArg(pArgList); + }else{ + escarg = va_arg(ap,char*); + } isnull = escarg==0; if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)"); k = precision; @@ -637,6 +695,7 @@ void sqlite3VXPrintf( } case etTOKEN: { Token *pToken = va_arg(ap, Token*); + assert( bArgList==0 ); if( pToken && pToken->n ){ sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n); } @@ -647,6 +706,7 @@ void sqlite3VXPrintf( SrcList *pSrc = va_arg(ap, SrcList*); int k = va_arg(ap, int); struct SrcList_item *pItem = &pSrc->a[k]; + assert( bArgList==0 ); assert( k>=0 && knSrc ); if( pItem->zDatabase ){ sqlite3StrAccumAppendAll(pAccum, pItem->zDatabase); @@ -810,7 +870,7 @@ char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list ap){ sqlite3StrAccumInit(&acc, zBase, sizeof(zBase), db->aLimit[SQLITE_LIMIT_LENGTH]); acc.db = db; - sqlite3VXPrintf(&acc, 1, zFormat, ap); + sqlite3VXPrintf(&acc, SQLITE_PRINTF_INTERNAL, zFormat, ap); z = sqlite3StrAccumFinish(&acc); if( acc.accError==STRACCUM_NOMEM ){ db->mallocFailed = 1; @@ -966,14 +1026,12 @@ void sqlite3DebugPrintf(const char *zFormat, ...){ } #endif -#ifndef SQLITE_OMIT_TRACE /* ** variable-argument wrapper around sqlite3VXPrintf(). */ -void sqlite3XPrintf(StrAccum *p, const char *zFormat, ...){ +void sqlite3XPrintf(StrAccum *p, u32 bFlags, const char *zFormat, ...){ va_list ap; va_start(ap,zFormat); - sqlite3VXPrintf(p, 1, zFormat, ap); + sqlite3VXPrintf(p, bFlags, zFormat, ap); va_end(ap); } -#endif diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 8e1436efd3..af018edf01 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -742,6 +742,7 @@ typedef struct LookasideSlot LookasideSlot; typedef struct Module Module; typedef struct NameContext NameContext; typedef struct Parse Parse; +typedef struct PrintfArguments PrintfArguments; typedef struct RowSet RowSet; typedef struct Savepoint Savepoint; typedef struct Select Select; @@ -2764,10 +2765,20 @@ void sqlite3StatusSet(int, int); # define sqlite3IsNaN(X) 0 #endif -void sqlite3VXPrintf(StrAccum*, int, const char*, va_list); -#ifndef SQLITE_OMIT_TRACE -void sqlite3XPrintf(StrAccum*, const char*, ...); -#endif +/* +** An instance of the following structure holds information about SQL +** functions arguments that are the parameters to the printf() function. +*/ +struct PrintfArguments { + int nArg; /* Total number of arguments */ + int nUsed; /* Number of arguments used so far */ + sqlite3_value **apArg; /* The argument values */ +}; + +#define SQLITE_PRINTF_INTERNAL 0x01 +#define SQLITE_PRINTF_SQLFUNC 0x02 +void sqlite3VXPrintf(StrAccum*, u32, const char*, va_list); +void sqlite3XPrintf(StrAccum*, u32, const char*, ...); char *sqlite3MPrintf(sqlite3*,const char*, ...); char *sqlite3VMPrintf(sqlite3*,const char*, va_list); char *sqlite3MAppendf(sqlite3*,char*,const char*,...); diff --git a/src/vdbetrace.c b/src/vdbetrace.c index a7ff0a685d..4a39e26521 100644 --- a/src/vdbetrace.c +++ b/src/vdbetrace.c @@ -125,9 +125,9 @@ char *sqlite3VdbeExpandSql( if( pVar->flags & MEM_Null ){ sqlite3StrAccumAppend(&out, "NULL", 4); }else if( pVar->flags & MEM_Int ){ - sqlite3XPrintf(&out, "%lld", pVar->u.i); + sqlite3XPrintf(&out, 0, "%lld", pVar->u.i); }else if( pVar->flags & MEM_Real ){ - sqlite3XPrintf(&out, "%!.15g", pVar->r); + sqlite3XPrintf(&out, 0, "%!.15g", pVar->r); }else if( pVar->flags & MEM_Str ){ int nOut; /* Number of bytes of the string text to include in output */ #ifndef SQLITE_OMIT_UTF16 @@ -148,15 +148,17 @@ char *sqlite3VdbeExpandSql( while( nOutn && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; } } #endif - sqlite3XPrintf(&out, "'%.*q'", nOut, pVar->z); + sqlite3XPrintf(&out, 0, "'%.*q'", nOut, pVar->z); #ifdef SQLITE_TRACE_SIZE_LIMIT - if( nOutn ) sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut); + if( nOutn ){ + sqlite3XPrintf(&out, 0, "/*+%d bytes*/", pVar->n-nOut); + } #endif #ifndef SQLITE_OMIT_UTF16 if( enc!=SQLITE_UTF8 ) sqlite3VdbeMemRelease(&utf8); #endif }else if( pVar->flags & MEM_Zero ){ - sqlite3XPrintf(&out, "zeroblob(%d)", pVar->u.nZero); + sqlite3XPrintf(&out, 0, "zeroblob(%d)", pVar->u.nZero); }else{ int nOut; /* Number of bytes of the blob to include in output */ assert( pVar->flags & MEM_Blob ); @@ -166,11 +168,13 @@ char *sqlite3VdbeExpandSql( if( nOut>SQLITE_TRACE_SIZE_LIMIT ) nOut = SQLITE_TRACE_SIZE_LIMIT; #endif for(i=0; iz[i]&0xff); + sqlite3XPrintf(&out, 0, "%02x", pVar->z[i]&0xff); } sqlite3StrAccumAppend(&out, "'", 1); #ifdef SQLITE_TRACE_SIZE_LIMIT - if( nOutn ) sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut); + if( nOutn ){ + sqlite3XPrintf(&out, 0, "/*+%d bytes*/", pVar->n-nOut); + } #endif } } @@ -229,7 +233,7 @@ void sqlite3ExplainPrintf(Vdbe *pVdbe, const char *zFormat, ...){ sqlite3AppendSpace(&p->str, p->aIndent[n-1]); } va_start(ap, zFormat); - sqlite3VXPrintf(&p->str, 1, zFormat, ap); + sqlite3VXPrintf(&p->str, SQLITE_PRINTF_INTERNAL, zFormat, ap); va_end(ap); } } diff --git a/test/printf2.test b/test/printf2.test new file mode 100644 index 0000000000..6a017f152e --- /dev/null +++ b/test/printf2.test @@ -0,0 +1,56 @@ +# 2013-12-17 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. The +# focus of this file is testing the printf() SQL function. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +do_execsql_test printf2-1.1 { + SELECT printf(); +} {{}} +do_execsql_test printf2-1.2 { + SELECT printf('hello'); +} {hello} +do_execsql_test printf2-1.3 { + SELECT printf('%d,%d,%d',55,-11,3421); +} {55,-11,3421} +do_execsql_test printf2-1.4 { + SELECT printf('%d,%d,%d',55,'-11',3421); +} {55,-11,3421} +do_execsql_test printf2-1.5 { + SELECT printf('%d,%d,%d,%d',55,'-11',3421); +} {55,-11,3421,0} +do_execsql_test printf2-1.6 { + SELECT printf('%.2f',3.141592653); +} {3.14} +do_execsql_test printf2-1.7 { + SELECT printf('%.*f',2,3.141592653); +} {3.14} +do_execsql_test printf2-1.8 { + SELECT printf('%*.*f',5,2,3.141592653); +} {{ 3.14}} +do_execsql_test printf2-1.9 { + SELECT printf('%d',314159.2653); +} {314159} +do_execsql_test printf2-1.10 { + SELECT printf('%lld',314159.2653); +} {314159} +do_execsql_test printf2-1.11 { + SELECT printf('%lld%n',314159.2653,'hi'); +} {314159} +do_execsql_test printf2-1.12 { + SELECT printf('%.*z',5,'abcdefghijklmnop'); +} {abcde} + + +finish_test From fc6ee9df22a16cba04e51a64aaa571fe8e78dcc1 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 17 Dec 2013 15:58:42 +0000 Subject: [PATCH 02/25] Fix the formatting of %c in the printf() SQL function. FossilOrigin-Name: 3375571a5e267744c19a7c310840256cec57a242 --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/printf.c | 7 +++++-- test/printf2.test | 3 +++ 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 04c30af9ed..e7519c3fa2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sprintf()\sSQL\sfunction. -D 2013-12-17T15:03:06.814 +C Fix\sthe\sformatting\sof\s%c\sin\sthe\sprintf()\sSQL\sfunction. +D 2013-12-17T15:58:42.950 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -215,7 +215,7 @@ F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache1.c 57fee9a9a617218f5037afbbe49b09da65bde56b F src/pragma.c 5ab7279d132143feb77f773688a24ab05da75fd7 F src/prepare.c 359d1a1e9c9bd4488e4dd3a1aaaf2d2ebb9bb768 -F src/printf.c 0c0cb58e43410d6237afe0f2751f265fc62eac59 +F src/printf.c 85d07756e45d7496d19439dcae3e6e9e0090f269 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 @@ -739,7 +739,7 @@ F test/permutations.test af3278cbea3a19e025d5169be8193ff48dc3f862 F test/pragma.test e882183ecd21d064cec5c7aaea174fbd36293429 F test/pragma2.test aea7b3d82c76034a2df2b38a13745172ddc0bc13 F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552 -F test/printf2.test 7b1c2c27826702723ad2b1fcd92bce2ffc9f45f3 +F test/printf2.test 2f0978059768bb039d3ee09466bdcd06fc7a6a86 F test/progress.test a282973d1d17f08071bc58a77d6b80f2a81c354d F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca @@ -1147,10 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 5716fc2341ddd8cf64139e7168597f864da4e10b -R 2b8d4659fa3fad9afbe93191f7aa6089 -T *branch * printf-sql-function -T *sym-printf-sql-function * -T -sym-trunk * +P 6db7052eeefafdbf26b3153bc38600fecfb53ae6 +R 2f73ea36e182ebaad881490b3d78bb71 U drh -Z 77c6ba366806353f9c00efecee393357 +Z 671b11d5131d6faea51d8a864c8026f9 diff --git a/manifest.uuid b/manifest.uuid index ce69d4e663..56747e8410 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6db7052eeefafdbf26b3153bc38600fecfb53ae6 \ No newline at end of file +3375571a5e267744c19a7c310840256cec57a242 \ No newline at end of file diff --git a/src/printf.c b/src/printf.c index da118818bb..8cfa542b41 100644 --- a/src/printf.c +++ b/src/printf.c @@ -606,7 +606,9 @@ void sqlite3VXPrintf( #endif /* !defined(SQLITE_OMIT_FLOATING_POINT) */ break; case etSIZE: - if( !bArgList ) *(va_arg(ap,int*)) = pAccum->nChar; + if( !bArgList ){ + *(va_arg(ap,int*)) = pAccum->nChar; + } length = width = 0; break; case etPERCENT: @@ -616,7 +618,8 @@ void sqlite3VXPrintf( break; case etCHARX: if( bArgList ){ - c = (int)getIntArg(pArgList); + bufpt = getTextArg(pArgList); + c = bufpt ? bufpt[0] : 0; }else{ c = va_arg(ap,int); } diff --git a/test/printf2.test b/test/printf2.test index 6a017f152e..15babcf485 100644 --- a/test/printf2.test +++ b/test/printf2.test @@ -51,6 +51,9 @@ do_execsql_test printf2-1.11 { do_execsql_test printf2-1.12 { SELECT printf('%.*z',5,'abcdefghijklmnop'); } {abcde} +do_execsql_test printf2-1.13 { + SELECT printf('%c','abcdefghijklmnop'); +} {a} finish_test From 3a8aec5e132e3166efa51906029fbfd48639a3e5 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 17 Dec 2013 16:32:56 +0000 Subject: [PATCH 03/25] Add evidence marks and additional test cases for the printf() SQL function. FossilOrigin-Name: 93121d3097a43997af3c0de65bd9bd7663845fa2 --- manifest | 13 ++++++------- manifest.uuid | 2 +- test/printf2.test | 44 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 1fb5758b05..ce19a94c13 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sprintf()\sSQL\sfunction. -D 2013-12-17T16:10:57.193 +C Add\sevidence\smarks\sand\sadditional\stest\scases\sfor\sthe\sprintf()\sSQL\sfunction. +D 2013-12-17T16:32:56.710 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -739,7 +739,7 @@ F test/permutations.test af3278cbea3a19e025d5169be8193ff48dc3f862 F test/pragma.test e882183ecd21d064cec5c7aaea174fbd36293429 F test/pragma2.test aea7b3d82c76034a2df2b38a13745172ddc0bc13 F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552 -F test/printf2.test 2f0978059768bb039d3ee09466bdcd06fc7a6a86 +F test/printf2.test 414fcba6d6c10e0a5e58efd213811e5ead4635a0 F test/progress.test a282973d1d17f08071bc58a77d6b80f2a81c354d F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca @@ -1147,8 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 5716fc2341ddd8cf64139e7168597f864da4e10b 3375571a5e267744c19a7c310840256cec57a242 -R 2f73ea36e182ebaad881490b3d78bb71 -T +closed 3375571a5e267744c19a7c310840256cec57a242 +P a1bb62f91a85af0584100c3ad77877a949c30cca +R 69f0b68d0886123f335b52e69a6c748f U drh -Z 3980fde025c24face9a02012ab95cda1 +Z 3ce3ba9d696aa32fcf98b10717e459c0 diff --git a/manifest.uuid b/manifest.uuid index ceab92b6f6..5e71d304d7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a1bb62f91a85af0584100c3ad77877a949c30cca \ No newline at end of file +93121d3097a43997af3c0de65bd9bd7663845fa2 \ No newline at end of file diff --git a/test/printf2.test b/test/printf2.test index 15babcf485..8985d083cf 100644 --- a/test/printf2.test +++ b/test/printf2.test @@ -11,13 +11,23 @@ # This file implements regression tests for SQLite library. The # focus of this file is testing the printf() SQL function. # +# +# EVIDENCE-OF: R-63057-40065 The printf(FORMAT,...) SQL function works +# like the sqlite3_mprintf() C-language function and the printf() +# function from the standard C library. +# set testdir [file dirname $argv0] source $testdir/tester.tcl +# EVIDENCE-OF: R-40086-60101 If the FORMAT argument is missing or NULL +# then the result is NULL. +# do_execsql_test printf2-1.1 { - SELECT printf(); -} {{}} + SELECT quote(printf()), quote(printf(NULL,1,2,3)); +} {NULL NULL} + + do_execsql_test printf2-1.2 { SELECT printf('hello'); } {hello} @@ -48,6 +58,9 @@ do_execsql_test printf2-1.10 { do_execsql_test printf2-1.11 { SELECT printf('%lld%n',314159.2653,'hi'); } {314159} + +# EVIDENCE-OF: R-20555-31089 The %z format is interchangable with %s. +# do_execsql_test printf2-1.12 { SELECT printf('%.*z',5,'abcdefghijklmnop'); } {abcde} @@ -55,5 +68,32 @@ do_execsql_test printf2-1.13 { SELECT printf('%c','abcdefghijklmnop'); } {a} +# EVIDENCE-OF: R-02347-27622 The %n format is silently ignored and does +# not consume an argument. +# +do_execsql_test printf2-2.1 { + CREATE TABLE t1(a,b,c); + INSERT INTO t1 VALUES(1,2,3); + INSERT INTO t1 VALUES(-1,-2,-3); + INSERT INTO t1 VALUES('abc','def','ghi'); + INSERT INTO t1 VALUES(1.5,2.25,3.125); + SELECT printf('(%s)-%n-(%s)',a,b,c) FROM t1 ORDER BY rowid; +} {(1)--(2) (-1)--(-2) (abc)--(def) (1.5)--(2.25)} + +# EVIDENCE-OF: R-56064-04001 The %p format is an alias for %X. +# +do_execsql_test printf2-2.2 { + SELECT printf('%s=(%p)',a,a) FROM t1 ORDER BY a; +} {-1=(FFFFFFFFFFFFFFFF) 1=(1) 1.5=(1) abc=(0)} + +# EVIDENCE-OF: R-29410-53018 If there are too few arguments in the +# argument list, missing arguments are assumed to have a NULL value, +# which is translated into 0 or 0.0 for numeric formats or an empty +# string for %s. +# +do_execsql_test printf2-2.3 { + SELECT printf('%s=(%d/%g/%s)',a) FROM t1 ORDER BY a; +} {-1=(0/0/) 1=(0/0/) 1.5=(0/0/) abc=(0/0/)} + finish_test From 9ac7962acea518754b1f5a7a2748164cdb053b52 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Dec 2013 15:11:47 +0000 Subject: [PATCH 04/25] Show changes to the column cache when PRAGMA vdbe_addoptrace=ON is set. FossilOrigin-Name: 4c6a659c432e4f7c0285f58675a67f967b07bb0d --- manifest | 25 ++++++++++++++----------- manifest.uuid | 2 +- src/expr.c | 15 +++++++++++++++ src/select.c | 2 +- src/vdbe.h | 2 +- src/vdbeInt.h | 3 +++ src/vdbeaux.c | 15 ++++++++++++++- src/vdbeblob.c | 2 +- 8 files changed, 50 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index ce19a94c13..628e69c170 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sevidence\smarks\sand\sadditional\stest\scases\sfor\sthe\sprintf()\sSQL\sfunction. -D 2013-12-17T16:32:56.710 +C Show\schanges\sto\sthe\scolumn\scache\swhen\sPRAGMA\svdbe_addoptrace=ON\sis\sset. +D 2013-12-18T15:11:47.634 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -175,7 +175,7 @@ F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd F src/date.c 593c744b2623971e45affd0bde347631bdfa4625 F src/delete.c b36db1f79ee50eaca979660c9dd36437f5410b93 -F src/expr.c 31a2b65339f6c3795d4cfa5e99798cd72f9fdfdf +F src/expr.c 962c29881bcee9e1d7b556020c1d29dc8bd8b906 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 2ab0f5384b70594468ef3ac5c7ed8ca24bfd17d5 F src/func.c 6325ac2ec10833ccf4d5c36d323709221d37ea19 @@ -219,7 +219,7 @@ F src/printf.c 85d07756e45d7496d19439dcae3e6e9e0090f269 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 -F src/select.c d41381d80a22d3a83352aeca274cccf264ac277a +F src/select.c c1cd470c699ad55beb762022b2ea820cdfe12895 F src/shell.c 18924f6ccfa70da98bf9e388bab512c0fd1e792e F src/sqlite.h.in 4ef56464aeaa3785a2c5ca37fb3a0fb229d68b2e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e @@ -281,11 +281,11 @@ F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 F src/vdbe.c 919422843c859a1db08db0c88189912dbf625fc7 -F src/vdbe.h c06f0813f853566457ce9cfb1a4a4bc39a5da644 -F src/vdbeInt.h a7bc268f844d75be48bb7ae16f77b418fd3c641c +F src/vdbe.h c3278ab2b410f17acf61faf91be7bce3fd466e8b +F src/vdbeInt.h 8a4d2d69955570bb74a092c3cdbab04afb554963 F src/vdbeapi.c ce4e68ea4842cc6081046f533d088dcf01d247ad -F src/vdbeaux.c a22cbd91b24503b82690cb03324ffec9f4ef63f6 -F src/vdbeblob.c 8cd05a5630e6d5563ad017bf82edaf812b28acde +F src/vdbeaux.c 70aa77f7db7b9b627bbc44a4546deef8ba56c51b +F src/vdbeblob.c bc40f98f256f0b34116d6a44b114da4a81a15d33 F src/vdbemem.c 0e69351b2c6ff7d8b638688c0ae336a26befa6b2 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147 F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767 @@ -1147,7 +1147,10 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P a1bb62f91a85af0584100c3ad77877a949c30cca -R 69f0b68d0886123f335b52e69a6c748f +P 93121d3097a43997af3c0de65bd9bd7663845fa2 +R 509cbb701cd3c7ed8d65fb3eb1823d74 +T *branch * column-cache-debug +T *sym-column-cache-debug * +T -sym-trunk * U drh -Z 3ce3ba9d696aa32fcf98b10717e459c0 +Z ece27495bc3ec8587c593a30b1f41a23 diff --git a/manifest.uuid b/manifest.uuid index 5e71d304d7..e92963a40e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -93121d3097a43997af3c0de65bd9bd7663845fa2 \ No newline at end of file +4c6a659c432e4f7c0285f58675a67f967b07bb0d \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 6c8a8cce77..81eb00c968 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2170,6 +2170,11 @@ void sqlite3ExprCacheRemove(Parse *pParse, int iReg, int nReg){ */ void sqlite3ExprCachePush(Parse *pParse){ pParse->iCacheLevel++; +#ifdef SQLITE_DEBUG + if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ + printf("PUSH to %d\n", pParse->iCacheLevel); + } +#endif } /* @@ -2183,6 +2188,11 @@ void sqlite3ExprCachePop(Parse *pParse, int N){ assert( N>0 ); assert( pParse->iCacheLevel>=N ); pParse->iCacheLevel -= N; +#ifdef SQLITE_DEBUG + if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ + printf("POP to %d\n", pParse->iCacheLevel); + } +#endif for(i=0, p=pParse->aColCache; iiReg && p->iLevel>pParse->iCacheLevel ){ cacheEntryClear(pParse, p); @@ -2277,6 +2287,11 @@ void sqlite3ExprCacheClear(Parse *pParse){ int i; struct yColCache *p; +#if SQLITE_DEBUG + if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ + printf("CLEAR\n"); + } +#endif for(i=0, p=pParse->aColCache; iiReg ){ cacheEntryClear(pParse, p); diff --git a/src/select.c b/src/select.c index aa8e54b02f..e0b3bde48e 100644 --- a/src/select.c +++ b/src/select.c @@ -1565,7 +1565,7 @@ Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ Vdbe *sqlite3GetVdbe(Parse *pParse){ Vdbe *v = pParse->pVdbe; if( v==0 ){ - v = pParse->pVdbe = sqlite3VdbeCreate(pParse->db); + v = pParse->pVdbe = sqlite3VdbeCreate(pParse); #ifndef SQLITE_OMIT_TRACE if( v ){ sqlite3VdbeAddOp0(v, OP_Trace); diff --git a/src/vdbe.h b/src/vdbe.h index 62d9aa2711..51cf60b520 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -160,7 +160,7 @@ typedef struct VdbeOpList VdbeOpList; ** Prototypes for the VDBE interface. See comments on the implementation ** for a description of what each of these routines does. */ -Vdbe *sqlite3VdbeCreate(sqlite3*); +Vdbe *sqlite3VdbeCreate(Parse*); int sqlite3VdbeAddOp0(Vdbe*,int); int sqlite3VdbeAddOp1(Vdbe*,int,int); int sqlite3VdbeAddOp2(Vdbe*,int,int,int); diff --git a/src/vdbeInt.h b/src/vdbeInt.h index d6d71a3957..7b4fad67b0 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -312,6 +312,9 @@ struct Vdbe { Mem **apArg; /* Arguments to currently executing user function */ Mem *aColName; /* Column names to return */ Mem *pResultSet; /* Pointer to an array of results */ +#ifdef SQLITE_DEBUG + Parse *pParse; /* Parsing context used to create this Vdbe */ +#endif int nMem; /* Number of memory locations currently allocated */ int nOp; /* Number of instructions in the program */ int nOpAlloc; /* Number of slots allocated for aOp[] */ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 6344c4c8fa..068059e594 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -20,7 +20,8 @@ /* ** Create a new virtual database engine. */ -Vdbe *sqlite3VdbeCreate(sqlite3 *db){ +Vdbe *sqlite3VdbeCreate(Parse *pParse){ + sqlite3 *db = pParse->db; Vdbe *p; p = sqlite3DbMallocZero(db, sizeof(Vdbe) ); if( p==0 ) return 0; @@ -32,6 +33,9 @@ Vdbe *sqlite3VdbeCreate(sqlite3 *db){ p->pPrev = 0; db->pVdbe = p; p->magic = VDBE_MAGIC_INIT; +#if SQLITE_DEBUG + p->pParse = pParse; +#endif return p; } @@ -151,6 +155,15 @@ int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ #endif #ifdef SQLITE_DEBUG if( p->db->flags & SQLITE_VdbeAddopTrace ){ + int jj, kk; + Parse *pParse = p->pParse; + for(jj=kk=0; jjaColCache + jj; + if( x->iLevel>pParse->iCacheLevel || x->iReg==0 ) continue; + printf(" r[%d]={%d:%d}", x->iReg, x->iTable, x->iColumn); + kk++; + } + if( kk ) printf("\n"); sqlite3VdbePrintOp(0, i, &p->aOp[i]); test_addop_breakpoint(); } diff --git a/src/vdbeblob.c b/src/vdbeblob.c index 7859d4a6c5..20841c44f9 100644 --- a/src/vdbeblob.c +++ b/src/vdbeblob.c @@ -255,7 +255,7 @@ int sqlite3_blob_open( } } - pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(db); + pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(pParse); assert( pBlob->pStmt || db->mallocFailed ); if( pBlob->pStmt ){ Vdbe *v = (Vdbe *)pBlob->pStmt; From 039468ef2d682ecd35f81d6d1e41ec51707ad5e8 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 18 Dec 2013 16:27:48 +0000 Subject: [PATCH 05/25] Remove an unnecessary column-cache flush. Add another test case to the speedtest1.c program to accentuate the benefit of not flushing the cache at that point. FossilOrigin-Name: 97fdfc6b79833011fc0c506fe5e0985c0fb1906c --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/select.c | 1 - test/speedtest1.c | 10 +++++++++- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 628e69c170..f61e471ae1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Show\schanges\sto\sthe\scolumn\scache\swhen\sPRAGMA\svdbe_addoptrace=ON\sis\sset. -D 2013-12-18T15:11:47.634 +C Remove\san\sunnecessary\scolumn-cache\sflush.\s\sAdd\sanother\stest\scase\sto\sthe\nspeedtest1.c\sprogram\sto\saccentuate\sthe\sbenefit\sof\snot\sflushing\sthe\scache\sat\nthat\spoint. +D 2013-12-18T16:27:48.409 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -219,7 +219,7 @@ F src/printf.c 85d07756e45d7496d19439dcae3e6e9e0090f269 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 -F src/select.c c1cd470c699ad55beb762022b2ea820cdfe12895 +F src/select.c ecb020aa28e030761f6addd0adf5438e938931c1 F src/shell.c 18924f6ccfa70da98bf9e388bab512c0fd1e792e F src/sqlite.h.in 4ef56464aeaa3785a2c5ca37fb3a0fb229d68b2e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e @@ -822,7 +822,7 @@ F test/speed3.test d32043614c08c53eafdc80f33191d5bd9b920523 F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b -F test/speedtest1.c bb3a4cc62b6cf29f5bc72c85d2bee5991e207be7 +F test/speedtest1.c 47788d552a349241471ad06d239383dadd97164d F test/spellfix.test 8c40b169b104086d8795781f670ba3c786d6d8be F test/sqllimits1.test b1aae27cc98eceb845e7f7adf918561256e31298 F test/stat.test c8eccfe8fcd3f3cfc864ce22d5b9e803a3c69940 @@ -1147,10 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 93121d3097a43997af3c0de65bd9bd7663845fa2 -R 509cbb701cd3c7ed8d65fb3eb1823d74 -T *branch * column-cache-debug -T *sym-column-cache-debug * -T -sym-trunk * +P 4c6a659c432e4f7c0285f58675a67f967b07bb0d +R ad4bcfdba61e39f0bb9e7693f91a62e0 U drh -Z ece27495bc3ec8587c593a30b1f41a23 +Z e871bbf1438be1f459e194c32e33e3c1 diff --git a/manifest.uuid b/manifest.uuid index e92963a40e..b451c0355a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4c6a659c432e4f7c0285f58675a67f967b07bb0d \ No newline at end of file +97fdfc6b79833011fc0c506fe5e0985c0fb1906c \ No newline at end of file diff --git a/src/select.c b/src/select.c index e0b3bde48e..c394d1c31b 100644 --- a/src/select.c +++ b/src/select.c @@ -598,7 +598,6 @@ static void selectInnerLoop( /* If the destination is an EXISTS(...) expression, the actual ** values returned by the SELECT are not required. */ - sqlite3ExprCacheClear(pParse); sqlite3ExprCodeExprList(pParse, pEList, regResult, (eDest==SRT_Output)?SQLITE_ECEL_DUP:0); } diff --git a/test/speedtest1.c b/test/speedtest1.c index 0e6b1a99c8..51735de02a 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -663,9 +663,17 @@ void testset_main(void){ speedtest1_exec("REPLACE INTO t3(a,b,c) SELECT a,b,c FROM t1"); speedtest1_end_test(); + speedtest1_begin_test(300, "Refill a %d-row table using (b&1)==(a&1)", sz); + speedtest1_exec("DELETE FROM t2;"); + speedtest1_exec( + "INSERT INTO t2(a,b,c) SELECT a,b,c FROM t1 WHERE (b&1)==(a&1);" + "INSERT INTO t2(a,b,c) SELECT a,b,c FROM t1 WHERE (b&1)<>(a&1);" + ); + speedtest1_end_test(); + n = sz/5; - speedtest1_begin_test(300, "%d four-ways joins", n); + speedtest1_begin_test(310, "%d four-ways joins", n); speedtest1_exec("BEGIN"); speedtest1_prepare( "SELECT t1.c FROM t1, t2, t3, t4\n" From 46d03fcbfc6cfcaab7d475cd9c2e3b62b946be47 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 19 Dec 2013 02:23:45 +0000 Subject: [PATCH 06/25] Omit one or more pointless instructions that occur in between OP_NoConflict and OP_Halt. FossilOrigin-Name: 61e2f3575c4a94f9571c28fb2bd19da84b0edceb --- manifest | 13 ++++----- manifest.uuid | 2 +- src/insert.c | 80 ++++++++++++++++++++++++++------------------------- 3 files changed, 48 insertions(+), 47 deletions(-) diff --git a/manifest b/manifest index a1d9fbcef1..8a760c5b7d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunnecessary\scolumn-cache\sflush\soperation.\s\sAdd\scode\sto\strace\sthe\ncolumn\scache\swhen\scompiled\swith\sSQLITE_DEBUG\sand\susing\nPRAGMA\svdbe_addoptrace=ON. -D 2013-12-18T18:44:43.134 +C Omit\sone\sor\smore\spointless\sinstructions\sthat\soccur\sin\sbetween\sOP_NoConflict\nand\sOP_Halt. +D 2013-12-19T02:23:45.916 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -183,7 +183,7 @@ F src/global.c 1d7bb7ea8254ae6a68ed9bfaf65fcb3d1690b486 F src/hash.c ac3470bbf1ca4ae4e306a8ecb0fdf1731810ffe4 F src/hash.h 8890a25af81fb85a9ad7790d32eedab4b994da22 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 -F src/insert.c 3cf8012325857d162f74389420b14be7976a538d +F src/insert.c d1b3fd53cd8e3f232e47675cf2c3d1b1f4101f2a F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12 F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b @@ -1147,8 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 93121d3097a43997af3c0de65bd9bd7663845fa2 97fdfc6b79833011fc0c506fe5e0985c0fb1906c -R ad4bcfdba61e39f0bb9e7693f91a62e0 -T +closed 97fdfc6b79833011fc0c506fe5e0985c0fb1906c +P 58704ed1f4cd78bb3b0c095ffd1626906a95a413 +R 464abf9a1fd9120477908520316caad2 U drh -Z d67945416ae9c517bb5d46293eed5eb3 +Z 1a25f8b4acb360c6ad6b1c4bc1cd07e9 diff --git a/manifest.uuid b/manifest.uuid index c14fd41eab..6fd6c73113 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -58704ed1f4cd78bb3b0c095ffd1626906a95a413 \ No newline at end of file +61e2f3575c4a94f9571c28fb2bd19da84b0edceb \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index b1a9104f71..fe1f74addb 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1503,47 +1503,49 @@ void sqlite3GenerateConstraintChecks( /* Generate code to handle collisions */ regR = (pIdx==pPk) ? regIdx : sqlite3GetTempRange(pParse, nPkField); - if( HasRowid(pTab) ){ - sqlite3VdbeAddOp2(v, OP_IdxRowid, iThisCur, regR); - /* Conflict only if the rowid of the existing index entry - ** is different from old-rowid */ - if( isUpdate ){ - sqlite3VdbeAddOp3(v, OP_Eq, regR, addrUniqueOk, regOldData); - } - }else{ - int x; - /* Extract the PRIMARY KEY from the end of the index entry and - ** store it in registers regR..regR+nPk-1 */ - if( (isUpdate || onError==OE_Replace) && pIdx!=pPk ){ - for(i=0; inKeyCol; i++){ - x = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); - sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); - VdbeComment((v, "%s.%s", pTab->zName, - pTab->aCol[pPk->aiColumn[i]].zName)); + if( isUpdate || onError==OE_Replace ){ + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_IdxRowid, iThisCur, regR); + /* Conflict only if the rowid of the existing index entry + ** is different from old-rowid */ + if( isUpdate ){ + sqlite3VdbeAddOp3(v, OP_Eq, regR, addrUniqueOk, regOldData); } - } - if( isUpdate ){ - /* If currently processing the PRIMARY KEY of a WITHOUT ROWID - ** table, only conflict if the new PRIMARY KEY values are actually - ** different from the old. - ** - ** For a UNIQUE index, only conflict if the PRIMARY KEY values - ** of the matched index row are different from the original PRIMARY - ** KEY values of this row before the update. */ - int addrJump = sqlite3VdbeCurrentAddr(v)+pPk->nKeyCol; - int op = OP_Ne; - int regCmp = (pIdx->autoIndex==2 ? regIdx : regR); - - for(i=0; inKeyCol; i++){ - char *p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]); - x = pPk->aiColumn[i]; - if( i==(pPk->nKeyCol-1) ){ - addrJump = addrUniqueOk; - op = OP_Eq; + }else{ + int x; + /* Extract the PRIMARY KEY from the end of the index entry and + ** store it in registers regR..regR+nPk-1 */ + if( (isUpdate || onError==OE_Replace) && pIdx!=pPk ){ + for(i=0; inKeyCol; i++){ + x = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); + sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); + VdbeComment((v, "%s.%s", pTab->zName, + pTab->aCol[pPk->aiColumn[i]].zName)); + } + } + if( isUpdate ){ + /* If currently processing the PRIMARY KEY of a WITHOUT ROWID + ** table, only conflict if the new PRIMARY KEY values are actually + ** different from the old. + ** + ** For a UNIQUE index, only conflict if the PRIMARY KEY values + ** of the matched index row are different from the original PRIMARY + ** KEY values of this row before the update. */ + int addrJump = sqlite3VdbeCurrentAddr(v)+pPk->nKeyCol; + int op = OP_Ne; + int regCmp = (pIdx->autoIndex==2 ? regIdx : regR); + + for(i=0; inKeyCol; i++){ + char *p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]); + x = pPk->aiColumn[i]; + if( i==(pPk->nKeyCol-1) ){ + addrJump = addrUniqueOk; + op = OP_Eq; + } + sqlite3VdbeAddOp4(v, op, + regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ + ); } - sqlite3VdbeAddOp4(v, op, - regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ - ); } } } From edfac3456e86de8b242e8129d25da1d55e0f1ac4 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 19 Dec 2013 02:56:01 +0000 Subject: [PATCH 07/25] Omit an unnecessary OP_Null opcode from UPDATE. FossilOrigin-Name: 72d111336c5016e5b5092dfebcd01253266a7685 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/update.c | 6 ++++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8a760c5b7d..9374f21e09 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sone\sor\smore\spointless\sinstructions\sthat\soccur\sin\sbetween\sOP_NoConflict\nand\sOP_Halt. -D 2013-12-19T02:23:45.916 +C Omit\san\sunnecessary\sOP_Null\sopcode\sfrom\sUPDATE. +D 2013-12-19T02:56:01.711 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -276,7 +276,7 @@ F src/test_vfstrace.c 3a0ab304682fecbceb689e7d9b904211fde11d78 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/tokenize.c ec4c1a62b890bf1dbcdb966399e140b904c700a4 F src/trigger.c d84e1f3669e9a217731a14a9d472b1c7b87c87ba -F src/update.c d1c2477dcf14d90999d1935af4efb4806553250b +F src/update.c 47baf532e3ecec8e4093f92d613384f66785fc2f F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 58704ed1f4cd78bb3b0c095ffd1626906a95a413 -R 464abf9a1fd9120477908520316caad2 +P 61e2f3575c4a94f9571c28fb2bd19da84b0edceb +R df16247ba6ed01ab9a8dff3d1c0e5ea9 U drh -Z 1a25f8b4acb360c6ad6b1c4bc1cd07e9 +Z 56ef984ce433e185375b049dfac62028 diff --git a/manifest.uuid b/manifest.uuid index 6fd6c73113..7255723874 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -61e2f3575c4a94f9571c28fb2bd19da84b0edceb \ No newline at end of file +72d111336c5016e5b5092dfebcd01253266a7685 \ No newline at end of file diff --git a/src/update.c b/src/update.c index 4459a9fb86..b7f0363c1a 100644 --- a/src/update.c +++ b/src/update.c @@ -496,10 +496,10 @@ void sqlite3Update( newmask = sqlite3TriggerColmask( pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError ); - sqlite3VdbeAddOp3(v, OP_Null, 0, regNew, regNew+pTab->nCol-1); + /*sqlite3VdbeAddOp3(v, OP_Null, 0, regNew, regNew+pTab->nCol-1);*/ for(i=0; inCol; i++){ if( i==pTab->iPKey ){ - /*sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);*/ + sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); }else{ j = aXRef[i]; if( j>=0 ){ @@ -513,6 +513,8 @@ void sqlite3Update( testcase( i==31 ); testcase( i==32 ); sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); } } } From a021f121c96a5fe4a1176f30a257b5fe8eb3d2d5 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 19 Dec 2013 14:34:34 +0000 Subject: [PATCH 08/25] Remove an unneeded column-cache flush in aggregate SELECT and an unreachable branch in the INSERT logic. FossilOrigin-Name: ffa092e13b3781677b18418cca40e3dd1e388aed --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/insert.c | 2 +- src/select.c | 1 - 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 9374f21e09..2df9dab23f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\san\sunnecessary\sOP_Null\sopcode\sfrom\sUPDATE. -D 2013-12-19T02:56:01.711 +C Remove\san\sunneeded\scolumn-cache\sflush\sin\saggregate\sSELECT\nand\san\sunreachable\sbranch\sin\sthe\sINSERT\slogic. +D 2013-12-19T14:34:34.832 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -183,7 +183,7 @@ F src/global.c 1d7bb7ea8254ae6a68ed9bfaf65fcb3d1690b486 F src/hash.c ac3470bbf1ca4ae4e306a8ecb0fdf1731810ffe4 F src/hash.h 8890a25af81fb85a9ad7790d32eedab4b994da22 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 -F src/insert.c d1b3fd53cd8e3f232e47675cf2c3d1b1f4101f2a +F src/insert.c f165ba414eda735b327c8126def0a2428f9138de F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12 F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b @@ -219,7 +219,7 @@ F src/printf.c 85d07756e45d7496d19439dcae3e6e9e0090f269 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 -F src/select.c ecb020aa28e030761f6addd0adf5438e938931c1 +F src/select.c 9d13850293cf19e5ffee59b231fa372e16ce65a9 F src/shell.c 18924f6ccfa70da98bf9e388bab512c0fd1e792e F src/sqlite.h.in 4ef56464aeaa3785a2c5ca37fb3a0fb229d68b2e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 61e2f3575c4a94f9571c28fb2bd19da84b0edceb -R df16247ba6ed01ab9a8dff3d1c0e5ea9 +P 72d111336c5016e5b5092dfebcd01253266a7685 +R a48136d424494fa9261ddc391e19f98d U drh -Z 56ef984ce433e185375b049dfac62028 +Z 822c060ba762ff386aec37ff13c59f91 diff --git a/manifest.uuid b/manifest.uuid index 7255723874..33bc14bfb2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -72d111336c5016e5b5092dfebcd01253266a7685 \ No newline at end of file +ffa092e13b3781677b18418cca40e3dd1e388aed \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index fe1f74addb..b3b8444f34 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1515,7 +1515,7 @@ void sqlite3GenerateConstraintChecks( int x; /* Extract the PRIMARY KEY from the end of the index entry and ** store it in registers regR..regR+nPk-1 */ - if( (isUpdate || onError==OE_Replace) && pIdx!=pPk ){ + if( pIdx!=pPk ){ for(i=0; inKeyCol; i++){ x = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); diff --git a/src/select.c b/src/select.c index c394d1c31b..132d546971 100644 --- a/src/select.c +++ b/src/select.c @@ -3875,7 +3875,6 @@ static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){ struct AggInfo_col *pC; pAggInfo->directMode = 1; - sqlite3ExprCacheClear(pParse); for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ int nArg; int addrNext = 0; From f6b1a8e1a58aa577e35224d534b9e2cb5ee8d75b Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 19 Dec 2013 16:26:05 +0000 Subject: [PATCH 09/25] Make sure errors encountered while initializing extensions such as FTS4 get reported out from sqlite3_open(). This fixes a bug introduced by check-in [9d347f547e7ba9]. Also remove lots of forgotten "breakpoint" commands left in test scripts over the years. FossilOrigin-Name: ca3fdfd41961d8d3d1e39d20dc628e8a95dabb2f --- manifest | 50 ++++++++++++++++++++-------------------- manifest.uuid | 2 +- src/main.c | 2 ++ test/attach3.test | 1 - test/capi3.test | 1 - test/collate1.test | 1 - test/exclusive2.test | 1 - test/fts3aa.test | 1 - test/fts3ab.test | 1 - test/fts3ag.test | 1 - test/fts3d.test | 1 - test/fts3near.test | 1 - test/fts3tok1.test | 1 - test/fts4unicode.test | 5 ---- test/mmapfault.test | 1 - test/securedel.test | 1 - test/stat.test | 1 - test/tkt-94c04eaadb.test | 1 - test/vtab_shared.test | 1 - test/wal.test | 1 - test/wal2.test | 1 - test/walfault.test | 1 - 22 files changed, 28 insertions(+), 49 deletions(-) diff --git a/manifest b/manifest index 2df9dab23f..7f912e08b8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunneeded\scolumn-cache\sflush\sin\saggregate\sSELECT\nand\san\sunreachable\sbranch\sin\sthe\sINSERT\slogic. -D 2013-12-19T14:34:34.832 +C Make\ssure\serrors\sencountered\swhile\sinitializing\sextensions\ssuch\sas\sFTS4\nget\sreported\sout\sfrom\ssqlite3_open().\s\sThis\sfixes\sa\sbug\sintroduced\sby\ncheck-in\s[9d347f547e7ba9].\s\sAlso\sremove\slots\sof\sforgotten\s"breakpoint"\ncommands\sleft\sin\stest\sscripts\sover\sthe\syears. +D 2013-12-19T16:26:05.208 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -188,7 +188,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12 F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303 -F src/main.c 45e08d8ca4808625c4512a14898e9c61553e3d2a +F src/main.c 3f00c4adfb5e5dc35b475dbdd475aba83ccf3d17 F src/malloc.c 0203ebce9152c6a0e5de520140b8ba65187350be F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b @@ -324,7 +324,7 @@ F test/async5.test 383ab533fdb9f7ad228cc99ee66e1acb34cc0dc0 F test/atof1.test 08a61df9365c341f334a65f4348897312d8f3db7 F test/attach.test 0d112b7713611fdf0340260192749737135fda5f F test/attach2.test 0ec5defa340363de6cd50fd595046465e9aaba2d -F test/attach3.test d89ccfe4fe6e2b5e368d480fcdfe4b496c54cf4e +F test/attach3.test 359eb65d00102cdfcef6fa4e81dc1648f8f80b27 F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c F test/attachmalloc.test 3a4bfca9545bfe906a8d2e622de10fbac5b711b0 F test/auth.test 9bea29041871807d9f289ee679d05d3ed103642f @@ -364,7 +364,7 @@ F test/btreefault.test c2bcb542685eea44621275cfedbd8a13f65201e3 F test/busy.test 76b4887f8b9160ba903c1ac22e8ff406ad6ae2f0 F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de F test/capi2.test 011c16da245fdc0106a2785035de6b242c05e738 -F test/capi3.test f5eab498a0927d498e6d75c14567addb995ceccb +F test/capi3.test 56ab450125ead38846cbae7e5b6a216686c3cffa F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 93d24621c9ff84da9da060f30431e0453db1cdb0 F test/capi3d.test 6d0fc0a86d73f42dd19a7d8b7761ab9bc02277d0 @@ -374,7 +374,7 @@ F test/check.test 5831ddb6f2c687782eaf2e1a07b6e17f24c4f763 F test/close.test 340bd24cc58b16c6bc01967402755027c37eb815 F test/closure01.test dbb28f1ea9eeaf0a53ec5bc0fed352e479def8c7 F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91 -F test/collate1.test b709989e6e6ff6e1d2bd64231c2c1d8146846c9e +F test/collate1.test 73b91005f264b7c403e2d63a6708d150679ac99a F test/collate2.test 9aaa410a00734e48bcb27f3872617d6f69b2a621 F test/collate3.test 79558a286362cb9ed603c6fa543f1cda7f563f0f F test/collate4.test f04d5168685f2eef637ecfa2d4ddf8ec0d600177 @@ -456,7 +456,7 @@ F test/eqp.test 57c6c604c2807fb5531731c5323133453c24afac F test/errmsg.test f31592a594b44ee121371d25ddd5d63497bb3401 F test/eval.test bc269c365ba877554948441e91ad5373f9f91be3 F test/exclusive.test c7ebbc756eacf544c108b15eed64d7d4e5f86b75 -F test/exclusive2.test 881193eccec225cfed9d7f744b65e57f26adee25 +F test/exclusive2.test 32798111aae78a5deec980eee383213f189df308 F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7 F test/exists.test 8f7b27b61c2fbe5822f0a1f899c715d14e416e30 F test/expr.test 67c9fd6f8f829e239dc8b0f4a08a73c08b09196d @@ -509,13 +509,13 @@ F test/fts2r.test b154c30b63061d8725e320fba1a39e2201cadd5e F test/fts2token.test d8070b241a15ff13592a9ae4a8b7c171af6f445a F test/fts3.test 672a040ea57036fb4b6fdc09027c18d7d24ab654 F test/fts3_common.tcl 99cf6659b87c0f74f55963c2aea03b3a7d66ceb0 -F test/fts3aa.test ad272d695095a55c16a5091dbdcce7c5f55da605 -F test/fts3ab.test 09aeaa162aee6513d9ff336b6932211008b9d1f9 +F test/fts3aa.test edd20ddbbc5b6015ab340abf2ca278ae11ec387d +F test/fts3ab.test 7f6cf260ae80dda064023df8e8e503e9a412b91f F test/fts3ac.test 636ed7486043055d4f126a0e385f2d5a82ebbf63 F test/fts3ad.test e40570cb6f74f059129ad48bcef3d7cbc20dda49 F test/fts3ae.test ce32a13b34b0260928e4213b4481acf801533bda F test/fts3af.test d394978c534eabf22dd0837e718b913fd66b499c -F test/fts3ag.test 0b7d303f61ae5d620c4efb5e825713ea34ff9441 +F test/fts3ag.test c003672a215124df7fc6000036d896f498b26b53 F test/fts3ah.test dc9f66c32c296f1bc8bcc4535126bddfeca62894 F test/fts3ai.test 24058fdc6e9e5102c1fd8459591b114b6a85d285 F test/fts3aj.test 0ed71e1dd9b03b843a857dc3eb9b15630e0104fc @@ -535,7 +535,7 @@ F test/fts3conf.test ee8500c86dd58ec075e8831a1e216a79989436de F test/fts3corrupt.test 2710b77983cc7789295ddbffea52c1d3b7506dbb F test/fts3corrupt2.test 6d96efae2f8a6af3eeaf283aba437e6d0e5447ba F test/fts3cov.test e0fb00d8b715ddae4a94c305992dfc3ef70353d7 -F test/fts3d.test bf640d79722b720fa1c81834c48cdaa45d531b1a +F test/fts3d.test c8a193513a269ec4c205ca09645e26e0bc71b860 F test/fts3defer.test 0be4440b73a2e651fc1e472066686d6ada4b9963 F test/fts3defer2.test a3b6cbeabaf28c9398652a4d101ea224d9358479 F test/fts3defer3.test dd53fc13223c6d8264a98244e9b19abd35ed71cd @@ -549,7 +549,7 @@ F test/fts3fault2.test 3198eef2804deea7cac8403e771d9cbcb752d887 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 F test/fts3matchinfo.test ff423e73faab8fc6d7adeefedf74dd8e2b0b14e0 -F test/fts3near.test 12895557870b0f9af7cc0be81a0171abb2d12f12 +F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905 F test/fts3prefix.test b36d4f00b128a51e7b386cc013a874246d9d7dc1 F test/fts3prefix2.test e1f0a822ca661dced7f12ce392e14eaf65609dce F test/fts3query.test 4fefd43ff24993bc2c9b2778f2bec0cc7629e7ed @@ -557,7 +557,7 @@ F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e F test/fts3snippet.test d524af6bcef4714e059ef559113dbdc924cd33d1 F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca -F test/fts3tok1.test b10d0a12a0ab5f905cea1200b745de233f37443f +F test/fts3tok1.test c551043de056b0b1582a54e878991f57bad074bc F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d F test/fts3varint.test 752c08ed5d32c5d7dc211b056f4ed68a76b7e36e F test/fts4aa.test 0c3152322c7f0b548cc942ad763eaba0da87ccca @@ -571,7 +571,7 @@ F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891 F test/fts4merge3.test aab02a09f50fe6baaddc2e159c3eabc116d45fc7 F test/fts4merge4.test c19c85ca1faa7b6d536832b49c12e1867235f584 F test/fts4noti.test aed33ba44808852dcb24bf70fa132e7bf530f057 -F test/fts4unicode.test e28ba1a14181e709dcdf47455f207adf14c7cfe0 +F test/fts4unicode.test 01ec3fe2a7c3cfff3b4c0581b83caa11b33efa36 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d F test/func.test 00667bbeac044d007f6f021af1b9f6150f0c7ff8 F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f @@ -703,7 +703,7 @@ F test/misuse.test ba4fb5d1a6101d1c171ea38b3c613d0661c83054 F test/mmap1.test 93d167b328255cbe6679fe1e1a23be1b1197d07b F test/mmap2.test 9d6dd9ddb4ad2379f29cc78f38ce1e63ed418022 F test/mmap3.test c92273e16eb8d23c1d55c9815b446bb72ef0512e -F test/mmapfault.test 97507ee06172df99057dbf1c40294eabd82cbb13 +F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3 F test/multiplex.test e08cc7177bd6d85990ee1d71100bb6c684c02256 F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101 @@ -773,7 +773,7 @@ F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5 F test/schema3.test 1bc1008e1f8cb5654b248c55f27249366eb7ed38 F test/schema4.test e6a66e20cc69f0e306667c08be7fda3d11707dc5 F test/schema5.test 29699b4421f183c8f0e88bd28ce7d75d13ea653e -F test/securedel.test 87a2561151af1f1e349071a89fdd77059f50113c +F test/securedel.test 21749c32ccc30f1ea9e4b9f33295a6521ec20fa0 F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 F test/select1.test fc2a61f226a649393664ad54bc5376631801517c F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 @@ -825,7 +825,7 @@ F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b F test/speedtest1.c 47788d552a349241471ad06d239383dadd97164d F test/spellfix.test 8c40b169b104086d8795781f670ba3c786d6d8be F test/sqllimits1.test b1aae27cc98eceb845e7f7adf918561256e31298 -F test/stat.test c8eccfe8fcd3f3cfc864ce22d5b9e803a3c69940 +F test/stat.test 76fd746b85459e812a0193410fb599f0531f22de F test/stmt.test 25d64e3dbf9a3ce89558667d7f39d966fe2a71b9 F test/subquery.test 666fdecceac258f5fd84bed09a64e49d9f37edd9 F test/subquery2.test 91e1e364072aeff431d1f9689b15147e421d88c7 @@ -882,7 +882,7 @@ F test/tkt-80e031a00f.test 9a154173461a4dbe2de49cda73963e04842d52f7 F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c F test/tkt-868145d012.test a5f941107ece6a64410ca4755c6329b7eb57a356 F test/tkt-91e2e8ba6f.test 08c4f94ae07696b05c9b822da0b4e5337a2f54c5 -F test/tkt-94c04eaadb.test fa9c71192f7e2ea2d51bf078bc34e8da6088bf71 +F test/tkt-94c04eaadb.test f738c57c7f68ab8be1c054415af7774617cb6223 F test/tkt-9d68c883.test 458f7d82a523d7644b54b497c986378a7d8c8b67 F test/tkt-9f2eb3abac.test 85bc63e749f050e6a61c8f9207f1eee65c9d3395 F test/tkt-a7b7803e.test 159ef554234fa1f9fb318c751b284bd1cf858da4 @@ -1042,9 +1042,9 @@ F test/vtabE.test 7c4693638d7797ce2eda17af74292b97e705cc61 F test/vtabF.test fd5ad376f5a34fe0891df1f3cddb4fe7c3eb077e F test/vtab_alter.test 9e374885248f69e251bdaacf480b04a197f125e5 F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8 -F test/vtab_shared.test 82f463886e18d7f8395a4b6167c91815efe54839 -F test/wal.test a59d00eaa0901e42b8a2ef21f2a4c972ee1f1bd4 -F test/wal2.test d4b470f13c87f6d8268b004380afa04c3c67cb90 +F test/vtab_shared.test 6acafaae7126c9f49be72c2f57eb8bef3024f1cb +F test/wal.test 40073e54359d43354925b2b700b7eebd5e207285 +F test/wal2.test a8e3963abf6b232cf0b852b09b53665ef34007af F test/wal3.test b22eb662bcbc148c5f6d956eaf94b047f7afe9c0 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c F test/wal5.test 8f888b50f66b78821e61ed0e233ded5de378224b @@ -1059,7 +1059,7 @@ F test/walcksum.test 9afeb96240296c08c72fc524d199c912cfe34daa F test/walcrash.test 451d79e528add5c42764cea74aa2750754171b25 F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36 F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af -F test/walfault.test 54ad6e849c727f4da463964b9eb8c8e8e155cf82 +F test/walfault.test 1f8389f7709877e9b4cc679033d71d6fe529056b F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483 F test/walmode.test 4022fe03ae6e830583672caa101f046438a0473c F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496 @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 72d111336c5016e5b5092dfebcd01253266a7685 -R a48136d424494fa9261ddc391e19f98d +P ffa092e13b3781677b18418cca40e3dd1e388aed +R 62e1d728cd37281433b32cbd44f4c682 U drh -Z 822c060ba762ff386aec37ff13c59f91 +Z 83a1d9d85b0e444eca37253273a68154 diff --git a/manifest.uuid b/manifest.uuid index 33bc14bfb2..44ff93880e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ffa092e13b3781677b18418cca40e3dd1e388aed \ No newline at end of file +ca3fdfd41961d8d3d1e39d20dc628e8a95dabb2f \ No newline at end of file diff --git a/src/main.c b/src/main.c index 32e4dee7f0..d181d6fa00 100644 --- a/src/main.c +++ b/src/main.c @@ -2641,6 +2641,8 @@ static int openDatabase( SQLITE_DEFAULT_LOCKING_MODE); #endif + if( rc ) sqlite3Error(db, rc, 0); + /* Enable the lookaside-malloc subsystem */ setupLookaside(db, 0, sqlite3GlobalConfig.szLookaside, sqlite3GlobalConfig.nLookaside); diff --git a/test/attach3.test b/test/attach3.test index f861425346..1ac10d97a4 100644 --- a/test/attach3.test +++ b/test/attach3.test @@ -322,7 +322,6 @@ do_test attach3-12.9 { db_list } {main temp {}} do_test attach3-12.10 { -breakpoint execsql { DETACH ? } diff --git a/test/capi3.test b/test/capi3.test index 2dbc298fa4..9d7434d25d 100644 --- a/test/capi3.test +++ b/test/capi3.test @@ -1191,7 +1191,6 @@ do_test capi3-18.2 { sqlite3_reset $STMT sqlite3_errcode db } {SQLITE_SCHEMA} -breakpoint do_test capi3-18.3 { sqlite3_errmsg db } {database schema has changed} diff --git a/test/collate1.test b/test/collate1.test index e9ac93aa30..20854157d3 100644 --- a/test/collate1.test +++ b/test/collate1.test @@ -75,7 +75,6 @@ do_test collate1-1.1 { } } {{} 0x119 0x2D} do_test collate1-1.2 { -breakpoint execsql { SELECT c2 FROM collate1t1 ORDER BY 1 COLLATE hex; } diff --git a/test/exclusive2.test b/test/exclusive2.test index 54203e3d8f..712363e762 100644 --- a/test/exclusive2.test +++ b/test/exclusive2.test @@ -301,7 +301,6 @@ do_test exclusive2-3.3 { readPagerChangeCounter test.db } {4} do_test exclusive2-3.4 { -breakpoint execsql { INSERT INTO t1 VALUES(randstr(200, 200)); } diff --git a/test/fts3aa.test b/test/fts3aa.test index bde38af553..6ff384a0d3 100644 --- a/test/fts3aa.test +++ b/test/fts3aa.test @@ -146,7 +146,6 @@ do_test fts3aa-3.3 { execsql {SELECT rowid FROM t1 WHERE content MATCH '-two one'} } {1 5 9 13 17 21 25 29} -breakpoint do_test fts3aa-4.1 { execsql {SELECT rowid FROM t1 WHERE content MATCH 'one OR two'} } {1 2 3 5 6 7 9 10 11 13 14 15 17 18 19 21 22 23 25 26 27 29 30 31} diff --git a/test/fts3ab.test b/test/fts3ab.test index e1f3bdc9cf..86124f78c4 100644 --- a/test/fts3ab.test +++ b/test/fts3ab.test @@ -115,7 +115,6 @@ for {set i 1} {$i<=15} {incr i} { db eval "INSERT INTO t4(norm,plusone,invert) VALUES([join $vset ,]);" } -breakpoint do_test fts3ab-4.1 { execsql {SELECT rowid FROM t4 WHERE t4 MATCH 'norm:one'} } {1 3 5 7 9 11 13 15} diff --git a/test/fts3ag.test b/test/fts3ag.test index 18ed5ae31f..9b658d19df 100644 --- a/test/fts3ag.test +++ b/test/fts3ag.test @@ -78,7 +78,6 @@ do_test fts3ag-1.10 { # Test that docListOrMerge() correctly handles reaching the end of one # doclist before it reaches the end of the other. do_test fts3ag-1.11 { -breakpoint execsql {SELECT rowid FROM t1 WHERE t1 MATCH 'this OR also'} } {1 2} do_test fts3ag-1.12 { diff --git a/test/fts3d.test b/test/fts3d.test index 1ae992b311..818456bfae 100644 --- a/test/fts3d.test +++ b/test/fts3d.test @@ -253,7 +253,6 @@ check_doclist fts3d-4.4.10 1 0 was {[2 0[1]]} # Optimize should leave the result in the level of the highest-level # prior segment. -breakpoint do_test fts3d-4.5 { execsql { SELECT OPTIMIZE(t1) FROM t1 LIMIT 1; diff --git a/test/fts3near.test b/test/fts3near.test index 9276fa3737..2d9981e535 100644 --- a/test/fts3near.test +++ b/test/fts3near.test @@ -165,7 +165,6 @@ do_test fts3near-3.6 { SELECT offsets(t1) FROM t1 WHERE content MATCH 'three NEAR/0 "two four"' } } {{0 0 8 5 0 1 14 3 0 2 18 4}} -breakpoint do_test fts3near-3.7 { execsql { SELECT offsets(t1) FROM t1 WHERE content MATCH '"two four" NEAR/0 three'} diff --git a/test/fts3tok1.test b/test/fts3tok1.test index 4faed34d12..e6fbbe10a2 100644 --- a/test/fts3tok1.test +++ b/test/fts3tok1.test @@ -90,7 +90,6 @@ do_execsql_test 1.13.1 { INSERT INTO c1(x) VALUES('a b c'); INSERT INTO c1(x) VALUES('d e f'); } -breakpoint do_execsql_test 1.13.2 { SELECT * FROM c1, t1 WHERE input = x AND c1.rowid=t1.rowid; } { diff --git a/test/fts4unicode.test b/test/fts4unicode.test index 8edc2877da..f237119a18 100644 --- a/test/fts4unicode.test +++ b/test/fts4unicode.test @@ -392,7 +392,6 @@ foreach T $tokenizers { #------------------------------------------------------------------------- # Test that the private use ranges are treated as alphanumeric. # -breakpoint foreach {tn1 c} { 1 \ue000 2 \ue001 3 \uf000 4 \uf8fe 5 \uf8ff } { @@ -557,7 +556,3 @@ do_execsql_test 11.1 { } finish_test - - - - diff --git a/test/mmapfault.test b/test/mmapfault.test index 248b5bad08..10c5e258b8 100644 --- a/test/mmapfault.test +++ b/test/mmapfault.test @@ -41,7 +41,6 @@ do_test 1-pre { do_faultsim_test 1 -prep { faultsim_restore_and_reopen db func a_string a_string - breakpoint execsql { PRAGMA mmap_size = 1000000; PRAGMA cache_size = 5; diff --git a/test/securedel.test b/test/securedel.test index 7ff5a628a1..7111e08e71 100644 --- a/test/securedel.test +++ b/test/securedel.test @@ -47,7 +47,6 @@ do_test securedel-1.3 { } } {0 0} do_test securedel-1.4 { -breakpoint db eval { PRAGMA secure_delete=ON; PRAGMA db2.secure_delete; diff --git a/test/stat.test b/test/stat.test index f8d3877e36..f0447e4509 100644 --- a/test/stat.test +++ b/test/stat.test @@ -164,7 +164,6 @@ db close forcedelete test.db sqlite3 db test.db register_dbstat_vtab db -breakpoint do_execsql_test stat-5.1 { PRAGMA auto_vacuum = OFF; CREATE VIRTUAL TABLE temp.stat USING dbstat; diff --git a/test/tkt-94c04eaadb.test b/test/tkt-94c04eaadb.test index 0063de664d..9de8aea28d 100644 --- a/test/tkt-94c04eaadb.test +++ b/test/tkt-94c04eaadb.test @@ -44,7 +44,6 @@ do_test tkt-94c94-2.1 { execsql { CREATE TABLE t2(x, y) } db } {} do_test tkt-94c94-2.2 { -breakpoint execsql { INSERT INTO t2 VALUES(1, 2) } db2 } {} do_test tkt-94c94-2.3 { diff --git a/test/vtab_shared.test b/test/vtab_shared.test index 6a76e2749b..13237a8d20 100644 --- a/test/vtab_shared.test +++ b/test/vtab_shared.test @@ -116,7 +116,6 @@ do_test vtab_shared-1.10 { } {1 {database table is locked: sqlite_master}} do_test vtab_shared-1.11 { -breakpoint execsql { CREATE VIRTUAL TABLE t2 USING echo(t0); CREATE VIRTUAL TABLE t3 USING echo(t0); diff --git a/test/wal.test b/test/wal.test index 7435538678..3a69de54f5 100644 --- a/test/wal.test +++ b/test/wal.test @@ -852,7 +852,6 @@ do_test wal-13.1.2 { sqlite3 db test.db execsql { SELECT * FROM t2 } } {B 2} -breakpoint do_test wal-13.1.3 { db close file exists test.db-wal diff --git a/test/wal2.test b/test/wal2.test index 4371e988b2..b331d5ed10 100644 --- a/test/wal2.test +++ b/test/wal2.test @@ -1279,7 +1279,6 @@ foreach {tn settings restart_sync commit_sync ckpt_sync} { PRAGMA synchronous = [lindex $settings 2]; " {0 wal} -if { $tn==2} breakpoint do_test 15.$tn.2 { set sync(normal) 0 set sync(full) 0 diff --git a/test/walfault.test b/test/walfault.test index 4a9d98afda..4e7064d53b 100644 --- a/test/walfault.test +++ b/test/walfault.test @@ -567,7 +567,6 @@ do_test walfault-14-pre { } {} do_faultsim_test walfault-14 -prep { faultsim_restore_and_reopen - breakpoint execsql { SELECT count(*) FROM abc; PRAGMA locking_mode = exclusive; From 1001ee8819a825d2b6076b7f4e98949deb1aef92 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 19 Dec 2013 17:04:58 +0000 Subject: [PATCH 10/25] Do not inject OOM faults into SQLITE_FCNTL_COMMIT_PHASE_TWO file-control invocations. It causes problems for test scripts. FossilOrigin-Name: 8eb28d23e353139d24a8af78309d39249ab9eaf0 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os.c | 16 +++++++++++++++- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 7f912e08b8..0859d915c2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\serrors\sencountered\swhile\sinitializing\sextensions\ssuch\sas\sFTS4\nget\sreported\sout\sfrom\ssqlite3_open().\s\sThis\sfixes\sa\sbug\sintroduced\sby\ncheck-in\s[9d347f547e7ba9].\s\sAlso\sremove\slots\sof\sforgotten\s"breakpoint"\ncommands\sleft\sin\stest\sscripts\sover\sthe\syears. -D 2013-12-19T16:26:05.208 +C Do\snot\sinject\sOOM\sfaults\sinto\sSQLITE_FCNTL_COMMIT_PHASE_TWO\sfile-control\sinvocations.\sIt\scauses\sproblems\sfor\stest\sscripts. +D 2013-12-19T17:04:58.210 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -202,7 +202,7 @@ F src/mutex_noop.c 7682796b7d8d39bf1c138248858efcd10c9e1553 F src/mutex_unix.c c3a4e00f96ba068a8dbef34084465979aaf369cc F src/mutex_w32.c 6108c88e1cb38d8fbb3534b170793815cbedbf97 F src/notify.c 976dd0f6171d4588e89e874fcc765e92914b6d30 -F src/os.c b4ad71336fd96f97776f75587cd9e8218288f5be +F src/os.c 1b147e4cf7cc39e618115c14a086aed44bc91ace F src/os.h 4a46270a64e9193af4a0aaa3bc2c66dc07c29b3f F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04 F src/os_unix.c 60a7b3b23e6fcf83a50d1e320b280b551724e11f @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P ffa092e13b3781677b18418cca40e3dd1e388aed -R 62e1d728cd37281433b32cbd44f4c682 -U drh -Z 83a1d9d85b0e444eca37253273a68154 +P ca3fdfd41961d8d3d1e39d20dc628e8a95dabb2f +R b2d8ac3bed199d88ddec25ed7c70eec6 +U dan +Z b85edb7cdda29606f3560dec5a14157c diff --git a/manifest.uuid b/manifest.uuid index 44ff93880e..5b8bd821b1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ca3fdfd41961d8d3d1e39d20dc628e8a95dabb2f \ No newline at end of file +8eb28d23e353139d24a8af78309d39249ab9eaf0 \ No newline at end of file diff --git a/src/os.c b/src/os.c index be2ea4cfc0..b6c28a1dc4 100644 --- a/src/os.c +++ b/src/os.c @@ -107,7 +107,21 @@ int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){ ** routine has no return value since the return value would be meaningless. */ int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ - DO_OS_MALLOC_TEST(id); +#ifdef SQLITE_TEST + if( op!=SQLITE_FCNTL_COMMIT_PHASETWO ){ + /* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite + ** is using a regular VFS, it is called after the corresponding + ** transaction has been committed. Injecting a fault at this point + ** confuses the test scripts - the COMMIT comand returns SQLITE_NOMEM + ** but the transaction is committed anyway. + ** + ** The core must call OsFileControl() though, not OsFileControlHint(), + ** as if a custom VFS (e.g. zipvfs) returns an error here, it probably + ** means the commit really has failed and an error should be returned + ** to the user. */ + DO_OS_MALLOC_TEST(id); + } +#endif return id->pMethods->xFileControl(id, op, pArg); } void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){ From 7e61d18eb4dfaae65f151c8bd9ad01cde1e5bb58 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2013 13:11:45 +0000 Subject: [PATCH 11/25] Simplify the accumulator reset for aggregate query processing so that it uses a single multi-register OP_Null rather than a separate OP_Null for each register. FossilOrigin-Name: 2c7fd9b043f5f3d9d8e22dbefa84a9770ca951d0 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 21 ++++++++++++++++----- src/sqliteInt.h | 1 + 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 0859d915c2..5cf3f29245 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sinject\sOOM\sfaults\sinto\sSQLITE_FCNTL_COMMIT_PHASE_TWO\sfile-control\sinvocations.\sIt\scauses\sproblems\sfor\stest\sscripts. -D 2013-12-19T17:04:58.210 +C Simplify\sthe\saccumulator\sreset\sfor\saggregate\squery\sprocessing\sso\sthat\sit\nuses\sa\ssingle\smulti-register\sOP_Null\srather\sthan\sa\sseparate\sOP_Null\sfor\seach\nregister. +D 2013-12-20T13:11:45.101 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -219,12 +219,12 @@ F src/printf.c 85d07756e45d7496d19439dcae3e6e9e0090f269 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 -F src/select.c 9d13850293cf19e5ffee59b231fa372e16ce65a9 +F src/select.c 819bb090c9a348d17f69f136cad2bfa9ee9cbb41 F src/shell.c 18924f6ccfa70da98bf9e388bab512c0fd1e792e F src/sqlite.h.in 4ef56464aeaa3785a2c5ca37fb3a0fb229d68b2e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc -F src/sqliteInt.h b7e9da87740488671cfe4c70038a8eef3a1d317e +F src/sqliteInt.h d0815177df125e900056e1e692504435e7610793 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P ca3fdfd41961d8d3d1e39d20dc628e8a95dabb2f -R b2d8ac3bed199d88ddec25ed7c70eec6 -U dan -Z b85edb7cdda29606f3560dec5a14157c +P 8eb28d23e353139d24a8af78309d39249ab9eaf0 +R 488c9d6501762ac1c5b904ecc4a5a8a0 +U drh +Z c5be2c2c1ecdd01c10eef8b3332d3737 diff --git a/manifest.uuid b/manifest.uuid index 5b8bd821b1..d0d554d6c8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8eb28d23e353139d24a8af78309d39249ab9eaf0 \ No newline at end of file +2c7fd9b043f5f3d9d8e22dbefa84a9770ca951d0 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 132d546971..d075116749 100644 --- a/src/select.c +++ b/src/select.c @@ -3822,14 +3822,23 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ Vdbe *v = pParse->pVdbe; int i; struct AggInfo_func *pFunc; - if( pAggInfo->nFunc+pAggInfo->nColumn==0 ){ - return; - } + int nReg = pAggInfo->nFunc + pAggInfo->nColumn; + if( nReg==0 ) return; +#ifdef SQLITE_DEBUG + /* Verify that all AggInfo registers are within the range specified by + ** AggInfo.mnReg..AggInfo.mxReg */ + assert( nReg==pAggInfo->mxReg-pAggInfo->mnReg+1 ); for(i=0; inColumn; i++){ - sqlite3VdbeAddOp2(v, OP_Null, 0, pAggInfo->aCol[i].iMem); + assert( pAggInfo->aCol[i].iMem>=pAggInfo->mnReg + && pAggInfo->aCol[i].iMem<=pAggInfo->mxReg ); } + for(i=0; inFunc; i++){ + assert( pAggInfo->aFunc[i].iMem>=pAggInfo->mnReg + && pAggInfo->aFunc[i].iMem<=pAggInfo->mxReg ); + } +#endif + sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg); for(pFunc=pAggInfo->aFunc, i=0; inFunc; i++, pFunc++){ - sqlite3VdbeAddOp2(v, OP_Null, 0, pFunc->iMem); if( pFunc->iDistinct>=0 ){ Expr *pE = pFunc->pExpr; assert( !ExprHasProperty(pE, EP_xIsSelect) ); @@ -4407,6 +4416,7 @@ int sqlite3Select( sNC.pParse = pParse; sNC.pSrcList = pTabList; sNC.pAggInfo = &sAggInfo; + sAggInfo.mnReg = pParse->nMem+1; sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr+1 : 0; sAggInfo.pGroupBy = pGroupBy; sqlite3ExprAnalyzeAggList(&sNC, pEList); @@ -4421,6 +4431,7 @@ int sqlite3Select( sqlite3ExprAnalyzeAggList(&sNC, sAggInfo.aFunc[i].pExpr->x.pList); sNC.ncFlags &= ~NC_InAggFunc; } + sAggInfo.mxReg = pParse->nMem; if( db->mallocFailed ) goto select_end; /* Processing for aggregates with GROUP BY is very different and diff --git a/src/sqliteInt.h b/src/sqliteInt.h index af018edf01..a33ff4d43b 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1688,6 +1688,7 @@ struct AggInfo { int sortingIdx; /* Cursor number of the sorting index */ int sortingIdxPTab; /* Cursor number of pseudo-table */ int nSortingColumn; /* Number of columns in the sorting index */ + int mnReg, mxReg; /* Range of registers allocated for aCol and aFunc */ ExprList *pGroupBy; /* The group by clause */ struct AggInfo_col { /* For each column used in source tables */ Table *pTab; /* Source table */ From aed1819875bbb39fe4c75f329e103183f03c3124 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2013 14:48:12 +0000 Subject: [PATCH 12/25] Allow any arbitrary expression as the filename in an ATTACH statement, including functions and subqueries. FossilOrigin-Name: df70a1f30393b34146d6b8bf1df5a76aaf362efe --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/attach.c | 4 ---- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 5cf3f29245..2ff177f432 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\sthe\saccumulator\sreset\sfor\saggregate\squery\sprocessing\sso\sthat\sit\nuses\sa\ssingle\smulti-register\sOP_Null\srather\sthan\sa\sseparate\sOP_Null\sfor\seach\nregister. -D 2013-12-20T13:11:45.101 +C Allow\sany\sarbitrary\sexpression\sas\sthe\sfilename\sin\san\sATTACH\sstatement,\nincluding\sfunctions\sand\ssubqueries. +D 2013-12-20T14:48:12.779 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -161,7 +161,7 @@ F sqlite3.1 6be1ad09113570e1fc8dcaff84c9b0b337db5ffc F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c 2af0330bb1b601af7a7789bf7229675fd772a083 F src/analyze.c 581d5c18ce89c6f45d4dca65914d0de5b4dad41f -F src/attach.c 0a17c9364895316ca4f52d06a97a72c0af1ae8b3 +F src/attach.c 3801129015ef59d76bf23c95ef9b0069d18a0c52 F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 F src/backup.c a729e63cf5cd1829507cb7b8e89f99b95141bb53 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 8eb28d23e353139d24a8af78309d39249ab9eaf0 -R 488c9d6501762ac1c5b904ecc4a5a8a0 +P 2c7fd9b043f5f3d9d8e22dbefa84a9770ca951d0 +R d11a12f8bb29004dd6853b4e5004e340 U drh -Z c5be2c2c1ecdd01c10eef8b3332d3737 +Z efe52f7d54c1916342aa04894f1853b2 diff --git a/manifest.uuid b/manifest.uuid index d0d554d6c8..d13944d925 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2c7fd9b043f5f3d9d8e22dbefa84a9770ca951d0 \ No newline at end of file +df70a1f30393b34146d6b8bf1df5a76aaf362efe \ No newline at end of file diff --git a/src/attach.c b/src/attach.c index 223c166482..89050fd9dc 100644 --- a/src/attach.c +++ b/src/attach.c @@ -38,10 +38,6 @@ static int resolveAttachExpr(NameContext *pName, Expr *pExpr) if( pExpr ){ if( pExpr->op!=TK_ID ){ rc = sqlite3ResolveExprNames(pName, pExpr); - if( rc==SQLITE_OK && !sqlite3ExprIsConstant(pExpr) ){ - sqlite3ErrorMsg(pName->pParse, "invalid name: \"%s\"", pExpr->u.zToken); - return SQLITE_ERROR; - } }else{ pExpr->op = TK_STRING; } From 4eded604ea64ac459f46887de90cf3586589da5a Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2013 15:59:20 +0000 Subject: [PATCH 13/25] Combine adjacent single-register OP_Copy instructions into a single multi-register OP_Copy, where possible. Fix the Synopsis comment for multi-register OP_Copy instructions to show the correct register ranges. FossilOrigin-Name: 2ae22dc0cbed2feca4baf89d02aaace0331971d6 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 12 +++++++++++- src/vdbe.c | 2 +- src/vdbeaux.c | 23 +++++++++++++++++++++-- 5 files changed, 42 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 2ff177f432..e722b985a6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sany\sarbitrary\sexpression\sas\sthe\sfilename\sin\san\sATTACH\sstatement,\nincluding\sfunctions\sand\ssubqueries. -D 2013-12-20T14:48:12.779 +C Combine\sadjacent\ssingle-register\sOP_Copy\sinstructions\sinto\sa\ssingle\nmulti-register\sOP_Copy,\swhere\spossible.\s\sFix\sthe\sSynopsis\scomment\sfor\nmulti-register\sOP_Copy\sinstructions\sto\sshow\sthe\scorrect\sregister\sranges. +D 2013-12-20T15:59:20.716 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -175,7 +175,7 @@ F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd F src/date.c 593c744b2623971e45affd0bde347631bdfa4625 F src/delete.c b36db1f79ee50eaca979660c9dd36437f5410b93 -F src/expr.c 962c29881bcee9e1d7b556020c1d29dc8bd8b906 +F src/expr.c ffe4bc79c66f711f450a6113fbd1943b9b2380f7 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 2ab0f5384b70594468ef3ac5c7ed8ca24bfd17d5 F src/func.c 6325ac2ec10833ccf4d5c36d323709221d37ea19 @@ -280,11 +280,11 @@ F src/update.c 47baf532e3ecec8e4093f92d613384f66785fc2f F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 -F src/vdbe.c 919422843c859a1db08db0c88189912dbf625fc7 +F src/vdbe.c 6bcf27a80c3fdffee649f12eae91522718a06a64 F src/vdbe.h c3278ab2b410f17acf61faf91be7bce3fd466e8b F src/vdbeInt.h 8a4d2d69955570bb74a092c3cdbab04afb554963 F src/vdbeapi.c ce4e68ea4842cc6081046f533d088dcf01d247ad -F src/vdbeaux.c 70aa77f7db7b9b627bbc44a4546deef8ba56c51b +F src/vdbeaux.c 6fb0607776fe707a12e1859e66fc94b439966274 F src/vdbeblob.c bc40f98f256f0b34116d6a44b114da4a81a15d33 F src/vdbemem.c 0e69351b2c6ff7d8b638688c0ae336a26befa6b2 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147 @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 2c7fd9b043f5f3d9d8e22dbefa84a9770ca951d0 -R d11a12f8bb29004dd6853b4e5004e340 +P df70a1f30393b34146d6b8bf1df5a76aaf362efe +R ae7f2b624bd6d9dcdad2f041ed2699ab U drh -Z efe52f7d54c1916342aa04894f1853b2 +Z e4024102bfc5328ec565d390ad91c722 diff --git a/manifest.uuid b/manifest.uuid index d13944d925..c405d4165d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -df70a1f30393b34146d6b8bf1df5a76aaf362efe \ No newline at end of file +2ae22dc0cbed2feca4baf89d02aaace0331971d6 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 81eb00c968..8ee73acb78 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3428,7 +3428,17 @@ int sqlite3ExprCodeExprList( }else{ int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i); if( inReg!=target+i ){ - sqlite3VdbeAddOp2(pParse->pVdbe, copyOp, inReg, target+i); + VdbeOp *pOp; + Vdbe *v = pParse->pVdbe; + if( copyOp==OP_Copy + && (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy + && pOp->p1+pOp->p3+1==inReg + && pOp->p2+pOp->p3+1==target+i + ){ + pOp->p3++; + }else{ + sqlite3VdbeAddOp2(v, copyOp, inReg, target+i); + } } } } diff --git a/src/vdbe.c b/src/vdbe.c index 3361120933..bbc6d3f7f6 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1111,7 +1111,7 @@ case OP_Move: { } /* Opcode: Copy P1 P2 P3 * * -** Synopsis: r[P2@P3]=r[P1@P3] +** Synopsis: r[P2@P3+1]=r[P1@P3+1] ** ** Make a copy of registers P1..P1+P3 into registers P2..P2+P3. ** diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 068059e594..8e95de70c1 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -885,7 +885,17 @@ static int translateP(char c, const Op *pOp){ } /* -** Compute a string for the "comment" field of a VDBE opcode listing +** Compute a string for the "comment" field of a VDBE opcode listing. +** +** The Synopsis: field in comments in the vdbe.c source file gets converted +** to an extra string that is appended to the sqlite3OpcodeName(). In the +** absence of other comments, this synopsis becomes the comment on the opcode. +** Some translation occurs: +** +** "PX" -> "r[X]" +** "PX@PY" -> "r[X..X+Y-1]" or "r[x]" if y is 0 or 1 +** "PX@PY+1" -> "r[X..X+Y]" or "r[x]" if y is 0 +** "PY..PY" -> "r[X..Y]" or "r[x]" if y<=x */ static int displayComment( const Op *pOp, /* The opcode to be commented */ @@ -919,7 +929,13 @@ static int displayComment( ii += 3; jj += sqlite3Strlen30(zTemp+jj); v2 = translateP(zSynopsis[ii], pOp); - if( v2>1 ) sqlite3_snprintf(nTemp-jj, zTemp+jj, "..%d", v1+v2-1); + if( strncmp(zSynopsis+ii+1,"+1",2)==0 ){ + ii += 2; + v2++; + } + if( v2>1 ){ + sqlite3_snprintf(nTemp-jj, zTemp+jj, "..%d", v1+v2-1); + } }else if( strncmp(zSynopsis+ii+1, "..P3", 4)==0 && pOp->p3==0 ){ ii += 4; } @@ -1151,6 +1167,9 @@ void sqlite3VdbePrintOp(FILE *pOut, int pc, Op *pOp){ #else zCom[0] = 0 #endif + /* NB: The sqlite3OpcodeName() function is implemented by code created + ** by the mkopcodeh.awk and mkopcodec.awk scripts which extract the + ** information from the vdbe.c source text */ fprintf(pOut, zFormat1, pc, sqlite3OpcodeName(pOp->opcode), pOp->p1, pOp->p2, pOp->p3, zP4, pOp->p5, zCom From d42ef839bc175303258114a7db99f9f9e065b690 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2013 18:44:35 +0000 Subject: [PATCH 14/25] Code simplification in sqlite3GenerateIndexKey() by making use of a subroutine found over in expr.c. FossilOrigin-Name: 0026d3355340d66687a3fd4cbece28811ef1b505 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/delete.c | 12 ++---------- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index e722b985a6..25a05f6a27 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Combine\sadjacent\ssingle-register\sOP_Copy\sinstructions\sinto\sa\ssingle\nmulti-register\sOP_Copy,\swhere\spossible.\s\sFix\sthe\sSynopsis\scomment\sfor\nmulti-register\sOP_Copy\sinstructions\sto\sshow\sthe\scorrect\sregister\sranges. -D 2013-12-20T15:59:20.716 +C Code\ssimplification\sin\ssqlite3GenerateIndexKey()\sby\smaking\suse\sof\sa\ssubroutine\nfound\sover\sin\sexpr.c. +D 2013-12-20T18:44:35.386 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -174,7 +174,7 @@ F src/callback.c 174e3c8656bc29f91d710ab61550d16eea34be98 F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd F src/date.c 593c744b2623971e45affd0bde347631bdfa4625 -F src/delete.c b36db1f79ee50eaca979660c9dd36437f5410b93 +F src/delete.c 821da82527c24496bef0677ed4f61a53b44c27ee F src/expr.c ffe4bc79c66f711f450a6113fbd1943b9b2380f7 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 2ab0f5384b70594468ef3ac5c7ed8ca24bfd17d5 @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P df70a1f30393b34146d6b8bf1df5a76aaf362efe -R ae7f2b624bd6d9dcdad2f041ed2699ab +P 2ae22dc0cbed2feca4baf89d02aaace0331971d6 +R 5c55bdf162e02aeda0ecbd1279176bdc U drh -Z e4024102bfc5328ec565d390ad91c722 +Z da74200164ac95fa24bb1bb84f137616 diff --git a/manifest.uuid b/manifest.uuid index c405d4165d..f0698ae6a2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2ae22dc0cbed2feca4baf89d02aaace0331971d6 \ No newline at end of file +0026d3355340d66687a3fd4cbece28811ef1b505 \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index 5315db9e71..8746cd324a 100644 --- a/src/delete.c +++ b/src/delete.c @@ -768,7 +768,6 @@ int sqlite3GenerateIndexKey( Table *pTab = pIdx->pTable; int regBase; int nCol; - Index *pPk; if( piPartIdxLabel ){ if( pIdx->pPartIdxWhere ){ @@ -782,16 +781,9 @@ int sqlite3GenerateIndexKey( } nCol = (prefixOnly && pIdx->uniqNotNull) ? pIdx->nKeyCol : pIdx->nColumn; regBase = sqlite3GetTempRange(pParse, nCol); - pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); for(j=0; jaiColumn[j]; - if( pPk ) idx = sqlite3ColumnOfIndex(pPk, idx); - if( idx<0 || idx==pTab->iPKey ){ - sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regBase+j); - }else{ - sqlite3VdbeAddOp3(v, OP_Column, iDataCur, idx, regBase+j); - sqlite3ColumnDefault(v, pTab, pIdx->aiColumn[j], -1); - } + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, pIdx->aiColumn[j], + regBase+j); } if( regOut ){ const char *zAff; From a47941fe428060643a3e23a6d898f857a57a7fe7 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 20 Dec 2013 18:57:44 +0000 Subject: [PATCH 15/25] Fix compiler harmless warnings in tclsqlite.c that appeared with GCC 4.8.x. FossilOrigin-Name: d93ae6833a7fca0672caf902a7b48846e54242cd --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/tclsqlite.c | 9 ++++----- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 25a05f6a27..7338e24330 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Code\ssimplification\sin\ssqlite3GenerateIndexKey()\sby\smaking\suse\sof\sa\ssubroutine\nfound\sover\sin\sexpr.c. -D 2013-12-20T18:44:35.386 +C Fix\scompiler\sharmless\swarnings\sin\stclsqlite.c\sthat\sappeared\swith\sGCC\s4.8.x. +D 2013-12-20T18:57:44.631 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -228,7 +228,7 @@ F src/sqliteInt.h d0815177df125e900056e1e692504435e7610793 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e -F src/tclsqlite.c 651b10698c87bbc3ae5772e2491e3444c5bbf153 +F src/tclsqlite.c c43379f77f90399802b0e215faa71c0adc3a4d2e F src/test1.c 633e5e6a116acf4473b9289240bcceb5320a9d93 F src/test2.c 7355101c085304b90024f2261e056cdff13c6c35 F src/test3.c 1c0e5d6f080b8e33c1ce8b3078e7013fdbcd560c @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 2ae22dc0cbed2feca4baf89d02aaace0331971d6 -R 5c55bdf162e02aeda0ecbd1279176bdc +P 0026d3355340d66687a3fd4cbece28811ef1b505 +R 1e7ba7ea1368145f32bc284eea0efbfc U drh -Z da74200164ac95fa24bb1bb84f137616 +Z b38a5e6618ad563a8f912c35a2908336 diff --git a/manifest.uuid b/manifest.uuid index f0698ae6a2..ab92cc76ab 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0026d3355340d66687a3fd4cbece28811ef1b505 \ No newline at end of file +d93ae6833a7fca0672caf902a7b48846e54242cd \ No newline at end of file diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 0f57dda6ca..e3e5628b17 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -1530,9 +1530,9 @@ static int DbUseNre(void){ */ # define SQLITE_TCL_NRE 0 # define DbUseNre() 0 -# define Tcl_NRAddCallback(a,b,c,d,e,f) 0 +# define Tcl_NRAddCallback(a,b,c,d,e,f) (void)0 # define Tcl_NREvalObj(a,b,c) 0 -# define Tcl_NRCreateCommand(a,b,c,d,e,f) 0 +# define Tcl_NRCreateCommand(a,b,c,d,e,f) (void)0 #endif /* @@ -2770,7 +2770,7 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ ** or savepoint. */ if( DbUseNre() ){ Tcl_NRAddCallback(interp, DbTransPostCmd, cd, 0, 0, 0); - Tcl_NREvalObj(interp, pScript, 0); + (void)Tcl_NREvalObj(interp, pScript, 0); }else{ rc = DbTransPostCmd(&cd, interp, Tcl_EvalObjEx(interp, pScript, 0)); } @@ -3371,8 +3371,7 @@ static void MD5Final(unsigned char digest[16], MD5Context *ctx){ byteReverse(ctx->in, 14); /* Append length in bits and transform */ - ((uint32 *)ctx->in)[ 14 ] = ctx->bits[0]; - ((uint32 *)ctx->in)[ 15 ] = ctx->bits[1]; + memcpy(ctx->in + 14*4, ctx->bits, 8); MD5Transform(ctx->buf, (uint32 *)ctx->in); byteReverse((unsigned char *)ctx->buf, 4); From ae28d6efc697f98f38f9d53fbb26556c82d86148 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 21 Dec 2013 00:04:37 +0000 Subject: [PATCH 16/25] Add a case to speedtest1.c that demonstrates the need to factor OP_Column operators out of inner loops. FossilOrigin-Name: 69a17336fdf4ae891e815914be8942f7222230c2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest1.c | 23 ++++++++++++++++++++++- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7338e24330..54ee0ed6bb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\scompiler\sharmless\swarnings\sin\stclsqlite.c\sthat\sappeared\swith\sGCC\s4.8.x. -D 2013-12-20T18:57:44.631 +C Add\sa\scase\sto\sspeedtest1.c\sthat\sdemonstrates\sthe\sneed\sto\sfactor\sOP_Column\noperators\sout\sof\sinner\sloops. +D 2013-12-21T00:04:37.543 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -822,7 +822,7 @@ F test/speed3.test d32043614c08c53eafdc80f33191d5bd9b920523 F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b -F test/speedtest1.c 47788d552a349241471ad06d239383dadd97164d +F test/speedtest1.c 60d9ebc64c036ee7803cc5323ef5204686312f5b F test/spellfix.test 8c40b169b104086d8795781f670ba3c786d6d8be F test/sqllimits1.test b1aae27cc98eceb845e7f7adf918561256e31298 F test/stat.test 76fd746b85459e812a0193410fb599f0531f22de @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 0026d3355340d66687a3fd4cbece28811ef1b505 -R 1e7ba7ea1368145f32bc284eea0efbfc +P d93ae6833a7fca0672caf902a7b48846e54242cd +R 1bba9a023d69c9c6d571dcfd3bfe83d6 U drh -Z b38a5e6618ad563a8f912c35a2908336 +Z 60543214dfc95183844c1868498ec509 diff --git a/manifest.uuid b/manifest.uuid index ab92cc76ab..d06af4fa26 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d93ae6833a7fca0672caf902a7b48846e54242cd \ No newline at end of file +69a17336fdf4ae891e815914be8942f7222230c2 \ No newline at end of file diff --git a/test/speedtest1.c b/test/speedtest1.c index 51735de02a..6137720ee0 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -378,6 +378,19 @@ static void randomFunc( sqlite3_result_int64(context, (sqlite3_int64)speedtest1_random()); } +/* Estimate the square root of an integer */ +static int est_square_root(int x){ + int y0 = x/2; + int y1; + int n; + for(n=0; y0>0 && n<10; n++){ + y1 = (y0 + x/y0)/2; + if( y1==y0 ) break; + y0 = y1; + } + return y0; +} + /* ** The main and default testset */ @@ -692,7 +705,15 @@ void testset_main(void){ speedtest1_exec("COMMIT"); speedtest1_end_test(); - + speedtest1_begin_test(320, "subquery in result set", n); + speedtest1_prepare( + "SELECT sum(a), max(c),\n" + " avg((SELECT a FROM t2 WHERE 5+t2.b=t1.b) AND rowid Date: Sat, 21 Dec 2013 15:46:06 +0000 Subject: [PATCH 17/25] Fix the ".echo on" dot-command of the shell so that it echos comments in addition to SQL statements and dot-commands. Add the --explain option to speedtest1 so that the output can be piped into the command-line shell to show nicely-formated VDBE code for the entire test. FossilOrigin-Name: 96397263f94256e284aae9506de1fc48fea89193 --- manifest | 16 ++++++------- manifest.uuid | 2 +- src/shell.c | 6 ++++- test/shell2.test | 6 +++-- test/speedtest1.c | 60 +++++++++++++++++++++++++++++------------------ 5 files changed, 55 insertions(+), 35 deletions(-) diff --git a/manifest b/manifest index 54ee0ed6bb..d556779ff4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\scase\sto\sspeedtest1.c\sthat\sdemonstrates\sthe\sneed\sto\sfactor\sOP_Column\noperators\sout\sof\sinner\sloops. -D 2013-12-21T00:04:37.543 +C Fix\sthe\s".echo\son"\sdot-command\sof\sthe\sshell\sso\sthat\sit\sechos\scomments\sin\naddition\sto\sSQL\sstatements\sand\sdot-commands.\s\sAdd\sthe\s--explain\soption\nto\sspeedtest1\sso\sthat\sthe\soutput\scan\sbe\spiped\sinto\sthe\scommand-line\sshell\nto\sshow\snicely-formated\sVDBE\scode\sfor\sthe\sentire\stest. +D 2013-12-21T15:46:06.562 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -220,7 +220,7 @@ F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c 819bb090c9a348d17f69f136cad2bfa9ee9cbb41 -F src/shell.c 18924f6ccfa70da98bf9e388bab512c0fd1e792e +F src/shell.c a3541193d5fce37e91dad8ef46a9505aa7c9b344 F src/sqlite.h.in 4ef56464aeaa3785a2c5ca37fb3a0fb229d68b2e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc @@ -802,7 +802,7 @@ F test/sharedA.test 0cdf1a76dfa00e6beee66af5b534b1e8df2720f5 F test/shared_err.test 0079c05c97d88cfa03989b7c20a8b266983087aa F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 F test/shell1.test e7c0b9ebda25d5e78f0a3ea0dc4e31bb6d8098c0 -F test/shell2.test e1d3790f064e50b2f973502f45750012667486df +F test/shell2.test c57da3a381c099b02c813ba156298d5c2f5c93a3 F test/shell3.test 5e8545ec72c4413a0e8d4c6be56496e3c257ca29 F test/shell4.test aa4eef8118b412d1a01477a53426ece169ea86a9 F test/shell5.test cee83b4385f842fec1f2a0bec9ea811f35386edf @@ -822,7 +822,7 @@ F test/speed3.test d32043614c08c53eafdc80f33191d5bd9b920523 F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b -F test/speedtest1.c 60d9ebc64c036ee7803cc5323ef5204686312f5b +F test/speedtest1.c 0fb5502e0879e18991e7ecc791b41ba1c7fa74e8 F test/spellfix.test 8c40b169b104086d8795781f670ba3c786d6d8be F test/sqllimits1.test b1aae27cc98eceb845e7f7adf918561256e31298 F test/stat.test 76fd746b85459e812a0193410fb599f0531f22de @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P d93ae6833a7fca0672caf902a7b48846e54242cd -R 1bba9a023d69c9c6d571dcfd3bfe83d6 +P 69a17336fdf4ae891e815914be8942f7222230c2 +R f8c33eb19f28c61795b29a236555d23d U drh -Z 60543214dfc95183844c1868498ec509 +Z 526508e712c84b42d21bbec0b02b9c9e diff --git a/manifest.uuid b/manifest.uuid index d06af4fa26..b9cf9f2e0b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -69a17336fdf4ae891e815914be8942f7222230c2 \ No newline at end of file +96397263f94256e284aae9506de1fc48fea89193 \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index 7826fdf204..00cff6a8e5 100644 --- a/src/shell.c +++ b/src/shell.c @@ -3038,7 +3038,10 @@ static int process_input(struct callback_data *p, FILE *in){ seenInterrupt = 0; } lineno++; - if( nSql==0 && _all_whitespace(zLine) ) continue; + if( nSql==0 && _all_whitespace(zLine) ){ + if( p->echoOn ) printf("%s\n", zLine); + continue; + } if( zLine && zLine[0]=='.' && nSql==0 ){ if( p->echoOn ) printf("%s\n", zLine); rc = do_meta_command(zLine, p); @@ -3100,6 +3103,7 @@ static int process_input(struct callback_data *p, FILE *in){ } nSql = 0; }else if( nSql && _all_whitespace(zSql) ){ + if( p->echoOn ) printf("%s\n", zSql); nSql = 0; } } diff --git a/test/shell2.test b/test/shell2.test index f02d788415..def574c76c 100644 --- a/test/shell2.test +++ b/test/shell2.test @@ -155,7 +155,8 @@ SELECT * FROM foo1; 2 SELECT * FROM foo2; 1 -2}} +2 +}} # Test with echo on and headers on using dot command and # multiple commands per line. @@ -192,6 +193,7 @@ a SELECT * FROM foo2; b 1 -2}} +2 +}} finish_test diff --git a/test/speedtest1.c b/test/speedtest1.c index 6137720ee0..57d21b26c4 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -9,6 +9,7 @@ static const char zHelp[] = " --autovacuum Enable AUTOVACUUM mode\n" " --cachesize N Set the cache size to N\n" " --exclusive Enable locking_mode=EXCLUSIVE\n" + " --explain Like --sqlonly but with added EXPLAIN keywords\n" " --heap SZ MIN Memory allocator uses SZ bytes & min allocation MIN\n" " --incrvacuum Enable incremenatal vacuum mode\n" " --journalmode M Set the journal_mode to MODE\n" @@ -49,6 +50,7 @@ static struct Global { int bWithoutRowid; /* True for --without-rowid */ int bReprepare; /* True to reprepare the SQL on each rerun */ int bSqlOnly; /* True to print the SQL once only */ + int bExplain; /* Print SQL with EXPLAIN prefix */ int szTest; /* Scale factor for test iterations */ const char *zWR; /* Might be WITHOUT ROWID */ const char *zNN; /* Might be NOT NULL */ @@ -290,6 +292,22 @@ void speedtest1_final(void){ } } +/* Print an SQL statement to standard output */ +static void printSql(const char *zSql){ + int n = (int)strlen(zSql); + while( n>0 && (zSql[n-1]==';' || isspace(zSql[n-1])) ){ n--; } + if( g.bExplain ) printf("EXPLAIN "); + printf("%.*s;\n", n, zSql); + if( g.bExplain + && (sqlite3_strglob("CREATE *", zSql) + || sqlite3_strglob("DROP *", zSql) + || sqlite3_strglob("ALTER *", zSql) + ) + ){ + printf("%.*s;\n", n, zSql); + } +} + /* Run SQL */ void speedtest1_exec(const char *zFormat, ...){ va_list ap; @@ -298,9 +316,7 @@ void speedtest1_exec(const char *zFormat, ...){ zSql = sqlite3_vmprintf(zFormat, ap); va_end(ap); if( g.bSqlOnly ){ - int n = (int)strlen(zSql); - while( n>0 && (zSql[n-1]==';' || isspace(zSql[n-1])) ){ n--; } - printf("%.*s;\n", n, zSql); + printSql(zSql); }else{ char *zErrMsg = 0; int rc = sqlite3_exec(g.db, zSql, 0, 0, &zErrMsg); @@ -318,9 +334,7 @@ void speedtest1_prepare(const char *zFormat, ...){ zSql = sqlite3_vmprintf(zFormat, ap); va_end(ap); if( g.bSqlOnly ){ - int n = (int)strlen(zSql); - while( n>0 && (zSql[n-1]==';' || isspace(zSql[n-1])) ){ n--; } - printf("%.*s;\n", n, zSql); + printSql(zSql); }else{ int rc; if( g.pStmt ) sqlite3_finalize(g.pStmt); @@ -497,15 +511,13 @@ void testset_main(void){ speedtest1_begin_test(150, "CREATE INDEX five times"); - speedtest1_exec( - "BEGIN;\n" - "CREATE UNIQUE INDEX t1b ON t1(b);\n" - "CREATE INDEX t1c ON t1(c);\n" - "CREATE UNIQUE INDEX t2b ON t2(b);\n" - "CREATE INDEX t2c ON t2(c DESC);\n" - "CREATE INDEX t3bc ON t3(b,c);\n" - "COMMIT;\n" - ); + speedtest1_exec("BEGIN;"); + speedtest1_exec("CREATE UNIQUE INDEX t1b ON t1(b);"); + speedtest1_exec("CREATE INDEX t1c ON t1(c);"); + speedtest1_exec("CREATE UNIQUE INDEX t2b ON t2(b);"); + speedtest1_exec("CREATE INDEX t2c ON t2(c DESC);"); + speedtest1_exec("CREATE INDEX t3bc ON t3(b,c);"); + speedtest1_exec("COMMIT;"); speedtest1_end_test(); @@ -579,10 +591,8 @@ void testset_main(void){ n = sz; speedtest1_begin_test(190, "DELETE and REFILL one table", n); - speedtest1_exec( - "DELETE FROM t2;" - "INSERT INTO t2 SELECT * FROM t1;" - ); + speedtest1_exec("DELETE FROM t2;"); + speedtest1_exec("INSERT INTO t2 SELECT * FROM t1;"); speedtest1_end_test(); @@ -678,10 +688,10 @@ void testset_main(void){ speedtest1_begin_test(300, "Refill a %d-row table using (b&1)==(a&1)", sz); speedtest1_exec("DELETE FROM t2;"); - speedtest1_exec( - "INSERT INTO t2(a,b,c) SELECT a,b,c FROM t1 WHERE (b&1)==(a&1);" - "INSERT INTO t2(a,b,c) SELECT a,b,c FROM t1 WHERE (b&1)<>(a&1);" - ); + speedtest1_exec("INSERT INTO t2(a,b,c)\n" + " SELECT a,b,c FROM t1 WHERE (b&1)==(a&1);"); + speedtest1_exec("INSERT INTO t2(a,b,c)\n" + " SELECT a,b,c FROM t1 WHERE (b&1)<>(a&1);"); speedtest1_end_test(); @@ -786,6 +796,9 @@ int main(int argc, char **argv){ cacheSize = integerValue(argv[i]); }else if( strcmp(z,"exclusive")==0 ){ doExclusive = 1; + }else if( strcmp(z,"explain")==0 ){ + g.bSqlOnly = 1; + g.bExplain = 1; }else if( strcmp(z,"heap")==0 ){ if( i>=argc-2 ) fatal_error("missing arguments on %s\n", argv[i]); nHeap = integerValue(argv[i+1]); @@ -925,6 +938,7 @@ int main(int argc, char **argv){ speedtest1_exec("PRAGMA journal_mode=%s", zJMode); } + if( g.bExplain ) printf(".explain\n.echo on\n"); if( strcmp(zTSet,"main")==0 ){ testset_main(); }else if( strcmp(zTSet,"debug1")==0 ){ From c73d0d9dec4aae044a020b88c526a485dcb2ab3b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 21 Dec 2013 16:06:47 +0000 Subject: [PATCH 18/25] Fix harmless compiler warnings in FTS4. This involved corrupting Martin Porter's beautifully written and elegant stemmer code, making it a little less beautiful and a little less elegant. Today is a sad day. But the warnings from GCC grow increasingly verbose and irksome with each new release and so something had to be done. FossilOrigin-Name: df05679838b571c16a7ab7e135f9564cd2d9647c --- ext/fts3/fts3_porter.c | 74 +++++++++++++++++++++++++----------------- manifest | 12 +++---- manifest.uuid | 2 +- 3 files changed, 52 insertions(+), 36 deletions(-) diff --git a/ext/fts3/fts3_porter.c b/ext/fts3/fts3_porter.c index 579745b85f..db175acdbb 100644 --- a/ext/fts3/fts3_porter.c +++ b/ext/fts3/fts3_porter.c @@ -403,12 +403,14 @@ static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ /* Step 2 */ switch( z[1] ){ case 'a': - stem(&z, "lanoita", "ate", m_gt_0) || - stem(&z, "lanoit", "tion", m_gt_0); + if( !stem(&z, "lanoita", "ate", m_gt_0) ){ + stem(&z, "lanoit", "tion", m_gt_0); + } break; case 'c': - stem(&z, "icne", "ence", m_gt_0) || - stem(&z, "icna", "ance", m_gt_0); + if( !stem(&z, "icne", "ence", m_gt_0) ){ + stem(&z, "icna", "ance", m_gt_0); + } break; case 'e': stem(&z, "rezi", "ize", m_gt_0); @@ -417,43 +419,54 @@ static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ stem(&z, "igol", "log", m_gt_0); break; case 'l': - stem(&z, "ilb", "ble", m_gt_0) || - stem(&z, "illa", "al", m_gt_0) || - stem(&z, "iltne", "ent", m_gt_0) || - stem(&z, "ile", "e", m_gt_0) || - stem(&z, "ilsuo", "ous", m_gt_0); + if( !stem(&z, "ilb", "ble", m_gt_0) + && !stem(&z, "illa", "al", m_gt_0) + && !stem(&z, "iltne", "ent", m_gt_0) + && !stem(&z, "ile", "e", m_gt_0) + ){ + stem(&z, "ilsuo", "ous", m_gt_0); + } break; case 'o': - stem(&z, "noitazi", "ize", m_gt_0) || - stem(&z, "noita", "ate", m_gt_0) || - stem(&z, "rota", "ate", m_gt_0); + if( !stem(&z, "noitazi", "ize", m_gt_0) + && !stem(&z, "noita", "ate", m_gt_0) + ){ + stem(&z, "rota", "ate", m_gt_0); + } break; case 's': - stem(&z, "msila", "al", m_gt_0) || - stem(&z, "ssenevi", "ive", m_gt_0) || - stem(&z, "ssenluf", "ful", m_gt_0) || - stem(&z, "ssensuo", "ous", m_gt_0); + if( !stem(&z, "msila", "al", m_gt_0) + && !stem(&z, "ssenevi", "ive", m_gt_0) + && !stem(&z, "ssenluf", "ful", m_gt_0) + ){ + stem(&z, "ssensuo", "ous", m_gt_0); + } break; case 't': - stem(&z, "itila", "al", m_gt_0) || - stem(&z, "itivi", "ive", m_gt_0) || - stem(&z, "itilib", "ble", m_gt_0); + if( !stem(&z, "itila", "al", m_gt_0) + && !stem(&z, "itivi", "ive", m_gt_0) + ){ + stem(&z, "itilib", "ble", m_gt_0); + } break; } /* Step 3 */ switch( z[0] ){ case 'e': - stem(&z, "etaci", "ic", m_gt_0) || - stem(&z, "evita", "", m_gt_0) || - stem(&z, "ezila", "al", m_gt_0); + if( !stem(&z, "etaci", "ic", m_gt_0) + && !stem(&z, "evita", "", m_gt_0) + ){ + stem(&z, "ezila", "al", m_gt_0); + } break; case 'i': stem(&z, "itici", "ic", m_gt_0); break; case 'l': - stem(&z, "laci", "ic", m_gt_0) || - stem(&z, "luf", "", m_gt_0); + if( !stem(&z, "laci", "ic", m_gt_0) ){ + stem(&z, "luf", "", m_gt_0); + } break; case 's': stem(&z, "ssen", "", m_gt_0); @@ -494,9 +507,11 @@ static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ z += 3; } }else if( z[2]=='e' ){ - stem(&z, "tneme", "", m_gt_1) || - stem(&z, "tnem", "", m_gt_1) || - stem(&z, "tne", "", m_gt_1); + if( !stem(&z, "tneme", "", m_gt_1) + && !stem(&z, "tnem", "", m_gt_1) + ){ + stem(&z, "tne", "", m_gt_1); + } } } break; @@ -515,8 +530,9 @@ static void porter_stemmer(const char *zIn, int nIn, char *zOut, int *pnOut){ } break; case 't': - stem(&z, "eta", "", m_gt_1) || - stem(&z, "iti", "", m_gt_1); + if( !stem(&z, "eta", "", m_gt_1) ){ + stem(&z, "iti", "", m_gt_1); + } break; case 'u': if( z[0]=='s' && z[2]=='o' && m_gt_1(z+3) ){ diff --git a/manifest b/manifest index d556779ff4..4d7a6ae0c8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\s".echo\son"\sdot-command\sof\sthe\sshell\sso\sthat\sit\sechos\scomments\sin\naddition\sto\sSQL\sstatements\sand\sdot-commands.\s\sAdd\sthe\s--explain\soption\nto\sspeedtest1\sso\sthat\sthe\soutput\scan\sbe\spiped\sinto\sthe\scommand-line\sshell\nto\sshow\snicely-formated\sVDBE\scode\sfor\sthe\sentire\stest. -D 2013-12-21T15:46:06.562 +C Fix\sharmless\scompiler\swarnings\sin\sFTS4.\s\sThis\sinvolved\scorrupting\nMartin\sPorter's\sbeautifully\swritten\sand\selegant\sstemmer\scode,\smaking\sit\na\slittle\sless\sbeautiful\sand\sa\slittle\sless\selegant.\s\sToday\sis\sa\ssad\nday.\s\sBut\sthe\swarnings\sfrom\sGCC\sgrow\sincreasingly\sverbose\sand\sirksome\nwith\seach\snew\srelease\sand\sso\ssomething\shad\sto\sbe\sdone. +D 2013-12-21T16:06:47.439 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -86,7 +86,7 @@ F ext/fts3/fts3_expr.c 5165c365cb5a035f5be8bb296f7aa3211d43e4ac F ext/fts3/fts3_hash.c 8dd2d06b66c72c628c2732555a32bc0943114914 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c e319e108661147bcca8dd511cd562f33a1ba81b5 -F ext/fts3/fts3_porter.c a465b49fcb8249a755792f87516eff182efa42b3 +F ext/fts3/fts3_porter.c 7f8b4bf5af7c0f20f73b8e87e14fa9298f52e290 F ext/fts3/fts3_snippet.c 51beb5c1498176fd9caccaf1c75b55cb803a985a F ext/fts3/fts3_term.c a521f75132f9a495bdca1bdd45949b3191c52763 F ext/fts3/fts3_test.c 8a3a78c4458b2d7c631fcf4b152a5cd656fa7038 @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 69a17336fdf4ae891e815914be8942f7222230c2 -R f8c33eb19f28c61795b29a236555d23d +P 96397263f94256e284aae9506de1fc48fea89193 +R 38a4e7eb09a43c5c635590012754b8d4 U drh -Z 526508e712c84b42d21bbec0b02b9c9e +Z dfc0154e1251c61263e69daa57fb4f97 diff --git a/manifest.uuid b/manifest.uuid index b9cf9f2e0b..f8cb2fecf0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -96397263f94256e284aae9506de1fc48fea89193 \ No newline at end of file +df05679838b571c16a7ab7e135f9564cd2d9647c \ No newline at end of file From 685e3c481c2910938621ae8522ab596d31ad1393 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 21 Dec 2013 17:07:13 +0000 Subject: [PATCH 19/25] Avoid compiler warnings by only enabling sqlite3ErrName() when SQLITE_TEST is defined. FossilOrigin-Name: 862228e50534a6b89c9498c4db664610db11485e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/main.c | 3 +-- src/sqliteInt.h | 3 +-- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 4d7a6ae0c8..adef4b0eac 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings\sin\sFTS4.\s\sThis\sinvolved\scorrupting\nMartin\sPorter's\sbeautifully\swritten\sand\selegant\sstemmer\scode,\smaking\sit\na\slittle\sless\sbeautiful\sand\sa\slittle\sless\selegant.\s\sToday\sis\sa\ssad\nday.\s\sBut\sthe\swarnings\sfrom\sGCC\sgrow\sincreasingly\sverbose\sand\sirksome\nwith\seach\snew\srelease\sand\sso\ssomething\shad\sto\sbe\sdone. -D 2013-12-21T16:06:47.439 +C Avoid\scompiler\swarnings\sby\sonly\senabling\ssqlite3ErrName()\swhen\nSQLITE_TEST\sis\sdefined. +D 2013-12-21T17:07:13.208 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -188,7 +188,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c 0df0b1550b9cc1f58229644735e317ac89131f12 F src/lempar.c cdf0a000315332fc9b50b62f3b5e22e080a0952b F src/loadext.c 867c7b330b740c6c917af9956b13b81d0a048303 -F src/main.c 3f00c4adfb5e5dc35b475dbdd475aba83ccf3d17 +F src/main.c 5307601c58b6e08153a15846098399a59c166d8d F src/malloc.c 0203ebce9152c6a0e5de520140b8ba65187350be F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c0c990fcaddff810ea277b4fb5d9138603dd5d4b @@ -224,7 +224,7 @@ F src/shell.c a3541193d5fce37e91dad8ef46a9505aa7c9b344 F src/sqlite.h.in 4ef56464aeaa3785a2c5ca37fb3a0fb229d68b2e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc -F src/sqliteInt.h d0815177df125e900056e1e692504435e7610793 +F src/sqliteInt.h 49c7a1223cbe2323a94b1913ed0b0ce946d83278 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 96397263f94256e284aae9506de1fc48fea89193 -R 38a4e7eb09a43c5c635590012754b8d4 +P df05679838b571c16a7ab7e135f9564cd2d9647c +R 4daa825d059abf8b202bf30d8a3dabe0 U drh -Z dfc0154e1251c61263e69daa57fb4f97 +Z 3cf2241a5e425a53db01dda8b63c0d1d diff --git a/manifest.uuid b/manifest.uuid index f8cb2fecf0..9f7e8acbd2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -df05679838b571c16a7ab7e135f9564cd2d9647c \ No newline at end of file +862228e50534a6b89c9498c4db664610db11485e \ No newline at end of file diff --git a/src/main.c b/src/main.c index d181d6fa00..fff1bc42e6 100644 --- a/src/main.c +++ b/src/main.c @@ -1062,8 +1062,7 @@ void sqlite3RollbackAll(sqlite3 *db, int tripCode){ ** Return a static string containing the name corresponding to the error code ** specified in the argument. */ -#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) || \ - defined(SQLITE_DEBUG_OS_TRACE) +#if defined(SQLITE_TEST) const char *sqlite3ErrName(int rc){ const char *zName = 0; int i, origRc = rc; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index a33ff4d43b..ce366dc480 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3138,8 +3138,7 @@ void *sqlite3HexToBlob(sqlite3*, const char *z, int n); u8 sqlite3HexToInt(int h); int sqlite3TwoPartName(Parse *, Token *, Token *, Token **); -#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) || \ - defined(SQLITE_DEBUG_OS_TRACE) +#if defined(SQLITE_TEST) const char *sqlite3ErrName(int); #endif From 25555506df6421bbc11fd388b001307f41f5925b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 21 Dec 2013 17:14:58 +0000 Subject: [PATCH 20/25] Fix speedtest1.c so that in --explain mode it only outputs non-explain text for DDL statements. FossilOrigin-Name: 2d2b3c4951dc2b8317d5ba8b5cf72b1f4a6668f6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest1.c | 8 +++++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index adef4b0eac..598056669e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\scompiler\swarnings\sby\sonly\senabling\ssqlite3ErrName()\swhen\nSQLITE_TEST\sis\sdefined. -D 2013-12-21T17:07:13.208 +C Fix\sspeedtest1.c\sso\sthat\sin\s--explain\smode\sit\sonly\soutputs\snon-explain\stext\nfor\sDDL\sstatements. +D 2013-12-21T17:14:58.114 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -822,7 +822,7 @@ F test/speed3.test d32043614c08c53eafdc80f33191d5bd9b920523 F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b -F test/speedtest1.c 0fb5502e0879e18991e7ecc791b41ba1c7fa74e8 +F test/speedtest1.c 7130d2cb6db45baa553a4ab2f715116c71c2d9f4 F test/spellfix.test 8c40b169b104086d8795781f670ba3c786d6d8be F test/sqllimits1.test b1aae27cc98eceb845e7f7adf918561256e31298 F test/stat.test 76fd746b85459e812a0193410fb599f0531f22de @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P df05679838b571c16a7ab7e135f9564cd2d9647c -R 4daa825d059abf8b202bf30d8a3dabe0 +P 862228e50534a6b89c9498c4db664610db11485e +R 33225661bd52597ad2aaeac8ae83129d U drh -Z 3cf2241a5e425a53db01dda8b63c0d1d +Z dddf4f7b316491b40bac25a13a27215d diff --git a/manifest.uuid b/manifest.uuid index 9f7e8acbd2..ab613f509c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -862228e50534a6b89c9498c4db664610db11485e \ No newline at end of file +2d2b3c4951dc2b8317d5ba8b5cf72b1f4a6668f6 \ No newline at end of file diff --git a/test/speedtest1.c b/test/speedtest1.c index 57d21b26c4..38f891e431 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -299,10 +299,12 @@ static void printSql(const char *zSql){ if( g.bExplain ) printf("EXPLAIN "); printf("%.*s;\n", n, zSql); if( g.bExplain - && (sqlite3_strglob("CREATE *", zSql) - || sqlite3_strglob("DROP *", zSql) - || sqlite3_strglob("ALTER *", zSql) +#if SQLITE_VERSION_NUMBER>=3007010 + && ( sqlite3_strglob("CREATE *", zSql)==0 + || sqlite3_strglob("DROP *", zSql)==0 + || sqlite3_strglob("ALTER *", zSql)==0 ) +#endif ){ printf("%.*s;\n", n, zSql); } From 6c1de308f284ace4ec8860d5d2a39ebdc996913b Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 22 Dec 2013 20:44:10 +0000 Subject: [PATCH 21/25] Make sure the WhereLoop.aLTerm[] array is large enough when processing the skip-scan optimization. Fix for ticket [520070ec7fbaac]. FossilOrigin-Name: 46d040591f27be01b1860344f8a268797fe344f4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 1 + test/skipscan1.test | 22 ++++++++++++++++++++++ 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 598056669e..8c8312dca6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sspeedtest1.c\sso\sthat\sin\s--explain\smode\sit\sonly\soutputs\snon-explain\stext\nfor\sDDL\sstatements. -D 2013-12-21T17:14:58.114 +C Make\ssure\sthe\sWhereLoop.aLTerm[]\sarray\sis\slarge\senough\swhen\sprocessing\nthe\sskip-scan\soptimization.\s\sFix\sfor\sticket\s[520070ec7fbaac]. +D 2013-12-22T20:44:10.723 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -293,7 +293,7 @@ F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74 -F src/where.c b8f3aab1e5843012895b89a183dcdd6cef0708db +F src/where.c 60bc8c5b00e2292c24a42455d022eeeda33a16f1 F src/whereInt.h 96a75c61f1d2b9d4a8e4bb17d89deb0cf7cba358 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 @@ -809,7 +809,7 @@ F test/shell5.test cee83b4385f842fec1f2a0bec9ea811f35386edf F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/shrink.test 8c70f62b6e8eb4d54533de6d65bd06b1b9a17868 F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 -F test/skipscan1.test 6bb4891c2cc5efd5690a9da9e7508e53d4a68e10 +F test/skipscan1.test 8c777ffd9dad6ee6d2568160cb2158f0b5cd9dd2 F test/skipscan2.test 5a4db0799c338ddbacb154aaa5589c0254b36a8d F test/soak.test 0b5b6375c9f4110c828070b826b3b4b0bb65cd5f F test/softheap1.test 40562fe6cac6d9827b7b42b86d45aedf12c15e24 @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 862228e50534a6b89c9498c4db664610db11485e -R 33225661bd52597ad2aaeac8ae83129d +P 2d2b3c4951dc2b8317d5ba8b5cf72b1f4a6668f6 +R 7e8e2aceb29a9b78ef373006c69590e7 U drh -Z dddf4f7b316491b40bac25a13a27215d +Z 57f75659f99699708c34bb9af2294488 diff --git a/manifest.uuid b/manifest.uuid index ab613f509c..899b76fa4e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2d2b3c4951dc2b8317d5ba8b5cf72b1f4a6668f6 \ No newline at end of file +46d040591f27be01b1860344f8a268797fe344f4 \ No newline at end of file diff --git a/src/where.c b/src/where.c index afe664aa02..59028b9921 100644 --- a/src/where.c +++ b/src/where.c @@ -3928,6 +3928,7 @@ static int whereLoopAddBtreeIndex( && saved_nEq==saved_nSkip && saved_nEq+1nKeyCol && pProbe->aiRowEst[saved_nEq+1]>=18 /* TUNING: Minimum for skip-scan */ + && (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK ){ LogEst nIter; pNew->u.btree.nEq++; diff --git a/test/skipscan1.test b/test/skipscan1.test index 622e48fcfa..b9eaf2729b 100644 --- a/test/skipscan1.test +++ b/test/skipscan1.test @@ -187,4 +187,26 @@ do_execsql_test skipscan1-3.2sort { SELECT a,b,c,d,'|' FROM t3 WHERE b=345 ORDER BY a; } {~/*ORDER BY*/} +# Ticket 520070ec7fbaac: Array overrun in the skip-scan optimization +# 2013-12-22 +# +do_execsql_test skipscan1-4.1 { + CREATE TABLE t4(a,b,c,d,e,f,g,h,i); + CREATE INDEX t4all ON t4(a,b,c,d,e,f,g,h); + INSERT INTO t4 VALUES(1,2,3,4,5,6,7,8,9); + ANALYZE; + DELETE FROM sqlite_stat1; + INSERT INTO sqlite_stat1 + VALUES('t4','t4all','655360 163840 40960 10240 2560 640 160 40 10'); + ANALYZE sqlite_master; + SELECT i FROM t4 WHERE a=1; + SELECT i FROM t4 WHERE b=2; + SELECT i FROM t4 WHERE c=3; + SELECT i FROM t4 WHERE d=4; + SELECT i FROM t4 WHERE e=5; + SELECT i FROM t4 WHERE f=6; + SELECT i FROM t4 WHERE g=7; + SELECT i FROM t4 WHERE h=8; +} {9 9 9 9 9 9 9 9} + finish_test From eaf4f523a5e28835fe6dd638f1a968e500037576 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 22 Dec 2013 22:45:14 +0000 Subject: [PATCH 22/25] Remove a condition that is always in the logic that handles reading default values for columns. FossilOrigin-Name: 895af097e71749f423b63ece17c5a4b4dfcd164d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/update.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8c8312dca6..4e35cbf529 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthe\sWhereLoop.aLTerm[]\sarray\sis\slarge\senough\swhen\sprocessing\nthe\sskip-scan\soptimization.\s\sFix\sfor\sticket\s[520070ec7fbaac]. -D 2013-12-22T20:44:10.723 +C Remove\sa\scondition\sthat\sis\salways\sin\sthe\slogic\sthat\shandles\sreading\ndefault\svalues\sfor\scolumns. +D 2013-12-22T22:45:14.083 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -276,7 +276,7 @@ F src/test_vfstrace.c 3a0ab304682fecbceb689e7d9b904211fde11d78 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/tokenize.c ec4c1a62b890bf1dbcdb966399e140b904c700a4 F src/trigger.c d84e1f3669e9a217731a14a9d472b1c7b87c87ba -F src/update.c 47baf532e3ecec8e4093f92d613384f66785fc2f +F src/update.c c2706a6eb232a96345c35b7e1e75a188e26812bb F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 2d2b3c4951dc2b8317d5ba8b5cf72b1f4a6668f6 -R 7e8e2aceb29a9b78ef373006c69590e7 +P 46d040591f27be01b1860344f8a268797fe344f4 +R bad123e1d8507f7c1555170369546428 U drh -Z 57f75659f99699708c34bb9af2294488 +Z 0c66906b8c25c31efd308428f5c19196 diff --git a/manifest.uuid b/manifest.uuid index 899b76fa4e..8fca22d7fb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -46d040591f27be01b1860344f8a268797fe344f4 \ No newline at end of file +895af097e71749f423b63ece17c5a4b4dfcd164d \ No newline at end of file diff --git a/src/update.c b/src/update.c index b7f0363c1a..d62d0d3245 100644 --- a/src/update.c +++ b/src/update.c @@ -72,7 +72,7 @@ void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ sqlite3VdbeChangeP4(v, -1, (const char *)pValue, P4_MEM); } #ifndef SQLITE_OMIT_FLOATING_POINT - if( iReg>=0 && pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ + if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); } #endif From 58c960816f2a54e15631871d20daca2ddb9d2e00 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Dec 2013 11:33:32 +0000 Subject: [PATCH 23/25] Remove a stray tab character. FossilOrigin-Name: 25b8a1c9ba77df3b7c78cbce922cb593d661696d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 4e35cbf529..cfc44fed4f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\scondition\sthat\sis\salways\sin\sthe\slogic\sthat\shandles\sreading\ndefault\svalues\sfor\scolumns. -D 2013-12-22T22:45:14.083 +C Remove\sa\sstray\stab\scharacter. +D 2013-12-23T11:33:32.196 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -280,7 +280,7 @@ F src/update.c c2706a6eb232a96345c35b7e1e75a188e26812bb F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 -F src/vdbe.c 6bcf27a80c3fdffee649f12eae91522718a06a64 +F src/vdbe.c b110887e415b5d2af58c2374c4dfdcf774c5d46c F src/vdbe.h c3278ab2b410f17acf61faf91be7bce3fd466e8b F src/vdbeInt.h 8a4d2d69955570bb74a092c3cdbab04afb554963 F src/vdbeapi.c ce4e68ea4842cc6081046f533d088dcf01d247ad @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 46d040591f27be01b1860344f8a268797fe344f4 -R bad123e1d8507f7c1555170369546428 +P 895af097e71749f423b63ece17c5a4b4dfcd164d +R edca4657a892a426dbd4ee6318480a5d U drh -Z 0c66906b8c25c31efd308428f5c19196 +Z a6e6f91b61427f170fce17908ed5a512 diff --git a/manifest.uuid b/manifest.uuid index 8fca22d7fb..d403ad35b8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -895af097e71749f423b63ece17c5a4b4dfcd164d \ No newline at end of file +25b8a1c9ba77df3b7c78cbce922cb593d661696d \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index bbc6d3f7f6..286bc45ba3 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2454,7 +2454,7 @@ case OP_Column: { VdbeMemRelease(pDest); sqlite3VdbeSerialGet(pC->aRow+aOffset[p2], aType[p2], pDest); }else{ - /* This branch happens only when content is on overflow pages */ + /* This branch happens only when content is on overflow pages */ t = aType[p2]; if( ((pOp->p5 & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG))!=0 && ((t>=12 && (t&1)==0) || (pOp->p5 & OPFLAG_TYPEOFARG)!=0)) From 73d5b8f5502c3c6428cf3ba559ff906a21be716a Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 23 Dec 2013 19:09:07 +0000 Subject: [PATCH 24/25] Move elements of the Vdbe object that are only used during statement preparation out into the Parse object. FossilOrigin-Name: c289a253c0c053ac8fc344efe138262c327d8096 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/prepare.c | 6 +++++- src/sqliteInt.h | 3 +++ src/vdbeInt.h | 7 +------ src/vdbeaux.c | 44 +++++++++++++++++++++++++------------------- 6 files changed, 44 insertions(+), 36 deletions(-) diff --git a/manifest b/manifest index cfc44fed4f..1efd07ffd6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sstray\stab\scharacter. -D 2013-12-23T11:33:32.196 +C Move\selements\sof\sthe\sVdbe\sobject\sthat\sare\sonly\sused\sduring\sstatement\npreparation\sout\sinto\sthe\sParse\sobject. +D 2013-12-23T19:09:07.173 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -214,7 +214,7 @@ F src/pcache.c f8043b433a57aba85384a531e3937a804432a346 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222 F src/pcache1.c 57fee9a9a617218f5037afbbe49b09da65bde56b F src/pragma.c 5ab7279d132143feb77f773688a24ab05da75fd7 -F src/prepare.c 359d1a1e9c9bd4488e4dd3a1aaaf2d2ebb9bb768 +F src/prepare.c 677521ab7132615a8a26107a1d1c3132f44ae337 F src/printf.c 85d07756e45d7496d19439dcae3e6e9e0090f269 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 @@ -224,7 +224,7 @@ F src/shell.c a3541193d5fce37e91dad8ef46a9505aa7c9b344 F src/sqlite.h.in 4ef56464aeaa3785a2c5ca37fb3a0fb229d68b2e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc -F src/sqliteInt.h 49c7a1223cbe2323a94b1913ed0b0ce946d83278 +F src/sqliteInt.h fdb8c1e4bc5424ad82a9394a845781abf0d7d849 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -282,9 +282,9 @@ F src/util.c e71f19b272f05c8695cf747b4bac1732685f9e5c F src/vacuum.c 3728d74919d4fb1356f9e9a13e27773db60b7179 F src/vdbe.c b110887e415b5d2af58c2374c4dfdcf774c5d46c F src/vdbe.h c3278ab2b410f17acf61faf91be7bce3fd466e8b -F src/vdbeInt.h 8a4d2d69955570bb74a092c3cdbab04afb554963 +F src/vdbeInt.h 42db251e9f863401ff847b90d5fe1614c89a6a56 F src/vdbeapi.c ce4e68ea4842cc6081046f533d088dcf01d247ad -F src/vdbeaux.c 6fb0607776fe707a12e1859e66fc94b439966274 +F src/vdbeaux.c bc6799db8795cd1480f2cab6cb22acf47e3e640f F src/vdbeblob.c bc40f98f256f0b34116d6a44b114da4a81a15d33 F src/vdbemem.c 0e69351b2c6ff7d8b638688c0ae336a26befa6b2 F src/vdbesort.c 9d83601f9d6243fe70dd0169a2820c5ddfd48147 @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 895af097e71749f423b63ece17c5a4b4dfcd164d -R edca4657a892a426dbd4ee6318480a5d +P 25b8a1c9ba77df3b7c78cbce922cb593d661696d +R d5977954dd1c2aa7ce7a7105c092a6e6 U drh -Z a6e6f91b61427f170fce17908ed5a512 +Z 0801871ae5fea7f25834aba0df14ec53 diff --git a/manifest.uuid b/manifest.uuid index d403ad35b8..3d041c730a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -25b8a1c9ba77df3b7c78cbce922cb593d661696d \ No newline at end of file +c289a253c0c053ac8fc344efe138262c327d8096 \ No newline at end of file diff --git a/src/prepare.c b/src/prepare.c index 7ea7f3bd68..c7ba53a1f5 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -528,7 +528,11 @@ int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ ** Free all memory allocations in the pParse object */ void sqlite3ParserReset(Parse *pParse){ - if( pParse ) sqlite3ExprListDelete(pParse->db, pParse->pConstExpr); + if( pParse ){ + sqlite3 *db = pParse->db; + sqlite3DbFree(db, pParse->aLabel); + sqlite3ExprListDelete(db, pParse->pConstExpr); + } } /* diff --git a/src/sqliteInt.h b/src/sqliteInt.h index ce366dc480..e7dc69cc73 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2290,6 +2290,9 @@ struct Parse { int nMem; /* Number of memory cells used so far */ int nSet; /* Number of sets used so far */ int nOnce; /* Number of OP_Once instructions so far */ + int nOpAlloc; /* Number of slots allocated for Vdbe.aOp[] */ + int nLabel; /* Number of labels used */ + int *aLabel; /* Space to hold the labels */ int ckBase; /* Base register of data during check constraints */ int iPartIdxTab; /* Table corresponding to a partial index */ int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */ diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 7b4fad67b0..c4fa26cc05 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -312,15 +312,9 @@ struct Vdbe { Mem **apArg; /* Arguments to currently executing user function */ Mem *aColName; /* Column names to return */ Mem *pResultSet; /* Pointer to an array of results */ -#ifdef SQLITE_DEBUG Parse *pParse; /* Parsing context used to create this Vdbe */ -#endif int nMem; /* Number of memory locations currently allocated */ int nOp; /* Number of instructions in the program */ - int nOpAlloc; /* Number of slots allocated for aOp[] */ - int nLabel; /* Number of labels used */ - int *aLabel; /* Space to hold the labels */ - u16 nResColumn; /* Number of columns in one row of the result set */ int nCursor; /* Number of slots in apCsr[] */ u32 magic; /* Magic number for sanity checking */ char *zErrMsg; /* Error message written here */ @@ -333,6 +327,7 @@ struct Vdbe { u32 cacheCtr; /* VdbeCursor row cache generation counter */ int pc; /* The program counter */ int rc; /* Value to return */ + u16 nResColumn; /* Number of columns in one row of the result set */ u8 errorAction; /* Recovery action to do in case of an error */ u8 minWriteFileFormat; /* Minimum file format for writable database files */ bft explain:2; /* True if EXPLAIN present on SQL command */ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 8e95de70c1..d917e8540e 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -33,9 +33,10 @@ Vdbe *sqlite3VdbeCreate(Parse *pParse){ p->pPrev = 0; db->pVdbe = p; p->magic = VDBE_MAGIC_INIT; -#if SQLITE_DEBUG p->pParse = pParse; -#endif + assert( pParse->aLabel==0 ); + assert( pParse->nLabel==0 ); + assert( pParse->nOpAlloc==0 ); return p; } @@ -91,13 +92,14 @@ void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ ** unchanged (this is so that any opcodes already allocated can be ** correctly deallocated along with the rest of the Vdbe). */ -static int growOpArray(Vdbe *p){ +static int growOpArray(Vdbe *v){ VdbeOp *pNew; + Parse *p = v->pParse; int nNew = (p->nOpAlloc ? p->nOpAlloc*2 : (int)(1024/sizeof(Op))); - pNew = sqlite3DbRealloc(p->db, p->aOp, nNew*sizeof(Op)); + pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op)); if( pNew ){ p->nOpAlloc = sqlite3DbMallocSize(p->db, pNew)/sizeof(Op); - p->aOp = pNew; + v->aOp = pNew; } return (pNew ? SQLITE_OK : SQLITE_NOMEM); } @@ -136,7 +138,7 @@ int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ i = p->nOp; assert( p->magic==VDBE_MAGIC_INIT ); assert( op>0 && op<0xff ); - if( p->nOpAlloc<=i ){ + if( p->pParse->nOpAlloc<=i ){ if( growOpArray(p) ){ return 1; } @@ -247,9 +249,10 @@ int sqlite3VdbeAddOp4Int( ** ** Zero is returned if a malloc() fails. */ -int sqlite3VdbeMakeLabel(Vdbe *p){ +int sqlite3VdbeMakeLabel(Vdbe *v){ + Parse *p = v->pParse; int i = p->nLabel++; - assert( p->magic==VDBE_MAGIC_INIT ); + assert( v->magic==VDBE_MAGIC_INIT ); if( (i & (i-1))==0 ){ p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, (i*2+1)*sizeof(p->aLabel[0])); @@ -265,12 +268,13 @@ int sqlite3VdbeMakeLabel(Vdbe *p){ ** be inserted. The parameter "x" must have been obtained from ** a prior call to sqlite3VdbeMakeLabel(). */ -void sqlite3VdbeResolveLabel(Vdbe *p, int x){ +void sqlite3VdbeResolveLabel(Vdbe *v, int x){ + Parse *p = v->pParse; int j = -1-x; - assert( p->magic==VDBE_MAGIC_INIT ); + assert( v->magic==VDBE_MAGIC_INIT ); assert( jnLabel ); if( j>=0 && p->aLabel ){ - p->aLabel[j] = p->nOp; + p->aLabel[j] = v->nOp; } } @@ -419,7 +423,8 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ int i; int nMaxArgs = *pMaxFuncArgs; Op *pOp; - int *aLabel = p->aLabel; + Parse *pParse = p->pParse; + int *aLabel = pParse->aLabel; p->readOnly = 1; p->bIsReader = 0; for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){ @@ -482,12 +487,13 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ pOp->opflags = sqlite3OpcodeProperty[opcode]; if( (pOp->opflags & OPFLG_JUMP)!=0 && pOp->p2<0 ){ - assert( -1-pOp->p2nLabel ); + assert( -1-pOp->p2nLabel ); pOp->p2 = aLabel[-1-pOp->p2]; } } - sqlite3DbFree(p->db, p->aLabel); - p->aLabel = 0; + sqlite3DbFree(p->db, pParse->aLabel); + pParse->aLabel = 0; + pParse->nLabel = 0; *pMaxFuncArgs = nMaxArgs; assert( p->bIsReader!=0 || p->btreeMask==0 ); } @@ -531,7 +537,7 @@ VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg){ int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp){ int addr; assert( p->magic==VDBE_MAGIC_INIT ); - if( p->nOp + nOp > p->nOpAlloc && growOpArray(p) ){ + if( p->nOp + nOp > p->pParse->nOpAlloc && growOpArray(p) ){ return 0; } addr = p->nOp; @@ -1601,6 +1607,7 @@ void sqlite3VdbeMakeReady( assert( p->nOp>0 ); assert( pParse!=0 ); assert( p->magic==VDBE_MAGIC_INIT ); + assert( pParse==p->pParse ); db = p->db; assert( db->mallocFailed==0 ); nVar = pParse->nVar; @@ -1624,8 +1631,8 @@ void sqlite3VdbeMakeReady( /* Allocate space for memory registers, SQL variables, VDBE cursors and ** an array to marshal SQL function arguments in. */ - zCsr = (u8*)&p->aOp[p->nOp]; /* Memory avaliable for allocation */ - zEnd = (u8*)&p->aOp[p->nOpAlloc]; /* First byte past end of zCsr[] */ + zCsr = (u8*)&p->aOp[p->nOp]; /* Memory avaliable for allocation */ + zEnd = (u8*)&p->aOp[pParse->nOpAlloc]; /* First byte past end of zCsr[] */ resolveP2Values(p, &nArg); p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort); @@ -2628,7 +2635,6 @@ void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ } for(i=p->nzVar-1; i>=0; i--) sqlite3DbFree(db, p->azVar[i]); vdbeFreeOpArray(db, p->aOp, p->nOp); - sqlite3DbFree(db, p->aLabel); sqlite3DbFree(db, p->aColName); sqlite3DbFree(db, p->zSql); sqlite3DbFree(db, p->pFree); From 3312348cf8d88eb170825aa7b52254ea6219ff4b Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 24 Dec 2013 12:04:24 +0000 Subject: [PATCH 25/25] Add -I. to the main.mk makefile for building sqlite3.o and speedtest1. FossilOrigin-Name: cc72c5aec7fe93d4a1368517aab949dc98d33003 --- main.mk | 4 ++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/main.mk b/main.mk index a53727c904..ebd508a279 100644 --- a/main.mk +++ b/main.mk @@ -389,7 +389,7 @@ mptester$(EXE): sqlite3.c $(TOP)/mptest/mptest.c $(TLIBS) $(THREADLIB) sqlite3.o: sqlite3.c - $(TCCX) -c sqlite3.c + $(TCCX) -I. -c sqlite3.c # This target creates a directory named "tsrc" and fills it with # copies of all of the C source code and header files needed to @@ -631,7 +631,7 @@ wordcount$(EXE): $(TOP)/test/wordcount.c sqlite3.c $(TOP)/test/wordcount.c sqlite3.c speedtest1$(EXE): $(TOP)/test/speedtest1.c sqlite3.o - $(TCC) -o speedtest1$(EXE) $(TOP)/test/speedtest1.c sqlite3.o $(THREADLIB) + $(TCC) -I. -o speedtest1$(EXE) $(TOP)/test/speedtest1.c sqlite3.o $(THREADLIB) # This target will fail if the SQLite amalgamation contains any exported # symbols that do not begin with "sqlite3_". It is run as part of the diff --git a/manifest b/manifest index 1efd07ffd6..56fb6db832 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Move\selements\sof\sthe\sVdbe\sobject\sthat\sare\sonly\sused\sduring\sstatement\npreparation\sout\sinto\sthe\sParse\sobject. -D 2013-12-23T19:09:07.173 +C Add\s-I.\sto\sthe\smain.mk\smakefile\sfor\sbuilding\ssqlite3.o\sand\sspeedtest1. +D 2013-12-24T12:04:24.811 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -142,7 +142,7 @@ F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt f439556c5ce01ced70987e5ee86549a45165d9ff -F main.mk 9f091ea7920f8b15e48c7b6e5b6fb0182577ab2e +F main.mk 3ae543fa446525c1dec55f58de67f41b78651812 F mkdll.sh 7d09b23c05d56532e9d44a50868eb4b12ff4f74a F mkextu.sh 416f9b7089d80e5590a29692c9d9280a10dbad9f F mkextw.sh d2a981497b404d6498f5ff3e3b1f3816bdfcb338 @@ -1147,7 +1147,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 25b8a1c9ba77df3b7c78cbce922cb593d661696d -R d5977954dd1c2aa7ce7a7105c092a6e6 +P c289a253c0c053ac8fc344efe138262c327d8096 +R 2bb3d3295c5bbe58e528a8069b6e67b9 U drh -Z 0801871ae5fea7f25834aba0df14ec53 +Z 2be15cf525011fea6a70c12bcaf2ac37 diff --git a/manifest.uuid b/manifest.uuid index 3d041c730a..5e0ef5b21c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c289a253c0c053ac8fc344efe138262c327d8096 \ No newline at end of file +cc72c5aec7fe93d4a1368517aab949dc98d33003 \ No newline at end of file