Index: src/vdbetrace.c ================================================================== --- src/vdbetrace.c +++ src/vdbetrace.c @@ -91,10 +91,13 @@ }else{ idx = nextIndex; } }else{ assert( zRawSql[0]==':' || zRawSql[0]=='$' || zRawSql[0]=='@' ); + testcase( zRawSql[0]==':' ); + testcase( zRawSql[0]=='$' ); + testcase( zRawSql[0]=='@' ); n = sqlite3GetToken((u8*)zRawSql, &dummy); idx = 0; for(i=0, pOp=p->aOp; ALWAYS(inOp); i++, pOp++){ if( pOp->opcode!=OP_Variable ) continue; if( pOp->p3>1 ) continue; @@ -114,11 +117,24 @@ }else if( pVar->flags & MEM_Int ){ sqlite3XPrintf(&out, "%lld", pVar->u.i); }else if( pVar->flags & MEM_Real ){ sqlite3XPrintf(&out, "%!.15g", pVar->r); }else if( pVar->flags & MEM_Str ){ - sqlite3XPrintf(&out, "'%.*q'", pVar->n, pVar->z); +#ifndef SQLITE_OMIT_UTF16 + if( ENC(db)!=SQLITE_UTF8 ){ + Mem utf8; + memset(&utf8, 0, sizeof(utf8)); + utf8.db = db; + sqlite3VdbeMemSetStr(&utf8, pVar->z, pVar->n, ENC(db), SQLITE_STATIC); + sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8); + sqlite3XPrintf(&out, "'%.*q'", utf8.n, utf8.z); + sqlite3VdbeMemRelease(&utf8); + }else +#endif + { + sqlite3XPrintf(&out, "'%.*q'", pVar->n, pVar->z); + } }else{ assert( pVar->flags & MEM_Blob ); sqlite3StrAccumAppend(&out, "x'", 2); for(i=0; in; i++){ sqlite3XPrintf(&out, "%02x", pVar->z[i]&0xff); Index: test/trace.test ================================================================== --- test/trace.test +++ test/trace.test @@ -181,7 +181,57 @@ execsql {SELECT $::t6int, $::t6real, $t6str, $t6blob, $t6null} } {6 6.0 {test-six y'all} 01234 {}} do_test trace-6.2 { set TRACE_OUT } {{SELECT 6, 6.0, 'test-six y''all', x'3031323334', NULL}} +do_test trace-6.3 { + set TRACE_OUT {} + execsql {SELECT $::t6int, ?1, $::t6int} +} {6 6 6} +do_test trace-6.4 { + set TRACE_OUT +} {{SELECT 6, 6, 6}} +do_test trace-6.5 { + execsql {CREATE TABLE t6([$::t6int],"?1"); INSERT INTO t6 VALUES(1,2)} + set TRACE_OUT {} + execsql {SELECT '$::t6int', [$::t6int], $::t6int, ?1, "?1", $::t6int FROM t6} +} {{$::t6int} 1 6 6 2 6} +do_test trace-6.6 { + set TRACE_OUT +} {{SELECT '$::t6int', [$::t6int], 6, 6, "?1", 6 FROM t6}} + +# Do these same tests with a UTF16 database. +# +do_test trace-6.100 { + db close + sqlite3 db :memory: + db eval { + PRAGMA encoding=UTF16be; + CREATE TABLE t6([$::t6str],"?1"); + INSERT INTO t6 VALUES(1,2); + } + db trace trace_proc + set TRACE_OUT {} + execsql {SELECT '$::t6str', [$::t6str], $::t6str, ?1, "?1", $::t6str FROM t6} +} {{$::t6str} 1 {test-six y'all} {test-six y'all} 2 {test-six y'all}} +do_test trace-6.101 { + set TRACE_OUT +} {{SELECT '$::t6str', [$::t6str], 'test-six y''all', 'test-six y''all', "?1", 'test-six y''all' FROM t6}} + +do_test trace-6.200 { + db close + sqlite3 db :memory: + db eval { + PRAGMA encoding=UTF16le; + CREATE TABLE t6([$::t6str],"?1"); + INSERT INTO t6 VALUES(1,2); + } + db trace trace_proc + set TRACE_OUT {} + execsql {SELECT '$::t6str', [$::t6str], $::t6str, ?1, "?1", $::t6str FROM t6} +} {{$::t6str} 1 {test-six y'all} {test-six y'all} 2 {test-six y'all}} +do_test trace-6.101 { + set TRACE_OUT +} {{SELECT '$::t6str', [$::t6str], 'test-six y''all', 'test-six y''all', "?1", 'test-six y''all' FROM t6}} + finish_test