1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Performance optimizations for sqlite3VXPrintf().

FossilOrigin-Name: 9227ad48e1612b32a3a3e9551c49890f93abc0a7
This commit is contained in:
drh
2013-12-09 19:03:26 +00:00
parent 195134c6c3
commit a6353a3f64
7 changed files with 50 additions and 35 deletions

View File

@@ -1,5 +1,5 @@
C Fix\san\sincorrect\stest\snumber\sin\sthe\soutput\sof\sthe\sspeedtest1.c\sprogram.\s\sNo\nchanges\sto\sthe\stest\salgorithms. C Performance\soptimizations\sfor\ssqlite3VXPrintf().
D 2013-12-09T12:24:23.629 D 2013-12-09T19:03:26.813
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b F Makefile.in e1a9b4258bbde53f5636f4e238c65b7e11459e2b
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -166,10 +166,10 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
F src/backup.c 1809a7caa2504233bdddd12f5018422421789537 F src/backup.c 1809a7caa2504233bdddd12f5018422421789537
F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb
F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
F src/btree.c 432c3e22ff76e8ee1caf57ff88ba9f8af1fcfc30 F src/btree.c 44a44aa21ee24763ddda98d9a41bd85498359ae2
F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9 F src/btree.h a61ddebc78c66795a2b93181321a116746302cc9
F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0
F src/build.c 9b40580b62916612678bdb69ce0286e39c29a862 F src/build.c 47ef8209e56d840d2b35b8a243c6ee567ad52bda
F src/callback.c f99a8957ba2adf369645fac0db09ad8adcf1caa2 F src/callback.c f99a8957ba2adf369645fac0db09ad8adcf1caa2
F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd F src/ctime.c 77779efbe78dd678d84bfb4fc2e87b6b6ad8dccd
@@ -215,7 +215,7 @@ F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222
F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63 F src/pcache1.c a467393909a4ed7ca9de066d85ba5c5b04a5be63
F src/pragma.c 5ab7279d132143feb77f773688a24ab05da75fd7 F src/pragma.c 5ab7279d132143feb77f773688a24ab05da75fd7
F src/prepare.c 359d1a1e9c9bd4488e4dd3a1aaaf2d2ebb9bb768 F src/prepare.c 359d1a1e9c9bd4488e4dd3a1aaaf2d2ebb9bb768
F src/printf.c da9119eb31a187a4b99f60aa4a225141c0ebb74b F src/printf.c aacd7f73018122689dbbe89d85c2e37f737b931f
F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68 F src/random.c 0b2dbc37fdfbfa6bd455b091dfcef5bdb32dba68
F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6
F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0
@@ -224,7 +224,7 @@ F src/shell.c 936a72ff784efff3832cce274a96ed0b036e6758
F src/sqlite.h.in 125dc0b76f0116f1cd6f13536db52ba981e1c5bd F src/sqlite.h.in 125dc0b76f0116f1cd6f13536db52ba981e1c5bd
F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
F src/sqliteInt.h f3a5d663fe9c6c0b2ee7fc2e20a6204eaea5bc7c F src/sqliteInt.h c59b756b3aebefdce24ff44c4a7b3c155a3c26ee
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158 F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -293,7 +293,7 @@ F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4 F src/wal.c 7dc3966ef98b74422267e7e6e46e07ff6c6eb1b4
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74 F src/walker.c e9e593d5bb798c3e67fc3893dfe7055c9e7d8d74
F src/where.c e6a4e713abe6f995495ea53dd6a5e48f88b53883 F src/where.c b8f3aab1e5843012895b89a183dcdd6cef0708db
F src/whereInt.h 96a75c61f1d2b9d4a8e4bb17d89deb0cf7cba358 F src/whereInt.h 96a75c61f1d2b9d4a8e4bb17d89deb0cf7cba358
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
@@ -1146,7 +1146,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
P 2d6dd7c2eb5a64f8994162b564a99ef0014b7460 P fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04
R 9b7d54400c77029a626c96270fd35702 R b8ab7b74939c13b89c303e9a6e5110d1
U drh U drh
Z a893e863f82f8a1033dbfe922fa06c0b Z 3687c2e0d19ee741a7e8e3f49ed7da21

View File

@@ -1 +1 @@
fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04 9227ad48e1612b32a3a3e9551c49890f93abc0a7

View File

@@ -7745,7 +7745,7 @@ static void checkAppendMsg(
sqlite3StrAccumAppend(&pCheck->errMsg, "\n", 1); sqlite3StrAccumAppend(&pCheck->errMsg, "\n", 1);
} }
if( zMsg1 ){ if( zMsg1 ){
sqlite3StrAccumAppend(&pCheck->errMsg, zMsg1, -1); sqlite3StrAccumAppendAll(&pCheck->errMsg, zMsg1);
} }
sqlite3VXPrintf(&pCheck->errMsg, 1, zFormat, ap); sqlite3VXPrintf(&pCheck->errMsg, 1, zFormat, ap);
va_end(ap); va_end(ap);

