mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-10 01:02:56 +03:00
Combine the ExprList_item objects and the ExprList wrapper into a single
memory allocation, for improved performance and reduced footprint. FossilOrigin-Name: 2b6560ad88b92820c383bcdc1e30c06f8b081ef7c6d9b1af71d2bb76c83e35cd
This commit is contained in:
16
manifest
16
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Attempt\sto\sremove\sbash-isms\sfrom\sconfigure.ac.\s\sUse\s-O0\swith\s--enable-debug.
|
C Combine\sthe\sExprList_item\sobjects\sand\sthe\sExprList\swrapper\sinto\sa\ssingle\nmemory\sallocation,\sfor\simproved\sperformance\sand\sreduced\sfootprint.
|
||||||
D 2017-04-05T10:54:14.647
|
D 2017-04-05T11:32:13.794
|
||||||
F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb
|
F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb
|
||||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||||
F Makefile.msc a4c0613a18663bda56d8cf76079ab6590a7c3602e54befb4bbdef76bcaa38b6a
|
F Makefile.msc a4c0613a18663bda56d8cf76079ab6590a7c3602e54befb4bbdef76bcaa38b6a
|
||||||
@@ -354,7 +354,7 @@ F src/ctime.c 47d91a25ad8f199a71a5b1b7b169d6dd0d6e98c5719eca801568798743d1161c
|
|||||||
F src/date.c ee676e7694dfadbdd2fde1a258a71be8360ba5ae
|
F src/date.c ee676e7694dfadbdd2fde1a258a71be8360ba5ae
|
||||||
F src/dbstat.c 19ee7a4e89979d4df8e44cfac7a8f905ec89b77d
|
F src/dbstat.c 19ee7a4e89979d4df8e44cfac7a8f905ec89b77d
|
||||||
F src/delete.c 0d9d5549d42e79ce4d82ff1db1e6c81e36d2f67c
|
F src/delete.c 0d9d5549d42e79ce4d82ff1db1e6c81e36d2f67c
|
||||||
F src/expr.c f12a581f342a6fd85d14c31e4fb84f16b3dd107f54d7728dddb62cebc79d7ce1
|
F src/expr.c 6b186566a120d7d0aa4d0a846d9500704a22530f8f1c216185629dd8aee17743
|
||||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||||
F src/fkey.c 2e9aabe1aee76273aff8a84ee92c464e095400ae
|
F src/fkey.c 2e9aabe1aee76273aff8a84ee92c464e095400ae
|
||||||
F src/func.c 9d52522cc8ae7f5cdadfe14594262f1618bc1f86083c4cd6da861b4cf5af6174
|
F src/func.c 9d52522cc8ae7f5cdadfe14594262f1618bc1f86083c4cd6da861b4cf5af6174
|
||||||
@@ -401,12 +401,12 @@ F src/printf.c 8757834f1b54dae512fb25eb1acc8e94a0d15dd2290b58f2563f65973265adb2
|
|||||||
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
||||||
F src/resolve.c 3e518b962d932a997fae373366880fc028c75706
|
F src/resolve.c 3e518b962d932a997fae373366880fc028c75706
|
||||||
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
|
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
|
||||||
F src/select.c 2496d0cc6368dabe7ad2e4c7f5ed3ad9aa3b4d11cd90f33fa1d1ef72493f43aa
|
F src/select.c bbcfd919d795ba4796859aeaf2a202d9e0138fbfb5aa6c35fee816343cd82995
|
||||||
F src/shell.c ceb2b2f1f958ea2c47a7f37972d0f715fbf9dcf6a34a5e98c886b85e3ce6a238
|
F src/shell.c ceb2b2f1f958ea2c47a7f37972d0f715fbf9dcf6a34a5e98c886b85e3ce6a238
|
||||||
F src/sqlite.h.in 723107d97f2345a7c103632169dc61366121c4ab65d75a7d83c6dc0e5bbe5ca4
|
F src/sqlite.h.in 723107d97f2345a7c103632169dc61366121c4ab65d75a7d83c6dc0e5bbe5ca4
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
F src/sqlite3ext.h 58fd0676d3111d02e62e5a35992a7d3da5d3f88753acc174f2d37b774fbbdd28
|
F src/sqlite3ext.h 58fd0676d3111d02e62e5a35992a7d3da5d3f88753acc174f2d37b774fbbdd28
|
||||||
F src/sqliteInt.h a530e5baf5e559154d5c2e5cc57471bc780a7af4cd0a5d72750b1d850fef1e22
|
F src/sqliteInt.h c5e83040837328293dfec3b89923300591ed1de6ac3d073818d414b55c0e21a0
|
||||||
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
||||||
F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1
|
F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1
|
||||||
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
||||||
@@ -1570,7 +1570,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P e5bb7db51cdfd8124c60329782798cea398733545594dab55cb892b2a08c4d29
|
P 71ed35ccf7c0f6c49118a44cf6621f46b9ea883e4a74d51b8b1ade6d9a95413a
|
||||||
R 19ba25e72f57d434a638f0fb43aed7b5
|
R 35ab32fb0c98cf97e1b56263304a8725
|
||||||
U drh
|
U drh
|
||||||
Z 3d232979ad76612c4a27973fcd4ac955
|
Z 9400dede22aec4be5e7e28c14dab8209
|
||||||
|
@@ -1 +1 @@
|
|||||||
71ed35ccf7c0f6c49118a44cf6621f46b9ea883e4a74d51b8b1ade6d9a95413a
|
2b6560ad88b92820c383bcdc1e30c06f8b081ef7c6d9b1af71d2bb76c83e35cd
|
36
src/expr.c
36
src/expr.c
@@ -1305,15 +1305,11 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){
|
|||||||
Expr *pPriorSelectCol = 0;
|
Expr *pPriorSelectCol = 0;
|
||||||
assert( db!=0 );
|
assert( db!=0 );
|
||||||
if( p==0 ) return 0;
|
if( p==0 ) return 0;
|
||||||
pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) );
|
pNew = sqlite3DbMallocRawNN(db,
|
||||||
|
sizeof(*pNew)+sizeof(pNew->a[0])*(p->nExpr-1) );
|
||||||
if( pNew==0 ) return 0;
|
if( pNew==0 ) return 0;
|
||||||
pNew->nExpr = i = p->nExpr;
|
pNew->nAlloc = pNew->nExpr = p->nExpr;
|
||||||
if( (flags & EXPRDUP_REDUCE)==0 ) for(i=1; i<p->nExpr; i+=i){}
|
pItem = pNew->a;
|
||||||
pNew->a = pItem = sqlite3DbMallocRawNN(db, i*sizeof(p->a[0]) );
|
|
||||||
if( pItem==0 ){
|
|
||||||
sqlite3DbFree(db, pNew);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
pOldItem = p->a;
|
pOldItem = p->a;
|
||||||
for(i=0; i<p->nExpr; i++, pItem++, pOldItem++){
|
for(i=0; i<p->nExpr; i++, pItem++, pOldItem++){
|
||||||
Expr *pOldExpr = pOldItem->pExpr;
|
Expr *pOldExpr = pOldItem->pExpr;
|
||||||
@@ -1475,6 +1471,7 @@ ExprList *sqlite3ExprListAppend(
|
|||||||
ExprList *pList, /* List to which to append. Might be NULL */
|
ExprList *pList, /* List to which to append. Might be NULL */
|
||||||
Expr *pExpr /* Expression to be appended. Might be NULL */
|
Expr *pExpr /* Expression to be appended. Might be NULL */
|
||||||
){
|
){
|
||||||
|
struct ExprList_item *pItem;
|
||||||
sqlite3 *db = pParse->db;
|
sqlite3 *db = pParse->db;
|
||||||
assert( db!=0 );
|
assert( db!=0 );
|
||||||
if( pList==0 ){
|
if( pList==0 ){
|
||||||
@@ -1483,23 +1480,20 @@ ExprList *sqlite3ExprListAppend(
|
|||||||
goto no_mem;
|
goto no_mem;
|
||||||
}
|
}
|
||||||
pList->nExpr = 0;
|
pList->nExpr = 0;
|
||||||
pList->a = sqlite3DbMallocRawNN(db, sizeof(pList->a[0]));
|
pList->nAlloc = 1;
|
||||||
if( pList->a==0 ) goto no_mem;
|
}else if( pList->nExpr==pList->nAlloc ){
|
||||||
}else if( (pList->nExpr & (pList->nExpr-1))==0 ){
|
ExprList *pNew;
|
||||||
struct ExprList_item *a;
|
pNew = sqlite3DbRealloc(db, pList,
|
||||||
assert( pList->nExpr>0 );
|
sizeof(*pList)+(2*pList->nAlloc - 1)*sizeof(pList->a[0]));
|
||||||
a = sqlite3DbRealloc(db, pList->a, pList->nExpr*2*sizeof(pList->a[0]));
|
if( pNew==0 ){
|
||||||
if( a==0 ){
|
|
||||||
goto no_mem;
|
goto no_mem;
|
||||||
}
|
}
|
||||||
pList->a = a;
|
pList = pNew;
|
||||||
|
pList->nAlloc *= 2;
|
||||||
}
|
}
|
||||||
assert( pList->a!=0 );
|
pItem = &pList->a[pList->nExpr++];
|
||||||
if( 1 ){
|
|
||||||
struct ExprList_item *pItem = &pList->a[pList->nExpr++];
|
|
||||||
memset(pItem, 0, sizeof(*pItem));
|
memset(pItem, 0, sizeof(*pItem));
|
||||||
pItem->pExpr = pExpr;
|
pItem->pExpr = pExpr;
|
||||||
}
|
|
||||||
return pList;
|
return pList;
|
||||||
|
|
||||||
no_mem:
|
no_mem:
|
||||||
@@ -1665,13 +1659,11 @@ void sqlite3ExprListCheckLength(
|
|||||||
static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){
|
static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){
|
||||||
int i;
|
int i;
|
||||||
struct ExprList_item *pItem;
|
struct ExprList_item *pItem;
|
||||||
assert( pList->a!=0 || pList->nExpr==0 );
|
|
||||||
for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){
|
for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){
|
||||||
sqlite3ExprDelete(db, pItem->pExpr);
|
sqlite3ExprDelete(db, pItem->pExpr);
|
||||||
sqlite3DbFree(db, pItem->zName);
|
sqlite3DbFree(db, pItem->zName);
|
||||||
sqlite3DbFree(db, pItem->zSpan);
|
sqlite3DbFree(db, pItem->zSpan);
|
||||||
}
|
}
|
||||||
sqlite3DbFree(db, pList->a);
|
|
||||||
sqlite3DbFree(db, pList);
|
sqlite3DbFree(db, pList);
|
||||||
}
|
}
|
||||||
void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){
|
void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){
|
||||||
|
@@ -2900,7 +2900,7 @@ static int multiSelectOrderBy(
|
|||||||
if( pNew==0 ) return SQLITE_NOMEM_BKPT;
|
if( pNew==0 ) return SQLITE_NOMEM_BKPT;
|
||||||
pNew->flags |= EP_IntValue;
|
pNew->flags |= EP_IntValue;
|
||||||
pNew->u.iValue = i;
|
pNew->u.iValue = i;
|
||||||
pOrderBy = sqlite3ExprListAppend(pParse, pOrderBy, pNew);
|
p->pOrderBy = pOrderBy = sqlite3ExprListAppend(pParse, pOrderBy, pNew);
|
||||||
if( pOrderBy ) pOrderBy->a[nOrderBy++].u.x.iOrderByCol = (u16)i;
|
if( pOrderBy ) pOrderBy->a[nOrderBy++].u.x.iOrderByCol = (u16)i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2443,6 +2443,7 @@ struct Expr {
|
|||||||
*/
|
*/
|
||||||
struct ExprList {
|
struct ExprList {
|
||||||
int nExpr; /* Number of expressions on the list */
|
int nExpr; /* Number of expressions on the list */
|
||||||
|
int nAlloc; /* Number of a[] slots allocated */
|
||||||
struct ExprList_item { /* For each expression in the list */
|
struct ExprList_item { /* For each expression in the list */
|
||||||
Expr *pExpr; /* The parse tree for this expression */
|
Expr *pExpr; /* The parse tree for this expression */
|
||||||
char *zName; /* Token associated with this expression */
|
char *zName; /* Token associated with this expression */
|
||||||
@@ -2458,7 +2459,7 @@ struct ExprList {
|
|||||||
} x;
|
} x;
|
||||||
int iConstExprReg; /* Register in which Expr value is cached */
|
int iConstExprReg; /* Register in which Expr value is cached */
|
||||||
} u;
|
} u;
|
||||||
} *a; /* Alloc a power of two greater or equal to nExpr */
|
} a[1]; /* One slot for each expression in the list */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user