diff --git a/doc/lab2design.txt b/doc/lab2design.txt
new file mode 100644
index 0000000000000000000000000000000000000000..096c2ed47692b9f9170be470851d763c76ac1616
--- /dev/null
+++ b/doc/lab2design.txt
@@ -0,0 +1,88 @@
+CS122 Assignment 2 - SQL Translation and Joins - Design Document
+================================================================
+
+Fill in answers for all questions based on your team's work on Assignment 2.
+
+A:  Simple Planner
+------------------
+
+A1.  Without going into the details of how you handle grouping and
+     aggregation or joins, list the general sequence of steps that your
+     planner's makePlan() method follows to translate a SQL query into
+     an execution plan.
+
+A2.  Does your planner try to simplify plans in specific circumstances,
+     e.g. when a "trivial project" is used (i.e. "SELECT * FROM ...") in
+     your planner?  Briefly enumerate all simplifications and optimizations
+     your planner employs.
+
+A3.  Describe how you generate the execution-plan fragment for the query's
+     FromClause.  Make sure to touch on what you do in the three cases your
+     planner is expected to handle - tables, subqueries in the FROM clause,
+     and joins.
+
+A4.  Describe how you implemented support for grouping and aggregation.
+     Be sure to note any variations from the approach outlined in class,
+     if there are any.
+
+B:  Nested-Loop Join
+--------------------
+
+B1.  The join algorithm stated in class is really only suitable for
+     materialized evaluation, where the entire result is generated by the
+     algorithm.  It is completely unsuitable for pipelined evaluation,
+     where results are generated row by row.
+
+     Summarize how your implementation works for inner joins, using
+     pseudocode to show how rows are considered and returned as the
+     algorithm executes, and what state must be saved so that the
+     operation can resume at the appropriate place when the next row
+     must be returned.
+
+B2.  What tweaks did you need to introduce into the implementation for
+     left outer joins?  Keep your answer brief, but please also be specific.
+
+B3.  Enumerate your nested-loop join test cases, following this form:
+
+     * <test-case class name>.<test function>
+       <brief one-sentence description of what the test exercises>
+
+C:  Extra Credit [OPTIONAL]
+---------------------------
+
+If you implemented any extra-credit tasks for this assignment, describe
+them here.  The description should be like this, with stuff in "<>" replaced.
+(The value i starts at 1 and increments...)
+
+D<i>:  <one-line description>
+
+     <brief summary of what you did, including the specific classes that
+     we should look at for your implementation>
+
+     <brief summary of test-cases that demonstrate/exercise your extra work>
+
+E:  Feedback [OPTIONAL]
+-----------------------
+
+WE NEED YOUR FEEDBACK!  Thoughtful and constructive input will help us to
+improve future versions of the course.  These questions are OPTIONAL, and
+your answers will not affect your grade in any way (including if you hate
+everything about the assignment and databases in general, or Donnie and/or
+the TAs in particular).  Feel free to answer as many or as few of them as
+you wish.
+
+E1.  What parts of the assignment were most time-consuming?  Why?
+
+E2.  Did you find any parts of the assignment particularly instructive?
+     Correspondingly, did any parts feel like unnecessary busy-work?
+
+E3.  Did you particularly enjoy any parts of the assignment?  Were there
+     any parts that you particularly disliked?
+
+E4.  Were there any critical details that you wish had been provided with the
+     assignment, that we should consider including in subsequent versions of
+     the assignment?
+
+E5.  Do you have any other suggestions for how future versions of the
+     assignment can be improved?
+
diff --git a/doc/lab2info.txt b/doc/lab2info.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f111faaaba27032a912bcc4907ba6e629e5c9c37
--- /dev/null
+++ b/doc/lab2info.txt
@@ -0,0 +1,33 @@
+CS122 Assignment 2 - SQL Translation and Joins - Logistics
+==========================================================
+
+Please completely fill out this document so that we know who participated on
+the assignment, any late extensions received, and how much time the assignment
+took for your team.  Thank you!
+
+L1.  List your team name and the people who worked on this assignment.
+
+     <team name>
+
+     <name>
+     <name>
+     ...
+
+L2.  Specify the tag and commit-hash of the Git commit you are submitting for
+     your assignment.  (You can list the hashes of all tags with the command
+     "git show-ref --tags".)
+
+     Tag:  <tag>
+     Commit hash:  <hash>
+
+L3.  Specify how many late tokens you are applying to this assignment, if any.
+     Similarly, if your team received an extension from Donnie then please
+     indicate how many days extension you received.  You may leave this blank
+     if it is not relevant to this submission.
+
+     <tokens / extension>
+
+L4.  For each teammate, briefly describe what parts of the assignment each
+     teammate focused on, along with the total hours spent on the assignment.
+
+
diff --git a/src/main/java/edu/caltech/nanodb/queryeval/InvalidSQLException.java b/src/main/java/edu/caltech/nanodb/queryeval/InvalidSQLException.java
new file mode 100644
index 0000000000000000000000000000000000000000..95afd7f1ed3294c06fab2cb86323c2e449749c39
--- /dev/null
+++ b/src/main/java/edu/caltech/nanodb/queryeval/InvalidSQLException.java
@@ -0,0 +1,28 @@
+package edu.caltech.nanodb.queryeval;
+
+
+import edu.caltech.nanodb.server.NanoDBException;
+
+
+/**
+ * This exception is used to signal when a SQL query contains a semantic error
+ * that prevents its evaluation.  For example, an expression like
+ * "<tt>MAX(AVG(a))</tt>" is invalid and cannot be evaluated.
+ */
+public class InvalidSQLException extends NanoDBException {
+    public InvalidSQLException() {
+        super();
+    }
+
+    public InvalidSQLException(String msg) {
+        super(msg);
+    }
+
+    public InvalidSQLException(Throwable cause) {
+        super(cause);
+    }
+
+    public InvalidSQLException(String msg, Throwable cause) {
+        super(msg, cause);
+    }
+}