View File

@@ -3989,9 +3989,9 @@ void sqlite3UniqueConstraint(
for(j=0; j<pIdx->nKeyCol; j++){ for(j=0; j<pIdx->nKeyCol; j++){
char *zCol = pTab->aCol[pIdx->aiColumn[j]].zName; char *zCol = pTab->aCol[pIdx->aiColumn[j]].zName;
if( j ) sqlite3StrAccumAppend(&errMsg, ", ", 2); if( j ) sqlite3StrAccumAppend(&errMsg, ", ", 2);
sqlite3StrAccumAppend(&errMsg, pTab->zName, -1); sqlite3StrAccumAppendAll(&errMsg, pTab->zName);
sqlite3StrAccumAppend(&errMsg, ".", 1); sqlite3StrAccumAppend(&errMsg, ".", 1);
sqlite3StrAccumAppend(&errMsg, zCol, -1); sqlite3StrAccumAppendAll(&errMsg, zCol);
} }
zErr = sqlite3StrAccumFinish(&errMsg); zErr = sqlite3StrAccumFinish(&errMsg);
sqlite3HaltConstraint(pParse, sqlite3HaltConstraint(pParse,

View File

@@ -148,6 +148,14 @@ void sqlite3AppendSpace(StrAccum *pAccum, int N){
} }
} }
/*
** Set the StrAccum object to an error mode.
*/
void setStrAccumError(StrAccum *p, u8 eError){
p->accError = eError;
p->nAlloc = 0;
}
/* /*
** On machines with a small stack size, you can redefine the ** On machines with a small stack size, you can redefine the
** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired. ** SQLITE_PRINT_BUF_SIZE to be something smaller, if desired.
@@ -359,7 +367,7 @@ void sqlite3VXPrintf(
nOut = precision + 10; nOut = precision + 10;
zOut = zExtra = sqlite3Malloc( nOut ); zOut = zExtra = sqlite3Malloc( nOut );
if( zOut==0 ){ if( zOut==0 ){
pAccum->accError = STRACCUM_NOMEM; setStrAccumError(pAccum, STRACCUM_NOMEM);
return; return;
} }
} }
@@ -471,7 +479,7 @@ void sqlite3VXPrintf(
if( MAX(e2,0)+precision+width > etBUFSIZE - 15 ){ if( MAX(e2,0)+precision+width > etBUFSIZE - 15 ){
bufpt = zExtra = sqlite3Malloc( MAX(e2,0)+precision+width+15 ); bufpt = zExtra = sqlite3Malloc( MAX(e2,0)+precision+width+15 );
if( bufpt==0 ){ if( bufpt==0 ){
pAccum->accError = STRACCUM_NOMEM; setStrAccumError(pAccum, STRACCUM_NOMEM);
return; return;
} }
} }
@@ -606,7 +614,7 @@ void sqlite3VXPrintf(
if( n>etBUFSIZE ){ if( n>etBUFSIZE ){
bufpt = zExtra = sqlite3Malloc( n ); bufpt = zExtra = sqlite3Malloc( n );
if( bufpt==0 ){ if( bufpt==0 ){
pAccum->accError = STRACCUM_NOMEM; setStrAccumError(pAccum, STRACCUM_NOMEM);
return; return;
} }
}else{ }else{
@@ -641,10 +649,10 @@ void sqlite3VXPrintf(
struct SrcList_item *pItem = &pSrc->a[k]; struct SrcList_item *pItem = &pSrc->a[k];
assert( k>=0 && k<pSrc->nSrc ); assert( k>=0 && k<pSrc->nSrc );
if( pItem->zDatabase ){ if( pItem->zDatabase ){
sqlite3StrAccumAppend(pAccum, pItem->zDatabase, -1); sqlite3StrAccumAppendAll(pAccum, pItem->zDatabase);
sqlite3StrAccumAppend(pAccum, ".", 1); sqlite3StrAccumAppend(pAccum, ".", 1);
} }
sqlite3StrAccumAppend(pAccum, pItem->zName, -1); sqlite3StrAccumAppendAll(pAccum, pItem->zName);
length = width = 0; length = width = 0;
break; break;
} }
@@ -684,21 +692,19 @@ void sqlite3VXPrintf(
*/ */
void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
assert( z!=0 || N==0 ); assert( z!=0 || N==0 );
assert( p->zText!=0 || p->nChar==0 || p->accError );
assert( N>=0 );
assert( p->accError==0 || p->nAlloc==0 );
if( p->nChar+N >= p->nAlloc ){
char *zNew;
if( p->accError ){ if( p->accError ){
testcase(p->accError==STRACCUM_TOOBIG); testcase(p->accError==STRACCUM_TOOBIG);
testcase(p->accError==STRACCUM_NOMEM); testcase(p->accError==STRACCUM_NOMEM);
return; return;
} }
assert( p->zText!=0 || p->nChar==0 );
if( N<=0 ){
if( N==0 || z[0]==0 ) return;
N = sqlite3Strlen30(z);
}
if( p->nChar+N >= p->nAlloc ){
char *zNew;
if( !p->useMalloc ){ if( !p->useMalloc ){
p->accError = STRACCUM_TOOBIG;
N = p->nAlloc - p->nChar - 1; N = p->nAlloc - p->nChar - 1;
setStrAccumError(p, STRACCUM_TOOBIG);
if( N<=0 ){ if( N<=0 ){
return; return;
} }
@@ -708,7 +714,7 @@ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
szNew += N + 1; szNew += N + 1;
if( szNew > p->mxAlloc ){ if( szNew > p->mxAlloc ){
sqlite3StrAccumReset(p); sqlite3StrAccumReset(p);
p->accError = STRACCUM_TOOBIG; setStrAccumError(p, STRACCUM_TOOBIG);
return; return;
}else{ }else{
p->nAlloc = (int)szNew; p->nAlloc = (int)szNew;
@@ -722,8 +728,8 @@ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
if( zOld==0 && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar); if( zOld==0 && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar);
p->zText = zNew; p->zText = zNew;
}else{ }else{
p->accError = STRACCUM_NOMEM;
sqlite3StrAccumReset(p); sqlite3StrAccumReset(p);
setStrAccumError(p, STRACCUM_NOMEM);
return; return;
} }
} }
@@ -733,6 +739,14 @@ void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){
p->nChar += N; p->nChar += N;
} }
/*
** Append the complete text of zero-terminated string z[] to the p string.
*/
void sqlite3StrAccumAppendAll(StrAccum *p, const char *z){
return sqlite3StrAccumAppend(p, z, sqlite3Strlen30(z));
}
/* /*
** Finish off a string by making sure it is zero-terminated. ** Finish off a string by making sure it is zero-terminated.
** Return a pointer to the resulting string. Return a NULL ** Return a pointer to the resulting string. Return a NULL
@@ -750,7 +764,7 @@ char *sqlite3StrAccumFinish(StrAccum *p){
if( p->zText ){ if( p->zText ){
memcpy(p->zText, p->zBase, p->nChar+1); memcpy(p->zText, p->zBase, p->nChar+1);
}else{ }else{
p->accError = STRACCUM_NOMEM; setStrAccumError(p, STRACCUM_NOMEM);
} }
} }
} }

View File

@@ -3222,6 +3222,7 @@ int sqlite3OpenTempDatabase(Parse *);
void sqlite3StrAccumInit(StrAccum*, char*, int, int); void sqlite3StrAccumInit(StrAccum*, char*, int, int);
void sqlite3StrAccumAppend(StrAccum*,const char*,int); void sqlite3StrAccumAppend(StrAccum*,const char*,int);
void sqlite3StrAccumAppendAll(StrAccum*,const char*);
void sqlite3AppendSpace(StrAccum*,int); void sqlite3AppendSpace(StrAccum*,int);
char *sqlite3StrAccumFinish(StrAccum*); char *sqlite3StrAccumFinish(StrAccum*);
void sqlite3StrAccumReset(StrAccum*); void sqlite3StrAccumReset(StrAccum*);

View File

@@ -2568,7 +2568,7 @@ static void explainAppendTerm(
const char *zOp /* Name of the operator */ const char *zOp /* Name of the operator */
){ ){
if( iTerm ) sqlite3StrAccumAppend(pStr, " AND ", 5); if( iTerm ) sqlite3StrAccumAppend(pStr, " AND ", 5);
sqlite3StrAccumAppend(pStr, zColumn, -1); sqlite3StrAccumAppendAll(pStr, zColumn);
sqlite3StrAccumAppend(pStr, zOp, 1); sqlite3StrAccumAppend(pStr, zOp, 1);
sqlite3StrAccumAppend(pStr, "?", 1); sqlite3StrAccumAppend(pStr, "?", 1);
} }
@@ -2614,7 +2614,7 @@ static char *explainIndexRange(sqlite3 *db, WhereLoop *pLoop, Table *pTab){
}else{ }else{
if( i ) sqlite3StrAccumAppend(&txt, " AND ", 5); if( i ) sqlite3StrAccumAppend(&txt, " AND ", 5);
sqlite3StrAccumAppend(&txt, "ANY(", 4); sqlite3StrAccumAppend(&txt, "ANY(", 4);
sqlite3StrAccumAppend(&txt, z, -1); sqlite3StrAccumAppendAll(&txt, z);
sqlite3StrAccumAppend(&txt, ")", 1); sqlite3StrAccumAppend(&txt, ")", 1);
} }
} }