]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
If the SQLITE_TRACE_SIZE_LIMIT compile-time parameter is set to a positive
authordrh <drh@noemail.net>
Tue, 2 Apr 2013 13:56:53 +0000 (13:56 +0000)
committerdrh <drh@noemail.net>
Tue, 2 Apr 2013 13:56:53 +0000 (13:56 +0000)
integer then limit the expansion of strings and blobs in trace output to
approximately that many bytes.

FossilOrigin-Name: e5b710849dd66673ba0e0d935b103cb29abfcc4b

manifest
manifest.uuid
src/vdbetrace.c

index 453b33c22e50b87ce7201eb04a8a17bf26655000..dce40a05fc139279ad23ffe0433305609fcdf50c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C For\sthe\sclean\starget,\stidy\sup\sa\scouple\smore\sgenerated\s(or\scopied)\ssource\sfiles.
-D 2013-03-29T19:52:04.965
+C If\sthe\sSQLITE_TRACE_SIZE_LIMIT\scompile-time\sparameter\sis\sset\sto\sa\spositive\ninteger\sthen\slimit\sthe\sexpansion\sof\sstrings\sand\sblobs\sin\strace\soutput\sto\napproximately\sthat\smany\sbytes.
+D 2013-04-02T13:56:53.795
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in aafa71d66bab7e87fb2f348152340645f79f0244
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -247,7 +247,7 @@ F src/vdbeaux.c ecb43014bcd3019e5aa2b5561e5c3a447f007a08
 F src/vdbeblob.c 32f2a4899d67f69634ea4dd93e3f651936d732cb
 F src/vdbemem.c 833005f1cbbf447289f1973dba2a0c2228c7b8ab
 F src/vdbesort.c 4fad64071ae120c25f39dcac572d716b9cadeb7f
-F src/vdbetrace.c 8bd5da325fc90f28464335e4cc4ad1407fe30835
+F src/vdbetrace.c a22263ab47f6ba4fcd176515cec1e732866b25f0
 F src/vtab.c b05e5f1f4902461ba9f5fc49bb7eb7c3a0741a83
 F src/wal.c f5c7b5027d0ed0e9bc9afeb4a3a8dfea762ec7d2
 F src/wal.h 29c197540b19044e6cd73487017e5e47a1d3dac6
@@ -1041,7 +1041,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P 527231bc67285f01fb18d4451b28f61da3c4e39d
-R c463228a20804b5f57c5669f0d0e45b8
-U mistachkin
-Z bfb2a9ca80a29b00e5f7b4db495d38d4
+P 5687e5ee7bafa00d2b353c3eda1e5dfb219cb185
+R b688b887865b3d8981922c40426941a0
+U drh
+Z 66f86621cb15eccea274cb5b5e71ec26
index 6960809f06c51515a79a13941aabf3f071eab866..ec266fb546b7d6c4d3aa05ccd2fc8e2b8d53ba3e 100644 (file)
@@ -1 +1 @@
-5687e5ee7bafa00d2b353c3eda1e5dfb219cb185
\ No newline at end of file
+e5b710849dd66673ba0e0d935b103cb29abfcc4b
\ No newline at end of file
index 35825c8736e41bfa1f24819051a2478d1e52cb59..91554d671741f088a2c4c659360eb0dfd27cfa6a 100644 (file)
@@ -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 n;  /* 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);
+        n = pVar->n;
+#ifdef SQLITE_TRACE_SIZE_LIMIT
+        if( n>SQLITE_TRACE_SIZE_LIMIT ){
+          n = SQLITE_TRACE_SIZE_LIMIT;
+          while( n<pVar->n && (pVar->z[n]&0xc0)==0x80 ){ n++; }
         }
+#endif    
+        sqlite3XPrintf(&out, "'%.*q'", n, pVar->z);
+#ifdef SQLITE_TRACE_SIZE_LIMIT
+        if( n<pVar->n ) sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-n);
+#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 n;  /* 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++){
+        n = pVar->n;
+#ifdef SQLITE_TRACE_SIZE_LIMIT
+        if( n>SQLITE_TRACE_SIZE_LIMIT ) n = SQLITE_TRACE_SIZE_LIMIT;
+#endif
+        for(i=0; i<n; i++){
           sqlite3XPrintf(&out, "%02x", pVar->z[i]&0xff);
         }
         sqlite3StrAccumAppend(&out, "'", 1);
+#ifdef SQLITE_TRACE_SIZE_LIMIT
+        if( n<pVar->n ) sqlite3XPrintf(&out, "/*+%d bytes*/", pVar->n-n);
+#endif
       }
     }
   }