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:
20
manifest
20
manifest
@@ -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
|
||||||
|
@@ -1 +1 @@
|
|||||||
fbfc075a5a3c9c5c98353f396f9da7f7ec7c1c04
|
9227ad48e1612b32a3a3e9551c49890f93abc0a7
|
@@ -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);
|
||||||
|
@@ -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,
|
||||||
|
46
src/printf.c
46
src/printf.c
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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*);
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user