diff options
author | drh <drh@noemail.net> | 2018-01-23 04:22:33 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2018-01-23 04:22:33 +0000 |
commit | 7ea3469e539fd296eaf2e5d16d9d1b0796f47bcb (patch) | |
tree | e84a2a2bb2986783c8e7a02440ca8685dfe97416 /src | |
parent | f09ac0b336b7fa8b0205fcd8494992264f4283d6 (diff) | |
download | sqlite-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.c | 16 |
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: { |