aboutsummaryrefslogtreecommitdiff
path: root/src/expr.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2000-06-08 13:36:40 +0000
committerdrh <drh@noemail.net>2000-06-08 13:36:40 +0000
commit6e142f547944745eb91b80248fae3149b9b1281a (patch)
tree983dccc81b012a38aa8eb4ecfc3d2184d415673f /src/expr.c
parentaaf88729b71ff88b2af0ded2d09fc90d4390fed9 (diff)
downloadsqlite-6e142f547944745eb91b80248fae3149b9b1281a.tar.gz
sqlite-6e142f547944745eb91b80248fae3149b9b1281a.zip
remove all memory leaks (CVS 80)
FossilOrigin-Name: bf98cf82a73c54c4eced04994bb1a019844dfc03
Diffstat (limited to 'src/expr.c')
-rw-r--r--src/expr.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/expr.c b/src/expr.c
index 54840b07d..a3200eb4d 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -23,7 +23,7 @@
*************************************************************************
** This file contains C code routines used for processing expressions
**
-** $Id: expr.c,v 1.12 2000/06/08 11:25:01 drh Exp $
+** $Id: expr.c,v 1.13 2000/06/08 13:36:40 drh Exp $
*/
#include "sqliteInt.h"
@@ -118,8 +118,7 @@ int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){
case TK_ID: {
int cnt = 0; /* Number of matches */
int i; /* Loop counter */
- char *z = 0;
- sqliteSetNString(&z, pExpr->token.z, pExpr->token.n, 0);
+ char *z = sqliteStrNDup(pExpr->token.z, pExpr->token.n);
for(i=0; i<pTabList->nId; i++){
int j;
Table *pTab = pTabList->a[i].pTab;
@@ -159,10 +158,8 @@ int sqliteExprResolveIds(Parse *pParse, IdList *pTabList, Expr *pExpr){
pRight = pExpr->pRight;
assert( pLeft && pLeft->op==TK_ID );
assert( pRight && pRight->op==TK_ID );
- zLeft = 0;
- sqliteSetNString(&zLeft, pLeft->token.z, pLeft->token.n, 0);
- zRight = 0;
- sqliteSetNString(&zRight, pRight->token.z, pRight->token.n, 0);
+ zLeft = sqliteStrNDup(pLeft->token.z, pLeft->token.n);
+ zRight = sqliteStrNDup(pRight->token.z, pRight->token.n);
for(i=0; i<pTabList->nId; i++){
int j;
char *zTab;
@@ -512,8 +509,23 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){
sqliteVdbeAddOp(v, OP_AddImm, -1, 0, 0, 0);
break;
}
- case TK_NOT:
case TK_UMINUS: {
+ assert( pExpr->pLeft );
+ if( pExpr->pLeft->op==TK_INTEGER ){
+ int i = atoi(pExpr->pLeft->token.z);
+ sqliteVdbeAddOp(v, OP_Integer, -i, 0, 0, 0);
+ break;
+ }else if( pExpr->pLeft->op==TK_FLOAT ){
+ Token *p = &pExpr->pLeft->token;
+ char *z = sqliteMalloc( p->n + 2 );
+ sprintf(z, "-%.*s", p->n, p->z);
+ sqliteVdbeAddOp(v, OP_String, 0, 0, z, 0);
+ sqliteFree(z);
+ break;
+ }
+ /* Fall true into TK_NOT */
+ }
+ case TK_NOT: {
sqliteExprCode(pParse, pExpr->pLeft);
sqliteVdbeAddOp(v, op, 0, 0, 0, 0);
break;