diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/func.c | 73 |
1 files changed, 49 insertions, 24 deletions
diff --git a/src/func.c b/src/func.c index 2a803b38f..5ef9608c1 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.135 2007/01/29 15:50:06 drh Exp $ +** $Id: func.c,v 1.136 2007/01/29 17:58:28 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> @@ -273,30 +273,22 @@ static void randomFunc( } /* -** Implementation of randomhex(N). Return a random hexadecimal string -** that is N characters long. +** Implementation of randomblob(N). Return a random blob +** that is N bytes long. */ -static void randomHex( +static void randomBlob( sqlite3_context *context, int argc, sqlite3_value **argv ){ - int n, i, j; - unsigned char c, zBuf[1001]; + int n; + unsigned char *p; assert( argc==1 ); n = sqlite3_value_int(argv[0]); - if( n&1 ) n++; - if( n<2 ) n = 2; - if( n>sizeof(zBuf)-1 ) n = sizeof(zBuf)-1; - sqlite3Randomness(n/2, zBuf); - for(i=n-1, j=n/2-1; i>=1; i-=2, j--){ - static const char zDigits[] = "0123456789ABCDEF"; - c = zBuf[j]; - zBuf[i] = zDigits[c&0xf]; - zBuf[i-1] = zDigits[c>>4]; - } - zBuf[n] = 0; - sqlite3_result_text(context, (char*)zBuf, n, SQLITE_TRANSIENT); + if( n<1 ) n = 1; + p = sqlite3_malloc(n); + sqlite3Randomness(n, p); + sqlite3_result_blob(context, (char*)p, n, sqlite3_free); } /* @@ -575,6 +567,12 @@ static void versionFunc( sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC); } +/* Array for converting from half-bytes (nybbles) into ASCII hex +** digits. */ +static const char hexdigits[] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' +}; /* ** EXPERIMENTAL - This is not an official function. The interface may @@ -600,10 +598,6 @@ static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ break; } case SQLITE_BLOB: { - static const char hexdigits[] = { - '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' - }; char *zText = 0; int nBlob = sqlite3_value_bytes(argv[0]); char const *zBlob = sqlite3_value_blob(argv[0]); @@ -649,11 +643,41 @@ static void quoteFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ } } +/* +** The hex() function. Interpret the argument as a blob. Return +** a hexadecimal rendering as text. +*/ +static void hexFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int i, n; + const unsigned char *pBlob; + char *zHex, *z; + assert( argc==1 ); + pBlob = sqlite3_value_blob(argv[0]); + n = sqlite3_value_bytes(argv[0]); + z = zHex = sqlite3_malloc(n*2 + 1); + if( zHex==0 ) return; + for(i=0; i<n; i++, pBlob++){ + unsigned char c = *pBlob; + *(z++) = hexdigits[(c>>4)&0xf]; + *(z++) = hexdigits[c&0xf]; + } + *z = 0; + sqlite3_result_text(context, zHex, n*2, sqlite3_free); +} + #ifdef SQLITE_SOUNDEX /* ** Compute the soundex encoding of a word. */ -static void soundexFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ +static void soundexFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ char zResult[8]; const u8 *zIn; int i, j; @@ -1049,9 +1073,10 @@ void sqlite3RegisterBuiltinFunctions(sqlite3 *db){ { "coalesce", -1, 0, SQLITE_UTF8, 0, ifnullFunc }, { "coalesce", 0, 0, SQLITE_UTF8, 0, 0 }, { "coalesce", 1, 0, SQLITE_UTF8, 0, 0 }, + { "hex", 1, 0, SQLITE_UTF8, 0, hexFunc }, { "ifnull", 2, 0, SQLITE_UTF8, 1, ifnullFunc }, { "random", -1, 0, SQLITE_UTF8, 0, randomFunc }, - { "randomhex", 1, 0, SQLITE_UTF8, 0, randomHex }, + { "randomblob", 1, 0, SQLITE_UTF8, 0, randomBlob }, { "nullif", 2, 0, SQLITE_UTF8, 1, nullifFunc }, { "sqlite_version", 0, 0, SQLITE_UTF8, 0, versionFunc}, { "quote", 1, 0, SQLITE_UTF8, 0, quoteFunc }, |