diff options
author | drh <drh@noemail.net> | 2000-08-28 15:51:43 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2000-08-28 15:51:43 +0000 |
commit | 6ec2733b44bd8c69463d90a459efa7a74a3d4cf2 (patch) | |
tree | 4aef905c79f70c680fe080e1cca2bd9272d627f6 /src/expr.c | |
parent | 3d441f8082974542c00577b33717bd10be8c5c21 (diff) | |
download | sqlite-6ec2733b44bd8c69463d90a459efa7a74a3d4cf2.tar.gz sqlite-6ec2733b44bd8c69463d90a459efa7a74a3d4cf2.zip |
Added length() and substr() functions (CVS 143)
FossilOrigin-Name: 0eef538f3de66fede7c88f8be8c3458d84107c3f
Diffstat (limited to 'src/expr.c')
-rw-r--r-- | src/expr.c | 55 |
1 files changed, 45 insertions, 10 deletions
diff --git a/src/expr.c b/src/expr.c index c94fd247a..55774f24b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -24,7 +24,7 @@ ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions. ** -** $Id: expr.c,v 1.18 2000/06/21 13:59:11 drh Exp $ +** $Id: expr.c,v 1.19 2000/08/28 15:51:44 drh Exp $ */ #include "sqliteInt.h" @@ -323,6 +323,8 @@ int sqliteFuncId(Token *pToken){ { "sum", 3, FN_Sum }, { "avg", 3, FN_Avg }, { "fcnt", 4, FN_Fcnt }, /* Used for testing only */ + { "length", 6, FN_Length}, + { "substr", 6, FN_Substr}, }; int i; for(i=0; i<ArraySize(aFunc); i++){ @@ -381,6 +383,16 @@ int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ is_agg = 1; break; } + case FN_Length: { + too_few_args = n<1; + too_many_args = n>1; + break; + } + case FN_Substr: { + too_few_args = n<3; + too_many_args = n>3; + break; + } /* The "fcnt(*)" function always returns the number of fetch ** operations that have occurred so far while processing the ** SQL statement. This information can be used by test procedures @@ -392,6 +404,7 @@ int sqliteExprCheck(Parse *pParse, Expr *pExpr, int allowAgg, int *pIsAgg){ n = 0; break; } + default: break; } if( no_such_func ){ @@ -574,15 +587,37 @@ void sqliteExprCode(Parse *pParse, Expr *pExpr){ int op; int i; ExprList *pList = pExpr->pList; - if( id==FN_Fcnt ){ - sqliteVdbeAddOp(v, OP_Fcnt, 0, 0, 0, 0); - break; - } - op = id==FN_Min ? OP_Min : OP_Max; - for(i=0; i<pList->nExpr; i++){ - sqliteExprCode(pParse, pList->a[i].pExpr); - if( i>0 ){ - sqliteVdbeAddOp(v, op, 0, 0, 0, 0); + switch( id ){ + case FN_Fcnt: { + sqliteVdbeAddOp(v, OP_Fcnt, 0, 0, 0, 0); + break; + } + case FN_Min: + case FN_Max: { + op = id==FN_Min ? OP_Min : OP_Max; + for(i=0; i<pList->nExpr; i++){ + sqliteExprCode(pParse, pList->a[i].pExpr); + if( i>0 ){ + sqliteVdbeAddOp(v, op, 0, 0, 0, 0); + } + } + break; + } + case FN_Length: { + sqliteExprCode(pParse, pList->a[0].pExpr); + sqliteVdbeAddOp(v, OP_Strlen, 0, 0, 0, 0); + break; + } + case FN_Substr: { + for(i=0; i<pList->nExpr; i++){ + sqliteExprCode(pParse, pList->a[i].pExpr); + } + sqliteVdbeAddOp(v, OP_Substr, 0, 0, 0, 0); + break; + } + default: { + /* Can't happen! */ + break; } } break; |