aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2018-01-23 04:22:33 +0000
committerdrh <drh@noemail.net>2018-01-23 04:22:33 +0000
commit7ea3469e539fd296eaf2e5d16d9d1b0796f47bcb (patch)
treee84a2a2bb2986783c8e7a02440ca8685dfe97416 /src
parentf09ac0b336b7fa8b0205fcd8494992264f4283d6 (diff)
downloadsqlite-7ea3469e539fd296eaf2e5d16d9d1b0796f47bcb.tar.gz
sqlite-7ea3469e539fd296eaf2e5d16d9d1b0796f47bcb.zip
Slightly faster implementation of the length() SQL function.
FossilOrigin-Name: 9a4199aedb039141a50a68943ef863d7df9637ada318793cce6c12b9d39bcdc5
Diffstat (limited to 'src')
-rw-r--r--src/func.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/func.c b/src/func.c
index 8f409a0ad..36cfa4423 100644
--- a/src/func.c
+++ b/src/func.c
@@ -102,8 +102,6 @@ static void lengthFunc(
int argc,
sqlite3_value **argv
){
- int len;
-
assert( argc==1 );
UNUSED_PARAMETER(argc);
switch( sqlite3_value_type(argv[0]) ){
@@ -115,13 +113,17 @@ static void lengthFunc(
}
case SQLITE_TEXT: {
const unsigned char *z = sqlite3_value_text(argv[0]);
+ const unsigned char *z0;
+ unsigned char c;
if( z==0 ) return;
- len = 0;
- while( *z ){
- len++;
- SQLITE_SKIP_UTF8(z);
+ z0 = z;
+ while( (c = *z)!=0 ){
+ z++;
+ if( c>=0xc0 ){
+ while( (*z & 0xc0)==0x80 ){ z++; z0++; }
+ }
}
- sqlite3_result_int(context, len);
+ sqlite3_result_int(context, (int)(z-z0));
break;
}
default: {