aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2019-08-22 11:11:28 +0000
committerdrh <drh@noemail.net>2019-08-22 11:11:28 +0000
commitaf8664020a8f01e275e9237082d570fd25978eef (patch)
tree050329f392b26494d2eec4cbf7dc362b231efbc0 /src/expr.c
parent3e364802321c67602b2522ac4cde1fdeb2ac5d18 (diff)
downloadsqlite-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.c10
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 */