diff options
author | drh <drh@noemail.net> | 2019-08-22 11:11:28 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2019-08-22 11:11:28 +0000 |
commit | af8664020a8f01e275e9237082d570fd25978eef (patch) | |
tree | 050329f392b26494d2eec4cbf7dc362b231efbc0 /src/expr.c | |
parent | 3e364802321c67602b2522ac4cde1fdeb2ac5d18 (diff) | |
download | sqlite-af8664020a8f01e275e9237082d570fd25978eef.tar.gz sqlite-af8664020a8f01e275e9237082d570fd25978eef.zip |
Fix a false-positive in sqlite3ExprNeedsNoAffinityChange().
Ticket [ac184eb571d5e6e0]
FossilOrigin-Name: e62eddbb048cbc2c15cb8eeb5b7a907e7cb08c21a27ebba96a069f62dbcb0f30
Diffstat (limited to 'src/expr.c')
-rw-r--r-- | src/expr.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/expr.c b/src/expr.c index c9deef0b6..3c6e93975 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2159,8 +2159,12 @@ int sqlite3ExprCanBeNull(const Expr *p){ */ int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ u8 op; + int unaryMinus = 0; if( aff==SQLITE_AFF_BLOB ) return 1; - while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ + if( p->op==TK_UMINUS ) unaryMinus = 1; + p = p->pLeft; + } op = p->op; if( op==TK_REGISTER ) op = p->op2; switch( op ){ @@ -2171,10 +2175,10 @@ int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ return aff==SQLITE_AFF_REAL || aff==SQLITE_AFF_NUMERIC; } case TK_STRING: { - return aff==SQLITE_AFF_TEXT; + return !unaryMinus && aff==SQLITE_AFF_TEXT; } case TK_BLOB: { - return 1; + return !unaryMinus; } case TK_COLUMN: { assert( p->iTable>=0 ); /* p cannot be part of a CHECK constraint */ |