Hello all,
I have written a function to replicate the Oracle DECODE function, which
I register whenever I open a SQLite3 (3.2.6) connection (see bottom of
email).
However it seems that certain decodes fail due to corrupted data. I
have stepped through my code and seen that the value is correctly set
when the decode function is called, but when the value is retrieved
using sqlite3_column_value, it comes back as gibberish.
This does not always happen - the particular case involves five decode
statements in the SELECT list. If I move some of the DECODE statements
around or remove them, it works ok.
So - here are some questions:
* - Is it safe to call sqlite3_set_result_string( ) as I am doing, i.e.
with the value returned from sqlite3_value_text on the arguments? (I
have included my decode function at the bottom of this email, and
happily release into the public domain....).
* - My decode appears to not work correctly on numeric decodes e.g.
DECODE ( <column_name>, -42, 1000000000, <column_name> )
doesn't work, but this does:
DECODE ( <column_name>, '-42', '1000000000', <column_name> )
and all other text decodes work fine.
Can anyone offer any tips on what direction I should continue to
investigate this problem?
Cheers,
Steve
------------------------------------------------------------------------
------------
void decode_sql_function(sqlite_func* context, IntM argc,
sqlite_value** argv)
{
int pos=1;
if (argc>2)
{
sqlite_char* ach0 = sqlite_value_text(argv[0]);
while (pos < argc)
{
if ((pos+1) < argc)
{
sqlite_char* achp =
sqlite_value_text(argv[pos]);
if (ach0==NULL || achp==NULL)
{
if (ach0==NULL &&
achp==NULL) {
sqlite_set_result_string(context,(const
char*)sqlite_value_text(argv[pos+1]),-1);
return;
}
}
else if (strcmp((const
char*)ach0,(const char*)achp)==0)
{
sqlite_set_result_string(context,(const
char*)sqlite_value_text(argv[pos+1]),-1);
return;
}
}
else
{
sqlite_set_result_string(context,(const
char*)sqlite_value_text(argv[pos]),-1);
return;
}
pos+=2;
}
}
sqlite_set_result_error(context,"Not enough arguments
for DECODE",-1);
}