aboutsummaryrefslogtreecommitdiff
path: root/src/func.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/func.c')
-rw-r--r--src/func.c92
1 files changed, 91 insertions, 1 deletions
diff --git a/src/func.c b/src/func.c
index e1b2195e8..d13ba437c 100644
--- a/src/func.c
+++ b/src/func.c
@@ -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>
@@ -79,6 +79,93 @@ static void typeofFunc(
}
/*
+** 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
*/
static void lengthFunc(
@@ -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