Improved performance in sqlite3ExprCodeTarget().
FossilOrigin-Name: 75146165dcc1ae1faab46b1a7333ef795d5eeac5
This commit is contained in:
parent
d43075bcaf
commit
c332cc30d9
12
manifest
12
manifest
@ -1,5 +1,5 @@
|
||||
C Small\sperformance\soptimization\sin\sthe\sexpression\swalker.
|
||||
D 2016-09-19T02:19:00.600
|
||||
C Improved\sperformance\sin\ssqlite3ExprCodeTarget().
|
||||
D 2016-09-19T10:24:19.052
|
||||
F Makefile.in 6fd48ffcf7c2deea7499062d1f3747f986c19678
|
||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||
F Makefile.msc e1aa788e84f926e42239ee167c53f785bedacacd
|
||||
@ -339,7 +339,7 @@ F src/ctime.c e77f3dc297b4b65c96da78b4ae4272fdfae863d7
|
||||
F src/date.c 95c9a8d00767e7221a8e9a31f4e913fc8029bf6b
|
||||
F src/dbstat.c 19ee7a4e89979d4df8e44cfac7a8f905ec89b77d
|
||||
F src/delete.c e91a11e0e86a13ce1917ca5ad7cf14c37ba31e59
|
||||
F src/expr.c 5f6c8263b021853aef5a43e920efebd0b94de394
|
||||
F src/expr.c f35e6c250bceaadc6a65e0c344e8f8bc398119e6
|
||||
F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb
|
||||
F src/fkey.c e2be0968c1adc679c87e467aa5b4f167588f38a8
|
||||
F src/func.c 29cc9acb170ec1387b9f63eb52cd85f8de96c771
|
||||
@ -1525,7 +1525,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||
P 6bf5ba10d28f1b0a32aa9a560ae3143a1235eadb
|
||||
R 3576b7fe8bd045656543b2a44b86fd72
|
||||
P c6e6afb9391704d9119335f2ce17df3968acb514
|
||||
R 5e8eb1549d648015d64d5983cb2b67d7
|
||||
U drh
|
||||
Z 8bd385e2bfe7ba512e577302650c0d2b
|
||||
Z f9a9936a11469969054ab3df81b2204c
|
||||
|
@ -1 +1 @@
|
||||
c6e6afb9391704d9119335f2ce17df3968acb514
|
||||
75146165dcc1ae1faab46b1a7333ef795d5eeac5
|
55
src/expr.c
55
src/expr.c
@ -3348,7 +3348,6 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
int regFree1 = 0; /* If non-zero free this temporary register */
|
||||
int regFree2 = 0; /* If non-zero free this temporary register */
|
||||
int r1, r2; /* Various register numbers */
|
||||
sqlite3 *db = pParse->db; /* The database connection */
|
||||
Expr tempX; /* Temporary expression node */
|
||||
int p5 = 0;
|
||||
|
||||
@ -3369,12 +3368,11 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg];
|
||||
if( !pAggInfo->directMode ){
|
||||
assert( pCol->iMem>0 );
|
||||
inReg = pCol->iMem;
|
||||
break;
|
||||
return pCol->iMem;
|
||||
}else if( pAggInfo->useSortingIdx ){
|
||||
sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab,
|
||||
pCol->iSorterColumn, target);
|
||||
break;
|
||||
return target;
|
||||
}
|
||||
/* Otherwise, fall thru into the TK_COLUMN case */
|
||||
}
|
||||
@ -3383,38 +3381,36 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
if( iTab<0 ){
|
||||
if( pParse->ckBase>0 ){
|
||||
/* Generating CHECK constraints or inserting into partial index */
|
||||
inReg = pExpr->iColumn + pParse->ckBase;
|
||||
break;
|
||||
return pExpr->iColumn + pParse->ckBase;
|
||||
}else{
|
||||
/* Coding an expression that is part of an index where column names
|
||||
** in the index refer to the table to which the index belongs */
|
||||
iTab = pParse->iSelfTab;
|
||||
}
|
||||
}
|
||||
inReg = sqlite3ExprCodeGetColumn(pParse, pExpr->pTab,
|
||||
return sqlite3ExprCodeGetColumn(pParse, pExpr->pTab,
|
||||
pExpr->iColumn, iTab, target,
|
||||
pExpr->op2);
|
||||
break;
|
||||
}
|
||||
case TK_INTEGER: {
|
||||
codeInteger(pParse, pExpr, 0, target);
|
||||
break;
|
||||
return target;
|
||||
}
|
||||
#ifndef SQLITE_OMIT_FLOATING_POINT
|
||||
case TK_FLOAT: {
|
||||
assert( !ExprHasProperty(pExpr, EP_IntValue) );
|
||||
codeReal(v, pExpr->u.zToken, 0, target);
|
||||
break;
|
||||
return target;
|
||||
}
|
||||
#endif
|
||||
case TK_STRING: {
|
||||
assert( !ExprHasProperty(pExpr, EP_IntValue) );
|
||||
sqlite3VdbeLoadString(v, target, pExpr->u.zToken);
|
||||
break;
|
||||
return target;
|
||||
}
|
||||
case TK_NULL: {
|
||||
sqlite3VdbeAddOp2(v, OP_Null, 0, target);
|
||||
break;
|
||||
return target;
|
||||
}
|
||||
#ifndef SQLITE_OMIT_BLOB_LITERAL
|
||||
case TK_BLOB: {
|
||||
@ -3429,7 +3425,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
assert( z[n]=='\'' );
|
||||
zBlob = sqlite3HexToBlob(sqlite3VdbeDb(v), z, n);
|
||||
sqlite3VdbeAddOp4(v, OP_Blob, n/2, target, 0, zBlob, P4_DYNAMIC);
|
||||
break;
|
||||
return target;
|
||||
}
|
||||
#endif
|
||||
case TK_VARIABLE: {
|
||||
@ -3442,11 +3438,10 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
|| strcmp(pExpr->u.zToken, pParse->azVar[pExpr->iColumn-1])==0 );
|
||||
sqlite3VdbeChangeP4(v, -1, pParse->azVar[pExpr->iColumn-1], P4_STATIC);
|
||||
}
|
||||
break;
|
||||
return target;
|
||||
}
|
||||
case TK_REGISTER: {
|
||||
inReg = pExpr->iTable;
|
||||
break;
|
||||
return pExpr->iTable;
|
||||
}
|
||||
#ifndef SQLITE_OMIT_CAST
|
||||
case TK_CAST: {
|
||||
@ -3460,7 +3455,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
sqlite3AffinityType(pExpr->u.zToken, 0));
|
||||
testcase( usedAsColumnCache(pParse, inReg, inReg) );
|
||||
sqlite3ExprCacheAffinityChange(pParse, inReg, 1);
|
||||
break;
|
||||
return inReg;
|
||||
}
|
||||
#endif /* SQLITE_OMIT_CAST */
|
||||
case TK_IS:
|
||||
@ -3528,10 +3523,12 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
assert( pLeft );
|
||||
if( pLeft->op==TK_INTEGER ){
|
||||
codeInteger(pParse, pLeft, 1, target);
|
||||
return target;
|
||||
#ifndef SQLITE_OMIT_FLOATING_POINT
|
||||
}else if( pLeft->op==TK_FLOAT ){
|
||||
assert( !ExprHasProperty(pExpr, EP_IntValue) );
|
||||
codeReal(v, pLeft->u.zToken, 1, target);
|
||||
return target;
|
||||
#endif
|
||||
}else{
|
||||
tempX.op = TK_INTEGER;
|
||||
@ -3542,7 +3539,6 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
sqlite3VdbeAddOp3(v, OP_Subtract, r2, r1, target);
|
||||
testcase( regFree2==0 );
|
||||
}
|
||||
inReg = target;
|
||||
break;
|
||||
}
|
||||
case TK_BITNOT:
|
||||
@ -3551,7 +3547,6 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
assert( TK_NOT==OP_Not ); testcase( op==TK_NOT );
|
||||
r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1);
|
||||
testcase( regFree1==0 );
|
||||
inReg = target;
|
||||
sqlite3VdbeAddOp2(v, op, r1, inReg);
|
||||
break;
|
||||
}
|
||||
@ -3576,7 +3571,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
assert( !ExprHasProperty(pExpr, EP_IntValue) );
|
||||
sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken);
|
||||
}else{
|
||||
inReg = pInfo->aFunc[pExpr->iAgg].iMem;
|
||||
return pInfo->aFunc[pExpr->iAgg].iMem;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -3587,6 +3582,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
const char *zId; /* The function name */
|
||||
u32 constMask = 0; /* Mask of function arguments that are constant */
|
||||
int i; /* Loop counter */
|
||||
sqlite3 *db = pParse->db; /* The database connection */
|
||||
u8 enc = ENC(db); /* The text encoding used by this database */
|
||||
CollSeq *pColl = 0; /* A collating sequence */
|
||||
|
||||
@ -3635,8 +3631,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
*/
|
||||
if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){
|
||||
assert( nFarg>=1 );
|
||||
inReg = sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target);
|
||||
break;
|
||||
return sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target);
|
||||
}
|
||||
|
||||
for(i=0; i<nFarg; i++){
|
||||
@ -3711,7 +3706,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
if( nFarg && constMask==0 ){
|
||||
sqlite3ReleaseTempRange(pParse, r1, nFarg);
|
||||
}
|
||||
break;
|
||||
return target;
|
||||
}
|
||||
#ifndef SQLITE_OMIT_SUBQUERY
|
||||
case TK_EXISTS:
|
||||
@ -3722,7 +3717,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
if( op==TK_SELECT && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 ){
|
||||
sqlite3SubselectError(pParse, nCol, 1);
|
||||
}else{
|
||||
inReg = sqlite3CodeSubselect(pParse, pExpr, 0, 0);
|
||||
return sqlite3CodeSubselect(pParse, pExpr, 0, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -3730,8 +3725,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
if( pExpr->pLeft->iTable==0 ){
|
||||
pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft, 0, 0);
|
||||
}
|
||||
inReg = pExpr->pLeft->iTable + pExpr->iColumn;
|
||||
break;
|
||||
return pExpr->pLeft->iTable + pExpr->iColumn;
|
||||
}
|
||||
case TK_IN: {
|
||||
int destIfFalse = sqlite3VdbeMakeLabel(v);
|
||||
@ -3742,7 +3736,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
sqlite3VdbeResolveLabel(v, destIfFalse);
|
||||
sqlite3VdbeAddOp2(v, OP_AddImm, target, 0);
|
||||
sqlite3VdbeResolveLabel(v, destIfNull);
|
||||
break;
|
||||
return target;
|
||||
}
|
||||
#endif /* SQLITE_OMIT_SUBQUERY */
|
||||
|
||||
@ -3760,13 +3754,12 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
*/
|
||||
case TK_BETWEEN: {
|
||||
exprCodeBetween(pParse, pExpr, target, 0, 0);
|
||||
break;
|
||||
return target;
|
||||
}
|
||||
case TK_SPAN:
|
||||
case TK_COLLATE:
|
||||
case TK_UPLUS: {
|
||||
inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
|
||||
break;
|
||||
return sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target);
|
||||
}
|
||||
|
||||
case TK_TRIGGER: {
|
||||
@ -3908,7 +3901,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){
|
||||
}else{
|
||||
sqlite3VdbeAddOp2(v, OP_Null, 0, target);
|
||||
}
|
||||
assert( db->mallocFailed || pParse->nErr>0
|
||||
assert( pParse->db->mallocFailed || pParse->nErr>0
|
||||
|| pParse->iCacheLevel==iCacheLevel );
|
||||
sqlite3VdbeResolveLabel(v, endLabel);
|
||||
break;
|
||||
|
Loading…
x
Reference in New Issue
Block a user