diff options
Diffstat (limited to 'src/vdbetrace.c')
| -rw-r--r-- | src/vdbetrace.c | 38 | 
1 files changed, 31 insertions, 7 deletions
| diff --git a/src/vdbetrace.c b/src/vdbetrace.c index 35825c8..356277e 100644 --- a/src/vdbetrace.c +++ b/src/vdbetrace.c @@ -53,6 +53,11 @@ static int findNextHostParameter(const char *zSql, int *pnToken){  ** then the returned string holds a copy of zRawSql with "-- " prepended  ** to each line of text.  ** +** If the SQLITE_TRACE_SIZE_LIMIT macro is defined to an integer, then +** then long strings and blobs are truncated to that many bytes.  This +** can be used to prevent unreasonably large trace strings when dealing +** with large (multi-megabyte) strings and blobs. +**  ** The calling function is responsible for making sure the memory returned  ** is eventually freed.  ** @@ -123,30 +128,49 @@ char *sqlite3VdbeExpandSql(        }else if( pVar->flags & MEM_Real ){          sqlite3XPrintf(&out, "%!.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          u8 enc = ENC(db); +        Mem utf8;          if( enc!=SQLITE_UTF8 ){ -          Mem utf8;            memset(&utf8, 0, sizeof(utf8));            utf8.db = db;            sqlite3VdbeMemSetStr(&utf8, pVar->z, pVar->n, enc, SQLITE_STATIC);            sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8); -          sqlite3XPrintf(&out, "'%.*q'", utf8.n, utf8.z); -          sqlite3VdbeMemRelease(&utf8); -        }else +          pVar = &utf8; +        }  #endif -        { -          sqlite3XPrintf(&out, "'%.*q'", pVar->n, pVar->z); +        nOut = pVar->n; +#ifdef SQLITE_TRACE_SIZE_LIMIT +        if( nOut>SQLITE_TRACE_SIZE_LIMIT ){ +          nOut = SQLITE_TRACE_SIZE_LIMIT; +          while( nOut<pVar->n && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; }          } +#endif     +        sqlite3XPrintf(&out, "'%.*q'", nOut, pVar->z); +#ifdef SQLITE_TRACE_SIZE_LIMIT +        if( nOut<pVar->n ) sqlite3XPrintf(&out, "/*+%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);        }else{ +        int nOut;  /* Number of bytes of the blob to include in output */          assert( pVar->flags & MEM_Blob );          sqlite3StrAccumAppend(&out, "x'", 2); -        for(i=0; i<pVar->n; i++){ +        nOut = pVar->n; +#ifdef SQLITE_TRACE_SIZE_LIMIT +        if( nOut>SQLITE_TRACE_SIZE_LIMIT ) nOut = SQLITE_TRACE_SIZE_LIMIT; +#endif +        for(i=0; i<nOut; i++){            sqlite3XPrintf(&out, "%02x", pVar->z[i]&0xff);          }          sqlite3StrAccumAppend(&out, "'", 1); +#ifdef SQLITE_TRACE_SIZE_LIMIT +        if( nOut<pVar->n ) sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-nOut); +#endif        }      }    } | 
