diff --git a/include/class.orm.php b/include/class.orm.php
index ce074a88787a4947e212cae42e635ad5fa943b75..de3434cc1cedc228406905811676651924e4e38e 100644
--- a/include/class.orm.php
+++ b/include/class.orm.php
@@ -491,6 +491,24 @@ class SqlFunction {
     }
 }
 
+class SqlExpr extends SqlFunction {
+    function __construct($args) {
+        $this->args = $args;
+    }
+
+    function toSql($compiler, $model=false, $alias=false) {
+        $O = array();
+        foreach ($this->args as $field=>$value) {
+            list($field, $op) = $compiler->getField($field, $model);
+            if (is_callable($op))
+                $O[] = call_user_func($op, $field, $value, $model);
+            else
+                $O[] = sprintf($op, $field, $compiler->input($value));
+        }
+        return implode(' ', $O) . ($alias ? ' AS ' . $alias : '');
+    }
+}
+
 class SqlExpression extends SqlFunction {
     var $operator;
     var $operands;
@@ -515,6 +533,10 @@ class SqlExpression extends SqlFunction {
                 $operator = '+'; break;
             case 'times':
                 $operator = '*'; break;
+            case 'bitand':
+                $operator = '&'; break;
+            case 'bitor':
+                $operator = '|'; break;
             default:
                 throw new InvalidArgumentException('Invalid operator specified');
         }
diff --git a/setup/test/tests/stubs.php b/setup/test/tests/stubs.php
index 4b0ef139d73f36f3162c0b8c9fadc67fdfe92f4b..4a1f8db340525ffe775fda0d2a29c9e2a120a4ff 100644
--- a/setup/test/tests/stubs.php
+++ b/setup/test/tests/stubs.php
@@ -126,6 +126,8 @@ class SqlFunction {
 
 class SqlExpression {
     static function plus() {}
+    static function bitor() {}
+    static function bitand() {}
 }
 
 class SqlInterval {