22 feb 2016, Dan Kennedy:

> On 02/23/2016 01:33 AM, E.Pasma wrote:
>>
>> I reproduced the memory leak and added a test in the sql script.
>> An alternative fix, instead of adding the missing break, is:
>>
>>       case SQLITE_TEXT:
>>       case SQLITE_BLOB:
>>         pval->n=sqlite3_value_bytes(arg);
>>         if (!pval->n) {
>>           pval->z="";
>>         } else {
>>           pval->z=sqlite3_malloc(pval->n);
>>           assert (pval->z); /* TODO: SQLITE_NOMEM*/
>>           memcpy(pval->z,sqlite3_value_blob(arg),pval->n);
>>         }
>>         break;
>>
>> Thus sqlite3_value_blob is used to get both text or blob value  
>> (like in sqlite3.c at line ~93615 in routine  attachFunc).
>>
>> If no response I opt for the alternative fix and place it at
>> http://h1972688.stratoserver.net/sqlite_mprint/160223
>
>
> Suggest testing with text values and a utf-16 database.
>
> Dan.

Thanks, testing with a utf-16 database does not yield any differences.  
I inserted some 2-byte character and checked that it comes out  
unchanged from mprint. Hope this will do.

sqlite> .version
SQLite 3.11.0 2016-02-12 00:13:38  
b5d771991686bf86a679b7dff9f16301a5029c8b
sqlite> pragma encoding='utf-16';
sqlite> pragma encoding;
UTF-16be
sqlite> create table t (a);
sqlite> insert into t values ('abc');
sqlite> insert into t values ('d'||char(1000)||'f');
sqlite> select typeof(a), length(a), length(cast (a as blob)), a from t;
text|3|6|abc
text|3|6|d?f
sqlite> .load ttt_mprint
sqlite> select * from t where a=mprint(a);
bytes: 3, memcmp: 0
abc
bytes: 4, memcmp: 0
d?f

ttt_mprint is compiled to compare sqlite3_value_blob and  
sqlite3_value_text and print the outcome of memcmp. The relevant part  
is:

         case SQLITE_TEXT: /* use sqlite3_value_blob */
         case SQLITE_BLOB: /* use sqlite3_value_blob */
           pval->n=sqlite3_value_bytes(arg);
           if (!pval->n) {
             pval->z="";
             z2=""; //testing
           } else {
             pval->z=sqlite3_malloc(pval->n);
             z2=sqlite3_malloc(pval->n); //testing
             memcpy(pval->z,sqlite3_value_blob(arg),pval->n);
             assert (pval->z); /* TODO: SQLITE_NOMEM*/
             memcpy(z2,sqlite3_value_text(arg),pval->n); //testing
           }
           printf("bytes: %d, memcmp: %d \n",
             pval->n,
             memcmp(pval->z, z2, pval->n)); //testing
           break;


Reply via email to