1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-10-24 09:53:10 +03:00

Add built-in functions numeric(), text(), and blob() that coerce types.

Ticket #1287. (CVS 2524)

FossilOrigin-Name: affb0fa2e8c5ff497838ba3c2994cdb1f6f50c68
This commit is contained in:
drh
2005-06-22 10:53:59 +00:00
parent 288d37f1b4
commit 5708d2deac
5 changed files with 232 additions and 13 deletions

View File

@@ -16,7 +16,7 @@
** sqliteRegisterBuildinFunctions() found at the bottom of the file.
** All other code has file scope.
**
** $Id: func.c,v 1.98 2005/05/24 12:01:02 danielk1977 Exp $
** $Id: func.c,v 1.99 2005/06/22 10:53:59 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>
@@ -78,6 +78,93 @@ static void typeofFunc(
sqlite3_result_text(context, z, -1, SQLITE_STATIC);
}
/*
** Convert the argument to a numeric type.
*/
static void numericFunc(
sqlite3_context *context,
int argc,
sqlite3_value **argv
){
const char *z = 0;
switch( sqlite3_value_type(argv[0]) ){
case SQLITE_NULL: {
sqlite3_result_int(context, 0);
break;
}
case SQLITE_INTEGER:
case SQLITE_FLOAT: {
sqlite3_result_value(context, argv[0]);
break;
}
case SQLITE_TEXT:
case SQLITE_BLOB: {
z = sqlite3_value_text(argv[0]);
while( *z && *z!='.' ){ z++; }
if( *z ){
sqlite3_result_double(context, sqlite3_value_double(argv[0]));
}else{
sqlite3_result_int64(context, sqlite3_value_int64(argv[0]));
}
break;
}
}
}
/*
** Convert the argument to TEXT
*/
static void textFunc(
sqlite3_context *context,
int argc,
sqlite3_value **argv
){
switch( sqlite3_value_type(argv[0]) ){
case SQLITE_NULL: {
sqlite3_result_text(context, "", 0, SQLITE_STATIC);
break;
}
case SQLITE_BLOB:
case SQLITE_INTEGER:
case SQLITE_FLOAT: {
sqlite3_result_text(context, sqlite3_value_text(argv[0]),
sqlite3_value_bytes(argv[0]), SQLITE_TRANSIENT);
break;
}
case SQLITE_TEXT: {
sqlite3_result_value(context, argv[0]);
break;
}
}
}
/*
** Convert the argument to TEXT
*/
static void blobFunc(
sqlite3_context *context,
int argc,
sqlite3_value **argv
){
switch( sqlite3_value_type(argv[0]) ){
case SQLITE_NULL: {
sqlite3_result_blob(context, "", 0, SQLITE_STATIC);
break;
}
case SQLITE_TEXT:
case SQLITE_INTEGER:
case SQLITE_FLOAT: {
sqlite3_result_blob(context, sqlite3_value_text(argv[0]),
sqlite3_value_bytes(argv[0]), SQLITE_TRANSIENT);
break;
}
case SQLITE_BLOB: {
sqlite3_result_value(context, argv[0]);
break;
}
}
}
/*
** Implementation of the length() function
*/
@@ -971,6 +1058,9 @@ void sqlite3RegisterBuiltinFunctions(sqlite3 *db){
{ "last_insert_rowid", 0, 1, SQLITE_UTF8, 0, last_insert_rowid },
{ "changes", 0, 1, SQLITE_UTF8, 0, changes },
{ "total_changes", 0, 1, SQLITE_UTF8, 0, total_changes },
{ "text", 1, 0, SQLITE_UTF8, 0, textFunc },
{ "numeric", 1, 0, SQLITE_UTF8, 0, numericFunc },
{ "blob", 1, 0, SQLITE_UTF8, 0, blobFunc },
#ifdef SQLITE_SOUNDEX
{ "soundex", 1, 0, SQLITE_UTF8, 0, soundexFunc},
#endif