diff --git a/src/main/java/edu/caltech/nanodb/expressions/BooleanOperator.java b/src/main/java/edu/caltech/nanodb/expressions/BooleanOperator.java
index 68edee97a017d4460185f34732b07d597ac56882..7284da10a13b6324759b3c6a35d92f5c857db55b 100755
--- a/src/main/java/edu/caltech/nanodb/expressions/BooleanOperator.java
+++ b/src/main/java/edu/caltech/nanodb/expressions/BooleanOperator.java
@@ -72,7 +72,7 @@ public class BooleanOperator extends Expression {
             throw new NullPointerException("type cannot be null");
 
         this.type = type;
-        this.terms = new ArrayList<Expression>();
+        this.terms = new ArrayList<>();
 
         if (terms != null) {
             for (Expression term : terms)
@@ -492,9 +492,12 @@ public class BooleanOperator extends Expression {
                 // that are also BooleanOperators of the same type, since
                 // the new nodes will now be at index i.
             }
+            else {
+                // Some other kind of term - skip it.
+                i++;
+            }
         }
 
-
         return this;
     }
 
diff --git a/src/main/java/edu/caltech/nanodb/queryast/FromClause.java b/src/main/java/edu/caltech/nanodb/queryast/FromClause.java
index ac043a62496a9218745097a38c3505d7d4d1ed8b..2acaa36887e21b678eba150edd239344b9f80f48 100755
--- a/src/main/java/edu/caltech/nanodb/queryast/FromClause.java
+++ b/src/main/java/edu/caltech/nanodb/queryast/FromClause.java
@@ -665,6 +665,7 @@ public class FromClause {
         }
 
         joinOnExpr = expr;
+        joinOnExpr = joinOnExpr.simplify();
     }
 
 
diff --git a/src/main/java/edu/caltech/nanodb/queryast/SelectClause.java b/src/main/java/edu/caltech/nanodb/queryast/SelectClause.java
index 18de7086ec00eefa40d8a168e1181b09d2772b8a..8afa5c5c97457fde956e218aa8147b3e6696542f 100755
--- a/src/main/java/edu/caltech/nanodb/queryast/SelectClause.java
+++ b/src/main/java/edu/caltech/nanodb/queryast/SelectClause.java
@@ -452,6 +452,10 @@ public class SelectClause {
             resolveExpressionRefs("WHERE clause", whereExpr, fromSchema,
                 /* checkParentQueries */ true);
 
+            // Simplify the expression
+            whereExpr = whereExpr.simplify();
+
+            // Compute the schemas of subqueries embedded in the WHERE clause.
             whereExpr.traverse(subquerySchemaComputer);
         }
 
@@ -470,6 +474,10 @@ public class SelectClause {
             resolveExpressionRefs("HAVING clause", havingExpr, fromSchema,
                 /* checkParentQueries */ true);
 
+            // Simplify the expression
+            havingExpr = havingExpr.simplify();
+
+            // Compute the schemas of subqueries embedded in the HAVING clause
             havingExpr.traverse(subquerySchemaComputer);
         }