2.0.3 (CVS 287)

FossilOrigin-Name: 75e90cf09b64ee1fcb39a711fc9ac6d3d2b849a5
diff --git a/src/expr.c b/src/expr.c
index 5ace178..fdb45dc 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.30 2001/10/13 01:06:48 drh Exp $
+** $Id: expr.c,v 1.31 2001/10/13 02:59:09 drh Exp $
 */
 #include "sqliteInt.h"
 
@@ -335,14 +335,16 @@
      int len;
      int id;
   } aFunc[] = {
-     { "count",  5, FN_Count },
-     { "min",    3, FN_Min   },
-     { "max",    3, FN_Max   },
-     { "sum",    3, FN_Sum   },
-     { "avg",    3, FN_Avg   },
-     { "fcnt",   4, FN_Fcnt  },  /* Used for testing only */
-     { "length", 6, FN_Length},
-     { "substr", 6, FN_Substr},
+     { "count",  5, FN_Count  },
+     { "min",    3, FN_Min    },
+     { "max",    3, FN_Max    },
+     { "sum",    3, FN_Sum    },
+     { "avg",    3, FN_Avg    },
+     { "fcnt",   4, FN_Fcnt   },  /* Used for testing only */
+     { "length", 6, FN_Length },
+     { "substr", 6, FN_Substr },
+     { "abs",    3, FN_Abs    },
+     { "round",  5, FN_Round  },
   };
   int i;
   for(i=0; i<ArraySize(aFunc); i++){
@@ -401,17 +403,23 @@
           is_agg = 1;
           break;
         }
+        case FN_Abs:
         case FN_Length: {
           too_few_args = n<1;
           too_many_args = n>1;
           break;
         }
+        case FN_Round: {
+          too_few_args = n<1;
+          too_many_args = n>2;
+          break;
+        }
         case FN_Substr: {
           too_few_args = n<3;
           too_many_args = n>3;
           break;
         }
-        /* The "fcnt(*)" function always returns the number of fetch
+        /* The "fcnt(*)" function always returns the number of OP_MoveTo
         ** operations that have occurred so far while processing the
         ** SQL statement.  This information can be used by test procedures
         ** to verify that indices are being used properly to minimize
@@ -496,6 +504,12 @@
     case TK_NOTNULL:  op = OP_NotNull;  break;
     case TK_NOT:      op = OP_Not;      break;
     case TK_UMINUS:   op = OP_Negative; break;
+    case TK_BITAND:   op = OP_BitAnd;   break;
+    case TK_BITOR:    op = OP_BitOr;    break;
+    case TK_BITNOT:   op = OP_BitNot;   break;
+    case TK_LSHIFT:   op = OP_ShiftLeft;  break;
+    case TK_RSHIFT:   op = OP_ShiftRight; break;
+    case TK_REM:      op = OP_Remainder;  break;
     default: break;
   }
   switch( pExpr->op ){
@@ -534,12 +548,22 @@
     case TK_PLUS:
     case TK_STAR:
     case TK_MINUS:
+    case TK_REM:
+    case TK_BITAND:
+    case TK_BITOR:
     case TK_SLASH: {
       sqliteExprCode(pParse, pExpr->pLeft);
       sqliteExprCode(pParse, pExpr->pRight);
       sqliteVdbeAddOp(v, op, 0, 0);
       break;
     }
+    case TK_LSHIFT:
+    case TK_RSHIFT: {
+      sqliteExprCode(pParse, pExpr->pRight);
+      sqliteExprCode(pParse, pExpr->pLeft);
+      sqliteVdbeAddOp(v, op, 0, 0);
+      break;
+    }
     case TK_CONCAT: {
       sqliteExprCode(pParse, pExpr->pLeft);
       sqliteExprCode(pParse, pExpr->pRight);
@@ -580,6 +604,7 @@
       }
       /* Fall through into TK_NOT */
     }
+    case TK_BITNOT:
     case TK_NOT: {
       sqliteExprCode(pParse, pExpr->pLeft);
       sqliteVdbeAddOp(v, op, 0, 0);
@@ -625,6 +650,21 @@
           }
           break;
         }
+        case FN_Abs: {
+          sqliteExprCode(pParse, pList->a[0].pExpr);
+          sqliteVdbeAddOp(v, OP_AbsValue, 0, 0);
+          break;
+        }
+        case FN_Round: {
+          if( pList->nExpr==2 ){
+            sqliteExprCode(pParse, pList->a[1].pExpr);
+          }else{
+            sqliteVdbeAddOp(v, OP_Integer, 0, 0);
+          }
+          sqliteExprCode(pParse, pList->a[0].pExpr);
+          sqliteVdbeAddOp(v, OP_Precision, 0, 0);
+          break;
+        }
         case FN_Length: {
           sqliteExprCode(pParse, pList->a[0].pExpr);
           sqliteVdbeAddOp(v, OP_Strlen, 0, 0);