1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-08 03:22:21 +03:00

Suppress more instances of unnecessary OP_IsNull and OP_Affinity opcodes.

FossilOrigin-Name: bf6c0bd1c5568c6292ea0a64c8a5071e1bd3079a
This commit is contained in:
drh
2009-11-18 01:25:26 +00:00
parent 3c65721a5b
commit 2f2855b638
5 changed files with 38 additions and 17 deletions

View File

@@ -1288,6 +1288,24 @@ int sqlite3ExprCanBeNull(const Expr *p){
}
}
/*
** Generate an OP_IsNull instruction that tests register iReg and jumps
** to location iDest if the value in iReg is NULL. The value in iReg
** was computed by pExpr. If we can look at pExpr at compile-time and
** determine that it can never generate a NULL, then the OP_IsNull operation
** can be omitted.
*/
void sqlite3ExprCodeIsNullJump(
Vdbe *v, /* The VDBE under construction */
const Expr *pExpr, /* Only generate OP_IsNull if this expr can be NULL */
int iReg, /* Test the value in this register for NULL */
int iDest /* Jump here if the value is null */
){
if( sqlite3ExprCanBeNull(pExpr) ){
sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iDest);
}
}
/*
** Return TRUE if the given expression is a constant which would be
** unchanged by OP_Affinity with the affinity given in the second
@@ -1317,6 +1335,10 @@ int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){
case TK_BLOB: {
return 1;
}
case TK_COLUMN: {
return p->iTable>=0 && p->iColumn<0
&& (aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC);
}
default: {
return 0;
}