Added support for CASE expressions - patches from Dan Kennedy. (CVS 437)
FossilOrigin-Name: 836b59d057c3fb4087b138c9bfbc03392ddfb89d
diff --git a/src/expr.c b/src/expr.c
index 793a44e..5b0e732 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -12,7 +12,7 @@
** This file contains routines used for analyzing expressions and
** for generating VDBE code that evaluates expressions in SQLite.
**
-** $Id: expr.c,v 1.56 2002/03/13 18:54:07 drh Exp $
+** $Id: expr.c,v 1.57 2002/03/24 13:13:29 drh Exp $
*/
#include "sqliteInt.h"
@@ -877,8 +877,49 @@
sqliteExprCode(pParse, pExpr->pLeft);
break;
}
+ case TK_CASE: {
+ int expr_end_label;
+ int next_when_label;
+ int i;
+
+ assert(pExpr->pList);
+ assert((pExpr->pList->nExpr % 2) == 0);
+ assert(pExpr->pList->nExpr > 0);
+ expr_end_label = sqliteVdbeMakeLabel(pParse->pVdbe);
+ if( pExpr->pLeft ){
+ sqliteExprCode(pParse, pExpr->pLeft);
+ }
+ for(i=0; i<pExpr->pList->nExpr; i=i+2){
+ if( i!=0 ){
+ sqliteVdbeResolveLabel(pParse->pVdbe, next_when_label);
+ }
+ next_when_label = sqliteVdbeMakeLabel(pParse->pVdbe);
+ if( pExpr->pLeft ){
+ sqliteVdbeAddOp(pParse->pVdbe, OP_Dup, 0, 1);
+ sqliteExprCode(pParse, pExpr->pList->a[i].pExpr);
+ sqliteVdbeAddOp(pParse->pVdbe, OP_Ne, 0, next_when_label);
+ }else{
+ sqliteExprIfFalse(pParse, pExpr->pList->a[i].pExpr, next_when_label);
+ }
+ if( pExpr->pLeft ){
+ sqliteVdbeAddOp(pParse->pVdbe, OP_Pop, 1, 0);
+ }
+ sqliteExprCode(pParse, pExpr->pList->a[i+1].pExpr);
+ sqliteVdbeAddOp(pParse->pVdbe, OP_Goto, 0, expr_end_label);
+ }
+ sqliteVdbeResolveLabel(pParse->pVdbe, next_when_label);
+ if( pExpr->pLeft ){
+ sqliteVdbeAddOp(pParse->pVdbe, OP_Pop, 1, 0);
+ }
+ if( pExpr->pRight ){
+ sqliteExprCode(pParse, pExpr->pRight);
+ }else{
+ sqliteVdbeAddOp(pParse->pVdbe, OP_String, 0, 0);
+ }
+ sqliteVdbeResolveLabel(pParse->pVdbe, expr_end_label);
+ }
+ break;
}
- return;
}
/*