Add "COPY TO" operator for exporting data from Quickstep.
diff --git a/parser/ParseKeyValue.hpp b/parser/ParseKeyValue.hpp
index 9d6d511..6134379 100644
--- a/parser/ParseKeyValue.hpp
+++ b/parser/ParseKeyValue.hpp
@@ -37,14 +37,15 @@
  */
 class ParseKeyValue : public ParseTreeNode {
  public:
-  enum class KeyValueType {
+  enum KeyValueType {
+    kStringBool = 0,
+    kStringInteger,
     kStringString,
-    kStringStringList,
-    kStringInteger
+    kStringStringList
   };
 
   /**
-   * @brief Single value constructor.
+   * @brief Constructor.
    *
    * @param line_number Line number of the first token of this node in the SQL statement.
    * @param column_number Column number of the first token of this node in the SQL statement.
@@ -87,7 +88,7 @@
 class ParseKeyStringValue : public ParseKeyValue {
  public:
   /**
-   * @brief Single value constructor.
+   * @brief Constructor.
    *
    * @param line_number Line number of the first token of this node in the SQL statement.
    * @param column_number Column number of the first token of this node in the SQL statement.
@@ -102,7 +103,7 @@
         value_(value) { }
 
   KeyValueType getKeyValueType() const override {
-    return ParseKeyValue::KeyValueType::kStringString;
+    return kStringString;
   }
 
   /**
@@ -143,7 +144,7 @@
 class ParseKeyStringList : public ParseKeyValue {
  public:
   /**
-   * @brief Single value constructor.
+   * @brief Constructor.
    *
    * @param line_number Line number of the first token of this node in the SQL statement.
    * @param column_number Column number of the first token of this node in the SQL statement.
@@ -155,10 +156,10 @@
                      ParseString *key,
                      PtrList<ParseString> *value)
       : ParseKeyValue(line_number, column_number, key),
-        value_(value) { }
+        value_(value) {}
 
   KeyValueType getKeyValueType() const override {
-    return ParseKeyValue::KeyValueType::kStringStringList;
+    return kStringStringList;
   }
 
   /**
@@ -197,12 +198,12 @@
 };
 
 /**
- * @brief The parsed representation of a key-value pair.
+ * @brief The parsed representation of a key-value pair. Value is of int type.
  **/
 class ParseKeyIntegerValue : public ParseKeyValue {
  public:
   /**
-   * @brief Single value constructor.
+   * @brief Constructor.
    *
    * @param line_number Line number of the first token of this node in the SQL statement.
    * @param column_number Column number of the first token of this node in the SQL statement.
@@ -214,10 +215,10 @@
                        ParseString *key,
                        NumericParseLiteralValue *value)
       : ParseKeyValue(line_number, column_number, key),
-        value_(value) { }
+        value_(value) {}
 
   KeyValueType getKeyValueType() const override {
-    return ParseKeyValue::KeyValueType::kStringInteger;
+    return kStringInteger;
   }
 
   /**
@@ -252,6 +253,62 @@
   DISALLOW_COPY_AND_ASSIGN(ParseKeyIntegerValue);
 };
 
+/**
+ * @brief The parsed representation of a key-value pair. Value is of bool type.
+ **/
+class ParseKeyBoolValue : public ParseKeyValue {
+ public:
+  /**
+   * @brief Constructor.
+   *
+   * @param line_number Line number of the first token of this node in the SQL statement.
+   * @param column_number Column number of the first token of this node in the SQL statement.
+   * @param key A parse string representing the key.
+   * @param value A single bool literal value.
+   **/
+  ParseKeyBoolValue(const int line_number,
+                    const int column_number,
+                    ParseString *key,
+                    const bool value)
+      : ParseKeyValue(line_number, column_number, key),
+        value_(value) {}
+
+  KeyValueType getKeyValueType() const override {
+    return kStringBool;
+  }
+
+  /**
+   * @return The bool value.
+   */
+  bool value() const {
+    return value_;
+  }
+
+  std::string getName() const override {
+    return "KeyBoolValue";
+  }
+
+ protected:
+  void getFieldStringItems(
+      std::vector<std::string> *inline_field_names,
+      std::vector<std::string> *inline_field_values,
+      std::vector<std::string> *non_container_child_field_names,
+      std::vector<const ParseTreeNode*> *non_container_child_fields,
+      std::vector<std::string> *container_child_field_names,
+      std::vector<std::vector<const ParseTreeNode*>> *container_child_fields) const override {
+    inline_field_names->push_back("key");
+    inline_field_values->push_back(key_->value());
+
+    inline_field_names->push_back("value");
+    inline_field_values->push_back(value_ ? "true" : "false");
+  }
+
+ private:
+  const bool value_;
+
+  DISALLOW_COPY_AND_ASSIGN(ParseKeyBoolValue);
+};
+
 }  // namespace quickstep
 
 #endif  // QUICKSTEP_PARSER_PARSE_KEY_VALUE_HPP_
diff --git a/parser/ParseStatement.hpp b/parser/ParseStatement.hpp
index d876163..cee7221 100644
--- a/parser/ParseStatement.hpp
+++ b/parser/ParseStatement.hpp
@@ -60,16 +60,16 @@
    * @brief The possible types of SQL statements.
    **/
   enum StatementType {
-    kCreateTable,
+    kCommand = 0,
+    kCopy,
     kCreateIndex,
-    kDropTable,
-    kSetOperation,
-    kInsert,
-    kCopyFrom,
-    kUpdate,
+    kCreateTable,
     kDelete,
+    kDropTable,
+    kInsert,
     kQuit,
-    kCommand
+    kSetOperation,
+    kUpdate
   };
 
   /**
@@ -215,9 +215,10 @@
   DISALLOW_COPY_AND_ASSIGN(ParseStatementCreateTable);
 };
 
-  /**
-   * @brief The parsed representation of a CREATE INDEX statement.
-   **/
+
+/**
+ * @brief The parsed representation of a CREATE INDEX statement.
+ **/
 class ParseStatementCreateIndex : public ParseStatement {
  public:
     /**
@@ -423,6 +424,7 @@
     DISALLOW_COPY_AND_ASSIGN(ParseStatementCreateIndex);
 };
 
+
 /**
  * @brief The parsed representation of a DROP TABLE statement.
  **/
@@ -479,6 +481,7 @@
   DISALLOW_COPY_AND_ASSIGN(ParseStatementDropTable);
 };
 
+
 /**
  * @brief The parsed representation of an UNION/INTERSECT/SELECT statement.
  **/
@@ -519,14 +522,14 @@
   std::string getName() const override { return "SetOperationStatement"; }
 
   /**
-   * @return Gets the top-level set operation query.
+   * @return Get the top-level set operation query.
    */
   const ParseSetOperation* set_operation_query() const {
     return set_operation_query_.get();
   }
 
   /**
-   * @brief Gets the WITH table queries.
+   * @brief Get the WITH table queries.
    *
    * @return The parsed WITH table list.
    */
@@ -575,6 +578,7 @@
   DISALLOW_COPY_AND_ASSIGN(ParseStatementSetOperation);
 };
 
+
 /**
  * @brief The parsed representation of an INSERT statement.
  *
@@ -694,6 +698,7 @@
   DISALLOW_COPY_AND_ASSIGN(ParseStatementInsertTuple);
 };
 
+
 /**
  * @brief The parsed representation of an INSERT ... SELECT ... statement.
  **/
@@ -771,122 +776,135 @@
   DISALLOW_COPY_AND_ASSIGN(ParseStatementInsertSelection);
 };
 
-/**
- * @brief Optional parameters for a COPY FROM statement.
- **/
-struct ParseCopyFromParams : public ParseTreeNode {
-  /**
-   * @brief Constructor, sets default values.
-   **/
-  ParseCopyFromParams(const int line_number, const int column_number)
-      : ParseTreeNode(line_number, column_number),
-        escape_strings(true) {
-  }
-
-  std::string getName() const override { return "CopyFromParams"; }
-
-  /**
-   * @brief Sets the column delimiter.
-   *
-   * @param delimiter_in The column delimiter string.
-   */
-  void set_delimiter(ParseString* delimiter_in) {
-    delimiter.reset(delimiter_in);
-  }
-
-  /**
-   * @brief The string which terminates individual attribute values in the
-   *        input file. Can be NULL.
-   **/
-  std::unique_ptr<ParseString> delimiter;
-
-  /**
-   * @brief If true, replace C-style escape sequences in strings from the input
-   *        text file.
-   **/
-  bool escape_strings;
-
- protected:
-  void getFieldStringItems(
-      std::vector<std::string> *inline_field_names,
-      std::vector<std::string> *inline_field_values,
-      std::vector<std::string> *non_container_child_field_names,
-      std::vector<const ParseTreeNode*> *non_container_child_fields,
-      std::vector<std::string> *container_child_field_names,
-      std::vector<std::vector<const ParseTreeNode*>> *container_child_fields) const override {
-    if (delimiter != nullptr) {
-      inline_field_names->push_back("delimiter");
-      inline_field_values->push_back(delimiter->value());
-    }
-
-    inline_field_names->push_back("escape_string");
-    inline_field_values->push_back(escape_strings ? "true" : "false");
-  }
-};
 
 /**
- * @brief The parsed representation of a COPY FROM statement.
+ * @brief The parsed representation of a COPY FROM/COPY TO statement.
  **/
-class ParseStatementCopyFrom : public ParseStatement {
+class ParseStatementCopy : public ParseStatement {
  public:
   /**
-   * @brief Constructor.
+   * @brief Copy direction (FROM text file/TO text file).
+   */
+  enum CopyDirection {
+    kFrom = 0,
+    kTo
+  };
+
+  /**
+   * @brief Constructor for a copy statement that copies a stored relation FROM
+   *        a text file (or multiple text files, in the case that the file name
+   *        is a GLOB pattern) / TO a text file.
    *
    * @param line_number Line number of the first token of this node in the SQL statement.
    * @param column_number Column number of the first token of this node in the SQL statement.
-   * @param relation_name The name of the relation to insert into.
-   * @param source_filename The name of the text file to bulk insert from.
-   * @param params The optional parameters of the COPY FROM statement (should
-   *        be supplied with defaults if not otherwise set).
+   * @param direction The copy direction (FROM/TO).
+   * @param relation_name The name of the relation.
+   * @param file_name The name of the file.
+   * @param params The optional parameters of the COPY statement.
    **/
-  ParseStatementCopyFrom(const int line_number,
-                         const int column_number,
-                         ParseString *relation_name,
-                         ParseString *source_filename,
-                         ParseCopyFromParams *params)
+  ParseStatementCopy(const int line_number,
+                     const int column_number,
+                     const CopyDirection direction,
+                     ParseString *relation_name,
+                     ParseString *file_name,
+                     PtrList<ParseKeyValue> *params)
       : ParseStatement(line_number, column_number),
+        direction_(direction),
         relation_name_(relation_name),
-        source_filename_(source_filename),
+        file_name_(file_name),
+        params_(params) {
+  }
+
+  /**
+   * @brief Constructor for a copy statement that copies the result table of a
+   *        query TO a text file.
+   *
+   * @param line_number Line number of the first token of this node in the SQL statement.
+   * @param column_number Column number of the first token of this node in the SQL statement.
+   * @param set_operation_query The set operation query.
+   * @param with_clause The WITH clause of common table query expressions.
+   * @param file_name The name of the file.
+   * @param params The optional parameters of the COPY statement.
+   **/
+  ParseStatementCopy(const int line_number,
+                     const int column_number,
+                     ParseSetOperation *set_operation_query,
+                     PtrVector<ParseSubqueryTableReference> *with_clause,
+                     ParseString *file_name,
+                     PtrList<ParseKeyValue> *params)
+      : ParseStatement(line_number, column_number),
+        direction_(kTo),
+        set_operation_query_(set_operation_query),
+        with_clause_(with_clause),
+        file_name_(file_name),
         params_(params) {
   }
 
   /**
    * @brief Destructor.
    */
-  ~ParseStatementCopyFrom() override {
+  ~ParseStatementCopy() override {
   }
 
   StatementType getStatementType() const override {
-    return kCopyFrom;
+    return kCopy;
   }
 
-  std::string getName() const override { return "CopyFromStatement"; }
+  std::string getName() const override {
+    return "CopyStatement";
+  }
 
   /**
-   * @brief Get the name of the relation to insert into.
+   * @brief Get the direction (FROM text file/TO text file) of the COPY statement.
    *
-   * @return The name of the relation to insert into.
+   * return The direction of the COPY statement.
+   */
+  const CopyDirection getCopyDirection() const {
+    return direction_;
+  }
+
+  /**
+   * @brief Get the name of the relation.
+   *
+   * @return The name of the relation.
    **/
   const ParseString* relation_name() const {
     return relation_name_.get();
   }
 
   /**
-   * @brief Get the name of the text file to copy from.
+   * @brief Get the set operation query.
    *
-   * @return The name of the text file to copy from.
-   **/
-  const ParseString* source_filename() const {
-    return source_filename_.get();
+   * @return The set operation query.
+   */
+  const ParseSetOperation* set_operation_query() const {
+    return set_operation_query_.get();
   }
 
   /**
-   * @brief Get the additional COPY FROM parameters.
+   * @brief Get the WITH table queries.
    *
-   * @return The string which terminates individual attribute values in the
-   *         input file.
+   * @return The parsed WITH table list.
+   */
+  const PtrVector<ParseSubqueryTableReference>* with_clause() const {
+    return with_clause_.get();
+  }
+
+  /**
+   * @brief Get the name of the text file to import from/export to.
+   *
+   * @return The name of the text file.
    **/
-  const ParseCopyFromParams* params() const {
+  const ParseString* file_name() const {
+    return file_name_.get();
+  }
+
+  /**
+   * @brief Get the additional COPY parameters.
+   *
+   * @return The additional COPY parameters.
+   **/
+  const PtrList<ParseKeyValue>* params() const {
     return params_.get();
   }
 
@@ -898,24 +916,53 @@
       std::vector<const ParseTreeNode*> *non_container_child_fields,
       std::vector<std::string> *container_child_field_names,
       std::vector<std::vector<const ParseTreeNode*>> *container_child_fields) const override {
-    inline_field_names->push_back("relation_name");
-    inline_field_values->push_back(relation_name_->value());
+    inline_field_names->push_back("direction");
+    inline_field_values->push_back(direction_ == kFrom ? "FROM" : "TO");
 
-    inline_field_names->push_back("source_file");
-    inline_field_values->push_back(source_filename_->value());
+    inline_field_names->push_back("file");
+    inline_field_values->push_back(file_name_->value());
+
+    if (relation_name_ != nullptr) {
+      inline_field_names->push_back("relation_name");
+      inline_field_values->push_back(relation_name_->value());
+    }
+
+    if (set_operation_query_ != nullptr) {
+      non_container_child_field_names->push_back("set_operation_query");
+      non_container_child_fields->push_back(set_operation_query_.get());
+    }
+
+    if (with_clause_ != nullptr && !with_clause_->empty()) {
+      container_child_field_names->push_back("with_clause");
+      container_child_fields->emplace_back();
+      for (const ParseSubqueryTableReference &common_subquery : *with_clause_) {
+        container_child_fields->back().push_back(&common_subquery);
+      }
+    }
 
     if (params_ != nullptr) {
-      non_container_child_field_names->push_back("params");
-      non_container_child_fields->push_back(params_.get());
+      container_child_field_names->push_back("params");
+      container_child_fields->emplace_back();
+      for (const ParseKeyValue &param : *params_) {
+        container_child_fields->back().push_back(&param);
+      }
     }
   }
 
  private:
-  std::unique_ptr<ParseString> relation_name_;
-  std::unique_ptr<ParseString> source_filename_;
-  std::unique_ptr<ParseCopyFromParams> params_;
+  const CopyDirection direction_;
 
-  DISALLOW_COPY_AND_ASSIGN(ParseStatementCopyFrom);
+  // NOTE(jianqiao):
+  // (1) Either relation_name_ or set_operation_query_ has non-null value.
+  // (2) set_operation_query_ must be null for COPY FROM statement.
+  std::unique_ptr<ParseString> relation_name_;
+  std::unique_ptr<ParseSetOperation> set_operation_query_;
+
+  std::unique_ptr<PtrVector<ParseSubqueryTableReference>> with_clause_;
+  std::unique_ptr<ParseString> file_name_;
+  std::unique_ptr<PtrList<ParseKeyValue>> params_;
+
+  DISALLOW_COPY_AND_ASSIGN(ParseStatementCopy);
 };
 
 
@@ -1028,6 +1075,7 @@
   DISALLOW_COPY_AND_ASSIGN(ParseStatementUpdate);
 };
 
+
 /**
  * @brief The parsed representation of a DELETE statement.
  **/
@@ -1140,6 +1188,7 @@
   DISALLOW_COPY_AND_ASSIGN(ParseStatementQuit);
 };
 
+
 /**
  * @brief Class to hold the parsed command name and an optional argument string.
  * @details Commands are non-sql statements which can be issued to quickstep.
diff --git a/parser/SqlLexer.lpp b/parser/SqlLexer.lpp
index c6402e0..d818d0b 100644
--- a/parser/SqlLexer.lpp
+++ b/parser/SqlLexer.lpp
@@ -45,13 +45,13 @@
 class ParseBlockProperties;
 class ParseColumnConstraint;
 class ParseCommand;
-struct ParseCopyFromParams;
 class ParseDataType;
 class ParseExpression;
 struct ParseFrameInfo;
 class ParseFunctionCall;
 class ParseGroupBy;
 class ParseHaving;
+class ParseKeyBoolValue;
 class ParseKeyIntegerValue;
 class ParseKeyStringValue;
 class ParseKeyStringList;
@@ -75,7 +75,7 @@
 class ParseSimpleWhenClause;
 class ParseStringKeyLiteralValues;
 class ParseStatement;
-class ParseStatementCopyFrom;
+class ParseStatementCopy;
 class ParseStatementCreateTable;
 class ParseStatementDelete;
 class ParseStatementDropTable;
@@ -200,7 +200,6 @@
   "decimal"          return TOKEN_DECIMAL;
   "default"          return TOKEN_DEFAULT;
   "delete"           return TOKEN_DELETE;
-  "delimiter"        return TOKEN_DELIMITER;
   "desc"             return TOKEN_DESC;
   "descending"       return TOKEN_DESC;
   "distinct"         return TOKEN_DISTINCT;
@@ -208,7 +207,6 @@
   "drop"             return TOKEN_DROP;
   "else"             return TOKEN_ELSE;
   "end"              return TOKEN_END;
-  "escape_strings"   return TOKEN_ESCAPE_STRINGS;
   "exists"           return TOKEN_EXISTS;
   "extract"          return TOKEN_EXTRACT;
   "false"            return TOKEN_FALSE;
@@ -271,11 +269,14 @@
   "set"              return TOKEN_SET;
   "sma"              return TOKEN_SMA;
   "smallint"         return TOKEN_SMALLINT;
+  "stderr"           return TOKEN_STDERR;
+  "stdout"           return TOKEN_STDOUT;
   "substring"        return TOKEN_SUBSTRING;
   "table"            return TOKEN_TABLE;
   "then"             return TOKEN_THEN;
   "time"             return TOKEN_TIME;
   "timestamp"        return TOKEN_TIMESTAMP;
+  "to"               return TOKEN_TO;
   "true"             return TOKEN_TRUE;
   "tuplesample"      return TOKEN_TUPLESAMPLE;
   "unbounded"        return TOKEN_UNBOUNDED;
diff --git a/parser/SqlParser.ypp b/parser/SqlParser.ypp
index 5db2171..8fbcdd7 100644
--- a/parser/SqlParser.ypp
+++ b/parser/SqlParser.ypp
@@ -168,8 +168,7 @@
   quickstep::ParseKeyStringValue *key_string_value_;
   quickstep::ParseKeyStringList *key_string_list_;
   quickstep::ParseKeyIntegerValue *key_integer_value_;
-
-  quickstep::ParseCopyFromParams *copy_from_params_;
+  quickstep::ParseKeyBoolValue *key_bool_value_;
 
   quickstep::ParseAssignment *assignment_;
   quickstep::PtrList<quickstep::ParseAssignment> *assignment_list_;
@@ -182,7 +181,7 @@
   quickstep::ParseStatementUpdate *update_statement_;
   quickstep::ParseStatementInsert *insert_statement_;
   quickstep::ParseStatementDelete *delete_statement_;
-  quickstep::ParseStatementCopyFrom *copy_from_statement_;
+  quickstep::ParseStatementCopy *copy_statement_;
   quickstep::ParseStatementCreateTable *create_table_statement_;
   quickstep::ParsePartitionClause *partition_clause_;
   quickstep::ParseBlockProperties *block_properties_;
@@ -275,14 +274,12 @@
 %token TOKEN_DECIMAL;
 %token TOKEN_DEFAULT;
 %token TOKEN_DELETE;
-%token TOKEN_DELIMITER;
 %token TOKEN_DESC;
 %token TOKEN_DISTINCT;
 %token TOKEN_DOUBLE;
 %token TOKEN_DROP;
 %token TOKEN_ELSE;
 %token TOKEN_END;
-%token TOKEN_ESCAPE_STRINGS;
 %token TOKEN_EXISTS;
 %token TOKEN_EXTRACT;
 %token TOKEN_FALSE;
@@ -342,11 +339,14 @@
 %token TOKEN_SET;
 %token TOKEN_SMA;
 %token TOKEN_SMALLINT;
+%token TOKEN_STDERR;
+%token TOKEN_STDOUT;
 %token TOKEN_SUBSTRING;
 %token TOKEN_TABLE;
 %token TOKEN_THEN;
 %token TOKEN_TIME;
 %token TOKEN_TIMESTAMP;
+%token TOKEN_TO;
 %token TOKEN_TRUE;
 %token TOKEN_TUPLESAMPLE;
 %token TOKEN_UNBOUNDED;
@@ -370,6 +370,7 @@
   datetime_unit
   index_type
   partition_type
+  copy_to_target
 
 %type <boolean_value_>
   boolean_value
@@ -471,6 +472,7 @@
 
 %type <key_value_list_>
   key_value_list
+  opt_copy_params
   opt_index_properties
 
 %type <key_string_value_>
@@ -482,6 +484,9 @@
 %type <key_integer_value_>
   key_integer_value
 
+%type <key_bool_value_>
+  key_bool_value
+
 %type <assignment_>
   assignment_item
 
@@ -511,12 +516,8 @@
 %type <insert_statement_>
   insert_statement
 
-%type <copy_from_statement_>
-  copy_from_statement
-
-%type <copy_from_params_>
-  copy_from_params
-  opt_copy_from_params
+%type <copy_statement_>
+  copy_statement
 
 %type <create_table_statement_>
   create_table_statement
@@ -665,7 +666,7 @@
   alter_table_statement {
     $$ = $1;
   }
-  | copy_from_statement {
+  | copy_statement {
     $$ = $1;
   }
   | create_table_statement {
@@ -1024,17 +1025,23 @@
   }
   | key_integer_value {
     $$ = $1;
+  }
+  | key_bool_value {
+    $$ = $1;
   };
 
 key_string_value:
   any_name any_name {
     $$ = new quickstep::ParseKeyStringValue(@1.first_line, @1.first_column, $1, $2);
   }
+  | any_name TOKEN_STRING_SINGLE_QUOTED {
+    $$ = new quickstep::ParseKeyStringValue(@1.first_line, @1.first_column, $1, $2);
+  }
   | any_name TOKEN_ALL {
     // This is a special case to handle the COMPRESS ALL option of the BLOCK PROPERTIES.
     $$ = new quickstep::ParseKeyStringValue(@1.first_line, @1.first_column, $1,
         new quickstep::ParseString(@2.first_line, @2.first_column, "ALL"));
-  }
+  };
 
 key_string_list:
   any_name '(' name_commalist ')' {
@@ -1052,6 +1059,11 @@
     $$ = new quickstep::ParseKeyIntegerValue(@1.first_line, @1.first_column, $1, $2);
   };
 
+key_bool_value:
+  any_name boolean_value {
+    $$ = new quickstep::ParseKeyBoolValue(@1.first_line, @1.first_column, $1, $2);
+  };
+
 index_type:
   TOKEN_BITWEAVING {
     // Defaults to BitWeavingV, but IndexProperties can change this to H.
@@ -1100,37 +1112,46 @@
   }
   ;
 
-copy_from_statement:
-  TOKEN_COPY any_name TOKEN_FROM TOKEN_STRING_SINGLE_QUOTED opt_copy_from_params {
-    $$ = new quickstep::ParseStatementCopyFrom(@1.first_line, @1.first_column, $2, $4, $5);
+copy_statement:
+  TOKEN_COPY any_name TOKEN_FROM TOKEN_STRING_SINGLE_QUOTED opt_copy_params {
+    $$ = new quickstep::ParseStatementCopy(@1.first_line, @1.first_column,
+                                           quickstep::ParseStatementCopy::kFrom,
+                                           $2, $4, $5);
+  }
+  | TOKEN_COPY any_name copy_to_target opt_copy_params {
+    $$ = new quickstep::ParseStatementCopy(@1.first_line, @1.first_column,
+                                           quickstep::ParseStatementCopy::kTo,
+                                           $2, $3, $4);
+  }
+  | TOKEN_COPY set_operation_union copy_to_target opt_copy_params {
+    $$ = new quickstep::ParseStatementCopy(@1.first_line, @1.first_column,
+                                           $2, nullptr, $3, $4);
+  }
+  | with_clause TOKEN_COPY set_operation_union copy_to_target opt_copy_params {
+    $$ = new quickstep::ParseStatementCopy(@1.first_line, @1.first_column,
+                                           $3, $1, $4, $5);
   };
 
-opt_copy_from_params:
+copy_to_target:
+  TOKEN_TO TOKEN_STRING_SINGLE_QUOTED {
+    $$ = new quickstep::ParseString($2->line_number(), $2->column_number(), "@" + $2->value());
+    delete $2;
+  }
+  | TOKEN_TO TOKEN_STDOUT {
+    $$ = new quickstep::ParseString(@2.first_line, @2.first_column, "$stdout");
+  }
+  | TOKEN_TO TOKEN_STDERR {
+    $$ = new quickstep::ParseString(@2.first_line, @2.first_column, "$stderr");
+  };
+
+opt_copy_params:
   {
     $$ = nullptr;
   }
-  | TOKEN_WITH '(' copy_from_params ')' {
+  | TOKEN_WITH '(' key_value_list ')' {
     $$ = $3;
   };
 
-copy_from_params:
-  TOKEN_DELIMITER TOKEN_STRING_SINGLE_QUOTED {
-    $$ = new quickstep::ParseCopyFromParams(@1.first_line, @1.first_column);
-    $$->set_delimiter($2);
-  }
-  | TOKEN_ESCAPE_STRINGS boolean_value {
-    $$ = new quickstep::ParseCopyFromParams(@1.first_line, @1.first_column);
-    $$->escape_strings = $2;
-  }
-  | copy_from_params ',' TOKEN_DELIMITER TOKEN_STRING_SINGLE_QUOTED {
-    $$ = $1;
-    $$->set_delimiter($4);
-  }
-  | copy_from_params ',' TOKEN_ESCAPE_STRINGS boolean_value {
-    $$ = $1;
-    $$->escape_strings = $4;
-  };
-
 update_statement:
   TOKEN_UPDATE any_name TOKEN_SET assignment_list opt_where_clause {
     $$ = new quickstep::ParseStatementUpdate(@1.first_line, @1.first_column, $2, $4, $5);
diff --git a/parser/preprocessed/SqlLexer_gen.cpp b/parser/preprocessed/SqlLexer_gen.cpp
index bd77ee1..4800cde 100644
--- a/parser/preprocessed/SqlLexer_gen.cpp
+++ b/parser/preprocessed/SqlLexer_gen.cpp
@@ -9,88 +9,244 @@
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 6
-#define YY_FLEX_SUBMINOR_VERSION 3
+#define YY_FLEX_SUBMINOR_VERSION 4
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
 
-    #define yy_create_buffer quickstep_yy_create_buffer
+#ifdef yy_create_buffer
+#define quickstep_yy_create_buffer_ALREADY_DEFINED
+#else
+#define yy_create_buffer quickstep_yy_create_buffer
+#endif
 
-    #define yy_delete_buffer quickstep_yy_delete_buffer
+#ifdef yy_delete_buffer
+#define quickstep_yy_delete_buffer_ALREADY_DEFINED
+#else
+#define yy_delete_buffer quickstep_yy_delete_buffer
+#endif
 
-    #define yy_scan_buffer quickstep_yy_scan_buffer
+#ifdef yy_scan_buffer
+#define quickstep_yy_scan_buffer_ALREADY_DEFINED
+#else
+#define yy_scan_buffer quickstep_yy_scan_buffer
+#endif
 
-    #define yy_scan_string quickstep_yy_scan_string
+#ifdef yy_scan_string
+#define quickstep_yy_scan_string_ALREADY_DEFINED
+#else
+#define yy_scan_string quickstep_yy_scan_string
+#endif
 
-    #define yy_scan_bytes quickstep_yy_scan_bytes
+#ifdef yy_scan_bytes
+#define quickstep_yy_scan_bytes_ALREADY_DEFINED
+#else
+#define yy_scan_bytes quickstep_yy_scan_bytes
+#endif
 
-    #define yy_init_buffer quickstep_yy_init_buffer
+#ifdef yy_init_buffer
+#define quickstep_yy_init_buffer_ALREADY_DEFINED
+#else
+#define yy_init_buffer quickstep_yy_init_buffer
+#endif
 
-    #define yy_flush_buffer quickstep_yy_flush_buffer
+#ifdef yy_flush_buffer
+#define quickstep_yy_flush_buffer_ALREADY_DEFINED
+#else
+#define yy_flush_buffer quickstep_yy_flush_buffer
+#endif
 
-    #define yy_load_buffer_state quickstep_yy_load_buffer_state
+#ifdef yy_load_buffer_state
+#define quickstep_yy_load_buffer_state_ALREADY_DEFINED
+#else
+#define yy_load_buffer_state quickstep_yy_load_buffer_state
+#endif
 
-    #define yy_switch_to_buffer quickstep_yy_switch_to_buffer
+#ifdef yy_switch_to_buffer
+#define quickstep_yy_switch_to_buffer_ALREADY_DEFINED
+#else
+#define yy_switch_to_buffer quickstep_yy_switch_to_buffer
+#endif
 
-    #define yypush_buffer_state quickstep_yypush_buffer_state
+#ifdef yypush_buffer_state
+#define quickstep_yypush_buffer_state_ALREADY_DEFINED
+#else
+#define yypush_buffer_state quickstep_yypush_buffer_state
+#endif
 
-    #define yypop_buffer_state quickstep_yypop_buffer_state
+#ifdef yypop_buffer_state
+#define quickstep_yypop_buffer_state_ALREADY_DEFINED
+#else
+#define yypop_buffer_state quickstep_yypop_buffer_state
+#endif
 
-    #define yyensure_buffer_stack quickstep_yyensure_buffer_stack
+#ifdef yyensure_buffer_stack
+#define quickstep_yyensure_buffer_stack_ALREADY_DEFINED
+#else
+#define yyensure_buffer_stack quickstep_yyensure_buffer_stack
+#endif
 
-    #define yylex quickstep_yylex
+#ifdef yylex
+#define quickstep_yylex_ALREADY_DEFINED
+#else
+#define yylex quickstep_yylex
+#endif
 
-    #define yyrestart quickstep_yyrestart
+#ifdef yyrestart
+#define quickstep_yyrestart_ALREADY_DEFINED
+#else
+#define yyrestart quickstep_yyrestart
+#endif
 
-    #define yylex_init quickstep_yylex_init
+#ifdef yylex_init
+#define quickstep_yylex_init_ALREADY_DEFINED
+#else
+#define yylex_init quickstep_yylex_init
+#endif
 
-    #define yylex_init_extra quickstep_yylex_init_extra
+#ifdef yylex_init_extra
+#define quickstep_yylex_init_extra_ALREADY_DEFINED
+#else
+#define yylex_init_extra quickstep_yylex_init_extra
+#endif
 
-    #define yylex_destroy quickstep_yylex_destroy
+#ifdef yylex_destroy
+#define quickstep_yylex_destroy_ALREADY_DEFINED
+#else
+#define yylex_destroy quickstep_yylex_destroy
+#endif
 
-    #define yyget_debug quickstep_yyget_debug
+#ifdef yyget_debug
+#define quickstep_yyget_debug_ALREADY_DEFINED
+#else
+#define yyget_debug quickstep_yyget_debug
+#endif
 
-    #define yyset_debug quickstep_yyset_debug
+#ifdef yyset_debug
+#define quickstep_yyset_debug_ALREADY_DEFINED
+#else
+#define yyset_debug quickstep_yyset_debug
+#endif
 
-    #define yyget_extra quickstep_yyget_extra
+#ifdef yyget_extra
+#define quickstep_yyget_extra_ALREADY_DEFINED
+#else
+#define yyget_extra quickstep_yyget_extra
+#endif
 
-    #define yyset_extra quickstep_yyset_extra
+#ifdef yyset_extra
+#define quickstep_yyset_extra_ALREADY_DEFINED
+#else
+#define yyset_extra quickstep_yyset_extra
+#endif
 
-    #define yyget_in quickstep_yyget_in
+#ifdef yyget_in
+#define quickstep_yyget_in_ALREADY_DEFINED
+#else
+#define yyget_in quickstep_yyget_in
+#endif
 
-    #define yyset_in quickstep_yyset_in
+#ifdef yyset_in
+#define quickstep_yyset_in_ALREADY_DEFINED
+#else
+#define yyset_in quickstep_yyset_in
+#endif
 
-    #define yyget_out quickstep_yyget_out
+#ifdef yyget_out
+#define quickstep_yyget_out_ALREADY_DEFINED
+#else
+#define yyget_out quickstep_yyget_out
+#endif
 
-    #define yyset_out quickstep_yyset_out
+#ifdef yyset_out
+#define quickstep_yyset_out_ALREADY_DEFINED
+#else
+#define yyset_out quickstep_yyset_out
+#endif
 
-    #define yyget_leng quickstep_yyget_leng
+#ifdef yyget_leng
+#define quickstep_yyget_leng_ALREADY_DEFINED
+#else
+#define yyget_leng quickstep_yyget_leng
+#endif
 
-    #define yyget_text quickstep_yyget_text
+#ifdef yyget_text
+#define quickstep_yyget_text_ALREADY_DEFINED
+#else
+#define yyget_text quickstep_yyget_text
+#endif
 
-    #define yyget_lineno quickstep_yyget_lineno
+#ifdef yyget_lineno
+#define quickstep_yyget_lineno_ALREADY_DEFINED
+#else
+#define yyget_lineno quickstep_yyget_lineno
+#endif
 
-    #define yyset_lineno quickstep_yyset_lineno
+#ifdef yyset_lineno
+#define quickstep_yyset_lineno_ALREADY_DEFINED
+#else
+#define yyset_lineno quickstep_yyset_lineno
+#endif
 
-        #define yyget_column quickstep_yyget_column
+#ifdef yyget_column
+#define quickstep_yyget_column_ALREADY_DEFINED
+#else
+#define yyget_column quickstep_yyget_column
+#endif
 
-        #define yyset_column quickstep_yyset_column
+#ifdef yyset_column
+#define quickstep_yyset_column_ALREADY_DEFINED
+#else
+#define yyset_column quickstep_yyset_column
+#endif
 
-    #define yywrap quickstep_yywrap
+#ifdef yywrap
+#define quickstep_yywrap_ALREADY_DEFINED
+#else
+#define yywrap quickstep_yywrap
+#endif
 
-    #define yyget_lval quickstep_yyget_lval
+#ifdef yyget_lval
+#define quickstep_yyget_lval_ALREADY_DEFINED
+#else
+#define yyget_lval quickstep_yyget_lval
+#endif
 
-    #define yyset_lval quickstep_yyset_lval
+#ifdef yyset_lval
+#define quickstep_yyset_lval_ALREADY_DEFINED
+#else
+#define yyset_lval quickstep_yyset_lval
+#endif
 
-    #define yyget_lloc quickstep_yyget_lloc
+#ifdef yyget_lloc
+#define quickstep_yyget_lloc_ALREADY_DEFINED
+#else
+#define yyget_lloc quickstep_yyget_lloc
+#endif
 
-    #define yyset_lloc quickstep_yyset_lloc
+#ifdef yyset_lloc
+#define quickstep_yyset_lloc_ALREADY_DEFINED
+#else
+#define yyset_lloc quickstep_yyset_lloc
+#endif
 
-    #define yyalloc quickstep_yyalloc
+#ifdef yyalloc
+#define quickstep_yyalloc_ALREADY_DEFINED
+#else
+#define yyalloc quickstep_yyalloc
+#endif
 
-    #define yyrealloc quickstep_yyrealloc
+#ifdef yyrealloc
+#define quickstep_yyrealloc_ALREADY_DEFINED
+#else
+#define yyrealloc quickstep_yyrealloc
+#endif
 
-    #define yyfree quickstep_yyfree
+#ifdef yyfree
+#define quickstep_yyfree_ALREADY_DEFINED
+#else
+#define yyfree quickstep_yyfree
+#endif
 
 /* First, we deal with  platform-specific or compiler-specific issues. */
 
@@ -162,10 +318,16 @@
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#ifndef SIZE_MAX
+#define SIZE_MAX               (~(size_t)0)
+#endif
+
 #endif /* ! C99 */
 
 #endif /* ! FLEXINT_H */
 
+/* begin standard C++ headers. */
+
 /* TODO: this is always defined, so inline it */
 #define yyconst const
 
@@ -214,7 +376,7 @@
 /* Action number for EOF rule of a given start state. */
 #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
 /* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE quickstep_yyrestart(yyin ,yyscanner )
+#define YY_NEW_FILE yyrestart( yyin , yyscanner )
 #define YY_END_OF_BUFFER_CHAR 0
 
 /* Size of default input buffer. */
@@ -250,7 +412,7 @@
     
     /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
      *       access to the local variable yy_act. Since yyless() is a macro, it would break
-     *       existing scanners that call yyless() from OUTSIDE quickstep_yylex.
+     *       existing scanners that call yyless() from OUTSIDE yylex.
      *       One obvious solution it to make yy_act a global. I tried that, and saw
      *       a 5% performance hit in a non-yylineno scanner, because yy_act is
      *       normally declared as a register variable-- so it is not worth it.
@@ -342,7 +504,7 @@
 	 * possible backing-up.
 	 *
 	 * When we actually see the EOF, we change the status to "new"
-	 * (via quickstep_yyrestart()), so that the user can continue scanning by
+	 * (via yyrestart()), so that the user can continue scanning by
 	 * just pointing yyin at a new input file.
 	 */
 #define YY_BUFFER_EOF_PENDING 2
@@ -364,43 +526,43 @@
  */
 #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
 
-void quickstep_yyrestart ( FILE *input_file , yyscan_t yyscanner );
-void quickstep_yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
-YY_BUFFER_STATE quickstep_yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
-void quickstep_yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
-void quickstep_yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
-void quickstep_yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
-void quickstep_yypop_buffer_state ( yyscan_t yyscanner );
+void yyrestart ( FILE *input_file , yyscan_t yyscanner );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
+void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+void yypop_buffer_state ( yyscan_t yyscanner );
 
-static void quickstep_yyensure_buffer_stack ( yyscan_t yyscanner );
-static void quickstep_yy_load_buffer_state ( yyscan_t yyscanner );
-static void quickstep_yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner );
-#define YY_FLUSH_BUFFER quickstep_yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)
+static void yyensure_buffer_stack ( yyscan_t yyscanner );
+static void yy_load_buffer_state ( yyscan_t yyscanner );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner)
 
-YY_BUFFER_STATE quickstep_yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
-YY_BUFFER_STATE quickstep_yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
-YY_BUFFER_STATE quickstep_yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );
 
-void *quickstep_yyalloc ( yy_size_t , yyscan_t yyscanner );
-void *quickstep_yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );
-void quickstep_yyfree ( void * , yyscan_t yyscanner );
+void *yyalloc ( yy_size_t , yyscan_t yyscanner );
+void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );
+void yyfree ( void * , yyscan_t yyscanner );
 
-#define yy_new_buffer quickstep_yy_create_buffer
+#define yy_new_buffer yy_create_buffer
 #define yy_set_interactive(is_interactive) \
 	{ \
 	if ( ! YY_CURRENT_BUFFER ){ \
-        quickstep_yyensure_buffer_stack (yyscanner); \
+        yyensure_buffer_stack (yyscanner); \
 		YY_CURRENT_BUFFER_LVALUE =    \
-            quickstep_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
+            yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
 	} \
 	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
 	}
 #define yy_set_bol(at_bol) \
 	{ \
 	if ( ! YY_CURRENT_BUFFER ){\
-        quickstep_yyensure_buffer_stack (yyscanner); \
+        yyensure_buffer_stack (yyscanner); \
 		YY_CURRENT_BUFFER_LVALUE =    \
-            quickstep_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
+            yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \
 	} \
 	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
 	}
@@ -430,8 +592,8 @@
 	yyg->yy_hold_char = *yy_cp; \
 	*yy_cp = '\0'; \
 	yyg->yy_c_buf_p = yy_cp;
-#define YY_NUM_RULES 163
-#define YY_END_OF_BUFFER 164
+#define YY_NUM_RULES 164
+#define YY_END_OF_BUFFER 165
 /* This struct is not used in this scanner,
    but its presence is necessary. */
 struct yy_trans_info
@@ -439,74 +601,72 @@
 	flex_int32_t yy_verify;
 	flex_int32_t yy_nxt;
 	};
-static const flex_int16_t yy_accept[599] =
+static const flex_int16_t yy_accept[589] =
     {   0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,  164,    2,    2,  162,  162,  161,  160,  162,
-      139,  135,  138,  135,  135,  158,  131,  128,  132,  157,
-      157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
-      157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
-      157,  157,  157,  157,  136,    4,    5,    5,    3,  154,
-      154,  151,  155,  155,  149,  156,  156,  153,    1,  161,
-      129,  159,  158,  158,  158,    0,  133,  130,  134,  157,
-      157,  157,  157,   10,  157,  157,  157,   22,  157,  157,
-      157,  157,  157,  157,  157,  157,  157,  157,  157,  137,
+        0,    0,  165,    2,    2,  163,  163,  162,  161,  163,
+      140,  136,  139,  136,  136,  159,  132,  129,  133,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  137,    4,    5,    5,    3,  155,
+      155,  152,  156,  156,  150,  157,  157,  154,    1,  162,
+      130,  160,  159,  159,  159,    0,  134,  131,  135,  158,
+      158,  158,  158,   10,  158,  158,  158,   22,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  138,
 
-      157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
-      157,  157,  157,   60,   69,  157,  157,  157,  157,  157,
-      157,  157,  157,  157,  157,  157,   83,   84,  157,  157,
-      157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
-      157,  157,  157,  157,  157,  157,  157,  157,  157,  157,
-      157,  157,  157,    4,    5,    3,  154,  150,  155,  148,
-      148,  140,  142,  143,  144,  145,  146,  147,  148,  156,
-      152,  159,  158,    0,  158,    6,    7,  157,    9,   11,
-      157,  157,   15,  157,  157,  157,  157,  157,  157,  157,
-      157,  157,  157,  157,   33,  157,  157,  157,  157,  157,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,   58,   67,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,   81,   82,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  113,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,    4,    5,    3,  155,  151,  156,
+      149,  149,  141,  143,  144,  145,  146,  147,  148,  149,
+      157,  153,  160,  159,    0,  159,    6,    7,  158,    9,
+       11,  158,  158,   15,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,   33,  158,  158,  158,  158,
 
-      157,  157,  157,   44,  157,  157,  157,  157,  157,  157,
-      157,   52,  157,  157,  157,  157,  157,  157,  157,  157,
-      157,   64,  157,   71,  157,  157,  157,  157,  157,  157,
-      157,   79,  157,   82,  157,  157,  157,  157,  157,  157,
-      157,  157,  157,  157,  157,  157,  157,  100,  157,  157,
-      105,  106,  157,  157,  157,  157,  157,  157,  157,  157,
-      157,  157,  157,  157,  157,  157,  157,  157,  140,  142,
-      141,  157,  157,  157,  157,  157,  157,  157,   20,   23,
-      157,  157,  157,   28,  157,  157,  157,   31,  157,  157,
-      157,  157,   38,  157,  157,   42,   43,  157,  157,  157,
+      158,  158,  158,  158,   43,  158,  158,  158,  158,  158,
+      158,   50,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,   62,  158,   69,  158,  158,  158,  158,  158,  158,
+      158,   77,  158,   80,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,   98,  158,  158,
+      103,  104,  158,  158,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,  158,  141,
+      143,  142,  158,  158,  158,  158,  158,  158,  158,   20,
+       23,  158,  158,  158,   28,  158,  158,  158,   31,  158,
+      158,  158,   37,  158,  158,   41,   42,  158,  158,  158,
 
-      157,  157,  157,  157,  157,   54,   55,  157,   57,  157,
-       59,  157,  157,  157,  157,   68,   70,   72,   73,   74,
-      157,   76,  157,  157,   80,  157,  157,   87,  157,  157,
-      157,  157,  157,   94,  157,   96,  157,  157,  157,  102,
-      157,  157,  157,  157,  157,  157,  110,  111,  113,  157,
-      157,  157,  157,  157,  157,  157,  157,  122,  157,  157,
-      125,  126,  140,  141,    8,  157,  157,  157,  157,  157,
-      157,  157,   25,  157,  157,  157,  157,  157,  157,  157,
-      157,  157,  157,  157,  157,  157,  157,  157,  157,   48,
-       49,   50,  157,  157,   56,  157,   61,   62,  157,  157,
+      158,  158,  158,  158,   52,   53,  158,   55,  158,   57,
+      158,  158,  158,  158,   66,   68,   70,   71,   72,  158,
+       74,  158,  158,   78,  158,  158,   85,  158,  158,  158,
+      158,  158,   92,  158,   94,  158,  158,  158,  100,  158,
+      158,  158,  158,  158,  158,  158,  158,  110,  111,  114,
+      158,  158,  158,  158,  158,  158,  158,  158,  123,  158,
+      158,  126,  127,  141,  142,    8,  158,  158,  158,  158,
+      158,  158,  158,   25,  158,  158,  158,  158,  158,  158,
+      158,  158,  158,  158,  158,  158,  158,  158,   46,   47,
+       48,  158,  158,   54,  158,   59,   60,  158,  158,  158,
 
-      157,   75,  157,   78,   81,   85,   86,  157,  157,  157,
-      157,  157,   95,  157,  157,   99,  157,  157,  157,  157,
-      157,  109,  157,  157,  157,  116,  157,  157,  119,  157,
-      157,  123,  157,  157,  157,  157,   14,  157,  157,  157,
-      157,  157,   26,  157,   29,  157,  157,  157,  157,  157,
-       36,  157,  157,  157,   41,  157,   46,  157,  157,  157,
-       58,   63,  157,  157,  157,   77,  157,  157,  157,  157,
-      157,  157,   98,  157,  103,  104,  157,  157,  157,  157,
-      157,  117,  118,  120,  157,  124,  157,  157,   13,  157,
-      157,  157,  157,  157,  157,   21,   30,  157,   34,   35,
+       73,  158,   76,   79,   83,   84,  158,  158,  158,  158,
+      158,   93,  158,  158,   97,  158,  158,  158,  158,  158,
+      158,  158,  109,  158,  158,  158,  117,  158,  158,  120,
+      158,  158,  124,  158,  158,  158,  158,   14,  158,  158,
+      158,  158,  158,   26,  158,   29,  158,  158,  158,  158,
+      158,   36,  158,  158,   40,   44,  158,  158,  158,   56,
+       61,  158,  158,  158,   75,  158,  158,  158,  158,  158,
+      158,   96,  158,  101,  102,  158,  106,  107,  158,  158,
+      158,  158,  118,  119,  121,  158,  125,  158,  158,   13,
+      158,  158,  158,  158,  158,  158,   21,   30,  158,   34,
 
-      157,  157,  157,  157,   47,  157,   53,   65,  157,  157,
-      157,   90,  157,   92,  157,  157,  157,  157,  157,  157,
-      157,  157,  121,  157,  157,  157,  157,  157,  157,  157,
-      157,   32,  157,  157,   40,  157,  157,  157,   67,  157,
-      157,   93,  157,  157,  107,  157,  157,  157,  157,  157,
-       12,  157,  157,  157,  157,   24,  157,   37,  157,  157,
-       51,   66,   88,   91,  157,  157,  108,  112,  157,  115,
-      127,   16,  157,  157,  157,   27,   39,  157,   89,   97,
-      157,  157,  157,   18,   19,  157,  157,  114,  157,  157,
-      157,  157,  157,  101,  157,   45,   17,    0
-
+       35,  158,  158,   45,  158,   51,   63,  158,  158,  158,
+       88,  158,   90,  158,  158,  158,  158,  158,  158,  158,
+      158,  122,  158,  158,  158,  158,  158,  158,  158,  158,
+       32,  158,   39,  158,  158,   65,  158,  158,   91,  158,
+      158,  105,  158,  158,  158,  158,  158,   12,  158,  158,
+      158,  158,   24,  158,  158,   49,   64,   86,   89,  158,
+      158,  108,  112,  158,  116,  128,   16,  158,  158,  158,
+       27,   38,   87,   95,  158,  158,  158,   18,   19,  158,
+      115,  158,  158,  158,   99,  158,   17,    0
     } ;
 
 static const YY_CHAR yy_ec[256] =
@@ -553,157 +713,155 @@
         8
     } ;
 
-static const flex_int16_t yy_base[614] =
+static const flex_int16_t yy_base[604] =
     {   0,
         0,    1,   46,    0,  117,  162,    2,    3,  127,  128,
-        6,   10,  159, 1324, 1324,    0, 1324,   13, 1324,  138,
-     1324, 1324, 1324,  142,    6,  129,    4, 1324,  134,  124,
+        6,   10,  147, 1316, 1316,    0, 1316,   13, 1316,  130,
+     1316, 1316, 1316,  129,    6,  129,    4, 1316,   28,  124,
       159,  213,  165,  167,  263,   92,  158,  163,   96,  107,
-      218,  160,  186,  223,  221,  155,  281,  264,  279,  275,
-      186,  209,    0,  191, 1324,  147,    4,   19,    0,    0,
-        0,  140,    0,    0,  343,    0,    0,  141,    0,   22,
-     1324,    0,  307,  326,  338,   18, 1324, 1324, 1324,    0,
-      220,  315,  234,  239,  234,  288,  261,    0,  280,  335,
-      330,  342,  346,  332,  333,  382,  332,  331,  339, 1324,
+      214,  160,  186,  219,  221,  155,  281,  274,  325,  257,
+      186,  209,    0,  219, 1316,   27,    4,   19,    0,    0,
+        0,   17,    0,    0,  389,    0,    0,    8,    0,   22,
+     1316,    0,  293,  325,  343,   18, 1316, 1316, 1316,    0,
+      223,  265,  234,  242,  260,  292,  288,    0,  299,  330,
+      337,  324,  334,  324,  325,  380,  325,  331,  346, 1316,
 
-      336,  358,  363,  380,  356,  352,  378,  386,  387,  391,
-      390,  387,  386,  406,    0,  399,  386,  393,  407,  408,
-      401,  402,  410,  408,  431,  440,    0,  443,  431,  447,
-      438,  440,  454,  451,  447,  461,  457,  442,  466,  465,
-      468,  469,  468,  461,  456,  463,  502,  479,  475,  498,
-      496,  500,  504,  144,   29,    0,    0, 1324,    0, 1324,
-     1324,   22,   24, 1324, 1324, 1324, 1324, 1324,    0,    0,
-     1324,    0,  522,   26,   28,    0,    0,  504,    0,  514,
-      498,  513,  500,  521,  520,  508,  525,  508,  512,  507,
-      534,  517,  523,  537,    0,  535,  545,  554,  544,  542,
+      348,  364,  378,  376,  371,  378,  382,  386,  390,  389,
+      386,  385,  435,    0,  402,  389,  400,  435,  433,  431,
+      433,  436,  431,  440,  447,    0,  452,  437,  453,  441,
+      442,  456,  453,  449,  465,  457,  444,  494,  468,  495,
+      500,  501,  499,  492,    0,  486,  492,  507,  506,  502,
+      500,  508,  501,  516,    0,   29,    0,    0, 1316,    0,
+     1316, 1316,   22,   24, 1316, 1316, 1316, 1316, 1316,    0,
+        0, 1316,    0,  524,   26,   28,    0,    0,  517,    0,
+      518,  501,  516,  504,  545,  525,  531,  552,  536,  542,
+      537,  562,  544,  547,  561,    0,  558,  567,  564,  567,
 
-      565,  552,  564,    0,  571,  555,  559,  559,  560,  579,
-      569,  577,  570,  572,  564,  578,  578,  571,  585,  588,
-      589,  590,  585,    0,  580,  582,  599,  608,  613,  600,
-      605,    0,  614,    0,  622,  625,  614,  615,  633,  634,
-      625,  619,  634,  630,  638,  639,  637,  628,  633,  646,
-        0,  640,  634,  646,  646,  657,  658,  663,  663,  668,
-      678,  670,  665,  685,  676,  689,  687,  678,   30,  125,
-        0,  679,  684,  694,  686,  696,  691,  690,    0,  704,
-      695,  696,  690,    0,  691,  698,  713,  700,  708,  712,
-      716,  724,  736,  733,  731,    0,    0,  728,  726,  747,
+      551,  570,  557,  569,    0,  556,  558,  560,  561,  580,
+      570,  578,  572,  575,  567,  598,  598,  595,  610,  613,
+      614,  615,  607,    0,  602,  603,  619,  616,  619,  606,
+      608,    0,  617,    0,  626,  627,  615,  614,  634,  635,
+      626,  620,  636,  633,  641,  659,  657,  652,  658,  671,
+        0,  665,  673,  660,  668,  668,  678,  679,  673,  671,
+      672,  689,  677,  671,  692,  683,  692,  690,  681,   30,
+      125,    0,  685,  690,  705,  708,  718,  718,  718,    0,
+      733,  724,  723,  717,    0,  718,  722,  736,  722,  730,
+      723,  725,  741,  738,  736,    0,    0,  729,  749,  748,
 
-      746,  732,  733,  739,  746,    0,    0,  740,    0,  743,
-        0,  734,  741,  742,  756,    0,    0,    0,    0,    0,
-      741,    0,  744,  759,  749,  751,  758,    0,  769,  774,
-      786,  793,  777,    0,  794,    0,  782,  777,  782,    0,
-      800,  792,  806,  798,  791,  807,    0,  794,    0,  809,
-      794,  802,  796,  798,  812,  816,  814,    0,  820,  811,
-        0,  814,  131, 1324,    0,  828,  829,  816,  836,  833,
-      847,  854,    0,  844,  841,  855,  857,  850,  858,  867,
-      857,  865,  862,  858,  859,  869,  870,  857,  874,    0,
-        0,    0,  856,  873,    0,  876,    0,    0,  864,  880,
+      734,  735,  741,  748,    0,    0,  743,    0,  747,    0,
+      738,  750,  762,  774,    0,    0,    0,    0,    0,  767,
+        0,  769,  785,  775,  777,  778,    0,  789,  794,  795,
+      800,  784,    0,  798,    0,  786,  781,  786,    0,  803,
+      794,  808,  800,  795,  793,  795,  812,    0,  800,    0,
+      815,  805,  824,  818,  825,  840,  845,  843,    0,  847,
+      838,    0,  841,  131, 1316,    0,  852,  852,  838,  858,
+      844,  855,  859,    0,  850,  847,  861,  864,  856,  862,
+      871,  861,  870,  863,  864,  879,  877,  894,    0,    0,
+        0,  880,  898,    0,  901,    0,    0,  889,  905,  892,
 
-      873,    0,  885,    0,    0,    0,    0,  874,  893,  906,
-      893,  906,    0,  911,  901,    0,  913,  916,  902,  916,
-      908,    0,  907,  909,  915,    0,  925,  926,    0,  913,
-      932,    0,  911,  920,  928,  924,    0,  919,  924,  942,
-      939,  930,    0,  951,    0,  948,  945,  955,  957,  953,
-        0,  954,  971,  973,    0,   93,    0,  958,  971,  969,
-        0,    0,  966,  980,  985,    0,  978,  968,  980,  965,
-      971,  978,    0,  981,    0,    0,  981,  987,  998,  999,
-      997,    0,    0,    0,  988,    0,  994,  996,    0, 1002,
-     1008, 1013, 1015, 1026, 1023,    0,    0, 1028,    0,    0,
+        0,  907,    0,    0,    0,    0,  895,  902,  913,  900,
+      910,    0,  915,  905,    0,  917,  919,  904,  918,  910,
+      909,  912,    0,  911,  914,  921,    0,  931,  937,    0,
+      935,  954,    0,  938,  948,  957,  953,    0,  946,  951,
+      969,  963,  953,    0,  973,    0,  970,  956,  964,  966,
+      959,    0,  976,  978,    0,    0,  962,  976,  972,    0,
+        0,  969,  983,  988,    0,  982,  973,  985,  975,  992,
+      999,    0, 1007,    0,    0, 1007,    0,    0, 1015, 1024,
+     1025, 1023,    0,    0,    0, 1010,    0, 1016, 1017,    0,
+     1023, 1018, 1021, 1023, 1031, 1028,    0,    0, 1033,    0,
 
-     1029, 1027, 1018, 1022,    0, 1028,    0,    0, 1040, 1032,
-     1030,    0, 1032,    0, 1022, 1045, 1040, 1030, 1037, 1040,
-     1041, 1052,    0, 1038, 1052, 1050, 1050, 1052, 1049, 1063,
-     1070,    0, 1067, 1075,    0, 1070, 1084, 1072,    0, 1080,
-     1089,    0, 1094, 1087,    0, 1094, 1086, 1087, 1100, 1097,
-        0, 1099, 1102, 1096, 1104,    0, 1091,    0, 1105, 1097,
-        0,    0, 1097,    0, 1098, 1113,    0,    0, 1112,    0,
-        0,    0, 1108, 1122, 1121,    0,    0, 1133,    0,    0,
-     1123, 1142, 1128,    0,    0, 1135, 1145,    0, 1143, 1147,
-     1139, 1153, 1140,    0, 1141,    0,    0, 1324, 1206, 1216,
+        0, 1030, 1020,    0, 1029,    0,    0, 1041, 1033, 1031,
+        0, 1033,    0, 1024, 1048, 1043, 1038, 1056, 1058, 1064,
+     1074,    0, 1062, 1076, 1070, 1069, 1070, 1068, 1071, 1076,
+        0, 1077,    0, 1085, 1073,    0, 1080, 1088,    0, 1091,
+     1084,    0, 1091, 1085, 1086, 1099, 1096,    0, 1098, 1102,
+     1097, 1105,    0, 1096, 1121,    0,    0, 1110,    0, 1116,
+     1128,    0,    0, 1128,    0,    0,    0, 1123, 1137, 1125,
+        0,    0,    0,    0, 1124, 1141, 1127,    0,    0, 1143,
+        0, 1140, 1132, 1146,    0, 1133,    0, 1316, 1198, 1208,
+     1218, 1228, 1238, 1242, 1245, 1251, 1261, 1271, 1281, 1291,
 
-     1226, 1236, 1246, 1250, 1253, 1259, 1269, 1279, 1289, 1299,
-     1309, 1314, 1316
+     1301, 1306, 1308
     } ;
 
-static const flex_int16_t yy_def[614] =
+static const flex_int16_t yy_def[604] =
     {   0,
-      599,  599,  598,    3,  600,  600,  601,  601,  602,  602,
-      603,  603,  598,  598,  598,  604,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  598,  598,  598,  598,  606,  607,
-      607,  598,  608,  608,  609,  610,  610,  598,  604,  598,
-      598,  611,  598,  598,  598,  598,  598,  598,  598,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  598,
+      589,  589,  588,    3,  590,  590,  591,  591,  592,  592,
+      593,  593,  588,  588,  588,  594,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  588,  588,  588,  588,  596,  597,
+      597,  588,  598,  598,  599,  600,  600,  588,  594,  588,
+      588,  601,  588,  588,  588,  588,  588,  588,  588,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  588,
 
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  598,  598,  606,  607,  598,  608,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  612,  610,
-      598,  611,  598,  598,  598,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  588,  588,  596,  597,  588,  598,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  602,
+      600,  588,  601,  588,  588,  588,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
 
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  598,  598,
-      613,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  588,
+      588,  603,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
 
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  598,  598,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  588,  588,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
 
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
 
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,  605,  605,  605,
-      605,  605,  605,  605,  605,  605,  605,    0,  598,  598,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,  595,  595,  595,
+      595,  595,  595,  595,  595,  595,  595,    0,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
 
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598
+      588,  588,  588
     } ;
 
-static const flex_int16_t yy_nxt[1396] =
+static const flex_int16_t yy_nxt[1388] =
     {   0,
-      598,  598,   15,   15,   61,   61,  155,  155,   67,   62,
-       62,   68,   67,  598,   70,   68,   70,   73,   73,   77,
-       78,  155,  155,   70,  598,   70,  174,  174,  598,  175,
-      175,  155,  155,  269,  270,  270,  270,  175,  175,  175,
-      175,  363,  270,  598,   16,   16,   17,   18,   19,   18,
+      588,  155,   15,   15,   61,   61,  156,  156,   67,   62,
+       62,   68,   67,  172,   70,   68,   70,   73,   73,   77,
+       78,  156,  156,   70,  159,   70,  175,  175,  155,  176,
+      176,  156,  156,  270,  271,  271,  271,  176,  176,  176,
+      176,  364,  271,   79,   16,   16,   17,   18,   19,   18,
        20,   21,   22,   23,   22,   24,   25,   26,   26,   17,
        27,   28,   29,   30,   31,   32,   33,   34,   35,   36,
        37,   38,   39,   40,   41,   42,   43,   44,   45,   46,
@@ -712,156 +870,154 @@
 
        38,   39,   40,   41,   42,   43,   44,   45,   46,   47,
        48,   49,   50,   51,   52,   53,   54,   17,   56,   57,
-       58,   17,   17,   17,   17,   17,  111,  116,  117,   64,
-       64,   17,   17,   17,   62,   62,  270,  270,  504,   74,
-       75,   75,  270,  270,   81,  154,  171,  158,  154,   79,
-       76,   72,   82,   71,   83,  111,  116,  117,  598,   84,
+       58,   17,   17,   17,   17,   17,  110,  115,  116,   64,
+       64,   17,   17,   17,   62,   62,  271,  271,   72,   74,
+       75,   75,  271,  271,   81,   71,  588,  588,  588,  588,
+       76,  588,   82,  588,   83,  110,  115,  116,  588,   84,
        17,   17,   17,   56,   57,   58,   17,   17,   17,   17,
-       17,   65,   65,   81,  100,  112,   17,   17,   17,   76,
-       85,   82,   95,   83,   86,  122,   96,   87,   84,  113,
-       97,  123,  134,  114,  598,  101,   98,  102,  115,   99,
+       17,   65,   65,   81,  100,  111,   17,   17,   17,   76,
+       85,   82,   95,   83,   86,  121,   96,   87,   84,  112,
+       97,  122,  133,  113,  588,  101,   98,  102,  114,   99,
 
-       88,  598,  103,  150,  112,   17,   17,  104,  598,   85,
-      598,   95,  153,   86,  122,   96,   87,  124,  113,   97,
-      123,  134,  114,  125,  101,   98,  102,  115,   99,   88,
-       89,  103,  150,  151,  152,  118,  104,   90,  131,  119,
-      176,  153,  132,  120,   91,  126,  124,   92,   93,  121,
-       94,  598,  125,  127,  179,  133,  598,  128,  180,   89,
-      129,  130,  151,  152,  118,  598,   90,  131,  119,  176,
-      181,  132,  120,   91,  126,  598,   92,   93,  121,   94,
-      105,  598,  127,  179,  133,  139,  128,  180,  106,  129,
-      130,  107,  184,  140,  108,  598,  142,  109,  135,  181,
+       88,  588,  588,  151,  111,   17,   17,  103,  588,   85,
+      588,   95,  588,   86,  121,   96,   87,  123,  112,   97,
+      122,  133,  113,  124,  101,   98,  102,  114,   99,   88,
+       89,  117,  151,  152,  153,  118,  103,   90,  130,  119,
+      154,  125,  131,  177,   91,  120,  123,   92,   93,  126,
+       94,  588,  124,  127,  180,  132,  128,  129,  588,   89,
+      117,  181,  152,  153,  118,  588,   90,  130,  119,  154,
+      125,  131,  177,   91,  120,  588,   92,   93,  126,   94,
+      104,  588,  127,  180,  132,  128,  129,  148,  105,  149,
+      181,  106,  150,  178,  107,  138,  182,  108,  134,  588,
 
-      110,  141,  136,  143,  144,  147,  137,  148,  598,  105,
-      149,  182,  138,  145,  139,  185,  146,  106,   73,   73,
-      107,  184,  140,  108,  183,  142,  109,  135,   76,  110,
-      141,  136,  143,  144,  147,  137,  148,  173,  173,  149,
-      182,  138,  145,  177,  185,  146,  161,   76,   74,   75,
-       75,  178,  186,  183,  162,  163,  187,   76,  188,   76,
-      189,  164,  190,  191,  192,  165,  193,  200,  201,  194,
-      202,  203,  177,  166,  195,  598,   76,  167,  204,  168,
-      178,  186,  205,  169,  208,  187,  209,  188,   76,  189,
-      164,  190,  191,  192,  165,  193,  200,  201,  194,  202,
+      109,  179,  135,  139,   73,   73,  136,  588,  588,  104,
+      140,  141,  137,  588,   76,  183,  148,  105,  149,  185,
+      106,  150,  178,  107,  138,  182,  108,  134,  184,  109,
+      179,  135,  139,  588,  186,  136,  174,  174,  588,  140,
+      141,  137,  142,   76,  183,  192,   76,  187,  185,  143,
+      144,  188,  193,   74,   75,   75,  145,  184,  194,  146,
+      201,  195,  147,  186,   76,  189,  196,  190,  202,  191,
+      588,  142,  588,  588,  192,   76,  187,  203,  143,  144,
+      188,  193,  588,  204,  205,  145,  588,  194,  146,  201,
+      195,  147,  162,   76,  189,  196,  190,  202,  191,  197,
 
-      203,  196,  166,  195,  197,  206,  167,  204,  168,  210,
-      198,  205,  169,  208,  211,  209,  207,  199,  213,  214,
-      212,  215,  216,  218,  223,  217,  219,  224,  225,  226,
-      196,  229,  230,  197,  206,  227,  220,  228,  210,  198,
-      231,  221,  222,  211,  232,  207,  199,  213,  214,  212,
-      215,  216,  218,  223,  217,  219,  224,  225,  226,  233,
-      229,  230,  234,  235,  227,  220,  228,  236,  237,  231,
-      221,  222,  238,  232,  239,  240,  242,  243,  244,  241,
-      247,  248,  252,  245,  246,  249,  253,  254,  233,  255,
-      256,  234,  235,  257,  250,  258,  236,  237,  598,  261,
+      163,  164,  198,  206,  208,  209,  203,  165,  199,  210,
+      211,  166,  204,  205,  207,  200,  212,  213,  214,  167,
+      215,  216,  218,  168,  217,  169,  588,  223,  197,  170,
+      224,  198,  206,  208,  209,  225,  165,  199,  210,  211,
+      166,  588,  588,  207,  200,  212,  213,  214,  167,  215,
+      216,  218,  168,  217,  169,  219,  223,  226,  170,  224,
+      227,  229,  228,  230,  225,  220,  231,  232,  233,  234,
+      221,  222,  235,  236,  237,  238,  239,  240,  242,  243,
+      247,  241,  244,  248,  219,  252,  226,  245,  246,  227,
+      229,  228,  230,  588,  220,  231,  232,  233,  234,  221,
 
-      262,  238,  251,  239,  240,  242,  243,  244,  241,  247,
-      248,  252,  245,  246,  249,  253,  254,  265,  255,  256,
-      259,  268,  257,  250,  258,  272,  263,  260,  261,  262,
-      266,  251,  264,  173,  173,  273,  267,  274,  275,  276,
-      277,  279,  280,   76,  281,  282,  265,  283,  284,  259,
-      268,  285,  278,  286,  272,  263,  260,  287,  288,  266,
-      289,  264,  290,  293,  273,  267,  274,  275,  276,  277,
-      279,  280,   76,  281,  282,  291,  283,  284,  294,  292,
-      285,  278,  286,  295,  296,  297,  287,  288,  298,  289,
-      299,  290,  293,  300,  301,  302,  303,  304,  305,  306,
+      222,  235,  236,  237,  238,  239,  240,  242,  243,  247,
+      241,  244,  248,  249,  252,  253,  245,  246,  254,  255,
+      256,  257,  250,  258,  259,  260,  262,  263,  264,  266,
+      251,  267,  261,  269,  265,  174,  174,  268,  273,  274,
+      275,  276,  249,  277,  253,   76,  280,  254,  255,  256,
+      257,  250,  258,  259,  260,  262,  263,  264,  266,  251,
+      267,  261,  269,  265,  278,  281,  268,  273,  274,  275,
+      276,  282,  277,  283,   76,  280,  279,  284,  285,  286,
+      287,  288,  289,  290,  291,  292,  293,  294,  295,  296,
+      297,  298,  299,  278,  281,  300,  301,  302,  303,  304,
 
-      307,  308,  309,  310,  291,  311,  312,  294,  292,  313,
-      314,  315,  295,  296,  297,  317,  318,  298,  319,  299,
-      320,  316,  300,  301,  302,  303,  304,  305,  306,  307,
-      308,  309,  310,  321,  311,  312,  322,  323,  313,  314,
-      315,  324,  325,  326,  317,  318,  327,  319,  328,  320,
-      316,  329,  330,  331,  332,  334,  333,  335,  336,  337,
-      338,  339,  321,  340,  342,  322,  323,  343,  344,  345,
-      324,  325,  326,  341,  346,  327,  347,  328,  348,  349,
-      329,  330,  331,  332,  334,  333,  335,  336,  337,  338,
-      339,  350,  340,  342,  351,  354,  343,  344,  345,  352,
+      282,  305,  283,  306,  307,  279,  284,  285,  286,  287,
+      288,  289,  290,  291,  292,  293,  294,  295,  296,  297,
+      298,  299,  308,  309,  300,  301,  302,  303,  304,  310,
+      305,  311,  306,  307,  312,  313,  314,  316,  317,  318,
+      319,  320,  321,  322,  323,  324,  315,  325,  326,  327,
+      328,  308,  309,  329,  330,  331,  333,  332,  310,  334,
+      311,  335,  336,  312,  313,  314,  316,  317,  318,  319,
+      320,  321,  322,  323,  324,  315,  325,  326,  327,  328,
+      337,  338,  329,  330,  331,  333,  332,  339,  334,  341,
+      335,  336,  342,  343,  344,  346,  347,  340,  348,  349,
 
-      355,  353,  356,  346,  357,  347,  358,  348,  349,  360,
-      359,  361,  362,  365,  366,  367,  368,  369,  370,  371,
-      350,  372,  373,  351,  354,  374,  375,  376,  352,  355,
-      353,  356,  377,  357,  378,  358,  379,  380,  360,  359,
-      361,  362,  365,  366,  367,  368,  369,  370,  371,  381,
-      372,  373,  382,  383,  374,  375,  376,  384,  385,  386,
-      387,  377,  388,  378,  389,  379,  380,  390,  391,  392,
-      393,  394,  395,  396,  397,  398,  399,  402,  381,  400,
-      403,  382,  383,  404,  405,  406,  384,  385,  386,  387,
-      401,  388,  407,  389,  408,  409,  390,  391,  392,  393,
+      350,  351,  352,  353,  345,  354,  355,  356,  357,  337,
+      338,  358,  361,  359,  362,  363,  339,  360,  341,  366,
+      367,  342,  343,  344,  346,  347,  368,  348,  349,  350,
+      351,  352,  353,  345,  354,  355,  356,  357,  369,  370,
+      358,  361,  359,  362,  363,  371,  360,  372,  366,  367,
+      373,  374,  375,  376,  377,  368,  378,  379,  380,  381,
+      382,  383,  384,  385,  386,  387,  388,  369,  370,  389,
+      390,  391,  392,  393,  371,  394,  372,  395,  396,  373,
+      374,  375,  376,  377,  397,  378,  379,  380,  381,  382,
+      383,  384,  385,  386,  387,  388,  398,  399,  389,  390,
 
-      394,  395,  396,  397,  398,  399,  402,  410,  400,  403,
-      411,  412,  404,  405,  406,  413,  414,  415,  416,  401,
-      417,  407,  418,  408,  409,  419,  420,  421,  422,  423,
-      424,  425,  426,  427,  428,  429,  410,  430,  431,  411,
-      412,  432,  433,  434,  413,  414,  415,  416,  435,  417,
-      436,  418,  437,  438,  419,  420,  421,  422,  423,  424,
-      425,  426,  427,  428,  429,  439,  430,  431,  440,  441,
-      432,  433,  434,  442,  443,  444,  445,  435,  446,  436,
-      447,  437,  438,  448,  449,  450,  451,  452,  453,  454,
-      455,  456,  457,  458,  439,  459,  460,  440,  441,  461,
+      391,  392,  393,  401,  394,  402,  395,  396,  400,  403,
+      404,  405,  406,  397,  407,  408,  409,  410,  411,  412,
+      413,  414,  415,  416,  417,  398,  399,  418,  419,  420,
+      421,  422,  401,  423,  402,  424,  425,  400,  403,  404,
+      405,  406,  426,  407,  408,  409,  410,  411,  412,  413,
+      414,  415,  416,  417,  427,  428,  418,  419,  420,  421,
+      422,  429,  423,  430,  424,  425,  431,  432,  433,  434,
+      435,  426,  436,  437,  438,  439,  440,  442,  443,  441,
+      444,  445,  446,  427,  428,  447,  448,  449,  450,  451,
+      429,  452,  430,  453,  454,  431,  432,  433,  434,  435,
 
-      462,  463,  442,  443,  444,  445,  466,  446,  464,  447,
-      467,  465,  448,  449,  450,  451,  452,  453,  454,  455,
-      456,  457,  458,  468,  459,  460,  469,  470,  461,  462,
-      463,  471,  472,  473,  474,  466,  475,  464,  476,  467,
-      465,  477,  478,  479,  480,  481,  482,  483,  484,  485,
-      486,  487,  468,  488,  489,  469,  470,  490,  491,  492,
-      471,  472,  473,  474,  493,  475,  494,  476,  495,  496,
-      477,  478,  479,  480,  481,  482,  483,  484,  485,  486,
-      487,  497,  488,  489,  498,  499,  490,  491,  492,  500,
-      501,  502,  503,  493,  505,  494,  506,  495,  496,  507,
+      455,  436,  437,  438,  439,  440,  442,  443,  441,  444,
+      445,  446,  456,  457,  447,  448,  449,  450,  451,  458,
+      452,  459,  453,  454,  460,  461,  462,  463,  465,  455,
+      464,  466,  467,  468,  469,  470,  471,  472,  473,  474,
+      475,  456,  457,  476,  477,  478,  479,  480,  458,  481,
+      459,  482,  483,  460,  461,  462,  463,  465,  484,  464,
+      466,  467,  468,  469,  470,  471,  472,  473,  474,  475,
+      485,  486,  476,  477,  478,  479,  480,  487,  481,  488,
+      482,  483,  489,  490,  491,  492,  493,  484,  494,  495,
+      496,  497,  498,  499,  500,  501,  502,  503,  504,  485,
 
-      508,  509,  510,  511,  512,  513,  514,  515,  516,  517,
-      497,  518,  519,  498,  499,  520,  521,  522,  500,  501,
-      502,  503,  523,  505,  524,  506,  525,  526,  507,  508,
-      509,  510,  511,  512,  513,  514,  515,  516,  517,  527,
-      518,  519,  528,  529,  520,  521,  522,  530,  531,  532,
-      533,  523,  534,  524,  535,  525,  526,  536,  537,  538,
-      539,  540,  541,  542,  543,  544,  545,  546,  527,  547,
-      548,  528,  529,  549,  550,  551,  530,  531,  532,  533,
-      552,  534,  553,  535,  554,  555,  536,  537,  538,  539,
-      540,  541,  542,  543,  544,  545,  546,  556,  547,  548,
+      486,  505,  506,  507,  508,  509,  487,  510,  488,  511,
+      512,  489,  490,  491,  492,  493,  513,  494,  495,  496,
+      497,  498,  499,  500,  501,  502,  503,  504,  514,  515,
+      505,  506,  507,  508,  509,  516,  510,  517,  511,  512,
+      518,  519,  520,  521,  522,  513,  523,  524,  525,  526,
+      527,  528,  529,  530,  531,  532,  533,  514,  515,  534,
+      535,  536,  537,  538,  516,  539,  517,  540,  541,  518,
+      519,  520,  521,  522,  542,  523,  524,  525,  526,  527,
+      528,  529,  530,  531,  532,  533,  543,  544,  534,  535,
+      536,  537,  538,  545,  539,  546,  540,  541,  547,  548,
 
-      557,  558,  549,  550,  551,  559,  560,  561,  562,  552,
-      563,  553,  564,  554,  555,  565,  566,  567,  568,  569,
-      570,  571,  572,  573,  574,  575,  556,  576,  577,  557,
-      558,  578,  579,  580,  559,  560,  561,  562,  581,  563,
-      582,  564,  583,  584,  565,  566,  567,  568,  569,  570,
-      571,  572,  573,  574,  575,  585,  576,  577,  586,  587,
-      578,  579,  580,  588,  589,  590,  591,  581,  592,  582,
-      593,  583,  584,  594,  595,  596,  597,  598,  598,  598,
-      598,  598,  598,  598,  585,  598,  598,  586,  587,  598,
-      598,  598,  588,  589,  590,  591,  598,  592,  598,  593,
+      549,  550,  551,  542,  552,  553,  554,  555,  556,  557,
+      558,  559,  560,  561,  562,  543,  544,  563,  564,  565,
+      566,  567,  545,  568,  546,  569,  570,  547,  548,  549,
+      550,  551,  571,  552,  553,  554,  555,  556,  557,  558,
+      559,  560,  561,  562,  572,  573,  563,  564,  565,  566,
+      567,  574,  568,  575,  569,  570,  576,  577,  578,  579,
+      580,  571,  581,  582,  583,  584,  585,  586,  587,  588,
+      588,  588,  588,  572,  573,  588,  588,  588,  588,  588,
+      574,  588,  575,  588,  588,  576,  577,  578,  579,  580,
+      588,  581,  582,  583,  584,  585,  586,  587,   14,   14,
 
-      598,  598,  594,  595,  596,  597,   14,   14,   14,   14,
-       14,   14,   14,   14,   14,   14,   59,   59,   59,   59,
-       59,   59,   59,   59,   59,   59,   60,   60,   60,   60,
-       60,   60,   60,   60,   60,   60,   63,   63,   63,   63,
-       63,   63,   63,   63,   63,   63,   66,   66,   66,   66,
-       66,   66,   66,   66,   66,   66,   69,   69,   80,   80,
-       80,  598,   80,  156,  156,  156,  156,  598,  156,  157,
-      157,  157,  598,  157,  157,  157,  157,  157,  157,  159,
-      159,  159,  598,  159,  159,  159,  159,  598,  159,  160,
-      160,  160,  160,  160,  160,  160,  160,  160,  160,  170,
+       14,   14,   14,   14,   14,   14,   14,   14,   59,   59,
+       59,   59,   59,   59,   59,   59,   59,   59,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   63,   63,
+       63,   63,   63,   63,   63,   63,   63,   63,   66,   66,
+       66,   66,   66,   66,   66,   66,   66,   66,   69,   69,
+       80,   80,   80,  588,   80,  157,  157,  157,  157,  588,
+      157,  158,  158,  158,  588,  158,  158,  158,  158,  158,
+      158,  160,  160,  160,  588,  160,  160,  160,  160,  588,
+      160,  161,  161,  161,  161,  161,  161,  161,  161,  161,
+      161,  171,  171,  588,  171,  171,  171,  171,  171,  171,
 
-      170,  598,  170,  170,  170,  170,  170,  170,  170,  172,
-      598,  172,  172,  172,  172,  172,  172,  172,  172,  271,
-      271,  364,  364,   13,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598
-
+      171,  173,  588,  173,  173,  173,  173,  173,  173,  173,
+      173,  272,  272,  365,  365,   13,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588
     } ;
 
-static const flex_int16_t yy_chk[1396] =
+static const flex_int16_t yy_chk[1388] =
     {   0,
-        0,    0,    1,    2,    7,    8,   57,   57,   11,    7,
-        8,   11,   12,    0,   18,   12,   18,   25,   25,   27,
-       27,   58,   58,   70,    0,   70,   76,   76,    0,   76,
-       76,  155,  155,  162,  162,  163,  163,  174,  174,  175,
-      175,  269,  269,    0,    1,    2,    3,    3,    3,    3,
+        0,  155,    1,    2,    7,    8,   57,   57,   11,    7,
+        8,   11,   12,   68,   18,   12,   18,   25,   25,   27,
+       27,   58,   58,   70,   62,   70,   76,   76,   56,   76,
+       76,  156,  156,  163,  163,  164,  164,  175,  175,  176,
+      176,  270,  270,   29,    1,    2,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
@@ -871,150 +1027,148 @@
         3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
         3,    3,    3,    3,    3,    3,    3,    5,    5,    5,
         5,    5,    5,    5,    5,    5,   36,   39,   40,    9,
-       10,    5,    5,    5,    9,   10,  270,  270,  456,   26,
-       26,   26,  363,  363,   30,  154,   68,   62,   56,   29,
-       26,   24,   30,   20,   30,   36,   39,   40,   13,   30,
+       10,    5,    5,    5,    9,   10,  271,  271,   24,   26,
+       26,   26,  364,  364,   30,   20,   13,    0,    0,    0,
+       26,    0,   30,    0,   30,   36,   39,   40,    0,   30,
         5,    5,    6,    6,    6,    6,    6,    6,    6,    6,
         6,    9,   10,   30,   34,   37,    6,    6,    6,   26,
        31,   30,   33,   30,   31,   42,   33,   31,   30,   37,
        33,   42,   46,   38,    0,   34,   33,   34,   38,   33,
 
-       31,    0,   34,   51,   37,    6,    6,   34,    0,   31,
-        0,   33,   54,   31,   42,   33,   31,   43,   37,   33,
+       31,    0,    0,   51,   37,    6,    6,   34,    0,   31,
+        0,   33,    0,   31,   42,   33,   31,   43,   37,   33,
        42,   46,   38,   43,   34,   33,   34,   38,   33,   31,
-       32,   34,   51,   52,   52,   41,   34,   32,   45,   41,
-       81,   54,   45,   41,   32,   44,   43,   32,   32,   41,
-       32,    0,   43,   44,   83,   45,    0,   44,   84,   32,
-       44,   44,   52,   52,   41,    0,   32,   45,   41,   81,
-       85,   45,   41,   32,   44,    0,   32,   32,   41,   32,
-       35,    0,   44,   83,   45,   48,   44,   84,   35,   44,
-       44,   35,   87,   48,   35,    0,   49,   35,   47,   85,
+       32,   41,   51,   52,   52,   41,   34,   32,   45,   41,
+       54,   44,   45,   81,   32,   41,   43,   32,   32,   44,
+       32,    0,   43,   44,   83,   45,   44,   44,    0,   32,
+       41,   84,   52,   52,   41,    0,   32,   45,   41,   54,
+       44,   45,   81,   32,   41,    0,   32,   32,   44,   32,
+       35,    0,   44,   83,   45,   44,   44,   50,   35,   50,
+       84,   35,   50,   82,   35,   48,   85,   35,   47,    0,
 
-       35,   48,   47,   49,   49,   50,   47,   50,    0,   35,
-       50,   86,   47,   49,   48,   89,   49,   35,   73,   73,
-       35,   87,   48,   35,   86,   49,   35,   47,   73,   35,
-       48,   47,   49,   49,   50,   47,   50,   74,   74,   50,
-       86,   47,   49,   82,   89,   49,   65,   74,   75,   75,
-       75,   82,   90,   86,   65,   65,   90,   73,   91,   75,
-       91,   65,   91,   92,   93,   65,   94,   97,   98,   95,
-       99,  101,   82,   65,   95,    0,   74,   65,  102,   65,
-       82,   90,  103,   65,  105,   90,  106,   91,   75,   91,
-       65,   91,   92,   93,   65,   94,   97,   98,   95,   99,
+       35,   82,   47,   48,   73,   73,   47,    0,    0,   35,
+       48,   48,   47,    0,   73,   86,   50,   35,   50,   87,
+       35,   50,   82,   35,   48,   85,   35,   47,   86,   35,
+       82,   47,   48,    0,   89,   47,   74,   74,    0,   48,
+       48,   47,   49,   73,   86,   92,   74,   90,   87,   49,
+       49,   90,   93,   75,   75,   75,   49,   86,   94,   49,
+       97,   95,   49,   89,   75,   91,   95,   91,   98,   91,
+        0,   49,    0,    0,   92,   74,   90,   99,   49,   49,
+       90,   93,    0,  101,  102,   49,    0,   94,   49,   97,
+       95,   49,   65,   75,   91,   95,   91,   98,   91,   96,
 
-      101,   96,   65,   95,   96,  104,   65,  102,   65,  107,
-       96,  103,   65,  105,  108,  106,  104,   96,  109,  110,
-      108,  111,  112,  113,  116,  112,  114,  117,  118,  119,
-       96,  121,  122,   96,  104,  120,  114,  120,  107,   96,
-      123,  114,  114,  108,  124,  104,   96,  109,  110,  108,
-      111,  112,  113,  116,  112,  114,  117,  118,  119,  125,
-      121,  122,  126,  128,  120,  114,  120,  129,  130,  123,
-      114,  114,  131,  124,  132,  133,  134,  135,  136,  133,
-      137,  138,  140,  136,  136,  139,  141,  142,  125,  143,
-      144,  126,  128,  145,  139,  146,  129,  130,    0,  148,
+       65,   65,   96,  103,  104,  105,   99,   65,   96,  106,
+      107,   65,  101,  102,  103,   96,  107,  108,  109,   65,
+      110,  111,  112,   65,  111,   65,    0,  115,   96,   65,
+      116,   96,  103,  104,  105,  117,   65,   96,  106,  107,
+       65,    0,    0,  103,   96,  107,  108,  109,   65,  110,
+      111,  112,   65,  111,   65,  113,  115,  118,   65,  116,
+      119,  120,  119,  121,  117,  113,  122,  123,  124,  125,
+      113,  113,  127,  128,  129,  130,  131,  132,  133,  134,
+      136,  132,  135,  137,  113,  139,  118,  135,  135,  119,
+      120,  119,  121,    0,  113,  122,  123,  124,  125,  113,
 
-      149,  131,  139,  132,  133,  134,  135,  136,  133,  137,
-      138,  140,  136,  136,  139,  141,  142,  151,  143,  144,
-      147,  153,  145,  139,  146,  178,  150,  147,  148,  149,
-      152,  139,  150,  173,  173,  180,  152,  181,  182,  183,
-      184,  185,  186,  173,  187,  188,  151,  189,  190,  147,
-      153,  191,  184,  192,  178,  150,  147,  193,  194,  152,
-      196,  150,  197,  199,  180,  152,  181,  182,  183,  184,
-      185,  186,  173,  187,  188,  198,  189,  190,  200,  198,
-      191,  184,  192,  201,  202,  203,  193,  194,  205,  196,
-      206,  197,  199,  207,  208,  209,  210,  211,  212,  213,
+      113,  127,  128,  129,  130,  131,  132,  133,  134,  136,
+      132,  135,  137,  138,  139,  140,  135,  135,  141,  142,
+      143,  144,  138,  146,  147,  148,  149,  150,  151,  152,
+      138,  153,  148,  154,  151,  174,  174,  153,  179,  181,
+      182,  183,  138,  184,  140,  174,  186,  141,  142,  143,
+      144,  138,  146,  147,  148,  149,  150,  151,  152,  138,
+      153,  148,  154,  151,  185,  187,  153,  179,  181,  182,
+      183,  188,  184,  189,  174,  186,  185,  190,  191,  192,
+      193,  194,  195,  197,  198,  199,  200,  201,  202,  203,
+      204,  206,  207,  185,  187,  208,  209,  210,  211,  212,
 
-      214,  215,  216,  217,  198,  218,  219,  200,  198,  220,
-      221,  222,  201,  202,  203,  223,  225,  205,  226,  206,
-      227,  222,  207,  208,  209,  210,  211,  212,  213,  214,
-      215,  216,  217,  228,  218,  219,  229,  230,  220,  221,
-      222,  231,  233,  235,  223,  225,  236,  226,  237,  227,
-      222,  238,  239,  240,  241,  242,  241,  243,  244,  245,
-      246,  247,  228,  248,  249,  229,  230,  250,  252,  253,
-      231,  233,  235,  248,  254,  236,  255,  237,  256,  257,
-      238,  239,  240,  241,  242,  241,  243,  244,  245,  246,
-      247,  258,  248,  249,  259,  261,  250,  252,  253,  260,
+      188,  213,  189,  214,  215,  185,  190,  191,  192,  193,
+      194,  195,  197,  198,  199,  200,  201,  202,  203,  204,
+      206,  207,  216,  217,  208,  209,  210,  211,  212,  218,
+      213,  219,  214,  215,  220,  221,  222,  223,  225,  226,
+      227,  228,  229,  230,  231,  233,  222,  235,  236,  237,
+      238,  216,  217,  239,  240,  241,  242,  241,  218,  243,
+      219,  244,  245,  220,  221,  222,  223,  225,  226,  227,
+      228,  229,  230,  231,  233,  222,  235,  236,  237,  238,
+      246,  247,  239,  240,  241,  242,  241,  248,  243,  249,
+      244,  245,  250,  252,  253,  254,  255,  248,  256,  257,
 
-      262,  260,  263,  254,  264,  255,  265,  256,  257,  266,
-      265,  267,  268,  272,  273,  274,  275,  276,  277,  278,
-      258,  280,  281,  259,  261,  282,  283,  285,  260,  262,
-      260,  263,  286,  264,  287,  265,  288,  289,  266,  265,
-      267,  268,  272,  273,  274,  275,  276,  277,  278,  290,
-      280,  281,  291,  292,  282,  283,  285,  293,  294,  295,
-      298,  286,  299,  287,  300,  288,  289,  301,  302,  303,
-      304,  305,  308,  310,  312,  313,  314,  321,  290,  315,
-      323,  291,  292,  324,  325,  326,  293,  294,  295,  298,
-      315,  299,  327,  300,  329,  330,  301,  302,  303,  304,
+      258,  259,  260,  261,  253,  261,  262,  263,  264,  246,
+      247,  265,  267,  266,  268,  269,  248,  266,  249,  273,
+      274,  250,  252,  253,  254,  255,  275,  256,  257,  258,
+      259,  260,  261,  253,  261,  262,  263,  264,  276,  277,
+      265,  267,  266,  268,  269,  278,  266,  279,  273,  274,
+      281,  282,  283,  284,  286,  275,  287,  288,  289,  290,
+      291,  292,  293,  294,  295,  298,  299,  276,  277,  300,
+      301,  302,  303,  304,  278,  307,  279,  309,  311,  281,
+      282,  283,  284,  286,  312,  287,  288,  289,  290,  291,
+      292,  293,  294,  295,  298,  299,  313,  314,  300,  301,
 
-      305,  308,  310,  312,  313,  314,  321,  331,  315,  323,
-      332,  333,  324,  325,  326,  335,  337,  338,  339,  315,
-      341,  327,  342,  329,  330,  343,  344,  345,  346,  348,
-      350,  351,  352,  353,  354,  355,  331,  356,  357,  332,
-      333,  359,  360,  362,  335,  337,  338,  339,  366,  341,
-      367,  342,  368,  369,  343,  344,  345,  346,  348,  350,
-      351,  352,  353,  354,  355,  370,  356,  357,  370,  371,
-      359,  360,  362,  372,  374,  375,  376,  366,  377,  367,
-      378,  368,  369,  379,  380,  381,  382,  383,  384,  385,
-      386,  387,  388,  389,  370,  393,  394,  370,  371,  396,
+      302,  303,  304,  320,  307,  322,  309,  311,  314,  323,
+      324,  325,  326,  312,  328,  329,  330,  331,  332,  334,
+      336,  337,  338,  340,  341,  313,  314,  342,  343,  344,
+      345,  346,  320,  347,  322,  349,  351,  314,  323,  324,
+      325,  326,  352,  328,  329,  330,  331,  332,  334,  336,
+      337,  338,  340,  341,  353,  354,  342,  343,  344,  345,
+      346,  355,  347,  356,  349,  351,  357,  358,  360,  361,
+      363,  352,  367,  368,  369,  370,  371,  372,  373,  371,
+      375,  376,  377,  353,  354,  378,  379,  380,  381,  382,
+      355,  383,  356,  384,  385,  357,  358,  360,  361,  363,
 
-      399,  400,  372,  374,  375,  376,  403,  377,  401,  378,
-      408,  401,  379,  380,  381,  382,  383,  384,  385,  386,
-      387,  388,  389,  409,  393,  394,  410,  411,  396,  399,
-      400,  412,  414,  415,  417,  403,  418,  401,  419,  408,
-      401,  420,  421,  423,  424,  425,  427,  428,  430,  431,
-      433,  434,  409,  435,  436,  410,  411,  438,  439,  440,
-      412,  414,  415,  417,  441,  418,  442,  419,  444,  446,
-      420,  421,  423,  424,  425,  427,  428,  430,  431,  433,
-      434,  447,  435,  436,  448,  449,  438,  439,  440,  450,
-      452,  453,  454,  441,  458,  442,  459,  444,  446,  460,
+      386,  367,  368,  369,  370,  371,  372,  373,  371,  375,
+      376,  377,  387,  388,  378,  379,  380,  381,  382,  392,
+      383,  393,  384,  385,  395,  398,  399,  400,  402,  386,
+      400,  407,  408,  409,  410,  411,  413,  414,  416,  417,
+      418,  387,  388,  419,  420,  421,  422,  424,  392,  425,
+      393,  426,  428,  395,  398,  399,  400,  402,  429,  400,
+      407,  408,  409,  410,  411,  413,  414,  416,  417,  418,
+      431,  432,  419,  420,  421,  422,  424,  434,  425,  435,
+      426,  428,  436,  437,  439,  440,  441,  429,  442,  443,
+      445,  447,  448,  449,  450,  451,  453,  454,  457,  431,
 
-      463,  464,  465,  467,  468,  469,  470,  471,  472,  474,
-      447,  477,  478,  448,  449,  479,  480,  481,  450,  452,
-      453,  454,  485,  458,  487,  459,  488,  490,  460,  463,
-      464,  465,  467,  468,  469,  470,  471,  472,  474,  491,
-      477,  478,  492,  493,  479,  480,  481,  494,  495,  498,
-      501,  485,  502,  487,  503,  488,  490,  504,  506,  509,
-      510,  511,  513,  515,  516,  517,  518,  519,  491,  520,
-      521,  492,  493,  522,  524,  525,  494,  495,  498,  501,
-      526,  502,  527,  503,  528,  529,  504,  506,  509,  510,
-      511,  513,  515,  516,  517,  518,  519,  530,  520,  521,
+      432,  458,  459,  462,  463,  464,  434,  466,  435,  467,
+      468,  436,  437,  439,  440,  441,  469,  442,  443,  445,
+      447,  448,  449,  450,  451,  453,  454,  457,  470,  471,
+      458,  459,  462,  463,  464,  473,  466,  476,  467,  468,
+      479,  480,  481,  482,  486,  469,  488,  489,  491,  492,
+      493,  494,  495,  496,  499,  502,  503,  470,  471,  505,
+      508,  509,  510,  512,  473,  514,  476,  515,  516,  479,
+      480,  481,  482,  486,  517,  488,  489,  491,  492,  493,
+      494,  495,  496,  499,  502,  503,  518,  519,  505,  508,
+      509,  510,  512,  520,  514,  521,  515,  516,  523,  524,
 
-      531,  533,  522,  524,  525,  534,  536,  537,  538,  526,
-      540,  527,  541,  528,  529,  543,  544,  546,  547,  548,
-      549,  550,  552,  553,  554,  555,  530,  557,  559,  531,
-      533,  560,  563,  565,  534,  536,  537,  538,  566,  540,
-      569,  541,  573,  574,  543,  544,  546,  547,  548,  549,
-      550,  552,  553,  554,  555,  575,  557,  559,  578,  581,
-      560,  563,  565,  582,  583,  586,  587,  566,  589,  569,
-      590,  573,  574,  591,  592,  593,  595,    0,    0,    0,
-        0,    0,    0,    0,  575,    0,    0,  578,  581,    0,
-        0,    0,  582,  583,  586,  587,    0,  589,    0,  590,
+      525,  526,  527,  517,  528,  529,  530,  532,  534,  535,
+      537,  538,  540,  541,  543,  518,  519,  544,  545,  546,
+      547,  549,  520,  550,  521,  551,  552,  523,  524,  525,
+      526,  527,  554,  528,  529,  530,  532,  534,  535,  537,
+      538,  540,  541,  543,  555,  558,  544,  545,  546,  547,
+      549,  560,  550,  561,  551,  552,  564,  568,  569,  570,
+      575,  554,  576,  577,  580,  582,  583,  584,  586,    0,
+        0,    0,    0,  555,  558,    0,    0,    0,    0,    0,
+      560,    0,  561,    0,    0,  564,  568,  569,  570,  575,
+        0,  576,  577,  580,  582,  583,  584,  586,  589,  589,
 
-        0,    0,  591,  592,  593,  595,  599,  599,  599,  599,
-      599,  599,  599,  599,  599,  599,  600,  600,  600,  600,
-      600,  600,  600,  600,  600,  600,  601,  601,  601,  601,
-      601,  601,  601,  601,  601,  601,  602,  602,  602,  602,
-      602,  602,  602,  602,  602,  602,  603,  603,  603,  603,
-      603,  603,  603,  603,  603,  603,  604,  604,  605,  605,
-      605,    0,  605,  606,  606,  606,  606,    0,  606,  607,
-      607,  607,    0,  607,  607,  607,  607,  607,  607,  608,
-      608,  608,    0,  608,  608,  608,  608,    0,  608,  609,
-      609,  609,  609,  609,  609,  609,  609,  609,  609,  610,
+      589,  589,  589,  589,  589,  589,  589,  589,  590,  590,
+      590,  590,  590,  590,  590,  590,  590,  590,  591,  591,
+      591,  591,  591,  591,  591,  591,  591,  591,  592,  592,
+      592,  592,  592,  592,  592,  592,  592,  592,  593,  593,
+      593,  593,  593,  593,  593,  593,  593,  593,  594,  594,
+      595,  595,  595,    0,  595,  596,  596,  596,  596,    0,
+      596,  597,  597,  597,    0,  597,  597,  597,  597,  597,
+      597,  598,  598,  598,    0,  598,  598,  598,  598,    0,
+      598,  599,  599,  599,  599,  599,  599,  599,  599,  599,
+      599,  600,  600,    0,  600,  600,  600,  600,  600,  600,
 
-      610,    0,  610,  610,  610,  610,  610,  610,  610,  611,
-        0,  611,  611,  611,  611,  611,  611,  611,  611,  612,
-      612,  613,  613,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598,  598,  598,  598,  598,  598,
-      598,  598,  598,  598,  598
-
+      600,  601,    0,  601,  601,  601,  601,  601,  601,  601,
+      601,  602,  602,  603,  603,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588,  588,  588,  588,
+      588,  588,  588,  588,  588,  588,  588
     } ;
 
 /* Table of booleans, true if rule could match eol. */
-static const flex_int32_t yy_rule_can_match_eol[164] =
+static const flex_int32_t yy_rule_can_match_eol[165] =
     {   0,
 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
@@ -1023,8 +1177,8 @@
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
-    0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 
-    1, 0, 0, 0,     };
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 
+    0, 1, 0, 0, 0,     };
 
 /* The intent behind this definition is that it'll catch
  * any uses of REJECT which flex missed.
@@ -1074,13 +1228,13 @@
 class ParseBlockProperties;
 class ParseColumnConstraint;
 class ParseCommand;
-struct ParseCopyFromParams;
 class ParseDataType;
 class ParseExpression;
 struct ParseFrameInfo;
 class ParseFunctionCall;
 class ParseGroupBy;
 class ParseHaving;
+class ParseKeyBoolValue;
 class ParseKeyIntegerValue;
 class ParseKeyStringValue;
 class ParseKeyStringList;
@@ -1104,7 +1258,7 @@
 class ParseSimpleWhenClause;
 class ParseStringKeyLiteralValues;
 class ParseStatement;
-class ParseStatementCopyFrom;
+class ParseStatementCopy;
 class ParseStatementCreateTable;
 class ParseStatementDelete;
 class ParseStatementDropTable;
@@ -1135,14 +1289,14 @@
     yycolumn += yyleng;                                   \
   }
 
-#line 1138 "SqlLexer_gen.cpp"
+#line 1292 "SqlLexer_gen.cpp"
 /* FIXME(chasseur, qzeng): Add support for hexadecimal literals. */
 /**
  * These patterns are based on the SQL-2011 standard for syntax of numeric
  * literals (Part 2, Section 5.3 of the standard).
  **/
 
-#line 1145 "SqlLexer_gen.cpp"
+#line 1299 "SqlLexer_gen.cpp"
 
 #define INITIAL 0
 #define CONDITION_SQL 1
@@ -1209,50 +1363,50 @@
     
     #    define yylloc yyg->yylloc_r
     
-int quickstep_yylex_init (yyscan_t* scanner);
+int yylex_init (yyscan_t* scanner);
 
-int quickstep_yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);
+int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);
 
 /* Accessor methods to globals.
    These are made visible to non-reentrant scanners for convenience. */
 
-int quickstep_yylex_destroy ( yyscan_t yyscanner );
+int yylex_destroy ( yyscan_t yyscanner );
 
-int quickstep_yyget_debug ( yyscan_t yyscanner );
+int yyget_debug ( yyscan_t yyscanner );
 
-void quickstep_yyset_debug ( int debug_flag , yyscan_t yyscanner );
+void yyset_debug ( int debug_flag , yyscan_t yyscanner );
 
-YY_EXTRA_TYPE quickstep_yyget_extra ( yyscan_t yyscanner );
+YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner );
 
-void quickstep_yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );
+void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );
 
-FILE *quickstep_yyget_in ( yyscan_t yyscanner );
+FILE *yyget_in ( yyscan_t yyscanner );
 
-void quickstep_yyset_in  ( FILE * _in_str , yyscan_t yyscanner );
+void yyset_in  ( FILE * _in_str , yyscan_t yyscanner );
 
-FILE *quickstep_yyget_out ( yyscan_t yyscanner );
+FILE *yyget_out ( yyscan_t yyscanner );
 
-void quickstep_yyset_out  ( FILE * _out_str , yyscan_t yyscanner );
+void yyset_out  ( FILE * _out_str , yyscan_t yyscanner );
 
-			int quickstep_yyget_leng ( yyscan_t yyscanner );
+			int yyget_leng ( yyscan_t yyscanner );
 
-char *quickstep_yyget_text ( yyscan_t yyscanner );
+char *yyget_text ( yyscan_t yyscanner );
 
-int quickstep_yyget_lineno ( yyscan_t yyscanner );
+int yyget_lineno ( yyscan_t yyscanner );
 
-void quickstep_yyset_lineno ( int _line_number , yyscan_t yyscanner );
+void yyset_lineno ( int _line_number , yyscan_t yyscanner );
 
-int quickstep_yyget_column  ( yyscan_t yyscanner );
+int yyget_column  ( yyscan_t yyscanner );
 
-void quickstep_yyset_column ( int _column_no , yyscan_t yyscanner );
+void yyset_column ( int _column_no , yyscan_t yyscanner );
 
-YYSTYPE * quickstep_yyget_lval ( yyscan_t yyscanner );
+YYSTYPE * yyget_lval ( yyscan_t yyscanner );
 
-void quickstep_yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
+void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
 
-       YYLTYPE *quickstep_yyget_lloc ( yyscan_t yyscanner );
+       YYLTYPE *yyget_lloc ( yyscan_t yyscanner );
     
-        void quickstep_yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner );
+        void yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner );
     
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -1260,9 +1414,9 @@
 
 #ifndef YY_SKIP_YYWRAP
 #ifdef __cplusplus
-extern "C" int quickstep_yywrap ( yyscan_t yyscanner );
+extern "C" int yywrap ( yyscan_t yyscanner );
 #else
-extern int quickstep_yywrap ( yyscan_t yyscanner );
+extern int yywrap ( yyscan_t yyscanner );
 #endif
 #endif
 
@@ -1367,10 +1521,10 @@
 #ifndef YY_DECL
 #define YY_DECL_IS_OURS 1
 
-extern int quickstep_yylex \
+extern int yylex \
                (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner);
 
-#define YY_DECL int quickstep_yylex \
+#define YY_DECL int yylex \
                (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner)
 #endif /* !YY_DECL */
 
@@ -1420,19 +1574,19 @@
 			yyout = stdout;
 
 		if ( ! YY_CURRENT_BUFFER ) {
-			quickstep_yyensure_buffer_stack (yyscanner);
+			yyensure_buffer_stack (yyscanner);
 			YY_CURRENT_BUFFER_LVALUE =
-				quickstep_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+				yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
 		}
 
-		quickstep_yy_load_buffer_state(yyscanner );
+		yy_load_buffer_state( yyscanner );
 		}
 
 	{
 #line 132 "../SqlLexer.lpp"
 
 
-#line 1435 "SqlLexer_gen.cpp"
+#line 1589 "SqlLexer_gen.cpp"
 
 	while ( /*CONSTCOND*/1 )		/* loops until end-of-file is reached */
 		{
@@ -1459,13 +1613,13 @@
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
-				if ( yy_current_state >= 599 )
+				if ( yy_current_state >= 589 )
 					yy_c = yy_meta[yy_c];
 				}
 			yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
 			++yy_cp;
 			}
-		while ( yy_current_state != 598 );
+		while ( yy_current_state != 588 );
 		yy_cp = yyg->yy_last_accepting_cpos;
 		yy_current_state = yyg->yy_last_accepting_state;
 
@@ -1709,7 +1863,7 @@
 case 37:
 YY_RULE_SETUP
 #line 203 "../SqlLexer.lpp"
-return TOKEN_DELIMITER;
+return TOKEN_DESC;
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
@@ -1719,347 +1873,347 @@
 case 39:
 YY_RULE_SETUP
 #line 205 "../SqlLexer.lpp"
-return TOKEN_DESC;
+return TOKEN_DISTINCT;
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
 #line 206 "../SqlLexer.lpp"
-return TOKEN_DISTINCT;
+return TOKEN_DOUBLE;
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
 #line 207 "../SqlLexer.lpp"
-return TOKEN_DOUBLE;
+return TOKEN_DROP;
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
 #line 208 "../SqlLexer.lpp"
-return TOKEN_DROP;
+return TOKEN_ELSE;
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
 #line 209 "../SqlLexer.lpp"
-return TOKEN_ELSE;
+return TOKEN_END;
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
 #line 210 "../SqlLexer.lpp"
-return TOKEN_END;
+return TOKEN_EXISTS;
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
 #line 211 "../SqlLexer.lpp"
-return TOKEN_ESCAPE_STRINGS;
+return TOKEN_EXTRACT;
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
 #line 212 "../SqlLexer.lpp"
-return TOKEN_EXISTS;
+return TOKEN_FALSE;
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
 #line 213 "../SqlLexer.lpp"
-return TOKEN_EXTRACT;
+return TOKEN_FIRST;
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
 #line 214 "../SqlLexer.lpp"
-return TOKEN_FALSE;
+return TOKEN_FLOAT;
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
 #line 215 "../SqlLexer.lpp"
-return TOKEN_FIRST;
+return TOKEN_FOLLOWING;
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
 #line 216 "../SqlLexer.lpp"
-return TOKEN_FLOAT;
+return TOKEN_FOR;
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
 #line 217 "../SqlLexer.lpp"
-return TOKEN_FOLLOWING;
+return TOKEN_FOREIGN;
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
 #line 218 "../SqlLexer.lpp"
-return TOKEN_FOR;
+return TOKEN_FROM;
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
 #line 219 "../SqlLexer.lpp"
-return TOKEN_FOREIGN;
+return TOKEN_FULL;
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
 #line 220 "../SqlLexer.lpp"
-return TOKEN_FROM;
+return TOKEN_GROUP;
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
 #line 221 "../SqlLexer.lpp"
-return TOKEN_FULL;
+return TOKEN_HASH;
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
 #line 222 "../SqlLexer.lpp"
-return TOKEN_GROUP;
+return TOKEN_HAVING;
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
 #line 223 "../SqlLexer.lpp"
-return TOKEN_HASH;
+return TOKEN_HOUR;
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
 #line 224 "../SqlLexer.lpp"
-return TOKEN_HAVING;
+return TOKEN_IN;
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
 #line 225 "../SqlLexer.lpp"
-return TOKEN_HOUR;
+return TOKEN_INDEX;
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
 #line 226 "../SqlLexer.lpp"
-return TOKEN_IN;
+return TOKEN_INNER;
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
 #line 227 "../SqlLexer.lpp"
-return TOKEN_INDEX;
+return TOKEN_INSERT;
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
 #line 228 "../SqlLexer.lpp"
-return TOKEN_INNER;
+return TOKEN_INTEGER;
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
 #line 229 "../SqlLexer.lpp"
-return TOKEN_INSERT;
+return TOKEN_INTEGER;
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
 #line 230 "../SqlLexer.lpp"
-return TOKEN_INTEGER;
+return TOKEN_INTERSECT;
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
 #line 231 "../SqlLexer.lpp"
-return TOKEN_INTEGER;
+return TOKEN_INTERVAL;
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
 #line 232 "../SqlLexer.lpp"
-return TOKEN_INTERSECT;
+return TOKEN_INTO;
 	YY_BREAK
 case 67:
 YY_RULE_SETUP
 #line 233 "../SqlLexer.lpp"
-return TOKEN_INTERVAL;
+return TOKEN_IS;
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
 #line 234 "../SqlLexer.lpp"
-return TOKEN_INTO;
+return TOKEN_JOIN;
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
 #line 235 "../SqlLexer.lpp"
-return TOKEN_IS;
+return TOKEN_KEY;
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
 #line 236 "../SqlLexer.lpp"
-return TOKEN_JOIN;
+return TOKEN_LAST;
 	YY_BREAK
 case 71:
 YY_RULE_SETUP
 #line 237 "../SqlLexer.lpp"
-return TOKEN_KEY;
+return TOKEN_LEFT;
 	YY_BREAK
 case 72:
 YY_RULE_SETUP
 #line 238 "../SqlLexer.lpp"
-return TOKEN_LAST;
+return TOKEN_LIKE;
 	YY_BREAK
 case 73:
 YY_RULE_SETUP
 #line 239 "../SqlLexer.lpp"
-return TOKEN_LEFT;
+return TOKEN_LIMIT;
 	YY_BREAK
 case 74:
 YY_RULE_SETUP
 #line 240 "../SqlLexer.lpp"
-return TOKEN_LIKE;
+return TOKEN_LONG;
 	YY_BREAK
 case 75:
 YY_RULE_SETUP
 #line 241 "../SqlLexer.lpp"
-return TOKEN_LIMIT;
+return TOKEN_MINUTE;
 	YY_BREAK
 case 76:
 YY_RULE_SETUP
 #line 242 "../SqlLexer.lpp"
-return TOKEN_LONG;
+return TOKEN_MONTH;
 	YY_BREAK
 case 77:
 YY_RULE_SETUP
 #line 243 "../SqlLexer.lpp"
-return TOKEN_MINUTE;
+return TOKEN_NOT;
 	YY_BREAK
 case 78:
 YY_RULE_SETUP
 #line 244 "../SqlLexer.lpp"
-return TOKEN_MONTH;
+return TOKEN_NULL;
 	YY_BREAK
 case 79:
 YY_RULE_SETUP
 #line 245 "../SqlLexer.lpp"
-return TOKEN_NOT;
+return TOKEN_NULLS;
 	YY_BREAK
 case 80:
 YY_RULE_SETUP
 #line 246 "../SqlLexer.lpp"
-return TOKEN_NULL;
+return TOKEN_OFF;
 	YY_BREAK
 case 81:
 YY_RULE_SETUP
 #line 247 "../SqlLexer.lpp"
-return TOKEN_NULLS;
+return TOKEN_ON;
 	YY_BREAK
 case 82:
 YY_RULE_SETUP
 #line 248 "../SqlLexer.lpp"
-return TOKEN_OFF;
+return TOKEN_OR;
 	YY_BREAK
 case 83:
 YY_RULE_SETUP
 #line 249 "../SqlLexer.lpp"
-return TOKEN_ON;
+return TOKEN_ORDER;
 	YY_BREAK
 case 84:
 YY_RULE_SETUP
 #line 250 "../SqlLexer.lpp"
-return TOKEN_OR;
+return TOKEN_OUTER;
 	YY_BREAK
 case 85:
 YY_RULE_SETUP
 #line 251 "../SqlLexer.lpp"
-return TOKEN_ORDER;
+return TOKEN_OVER;
 	YY_BREAK
 case 86:
 YY_RULE_SETUP
 #line 252 "../SqlLexer.lpp"
-return TOKEN_OUTER;
+return TOKEN_PARTITION;
 	YY_BREAK
 case 87:
 YY_RULE_SETUP
 #line 253 "../SqlLexer.lpp"
-return TOKEN_OVER;
+return TOKEN_PARTITIONS;
 	YY_BREAK
 case 88:
 YY_RULE_SETUP
 #line 254 "../SqlLexer.lpp"
-return TOKEN_PARTITION;
+return TOKEN_PERCENT;
 	YY_BREAK
 case 89:
 YY_RULE_SETUP
 #line 255 "../SqlLexer.lpp"
-return TOKEN_PARTITIONS;
+return TOKEN_PRECEDING;
 	YY_BREAK
 case 90:
 YY_RULE_SETUP
 #line 256 "../SqlLexer.lpp"
-return TOKEN_PERCENT;
+return TOKEN_PRIMARY;
 	YY_BREAK
 case 91:
 YY_RULE_SETUP
 #line 257 "../SqlLexer.lpp"
-return TOKEN_PRECEDING;
+return TOKEN_PRIORITY;
 	YY_BREAK
 case 92:
 YY_RULE_SETUP
 #line 258 "../SqlLexer.lpp"
-return TOKEN_PRIMARY;
+return TOKEN_QUIT;
 	YY_BREAK
 case 93:
 YY_RULE_SETUP
 #line 259 "../SqlLexer.lpp"
-return TOKEN_PRIORITY;
+return TOKEN_RANGE;
 	YY_BREAK
 case 94:
 YY_RULE_SETUP
 #line 260 "../SqlLexer.lpp"
-return TOKEN_QUIT;
+return TOKEN_REAL;
 	YY_BREAK
 case 95:
 YY_RULE_SETUP
 #line 261 "../SqlLexer.lpp"
-return TOKEN_RANGE;
+return TOKEN_REFERENCES;
 	YY_BREAK
 case 96:
 YY_RULE_SETUP
 #line 262 "../SqlLexer.lpp"
-return TOKEN_REAL;
+return TOKEN_REGEXP;
 	YY_BREAK
 case 97:
 YY_RULE_SETUP
 #line 263 "../SqlLexer.lpp"
-return TOKEN_REFERENCES;
+return TOKEN_RIGHT;
 	YY_BREAK
 case 98:
 YY_RULE_SETUP
 #line 264 "../SqlLexer.lpp"
-return TOKEN_REGEXP;
+return TOKEN_ROW;
 	YY_BREAK
 case 99:
 YY_RULE_SETUP
 #line 265 "../SqlLexer.lpp"
-return TOKEN_RIGHT;
+return TOKEN_ROW_DELIMITER;
 	YY_BREAK
 case 100:
 YY_RULE_SETUP
 #line 266 "../SqlLexer.lpp"
-return TOKEN_ROW;
+return TOKEN_ROWS;
 	YY_BREAK
 case 101:
 YY_RULE_SETUP
 #line 267 "../SqlLexer.lpp"
-return TOKEN_ROW_DELIMITER;
+return TOKEN_SECOND;
 	YY_BREAK
 case 102:
 YY_RULE_SETUP
 #line 268 "../SqlLexer.lpp"
-return TOKEN_ROWS;
+return TOKEN_SELECT;
 	YY_BREAK
 case 103:
 YY_RULE_SETUP
 #line 269 "../SqlLexer.lpp"
-return TOKEN_SECOND;
+return TOKEN_SET;
 	YY_BREAK
 case 104:
 YY_RULE_SETUP
 #line 270 "../SqlLexer.lpp"
-return TOKEN_SELECT;
+return TOKEN_SMA;
 	YY_BREAK
 case 105:
 YY_RULE_SETUP
 #line 271 "../SqlLexer.lpp"
-return TOKEN_SET;
+return TOKEN_SMALLINT;
 	YY_BREAK
 case 106:
 YY_RULE_SETUP
 #line 272 "../SqlLexer.lpp"
-return TOKEN_SMA;
+return TOKEN_STDERR;
 	YY_BREAK
 case 107:
 YY_RULE_SETUP
 #line 273 "../SqlLexer.lpp"
-return TOKEN_SMALLINT;
+return TOKEN_STDOUT;
 	YY_BREAK
 case 108:
 YY_RULE_SETUP
@@ -2089,87 +2243,87 @@
 case 113:
 YY_RULE_SETUP
 #line 279 "../SqlLexer.lpp"
-return TOKEN_TRUE;
+return TOKEN_TO;
 	YY_BREAK
 case 114:
 YY_RULE_SETUP
 #line 280 "../SqlLexer.lpp"
-return TOKEN_TUPLESAMPLE;
+return TOKEN_TRUE;
 	YY_BREAK
 case 115:
 YY_RULE_SETUP
 #line 281 "../SqlLexer.lpp"
-return TOKEN_UNBOUNDED;
+return TOKEN_TUPLESAMPLE;
 	YY_BREAK
 case 116:
 YY_RULE_SETUP
 #line 282 "../SqlLexer.lpp"
-return TOKEN_UNION;
+return TOKEN_UNBOUNDED;
 	YY_BREAK
 case 117:
 YY_RULE_SETUP
 #line 283 "../SqlLexer.lpp"
-return TOKEN_UNIQUE;
+return TOKEN_UNION;
 	YY_BREAK
 case 118:
 YY_RULE_SETUP
 #line 284 "../SqlLexer.lpp"
-return TOKEN_UPDATE;
+return TOKEN_UNIQUE;
 	YY_BREAK
 case 119:
 YY_RULE_SETUP
 #line 285 "../SqlLexer.lpp"
-return TOKEN_USING;
+return TOKEN_UPDATE;
 	YY_BREAK
 case 120:
 YY_RULE_SETUP
 #line 286 "../SqlLexer.lpp"
-return TOKEN_VALUES;
+return TOKEN_USING;
 	YY_BREAK
 case 121:
 YY_RULE_SETUP
 #line 287 "../SqlLexer.lpp"
-return TOKEN_VARCHAR;
+return TOKEN_VALUES;
 	YY_BREAK
 case 122:
 YY_RULE_SETUP
 #line 288 "../SqlLexer.lpp"
-return TOKEN_WHEN;
+return TOKEN_VARCHAR;
 	YY_BREAK
 case 123:
 YY_RULE_SETUP
 #line 289 "../SqlLexer.lpp"
-return TOKEN_WHERE;
+return TOKEN_WHEN;
 	YY_BREAK
 case 124:
 YY_RULE_SETUP
 #line 290 "../SqlLexer.lpp"
-return TOKEN_WINDOW;
+return TOKEN_WHERE;
 	YY_BREAK
 case 125:
 YY_RULE_SETUP
 #line 291 "../SqlLexer.lpp"
-return TOKEN_WITH;
+return TOKEN_WINDOW;
 	YY_BREAK
 case 126:
 YY_RULE_SETUP
 #line 292 "../SqlLexer.lpp"
-return TOKEN_YEAR;
+return TOKEN_WITH;
 	YY_BREAK
 case 127:
 YY_RULE_SETUP
 #line 293 "../SqlLexer.lpp"
-return TOKEN_YEARMONTH;
+return TOKEN_YEAR;
 	YY_BREAK
 case 128:
 YY_RULE_SETUP
-#line 295 "../SqlLexer.lpp"
-return TOKEN_EQ;
+#line 294 "../SqlLexer.lpp"
+return TOKEN_YEARMONTH;
 	YY_BREAK
 case 129:
 YY_RULE_SETUP
 #line 296 "../SqlLexer.lpp"
-return TOKEN_NEQ;
+return TOKEN_EQ;
 	YY_BREAK
 case 130:
 YY_RULE_SETUP
@@ -2179,56 +2333,61 @@
 case 131:
 YY_RULE_SETUP
 #line 298 "../SqlLexer.lpp"
-return TOKEN_LT;
+return TOKEN_NEQ;
 	YY_BREAK
 case 132:
 YY_RULE_SETUP
 #line 299 "../SqlLexer.lpp"
-return TOKEN_GT;
+return TOKEN_LT;
 	YY_BREAK
 case 133:
 YY_RULE_SETUP
 #line 300 "../SqlLexer.lpp"
-return TOKEN_LEQ;
+return TOKEN_GT;
 	YY_BREAK
 case 134:
 YY_RULE_SETUP
 #line 301 "../SqlLexer.lpp"
-return TOKEN_GEQ;
+return TOKEN_LEQ;
 	YY_BREAK
 case 135:
 YY_RULE_SETUP
-#line 303 "../SqlLexer.lpp"
-return yytext[0];
+#line 302 "../SqlLexer.lpp"
+return TOKEN_GEQ;
 	YY_BREAK
 case 136:
 YY_RULE_SETUP
 #line 304 "../SqlLexer.lpp"
 return yytext[0];
 	YY_BREAK
+case 137:
+YY_RULE_SETUP
+#line 305 "../SqlLexer.lpp"
+return yytext[0];
+	YY_BREAK
 /**
     * Quoted strings. Prefacing a string with an 'e' or 'E' causes escape
     * sequences to be processed (as in PostgreSQL).
     **/
-case 137:
+case 138:
 YY_RULE_SETUP
-#line 310 "../SqlLexer.lpp"
+#line 311 "../SqlLexer.lpp"
 {
     yylval->string_value_ = new quickstep::ParseString(yylloc->first_line, yylloc->first_column);
     BEGIN(CONDITION_STRING_SINGLE_QUOTED_ESCAPED);
   }
 	YY_BREAK
-case 138:
+case 139:
 YY_RULE_SETUP
-#line 315 "../SqlLexer.lpp"
+#line 316 "../SqlLexer.lpp"
 {
     yylval->string_value_ = new quickstep::ParseString(yylloc->first_line, yylloc->first_column);
     BEGIN(CONDITION_STRING_SINGLE_QUOTED);
   }
 	YY_BREAK
-case 139:
+case 140:
 YY_RULE_SETUP
-#line 320 "../SqlLexer.lpp"
+#line 321 "../SqlLexer.lpp"
 {
     yylval->string_value_ = new quickstep::ParseString(yylloc->first_line, yylloc->first_column);
     BEGIN(CONDITION_STRING_DOUBLE_QUOTED);
@@ -2240,7 +2399,7 @@
 case YY_STATE_EOF(CONDITION_STRING_SINGLE_QUOTED):
 case YY_STATE_EOF(CONDITION_STRING_SINGLE_QUOTED_ESCAPED):
 case YY_STATE_EOF(CONDITION_STRING_DOUBLE_QUOTED):
-#line 329 "../SqlLexer.lpp"
+#line 330 "../SqlLexer.lpp"
 {
     delete yylval->string_value_;
     BEGIN(INITIAL);
@@ -2251,9 +2410,9 @@
 
 /* Process escape sequences. */
 
-case 140:
+case 141:
 YY_RULE_SETUP
-#line 339 "../SqlLexer.lpp"
+#line 340 "../SqlLexer.lpp"
 {
     /* Octal code */
     unsigned int code;
@@ -2267,9 +2426,9 @@
     yylval->string_value_->push_back(code);
   }
 	YY_BREAK
-case 141:
+case 142:
 YY_RULE_SETUP
-#line 351 "../SqlLexer.lpp"
+#line 352 "../SqlLexer.lpp"
 {
     /* Hexadecimal code */
     unsigned int code;
@@ -2277,9 +2436,9 @@
     yylval->string_value_->push_back(code);
   }
 	YY_BREAK
-case 142:
+case 143:
 YY_RULE_SETUP
-#line 357 "../SqlLexer.lpp"
+#line 358 "../SqlLexer.lpp"
 {
     /* A numeric escape sequence that isn't correctly specified. */
     delete yylval->string_value_;
@@ -2288,58 +2447,58 @@
     return TOKEN_LEX_ERROR;
   }
 	YY_BREAK
-case 143:
+case 144:
 YY_RULE_SETUP
-#line 364 "../SqlLexer.lpp"
+#line 365 "../SqlLexer.lpp"
 {
     /* Backspace */
     yylval->string_value_->push_back('\b');
   }
 	YY_BREAK
-case 144:
+case 145:
 YY_RULE_SETUP
-#line 368 "../SqlLexer.lpp"
+#line 369 "../SqlLexer.lpp"
 {
     /* Form-feed */
     yylval->string_value_->push_back('\f');
   }
 	YY_BREAK
-case 145:
+case 146:
 YY_RULE_SETUP
-#line 372 "../SqlLexer.lpp"
+#line 373 "../SqlLexer.lpp"
 {
     /* Newline */
     yylval->string_value_->push_back('\n');
   }
 	YY_BREAK
-case 146:
+case 147:
 YY_RULE_SETUP
-#line 376 "../SqlLexer.lpp"
+#line 377 "../SqlLexer.lpp"
 {
     /* Carriage-return */
     yylval->string_value_->push_back('\r');
   }
 	YY_BREAK
-case 147:
+case 148:
 YY_RULE_SETUP
-#line 380 "../SqlLexer.lpp"
+#line 381 "../SqlLexer.lpp"
 {
     /* Horizontal Tab */
     yylval->string_value_->push_back('\t');
   }
 	YY_BREAK
-case 148:
-/* rule 148 can match eol */
+case 149:
+/* rule 149 can match eol */
 YY_RULE_SETUP
-#line 384 "../SqlLexer.lpp"
+#line 385 "../SqlLexer.lpp"
 {
     /* Any other character (including actual newline or carriage return) */
     yylval->string_value_->push_back(yytext[1]);
   }
 	YY_BREAK
-case 149:
+case 150:
 YY_RULE_SETUP
-#line 388 "../SqlLexer.lpp"
+#line 389 "../SqlLexer.lpp"
 {
     /* This should only be encountered right before an EOF. */
     delete yylval->string_value_;
@@ -2350,17 +2509,17 @@
 	YY_BREAK
 
 
-case 150:
+case 151:
 YY_RULE_SETUP
-#line 398 "../SqlLexer.lpp"
+#line 399 "../SqlLexer.lpp"
 {
     /* Two quotes in a row become a single quote (this is specified by the SQL standard). */
     yylval->string_value_->push_back('\'');
   }
 	YY_BREAK
-case 151:
+case 152:
 YY_RULE_SETUP
-#line 402 "../SqlLexer.lpp"
+#line 403 "../SqlLexer.lpp"
 {
     /* End string */
     BEGIN(CONDITION_SQL);
@@ -2369,17 +2528,17 @@
 	YY_BREAK
 
 
-case 152:
+case 153:
 YY_RULE_SETUP
-#line 410 "../SqlLexer.lpp"
+#line 411 "../SqlLexer.lpp"
 {
     /* Two quotes in a row become a single quote (this is specified by the SQL standard). */
     yylval->string_value_->push_back('"');
   }
 	YY_BREAK
-case 153:
+case 154:
 YY_RULE_SETUP
-#line 414 "../SqlLexer.lpp"
+#line 415 "../SqlLexer.lpp"
 {
     /* End string */
     BEGIN(CONDITION_SQL);
@@ -2387,94 +2546,94 @@
   }
 	YY_BREAK
 
-case 154:
-/* rule 154 can match eol */
-YY_RULE_SETUP
-#line 421 "../SqlLexer.lpp"
-{
-  /* Scan up to a quote. */
-  yylval->string_value_->append(yytext, yyleng);
-}
-	YY_BREAK
 case 155:
 /* rule 155 can match eol */
 YY_RULE_SETUP
-#line 426 "../SqlLexer.lpp"
+#line 422 "../SqlLexer.lpp"
 {
-  /* Scan up to a quote or escape sequence. */
+  /* Scan up to a quote. */
   yylval->string_value_->append(yytext, yyleng);
 }
 	YY_BREAK
 case 156:
 /* rule 156 can match eol */
 YY_RULE_SETUP
-#line 431 "../SqlLexer.lpp"
+#line 427 "../SqlLexer.lpp"
+{
+  /* Scan up to a quote or escape sequence. */
+  yylval->string_value_->append(yytext, yyleng);
+}
+	YY_BREAK
+case 157:
+/* rule 157 can match eol */
+YY_RULE_SETUP
+#line 432 "../SqlLexer.lpp"
 {
   /* Scan up to a quote. */
   yylval->string_value_->append(yytext, yyleng);
 }
 	YY_BREAK
 
-case 157:
+case 158:
 YY_RULE_SETUP
-#line 437 "../SqlLexer.lpp"
+#line 438 "../SqlLexer.lpp"
 {
     yylval->string_value_ = new quickstep::ParseString(
         yylloc->first_line, yylloc->first_column, std::string(yytext, yyleng));
     return TOKEN_NAME;
   }
 	YY_BREAK
-case 158:
+case 159:
 YY_RULE_SETUP
-#line 443 "../SqlLexer.lpp"
+#line 444 "../SqlLexer.lpp"
 {
     yylval->numeric_literal_value_ = new quickstep::NumericParseLiteralValue(
         yylloc->first_line, yylloc->first_column, yytext);
     return TOKEN_UNSIGNED_NUMVAL;
   }
 	YY_BREAK
-case 159:
+case 160:
 YY_RULE_SETUP
-#line 449 "../SqlLexer.lpp"
+#line 450 "../SqlLexer.lpp"
 /* comment */
 	YY_BREAK
-case 160:
-/* rule 160 can match eol */
+case 161:
+/* rule 161 can match eol */
 YY_RULE_SETUP
-#line 451 "../SqlLexer.lpp"
+#line 452 "../SqlLexer.lpp"
 { yycolumn = 0; }
 	YY_BREAK
-case 161:
+case 162:
 YY_RULE_SETUP
-#line 453 "../SqlLexer.lpp"
+#line 454 "../SqlLexer.lpp"
 ; /* ignore white space */
 	YY_BREAK
 /* CONDITION_SQL */
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(CONDITION_COMMAND):
 case YY_STATE_EOF(CONDITION_SQL):
-#line 457 "../SqlLexer.lpp"
+#line 458 "../SqlLexer.lpp"
 {
   /* All conditions except for mutli-state string extracting conditions. */
   BEGIN(INITIAL);
   return TOKEN_EOF;
 }
 	YY_BREAK
-case 162:
+case 163:
 YY_RULE_SETUP
-#line 463 "../SqlLexer.lpp"
+#line 464 "../SqlLexer.lpp"
 {
   BEGIN(INITIAL);
   quickstep_yyerror(NULL, yyscanner, NULL, "illegal character");
   return TOKEN_LEX_ERROR;
 }
 	YY_BREAK
-case 163:
+case 164:
 YY_RULE_SETUP
-#line 469 "../SqlLexer.lpp"
+#line 470 "../SqlLexer.lpp"
 YY_FATAL_ERROR( "flex scanner jammed" );
 	YY_BREAK
-#line 2477 "SqlLexer_gen.cpp"
+#line 2636 "SqlLexer_gen.cpp"
 
 	case YY_END_OF_BUFFER:
 		{
@@ -2490,7 +2649,7 @@
 			/* We're scanning a new file or input source.  It's
 			 * possible that this happened because the user
 			 * just pointed yyin at a new source and called
-			 * quickstep_yylex().  If so, then we have to assure
+			 * yylex().  If so, then we have to assure
 			 * consistency between YY_CURRENT_BUFFER and our
 			 * globals.  Here is the right place to do so, because
 			 * this is the first action (other than possibly a
@@ -2551,7 +2710,7 @@
 				{
 				yyg->yy_did_buffer_switch_on_eof = 0;
 
-				if ( quickstep_yywrap(yyscanner ) )
+				if ( yywrap( yyscanner ) )
 					{
 					/* Note: because we've taken care in
 					 * yy_get_next_buffer() to have set up
@@ -2605,7 +2764,7 @@
 	} /* end of action switch */
 		} /* end of scanning one token */
 	} /* end of user's declarations */
-} /* end of quickstep_yylex */
+} /* end of yylex */
 
 /* yy_get_next_buffer - try to read in a new buffer
  *
@@ -2684,7 +2843,8 @@
 
 				b->yy_ch_buf = (char *)
 					/* Include room in for 2 EOB chars. */
-					quickstep_yyrealloc((void *) b->yy_ch_buf,(yy_size_t) (b->yy_buf_size + 2) ,yyscanner );
+					yyrealloc( (void *) b->yy_ch_buf,
+							 (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
 				}
 			else
 				/* Can't grow it, we don't own it. */
@@ -2716,7 +2876,7 @@
 		if ( number_to_move == YY_MORE_ADJ )
 			{
 			ret_val = EOB_ACT_END_OF_FILE;
-			quickstep_yyrestart(yyin  ,yyscanner);
+			yyrestart( yyin  , yyscanner);
 			}
 
 		else
@@ -2733,9 +2893,12 @@
 	if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
 		/* Extend the array by 50%, plus the number we really need. */
 		int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
-		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) quickstep_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,(yy_size_t) new_size ,yyscanner );
+		YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+			(void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner );
 		if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
 			YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+		/* "- 2" to take care of EOB's */
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
 	}
 
 	yyg->yy_n_chars += number_to_move;
@@ -2768,7 +2931,7 @@
 		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 			{
 			yy_current_state = (int) yy_def[yy_current_state];
-			if ( yy_current_state >= 599 )
+			if ( yy_current_state >= 589 )
 				yy_c = yy_meta[yy_c];
 			}
 		yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -2797,11 +2960,11 @@
 	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 		{
 		yy_current_state = (int) yy_def[yy_current_state];
-		if ( yy_current_state >= 599 )
+		if ( yy_current_state >= 589 )
 			yy_c = yy_meta[yy_c];
 		}
 	yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
-	yy_is_jam = (yy_current_state == 598);
+	yy_is_jam = (yy_current_state == 588);
 
 	(void)yyg;
 	return yy_is_jam ? 0 : yy_current_state;
@@ -2853,13 +3016,13 @@
 					 */
 
 					/* Reset buffer status. */
-					quickstep_yyrestart(yyin ,yyscanner);
+					yyrestart( yyin , yyscanner);
 
 					/*FALLTHROUGH*/
 
 				case EOB_ACT_END_OF_FILE:
 					{
-					if ( quickstep_yywrap(yyscanner ) )
+					if ( yywrap( yyscanner ) )
 						return 0;
 
 					if ( ! yyg->yy_did_buffer_switch_on_eof )
@@ -2898,34 +3061,34 @@
  * @param yyscanner The scanner object.
  * @note This function does not reset the start condition to @c INITIAL .
  */
-    void quickstep_yyrestart  (FILE * input_file , yyscan_t yyscanner)
+    void yyrestart  (FILE * input_file , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
 	if ( ! YY_CURRENT_BUFFER ){
-        quickstep_yyensure_buffer_stack (yyscanner);
+        yyensure_buffer_stack (yyscanner);
 		YY_CURRENT_BUFFER_LVALUE =
-            quickstep_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+            yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner);
 	}
 
-	quickstep_yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);
-	quickstep_yy_load_buffer_state(yyscanner );
+	yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner);
+	yy_load_buffer_state( yyscanner );
 }
 
 /** Switch to a different input buffer.
  * @param new_buffer The new input buffer.
  * @param yyscanner The scanner object.
  */
-    void quickstep_yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer , yyscan_t yyscanner)
+    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
 	/* TODO. We should be able to replace this entire function body
 	 * with
-	 *		quickstep_yypop_buffer_state();
-	 *		quickstep_yypush_buffer_state(new_buffer);
+	 *		yypop_buffer_state();
+	 *		yypush_buffer_state(new_buffer);
      */
-	quickstep_yyensure_buffer_stack (yyscanner);
+	yyensure_buffer_stack (yyscanner);
 	if ( YY_CURRENT_BUFFER == new_buffer )
 		return;
 
@@ -2938,17 +3101,17 @@
 		}
 
 	YY_CURRENT_BUFFER_LVALUE = new_buffer;
-	quickstep_yy_load_buffer_state(yyscanner );
+	yy_load_buffer_state( yyscanner );
 
 	/* We don't actually know whether we did this switch during
-	 * EOF (quickstep_yywrap()) processing, but the only time this flag
-	 * is looked at is after quickstep_yywrap() is called, so it's safe
+	 * EOF (yywrap()) processing, but the only time this flag
+	 * is looked at is after yywrap() is called, so it's safe
 	 * to go ahead and always set it.
 	 */
 	yyg->yy_did_buffer_switch_on_eof = 1;
 }
 
-static void quickstep_yy_load_buffer_state  (yyscan_t yyscanner)
+static void yy_load_buffer_state  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 	yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
@@ -2963,35 +3126,35 @@
  * @param yyscanner The scanner object.
  * @return the allocated buffer state.
  */
-    YY_BUFFER_STATE quickstep_yy_create_buffer  (FILE * file, int  size , yyscan_t yyscanner)
+    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size , yyscan_t yyscanner)
 {
 	YY_BUFFER_STATE b;
     
-	b = (YY_BUFFER_STATE) quickstep_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
+	b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
 	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in quickstep_yy_create_buffer()" );
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
 
 	b->yy_buf_size = size;
 
 	/* yy_ch_buf has to be 2 characters longer than the size given because
 	 * we need to put in 2 end-of-buffer characters.
 	 */
-	b->yy_ch_buf = (char *) quickstep_yyalloc((yy_size_t) (b->yy_buf_size + 2) ,yyscanner );
+	b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner );
 	if ( ! b->yy_ch_buf )
-		YY_FATAL_ERROR( "out of dynamic memory in quickstep_yy_create_buffer()" );
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
 
 	b->yy_is_our_buffer = 1;
 
-	quickstep_yy_init_buffer(b,file ,yyscanner);
+	yy_init_buffer( b, file , yyscanner);
 
 	return b;
 }
 
 /** Destroy the buffer.
- * @param b a buffer created with quickstep_yy_create_buffer()
+ * @param b a buffer created with yy_create_buffer()
  * @param yyscanner The scanner object.
  */
-    void quickstep_yy_delete_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
+    void yy_delete_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
@@ -3002,28 +3165,28 @@
 		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
 
 	if ( b->yy_is_our_buffer )
-		quickstep_yyfree((void *) b->yy_ch_buf ,yyscanner );
+		yyfree( (void *) b->yy_ch_buf , yyscanner );
 
-	quickstep_yyfree((void *) b ,yyscanner );
+	yyfree( (void *) b , yyscanner );
 }
 
 /* Initializes or reinitializes a buffer.
  * This function is sometimes called more than once on the same buffer,
- * such as during a quickstep_yyrestart() or at EOF.
+ * such as during a yyrestart() or at EOF.
  */
-    static void quickstep_yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file , yyscan_t yyscanner)
+    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file , yyscan_t yyscanner)
 
 {
 	int oerrno = errno;
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
-	quickstep_yy_flush_buffer(b ,yyscanner);
+	yy_flush_buffer( b , yyscanner);
 
 	b->yy_input_file = file;
 	b->yy_fill_buffer = 1;
 
-    /* If b is the current buffer, then quickstep_yy_init_buffer was _probably_
-     * called from quickstep_yyrestart() or through yy_get_next_buffer.
+    /* If b is the current buffer, then yy_init_buffer was _probably_
+     * called from yyrestart() or through yy_get_next_buffer.
      * In that case, we don't want to reset the lineno or column.
      */
     if (b != YY_CURRENT_BUFFER){
@@ -3040,7 +3203,7 @@
  * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
  * @param yyscanner The scanner object.
  */
-    void quickstep_yy_flush_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
+    void yy_flush_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 	if ( ! b )
@@ -3061,7 +3224,7 @@
 	b->yy_buffer_status = YY_BUFFER_NEW;
 
 	if ( b == YY_CURRENT_BUFFER )
-		quickstep_yy_load_buffer_state(yyscanner );
+		yy_load_buffer_state( yyscanner );
 }
 
 /** Pushes the new state onto the stack. The new state becomes
@@ -3070,15 +3233,15 @@
  *  @param new_buffer The new state.
  *  @param yyscanner The scanner object.
  */
-void quickstep_yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 	if (new_buffer == NULL)
 		return;
 
-	quickstep_yyensure_buffer_stack(yyscanner);
+	yyensure_buffer_stack(yyscanner);
 
-	/* This block is copied from quickstep_yy_switch_to_buffer. */
+	/* This block is copied from yy_switch_to_buffer. */
 	if ( YY_CURRENT_BUFFER )
 		{
 		/* Flush out information for old buffer. */
@@ -3092,8 +3255,8 @@
 		yyg->yy_buffer_stack_top++;
 	YY_CURRENT_BUFFER_LVALUE = new_buffer;
 
-	/* copied from quickstep_yy_switch_to_buffer. */
-	quickstep_yy_load_buffer_state(yyscanner );
+	/* copied from yy_switch_to_buffer. */
+	yy_load_buffer_state( yyscanner );
 	yyg->yy_did_buffer_switch_on_eof = 1;
 }
 
@@ -3101,19 +3264,19 @@
  *  The next element becomes the new top.
  *  @param yyscanner The scanner object.
  */
-void quickstep_yypop_buffer_state (yyscan_t yyscanner)
+void yypop_buffer_state (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 	if (!YY_CURRENT_BUFFER)
 		return;
 
-	quickstep_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner);
+	yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner);
 	YY_CURRENT_BUFFER_LVALUE = NULL;
 	if (yyg->yy_buffer_stack_top > 0)
 		--yyg->yy_buffer_stack_top;
 
 	if (YY_CURRENT_BUFFER) {
-		quickstep_yy_load_buffer_state(yyscanner );
+		yy_load_buffer_state( yyscanner );
 		yyg->yy_did_buffer_switch_on_eof = 1;
 	}
 }
@@ -3121,7 +3284,7 @@
 /* Allocates the stack if it does not exist.
  *  Guarantees space for at least one push.
  */
-static void quickstep_yyensure_buffer_stack (yyscan_t yyscanner)
+static void yyensure_buffer_stack (yyscan_t yyscanner)
 {
 	yy_size_t num_to_alloc;
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
@@ -3133,11 +3296,11 @@
 		 * immediate realloc on the next call.
          */
       num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
-		yyg->yy_buffer_stack = (struct yy_buffer_state**)quickstep_yyalloc
+		yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc
 								(num_to_alloc * sizeof(struct yy_buffer_state*)
 								, yyscanner);
 		if ( ! yyg->yy_buffer_stack )
-			YY_FATAL_ERROR( "out of dynamic memory in quickstep_yyensure_buffer_stack()" );
+			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
 
 		memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
 
@@ -3152,12 +3315,12 @@
 		yy_size_t grow_size = 8 /* arbitrary grow size */;
 
 		num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
-		yyg->yy_buffer_stack = (struct yy_buffer_state**)quickstep_yyrealloc
+		yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc
 								(yyg->yy_buffer_stack,
 								num_to_alloc * sizeof(struct yy_buffer_state*)
 								, yyscanner);
 		if ( ! yyg->yy_buffer_stack )
-			YY_FATAL_ERROR( "out of dynamic memory in quickstep_yyensure_buffer_stack()" );
+			YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
 
 		/* zero only the new slots.*/
 		memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
@@ -3171,7 +3334,7 @@
  * @param yyscanner The scanner object.
  * @return the newly allocated buffer state object.
  */
-YY_BUFFER_STATE quickstep_yy_scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner)
+YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner)
 {
 	YY_BUFFER_STATE b;
     
@@ -3181,9 +3344,9 @@
 		/* They forgot to leave room for the EOB's. */
 		return NULL;
 
-	b = (YY_BUFFER_STATE) quickstep_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
+	b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner );
 	if ( ! b )
-		YY_FATAL_ERROR( "out of dynamic memory in quickstep_yy_scan_buffer()" );
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
 
 	b->yy_buf_size = (int) (size - 2);	/* "- 2" to take care of EOB's */
 	b->yy_buf_pos = b->yy_ch_buf = base;
@@ -3195,33 +3358,33 @@
 	b->yy_fill_buffer = 0;
 	b->yy_buffer_status = YY_BUFFER_NEW;
 
-	quickstep_yy_switch_to_buffer(b ,yyscanner );
+	yy_switch_to_buffer( b , yyscanner );
 
 	return b;
 }
 
-/** Setup the input buffer state to scan a string. The next call to quickstep_yylex() will
+/** Setup the input buffer state to scan a string. The next call to yylex() will
  * scan from a @e copy of @a str.
  * @param yystr a NUL-terminated string to scan
  * @param yyscanner The scanner object.
  * @return the newly allocated buffer state object.
  * @note If you want to scan bytes that may contain NUL values, then use
- *       quickstep_yy_scan_bytes() instead.
+ *       yy_scan_bytes() instead.
  */
-YY_BUFFER_STATE quickstep_yy_scan_string (const char * yystr , yyscan_t yyscanner)
+YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner)
 {
     
-	return quickstep_yy_scan_bytes(yystr,(int) strlen(yystr) ,yyscanner);
+	return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner);
 }
 
-/** Setup the input buffer state to scan the given bytes. The next call to quickstep_yylex() will
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
  * scan from a @e copy of @a bytes.
  * @param yybytes the byte buffer to scan
  * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
  * @param yyscanner The scanner object.
  * @return the newly allocated buffer state object.
  */
-YY_BUFFER_STATE quickstep_yy_scan_bytes  (const char * yybytes, int  _yybytes_len , yyscan_t yyscanner)
+YY_BUFFER_STATE yy_scan_bytes  (const char * yybytes, int  _yybytes_len , yyscan_t yyscanner)
 {
 	YY_BUFFER_STATE b;
 	char *buf;
@@ -3230,18 +3393,18 @@
     
 	/* Get memory for full buffer, including space for trailing EOB's. */
 	n = (yy_size_t) (_yybytes_len + 2);
-	buf = (char *) quickstep_yyalloc(n ,yyscanner );
+	buf = (char *) yyalloc( n , yyscanner );
 	if ( ! buf )
-		YY_FATAL_ERROR( "out of dynamic memory in quickstep_yy_scan_bytes()" );
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
 
 	for ( i = 0; i < _yybytes_len; ++i )
 		buf[i] = yybytes[i];
 
 	buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
 
-	b = quickstep_yy_scan_buffer(buf,n ,yyscanner);
+	b = yy_scan_buffer( buf, n , yyscanner);
 	if ( ! b )
-		YY_FATAL_ERROR( "bad buffer in quickstep_yy_scan_bytes()" );
+		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
 
 	/* It's okay to grow etc. this buffer, and we should throw it
 	 * away when we're done.
@@ -3259,7 +3422,7 @@
 {
 	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 	(void)yyg;
-	(void) fprintf( stderr, "%s\n", msg );
+	fprintf( stderr, "%s\n", msg );
 	exit( YY_EXIT_FAILURE );
 }
 
@@ -3285,7 +3448,7 @@
 /** Get the user-defined data for this scanner.
  * @param yyscanner The scanner object.
  */
-YY_EXTRA_TYPE quickstep_yyget_extra  (yyscan_t yyscanner)
+YY_EXTRA_TYPE yyget_extra  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     return yyextra;
@@ -3294,7 +3457,7 @@
 /** Get the current line number.
  * @param yyscanner The scanner object.
  */
-int quickstep_yyget_lineno  (yyscan_t yyscanner)
+int yyget_lineno  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
@@ -3307,7 +3470,7 @@
 /** Get the current column number.
  * @param yyscanner The scanner object.
  */
-int quickstep_yyget_column  (yyscan_t yyscanner)
+int yyget_column  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
@@ -3320,7 +3483,7 @@
 /** Get the input stream.
  * @param yyscanner The scanner object.
  */
-FILE *quickstep_yyget_in  (yyscan_t yyscanner)
+FILE *yyget_in  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     return yyin;
@@ -3329,7 +3492,7 @@
 /** Get the output stream.
  * @param yyscanner The scanner object.
  */
-FILE *quickstep_yyget_out  (yyscan_t yyscanner)
+FILE *yyget_out  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     return yyout;
@@ -3338,7 +3501,7 @@
 /** Get the length of the current token.
  * @param yyscanner The scanner object.
  */
-int quickstep_yyget_leng  (yyscan_t yyscanner)
+int yyget_leng  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     return yyleng;
@@ -3348,7 +3511,7 @@
  * @param yyscanner The scanner object.
  */
 
-char *quickstep_yyget_text  (yyscan_t yyscanner)
+char *yyget_text  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     return yytext;
@@ -3358,7 +3521,7 @@
  * @param user_defined The data to be associated with this scanner.
  * @param yyscanner The scanner object.
  */
-void quickstep_yyset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)
+void yyset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     yyextra = user_defined ;
@@ -3368,13 +3531,13 @@
  * @param _line_number line number
  * @param yyscanner The scanner object.
  */
-void quickstep_yyset_lineno (int  _line_number , yyscan_t yyscanner)
+void yyset_lineno (int  _line_number , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
         /* lineno is only valid if an input buffer exists. */
         if (! YY_CURRENT_BUFFER )
-           YY_FATAL_ERROR( "quickstep_yyset_lineno called with no buffer" );
+           YY_FATAL_ERROR( "yyset_lineno called with no buffer" );
     
     yylineno = _line_number;
 }
@@ -3383,13 +3546,13 @@
  * @param _column_no column number
  * @param yyscanner The scanner object.
  */
-void quickstep_yyset_column (int  _column_no , yyscan_t yyscanner)
+void yyset_column (int  _column_no , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
         /* column is only valid if an input buffer exists. */
         if (! YY_CURRENT_BUFFER )
-           YY_FATAL_ERROR( "quickstep_yyset_column called with no buffer" );
+           YY_FATAL_ERROR( "yyset_column called with no buffer" );
     
     yycolumn = _column_no;
 }
@@ -3398,27 +3561,27 @@
  * input buffer.
  * @param _in_str A readable stream.
  * @param yyscanner The scanner object.
- * @see quickstep_yy_switch_to_buffer
+ * @see yy_switch_to_buffer
  */
-void quickstep_yyset_in (FILE *  _in_str , yyscan_t yyscanner)
+void yyset_in (FILE *  _in_str , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     yyin = _in_str ;
 }
 
-void quickstep_yyset_out (FILE *  _out_str , yyscan_t yyscanner)
+void yyset_out (FILE *  _out_str , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     yyout = _out_str ;
 }
 
-int quickstep_yyget_debug  (yyscan_t yyscanner)
+int yyget_debug  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     return yy_flex_debug;
 }
 
-void quickstep_yyset_debug (int  _bdebug , yyscan_t yyscanner)
+void yyset_debug (int  _bdebug , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     yy_flex_debug = _bdebug ;
@@ -3426,25 +3589,25 @@
 
 /* Accessor methods for yylval and yylloc */
 
-YYSTYPE * quickstep_yyget_lval  (yyscan_t yyscanner)
+YYSTYPE * yyget_lval  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     return yylval;
 }
 
-void quickstep_yyset_lval (YYSTYPE *  yylval_param , yyscan_t yyscanner)
+void yyset_lval (YYSTYPE *  yylval_param , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     yylval = yylval_param;
 }
 
-YYLTYPE *quickstep_yyget_lloc  (yyscan_t yyscanner)
+YYLTYPE *yyget_lloc  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     return yylloc;
 }
     
-void quickstep_yyset_lloc (YYLTYPE *  yylloc_param , yyscan_t yyscanner)
+void yyset_lloc (YYLTYPE *  yylloc_param , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     yylloc = yylloc_param;
@@ -3452,18 +3615,18 @@
     
 /* User-visible API */
 
-/* quickstep_yylex_init is special because it creates the scanner itself, so it is
+/* yylex_init is special because it creates the scanner itself, so it is
  * the ONLY reentrant function that doesn't take the scanner as the last argument.
  * That's why we explicitly handle the declaration, instead of using our macros.
  */
-int quickstep_yylex_init(yyscan_t* ptr_yy_globals)
+int yylex_init(yyscan_t* ptr_yy_globals)
 {
     if (ptr_yy_globals == NULL){
         errno = EINVAL;
         return 1;
     }
 
-    *ptr_yy_globals = (yyscan_t) quickstep_yyalloc ( sizeof( struct yyguts_t ), NULL );
+    *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL );
 
     if (*ptr_yy_globals == NULL){
         errno = ENOMEM;
@@ -3476,25 +3639,25 @@
     return yy_init_globals ( *ptr_yy_globals );
 }
 
-/* quickstep_yylex_init_extra has the same functionality as quickstep_yylex_init, but follows the
+/* yylex_init_extra has the same functionality as yylex_init, but follows the
  * convention of taking the scanner as the last argument. Note however, that
  * this is a *pointer* to a scanner, as it will be allocated by this call (and
  * is the reason, too, why this function also must handle its own declaration).
- * The user defined value in the first argument will be available to quickstep_yyalloc in
+ * The user defined value in the first argument will be available to yyalloc in
  * the yyextra field.
  */
-int quickstep_yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )
+int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals )
 {
     struct yyguts_t dummy_yyguts;
 
-    quickstep_yyset_extra (yy_user_defined, &dummy_yyguts);
+    yyset_extra (yy_user_defined, &dummy_yyguts);
 
     if (ptr_yy_globals == NULL){
         errno = EINVAL;
         return 1;
     }
 
-    *ptr_yy_globals = (yyscan_t) quickstep_yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
+    *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
 
     if (*ptr_yy_globals == NULL){
         errno = ENOMEM;
@@ -3505,7 +3668,7 @@
     yy_init_globals. Leave at 0x00 for releases. */
     memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
 
-    quickstep_yyset_extra (yy_user_defined, *ptr_yy_globals);
+    yyset_extra (yy_user_defined, *ptr_yy_globals);
 
     return yy_init_globals ( *ptr_yy_globals );
 }
@@ -3514,7 +3677,7 @@
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     /* Initialization is the same as for the non-reentrant scanner.
-     * This function is called from quickstep_yylex_destroy(), so don't allocate here.
+     * This function is called from yylex_destroy(), so don't allocate here.
      */
 
     yyg->yy_buffer_stack = NULL;
@@ -3538,37 +3701,37 @@
 #endif
 
     /* For future reference: Set errno on error, since we are called by
-     * quickstep_yylex_init()
+     * yylex_init()
      */
     return 0;
 }
 
-/* quickstep_yylex_destroy is for both reentrant and non-reentrant scanners. */
-int quickstep_yylex_destroy  (yyscan_t yyscanner)
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
     /* Pop the buffer stack, destroying each element. */
 	while(YY_CURRENT_BUFFER){
-		quickstep_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner );
+		yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner );
 		YY_CURRENT_BUFFER_LVALUE = NULL;
-		quickstep_yypop_buffer_state(yyscanner);
+		yypop_buffer_state(yyscanner);
 	}
 
 	/* Destroy the stack itself. */
-	quickstep_yyfree(yyg->yy_buffer_stack ,yyscanner);
+	yyfree(yyg->yy_buffer_stack , yyscanner);
 	yyg->yy_buffer_stack = NULL;
 
     /* Destroy the start condition stack. */
-        quickstep_yyfree(yyg->yy_start_stack ,yyscanner );
+        yyfree( yyg->yy_start_stack , yyscanner );
         yyg->yy_start_stack = NULL;
 
     /* Reset the globals. This is important in a non-reentrant scanner so the next time
-     * quickstep_yylex() is called, initialization will occur. */
+     * yylex() is called, initialization will occur. */
     yy_init_globals( yyscanner);
 
     /* Destroy the main struct (reentrant only). */
-    quickstep_yyfree ( yyscanner , yyscanner );
+    yyfree ( yyscanner , yyscanner );
     yyscanner = NULL;
     return 0;
 }
@@ -3600,14 +3763,14 @@
 }
 #endif
 
-void *quickstep_yyalloc (yy_size_t  size , yyscan_t yyscanner)
+void *yyalloc (yy_size_t  size , yyscan_t yyscanner)
 {
 	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 	(void)yyg;
 	return malloc(size);
 }
 
-void *quickstep_yyrealloc  (void * ptr, yy_size_t  size , yyscan_t yyscanner)
+void *yyrealloc  (void * ptr, yy_size_t  size , yyscan_t yyscanner)
 {
 	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 	(void)yyg;
@@ -3622,15 +3785,15 @@
 	return realloc(ptr, size);
 }
 
-void quickstep_yyfree (void * ptr , yyscan_t yyscanner)
+void yyfree (void * ptr , yyscan_t yyscanner)
 {
 	struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 	(void)yyg;
-	free( (char *) ptr );	/* see quickstep_yyrealloc() for (char *) cast */
+	free( (char *) ptr );	/* see yyrealloc() for (char *) cast */
 }
 
 #define YYTABLES_NAME "yytables"
 
-#line 469 "../SqlLexer.lpp"
+#line 470 "../SqlLexer.lpp"
 
 
diff --git a/parser/preprocessed/SqlLexer_gen.hpp b/parser/preprocessed/SqlLexer_gen.hpp
index 86e36f0..5fafae5 100644
--- a/parser/preprocessed/SqlLexer_gen.hpp
+++ b/parser/preprocessed/SqlLexer_gen.hpp
@@ -13,88 +13,244 @@
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 6
-#define YY_FLEX_SUBMINOR_VERSION 3
+#define YY_FLEX_SUBMINOR_VERSION 4
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
 
-    #define yy_create_buffer quickstep_yy_create_buffer
+#ifdef yy_create_buffer
+#define quickstep_yy_create_buffer_ALREADY_DEFINED
+#else
+#define yy_create_buffer quickstep_yy_create_buffer
+#endif
 
-    #define yy_delete_buffer quickstep_yy_delete_buffer
+#ifdef yy_delete_buffer
+#define quickstep_yy_delete_buffer_ALREADY_DEFINED
+#else
+#define yy_delete_buffer quickstep_yy_delete_buffer
+#endif
 
-    #define yy_scan_buffer quickstep_yy_scan_buffer
+#ifdef yy_scan_buffer
+#define quickstep_yy_scan_buffer_ALREADY_DEFINED
+#else
+#define yy_scan_buffer quickstep_yy_scan_buffer
+#endif
 
-    #define yy_scan_string quickstep_yy_scan_string
+#ifdef yy_scan_string
+#define quickstep_yy_scan_string_ALREADY_DEFINED
+#else
+#define yy_scan_string quickstep_yy_scan_string
+#endif
 
-    #define yy_scan_bytes quickstep_yy_scan_bytes
+#ifdef yy_scan_bytes
+#define quickstep_yy_scan_bytes_ALREADY_DEFINED
+#else
+#define yy_scan_bytes quickstep_yy_scan_bytes
+#endif
 
-    #define yy_init_buffer quickstep_yy_init_buffer
+#ifdef yy_init_buffer
+#define quickstep_yy_init_buffer_ALREADY_DEFINED
+#else
+#define yy_init_buffer quickstep_yy_init_buffer
+#endif
 
-    #define yy_flush_buffer quickstep_yy_flush_buffer
+#ifdef yy_flush_buffer
+#define quickstep_yy_flush_buffer_ALREADY_DEFINED
+#else
+#define yy_flush_buffer quickstep_yy_flush_buffer
+#endif
 
-    #define yy_load_buffer_state quickstep_yy_load_buffer_state
+#ifdef yy_load_buffer_state
+#define quickstep_yy_load_buffer_state_ALREADY_DEFINED
+#else
+#define yy_load_buffer_state quickstep_yy_load_buffer_state
+#endif
 
-    #define yy_switch_to_buffer quickstep_yy_switch_to_buffer
+#ifdef yy_switch_to_buffer
+#define quickstep_yy_switch_to_buffer_ALREADY_DEFINED
+#else
+#define yy_switch_to_buffer quickstep_yy_switch_to_buffer
+#endif
 
-    #define yypush_buffer_state quickstep_yypush_buffer_state
+#ifdef yypush_buffer_state
+#define quickstep_yypush_buffer_state_ALREADY_DEFINED
+#else
+#define yypush_buffer_state quickstep_yypush_buffer_state
+#endif
 
-    #define yypop_buffer_state quickstep_yypop_buffer_state
+#ifdef yypop_buffer_state
+#define quickstep_yypop_buffer_state_ALREADY_DEFINED
+#else
+#define yypop_buffer_state quickstep_yypop_buffer_state
+#endif
 
-    #define yyensure_buffer_stack quickstep_yyensure_buffer_stack
+#ifdef yyensure_buffer_stack
+#define quickstep_yyensure_buffer_stack_ALREADY_DEFINED
+#else
+#define yyensure_buffer_stack quickstep_yyensure_buffer_stack
+#endif
 
-    #define yylex quickstep_yylex
+#ifdef yylex
+#define quickstep_yylex_ALREADY_DEFINED
+#else
+#define yylex quickstep_yylex
+#endif
 
-    #define yyrestart quickstep_yyrestart
+#ifdef yyrestart
+#define quickstep_yyrestart_ALREADY_DEFINED
+#else
+#define yyrestart quickstep_yyrestart
+#endif
 
-    #define yylex_init quickstep_yylex_init
+#ifdef yylex_init
+#define quickstep_yylex_init_ALREADY_DEFINED
+#else
+#define yylex_init quickstep_yylex_init
+#endif
 
-    #define yylex_init_extra quickstep_yylex_init_extra
+#ifdef yylex_init_extra
+#define quickstep_yylex_init_extra_ALREADY_DEFINED
+#else
+#define yylex_init_extra quickstep_yylex_init_extra
+#endif
 
-    #define yylex_destroy quickstep_yylex_destroy
+#ifdef yylex_destroy
+#define quickstep_yylex_destroy_ALREADY_DEFINED
+#else
+#define yylex_destroy quickstep_yylex_destroy
+#endif
 
-    #define yyget_debug quickstep_yyget_debug
+#ifdef yyget_debug
+#define quickstep_yyget_debug_ALREADY_DEFINED
+#else
+#define yyget_debug quickstep_yyget_debug
+#endif
 
-    #define yyset_debug quickstep_yyset_debug
+#ifdef yyset_debug
+#define quickstep_yyset_debug_ALREADY_DEFINED
+#else
+#define yyset_debug quickstep_yyset_debug
+#endif
 
-    #define yyget_extra quickstep_yyget_extra
+#ifdef yyget_extra
+#define quickstep_yyget_extra_ALREADY_DEFINED
+#else
+#define yyget_extra quickstep_yyget_extra
+#endif
 
-    #define yyset_extra quickstep_yyset_extra
+#ifdef yyset_extra
+#define quickstep_yyset_extra_ALREADY_DEFINED
+#else
+#define yyset_extra quickstep_yyset_extra
+#endif
 
-    #define yyget_in quickstep_yyget_in
+#ifdef yyget_in
+#define quickstep_yyget_in_ALREADY_DEFINED
+#else
+#define yyget_in quickstep_yyget_in
+#endif
 
-    #define yyset_in quickstep_yyset_in
+#ifdef yyset_in
+#define quickstep_yyset_in_ALREADY_DEFINED
+#else
+#define yyset_in quickstep_yyset_in
+#endif
 
-    #define yyget_out quickstep_yyget_out
+#ifdef yyget_out
+#define quickstep_yyget_out_ALREADY_DEFINED
+#else
+#define yyget_out quickstep_yyget_out
+#endif
 
-    #define yyset_out quickstep_yyset_out
+#ifdef yyset_out
+#define quickstep_yyset_out_ALREADY_DEFINED
+#else
+#define yyset_out quickstep_yyset_out
+#endif
 
-    #define yyget_leng quickstep_yyget_leng
+#ifdef yyget_leng
+#define quickstep_yyget_leng_ALREADY_DEFINED
+#else
+#define yyget_leng quickstep_yyget_leng
+#endif
 
-    #define yyget_text quickstep_yyget_text
+#ifdef yyget_text
+#define quickstep_yyget_text_ALREADY_DEFINED
+#else
+#define yyget_text quickstep_yyget_text
+#endif
 
-    #define yyget_lineno quickstep_yyget_lineno
+#ifdef yyget_lineno
+#define quickstep_yyget_lineno_ALREADY_DEFINED
+#else
+#define yyget_lineno quickstep_yyget_lineno
+#endif
 
-    #define yyset_lineno quickstep_yyset_lineno
+#ifdef yyset_lineno
+#define quickstep_yyset_lineno_ALREADY_DEFINED
+#else
+#define yyset_lineno quickstep_yyset_lineno
+#endif
 
-        #define yyget_column quickstep_yyget_column
+#ifdef yyget_column
+#define quickstep_yyget_column_ALREADY_DEFINED
+#else
+#define yyget_column quickstep_yyget_column
+#endif
 
-        #define yyset_column quickstep_yyset_column
+#ifdef yyset_column
+#define quickstep_yyset_column_ALREADY_DEFINED
+#else
+#define yyset_column quickstep_yyset_column
+#endif
 
-    #define yywrap quickstep_yywrap
+#ifdef yywrap
+#define quickstep_yywrap_ALREADY_DEFINED
+#else
+#define yywrap quickstep_yywrap
+#endif
 
-    #define yyget_lval quickstep_yyget_lval
+#ifdef yyget_lval
+#define quickstep_yyget_lval_ALREADY_DEFINED
+#else
+#define yyget_lval quickstep_yyget_lval
+#endif
 
-    #define yyset_lval quickstep_yyset_lval
+#ifdef yyset_lval
+#define quickstep_yyset_lval_ALREADY_DEFINED
+#else
+#define yyset_lval quickstep_yyset_lval
+#endif
 
-    #define yyget_lloc quickstep_yyget_lloc
+#ifdef yyget_lloc
+#define quickstep_yyget_lloc_ALREADY_DEFINED
+#else
+#define yyget_lloc quickstep_yyget_lloc
+#endif
 
-    #define yyset_lloc quickstep_yyset_lloc
+#ifdef yyset_lloc
+#define quickstep_yyset_lloc_ALREADY_DEFINED
+#else
+#define yyset_lloc quickstep_yyset_lloc
+#endif
 
-    #define yyalloc quickstep_yyalloc
+#ifdef yyalloc
+#define quickstep_yyalloc_ALREADY_DEFINED
+#else
+#define yyalloc quickstep_yyalloc
+#endif
 
-    #define yyrealloc quickstep_yyrealloc
+#ifdef yyrealloc
+#define quickstep_yyrealloc_ALREADY_DEFINED
+#else
+#define yyrealloc quickstep_yyrealloc
+#endif
 
-    #define yyfree quickstep_yyfree
+#ifdef yyfree
+#define quickstep_yyfree_ALREADY_DEFINED
+#else
+#define yyfree quickstep_yyfree
+#endif
 
 /* First, we deal with  platform-specific or compiler-specific issues. */
 
@@ -166,10 +322,16 @@
 #define UINT32_MAX             (4294967295U)
 #endif
 
+#ifndef SIZE_MAX
+#define SIZE_MAX               (~(size_t)0)
+#endif
+
 #endif /* ! C99 */
 
 #endif /* ! FLEXINT_H */
 
+/* begin standard C++ headers. */
+
 /* TODO: this is always defined, so inline it */
 #define yyconst const
 
@@ -270,21 +432,21 @@
 	};
 #endif /* !YY_STRUCT_YY_BUFFER_STATE */
 
-void quickstep_yyrestart ( FILE *input_file , yyscan_t yyscanner );
-void quickstep_yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
-YY_BUFFER_STATE quickstep_yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
-void quickstep_yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
-void quickstep_yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
-void quickstep_yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
-void quickstep_yypop_buffer_state ( yyscan_t yyscanner );
+void yyrestart ( FILE *input_file , yyscan_t yyscanner );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner );
+void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner );
+void yypop_buffer_state ( yyscan_t yyscanner );
 
-YY_BUFFER_STATE quickstep_yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
-YY_BUFFER_STATE quickstep_yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
-YY_BUFFER_STATE quickstep_yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner );
 
-void *quickstep_yyalloc ( yy_size_t , yyscan_t yyscanner );
-void *quickstep_yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );
-void quickstep_yyfree ( void * , yyscan_t yyscanner );
+void *yyalloc ( yy_size_t , yyscan_t yyscanner );
+void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner );
+void yyfree ( void * , yyscan_t yyscanner );
 
 /* Begin user sect3 */
 
@@ -315,50 +477,50 @@
 #define YY_EXTRA_TYPE void *
 #endif
 
-int quickstep_yylex_init (yyscan_t* scanner);
+int yylex_init (yyscan_t* scanner);
 
-int quickstep_yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);
+int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner);
 
 /* Accessor methods to globals.
    These are made visible to non-reentrant scanners for convenience. */
 
-int quickstep_yylex_destroy ( yyscan_t yyscanner );
+int yylex_destroy ( yyscan_t yyscanner );
 
-int quickstep_yyget_debug ( yyscan_t yyscanner );
+int yyget_debug ( yyscan_t yyscanner );
 
-void quickstep_yyset_debug ( int debug_flag , yyscan_t yyscanner );
+void yyset_debug ( int debug_flag , yyscan_t yyscanner );
 
-YY_EXTRA_TYPE quickstep_yyget_extra ( yyscan_t yyscanner );
+YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner );
 
-void quickstep_yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );
+void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner );
 
-FILE *quickstep_yyget_in ( yyscan_t yyscanner );
+FILE *yyget_in ( yyscan_t yyscanner );
 
-void quickstep_yyset_in  ( FILE * _in_str , yyscan_t yyscanner );
+void yyset_in  ( FILE * _in_str , yyscan_t yyscanner );
 
-FILE *quickstep_yyget_out ( yyscan_t yyscanner );
+FILE *yyget_out ( yyscan_t yyscanner );
 
-void quickstep_yyset_out  ( FILE * _out_str , yyscan_t yyscanner );
+void yyset_out  ( FILE * _out_str , yyscan_t yyscanner );
 
-			int quickstep_yyget_leng ( yyscan_t yyscanner );
+			int yyget_leng ( yyscan_t yyscanner );
 
-char *quickstep_yyget_text ( yyscan_t yyscanner );
+char *yyget_text ( yyscan_t yyscanner );
 
-int quickstep_yyget_lineno ( yyscan_t yyscanner );
+int yyget_lineno ( yyscan_t yyscanner );
 
-void quickstep_yyset_lineno ( int _line_number , yyscan_t yyscanner );
+void yyset_lineno ( int _line_number , yyscan_t yyscanner );
 
-int quickstep_yyget_column  ( yyscan_t yyscanner );
+int yyget_column  ( yyscan_t yyscanner );
 
-void quickstep_yyset_column ( int _column_no , yyscan_t yyscanner );
+void yyset_column ( int _column_no , yyscan_t yyscanner );
 
-YYSTYPE * quickstep_yyget_lval ( yyscan_t yyscanner );
+YYSTYPE * yyget_lval ( yyscan_t yyscanner );
 
-void quickstep_yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
+void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner );
 
-       YYLTYPE *quickstep_yyget_lloc ( yyscan_t yyscanner );
+       YYLTYPE *yyget_lloc ( yyscan_t yyscanner );
     
-        void quickstep_yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner );
+        void yyset_lloc ( YYLTYPE * yylloc_param , yyscan_t yyscanner );
     
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
@@ -366,9 +528,9 @@
 
 #ifndef YY_SKIP_YYWRAP
 #ifdef __cplusplus
-extern "C" int quickstep_yywrap ( yyscan_t yyscanner );
+extern "C" int yywrap ( yyscan_t yyscanner );
 #else
-extern int quickstep_yywrap ( yyscan_t yyscanner );
+extern int yywrap ( yyscan_t yyscanner );
 #endif
 #endif
 
@@ -405,10 +567,10 @@
 #ifndef YY_DECL
 #define YY_DECL_IS_OURS 1
 
-extern int quickstep_yylex \
+extern int yylex \
                (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner);
 
-#define YY_DECL int quickstep_yylex \
+#define YY_DECL int yylex \
                (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner)
 #endif /* !YY_DECL */
 
@@ -426,9 +588,154 @@
 #undef YY_DECL
 #endif
 
-#line 469 "../SqlLexer.lpp"
+#ifndef quickstep_yy_create_buffer_ALREADY_DEFINED
+#undef yy_create_buffer
+#endif
+#ifndef quickstep_yy_delete_buffer_ALREADY_DEFINED
+#undef yy_delete_buffer
+#endif
+#ifndef quickstep_yy_scan_buffer_ALREADY_DEFINED
+#undef yy_scan_buffer
+#endif
+#ifndef quickstep_yy_scan_string_ALREADY_DEFINED
+#undef yy_scan_string
+#endif
+#ifndef quickstep_yy_scan_bytes_ALREADY_DEFINED
+#undef yy_scan_bytes
+#endif
+#ifndef quickstep_yy_init_buffer_ALREADY_DEFINED
+#undef yy_init_buffer
+#endif
+#ifndef quickstep_yy_flush_buffer_ALREADY_DEFINED
+#undef yy_flush_buffer
+#endif
+#ifndef quickstep_yy_load_buffer_state_ALREADY_DEFINED
+#undef yy_load_buffer_state
+#endif
+#ifndef quickstep_yy_switch_to_buffer_ALREADY_DEFINED
+#undef yy_switch_to_buffer
+#endif
+#ifndef quickstep_yypush_buffer_state_ALREADY_DEFINED
+#undef yypush_buffer_state
+#endif
+#ifndef quickstep_yypop_buffer_state_ALREADY_DEFINED
+#undef yypop_buffer_state
+#endif
+#ifndef quickstep_yyensure_buffer_stack_ALREADY_DEFINED
+#undef yyensure_buffer_stack
+#endif
+#ifndef quickstep_yylex_ALREADY_DEFINED
+#undef yylex
+#endif
+#ifndef quickstep_yyrestart_ALREADY_DEFINED
+#undef yyrestart
+#endif
+#ifndef quickstep_yylex_init_ALREADY_DEFINED
+#undef yylex_init
+#endif
+#ifndef quickstep_yylex_init_extra_ALREADY_DEFINED
+#undef yylex_init_extra
+#endif
+#ifndef quickstep_yylex_destroy_ALREADY_DEFINED
+#undef yylex_destroy
+#endif
+#ifndef quickstep_yyget_debug_ALREADY_DEFINED
+#undef yyget_debug
+#endif
+#ifndef quickstep_yyset_debug_ALREADY_DEFINED
+#undef yyset_debug
+#endif
+#ifndef quickstep_yyget_extra_ALREADY_DEFINED
+#undef yyget_extra
+#endif
+#ifndef quickstep_yyset_extra_ALREADY_DEFINED
+#undef yyset_extra
+#endif
+#ifndef quickstep_yyget_in_ALREADY_DEFINED
+#undef yyget_in
+#endif
+#ifndef quickstep_yyset_in_ALREADY_DEFINED
+#undef yyset_in
+#endif
+#ifndef quickstep_yyget_out_ALREADY_DEFINED
+#undef yyget_out
+#endif
+#ifndef quickstep_yyset_out_ALREADY_DEFINED
+#undef yyset_out
+#endif
+#ifndef quickstep_yyget_leng_ALREADY_DEFINED
+#undef yyget_leng
+#endif
+#ifndef quickstep_yyget_text_ALREADY_DEFINED
+#undef yyget_text
+#endif
+#ifndef quickstep_yyget_lineno_ALREADY_DEFINED
+#undef yyget_lineno
+#endif
+#ifndef quickstep_yyset_lineno_ALREADY_DEFINED
+#undef yyset_lineno
+#endif
+#ifndef quickstep_yyget_column_ALREADY_DEFINED
+#undef yyget_column
+#endif
+#ifndef quickstep_yyset_column_ALREADY_DEFINED
+#undef yyset_column
+#endif
+#ifndef quickstep_yywrap_ALREADY_DEFINED
+#undef yywrap
+#endif
+#ifndef quickstep_yyget_lval_ALREADY_DEFINED
+#undef yyget_lval
+#endif
+#ifndef quickstep_yyset_lval_ALREADY_DEFINED
+#undef yyset_lval
+#endif
+#ifndef quickstep_yyget_lloc_ALREADY_DEFINED
+#undef yyget_lloc
+#endif
+#ifndef quickstep_yyset_lloc_ALREADY_DEFINED
+#undef yyset_lloc
+#endif
+#ifndef quickstep_yyalloc_ALREADY_DEFINED
+#undef yyalloc
+#endif
+#ifndef quickstep_yyrealloc_ALREADY_DEFINED
+#undef yyrealloc
+#endif
+#ifndef quickstep_yyfree_ALREADY_DEFINED
+#undef yyfree
+#endif
+#ifndef quickstep_yytext_ALREADY_DEFINED
+#undef yytext
+#endif
+#ifndef quickstep_yyleng_ALREADY_DEFINED
+#undef yyleng
+#endif
+#ifndef quickstep_yyin_ALREADY_DEFINED
+#undef yyin
+#endif
+#ifndef quickstep_yyout_ALREADY_DEFINED
+#undef yyout
+#endif
+#ifndef quickstep_yy_flex_debug_ALREADY_DEFINED
+#undef yy_flex_debug
+#endif
+#ifndef quickstep_yylineno_ALREADY_DEFINED
+#undef yylineno
+#endif
+#ifndef quickstep_yytables_fload_ALREADY_DEFINED
+#undef yytables_fload
+#endif
+#ifndef quickstep_yytables_destroy_ALREADY_DEFINED
+#undef yytables_destroy
+#endif
+#ifndef quickstep_yyTABLES_NAME_ALREADY_DEFINED
+#undef yyTABLES_NAME
+#endif
+
+#line 470 "../SqlLexer.lpp"
 
 
-#line 432 "SqlLexer_gen.hpp"
+#line 739 "SqlLexer_gen.hpp"
 #undef quickstep_yyIN_HEADER
 #endif /* quickstep_yyHEADER_H */
diff --git a/parser/preprocessed/SqlParser_gen.cpp b/parser/preprocessed/SqlParser_gen.cpp
index 5cd7426..72c61dd 100644
--- a/parser/preprocessed/SqlParser_gen.cpp
+++ b/parser/preprocessed/SqlParser_gen.cpp
@@ -237,90 +237,91 @@
     TOKEN_DECIMAL = 304,
     TOKEN_DEFAULT = 305,
     TOKEN_DELETE = 306,
-    TOKEN_DELIMITER = 307,
-    TOKEN_DESC = 308,
-    TOKEN_DISTINCT = 309,
-    TOKEN_DOUBLE = 310,
-    TOKEN_DROP = 311,
-    TOKEN_ELSE = 312,
-    TOKEN_END = 313,
-    TOKEN_ESCAPE_STRINGS = 314,
-    TOKEN_EXISTS = 315,
-    TOKEN_EXTRACT = 316,
-    TOKEN_FALSE = 317,
-    TOKEN_FIRST = 318,
-    TOKEN_FLOAT = 319,
-    TOKEN_FOLLOWING = 320,
-    TOKEN_FOR = 321,
-    TOKEN_FOREIGN = 322,
-    TOKEN_FROM = 323,
-    TOKEN_FULL = 324,
-    TOKEN_GROUP = 325,
-    TOKEN_HASH = 326,
-    TOKEN_HAVING = 327,
-    TOKEN_HOUR = 328,
-    TOKEN_IN = 329,
-    TOKEN_INDEX = 330,
-    TOKEN_INNER = 331,
-    TOKEN_INSERT = 332,
-    TOKEN_INTEGER = 333,
-    TOKEN_INTERVAL = 334,
-    TOKEN_INTO = 335,
-    TOKEN_JOIN = 336,
-    TOKEN_KEY = 337,
-    TOKEN_LAST = 338,
-    TOKEN_LEFT = 339,
-    TOKEN_LIMIT = 340,
-    TOKEN_LONG = 341,
-    TOKEN_MINUTE = 342,
-    TOKEN_MONTH = 343,
-    TOKEN_NULL = 344,
-    TOKEN_NULLS = 345,
-    TOKEN_OFF = 346,
-    TOKEN_ON = 347,
-    TOKEN_ORDER = 348,
-    TOKEN_OUTER = 349,
-    TOKEN_OVER = 350,
-    TOKEN_PARTITION = 351,
-    TOKEN_PARTITIONS = 352,
-    TOKEN_PERCENT = 353,
-    TOKEN_PRECEDING = 354,
-    TOKEN_PRIMARY = 355,
-    TOKEN_PRIORITY = 356,
-    TOKEN_QUIT = 357,
-    TOKEN_RANGE = 358,
-    TOKEN_REAL = 359,
-    TOKEN_REFERENCES = 360,
-    TOKEN_RIGHT = 361,
-    TOKEN_ROW = 362,
-    TOKEN_ROW_DELIMITER = 363,
-    TOKEN_ROWS = 364,
-    TOKEN_SECOND = 365,
-    TOKEN_SELECT = 366,
-    TOKEN_SET = 367,
-    TOKEN_SMA = 368,
-    TOKEN_SMALLINT = 369,
+    TOKEN_DESC = 307,
+    TOKEN_DISTINCT = 308,
+    TOKEN_DOUBLE = 309,
+    TOKEN_DROP = 310,
+    TOKEN_ELSE = 311,
+    TOKEN_END = 312,
+    TOKEN_EXISTS = 313,
+    TOKEN_EXTRACT = 314,
+    TOKEN_FALSE = 315,
+    TOKEN_FIRST = 316,
+    TOKEN_FLOAT = 317,
+    TOKEN_FOLLOWING = 318,
+    TOKEN_FOR = 319,
+    TOKEN_FOREIGN = 320,
+    TOKEN_FROM = 321,
+    TOKEN_FULL = 322,
+    TOKEN_GROUP = 323,
+    TOKEN_HASH = 324,
+    TOKEN_HAVING = 325,
+    TOKEN_HOUR = 326,
+    TOKEN_IN = 327,
+    TOKEN_INDEX = 328,
+    TOKEN_INNER = 329,
+    TOKEN_INSERT = 330,
+    TOKEN_INTEGER = 331,
+    TOKEN_INTERVAL = 332,
+    TOKEN_INTO = 333,
+    TOKEN_JOIN = 334,
+    TOKEN_KEY = 335,
+    TOKEN_LAST = 336,
+    TOKEN_LEFT = 337,
+    TOKEN_LIMIT = 338,
+    TOKEN_LONG = 339,
+    TOKEN_MINUTE = 340,
+    TOKEN_MONTH = 341,
+    TOKEN_NULL = 342,
+    TOKEN_NULLS = 343,
+    TOKEN_OFF = 344,
+    TOKEN_ON = 345,
+    TOKEN_ORDER = 346,
+    TOKEN_OUTER = 347,
+    TOKEN_OVER = 348,
+    TOKEN_PARTITION = 349,
+    TOKEN_PARTITIONS = 350,
+    TOKEN_PERCENT = 351,
+    TOKEN_PRECEDING = 352,
+    TOKEN_PRIMARY = 353,
+    TOKEN_PRIORITY = 354,
+    TOKEN_QUIT = 355,
+    TOKEN_RANGE = 356,
+    TOKEN_REAL = 357,
+    TOKEN_REFERENCES = 358,
+    TOKEN_RIGHT = 359,
+    TOKEN_ROW = 360,
+    TOKEN_ROW_DELIMITER = 361,
+    TOKEN_ROWS = 362,
+    TOKEN_SECOND = 363,
+    TOKEN_SELECT = 364,
+    TOKEN_SET = 365,
+    TOKEN_SMA = 366,
+    TOKEN_SMALLINT = 367,
+    TOKEN_STDERR = 368,
+    TOKEN_STDOUT = 369,
     TOKEN_SUBSTRING = 370,
     TOKEN_TABLE = 371,
     TOKEN_THEN = 372,
     TOKEN_TIME = 373,
     TOKEN_TIMESTAMP = 374,
-    TOKEN_TRUE = 375,
-    TOKEN_TUPLESAMPLE = 376,
-    TOKEN_UNBOUNDED = 377,
-    TOKEN_UNIQUE = 378,
-    TOKEN_UPDATE = 379,
-    TOKEN_USING = 380,
-    TOKEN_VALUES = 381,
-    TOKEN_VARCHAR = 382,
-    TOKEN_WHEN = 383,
-    TOKEN_WHERE = 384,
-    TOKEN_WINDOW = 385,
-    TOKEN_WITH = 386,
-    TOKEN_YEAR = 387,
-    TOKEN_YEARMONTH = 388,
-    TOKEN_EOF = 389,
-    TOKEN_LEX_ERROR = 390
+    TOKEN_TO = 375,
+    TOKEN_TRUE = 376,
+    TOKEN_TUPLESAMPLE = 377,
+    TOKEN_UNBOUNDED = 378,
+    TOKEN_UNIQUE = 379,
+    TOKEN_UPDATE = 380,
+    TOKEN_USING = 381,
+    TOKEN_VALUES = 382,
+    TOKEN_VARCHAR = 383,
+    TOKEN_WHEN = 384,
+    TOKEN_WHERE = 385,
+    TOKEN_WINDOW = 386,
+    TOKEN_WITH = 387,
+    TOKEN_YEAR = 388,
+    TOKEN_YEARMONTH = 389,
+    TOKEN_EOF = 390,
+    TOKEN_LEX_ERROR = 391
   };
 #endif
 
@@ -380,8 +381,7 @@
   quickstep::ParseKeyStringValue *key_string_value_;
   quickstep::ParseKeyStringList *key_string_list_;
   quickstep::ParseKeyIntegerValue *key_integer_value_;
-
-  quickstep::ParseCopyFromParams *copy_from_params_;
+  quickstep::ParseKeyBoolValue *key_bool_value_;
 
   quickstep::ParseAssignment *assignment_;
   quickstep::PtrList<quickstep::ParseAssignment> *assignment_list_;
@@ -394,7 +394,7 @@
   quickstep::ParseStatementUpdate *update_statement_;
   quickstep::ParseStatementInsert *insert_statement_;
   quickstep::ParseStatementDelete *delete_statement_;
-  quickstep::ParseStatementCopyFrom *copy_from_statement_;
+  quickstep::ParseStatementCopy *copy_statement_;
   quickstep::ParseStatementCreateTable *create_table_statement_;
   quickstep::ParsePartitionClause *partition_clause_;
   quickstep::ParseBlockProperties *block_properties_;
@@ -460,7 +460,7 @@
 #endif /* !YY_QUICKSTEP_YY_SQLPARSER_GEN_HPP_INCLUDED  */
 
 /* Copy the second part of user declarations.  */
-#line 223 "../SqlParser.ypp" /* yacc.c:358  */
+#line 222 "../SqlParser.ypp" /* yacc.c:358  */
 
 /* This header needs YYSTYPE, which is defined by the %union directive above */
 #include "SqlLexer_gen.hpp"
@@ -708,23 +708,23 @@
 #endif /* !YYCOPY_NEEDED */
 
 /* YYFINAL -- State number of the termination state.  */
-#define YYFINAL  49
+#define YYFINAL  50
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   1207
+#define YYLAST   1391
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  147
+#define YYNTOKENS  148
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  109
+#define YYNNTS  110
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  293
+#define YYNRULES  298
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  543
+#define YYNSTATES  550
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   390
+#define YYMAXUTOK   391
 
 #define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -734,11 +734,11 @@
 static const yytype_uint8 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-     142,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     143,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,   146,     2,     2,
-     143,   144,    23,    21,   145,    22,    27,    24,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,     2,   141,
+       2,     2,     2,     2,     2,     2,     2,   147,     2,     2,
+     144,   145,    23,    21,   146,    22,    27,    24,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,   142,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -772,43 +772,43 @@
      110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
      120,   121,   122,   123,   124,   125,   126,   127,   128,   129,
      130,   131,   132,   133,   134,   135,   136,   137,   138,   139,
-     140
+     140,   141
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   639,   639,   643,   647,   651,   655,   658,   665,   668,
-     671,   674,   677,   680,   683,   686,   689,   692,   698,   704,
-     711,   717,   724,   733,   738,   747,   752,   757,   761,   767,
-     772,   775,   778,   783,   786,   789,   792,   795,   798,   801,
-     804,   807,   810,   822,   825,   828,   846,   866,   869,   872,
-     877,   882,   888,   894,   903,   907,   913,   916,   921,   926,
-     931,   938,   945,   949,   955,   958,   963,   966,   971,   974,
-     979,   982,  1001,  1004,  1009,  1013,  1019,  1022,  1025,  1030,
-    1033,  1040,  1045,  1056,  1061,  1065,  1069,  1075,  1078,  1084,
-    1092,  1095,  1098,  1104,  1109,  1112,  1117,  1121,  1125,  1129,
-    1135,  1140,  1145,  1149,  1155,  1164,  1167,  1172,  1175,  1194,
-    1199,  1203,  1209,  1215,  1224,  1229,  1237,  1243,  1249,  1252,
-    1255,  1260,  1263,  1268,  1272,  1278,  1281,  1284,  1289,  1294,
-    1299,  1302,  1305,  1310,  1313,  1316,  1319,  1322,  1325,  1328,
-    1331,  1336,  1339,  1344,  1348,  1352,  1355,  1359,  1362,  1367,
-    1370,  1375,  1378,  1383,  1387,  1393,  1396,  1401,  1404,  1409,
-    1412,  1417,  1420,  1439,  1442,  1447,  1451,  1457,  1463,  1468,
-    1471,  1476,  1479,  1484,  1487,  1492,  1495,  1500,  1501,  1504,
-    1509,  1510,  1513,  1518,  1522,  1528,  1535,  1538,  1541,  1546,
-    1549,  1552,  1558,  1561,  1566,  1571,  1580,  1585,  1594,  1599,
-    1602,  1607,  1610,  1615,  1621,  1627,  1630,  1633,  1636,  1639,
-    1642,  1648,  1657,  1660,  1665,  1668,  1673,  1676,  1681,  1684,
-    1687,  1690,  1694,  1698,  1701,  1704,  1707,  1710,  1715,  1719,
-    1723,  1726,  1731,  1736,  1740,  1746,  1749,  1754,  1758,  1764,
-    1769,  1773,  1779,  1784,  1787,  1792,  1796,  1802,  1805,  1808,
-    1811,  1823,  1827,  1846,  1859,  1874,  1877,  1880,  1883,  1886,
-    1889,  1894,  1898,  1904,  1907,  1912,  1916,  1923,  1926,  1929,
-    1932,  1935,  1938,  1941,  1944,  1947,  1950,  1955,  1966,  1969,
-    1974,  1977,  1980,  1986,  1990,  1996,  1999,  2007,  2010,  2013,
-    2016,  2022,  2027,  2032
+       0,   640,   640,   644,   648,   652,   656,   659,   666,   669,
+     672,   675,   678,   681,   684,   687,   690,   693,   699,   705,
+     712,   718,   725,   734,   739,   748,   753,   758,   762,   768,
+     773,   776,   779,   784,   787,   790,   793,   796,   799,   802,
+     805,   808,   811,   823,   826,   829,   847,   867,   870,   873,
+     878,   883,   889,   895,   904,   908,   914,   917,   922,   927,
+     932,   939,   946,   950,   956,   959,   964,   967,   972,   975,
+     980,   983,  1002,  1005,  1010,  1014,  1020,  1023,  1026,  1029,
+    1034,  1037,  1040,  1047,  1052,  1063,  1068,  1073,  1077,  1081,
+    1087,  1090,  1096,  1104,  1107,  1110,  1116,  1121,  1126,  1130,
+    1136,  1140,  1143,  1148,  1151,  1156,  1161,  1166,  1170,  1176,
+    1185,  1188,  1193,  1196,  1215,  1220,  1224,  1230,  1236,  1245,
+    1250,  1258,  1264,  1270,  1273,  1276,  1281,  1284,  1289,  1293,
+    1299,  1302,  1305,  1310,  1315,  1320,  1323,  1326,  1331,  1334,
+    1337,  1340,  1343,  1346,  1349,  1352,  1357,  1360,  1365,  1369,
+    1373,  1376,  1380,  1383,  1388,  1391,  1396,  1399,  1404,  1408,
+    1414,  1417,  1422,  1425,  1430,  1433,  1438,  1441,  1460,  1463,
+    1468,  1472,  1478,  1484,  1489,  1492,  1497,  1500,  1505,  1508,
+    1513,  1516,  1521,  1522,  1525,  1530,  1531,  1534,  1539,  1543,
+    1549,  1556,  1559,  1562,  1567,  1570,  1573,  1579,  1582,  1587,
+    1592,  1601,  1606,  1615,  1620,  1623,  1628,  1631,  1636,  1642,
+    1648,  1651,  1654,  1657,  1660,  1663,  1669,  1678,  1681,  1686,
+    1689,  1694,  1697,  1702,  1705,  1708,  1711,  1715,  1719,  1722,
+    1725,  1728,  1731,  1736,  1740,  1744,  1747,  1752,  1757,  1761,
+    1767,  1770,  1775,  1779,  1785,  1790,  1794,  1800,  1805,  1808,
+    1813,  1817,  1823,  1826,  1829,  1832,  1844,  1848,  1867,  1880,
+    1895,  1898,  1901,  1904,  1907,  1910,  1915,  1919,  1925,  1928,
+    1933,  1937,  1944,  1947,  1950,  1953,  1956,  1959,  1962,  1965,
+    1968,  1971,  1976,  1987,  1990,  1995,  1998,  2001,  2007,  2011,
+    2017,  2020,  2028,  2031,  2034,  2037,  2043,  2048,  2053
 };
 #endif
 
@@ -830,38 +830,38 @@
   "TOKEN_CHARACTER", "TOKEN_CHECK", "TOKEN_COLUMN", "TOKEN_CONSTRAINT",
   "TOKEN_COPY", "TOKEN_CREATE", "TOKEN_CURRENT", "TOKEN_DATE",
   "TOKEN_DATETIME", "TOKEN_DAY", "TOKEN_DECIMAL", "TOKEN_DEFAULT",
-  "TOKEN_DELETE", "TOKEN_DELIMITER", "TOKEN_DESC", "TOKEN_DISTINCT",
-  "TOKEN_DOUBLE", "TOKEN_DROP", "TOKEN_ELSE", "TOKEN_END",
-  "TOKEN_ESCAPE_STRINGS", "TOKEN_EXISTS", "TOKEN_EXTRACT", "TOKEN_FALSE",
-  "TOKEN_FIRST", "TOKEN_FLOAT", "TOKEN_FOLLOWING", "TOKEN_FOR",
-  "TOKEN_FOREIGN", "TOKEN_FROM", "TOKEN_FULL", "TOKEN_GROUP", "TOKEN_HASH",
-  "TOKEN_HAVING", "TOKEN_HOUR", "TOKEN_IN", "TOKEN_INDEX", "TOKEN_INNER",
-  "TOKEN_INSERT", "TOKEN_INTEGER", "TOKEN_INTERVAL", "TOKEN_INTO",
-  "TOKEN_JOIN", "TOKEN_KEY", "TOKEN_LAST", "TOKEN_LEFT", "TOKEN_LIMIT",
-  "TOKEN_LONG", "TOKEN_MINUTE", "TOKEN_MONTH", "TOKEN_NULL", "TOKEN_NULLS",
-  "TOKEN_OFF", "TOKEN_ON", "TOKEN_ORDER", "TOKEN_OUTER", "TOKEN_OVER",
-  "TOKEN_PARTITION", "TOKEN_PARTITIONS", "TOKEN_PERCENT",
+  "TOKEN_DELETE", "TOKEN_DESC", "TOKEN_DISTINCT", "TOKEN_DOUBLE",
+  "TOKEN_DROP", "TOKEN_ELSE", "TOKEN_END", "TOKEN_EXISTS", "TOKEN_EXTRACT",
+  "TOKEN_FALSE", "TOKEN_FIRST", "TOKEN_FLOAT", "TOKEN_FOLLOWING",
+  "TOKEN_FOR", "TOKEN_FOREIGN", "TOKEN_FROM", "TOKEN_FULL", "TOKEN_GROUP",
+  "TOKEN_HASH", "TOKEN_HAVING", "TOKEN_HOUR", "TOKEN_IN", "TOKEN_INDEX",
+  "TOKEN_INNER", "TOKEN_INSERT", "TOKEN_INTEGER", "TOKEN_INTERVAL",
+  "TOKEN_INTO", "TOKEN_JOIN", "TOKEN_KEY", "TOKEN_LAST", "TOKEN_LEFT",
+  "TOKEN_LIMIT", "TOKEN_LONG", "TOKEN_MINUTE", "TOKEN_MONTH", "TOKEN_NULL",
+  "TOKEN_NULLS", "TOKEN_OFF", "TOKEN_ON", "TOKEN_ORDER", "TOKEN_OUTER",
+  "TOKEN_OVER", "TOKEN_PARTITION", "TOKEN_PARTITIONS", "TOKEN_PERCENT",
   "TOKEN_PRECEDING", "TOKEN_PRIMARY", "TOKEN_PRIORITY", "TOKEN_QUIT",
   "TOKEN_RANGE", "TOKEN_REAL", "TOKEN_REFERENCES", "TOKEN_RIGHT",
   "TOKEN_ROW", "TOKEN_ROW_DELIMITER", "TOKEN_ROWS", "TOKEN_SECOND",
   "TOKEN_SELECT", "TOKEN_SET", "TOKEN_SMA", "TOKEN_SMALLINT",
-  "TOKEN_SUBSTRING", "TOKEN_TABLE", "TOKEN_THEN", "TOKEN_TIME",
-  "TOKEN_TIMESTAMP", "TOKEN_TRUE", "TOKEN_TUPLESAMPLE", "TOKEN_UNBOUNDED",
-  "TOKEN_UNIQUE", "TOKEN_UPDATE", "TOKEN_USING", "TOKEN_VALUES",
-  "TOKEN_VARCHAR", "TOKEN_WHEN", "TOKEN_WHERE", "TOKEN_WINDOW",
-  "TOKEN_WITH", "TOKEN_YEAR", "TOKEN_YEARMONTH", "TOKEN_EOF",
-  "TOKEN_LEX_ERROR", "';'", "'\\n'", "'('", "')'", "','", "'%'", "$accept",
-  "start", "sql_statement", "quit_statement", "alter_table_statement",
-  "create_table_statement", "create_index_statement",
-  "drop_table_statement", "column_def", "column_def_commalist",
-  "data_type", "column_constraint_def", "column_constraint_def_list",
-  "opt_column_constraint_def_list", "table_constraint_def",
-  "table_constraint_def_commalist", "opt_table_constraint_def_commalist",
-  "opt_column_list", "opt_block_properties", "opt_partition_clause",
-  "partition_type", "key_value_list", "key_value", "key_string_value",
-  "key_string_list", "key_integer_value", "index_type",
-  "opt_index_properties", "insert_statement", "copy_from_statement",
-  "opt_copy_from_params", "copy_from_params", "update_statement",
+  "TOKEN_STDERR", "TOKEN_STDOUT", "TOKEN_SUBSTRING", "TOKEN_TABLE",
+  "TOKEN_THEN", "TOKEN_TIME", "TOKEN_TIMESTAMP", "TOKEN_TO", "TOKEN_TRUE",
+  "TOKEN_TUPLESAMPLE", "TOKEN_UNBOUNDED", "TOKEN_UNIQUE", "TOKEN_UPDATE",
+  "TOKEN_USING", "TOKEN_VALUES", "TOKEN_VARCHAR", "TOKEN_WHEN",
+  "TOKEN_WHERE", "TOKEN_WINDOW", "TOKEN_WITH", "TOKEN_YEAR",
+  "TOKEN_YEARMONTH", "TOKEN_EOF", "TOKEN_LEX_ERROR", "';'", "'\\n'", "'('",
+  "')'", "','", "'%'", "$accept", "start", "sql_statement",
+  "quit_statement", "alter_table_statement", "create_table_statement",
+  "create_index_statement", "drop_table_statement", "column_def",
+  "column_def_commalist", "data_type", "column_constraint_def",
+  "column_constraint_def_list", "opt_column_constraint_def_list",
+  "table_constraint_def", "table_constraint_def_commalist",
+  "opt_table_constraint_def_commalist", "opt_column_list",
+  "opt_block_properties", "opt_partition_clause", "partition_type",
+  "key_value_list", "key_value", "key_string_value", "key_string_list",
+  "key_integer_value", "key_bool_value", "index_type",
+  "opt_index_properties", "insert_statement", "copy_statement",
+  "copy_to_target", "opt_copy_params", "update_statement",
   "delete_statement", "assignment_list", "assignment_item",
   "set_operation_statement", "opt_priority_clause", "with_clause",
   "with_list", "with_list_element", "set_operation_union",
@@ -909,16 +909,16 @@
      360,   361,   362,   363,   364,   365,   366,   367,   368,   369,
      370,   371,   372,   373,   374,   375,   376,   377,   378,   379,
      380,   381,   382,   383,   384,   385,   386,   387,   388,   389,
-     390,    59,    10,    40,    41,    44,    37
+     390,   391,    59,    10,    40,    41,    44,    37
 };
 # endif
 
-#define YYPACT_NINF -244
+#define YYPACT_NINF -395
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-244)))
+  (!!((Yystate) == (-395)))
 
-#define YYTABLE_NINF -134
+#define YYTABLE_NINF -139
 
 #define yytable_value_is_error(Yytable_value) \
   0
@@ -927,61 +927,61 @@
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-     807,  -244,  -244,   -55,   203,   -26,    -2,    -6,    43,  -244,
-      86,   203,   203,  -244,   136,   125,  -244,  -244,  -244,  -244,
-    -244,  -244,  -244,  -244,  -244,  -244,   -22,    -3,   128,  -244,
-     -78,   182,   203,  -244,  -244,   130,   203,   203,   203,   203,
-     203,  -244,  -244,   633,   107,    89,  -244,   209,   120,  -244,
-    -244,  -244,   197,    -3,    86,   161,  -244,   137,  -244,  -244,
-    -244,    27,   265,   180,   141,   170,  -244,   -25,  -244,  -244,
-     301,   313,  -244,  -244,  -244,   660,   188,  -244,   249,  -244,
-    -244,   206,  -244,  -244,   357,  -244,  -244,  -244,  -244,   221,
-    -244,  -244,   222,   282,   783,   366,   299,   231,  -244,  -244,
-     272,     7,  -244,  -244,   277,  -244,  -244,  -244,  -244,  -244,
-     933,    -5,   203,   203,   237,   203,   203,  -244,   137,   374,
-    -244,   233,   239,   246,   203,   203,   551,  -244,  -244,   244,
-     203,  -244,  -244,  -244,   551,    47,    40,  -244,   376,  -244,
-     153,   153,   960,   381,  -244,     8,    24,  -244,    23,   170,
-     960,  -244,  -244,   203,   960,  -244,  -244,  -244,  -244,   960,
-      36,   313,  -244,   203,   363,    94,  -244,   378,  -244,   137,
-    -244,   144,  -244,   137,   128,  -244,   203,   -21,   203,   203,
-     248,  -244,   250,  -244,   147,  1069,   810,   237,   469,   387,
-     388,  -244,  -244,   329,   380,  1042,   152,    45,   960,    48,
-    -244,   960,  -244,   333,   257,  -244,  -244,  -244,  -244,  -244,
-    -244,   330,  -244,   168,   260,  -244,  -244,    19,    66,   146,
-    -244,   264,    66,    51,   335,  -244,  -244,     7,  -244,   304,
-    -244,  -244,   267,   960,  -244,   279,   158,   203,  -244,   960,
-    -244,   203,  -244,  -244,   270,   331,   334,   273,  -244,  -244,
-    -244,   165,   203,   290,   -21,   203,  -244,    77,  -244,  -244,
-       2,    64,   551,   551,   193,  -244,  -244,  -244,  -244,  -244,
-    -244,  -244,  -244,   960,   281,   960,    31,  -244,   162,   294,
-     960,    71,  -244,   364,   279,  -244,  -244,   960,   419,  -244,
-     110,   203,  -244,  -244,   332,  -244,   336,   337,   342,    23,
-    -244,   423,   426,    66,   392,   361,   397,   296,   343,  -244,
-     166,  -244,   960,  -244,   279,  -244,   551,   300,   302,   203,
-     437,   119,   169,  -244,   172,   421,    60,  -244,   305,   316,
-    -244,   355,   310,  1042,  -244,   368,   203,  -244,  -244,    77,
-    -244,  -244,   388,  -244,  -244,  -244,   960,   315,    95,   783,
-    -244,   279,   362,  -244,  -244,  1042,   317,   279,   960,  -244,
-      26,   -15,  -244,  -244,  -244,  -244,  -244,    23,   146,   356,
-     358,  -244,   960,   551,   365,   960,  -244,   420,   111,  -244,
-     279,     4,   203,   203,   174,  -244,  -244,  -244,  -244,  -244,
-    -244,  -244,   201,  -244,   203,  -244,  -244,  -244,  -244,   321,
-     -21,   427,   369,  -244,   551,  -244,  -244,   323,  -244,   238,
-     783,  -244,   960,   179,  -244,  -244,  1042,   279,  -244,   460,
-    -244,   384,  -244,  -244,   326,   387,   435,   394,   326,   960,
-    -244,  -244,  -244,   459,  -244,   181,   183,  -244,   480,   119,
-    -244,   203,  -244,  -244,   345,   447,  -244,     6,   203,   960,
-     185,   279,  -244,   192,   349,   551,   960,   489,   367,   353,
-    -244,   240,    12,   389,  -244,  -244,  -244,   208,  -244,  -244,
-    -244,  -244,    11,   203,    22,  -244,   359,   279,  -244,  -244,
-    -244,   387,   353,  -244,   203,  -244,   367,  -244,   960,  -244,
-    -244,   405,   404,   398,   407,   500,   203,  -244,   203,  -244,
-    -244,   203,  -244,   210,  -244,  -244,   371,  -244,   482,  -244,
-    -244,   129,  -244,  -244,  -244,  -244,    13,   373,  -244,   212,
-    -244,   203,   375,  -244,  -244,   449,   410,   454,  -244,   203,
-    -244,   214,   304,  -244,  -244,  -244,   216,   424,   383,  -244,
-     521,  -244,  -244
+     174,  -395,  -395,   -64,    85,   -26,    14,   -31,   -16,  -395,
+      40,   196,   196,  -395,   109,   102,  -395,  -395,  -395,  -395,
+    -395,  -395,  -395,  -395,  -395,  -395,   148,    -3,    87,  -395,
+     -40,   121,   196,  -395,  -395,     1,    -5,   196,   196,   196,
+     196,   196,  -395,  -395,   716,    82,     2,  -395,   153,    63,
+    -395,  -395,  -395,    98,   152,    -3,    40,   141,  -395,    98,
+    -395,  -395,  -395,    12,    97,   116,   261,   116,   169,   126,
+     138,  -395,   176,  -395,  -395,   270,   274,  -395,  -395,  -395,
+     807,   139,  -395,   210,  -395,  -395,   154,  -395,  -395,   297,
+    -395,  -395,  -395,  -395,   172,  -395,  -395,   177,   231,   901,
+     313,   265,   192,  -395,  -395,   338,    23,  -395,  -395,   243,
+    -395,  -395,  -395,  -395,  -395,  1083,    -7,   196,   196,   214,
+     196,     1,   196,  -395,    98,   363,  -395,   205,   263,  -395,
+    -395,  -395,   255,  -395,   116,  -395,   196,   196,   625,  -395,
+    -395,   262,   196,  -395,  -395,  -395,   625,    33,   -29,  -395,
+     409,  -395,   165,   165,  1174,   411,  -395,   -14,    28,  -395,
+      13,   138,  1174,  -395,  -395,   196,  1174,  -395,  -395,  -395,
+    -395,  1174,    18,   274,  -395,   196,   398,    59,  -395,   417,
+    -395,    98,  -395,   202,  -395,   116,    98,    87,  -395,   196,
+      80,   196,   196,   196,  -395,   285,  -395,   211,  1241,   992,
+     214,   534,   422,   423,  -395,  -395,   312,   415,  1252,   219,
+      43,  1174,    61,  -395,  1174,  -395,   369,   292,  -395,  -395,
+    -395,  -395,  -395,  -395,   367,  -395,   216,   294,  -395,  -395,
+       7,   186,   267,  -395,   298,   186,     3,   372,  -395,  -395,
+      23,  -395,   347,  -395,  -395,   295,  1174,  -395,   351,   229,
+     196,  -395,  1174,  -395,   196,  -395,  -395,  -395,   303,   366,
+     368,   304,  -395,  -395,  -395,   232,  -395,  -395,  -395,  -395,
+    -395,    34,   196,   323,    80,   196,  -395,   188,  -395,  -395,
+       4,    65,   625,   625,   276,  -395,  -395,  -395,  -395,  -395,
+    -395,  -395,  -395,  1174,   311,  1174,    51,  -395,   234,   326,
+    1174,    71,  -395,   399,   351,  -395,  -395,  1174,   453,  -395,
+     160,   196,  -395,  -395,   370,  -395,   373,   374,   379,    13,
+    -395,   457,   462,   186,   430,   400,   431,   329,   380,  -395,
+     236,  -395,  1174,  -395,   351,  -395,   625,   333,   334,   196,
+    -395,   196,  -395,  -395,  -395,  -395,  -395,  -395,  -395,   196,
+    -395,  -395,  -395,   238,   454,   184,  -395,   336,   348,  -395,
+     391,   342,  1252,  -395,   403,   196,  -395,  -395,   188,  -395,
+    -395,   423,  -395,  -395,  -395,  1174,   345,   341,   901,  -395,
+     351,   401,  -395,  -395,  1252,   350,   351,  1174,  -395,    37,
+      35,  -395,  -395,  -395,  -395,  -395,    13,   267,   390,   395,
+    -395,  1174,   625,   396,  1174,  -395,   455,   108,  -395,   351,
+       8,   196,   196,   240,  -395,   242,  -395,   196,  -395,  -395,
+    -395,  -395,   354,    80,   461,   402,  -395,   625,  -395,  -395,
+     356,  -395,   346,   901,  -395,  1174,   245,  -395,  -395,  1252,
+     351,  -395,   495,  -395,   408,  -395,  -395,   358,   422,   464,
+     420,   358,  1174,  -395,  -395,  -395,   490,  -395,   249,   251,
+    -395,  -395,  -395,   196,  -395,  -395,   375,   468,  -395,    19,
+     196,  1174,   264,   351,  -395,   266,   371,   625,  1174,   504,
+     376,   377,  -395,   227,    46,   405,  -395,   269,   196,    -9,
+    -395,   381,   351,  -395,  -395,  -395,   422,   377,  -395,   196,
+    -395,   376,  -395,  1174,  -395,  -395,   421,   418,   407,   425,
+     515,   196,  -395,   277,  -395,  -395,   384,  -395,   496,  -395,
+    -395,    49,  -395,  -395,  -395,  -395,    56,   386,  -395,   196,
+     388,  -395,  -395,   466,   426,   467,  -395,   196,   279,   347,
+    -395,  -395,  -395,   281,   445,   404,  -395,   539,  -395,  -395
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -989,93 +989,93 @@
      means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       0,     6,   293,     0,     0,     0,     0,     0,     0,    18,
-     118,     0,     0,     7,     0,     0,    15,     8,    10,    11,
-      13,    14,     9,    17,    12,    16,     0,   107,   114,   116,
-       0,   291,     0,   285,   286,     0,     0,     0,     0,     0,
-       0,   119,   120,     0,     0,   109,   110,     0,   151,     1,
-       3,     2,     0,   107,   118,     0,   105,     0,     5,     4,
-     292,     0,     0,     0,     0,   192,    25,     0,   251,   248,
-       0,   277,   121,    40,    29,     0,     0,    30,    31,    34,
-      36,     0,    37,    39,     0,    41,   247,    35,    38,     0,
-      32,    33,     0,     0,     0,     0,     0,   122,   123,   227,
-     127,   213,   215,   217,   220,   223,   224,   225,   219,   218,
-       0,   263,     0,     0,     0,     0,     0,   106,     0,     0,
-     115,     0,     0,    94,     0,     0,     0,   101,   193,     0,
-       0,    91,   249,   250,     0,     0,   243,   240,     0,    43,
-       0,   252,     0,     0,    44,     0,     0,   254,     0,   192,
-       0,   278,   279,     0,     0,   126,   281,   282,   280,     0,
-       0,     0,   216,     0,     0,   192,   103,     0,   111,     0,
-     112,     0,   283,     0,   113,   108,     0,     0,     0,     0,
-       0,    93,    66,    27,     0,     0,     0,     0,     0,   194,
-     196,   198,   200,     0,   218,     0,     0,     0,     0,   243,
-     237,     0,   241,     0,     0,   257,   258,   259,   256,   260,
-     255,     0,   253,     0,     0,   129,   226,     0,     0,   153,
-     142,   128,   147,   130,   155,   124,   125,   212,   214,   169,
-     221,   264,     0,     0,   228,   245,     0,     0,   100,     0,
-     152,     0,    92,    19,     0,     0,     0,     0,    20,    21,
-      22,     0,     0,     0,    64,     0,    42,    56,   199,   207,
-       0,     0,     0,     0,     0,   267,   269,   270,   271,   272,
-     268,   273,   275,     0,     0,     0,     0,   261,     0,     0,
-       0,     0,   238,     0,   244,   236,    45,     0,     0,    46,
-     133,     0,   143,   149,   139,   134,   135,   137,     0,     0,
-     146,     0,     0,   145,     0,   157,     0,     0,   171,   229,
-       0,   230,     0,   102,   104,   284,     0,     0,     0,     0,
-       0,     0,     0,   265,     0,   263,     0,    63,    65,    68,
-      28,     0,     0,     0,    47,     0,     0,    49,    55,    57,
-      26,   206,   195,   197,   274,   276,     0,     0,     0,     0,
-     208,   205,     0,   204,    90,     0,     0,   242,     0,   235,
-       0,     0,   148,   150,   140,   136,   138,     0,   154,     0,
-       0,   144,     0,     0,   159,     0,   222,     0,   173,   231,
-     246,     0,     0,     0,     0,    96,   289,   290,   288,   287,
-      97,    95,     0,    67,     0,    83,    84,    85,    86,    87,
-       0,     0,    70,    48,     0,    51,    50,     0,    54,     0,
-       0,   210,     0,     0,   203,   262,     0,   239,   232,     0,
-     233,     0,   131,   132,   156,   158,     0,   161,   170,     0,
-     176,   175,   168,     0,    61,     0,     0,    58,     0,     0,
-     266,     0,    24,    62,     0,     0,    23,     0,     0,     0,
-       0,   201,   209,     0,     0,     0,     0,     0,   163,   172,
-     183,   186,     0,     0,    59,    98,    99,     0,    74,    76,
-      77,    78,     0,     0,     0,    52,     0,   202,   211,    89,
-     234,   141,   160,   162,     0,   117,   164,   165,     0,   187,
-     188,   189,     0,     0,     0,     0,     0,    88,     0,    82,
-      80,     0,    79,     0,    72,    73,     0,    53,     0,   166,
-     184,     0,   185,   177,   179,   178,     0,     0,    75,     0,
-      69,     0,     0,   190,   191,     0,     0,     0,   174,     0,
-      81,     0,   169,   180,   182,   181,     0,     0,     0,    60,
-       0,   167,    71
+       0,     6,   298,     0,     0,     0,     0,     0,     0,    18,
+     123,     0,     0,     7,     0,     0,    15,     8,    10,    11,
+      13,    14,     9,    17,    12,    16,     0,   112,   119,   121,
+       0,   296,     0,   290,   291,     0,     0,     0,     0,     0,
+       0,     0,   124,   125,     0,     0,   114,   115,     0,   156,
+       1,     3,     2,     0,     0,   112,   123,     0,   110,     0,
+       5,     4,   297,     0,     0,   103,     0,   103,     0,     0,
+     197,    25,     0,   256,   253,     0,   282,   126,    40,    29,
+       0,     0,    30,    31,    34,    36,     0,    37,    39,     0,
+      41,   252,    35,    38,     0,    32,    33,     0,     0,     0,
+       0,     0,   127,   128,   232,   132,   218,   220,   222,   225,
+     228,   229,   230,   224,   223,     0,   268,     0,     0,     0,
+       0,     0,     0,   111,     0,     0,   120,     0,     0,   100,
+     102,   101,     0,    98,   103,    97,     0,     0,     0,   106,
+     198,     0,     0,    94,   254,   255,     0,     0,   248,   245,
+       0,    43,     0,   257,     0,     0,    44,     0,     0,   259,
+       0,   197,     0,   283,   284,     0,     0,   131,   286,   287,
+     285,     0,     0,     0,   221,     0,     0,   197,   108,     0,
+     116,     0,   117,     0,   288,   103,     0,   118,   113,     0,
+       0,     0,     0,     0,    96,    66,    27,     0,     0,     0,
+       0,     0,   199,   201,   203,   205,     0,   223,     0,     0,
+       0,     0,   248,   242,     0,   246,     0,     0,   262,   263,
+     264,   261,   265,   260,     0,   258,     0,     0,   134,   231,
+       0,     0,   158,   147,   133,   152,   135,   160,   129,   130,
+     217,   219,   174,   226,   269,     0,     0,   233,   250,     0,
+       0,   105,     0,   157,     0,    99,    95,    19,     0,     0,
+       0,     0,    20,    21,    22,     0,    74,    76,    77,    78,
+      79,     0,     0,     0,    64,     0,    42,    56,   204,   212,
+       0,     0,     0,     0,     0,   272,   274,   275,   276,   277,
+     273,   278,   280,     0,     0,     0,     0,   266,     0,     0,
+       0,     0,   243,     0,   249,   241,    45,     0,     0,    46,
+     138,     0,   148,   154,   144,   139,   140,   142,     0,     0,
+     151,     0,     0,   150,     0,   162,     0,     0,   176,   234,
+       0,   235,     0,   107,   109,   289,     0,     0,     0,     0,
+     104,     0,    81,    84,    82,   294,   295,   293,   292,     0,
+      80,    85,   270,     0,   268,     0,    63,    65,    68,    28,
+       0,     0,     0,    47,     0,     0,    49,    55,    57,    26,
+     211,   200,   202,   279,   281,     0,     0,     0,     0,   213,
+     210,     0,   209,    93,     0,     0,   247,     0,   240,     0,
+       0,   153,   155,   145,   141,   143,     0,   159,     0,     0,
+     149,     0,     0,   164,     0,   227,     0,   178,   236,   251,
+       0,     0,     0,     0,    75,     0,    67,     0,    86,    87,
+      88,    89,    90,     0,     0,    70,    48,     0,    51,    50,
+       0,    54,     0,     0,   215,     0,     0,   208,   267,     0,
+     244,   237,     0,   238,     0,   136,   137,   161,   163,     0,
+     166,   175,     0,   181,   180,   173,     0,    61,     0,     0,
+      58,    83,   271,     0,    24,    62,     0,     0,    23,     0,
+       0,     0,     0,   206,   214,     0,     0,     0,     0,     0,
+     168,   177,   188,   191,     0,     0,    59,     0,     0,     0,
+      52,     0,   207,   216,    92,   239,   146,   165,   167,     0,
+     122,   169,   170,     0,   192,   193,   194,     0,     0,     0,
+       0,     0,    91,     0,    72,    73,     0,    53,     0,   171,
+     189,     0,   190,   182,   184,   183,     0,     0,    69,     0,
+       0,   195,   196,     0,     0,     0,   179,     0,     0,   174,
+     185,   187,   186,     0,     0,     0,    60,     0,   172,    71
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -244,  -244,  -244,  -244,  -244,  -244,  -244,  -244,  -132,  -244,
-     346,   191,  -244,  -244,  -243,  -244,  -244,  -244,  -244,  -244,
-    -244,    59,    35,  -244,  -244,  -244,  -244,  -244,  -244,  -244,
-    -244,  -244,  -244,  -244,  -244,   303,  -244,   483,  -244,  -244,
-     428,   200,   425,    -8,   485,  -244,  -244,   395,  -244,   -98,
-    -244,  -244,  -165,   175,  -179,   -10,  -244,  -244,  -244,  -244,
-    -244,  -244,  -244,    58,     5,  -244,  -244,  -244,  -244,  -244,
-    -244,    90,    61,  -244,  -244,    39,  -244,  -133,   285,   287,
-     379,   -37,   400,   403,   438,  -144,  -244,  -244,  -244,  -244,
-     352,  -244,   430,   360,  -212,  -186,   429,   148,  -121,  -244,
-    -244,  -244,  -244,  -244,  -127,    -4,   132,  -244,  -244
+    -395,  -395,  -395,  -395,  -395,  -395,  -395,  -395,  -164,  -395,
+     349,   180,  -395,  -395,  -271,  -395,  -395,  -395,  -395,  -395,
+    -395,  -394,   209,  -395,  -395,  -395,  -395,  -395,  -395,  -395,
+    -395,    24,   -46,  -395,  -395,  -395,   301,  -395,   497,  -395,
+    -395,   435,   259,   433,   -28,   498,  -395,  -395,   397,  -395,
+     -90,  -395,  -395,  -207,   162,  -187,   -10,  -395,  -395,  -395,
+    -395,  -395,  -395,  -395,    60,    21,  -395,  -395,  -395,  -395,
+    -395,  -395,    84,    62,  -395,  -395,   -54,  -395,  -145,   282,
+     280,   382,   -35,   406,   412,   451,  -156,  -395,  -395,  -395,
+    -395,   355,  -395,   427,   359,  -232,  -203,   429,   129,  -128,
+    -395,  -395,  -395,  -395,  -395,  -136,    -4,  -395,  -395,  -395
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,    14,    15,    16,    17,    18,    19,    20,   183,   184,
-      95,   338,   339,   340,   248,   328,   329,   253,   402,   446,
-     506,   467,   468,   469,   470,   471,   399,   442,    21,    22,
-     181,   322,    23,    24,   165,   166,    25,    56,    26,    45,
-      46,   145,    28,    29,    43,    96,    97,    98,   149,    99,
-     303,   298,   219,   220,   292,   293,   221,   305,   374,   427,
-     458,   485,   486,   487,   307,   308,   378,   432,   433,   495,
-     528,   459,   460,   491,   512,   127,   128,   189,   190,   191,
-     192,   193,   101,   102,   103,   104,   105,   106,   107,   199,
-     200,   136,   137,   203,   236,   108,   211,   278,   109,   324,
-     275,   110,   154,   159,   171,   111,   390,    30,    31
+      -1,    14,    15,    16,    17,    18,    19,    20,   196,   197,
+     100,   367,   368,   369,   262,   357,   358,   273,   425,   468,
+     516,   265,   266,   267,   268,   269,   270,   422,   464,    21,
+      22,    65,   133,    23,    24,   177,   178,    25,    58,    26,
+      46,    47,   157,    28,    29,    44,   101,   102,   103,   161,
+     104,   323,   318,   232,   233,   312,   313,   234,   325,   403,
+     450,   480,   500,   501,   502,   327,   328,   407,   455,   456,
+     510,   536,   481,   482,   506,   522,   139,   140,   202,   203,
+     204,   205,   206,   106,   107,   108,   109,   110,   111,   112,
+     212,   213,   148,   149,   216,   249,   113,   224,   298,   114,
+     353,   295,   115,   166,   171,   183,   116,   351,    30,    31
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1083,348 +1083,386 @@
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      35,   197,    47,   196,   222,   194,   100,    44,    48,   277,
-     262,   327,   262,   194,   262,    33,   170,    34,   499,   492,
-     525,   310,   163,    33,   244,    34,    54,    33,    61,    34,
-     156,   157,    63,    64,    65,    66,    67,    54,   135,   500,
-      33,   352,    34,   300,   243,   151,   152,   151,   152,   120,
-     218,   245,   290,   262,    36,   260,   419,   146,   121,   131,
-      52,    58,   493,   526,    59,   194,    32,   194,   151,   152,
-      33,    38,    34,   222,   264,   265,   266,   267,   268,   269,
-     270,   271,   272,   273,   246,   151,   152,   331,   122,   259,
-     301,    10,   151,   152,    10,    37,   155,   395,   504,   291,
-     396,   397,   201,    47,   412,   213,   129,   247,   167,    48,
-     201,   172,   173,   100,    41,    39,   151,   152,   130,   218,
-     182,   185,   332,   330,   371,   353,   172,   235,    40,   420,
-     505,   323,   333,    55,   368,    10,    49,   413,   164,   494,
-     527,   194,   194,   274,   223,    42,   341,   405,   434,   226,
-     475,   261,   215,   158,   501,   222,   230,   443,    57,   231,
-     424,   281,   217,   428,   284,   242,   217,   280,   216,   415,
-     418,   334,   185,   134,   249,   250,   350,   302,   398,   229,
-     198,   198,   335,   381,   294,    60,   386,   336,   224,   151,
-     152,   295,   384,   358,   164,   194,   235,   523,   450,   296,
-      27,   218,   314,    62,   238,   337,   205,    33,   216,    34,
-     344,   345,   346,   223,    48,   387,   388,   524,    48,   430,
-     294,   297,   320,   222,   112,   431,    53,   295,   126,   321,
-     277,   206,  -133,   167,   113,   296,   348,   315,   351,   237,
-     425,   288,   114,   357,   389,   207,   208,   449,   325,   411,
-     360,   185,   194,    10,   362,   435,   436,   297,   438,   151,
-     152,   151,   152,   115,    50,   439,    51,   119,   209,   218,
-     123,   447,   347,   440,   489,   380,    33,   124,    34,   176,
-     177,   363,   116,   194,   125,   178,   179,    48,   240,   241,
-     210,   254,   255,   151,   152,   223,   279,   241,   490,    48,
-     151,   152,   311,   312,   126,   153,   354,   355,   132,   409,
-     379,   312,   235,   391,   392,   172,   393,   394,   437,   241,
-     133,   417,   481,   452,   312,   463,   241,   464,   241,   478,
-     312,   138,   407,   139,   194,   235,   479,   355,   235,   264,
-     265,   266,   267,   268,   269,   270,   271,   272,   273,   140,
-     151,   152,   497,   498,   520,   498,   530,   241,   537,   241,
-     539,   241,   141,   223,   142,   143,   144,    33,    68,    34,
-      69,   147,   148,   235,   519,   451,   150,   160,   172,   172,
-     169,   175,   180,   204,    70,    71,   232,   195,   214,   239,
-     325,   251,   461,   252,   531,   262,   285,   263,    73,    74,
-     276,   286,   536,   287,   289,   306,    75,    76,   274,   299,
-     304,   309,   477,   316,    77,    78,   319,    79,   317,   461,
-     326,   318,   233,    80,   349,   356,   361,   359,   367,    81,
-     369,   364,    82,   370,   372,   365,   366,   472,   373,   375,
-     376,   377,   385,   382,   476,   383,    83,    84,   163,   403,
-     400,   461,   401,   404,    85,   406,   414,    86,   410,   422,
-     416,   423,   429,   426,   441,   444,   448,   454,   502,   472,
-     445,   312,    87,    33,    68,    34,    69,   456,   462,   186,
-     508,   455,    88,    89,   457,   465,    90,    91,   473,   474,
-      70,    71,   517,   480,   472,    92,   483,   172,   488,   496,
-     511,    93,   484,   507,    73,    74,    94,   234,   513,   516,
-     514,   515,    75,    76,   521,   522,   529,   172,   532,   533,
-      77,    78,   534,    79,   535,   172,   540,   541,   542,    80,
-     408,   257,   503,   518,   187,    81,   117,   538,    82,   118,
-     313,   168,   421,   174,   509,   225,   482,   342,   162,   510,
-     343,   282,    83,    84,   227,    33,    68,    34,    69,   283,
-      85,   186,   228,    86,   453,   258,   202,     0,     0,     0,
-     212,   466,    70,    71,     0,     0,     0,     0,    87,     0,
-       0,     0,     0,     0,     0,    10,    73,    74,    88,    89,
-       0,     0,    90,    91,    75,    76,     0,     0,     0,     0,
-       0,    92,    77,    78,     0,    79,     0,    93,     0,     0,
-       0,    80,   188,     0,     0,     0,   187,    81,     0,     0,
-      82,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,    83,    84,     0,    33,    68,    34,
-      69,     0,    85,     0,     0,    86,     0,     0,     0,     0,
-       0,     0,     0,     0,    70,    71,    72,     0,     0,     0,
-      87,     0,     0,     0,    33,    68,    34,    69,    73,    74,
-      88,    89,     0,     0,    90,    91,    75,    76,     0,     0,
-       0,    70,    71,    92,    77,    78,     0,    79,     0,    93,
-       0,     0,     0,    80,   188,    73,    74,     0,     0,    81,
-       0,     0,    82,    75,    76,     0,     0,     0,     0,     0,
-       0,    77,    78,     0,    79,     0,    83,    84,     0,     0,
-      80,     0,     0,     0,    85,     0,    81,    86,     0,    82,
+      36,   210,    48,   356,   235,   297,   209,    45,    49,   105,
+     207,    33,   282,    34,   330,    56,   282,    33,   207,    34,
+     175,   135,    33,   310,    34,   257,    56,   282,    63,   182,
+      56,   126,   214,    68,    69,    70,    71,    72,    33,   342,
+      34,   343,   321,   127,   143,   147,   168,   169,   320,   163,
+     164,   282,    37,   507,   163,   164,   280,    32,   163,   164,
+      67,   381,   344,   533,   158,   514,    66,    41,    42,   487,
+     231,   207,   128,   207,   235,   284,   285,   286,   287,   288,
+     289,   290,   291,   292,   293,    39,   163,   164,   194,    33,
+      40,    34,   163,   164,   513,    38,   508,   515,    43,   345,
+      60,   167,   129,    61,   442,   146,   534,   237,    48,    50,
+     279,   359,   397,   179,    49,   531,   184,    59,   186,   226,
+      64,    10,   214,   251,    62,   258,    64,   105,   346,   347,
+     322,   228,   195,   198,    57,   532,   400,   176,   184,   255,
+     231,   248,   294,   382,   352,   185,   436,   176,   118,   370,
+     259,   230,   465,   457,   207,   207,   236,   230,   256,   428,
+     348,   239,   242,   235,   490,   300,   281,   211,   243,   447,
+     170,   244,   451,   229,   509,     1,   301,     2,   349,   304,
+     443,   438,   441,   260,   535,   198,   119,   263,   264,   271,
+      33,   410,    34,   387,   138,   211,    53,   117,   360,    10,
+      33,   472,    34,   413,   379,   250,     3,   120,   207,   261,
+     229,   248,    10,   415,   453,   130,   131,   334,   218,   311,
+     454,   418,     4,     5,   419,   420,   236,    49,    54,   231,
+       6,    49,   314,   361,     7,   122,   297,   163,   164,   315,
+     235,   219,    51,   362,    52,   125,   179,   316,   163,   164,
+     335,   189,   190,   132,     8,   220,   221,   448,   377,    27,
+     380,   504,    10,    35,   136,   386,   134,   350,   354,   317,
+     137,   198,   389,   138,   207,   458,   459,   144,   222,     9,
+     363,   145,   469,   150,   505,    55,   434,   308,    10,   462,
+      10,   364,   151,   373,   374,   375,   365,   409,   152,   207,
+     421,   392,   153,   223,    11,   391,   231,    49,   141,   191,
+     192,    12,   121,   156,    13,   236,   154,   366,   159,    49,
+     142,   155,   284,   285,   286,   287,   288,   289,   290,   291,
+     292,   293,   496,   163,   164,   184,   160,   271,   162,   314,
+     432,   172,    33,   248,    34,   184,   315,   253,   254,   207,
+     435,  -138,   440,   376,   316,   471,   274,   275,   181,   163,
+     164,   430,   163,   164,   299,   254,   248,   163,   164,   248,
+     188,   165,   163,   164,   331,   332,   317,   340,   341,   383,
+     384,   408,   332,   416,   417,   460,   254,   461,   254,   294,
+     474,   332,   236,   538,   485,   254,   486,   254,   248,   193,
+     473,   543,    33,    73,    34,    74,   208,   184,   184,   493,
+     332,   494,   384,   354,   512,   341,   217,   483,   227,    75,
+      76,   245,   528,   341,   544,   254,   546,   254,   252,   272,
+     282,   305,   283,    78,    79,   296,   492,   306,   307,   309,
+     329,    80,    81,   483,   319,   324,   326,   336,   339,    82,
+      83,   337,    84,   338,   355,   378,   246,    85,   385,   271,
+     390,   388,    86,   396,   398,    87,   491,   393,   483,   399,
+     394,   395,   401,   404,   405,   402,   406,   411,   412,    88,
+      89,   175,   423,   426,   271,   424,   427,    90,   429,   433,
+      91,   445,   449,   437,   439,   518,   446,   452,   463,   466,
+     470,   467,   476,   477,   332,    92,   478,   527,   479,   484,
+     489,   498,   499,   511,   521,    93,   495,   524,    94,   488,
+     523,    95,    96,   503,   526,   184,   517,   525,   529,   530,
+     537,    97,   539,   184,   540,   542,   541,    98,    33,    73,
+      34,    74,    99,   247,   199,   547,   549,   277,   431,   548,
+     414,   333,   123,   180,   124,    75,    76,   187,   444,   238,
+     545,   519,   497,   372,   371,   520,   174,   302,   475,    78,
+      79,   303,   240,     0,     0,   215,     0,    80,    81,     0,
+       0,   278,   225,   241,     0,    82,    83,     0,    84,     0,
+       0,     0,     0,    85,     0,     0,     0,   200,    86,     0,
+       0,    87,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    88,    89,     0,     0,     0,
+       0,     0,     0,    90,     0,     0,    91,     0,     0,    33,
+      73,    34,    74,     0,     0,   199,     0,     0,     0,     0,
+       0,    92,     0,     0,     0,     0,    75,    76,    10,     0,
+       0,    93,     0,     0,    94,     0,     0,    95,    96,     0,
+      78,    79,     0,     0,     0,     0,     0,    97,    80,    81,
+       0,     0,     0,    98,     0,     0,    82,    83,   201,    84,
+       0,     0,     0,     0,    85,     0,     0,     0,   200,    86,
+       0,     0,    87,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    88,    89,     0,     0,
+       0,     0,     0,     0,    90,     0,     0,    91,     0,     0,
+      33,    73,    34,    74,     0,     0,     0,     0,     0,     0,
+       0,     0,    92,     0,     0,     0,     0,    75,    76,    77,
+       0,     0,    93,     0,     0,    94,     0,     0,    95,    96,
+       0,    78,    79,     0,     0,     0,     0,     0,    97,    80,
+      81,     0,     0,     0,    98,     0,     0,    82,    83,   201,
+      84,     0,     0,     0,     0,    85,     0,     0,     0,     0,
+      86,     0,     0,    87,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,    88,    89,     0,
+       0,     0,     0,     0,     0,    90,     0,     0,    91,     0,
+       0,    33,    73,    34,    74,     0,     0,     0,     0,     0,
+       0,     0,     0,    92,     0,     0,     0,     0,    75,    76,
+       0,     0,     0,    93,     0,     0,    94,     0,     0,    95,
+      96,     0,    78,    79,     0,     0,     0,     0,     0,    97,
+      80,    81,     0,     0,     0,    98,     0,     0,    82,    83,
+      99,    84,     0,     0,     0,     0,    85,     0,     0,     0,
+       0,    86,     0,     0,    87,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    88,    89,
+       0,     0,     0,     0,     0,     0,    90,     0,     0,    91,
+       0,     0,     0,     0,     0,    33,    73,    34,    74,     0,
+       0,     0,     0,     0,    92,     0,     0,     0,     0,     0,
+       0,     0,    75,    76,    93,     0,     0,    94,     0,     0,
+      95,    96,     0,     0,     0,     0,    78,    79,     0,     0,
+      97,   146,     0,     0,    80,    81,    98,     0,     0,     0,
+       0,    99,    82,    83,     0,    84,     0,     0,     0,     0,
+      85,     0,     0,     0,     0,    86,     0,     0,    87,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    87,    83,    84,     0,     0,     0,     0,     0,
-       0,    85,    88,    89,    86,     0,    90,    91,     0,     0,
-       0,     0,     0,     0,     0,    92,     0,     0,     0,    87,
-       0,    93,     0,     0,     0,     0,    94,     0,     0,    88,
-      89,     0,     0,    90,    91,     0,     0,    33,    68,    34,
-      69,     0,    92,   134,     0,     0,     0,     0,    93,     0,
-       0,     0,     0,    94,    70,    71,     0,     0,     1,     0,
-       2,     0,     0,     0,    33,    68,    34,    69,    73,    74,
-       0,     0,     0,     0,     0,     0,    75,    76,     0,     0,
-       0,    70,    71,     0,    77,    78,     0,    79,     0,     3,
-       0,     0,     0,    80,     0,    73,    74,     0,     0,    81,
-       0,     0,    82,    75,    76,     4,     5,     0,     0,     0,
-       0,    77,    78,     6,    79,     0,    83,    84,     7,     0,
-      80,     0,     0,     0,    85,   187,    81,    86,     0,    82,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     8,
-       0,     0,    87,    83,    84,     0,     0,     0,     0,    10,
-       0,    85,    88,    89,    86,     0,    90,    91,     0,     0,
-       0,     0,     0,     0,     9,    92,     0,     0,     0,    87,
-       0,    93,     0,    10,     0,     0,    94,     0,     0,    88,
-      89,     0,     0,    90,    91,     0,    11,    33,    68,    34,
-      69,     0,    92,    12,     0,     0,    13,     0,    93,     0,
-       0,     0,     0,   188,    70,   161,     0,     0,     0,     0,
-       0,     0,     0,     0,    33,    68,    34,    69,    73,    74,
-       0,     0,     0,     0,     0,     0,    75,    76,     0,     0,
-       0,    70,    71,     0,    77,    78,     0,    79,     0,     0,
-       0,     0,     0,    80,     0,    73,    74,     0,     0,    81,
-       0,     0,    82,    75,    76,     0,     0,     0,     0,     0,
-       0,    77,    78,     0,    79,     0,    83,    84,     0,     0,
-      80,     0,     0,     0,    85,     0,    81,    86,     0,    82,
+       0,     0,    88,    89,     0,     0,     0,     0,     0,     0,
+      90,     0,     0,    91,     0,     0,    33,    73,    34,    74,
+       0,     0,     0,     0,     0,     0,     0,     0,    92,     0,
+       0,     0,     0,    75,    76,    10,     0,     0,    93,     0,
+       0,    94,     0,     0,    95,    96,     0,    78,    79,     0,
+       0,     0,     0,     0,    97,    80,    81,     0,     0,     0,
+      98,     0,     0,    82,    83,    99,    84,     0,     0,     0,
+       0,    85,     0,     0,     0,   200,    86,     0,     0,    87,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    87,    83,    84,     0,     0,    68,     0,    69,
-       0,    85,    88,    89,    86,     0,    90,    91,     0,     0,
-       0,     0,     0,    70,   161,    92,     0,     0,     0,    87,
-       0,    93,     0,     0,     0,     0,    94,    73,    74,    88,
-      89,     0,     0,    90,    91,     0,    76,     0,     0,     0,
-       0,     0,    92,    77,    78,     0,    79,     0,    93,     0,
-       0,     0,    80,    94,    73,    74,     0,     0,     0,     0,
-       0,    82,     0,    76,     0,     0,     0,     0,     0,     0,
-      77,    78,     0,    79,     0,    83,    84,     0,     0,    80,
-       0,     0,     0,    85,     0,     0,    86,     0,    82,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    87,    83,   256,     0,     0,     0,     0,     0,     0,
-      85,    88,     0,     0,     0,    90,    91,     0,     0,     0,
-       0,     0,     0,     0,    92,     0,     0,     0,    87,     0,
-      93,     0,     0,     0,     0,     0,     0,     0,    88,     0,
-       0,     0,    90,    91,     0,     0,     0,     0,     0,     0,
-       0,    92,     0,     0,     0,     0,     0,    93
+       0,     0,     0,    88,    89,     0,     0,     0,     0,     0,
+       0,    90,     0,     0,    91,     0,     0,    33,    73,    34,
+      74,     0,     0,     0,     0,     0,     0,     0,     0,    92,
+       0,     0,     0,     0,    75,   173,     0,     0,     0,    93,
+       0,     0,    94,     0,     0,    95,    96,     0,    78,    79,
+       0,     0,     0,     0,     0,    97,    80,    81,     0,     0,
+       0,    98,     0,     0,    82,    83,   201,    84,     0,     0,
+       0,     0,    85,     0,     0,     0,     0,    86,     0,     0,
+      87,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    88,    89,     0,     0,     0,     0,
+       0,     0,    90,     0,     0,    91,     0,     0,    33,    73,
+      34,    74,     0,     0,     0,     0,     0,     0,     0,     0,
+      92,     0,     0,     0,     0,    75,    76,     0,     0,     0,
+      93,     0,     0,    94,     0,     0,    95,    96,     0,    78,
+      79,     0,     0,     0,     0,     0,    97,    80,    81,     0,
+       0,     0,    98,     0,     0,    82,    83,    99,    84,     0,
+       0,     0,     0,    85,     0,     0,     0,     0,    86,     0,
+       0,    87,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    88,    89,    73,     0,    74,
+       0,     0,     0,    90,     0,     0,    91,     0,     0,     0,
+       0,     0,     0,    75,   173,     0,    78,    79,     0,     0,
+       0,    92,     0,     0,     0,    81,     0,    78,    79,     0,
+       0,    93,    82,    83,    94,    84,    81,    95,    96,     0,
+      85,     0,     0,    82,    83,     0,    84,    97,    87,     0,
+       0,    85,     0,    98,     0,     0,     0,     0,    99,    87,
+       0,     0,    88,   276,     0,     0,     0,     0,     0,     0,
+      90,     0,     0,    88,    89,     0,     0,     0,     0,     0,
+       0,    90,     0,     0,    91,     0,     0,     0,    92,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    93,    92,
+       0,     0,     0,     0,    95,    96,     0,     0,     0,    93,
+       0,     0,     0,     0,    97,    95,    96,     0,     0,     0,
+      98,     0,     0,     0,     0,    97,     0,     0,     0,     0,
+       0,    98
 };
 
 static const yytype_int16 yycheck[] =
 {
-       4,   134,    12,   130,   148,   126,    43,    11,    12,   195,
-       8,   254,     8,   134,     8,     4,   114,     6,     7,     7,
-       7,   233,    27,     4,    45,     6,    29,     4,    32,     6,
-      23,    24,    36,    37,    38,    39,    40,    29,    75,    28,
-       4,    10,     6,   222,   176,    21,    22,    21,    22,    57,
-     148,    72,   217,     8,    80,   188,    71,    94,    31,    67,
-      82,   139,    50,    50,   142,   186,   121,   188,    21,    22,
-       4,    73,     6,   217,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,   105,    21,    22,    10,    61,   187,
-      39,   116,    21,    22,   116,   121,   100,    37,    76,    33,
-      40,    41,    62,   113,     9,   142,   131,   128,   112,   113,
-      62,   115,   116,   150,    28,   121,    21,    22,   143,   217,
-     124,   125,    45,   255,   303,    94,   130,   164,    85,   144,
-     108,   252,    55,   136,   299,   116,     0,   349,   143,   127,
-     127,   262,   263,    79,   148,    59,   144,   333,   144,   153,
-     144,   188,   144,   146,   143,   299,   160,   400,    30,   163,
-     372,   198,   143,   375,   201,   173,   143,   122,   144,   355,
-     144,    94,   176,   133,   178,   179,   274,   126,   118,   143,
-     133,   133,   105,   316,    74,     3,    67,   110,   149,    21,
-      22,    81,   319,   122,   143,   316,   233,    68,   410,    89,
-       0,   299,   239,    73,   165,   128,    53,     4,   144,     6,
-      17,    18,    19,   217,   218,    96,    97,    88,   222,   108,
-      74,   111,    57,   367,   117,   114,    26,    81,   134,    64,
-     416,    78,    86,   237,   145,    89,   273,   241,   275,   145,
-     373,    73,    33,   280,   125,    92,    93,     9,   252,   347,
-     287,   255,   373,   116,   144,   382,   383,   111,    57,    21,
-      22,    21,    22,   143,   139,    64,   141,   106,   115,   367,
-       5,   404,    79,   394,    34,   312,     4,    97,     6,    46,
-      47,   291,    85,   404,   143,    46,    47,   291,   144,   145,
-     137,   144,   145,    21,    22,   299,   144,   145,    58,   303,
-      21,    22,   144,   145,   134,    33,   144,   145,     7,   346,
-     144,   145,   349,   144,   145,   319,   144,   145,   144,   145,
-       7,   358,   455,   144,   145,   144,   145,   144,   145,   144,
-     145,   143,   336,    84,   455,   372,   144,   145,   375,    10,
-      11,    12,    13,    14,    15,    16,    17,    18,    19,   143,
-      21,    22,   144,   145,   144,   145,   144,   145,   144,   145,
-     144,   145,     5,   367,   143,   143,    84,     4,     5,     6,
-       7,     5,    73,   410,   501,   412,   145,   100,   382,   383,
-     143,     7,   136,     7,    21,    22,    23,   143,     7,    11,
-     394,   143,   429,   143,   521,     8,    63,     9,    35,    36,
-      20,   144,   529,    73,   144,   101,    43,    44,    79,   145,
-      75,   144,   449,   143,    51,    52,   143,    54,    87,   456,
-     130,    87,    59,    60,   143,   131,     7,    63,    86,    66,
-       7,    99,    69,     7,    42,    99,    99,   441,    77,    42,
-     144,    98,     5,   143,   448,   143,    83,    84,    27,    94,
-     145,   488,   136,   143,    91,    87,    94,    94,   143,   103,
-     143,   103,    42,    98,   143,    38,   143,     7,   472,   473,
-     101,   145,   109,     4,     5,     6,     7,    42,    19,    10,
-     484,    97,   119,   120,    90,     5,   123,   124,   143,    42,
-      21,    22,   496,   144,   498,   132,     7,   501,   145,   110,
-      95,   138,   135,   144,    35,    36,   143,   144,   104,     9,
-     112,   104,    43,    44,   143,    33,   143,   521,   143,    70,
-      51,    52,   112,    54,    70,   529,   102,   144,     7,    60,
-     339,   185,   473,   498,    65,    66,    53,   532,    69,    54,
-     237,   113,   367,   118,   486,   150,   456,   262,   110,   488,
-     263,   199,    83,    84,   154,     4,     5,     6,     7,   199,
-      91,    10,   159,    94,   416,   186,   136,    -1,    -1,    -1,
-     141,   439,    21,    22,    -1,    -1,    -1,    -1,   109,    -1,
-      -1,    -1,    -1,    -1,    -1,   116,    35,    36,   119,   120,
-      -1,    -1,   123,   124,    43,    44,    -1,    -1,    -1,    -1,
-      -1,   132,    51,    52,    -1,    54,    -1,   138,    -1,    -1,
-      -1,    60,   143,    -1,    -1,    -1,    65,    66,    -1,    -1,
-      69,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    83,    84,    -1,     4,     5,     6,
-       7,    -1,    91,    -1,    -1,    94,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    21,    22,    23,    -1,    -1,    -1,
-     109,    -1,    -1,    -1,     4,     5,     6,     7,    35,    36,
-     119,   120,    -1,    -1,   123,   124,    43,    44,    -1,    -1,
-      -1,    21,    22,   132,    51,    52,    -1,    54,    -1,   138,
-      -1,    -1,    -1,    60,   143,    35,    36,    -1,    -1,    66,
-      -1,    -1,    69,    43,    44,    -1,    -1,    -1,    -1,    -1,
-      -1,    51,    52,    -1,    54,    -1,    83,    84,    -1,    -1,
-      60,    -1,    -1,    -1,    91,    -1,    66,    94,    -1,    69,
+       4,   146,    12,   274,   160,   208,   142,    11,    12,    44,
+     138,     4,     8,     6,   246,    29,     8,     4,   146,     6,
+      27,    67,     4,   230,     6,   189,    29,     8,    32,   119,
+      29,    59,    61,    37,    38,    39,    40,    41,     4,     5,
+       6,     7,    39,    31,    72,    80,    23,    24,   235,    21,
+      22,     8,    78,     7,    21,    22,   201,   121,    21,    22,
+      36,    10,    28,     7,    99,    74,    71,    83,    28,   463,
+     160,   199,    60,   201,   230,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    71,    21,    22,   134,     4,
+     121,     6,    21,    22,   488,   121,    50,   106,    58,    65,
+     140,   105,     5,   143,    69,   134,    50,   161,   118,     0,
+     200,   275,   319,   117,   118,    66,   120,    30,   122,   154,
+     125,   114,    61,   177,     3,    45,   125,   162,    94,    95,
+     127,   145,   136,   137,   137,    86,   323,   144,   142,   185,
+     230,   176,    77,    92,   272,   121,   378,   144,   146,   145,
+      70,   144,   423,   145,   282,   283,   160,   144,   186,   362,
+     126,   165,   144,   319,   145,   122,   201,   134,   172,   401,
+     147,   175,   404,   145,   128,     1,   211,     3,   144,   214,
+     145,   384,   145,   103,   128,   189,    33,   191,   192,   193,
+       4,   336,     6,   122,   135,   134,    48,   115,    10,   114,
+       4,   433,     6,   339,   294,   146,    32,   144,   336,   129,
+     145,   246,   114,   349,   106,   118,   119,   252,    53,    33,
+     112,    37,    48,    49,    40,    41,   230,   231,    80,   319,
+      56,   235,    72,    45,    60,    83,   439,    21,    22,    79,
+     396,    76,   140,    55,   142,   104,   250,    87,    21,    22,
+     254,    46,    47,   137,    80,    90,    91,   402,   293,     0,
+     295,    34,   114,     4,    95,   300,     5,   271,   272,   109,
+     144,   275,   307,   135,   402,   411,   412,     7,   113,   105,
+      92,     7,   427,   144,    57,    26,   376,    71,   114,   417,
+     114,   103,    82,    17,    18,    19,   108,   332,   144,   427,
+     116,   311,     5,   138,   130,   145,   396,   311,   132,    46,
+      47,   137,    53,    82,   140,   319,   144,   129,     5,   323,
+     144,   144,    10,    11,    12,    13,    14,    15,    16,    17,
+      18,    19,   477,    21,    22,   339,    71,   341,   146,    72,
+     375,    98,     4,   378,     6,   349,    79,   145,   146,   477,
+       9,    84,   387,    77,    87,     9,   145,   146,   144,    21,
+      22,   365,    21,    22,   145,   146,   401,    21,    22,   404,
+       7,    33,    21,    22,   145,   146,   109,   145,   146,   145,
+     146,   145,   146,   145,   146,   145,   146,   145,   146,    77,
+     145,   146,   396,   529,   145,   146,   145,   146,   433,   144,
+     435,   537,     4,     5,     6,     7,   144,   411,   412,   145,
+     146,   145,   146,   417,   145,   146,     7,   452,     7,    21,
+      22,    23,   145,   146,   145,   146,   145,   146,    11,   144,
+       8,    62,     9,    35,    36,    20,   471,   145,    71,   145,
+     145,    43,    44,   478,   146,    73,    99,   144,   144,    51,
+      52,    85,    54,    85,   131,   144,    58,    59,   132,   463,
+       7,    62,    64,    84,     7,    67,   470,    97,   503,     7,
+      97,    97,    42,    42,   145,    75,    96,   144,   144,    81,
+      82,    27,   146,    92,   488,   137,   144,    89,    85,   144,
+      92,   101,    96,    92,   144,   499,   101,    42,   144,    38,
+     144,    99,     7,    95,   146,   107,    42,   511,    88,    19,
+      42,     7,   136,   108,    93,   117,   145,   110,   120,   144,
+     102,   123,   124,   146,     9,   529,   145,   102,   144,    33,
+     144,   133,   144,   537,    68,    68,   110,   139,     4,     5,
+       6,     7,   144,   145,    10,   100,     7,   198,   368,   145,
+     341,   250,    55,   118,    56,    21,    22,   124,   396,   162,
+     539,   501,   478,   283,   282,   503,   115,   212,   439,    35,
+      36,   212,   166,    -1,    -1,   148,    -1,    43,    44,    -1,
+      -1,   199,   153,   171,    -1,    51,    52,    -1,    54,    -1,
+      -1,    -1,    -1,    59,    -1,    -1,    -1,    63,    64,    -1,
+      -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    81,    82,    -1,    -1,    -1,
+      -1,    -1,    -1,    89,    -1,    -1,    92,    -1,    -1,     4,
+       5,     6,     7,    -1,    -1,    10,    -1,    -1,    -1,    -1,
+      -1,   107,    -1,    -1,    -1,    -1,    21,    22,   114,    -1,
+      -1,   117,    -1,    -1,   120,    -1,    -1,   123,   124,    -1,
+      35,    36,    -1,    -1,    -1,    -1,    -1,   133,    43,    44,
+      -1,    -1,    -1,   139,    -1,    -1,    51,    52,   144,    54,
+      -1,    -1,    -1,    -1,    59,    -1,    -1,    -1,    63,    64,
+      -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    81,    82,    -1,    -1,
+      -1,    -1,    -1,    -1,    89,    -1,    -1,    92,    -1,    -1,
+       4,     5,     6,     7,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   107,    -1,    -1,    -1,    -1,    21,    22,    23,
+      -1,    -1,   117,    -1,    -1,   120,    -1,    -1,   123,   124,
+      -1,    35,    36,    -1,    -1,    -1,    -1,    -1,   133,    43,
+      44,    -1,    -1,    -1,   139,    -1,    -1,    51,    52,   144,
+      54,    -1,    -1,    -1,    -1,    59,    -1,    -1,    -1,    -1,
+      64,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    81,    82,    -1,
+      -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    92,    -1,
+      -1,     4,     5,     6,     7,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,   107,    -1,    -1,    -1,    -1,    21,    22,
+      -1,    -1,    -1,   117,    -1,    -1,   120,    -1,    -1,   123,
+     124,    -1,    35,    36,    -1,    -1,    -1,    -1,    -1,   133,
+      43,    44,    -1,    -1,    -1,   139,    -1,    -1,    51,    52,
+     144,    54,    -1,    -1,    -1,    -1,    59,    -1,    -1,    -1,
+      -1,    64,    -1,    -1,    67,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    81,    82,
+      -1,    -1,    -1,    -1,    -1,    -1,    89,    -1,    -1,    92,
+      -1,    -1,    -1,    -1,    -1,     4,     5,     6,     7,    -1,
+      -1,    -1,    -1,    -1,   107,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    21,    22,   117,    -1,    -1,   120,    -1,    -1,
+     123,   124,    -1,    -1,    -1,    -1,    35,    36,    -1,    -1,
+     133,   134,    -1,    -1,    43,    44,   139,    -1,    -1,    -1,
+      -1,   144,    51,    52,    -1,    54,    -1,    -1,    -1,    -1,
+      59,    -1,    -1,    -1,    -1,    64,    -1,    -1,    67,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   109,    83,    84,    -1,    -1,    -1,    -1,    -1,
-      -1,    91,   119,   120,    94,    -1,   123,   124,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,   132,    -1,    -1,    -1,   109,
-      -1,   138,    -1,    -1,    -1,    -1,   143,    -1,    -1,   119,
-     120,    -1,    -1,   123,   124,    -1,    -1,     4,     5,     6,
-       7,    -1,   132,   133,    -1,    -1,    -1,    -1,   138,    -1,
-      -1,    -1,    -1,   143,    21,    22,    -1,    -1,     1,    -1,
-       3,    -1,    -1,    -1,     4,     5,     6,     7,    35,    36,
-      -1,    -1,    -1,    -1,    -1,    -1,    43,    44,    -1,    -1,
-      -1,    21,    22,    -1,    51,    52,    -1,    54,    -1,    32,
-      -1,    -1,    -1,    60,    -1,    35,    36,    -1,    -1,    66,
-      -1,    -1,    69,    43,    44,    48,    49,    -1,    -1,    -1,
-      -1,    51,    52,    56,    54,    -1,    83,    84,    61,    -1,
-      60,    -1,    -1,    -1,    91,    65,    66,    94,    -1,    69,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    82,
-      -1,    -1,   109,    83,    84,    -1,    -1,    -1,    -1,   116,
-      -1,    91,   119,   120,    94,    -1,   123,   124,    -1,    -1,
-      -1,    -1,    -1,    -1,   107,   132,    -1,    -1,    -1,   109,
-      -1,   138,    -1,   116,    -1,    -1,   143,    -1,    -1,   119,
-     120,    -1,    -1,   123,   124,    -1,   129,     4,     5,     6,
-       7,    -1,   132,   136,    -1,    -1,   139,    -1,   138,    -1,
-      -1,    -1,    -1,   143,    21,    22,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,     4,     5,     6,     7,    35,    36,
-      -1,    -1,    -1,    -1,    -1,    -1,    43,    44,    -1,    -1,
-      -1,    21,    22,    -1,    51,    52,    -1,    54,    -1,    -1,
-      -1,    -1,    -1,    60,    -1,    35,    36,    -1,    -1,    66,
-      -1,    -1,    69,    43,    44,    -1,    -1,    -1,    -1,    -1,
-      -1,    51,    52,    -1,    54,    -1,    83,    84,    -1,    -1,
-      60,    -1,    -1,    -1,    91,    -1,    66,    94,    -1,    69,
+      -1,    -1,    81,    82,    -1,    -1,    -1,    -1,    -1,    -1,
+      89,    -1,    -1,    92,    -1,    -1,     4,     5,     6,     7,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   107,    -1,
+      -1,    -1,    -1,    21,    22,   114,    -1,    -1,   117,    -1,
+      -1,   120,    -1,    -1,   123,   124,    -1,    35,    36,    -1,
+      -1,    -1,    -1,    -1,   133,    43,    44,    -1,    -1,    -1,
+     139,    -1,    -1,    51,    52,   144,    54,    -1,    -1,    -1,
+      -1,    59,    -1,    -1,    -1,    63,    64,    -1,    -1,    67,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   109,    83,    84,    -1,    -1,     5,    -1,     7,
-      -1,    91,   119,   120,    94,    -1,   123,   124,    -1,    -1,
-      -1,    -1,    -1,    21,    22,   132,    -1,    -1,    -1,   109,
-      -1,   138,    -1,    -1,    -1,    -1,   143,    35,    36,   119,
-     120,    -1,    -1,   123,   124,    -1,    44,    -1,    -1,    -1,
-      -1,    -1,   132,    51,    52,    -1,    54,    -1,   138,    -1,
-      -1,    -1,    60,   143,    35,    36,    -1,    -1,    -1,    -1,
-      -1,    69,    -1,    44,    -1,    -1,    -1,    -1,    -1,    -1,
-      51,    52,    -1,    54,    -1,    83,    84,    -1,    -1,    60,
-      -1,    -1,    -1,    91,    -1,    -1,    94,    -1,    69,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   109,    83,    84,    -1,    -1,    -1,    -1,    -1,    -1,
-      91,   119,    -1,    -1,    -1,   123,   124,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,   132,    -1,    -1,    -1,   109,    -1,
-     138,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   119,    -1,
-      -1,    -1,   123,   124,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,   132,    -1,    -1,    -1,    -1,    -1,   138
+      -1,    -1,    -1,    81,    82,    -1,    -1,    -1,    -1,    -1,
+      -1,    89,    -1,    -1,    92,    -1,    -1,     4,     5,     6,
+       7,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   107,
+      -1,    -1,    -1,    -1,    21,    22,    -1,    -1,    -1,   117,
+      -1,    -1,   120,    -1,    -1,   123,   124,    -1,    35,    36,
+      -1,    -1,    -1,    -1,    -1,   133,    43,    44,    -1,    -1,
+      -1,   139,    -1,    -1,    51,    52,   144,    54,    -1,    -1,
+      -1,    -1,    59,    -1,    -1,    -1,    -1,    64,    -1,    -1,
+      67,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    81,    82,    -1,    -1,    -1,    -1,
+      -1,    -1,    89,    -1,    -1,    92,    -1,    -1,     4,     5,
+       6,     7,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+     107,    -1,    -1,    -1,    -1,    21,    22,    -1,    -1,    -1,
+     117,    -1,    -1,   120,    -1,    -1,   123,   124,    -1,    35,
+      36,    -1,    -1,    -1,    -1,    -1,   133,    43,    44,    -1,
+      -1,    -1,   139,    -1,    -1,    51,    52,   144,    54,    -1,
+      -1,    -1,    -1,    59,    -1,    -1,    -1,    -1,    64,    -1,
+      -1,    67,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    81,    82,     5,    -1,     7,
+      -1,    -1,    -1,    89,    -1,    -1,    92,    -1,    -1,    -1,
+      -1,    -1,    -1,    21,    22,    -1,    35,    36,    -1,    -1,
+      -1,   107,    -1,    -1,    -1,    44,    -1,    35,    36,    -1,
+      -1,   117,    51,    52,   120,    54,    44,   123,   124,    -1,
+      59,    -1,    -1,    51,    52,    -1,    54,   133,    67,    -1,
+      -1,    59,    -1,   139,    -1,    -1,    -1,    -1,   144,    67,
+      -1,    -1,    81,    82,    -1,    -1,    -1,    -1,    -1,    -1,
+      89,    -1,    -1,    81,    82,    -1,    -1,    -1,    -1,    -1,
+      -1,    89,    -1,    -1,    92,    -1,    -1,    -1,   107,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   117,   107,
+      -1,    -1,    -1,    -1,   123,   124,    -1,    -1,    -1,   117,
+      -1,    -1,    -1,    -1,   133,   123,   124,    -1,    -1,    -1,
+     139,    -1,    -1,    -1,    -1,   133,    -1,    -1,    -1,    -1,
+      -1,   139
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
-static const yytype_uint8 yystos[] =
+static const yytype_uint16 yystos[] =
 {
-       0,     1,     3,    32,    48,    49,    56,    61,    82,   107,
-     116,   129,   136,   139,   148,   149,   150,   151,   152,   153,
-     154,   175,   176,   179,   180,   183,   185,   188,   189,   190,
-     254,   255,   121,     4,     6,   252,    80,   121,    73,   121,
-      85,    28,    59,   191,   252,   186,   187,   202,   252,     0,
-     139,   141,    82,   188,    29,   136,   184,    30,   139,   142,
-       3,   252,    73,   252,   252,   252,   252,   252,     5,     7,
-      21,    22,    23,    35,    36,    43,    44,    51,    52,    54,
-      60,    66,    69,    83,    84,    91,    94,   109,   119,   120,
-     123,   124,   132,   138,   143,   157,   192,   193,   194,   196,
-     228,   229,   230,   231,   232,   233,   234,   235,   242,   245,
-     248,   252,   117,   145,    33,   143,    85,   184,   191,   106,
-     190,    31,    61,     5,    97,   143,   134,   222,   223,   131,
-     143,   190,     7,     7,   133,   228,   238,   239,   143,    84,
-     143,     5,   143,   143,    84,   188,   228,     5,    73,   195,
-     145,    21,    22,    33,   249,   252,    23,    24,   146,   250,
-     100,    22,   231,    27,   143,   181,   182,   252,   187,   143,
-     196,   251,   252,   252,   189,     7,    46,    47,    46,    47,
-     136,   177,   252,   155,   156,   252,    10,    65,   143,   224,
-     225,   226,   227,   228,   245,   143,   251,   224,   133,   236,
-     237,    62,   239,   240,     7,    53,    78,    92,    93,   115,
-     137,   243,   243,   228,     7,   144,   144,   143,   196,   199,
-     200,   203,   232,   252,   222,   194,   252,   229,   230,   143,
-     252,   252,    23,    59,   144,   228,   241,   145,   222,    11,
-     144,   145,   190,   155,    45,    72,   105,   128,   161,   252,
-     252,   143,   143,   164,   144,   145,    84,   157,   227,   196,
-     224,   228,     8,     9,    10,    11,    12,    13,    14,    15,
-      16,    17,    18,    19,    79,   247,    20,   242,   244,   144,
-     122,   228,   237,   240,   228,    63,   144,    73,    73,   144,
-     199,    33,   201,   202,    74,    81,    89,   111,   198,   145,
-     201,    39,   126,   197,    75,   204,   101,   211,   212,   144,
-     241,   144,   145,   182,   228,   252,   143,    87,    87,   143,
-      57,    64,   178,   245,   246,   252,   130,   161,   162,   163,
-     155,    10,    45,    55,    94,   105,   110,   128,   158,   159,
-     160,   144,   225,   226,    17,    18,    19,    79,   228,   143,
-     196,   228,    10,    94,   144,   145,   131,   228,   122,    63,
-     228,     7,   144,   202,    99,    99,    99,    86,   199,     7,
-       7,   201,    42,    77,   205,    42,   144,    98,   213,   144,
-     228,   224,   143,   143,   251,     5,    67,    96,    97,   125,
-     253,   144,   145,   144,   145,    37,    40,    41,   118,   173,
-     145,   136,   165,    94,   143,   242,    87,   252,   158,   228,
-     143,   196,     9,   241,    94,   242,   143,   228,   144,    71,
-     144,   200,   103,   103,   241,   224,    98,   206,   241,    42,
-     108,   114,   214,   215,   144,   251,   251,   144,    57,    64,
-     245,   143,   174,   161,    38,   101,   166,   224,   143,     9,
-     241,   228,   144,   244,     7,    97,    42,    90,   207,   218,
-     219,   228,    19,   144,   144,     5,   253,   168,   169,   170,
-     171,   172,   252,   143,    42,   144,   252,   228,   144,   144,
-     144,   224,   218,     7,   135,   208,   209,   210,   145,    34,
-      58,   220,     7,    50,   127,   216,   110,   144,   145,     7,
-      28,   143,   252,   168,    76,   108,   167,   144,   252,   210,
-     219,    95,   221,   104,   112,   104,     9,   252,   169,   251,
-     144,   143,    33,    68,    88,     7,    50,   127,   217,   143,
-     144,   251,   143,    70,   112,    70,   251,   144,   211,   144,
-     102,   144,     7
+       0,     1,     3,    32,    48,    49,    56,    60,    80,   105,
+     114,   130,   137,   140,   149,   150,   151,   152,   153,   154,
+     155,   177,   178,   181,   182,   185,   187,   190,   191,   192,
+     256,   257,   121,     4,     6,   190,   254,    78,   121,    71,
+     121,    83,    28,    58,   193,   254,   188,   189,   204,   254,
+       0,   140,   142,    48,    80,   190,    29,   137,   186,    30,
+     140,   143,     3,   254,   125,   179,    71,   179,   254,   254,
+     254,   254,   254,     5,     7,    21,    22,    23,    35,    36,
+      43,    44,    51,    52,    54,    59,    64,    67,    81,    82,
+      89,    92,   107,   117,   120,   123,   124,   133,   139,   144,
+     158,   194,   195,   196,   198,   230,   231,   232,   233,   234,
+     235,   236,   237,   244,   247,   250,   254,   115,   146,    33,
+     144,   190,    83,   186,   193,   104,   192,    31,    60,     5,
+     118,   119,   137,   180,     5,   180,    95,   144,   135,   224,
+     225,   132,   144,   192,     7,     7,   134,   230,   240,   241,
+     144,    82,   144,     5,   144,   144,    82,   190,   230,     5,
+      71,   197,   146,    21,    22,    33,   251,   254,    23,    24,
+     147,   252,    98,    22,   233,    27,   144,   183,   184,   254,
+     189,   144,   198,   253,   254,   179,   254,   191,     7,    46,
+      47,    46,    47,   144,   180,   254,   156,   157,   254,    10,
+      63,   144,   226,   227,   228,   229,   230,   247,   144,   253,
+     226,   134,   238,   239,    61,   241,   242,     7,    53,    76,
+      90,    91,   113,   138,   245,   245,   230,     7,   145,   145,
+     144,   198,   201,   202,   205,   234,   254,   224,   196,   254,
+     231,   232,   144,   254,   254,    23,    58,   145,   230,   243,
+     146,   224,    11,   145,   146,   180,   192,   156,    45,    70,
+     103,   129,   162,   254,   254,   169,   170,   171,   172,   173,
+     174,   254,   144,   165,   145,   146,    82,   158,   229,   198,
+     226,   230,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    18,    19,    77,   249,    20,   244,   246,   145,
+     122,   230,   239,   242,   230,    62,   145,    71,    71,   145,
+     201,    33,   203,   204,    72,    79,    87,   109,   200,   146,
+     203,    39,   127,   199,    73,   206,    99,   213,   214,   145,
+     243,   145,   146,   184,   230,   254,   144,    85,    85,   144,
+     145,   146,     5,     7,    28,    65,    94,    95,   126,   144,
+     254,   255,   247,   248,   254,   131,   162,   163,   164,   156,
+      10,    45,    55,    92,   103,   108,   129,   159,   160,   161,
+     145,   227,   228,    17,    18,    19,    77,   230,   144,   198,
+     230,    10,    92,   145,   146,   132,   230,   122,    62,   230,
+       7,   145,   204,    97,    97,    97,    84,   201,     7,     7,
+     203,    42,    75,   207,    42,   145,    96,   215,   145,   230,
+     226,   144,   144,   253,   170,   253,   145,   146,    37,    40,
+      41,   116,   175,   146,   137,   166,    92,   144,   244,    85,
+     254,   159,   230,   144,   198,     9,   243,    92,   244,   144,
+     230,   145,    69,   145,   202,   101,   101,   243,   226,    96,
+     208,   243,    42,   106,   112,   216,   217,   145,   253,   253,
+     145,   145,   247,   144,   176,   162,    38,    99,   167,   226,
+     144,     9,   243,   230,   145,   246,     7,    95,    42,    88,
+     209,   220,   221,   230,    19,   145,   145,   169,   144,    42,
+     145,   254,   230,   145,   145,   145,   226,   220,     7,   136,
+     210,   211,   212,   146,    34,    57,   222,     7,    50,   128,
+     218,   108,   145,   169,    74,   106,   168,   145,   254,   212,
+     221,    93,   223,   102,   110,   102,     9,   254,   145,   144,
+      33,    66,    86,     7,    50,   128,   219,   144,   253,   144,
+      68,   110,    68,   253,   145,   213,   145,   100,   145,     7
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const yytype_uint8 yyr1[] =
+static const yytype_uint16 yyr1[] =
 {
-       0,   147,   148,   148,   148,   148,   148,   148,   149,   149,
-     149,   149,   149,   149,   149,   149,   149,   149,   150,   151,
-     151,   151,   151,   152,   153,   154,   155,   156,   156,   157,
-     157,   157,   157,   157,   157,   157,   157,   157,   157,   157,
-     157,   157,   157,   157,   157,   157,   157,   158,   158,   158,
-     158,   158,   158,   158,   159,   159,   160,   160,   161,   161,
-     161,   161,   162,   162,   163,   163,   164,   164,   165,   165,
-     166,   166,   167,   167,   168,   168,   169,   169,   169,   170,
-     170,   171,   172,   173,   173,   173,   173,   174,   174,   175,
-     175,   175,   175,   176,   177,   177,   178,   178,   178,   178,
-     179,   180,   181,   181,   182,   183,   183,   184,   184,   185,
-     186,   186,   187,   188,   188,   189,   189,   190,   191,   191,
-     191,   192,   192,   193,   193,   194,   194,   194,   195,   196,
-     197,   197,   197,   198,   198,   198,   198,   198,   198,   198,
-     198,   199,   199,   200,   200,   200,   200,   200,   200,   201,
-     201,   202,   202,   203,   203,   204,   204,   205,   205,   206,
-     206,   207,   207,   208,   208,   209,   209,   210,   211,   212,
-     212,   213,   213,   214,   214,   215,   215,   216,   216,   216,
-     217,   217,   217,   218,   218,   219,   220,   220,   220,   221,
-     221,   221,   222,   222,   223,   224,   224,   225,   225,   226,
-     226,   227,   227,   227,   227,   227,   227,   227,   227,   227,
-     227,   227,   228,   228,   229,   229,   230,   230,   231,   231,
-     231,   231,   231,   231,   231,   231,   231,   231,   232,   232,
-     232,   232,   233,   234,   234,   235,   235,   236,   236,   237,
-     238,   238,   239,   240,   240,   241,   241,   242,   242,   242,
-     242,   242,   242,   242,   242,   243,   243,   243,   243,   243,
-     243,   244,   244,   245,   245,   246,   246,   247,   247,   247,
-     247,   247,   247,   247,   247,   247,   247,   248,   249,   249,
-     250,   250,   250,   251,   251,   252,   252,   253,   253,   253,
-     253,   254,   255,   255
+       0,   148,   149,   149,   149,   149,   149,   149,   150,   150,
+     150,   150,   150,   150,   150,   150,   150,   150,   151,   152,
+     152,   152,   152,   153,   154,   155,   156,   157,   157,   158,
+     158,   158,   158,   158,   158,   158,   158,   158,   158,   158,
+     158,   158,   158,   158,   158,   158,   158,   159,   159,   159,
+     159,   159,   159,   159,   160,   160,   161,   161,   162,   162,
+     162,   162,   163,   163,   164,   164,   165,   165,   166,   166,
+     167,   167,   168,   168,   169,   169,   170,   170,   170,   170,
+     171,   171,   171,   172,   173,   174,   175,   175,   175,   175,
+     176,   176,   177,   177,   177,   177,   178,   178,   178,   178,
+     179,   179,   179,   180,   180,   181,   182,   183,   183,   184,
+     185,   185,   186,   186,   187,   188,   188,   189,   190,   190,
+     191,   191,   192,   193,   193,   193,   194,   194,   195,   195,
+     196,   196,   196,   197,   198,   199,   199,   199,   200,   200,
+     200,   200,   200,   200,   200,   200,   201,   201,   202,   202,
+     202,   202,   202,   202,   203,   203,   204,   204,   205,   205,
+     206,   206,   207,   207,   208,   208,   209,   209,   210,   210,
+     211,   211,   212,   213,   214,   214,   215,   215,   216,   216,
+     217,   217,   218,   218,   218,   219,   219,   219,   220,   220,
+     221,   222,   222,   222,   223,   223,   223,   224,   224,   225,
+     226,   226,   227,   227,   228,   228,   229,   229,   229,   229,
+     229,   229,   229,   229,   229,   229,   229,   230,   230,   231,
+     231,   232,   232,   233,   233,   233,   233,   233,   233,   233,
+     233,   233,   233,   234,   234,   234,   234,   235,   236,   236,
+     237,   237,   238,   238,   239,   240,   240,   241,   242,   242,
+     243,   243,   244,   244,   244,   244,   244,   244,   244,   244,
+     245,   245,   245,   245,   245,   245,   246,   246,   247,   247,
+     248,   248,   249,   249,   249,   249,   249,   249,   249,   249,
+     249,   249,   250,   251,   251,   252,   252,   252,   253,   253,
+     254,   254,   255,   255,   255,   255,   256,   257,   257
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1437,29 +1475,29 @@
        1,     1,     1,     2,     2,     4,     4,     1,     2,     1,
        2,     2,     4,     5,     2,     1,     0,     1,     4,     5,
       10,     4,     3,     1,     0,     1,     0,     3,     0,     5,
-       0,     8,     1,     1,     1,     3,     1,     1,     1,     2,
-       2,     4,     2,     1,     1,     1,     1,     0,     3,    10,
-       7,     4,     5,     5,     0,     4,     2,     2,     4,     4,
-       5,     4,     3,     1,     3,     2,     3,     0,     3,     2,
-       1,     3,     3,     4,     1,     3,     1,    10,     0,     1,
-       1,     1,     1,     1,     3,     3,     2,     1,     2,     3,
-       0,     3,     3,     0,     1,     1,     2,     1,     2,     1,
-       2,     6,     1,     2,     3,     2,     2,     1,     3,     1,
-       2,     1,     4,     1,     3,     0,     3,     0,     2,     0,
-       3,     0,     2,     0,     1,     1,     2,     6,     3,     0,
-       3,     0,     3,     0,     5,     1,     1,     2,     2,     2,
-       2,     2,     2,     1,     3,     3,     0,     1,     1,     0,
-       2,     2,     0,     1,     2,     3,     1,     3,     1,     2,
-       1,     5,     6,     4,     3,     3,     3,     2,     3,     5,
-       4,     6,     3,     1,     3,     1,     2,     1,     1,     1,
-       1,     3,     5,     1,     1,     1,     3,     1,     3,     4,
-       4,     5,     6,     6,     8,     5,     4,     1,     2,     4,
-       1,     2,     4,     0,     2,     1,     3,     1,     1,     2,
-       2,     1,     2,     3,     2,     1,     1,     1,     1,     1,
-       1,     1,     3,     1,     3,     1,     3,     1,     1,     1,
-       1,     1,     1,     1,     2,     1,     2,     1,     1,     1,
-       1,     1,     1,     1,     3,     1,     1,     1,     1,     1,
-       1,     2,     2,     0
+       0,     8,     1,     1,     1,     3,     1,     1,     1,     1,
+       2,     2,     2,     4,     2,     2,     1,     1,     1,     1,
+       0,     3,    10,     7,     4,     5,     5,     4,     4,     5,
+       2,     2,     2,     0,     4,     5,     4,     3,     1,     3,
+       2,     3,     0,     3,     2,     1,     3,     3,     4,     1,
+       3,     1,    10,     0,     1,     1,     1,     1,     1,     3,
+       3,     2,     1,     2,     3,     0,     3,     3,     0,     1,
+       1,     2,     1,     2,     1,     2,     6,     1,     2,     3,
+       2,     2,     1,     3,     1,     2,     1,     4,     1,     3,
+       0,     3,     0,     2,     0,     3,     0,     2,     0,     1,
+       1,     2,     6,     3,     0,     3,     0,     3,     0,     5,
+       1,     1,     2,     2,     2,     2,     2,     2,     1,     3,
+       3,     0,     1,     1,     0,     2,     2,     0,     1,     2,
+       3,     1,     3,     1,     2,     1,     5,     6,     4,     3,
+       3,     3,     2,     3,     5,     4,     6,     3,     1,     3,
+       1,     2,     1,     1,     1,     1,     3,     5,     1,     1,
+       1,     3,     1,     3,     4,     4,     5,     6,     6,     8,
+       5,     4,     1,     2,     4,     1,     2,     4,     0,     2,
+       1,     3,     1,     1,     2,     2,     1,     2,     3,     2,
+       1,     1,     1,     1,     1,     1,     1,     3,     1,     3,
+       1,     3,     1,     1,     1,     1,     1,     1,     1,     2,
+       1,     2,     1,     1,     1,     1,     1,     1,     1,     3,
+       1,     1,     1,     1,     1,     1,     2,     2,     0
 };
 
 
@@ -1956,1061 +1994,1071 @@
   switch (yytype)
     {
           case 3: /* TOKEN_COMMAND  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).string_value_) != nullptr) {
     delete ((*yyvaluep).string_value_);
   }
 }
-#line 1966 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2004 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
     case 4: /* TOKEN_NAME  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).string_value_) != nullptr) {
     delete ((*yyvaluep).string_value_);
   }
 }
-#line 1976 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2014 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
     case 5: /* TOKEN_STRING_SINGLE_QUOTED  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).string_value_) != nullptr) {
     delete ((*yyvaluep).string_value_);
   }
 }
-#line 1986 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2024 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
     case 6: /* TOKEN_STRING_DOUBLE_QUOTED  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).string_value_) != nullptr) {
     delete ((*yyvaluep).string_value_);
   }
 }
-#line 1996 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2034 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
     case 7: /* TOKEN_UNSIGNED_NUMVAL  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).numeric_literal_value_) != nullptr) {
     delete ((*yyvaluep).numeric_literal_value_);
   }
 }
-#line 2006 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2044 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 149: /* sql_statement  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 150: /* sql_statement  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).statement_) != nullptr) {
     delete ((*yyvaluep).statement_);
   }
 }
-#line 2016 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2054 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 150: /* quit_statement  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 151: /* quit_statement  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).quit_statement_) != nullptr) {
     delete ((*yyvaluep).quit_statement_);
   }
 }
-#line 2026 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2064 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 151: /* alter_table_statement  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 152: /* alter_table_statement  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).statement_) != nullptr) {
     delete ((*yyvaluep).statement_);
   }
 }
-#line 2036 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2074 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 152: /* create_table_statement  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 153: /* create_table_statement  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).create_table_statement_) != nullptr) {
     delete ((*yyvaluep).create_table_statement_);
   }
 }
-#line 2046 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2084 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 153: /* create_index_statement  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 154: /* create_index_statement  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).statement_) != nullptr) {
     delete ((*yyvaluep).statement_);
   }
 }
-#line 2056 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2094 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 154: /* drop_table_statement  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 155: /* drop_table_statement  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).drop_table_statement_) != nullptr) {
     delete ((*yyvaluep).drop_table_statement_);
   }
 }
-#line 2066 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2104 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 155: /* column_def  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 156: /* column_def  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).attribute_definition_) != nullptr) {
     delete ((*yyvaluep).attribute_definition_);
   }
 }
-#line 2076 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2114 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 156: /* column_def_commalist  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 157: /* column_def_commalist  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).attribute_definition_list_) != nullptr) {
     delete ((*yyvaluep).attribute_definition_list_);
   }
 }
-#line 2086 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2124 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 157: /* data_type  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 158: /* data_type  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).data_type_) != nullptr) {
     delete ((*yyvaluep).data_type_);
   }
 }
-#line 2096 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2134 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 158: /* column_constraint_def  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 159: /* column_constraint_def  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).column_constraint_) != nullptr) {
     delete ((*yyvaluep).column_constraint_);
   }
 }
-#line 2106 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2144 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 159: /* column_constraint_def_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 160: /* column_constraint_def_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).column_constraint_list_) != nullptr) {
     delete ((*yyvaluep).column_constraint_list_);
   }
 }
-#line 2116 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2154 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 160: /* opt_column_constraint_def_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 161: /* opt_column_constraint_def_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).column_constraint_list_) != nullptr) {
     delete ((*yyvaluep).column_constraint_list_);
   }
 }
-#line 2126 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2164 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 164: /* opt_column_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 165: /* opt_column_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).attribute_list_) != nullptr) {
     delete ((*yyvaluep).attribute_list_);
   }
 }
-#line 2136 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2174 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 165: /* opt_block_properties  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 166: /* opt_block_properties  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).block_properties_) != nullptr) {
     delete ((*yyvaluep).block_properties_);
   }
 }
-#line 2146 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2184 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 166: /* opt_partition_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 167: /* opt_partition_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).partition_clause_) != nullptr) {
     delete ((*yyvaluep).partition_clause_);
   }
 }
-#line 2156 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2194 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 167: /* partition_type  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 168: /* partition_type  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).string_value_) != nullptr) {
     delete ((*yyvaluep).string_value_);
   }
 }
-#line 2166 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2204 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 168: /* key_value_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 169: /* key_value_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).key_value_list_) != nullptr) {
     delete ((*yyvaluep).key_value_list_);
   }
 }
-#line 2176 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2214 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 169: /* key_value  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 170: /* key_value  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).key_value_) != nullptr) {
     delete ((*yyvaluep).key_value_);
   }
 }
-#line 2186 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2224 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 170: /* key_string_value  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 171: /* key_string_value  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).key_string_value_) != nullptr) {
     delete ((*yyvaluep).key_string_value_);
   }
 }
-#line 2196 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2234 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 171: /* key_string_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 172: /* key_string_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).key_string_list_) != nullptr) {
     delete ((*yyvaluep).key_string_list_);
   }
 }
-#line 2206 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2244 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 172: /* key_integer_value  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 173: /* key_integer_value  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).key_integer_value_) != nullptr) {
     delete ((*yyvaluep).key_integer_value_);
   }
 }
-#line 2216 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2254 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 173: /* index_type  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 174: /* key_bool_value  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
+      {
+  if (((*yyvaluep).key_bool_value_) != nullptr) {
+    delete ((*yyvaluep).key_bool_value_);
+  }
+}
+#line 2264 "SqlParser_gen.cpp" /* yacc.c:1257  */
+        break;
+
+    case 175: /* index_type  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).string_value_) != nullptr) {
     delete ((*yyvaluep).string_value_);
   }
 }
-#line 2226 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2274 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 174: /* opt_index_properties  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 176: /* opt_index_properties  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).key_value_list_) != nullptr) {
     delete ((*yyvaluep).key_value_list_);
   }
 }
-#line 2236 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2284 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 175: /* insert_statement  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 177: /* insert_statement  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).insert_statement_) != nullptr) {
     delete ((*yyvaluep).insert_statement_);
   }
 }
-#line 2246 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2294 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 176: /* copy_from_statement  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 178: /* copy_statement  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
-  if (((*yyvaluep).copy_from_statement_) != nullptr) {
-    delete ((*yyvaluep).copy_from_statement_);
+  if (((*yyvaluep).copy_statement_) != nullptr) {
+    delete ((*yyvaluep).copy_statement_);
   }
 }
-#line 2256 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2304 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 177: /* opt_copy_from_params  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 179: /* copy_to_target  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
-  if (((*yyvaluep).copy_from_params_) != nullptr) {
-    delete ((*yyvaluep).copy_from_params_);
+  if (((*yyvaluep).string_value_) != nullptr) {
+    delete ((*yyvaluep).string_value_);
   }
 }
-#line 2266 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2314 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 178: /* copy_from_params  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 180: /* opt_copy_params  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
-  if (((*yyvaluep).copy_from_params_) != nullptr) {
-    delete ((*yyvaluep).copy_from_params_);
+  if (((*yyvaluep).key_value_list_) != nullptr) {
+    delete ((*yyvaluep).key_value_list_);
   }
 }
-#line 2276 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2324 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 179: /* update_statement  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 181: /* update_statement  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).update_statement_) != nullptr) {
     delete ((*yyvaluep).update_statement_);
   }
 }
-#line 2286 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2334 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 180: /* delete_statement  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 182: /* delete_statement  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).delete_statement_) != nullptr) {
     delete ((*yyvaluep).delete_statement_);
   }
 }
-#line 2296 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2344 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 181: /* assignment_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 183: /* assignment_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).assignment_list_) != nullptr) {
     delete ((*yyvaluep).assignment_list_);
   }
 }
-#line 2306 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2354 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 182: /* assignment_item  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 184: /* assignment_item  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).assignment_) != nullptr) {
     delete ((*yyvaluep).assignment_);
   }
 }
-#line 2316 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2364 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 183: /* set_operation_statement  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 185: /* set_operation_statement  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).set_operation_statement_) != nullptr) {
     delete ((*yyvaluep).set_operation_statement_);
   }
 }
-#line 2326 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2374 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 184: /* opt_priority_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 186: /* opt_priority_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).opt_priority_clause_) != nullptr) {
     delete ((*yyvaluep).opt_priority_clause_);
   }
 }
-#line 2336 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2384 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 185: /* with_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 187: /* with_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).with_list_) != nullptr) {
     delete ((*yyvaluep).with_list_);
   }
 }
-#line 2346 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2394 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 186: /* with_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 188: /* with_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).with_list_) != nullptr) {
     delete ((*yyvaluep).with_list_);
   }
 }
-#line 2356 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2404 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 187: /* with_list_element  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 189: /* with_list_element  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).with_list_element_) != nullptr) {
     delete ((*yyvaluep).with_list_element_);
   }
 }
-#line 2366 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2414 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 188: /* set_operation_union  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 190: /* set_operation_union  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).set_operation_) != nullptr) {
     delete ((*yyvaluep).set_operation_);
   }
 }
-#line 2376 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2424 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 189: /* set_operation_intersect  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 191: /* set_operation_intersect  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).set_operation_) != nullptr) {
     delete ((*yyvaluep).set_operation_);
   }
 }
-#line 2386 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2434 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 190: /* select_query  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 192: /* select_query  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).select_query_) != nullptr) {
     delete ((*yyvaluep).select_query_);
   }
 }
-#line 2396 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2444 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 191: /* opt_all_distinct  */
-#line 624 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 193: /* opt_all_distinct  */
+#line 625 "../SqlParser.ypp" /* yacc.c:1257  */
       { }
-#line 2402 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2450 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 192: /* selection  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 194: /* selection  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).selection_) != nullptr) {
     delete ((*yyvaluep).selection_);
   }
 }
-#line 2412 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2460 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 193: /* selection_item_commalist  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 195: /* selection_item_commalist  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).selection_list_) != nullptr) {
     delete ((*yyvaluep).selection_list_);
   }
 }
-#line 2422 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2470 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 194: /* selection_item  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 196: /* selection_item  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).selection_item_) != nullptr) {
     delete ((*yyvaluep).selection_item_);
   }
 }
-#line 2432 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2480 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 195: /* from_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 197: /* from_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).table_reference_list_) != nullptr) {
     delete ((*yyvaluep).table_reference_list_);
   }
 }
-#line 2442 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2490 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 196: /* subquery_expression  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 198: /* subquery_expression  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).subquery_expression_) != nullptr) {
     delete ((*yyvaluep).subquery_expression_);
   }
 }
-#line 2452 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2500 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 197: /* opt_sample_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 199: /* opt_sample_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).opt_sample_clause_) != nullptr) {
     delete ((*yyvaluep).opt_sample_clause_);
   }
 }
-#line 2462 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2510 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 198: /* join_type  */
-#line 628 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 200: /* join_type  */
+#line 629 "../SqlParser.ypp" /* yacc.c:1257  */
       { }
-#line 2468 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2516 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 199: /* joined_table_reference  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 201: /* joined_table_reference  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).table_reference_) != nullptr) {
     delete ((*yyvaluep).table_reference_);
   }
 }
-#line 2478 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2526 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 200: /* table_reference  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 202: /* table_reference  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).table_reference_) != nullptr) {
     delete ((*yyvaluep).table_reference_);
   }
 }
-#line 2488 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2536 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 201: /* table_reference_signature  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 203: /* table_reference_signature  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).table_reference_signature_) != nullptr) {
     delete ((*yyvaluep).table_reference_signature_);
   }
 }
-#line 2498 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2546 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 202: /* table_reference_signature_primary  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 204: /* table_reference_signature_primary  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).table_reference_signature_) != nullptr) {
     delete ((*yyvaluep).table_reference_signature_);
   }
 }
-#line 2508 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2556 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 203: /* joined_table_reference_commalist  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 205: /* joined_table_reference_commalist  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).table_reference_list_) != nullptr) {
     delete ((*yyvaluep).table_reference_list_);
   }
 }
-#line 2518 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2566 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 204: /* opt_group_by_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 206: /* opt_group_by_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).opt_group_by_clause_) != nullptr) {
     delete ((*yyvaluep).opt_group_by_clause_);
   }
 }
-#line 2528 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2576 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 205: /* opt_having_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 207: /* opt_having_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).opt_having_clause_) != nullptr) {
     delete ((*yyvaluep).opt_having_clause_);
   }
 }
-#line 2538 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2586 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 206: /* opt_order_by_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 208: /* opt_order_by_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).opt_order_by_clause_) != nullptr) {
     delete ((*yyvaluep).opt_order_by_clause_);
   }
 }
-#line 2548 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2596 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 207: /* opt_limit_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 209: /* opt_limit_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).opt_limit_clause_) != nullptr) {
     delete ((*yyvaluep).opt_limit_clause_);
   }
 }
-#line 2558 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2606 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 208: /* opt_window_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 210: /* opt_window_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).opt_window_clause_) != nullptr) {
     delete ((*yyvaluep).opt_window_clause_);
   }
 }
-#line 2568 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2616 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 209: /* window_declaration_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 211: /* window_declaration_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).opt_window_clause_) != nullptr) {
     delete ((*yyvaluep).opt_window_clause_);
   }
 }
-#line 2578 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2626 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 210: /* window_declaration  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 212: /* window_declaration  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).window_definition_) != nullptr) {
     delete ((*yyvaluep).window_definition_);
   }
 }
-#line 2588 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2636 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 211: /* window_definition  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 213: /* window_definition  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).window_definition_) != nullptr) {
     delete ((*yyvaluep).window_definition_);
   }
 }
-#line 2598 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2646 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 212: /* opt_window_partition  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 214: /* opt_window_partition  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).window_partition_by_list_) != nullptr) {
     delete ((*yyvaluep).window_partition_by_list_);
   }
 }
-#line 2608 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2656 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 213: /* opt_window_order  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 215: /* opt_window_order  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).window_order_by_list_) != nullptr) {
     delete ((*yyvaluep).window_order_by_list_);
   }
 }
-#line 2618 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2666 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 214: /* opt_window_frame  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 216: /* opt_window_frame  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).window_frame_info_) != nullptr) {
     delete ((*yyvaluep).window_frame_info_);
   }
 }
-#line 2628 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2676 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 215: /* frame_mode  */
-#line 624 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 217: /* frame_mode  */
+#line 625 "../SqlParser.ypp" /* yacc.c:1257  */
       { }
-#line 2634 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2682 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 216: /* frame_preceding  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 218: /* frame_preceding  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).numeric_literal_value_) != nullptr) {
     delete ((*yyvaluep).numeric_literal_value_);
   }
 }
-#line 2644 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2692 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 217: /* frame_following  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 219: /* frame_following  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).numeric_literal_value_) != nullptr) {
     delete ((*yyvaluep).numeric_literal_value_);
   }
 }
-#line 2654 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2702 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 218: /* order_commalist  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 220: /* order_commalist  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).order_commalist_) != nullptr) {
     delete ((*yyvaluep).order_commalist_);
   }
 }
-#line 2664 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2712 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 219: /* order_item  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 221: /* order_item  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).order_item_) != nullptr) {
     delete ((*yyvaluep).order_item_);
   }
 }
-#line 2674 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2722 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 220: /* opt_order_direction  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 222: /* opt_order_direction  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).order_direction_) != nullptr) {
     delete ((*yyvaluep).order_direction_);
   }
 }
-#line 2684 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2732 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 221: /* opt_nulls_first  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 223: /* opt_nulls_first  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).order_direction_) != nullptr) {
     delete ((*yyvaluep).order_direction_);
   }
 }
-#line 2694 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2742 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 222: /* opt_where_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 224: /* opt_where_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).predicate_) != nullptr) {
     delete ((*yyvaluep).predicate_);
   }
 }
-#line 2704 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2752 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 223: /* where_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 225: /* where_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).predicate_) != nullptr) {
     delete ((*yyvaluep).predicate_);
   }
 }
-#line 2714 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2762 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 224: /* or_expression  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 226: /* or_expression  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).predicate_) != nullptr) {
     delete ((*yyvaluep).predicate_);
   }
 }
-#line 2724 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2772 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 225: /* and_expression  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 227: /* and_expression  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).predicate_) != nullptr) {
     delete ((*yyvaluep).predicate_);
   }
 }
-#line 2734 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2782 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 226: /* not_expression  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 228: /* not_expression  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).predicate_) != nullptr) {
     delete ((*yyvaluep).predicate_);
   }
 }
-#line 2744 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2792 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 227: /* predicate_expression_base  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 229: /* predicate_expression_base  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).predicate_) != nullptr) {
     delete ((*yyvaluep).predicate_);
   }
 }
-#line 2754 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2802 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 228: /* add_expression  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 230: /* add_expression  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).expression_) != nullptr) {
     delete ((*yyvaluep).expression_);
   }
 }
-#line 2764 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2812 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 229: /* multiply_expression  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 231: /* multiply_expression  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).expression_) != nullptr) {
     delete ((*yyvaluep).expression_);
   }
 }
-#line 2774 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2822 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 230: /* unary_expression  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 232: /* unary_expression  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).expression_) != nullptr) {
     delete ((*yyvaluep).expression_);
   }
 }
-#line 2784 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2832 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 231: /* expression_base  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 233: /* expression_base  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).expression_) != nullptr) {
     delete ((*yyvaluep).expression_);
   }
 }
-#line 2794 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2842 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 232: /* function_call  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 234: /* function_call  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).function_call_) != nullptr) {
     delete ((*yyvaluep).function_call_);
   }
 }
-#line 2804 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2852 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 233: /* extract_function  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 235: /* extract_function  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).expression_) != nullptr) {
     delete ((*yyvaluep).expression_);
   }
 }
-#line 2814 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2862 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 234: /* substr_function  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 236: /* substr_function  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).expression_) != nullptr) {
     delete ((*yyvaluep).expression_);
   }
 }
-#line 2824 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2872 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 235: /* case_expression  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 237: /* case_expression  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).expression_) != nullptr) {
     delete ((*yyvaluep).expression_);
   }
 }
-#line 2834 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2882 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 236: /* simple_when_clause_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 238: /* simple_when_clause_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).simple_when_clause_list_) != nullptr) {
     delete ((*yyvaluep).simple_when_clause_list_);
   }
 }
-#line 2844 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2892 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 237: /* simple_when_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 239: /* simple_when_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).simple_when_clause_) != nullptr) {
     delete ((*yyvaluep).simple_when_clause_);
   }
 }
-#line 2854 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2902 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 238: /* searched_when_clause_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 240: /* searched_when_clause_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).searched_when_clause_list_) != nullptr) {
     delete ((*yyvaluep).searched_when_clause_list_);
   }
 }
-#line 2864 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2912 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 239: /* searched_when_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 241: /* searched_when_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).searched_when_clause_) != nullptr) {
     delete ((*yyvaluep).searched_when_clause_);
   }
 }
-#line 2874 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2922 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 240: /* opt_else_clause  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 242: /* opt_else_clause  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).expression_) != nullptr) {
     delete ((*yyvaluep).expression_);
   }
 }
-#line 2884 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2932 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 241: /* expression_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 243: /* expression_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).expression_list_) != nullptr) {
     delete ((*yyvaluep).expression_list_);
   }
 }
-#line 2894 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2942 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 242: /* literal_value  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 244: /* literal_value  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).literal_value_) != nullptr) {
     delete ((*yyvaluep).literal_value_);
   }
 }
-#line 2904 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2952 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 243: /* datetime_unit  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 245: /* datetime_unit  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).string_value_) != nullptr) {
     delete ((*yyvaluep).string_value_);
   }
 }
-#line 2914 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2962 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 244: /* literal_value_commalist  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 246: /* literal_value_commalist  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).literal_value_list_) != nullptr) {
     delete ((*yyvaluep).literal_value_list_);
   }
 }
-#line 2924 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2972 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 245: /* attribute_ref  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 247: /* attribute_ref  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).attribute_) != nullptr) {
     delete ((*yyvaluep).attribute_);
   }
 }
-#line 2934 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2982 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 246: /* attribute_ref_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 248: /* attribute_ref_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).attribute_list_) != nullptr) {
     delete ((*yyvaluep).attribute_list_);
   }
 }
-#line 2944 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2992 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 247: /* comparison_operation  */
-#line 625 "../SqlParser.ypp" /* yacc.c:1257  */
-      { }
-#line 2950 "SqlParser_gen.cpp" /* yacc.c:1257  */
-        break;
-
-    case 248: /* unary_operation  */
+    case 249: /* comparison_operation  */
 #line 626 "../SqlParser.ypp" /* yacc.c:1257  */
       { }
-#line 2956 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 2998 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 249: /* add_operation  */
+    case 250: /* unary_operation  */
 #line 627 "../SqlParser.ypp" /* yacc.c:1257  */
       { }
-#line 2962 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 3004 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 250: /* multiply_operation  */
-#line 627 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 251: /* add_operation  */
+#line 628 "../SqlParser.ypp" /* yacc.c:1257  */
       { }
-#line 2968 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 3010 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 251: /* name_commalist  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 252: /* multiply_operation  */
+#line 628 "../SqlParser.ypp" /* yacc.c:1257  */
+      { }
+#line 3016 "SqlParser_gen.cpp" /* yacc.c:1257  */
+        break;
+
+    case 253: /* name_commalist  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).string_list_) != nullptr) {
     delete ((*yyvaluep).string_list_);
   }
 }
-#line 2978 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 3026 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 252: /* any_name  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 254: /* any_name  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).string_value_) != nullptr) {
     delete ((*yyvaluep).string_value_);
   }
 }
-#line 2988 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 3036 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 253: /* boolean_value  */
-#line 624 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 255: /* boolean_value  */
+#line 625 "../SqlParser.ypp" /* yacc.c:1257  */
       { }
-#line 2994 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 3042 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 254: /* command  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 256: /* command  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).command_) != nullptr) {
     delete ((*yyvaluep).command_);
   }
 }
-#line 3004 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 3052 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
-    case 255: /* command_argument_list  */
-#line 630 "../SqlParser.ypp" /* yacc.c:1257  */
+    case 257: /* command_argument_list  */
+#line 631 "../SqlParser.ypp" /* yacc.c:1257  */
       {
   if (((*yyvaluep).command_argument_list_) != nullptr) {
     delete ((*yyvaluep).command_argument_list_);
   }
 }
-#line 3014 "SqlParser_gen.cpp" /* yacc.c:1257  */
+#line 3062 "SqlParser_gen.cpp" /* yacc.c:1257  */
         break;
 
 
@@ -3302,148 +3350,148 @@
   switch (yyn)
     {
         case 2:
-#line 639 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 640 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     *parsedStatement = (yyvsp[-1].statement_);
     YYACCEPT;
   }
-#line 3311 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3359 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 3:
-#line 643 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 644 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     *parsedStatement = (yyvsp[-1].statement_);
     YYACCEPT;
   }
-#line 3320 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3368 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 4:
-#line 647 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 648 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     *parsedStatement = (yyvsp[-1].command_);
     YYACCEPT;
   }
-#line 3329 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3377 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 5:
-#line 651 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 652 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     *parsedStatement = (yyvsp[-1].command_);
     YYACCEPT;
   }
-#line 3338 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3386 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 6:
-#line 655 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 656 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     YYABORT;
   }
-#line 3346 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3394 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 7:
-#line 658 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 659 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     // Regular yyparse() return codes are non-negative, so use a negative one here.
     return -1;
   }
-#line 3355 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 8:
-#line 665 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.statement_) = (yyvsp[0].statement_);
-  }
-#line 3363 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 9:
-#line 668 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.statement_) = (yyvsp[0].copy_from_statement_);
-  }
-#line 3371 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 10:
-#line 671 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.statement_) = (yyvsp[0].create_table_statement_);
-  }
-#line 3379 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 11:
-#line 674 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.statement_) = (yyvsp[0].statement_);
-  }
-#line 3387 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 12:
-#line 677 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.statement_) = (yyvsp[0].delete_statement_);
-  }
-#line 3395 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 13:
-#line 680 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.statement_) = (yyvsp[0].drop_table_statement_);
-  }
 #line 3403 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 14:
-#line 683 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 8:
+#line 666 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.statement_) = (yyvsp[0].insert_statement_);
+    (yyval.statement_) = (yyvsp[0].statement_);
   }
 #line 3411 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 15:
-#line 686 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 9:
+#line 669 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.statement_) = (yyvsp[0].quit_statement_);
+    (yyval.statement_) = (yyvsp[0].copy_statement_);
   }
 #line 3419 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 16:
-#line 689 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 10:
+#line 672 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.statement_) = (yyvsp[0].set_operation_statement_);
+    (yyval.statement_) = (yyvsp[0].create_table_statement_);
   }
 #line 3427 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 17:
-#line 692 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 11:
+#line 675 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.statement_) = (yyvsp[0].update_statement_);
+    (yyval.statement_) = (yyvsp[0].statement_);
   }
 #line 3435 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 18:
-#line 698 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 12:
+#line 678 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.quit_statement_) = new quickstep::ParseStatementQuit((yylsp[0]).first_line, (yylsp[0]).first_column);
+    (yyval.statement_) = (yyvsp[0].delete_statement_);
   }
 #line 3443 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
+  case 13:
+#line 681 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.statement_) = (yyvsp[0].drop_table_statement_);
+  }
+#line 3451 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 14:
+#line 684 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.statement_) = (yyvsp[0].insert_statement_);
+  }
+#line 3459 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 15:
+#line 687 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.statement_) = (yyvsp[0].quit_statement_);
+  }
+#line 3467 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 16:
+#line 690 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.statement_) = (yyvsp[0].set_operation_statement_);
+  }
+#line 3475 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 17:
+#line 693 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.statement_) = (yyvsp[0].update_statement_);
+  }
+#line 3483 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 18:
+#line 699 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.quit_statement_) = new quickstep::ParseStatementQuit((yylsp[0]).first_line, (yylsp[0]).first_column);
+  }
+#line 3491 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
   case 19:
-#line 704 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 705 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     delete (yyvsp[-3].string_value_);
     delete (yyvsp[0].attribute_definition_);
@@ -3451,22 +3499,22 @@
     NotSupported(&(yylsp[-5]), yyscanner, "ALTER statements");
     YYERROR;
   }
-#line 3455 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3503 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 20:
-#line 711 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 712 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     delete (yyvsp[-3].string_value_);
     (yyval.statement_) = nullptr;
     NotSupported(&(yylsp[-5]), yyscanner, "ALTER statements");
     YYERROR;
   }
-#line 3466 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3514 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 21:
-#line 717 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 718 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     delete (yyvsp[-3].string_value_);
     delete (yyvsp[0].string_value_);
@@ -3474,11 +3522,11 @@
     NotSupported(&(yylsp[-5]), yyscanner, "ALTER statements");
     YYERROR;
   }
-#line 3478 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3526 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 22:
-#line 724 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 725 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     delete (yyvsp[-3].string_value_);
     delete (yyvsp[0].string_value_);
@@ -3486,19 +3534,19 @@
     NotSupported(&(yylsp[-5]), yyscanner, "ALTER statements");
     YYERROR;
   }
-#line 3490 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3538 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 23:
-#line 733 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 734 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.create_table_statement_) = new quickstep::ParseStatementCreateTable((yylsp[-8]).first_line, (yylsp[-8]).first_column, (yyvsp[-6].string_value_), (yyvsp[-4].attribute_definition_list_), (yyvsp[-1].block_properties_), (yyvsp[0].partition_clause_));
   }
-#line 3498 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3546 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 24:
-#line 738 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 739 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     if ((yyvsp[0].key_value_list_)) {
       (yyval.statement_) = new quickstep::ParseStatementCreateIndex((yylsp[-8]).first_line, (yylsp[-8]).first_column, (yyvsp[-6].string_value_), (yyvsp[-4].string_value_), (yyvsp[-3].attribute_list_), (yyvsp[-1].string_value_), (yylsp[0]).first_line, (yylsp[0]).first_column, (yyvsp[0].key_value_list_));
@@ -3506,153 +3554,153 @@
       (yyval.statement_) = new quickstep::ParseStatementCreateIndex((yylsp[-8]).first_line, (yylsp[-8]).first_column, (yyvsp[-6].string_value_), (yyvsp[-4].string_value_), (yyvsp[-3].attribute_list_), (yyvsp[-1].string_value_));
     }
   }
-#line 3510 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3558 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 25:
-#line 747 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 748 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.drop_table_statement_) = new quickstep::ParseStatementDropTable((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[0].string_value_));
   }
-#line 3518 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3566 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 26:
-#line 752 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 753 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.attribute_definition_) = new quickstep::ParseAttributeDefinition((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-2].string_value_), (yyvsp[-1].data_type_), (yyvsp[0].column_constraint_list_));
   }
-#line 3526 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3574 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 27:
-#line 757 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 758 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.attribute_definition_list_) = new quickstep::PtrList<quickstep::ParseAttributeDefinition>();
     (yyval.attribute_definition_list_)->push_back((yyvsp[0].attribute_definition_));
   }
-#line 3535 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3583 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 28:
-#line 761 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 762 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.attribute_definition_list_) = (yyvsp[-2].attribute_definition_list_);
     (yyval.attribute_definition_list_)->push_back((yyvsp[0].attribute_definition_));
   }
-#line 3544 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3592 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 29:
-#line 767 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 768 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.data_type_) = nullptr;
     NotSupported(&(yylsp[0]), yyscanner, "BIT data type");
     YYERROR;
   }
-#line 3554 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3602 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 30:
-#line 772 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 773 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kDate));
   }
-#line 3562 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3610 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 31:
-#line 775 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 776 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kDatetime));
   }
-#line 3570 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3618 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 32:
-#line 778 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 779 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.data_type_) = nullptr;
     NotSupported(&(yylsp[0]), yyscanner, "TIME data type");
     YYERROR;
   }
-#line 3580 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 33:
-#line 783 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kDatetime));
-  }
-#line 3588 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 34:
-#line 786 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kDouble));
-  }
-#line 3596 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 35:
-#line 789 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kDouble));
-  }
-#line 3604 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 36:
-#line 792 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kDouble));
-  }
-#line 3612 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 37:
-#line 795 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kFloat));
-  }
-#line 3620 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 38:
-#line 798 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kInt));
-  }
 #line 3628 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 39:
-#line 801 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 33:
+#line 784 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kInt));
+    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kDatetime));
   }
 #line 3636 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 40:
-#line 804 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 34:
+#line 787 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kLong));
+    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kDouble));
   }
 #line 3644 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 41:
-#line 807 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 35:
+#line 790 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kLong));
+    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kDouble));
   }
 #line 3652 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
+  case 36:
+#line 793 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kDouble));
+  }
+#line 3660 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 37:
+#line 796 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kFloat));
+  }
+#line 3668 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 38:
+#line 799 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kInt));
+  }
+#line 3676 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 39:
+#line 802 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kInt));
+  }
+#line 3684 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 40:
+#line 805 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kLong));
+  }
+#line 3692 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 41:
+#line 808 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kLong));
+  }
+#line 3700 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
   case 42:
-#line 810 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 811 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     /**
      * NOTE(chasseur): This pattern exhibits a shift/reduce conflict with the
@@ -3665,27 +3713,27 @@
         "or YEARMONTH INTERVAL");
     YYERROR;
   }
-#line 3669 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3717 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 43:
-#line 822 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 823 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kDatetimeInterval));
   }
-#line 3677 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3725 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 44:
-#line 825 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 826 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.data_type_) = new quickstep::ParseDataType(quickstep::TypeFactory::GetType(quickstep::kYearMonthInterval));
   }
-#line 3685 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3733 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 45:
-#line 828 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 829 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     if ((yyvsp[-1].numeric_literal_value_)->float_like()) {
       delete (yyvsp[-1].numeric_literal_value_);
@@ -3704,11 +3752,11 @@
       }
     }
   }
-#line 3708 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3756 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 46:
-#line 846 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 847 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     if ((yyvsp[-1].numeric_literal_value_)->float_like()) {
       delete (yyvsp[-1].numeric_literal_value_);
@@ -3727,69 +3775,69 @@
       }
     }
   }
-#line 3731 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3779 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 47:
-#line 866 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 867 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.column_constraint_) = new quickstep::ParseColumnConstraintNull((yylsp[0]).first_line, (yylsp[0]).first_column);
   }
-#line 3739 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3787 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 48:
-#line 869 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 870 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.column_constraint_) = new quickstep::ParseColumnConstraintNotNull((yylsp[-1]).first_line, (yylsp[-1]).first_column);
   }
-#line 3747 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3795 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 49:
-#line 872 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 873 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.column_constraint_) = nullptr;
     NotSupported(&(yylsp[0]), yyscanner, "Column Constraints (UNIQUE)");
     YYERROR;
   }
-#line 3757 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3805 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 50:
-#line 877 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 878 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.column_constraint_) = nullptr;
     NotSupported(&(yylsp[-1]), yyscanner, "Column Constraints (PRIMARY KEY)");
     YYERROR;
   }
-#line 3767 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3815 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 51:
-#line 882 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 883 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.column_constraint_) = nullptr;
     delete (yyvsp[0].literal_value_);
     NotSupported(&(yylsp[-1]), yyscanner, "Column Constraints (DEFAULT)");
     YYERROR;
   }
-#line 3778 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3826 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 52:
-#line 888 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 889 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.column_constraint_) = nullptr;
     delete (yyvsp[-1].predicate_);
     NotSupported(&(yylsp[-3]), yyscanner, "Column Constraints (CHECK)");
     YYERROR;
   }
-#line 3789 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3837 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 53:
-#line 894 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 895 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.column_constraint_) = nullptr;
     delete (yyvsp[-3].string_value_);
@@ -3797,65 +3845,65 @@
     NotSupported(&(yylsp[-4]), yyscanner, "Foreign Keys");
     YYERROR;
   }
-#line 3801 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3849 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 54:
-#line 903 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 904 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.column_constraint_list_) = (yyvsp[-1].column_constraint_list_);
     (yyval.column_constraint_list_)->push_back((yyvsp[0].column_constraint_));
   }
-#line 3810 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3858 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 55:
-#line 907 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 908 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.column_constraint_list_) = new quickstep::PtrList<quickstep::ParseColumnConstraint>();
     (yyval.column_constraint_list_)->push_back((yyvsp[0].column_constraint_));
   }
-#line 3819 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3867 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 56:
-#line 913 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 914 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.column_constraint_list_) = nullptr;
   }
-#line 3827 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3875 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 57:
-#line 916 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 917 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.column_constraint_list_) = (yyvsp[0].column_constraint_list_);
   }
-#line 3835 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3883 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 58:
-#line 921 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 922 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     delete (yyvsp[-1].string_list_);
     NotSupported(&(yylsp[-3]), yyscanner, "Table Constraints (UNIQUE)");
     YYERROR;
   }
-#line 3845 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3893 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 59:
-#line 926 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 927 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     delete (yyvsp[-1].string_list_);
     NotSupported(&(yylsp[-4]), yyscanner, "Table Constraints (PRIMARY KEY)");
     YYERROR;
   }
-#line 3855 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3903 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 60:
-#line 931 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 932 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     delete (yyvsp[-6].string_list_);
     delete (yyvsp[-3].string_value_);
@@ -3863,95 +3911,95 @@
     NotSupported(&(yylsp[-9]), yyscanner, "Table Constraints (FOREIGN KEY)");
     YYERROR;
   }
-#line 3867 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3915 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 61:
-#line 938 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 939 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     delete (yyvsp[-1].predicate_);
     NotSupported(&(yylsp[-3]), yyscanner, "Table Constraints (CHECK)");
     YYERROR;
   }
-#line 3877 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3925 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 62:
-#line 945 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 946 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     NotSupported(&(yylsp[-2]), yyscanner, "Table Constraints");
     YYERROR;
   }
-#line 3886 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 3934 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 63:
-#line 949 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 950 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     NotSupported(&(yylsp[0]), yyscanner, "Table Constraints");
     YYERROR;
   }
-#line 3895 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 64:
-#line 955 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    /* $$ = nullptr; */
-  }
-#line 3903 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 65:
-#line 958 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    /* $$ = $1; */
-  }
-#line 3911 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 66:
-#line 963 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.attribute_list_) = nullptr;
-  }
-#line 3919 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 67:
-#line 966 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.attribute_list_) = (yyvsp[-1].attribute_list_);
-  }
-#line 3927 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 68:
-#line 971 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.block_properties_) = nullptr;
-  }
-#line 3935 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 69:
-#line 974 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.block_properties_) = new quickstep::ParseBlockProperties((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-1].key_value_list_));
-  }
 #line 3943 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 70:
-#line 979 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 64:
+#line 956 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.partition_clause_) = nullptr;
+    /* $$ = nullptr; */
   }
 #line 3951 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
+  case 65:
+#line 959 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    /* $$ = $1; */
+  }
+#line 3959 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 66:
+#line 964 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.attribute_list_) = nullptr;
+  }
+#line 3967 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 67:
+#line 967 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.attribute_list_) = (yyvsp[-1].attribute_list_);
+  }
+#line 3975 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 68:
+#line 972 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.block_properties_) = nullptr;
+  }
+#line 3983 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 69:
+#line 975 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.block_properties_) = new quickstep::ParseBlockProperties((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-1].key_value_list_));
+  }
+#line 3991 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 70:
+#line 980 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.partition_clause_) = nullptr;
+  }
+#line 3999 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
   case 71:
-#line 982 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 983 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     if ((yyvsp[0].numeric_literal_value_)->float_like()) {
       delete (yyvsp[0].numeric_literal_value_);
@@ -3969,95 +4017,111 @@
       }
     }
   }
-#line 3973 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4021 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 72:
-#line 1001 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1002 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, quickstep::kHashPartitionType);
   }
-#line 3981 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4029 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 73:
-#line 1004 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1005 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, quickstep::kRangePartitionType);
   }
-#line 3989 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4037 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 74:
-#line 1009 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1010 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.key_value_list_) = new quickstep::PtrList<quickstep::ParseKeyValue>();
     (yyval.key_value_list_)->push_back((yyvsp[0].key_value_));
   }
-#line 3998 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4046 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 75:
-#line 1013 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1014 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.key_value_list_) = (yyvsp[-2].key_value_list_);
     (yyval.key_value_list_)->push_back((yyvsp[0].key_value_));
   }
-#line 4007 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4055 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 76:
-#line 1019 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1020 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.key_value_) = (yyvsp[0].key_string_value_);
   }
-#line 4015 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4063 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 77:
-#line 1022 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1023 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.key_value_) = (yyvsp[0].key_string_list_);
   }
-#line 4023 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4071 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 78:
-#line 1025 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1026 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.key_value_) = (yyvsp[0].key_integer_value_);
   }
-#line 4031 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4079 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 79:
-#line 1030 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1029 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.key_string_value_) = new quickstep::ParseKeyStringValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].string_value_));
+    (yyval.key_value_) = (yyvsp[0].key_bool_value_);
   }
-#line 4039 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4087 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 80:
-#line 1033 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1034 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.key_string_value_) = new quickstep::ParseKeyStringValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].string_value_));
+  }
+#line 4095 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 81:
+#line 1037 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.key_string_value_) = new quickstep::ParseKeyStringValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].string_value_));
+  }
+#line 4103 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 82:
+#line 1040 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     // This is a special case to handle the COMPRESS ALL option of the BLOCK PROPERTIES.
     (yyval.key_string_value_) = new quickstep::ParseKeyStringValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].string_value_),
         new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, "ALL"));
   }
-#line 4049 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4113 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 81:
-#line 1040 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 83:
+#line 1047 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.key_string_list_) = new quickstep::ParseKeyStringList((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-3].string_value_), (yyvsp[-1].string_list_));
   }
-#line 4057 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4121 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 82:
-#line 1045 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 84:
+#line 1052 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     if ((yyvsp[0].numeric_literal_value_)->float_like()) {
       delete (yyvsp[0].numeric_literal_value_);
@@ -4067,64 +4131,72 @@
     }
     (yyval.key_integer_value_) = new quickstep::ParseKeyIntegerValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].numeric_literal_value_));
   }
-#line 4071 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4135 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 83:
-#line 1056 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 85:
+#line 1063 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.key_bool_value_) = new quickstep::ParseKeyBoolValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].boolean_value_));
+  }
+#line 4143 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 86:
+#line 1068 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     // Defaults to BitWeavingV, but IndexProperties can change this to H.
     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column,
            std::to_string(quickstep::IndexSubBlockType::kBitWeavingV));
   }
-#line 4081 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4153 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 84:
-#line 1061 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 87:
+#line 1073 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column,
            std::to_string(quickstep::IndexSubBlockType::kBloomFilter));
   }
-#line 4090 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4162 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 85:
-#line 1065 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 88:
+#line 1077 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column,
            std::to_string(quickstep::IndexSubBlockType::kCSBTree));
   }
-#line 4099 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4171 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 86:
-#line 1069 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 89:
+#line 1081 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column,
            std::to_string(quickstep::IndexSubBlockType::kSMA));
   }
-#line 4108 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4180 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 87:
-#line 1075 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 90:
+#line 1087 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.key_value_list_) = nullptr;
   }
-#line 4116 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4188 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 88:
-#line 1078 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 91:
+#line 1090 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.key_value_list_) = (yyvsp[-1].key_value_list_);
   }
-#line 4124 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4196 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 89:
-#line 1084 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 92:
+#line 1096 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     delete (yyvsp[-7].string_value_);
     delete (yyvsp[-5].string_list_);
@@ -4133,161 +4205,180 @@
     NotSupported(&(yylsp[-6]), yyscanner, "list of column names in INSERT statement");
     YYERROR;
   }
-#line 4137 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 90:
-#line 1092 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.insert_statement_) = new quickstep::ParseStatementInsertTuple((yylsp[-6]).first_line, (yylsp[-6]).first_column, (yyvsp[-4].string_value_), (yyvsp[-1].literal_value_list_));
-  }
-#line 4145 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 91:
-#line 1095 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.insert_statement_) = new quickstep::ParseStatementInsertSelection((yylsp[-3]).first_line, (yylsp[-2]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].select_query_), nullptr);
-  }
-#line 4153 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 92:
-#line 1098 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.insert_statement_) = new quickstep::ParseStatementInsertSelection((yylsp[-4]).first_line, (yylsp[-3]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].select_query_), (yyvsp[-4].with_list_));
-  }
-#line 4161 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4209 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 93:
 #line 1104 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.copy_from_statement_) = new quickstep::ParseStatementCopyFrom((yylsp[-4]).first_line, (yylsp[-4]).first_column, (yyvsp[-3].string_value_), (yyvsp[-1].string_value_), (yyvsp[0].copy_from_params_));
+    (yyval.insert_statement_) = new quickstep::ParseStatementInsertTuple((yylsp[-6]).first_line, (yylsp[-6]).first_column, (yyvsp[-4].string_value_), (yyvsp[-1].literal_value_list_));
   }
-#line 4169 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4217 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 94:
-#line 1109 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1107 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.copy_from_params_) = nullptr;
+    (yyval.insert_statement_) = new quickstep::ParseStatementInsertSelection((yylsp[-3]).first_line, (yylsp[-2]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].select_query_), nullptr);
   }
-#line 4177 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4225 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 95:
-#line 1112 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1110 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.copy_from_params_) = (yyvsp[-1].copy_from_params_);
+    (yyval.insert_statement_) = new quickstep::ParseStatementInsertSelection((yylsp[-4]).first_line, (yylsp[-3]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].select_query_), (yyvsp[-4].with_list_));
   }
-#line 4185 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4233 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 96:
-#line 1117 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1116 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.copy_from_params_) = new quickstep::ParseCopyFromParams((yylsp[-1]).first_line, (yylsp[-1]).first_column);
-    (yyval.copy_from_params_)->set_delimiter((yyvsp[0].string_value_));
+    (yyval.copy_statement_) = new quickstep::ParseStatementCopy((yylsp[-4]).first_line, (yylsp[-4]).first_column,
+                                           quickstep::ParseStatementCopy::kFrom,
+                                           (yyvsp[-3].string_value_), (yyvsp[-1].string_value_), (yyvsp[0].key_value_list_));
   }
-#line 4194 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4243 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 97:
 #line 1121 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.copy_from_params_) = new quickstep::ParseCopyFromParams((yylsp[-1]).first_line, (yylsp[-1]).first_column);
-    (yyval.copy_from_params_)->escape_strings = (yyvsp[0].boolean_value_);
+    (yyval.copy_statement_) = new quickstep::ParseStatementCopy((yylsp[-3]).first_line, (yylsp[-3]).first_column,
+                                           quickstep::ParseStatementCopy::kTo,
+                                           (yyvsp[-2].string_value_), (yyvsp[-1].string_value_), (yyvsp[0].key_value_list_));
   }
-#line 4203 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4253 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 98:
-#line 1125 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1126 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.copy_from_params_) = (yyvsp[-3].copy_from_params_);
-    (yyval.copy_from_params_)->set_delimiter((yyvsp[0].string_value_));
+    (yyval.copy_statement_) = new quickstep::ParseStatementCopy((yylsp[-3]).first_line, (yylsp[-3]).first_column,
+                                           (yyvsp[-2].set_operation_), nullptr, (yyvsp[-1].string_value_), (yyvsp[0].key_value_list_));
   }
-#line 4212 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4262 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 99:
-#line 1129 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1130 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.copy_from_params_) = (yyvsp[-3].copy_from_params_);
-    (yyval.copy_from_params_)->escape_strings = (yyvsp[0].boolean_value_);
+    (yyval.copy_statement_) = new quickstep::ParseStatementCopy((yylsp[-4]).first_line, (yylsp[-4]).first_column,
+                                           (yyvsp[-2].set_operation_), (yyvsp[-4].with_list_), (yyvsp[-1].string_value_), (yyvsp[0].key_value_list_));
   }
-#line 4221 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4271 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 100:
-#line 1135 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1136 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.update_statement_) = new quickstep::ParseStatementUpdate((yylsp[-4]).first_line, (yylsp[-4]).first_column, (yyvsp[-3].string_value_), (yyvsp[-1].assignment_list_), (yyvsp[0].predicate_));
+    (yyval.string_value_) = new quickstep::ParseString((yyvsp[0].string_value_)->line_number(), (yyvsp[0].string_value_)->column_number(), "@" + (yyvsp[0].string_value_)->value());
+    delete (yyvsp[0].string_value_);
   }
-#line 4229 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4280 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 101:
 #line 1140 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.delete_statement_) = new quickstep::ParseStatementDelete((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].predicate_));
+    (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, "$stdout");
   }
-#line 4237 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4288 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 102:
-#line 1145 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1143 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, "$stderr");
+  }
+#line 4296 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 103:
+#line 1148 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.key_value_list_) = nullptr;
+  }
+#line 4304 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 104:
+#line 1151 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.key_value_list_) = (yyvsp[-1].key_value_list_);
+  }
+#line 4312 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 105:
+#line 1156 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.update_statement_) = new quickstep::ParseStatementUpdate((yylsp[-4]).first_line, (yylsp[-4]).first_column, (yyvsp[-3].string_value_), (yyvsp[-1].assignment_list_), (yyvsp[0].predicate_));
+  }
+#line 4320 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 106:
+#line 1161 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.delete_statement_) = new quickstep::ParseStatementDelete((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].predicate_));
+  }
+#line 4328 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 107:
+#line 1166 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.assignment_list_) = (yyvsp[-2].assignment_list_);
     (yyval.assignment_list_)->push_back((yyvsp[0].assignment_));
   }
-#line 4246 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4337 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 103:
-#line 1149 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 108:
+#line 1170 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.assignment_list_) = new quickstep::PtrList<quickstep::ParseAssignment>();
     (yyval.assignment_list_)->push_back((yyvsp[0].assignment_));
   }
-#line 4255 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4346 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 104:
-#line 1155 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 109:
+#line 1176 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.assignment_) = new quickstep::ParseAssignment((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-2].string_value_), (yyvsp[0].expression_));
   }
-#line 4263 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4354 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 105:
-#line 1164 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 110:
+#line 1185 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.set_operation_statement_) = new quickstep::ParseStatementSetOperation((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].set_operation_), nullptr, (yyvsp[0].opt_priority_clause_));
   }
-#line 4271 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4362 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 106:
-#line 1167 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 111:
+#line 1188 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.set_operation_statement_) = new quickstep::ParseStatementSetOperation((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-1].set_operation_), (yyvsp[-2].with_list_), (yyvsp[0].opt_priority_clause_));
   }
-#line 4279 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4370 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 107:
-#line 1172 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 112:
+#line 1193 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.opt_priority_clause_) = nullptr;
   }
-#line 4287 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4378 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 108:
-#line 1175 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 113:
+#line 1196 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     if ((yyvsp[0].numeric_literal_value_)->float_like()) {
       delete (yyvsp[0].numeric_literal_value_);
@@ -4305,46 +4396,46 @@
       }
     }
   }
-#line 4309 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4400 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 109:
-#line 1194 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 114:
+#line 1215 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.with_list_) = (yyvsp[0].with_list_);
   }
-#line 4317 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4408 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 110:
-#line 1199 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 115:
+#line 1220 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.with_list_) = new quickstep::PtrVector<quickstep::ParseSubqueryTableReference>();
     (yyval.with_list_)->push_back((yyvsp[0].with_list_element_));
   }
-#line 4326 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4417 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 111:
-#line 1203 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 116:
+#line 1224 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.with_list_) = (yyvsp[-2].with_list_);
     (yyval.with_list_)->push_back((yyvsp[0].with_list_element_));
   }
-#line 4335 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4426 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 112:
-#line 1209 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 117:
+#line 1230 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.with_list_element_) = new quickstep::ParseSubqueryTableReference((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[0].subquery_expression_));
     (yyval.with_list_element_)->set_table_reference_signature((yyvsp[-2].table_reference_signature_));
   }
-#line 4344 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4435 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 113:
-#line 1215 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 118:
+#line 1236 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     if ((yyvsp[-1].boolean_value_)) {
       (yyval.set_operation_) = new quickstep::ParseSetOperation((yylsp[-3]).first_line, (yylsp[-3]).first_column, quickstep::ParseSetOperation::kUnion);
@@ -4354,19 +4445,19 @@
     (yyval.set_operation_)->addOperand((yyvsp[-3].set_operation_));
     (yyval.set_operation_)->addOperand((yyvsp[0].set_operation_));
   }
-#line 4358 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4449 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 114:
-#line 1224 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 119:
+#line 1245 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.set_operation_) = (yyvsp[0].set_operation_);
   }
-#line 4366 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4457 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 115:
-#line 1229 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 120:
+#line 1250 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.set_operation_) = new quickstep::ParseSetOperation((yylsp[-2]).first_line, (yylsp[-2]).first_column, quickstep::ParseSetOperation::kIntersect);
     quickstep::ParseSetOperation *op = new quickstep::ParseSetOperation(
@@ -4375,387 +4466,387 @@
     (yyval.set_operation_)->addOperand((yyvsp[-2].set_operation_));
     (yyval.set_operation_)->addOperand(op);
   }
-#line 4379 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4470 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 116:
-#line 1237 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 121:
+#line 1258 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.set_operation_) = new quickstep::ParseSetOperation((yylsp[0]).first_line, (yylsp[0]).first_column, quickstep::ParseSetOperation::kSelect);
     (yyval.set_operation_)->addOperand((yyvsp[0].select_query_));
   }
-#line 4388 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 117:
-#line 1244 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.select_query_) = new quickstep::ParseSelect((yylsp[-9]).first_line, (yylsp[-9]).first_column, (yyvsp[-7].selection_), (yyvsp[-6].table_reference_list_), (yyvsp[-5].predicate_), (yyvsp[-4].opt_group_by_clause_), (yyvsp[-3].opt_having_clause_), (yyvsp[-2].opt_order_by_clause_), (yyvsp[-1].opt_limit_clause_), (yyvsp[0].opt_window_clause_));
-  }
-#line 4396 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 118:
-#line 1249 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.boolean_value_) = true;  // Distinct
-  }
-#line 4404 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 119:
-#line 1252 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.boolean_value_) = false;  // All
-  }
-#line 4412 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 120:
-#line 1255 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.boolean_value_) = true;  // Distinct
-  }
-#line 4420 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 121:
-#line 1260 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.selection_) = new quickstep::ParseSelectionStar((yylsp[0]).first_line, (yylsp[0]).first_column);
-  }
-#line 4428 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4479 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 122:
-#line 1263 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1265 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.selection_) = (yyvsp[0].selection_list_);
+    (yyval.select_query_) = new quickstep::ParseSelect((yylsp[-9]).first_line, (yylsp[-9]).first_column, (yyvsp[-7].selection_), (yyvsp[-6].table_reference_list_), (yyvsp[-5].predicate_), (yyvsp[-4].opt_group_by_clause_), (yyvsp[-3].opt_having_clause_), (yyvsp[-2].opt_order_by_clause_), (yyvsp[-1].opt_limit_clause_), (yyvsp[0].opt_window_clause_));
   }
-#line 4436 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4487 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 123:
-#line 1268 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1270 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.selection_list_) = new quickstep::ParseSelectionList((yylsp[0]).first_line, (yylsp[0]).first_column);
-    (yyval.selection_list_)->add((yyvsp[0].selection_item_));
+    (yyval.boolean_value_) = true;  // Distinct
   }
-#line 4445 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4495 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 124:
-#line 1272 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1273 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.selection_list_) = (yyvsp[-2].selection_list_);
-    (yyval.selection_list_)->add((yyvsp[0].selection_item_));
+    (yyval.boolean_value_) = false;  // All
   }
-#line 4454 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4503 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 125:
-#line 1278 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1276 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.selection_item_) = new quickstep::ParseSelectionItem((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-2].expression_), (yyvsp[0].string_value_));
+    (yyval.boolean_value_) = true;  // Distinct
   }
-#line 4462 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4511 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 126:
 #line 1281 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.selection_item_) = new quickstep::ParseSelectionItem((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].expression_), (yyvsp[0].string_value_));
+    (yyval.selection_) = new quickstep::ParseSelectionStar((yylsp[0]).first_line, (yylsp[0]).first_column);
   }
-#line 4470 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4519 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 127:
 #line 1284 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.selection_item_) = new quickstep::ParseSelectionItem((yylsp[0]).first_line, (yylsp[0]).first_column, (yyvsp[0].expression_));
+    (yyval.selection_) = (yyvsp[0].selection_list_);
   }
-#line 4478 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4527 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 128:
 #line 1289 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.table_reference_list_) = (yyvsp[0].table_reference_list_);
+    (yyval.selection_list_) = new quickstep::ParseSelectionList((yylsp[0]).first_line, (yylsp[0]).first_column);
+    (yyval.selection_list_)->add((yyvsp[0].selection_item_));
   }
-#line 4486 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4536 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 129:
-#line 1294 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1293 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.subquery_expression_) = new quickstep::ParseSubqueryExpression((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-1].set_operation_));
+    (yyval.selection_list_) = (yyvsp[-2].selection_list_);
+    (yyval.selection_list_)->add((yyvsp[0].selection_item_));
   }
-#line 4494 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4545 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 130:
 #line 1299 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.opt_sample_clause_) = NULL;
+    (yyval.selection_item_) = new quickstep::ParseSelectionItem((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-2].expression_), (yyvsp[0].string_value_));
   }
-#line 4502 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4553 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 131:
 #line 1302 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.opt_sample_clause_) = new quickstep::ParseSample((yylsp[-2]).first_line, (yylsp[-2]).first_column, true, (yyvsp[-1].numeric_literal_value_));
+    (yyval.selection_item_) = new quickstep::ParseSelectionItem((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].expression_), (yyvsp[0].string_value_));
   }
-#line 4510 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4561 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 132:
 #line 1305 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.opt_sample_clause_) = new quickstep::ParseSample((yylsp[-2]).first_line, (yylsp[-2]).first_column, false, (yyvsp[-1].numeric_literal_value_));
+    (yyval.selection_item_) = new quickstep::ParseSelectionItem((yylsp[0]).first_line, (yylsp[0]).first_column, (yyvsp[0].expression_));
   }
-#line 4518 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4569 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 133:
 #line 1310 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kInnerJoin;
+    (yyval.table_reference_list_) = (yyvsp[0].table_reference_list_);
   }
-#line 4526 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4577 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 134:
-#line 1313 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1315 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kInnerJoin;
+    (yyval.subquery_expression_) = new quickstep::ParseSubqueryExpression((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-1].set_operation_));
   }
-#line 4534 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4585 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 135:
-#line 1316 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1320 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kLeftOuterJoin;
+    (yyval.opt_sample_clause_) = NULL;
   }
-#line 4542 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4593 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 136:
-#line 1319 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1323 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kLeftOuterJoin;
+    (yyval.opt_sample_clause_) = new quickstep::ParseSample((yylsp[-2]).first_line, (yylsp[-2]).first_column, true, (yyvsp[-1].numeric_literal_value_));
   }
-#line 4550 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4601 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 137:
-#line 1322 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1326 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kRightOuterJoin;
+    (yyval.opt_sample_clause_) = new quickstep::ParseSample((yylsp[-2]).first_line, (yylsp[-2]).first_column, false, (yyvsp[-1].numeric_literal_value_));
   }
-#line 4558 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4609 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 138:
-#line 1325 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1331 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kRightOuterJoin;
+    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kInnerJoin;
   }
-#line 4566 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4617 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 139:
-#line 1328 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1334 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kFullOuterJoin;
+    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kInnerJoin;
   }
-#line 4574 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4625 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 140:
-#line 1331 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1337 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kFullOuterJoin;
+    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kLeftOuterJoin;
   }
-#line 4582 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4633 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 141:
-#line 1336 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1340 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.table_reference_) = new quickstep::ParseJoinedTableReference((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-4].join_type_), (yyvsp[-5].table_reference_), (yyvsp[-2].table_reference_), (yyvsp[0].predicate_));
+    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kLeftOuterJoin;
   }
-#line 4590 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4641 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 142:
-#line 1339 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1343 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.table_reference_) = (yyvsp[0].table_reference_);
+    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kRightOuterJoin;
   }
-#line 4598 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4649 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 143:
-#line 1344 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1346 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.table_reference_) = new quickstep::ParseSubqueryTableReference((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].subquery_expression_));
-    (yyval.table_reference_)->set_table_reference_signature((yyvsp[0].table_reference_signature_));
+    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kRightOuterJoin;
   }
-#line 4607 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4657 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 144:
-#line 1348 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1349 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.table_reference_) = new quickstep::ParseSimpleTableReference((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-2].string_value_), (yyvsp[-1].opt_sample_clause_));
-    (yyval.table_reference_)->set_table_reference_signature((yyvsp[0].table_reference_signature_));
+    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kFullOuterJoin;
   }
-#line 4616 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4665 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 145:
 #line 1352 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.table_reference_) = new quickstep::ParseSimpleTableReference((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].opt_sample_clause_));
-  }
-#line 4624 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 146:
-#line 1355 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.table_reference_) = new quickstep::ParseGeneratorTableReference((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].function_call_));
-    (yyval.table_reference_)->set_table_reference_signature((yyvsp[0].table_reference_signature_));
-  }
-#line 4633 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 147:
-#line 1359 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.table_reference_) = new quickstep::ParseGeneratorTableReference((yylsp[0]).first_line, (yylsp[0]).first_column, (yyvsp[0].function_call_));
-  }
-#line 4641 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 148:
-#line 1362 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.table_reference_) = (yyvsp[-1].table_reference_);
-  }
-#line 4649 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 149:
-#line 1367 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.table_reference_signature_) = (yyvsp[0].table_reference_signature_);
-  }
-#line 4657 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 150:
-#line 1370 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.table_reference_signature_) = (yyvsp[0].table_reference_signature_);
-  }
-#line 4665 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 151:
-#line 1375 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.table_reference_signature_) = new ::quickstep::ParseTableReferenceSignature((yylsp[0]).first_line, (yylsp[0]).first_column, (yyvsp[0].string_value_));
+    (yyval.join_type_) = quickstep::ParseJoinedTableReference::JoinType::kFullOuterJoin;
   }
 #line 4673 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 152:
-#line 1378 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 146:
+#line 1357 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.table_reference_signature_) = new ::quickstep::ParseTableReferenceSignature((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-3].string_value_), (yyvsp[-1].string_list_));
+    (yyval.table_reference_) = new quickstep::ParseJoinedTableReference((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-4].join_type_), (yyvsp[-5].table_reference_), (yyvsp[-2].table_reference_), (yyvsp[0].predicate_));
   }
 #line 4681 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
+  case 147:
+#line 1360 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.table_reference_) = (yyvsp[0].table_reference_);
+  }
+#line 4689 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 148:
+#line 1365 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.table_reference_) = new quickstep::ParseSubqueryTableReference((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].subquery_expression_));
+    (yyval.table_reference_)->set_table_reference_signature((yyvsp[0].table_reference_signature_));
+  }
+#line 4698 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 149:
+#line 1369 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.table_reference_) = new quickstep::ParseSimpleTableReference((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-2].string_value_), (yyvsp[-1].opt_sample_clause_));
+    (yyval.table_reference_)->set_table_reference_signature((yyvsp[0].table_reference_signature_));
+  }
+#line 4707 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 150:
+#line 1373 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.table_reference_) = new quickstep::ParseSimpleTableReference((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].opt_sample_clause_));
+  }
+#line 4715 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 151:
+#line 1376 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.table_reference_) = new quickstep::ParseGeneratorTableReference((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].function_call_));
+    (yyval.table_reference_)->set_table_reference_signature((yyvsp[0].table_reference_signature_));
+  }
+#line 4724 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 152:
+#line 1380 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.table_reference_) = new quickstep::ParseGeneratorTableReference((yylsp[0]).first_line, (yylsp[0]).first_column, (yyvsp[0].function_call_));
+  }
+#line 4732 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
   case 153:
 #line 1383 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.table_reference_list_) = new quickstep::PtrList<quickstep::ParseTableReference>();
-    (yyval.table_reference_list_)->push_back((yyvsp[0].table_reference_));
+    (yyval.table_reference_) = (yyvsp[-1].table_reference_);
   }
-#line 4690 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4740 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 154:
-#line 1387 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1388 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.table_reference_list_) = (yyvsp[-2].table_reference_list_);
-    (yyval.table_reference_list_)->push_back((yyvsp[0].table_reference_));
+    (yyval.table_reference_signature_) = (yyvsp[0].table_reference_signature_);
   }
-#line 4699 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4748 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 155:
-#line 1393 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1391 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.opt_group_by_clause_) = nullptr;
+    (yyval.table_reference_signature_) = (yyvsp[0].table_reference_signature_);
   }
-#line 4707 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4756 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 156:
 #line 1396 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.opt_group_by_clause_) = new quickstep::ParseGroupBy((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[0].expression_list_));
+    (yyval.table_reference_signature_) = new ::quickstep::ParseTableReferenceSignature((yylsp[0]).first_line, (yylsp[0]).first_column, (yyvsp[0].string_value_));
   }
-#line 4715 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4764 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 157:
-#line 1401 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1399 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.opt_having_clause_) = nullptr;
+    (yyval.table_reference_signature_) = new ::quickstep::ParseTableReferenceSignature((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-3].string_value_), (yyvsp[-1].string_list_));
   }
-#line 4723 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4772 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 158:
 #line 1404 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.opt_having_clause_) = new quickstep::ParseHaving((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[0].predicate_));
+    (yyval.table_reference_list_) = new quickstep::PtrList<quickstep::ParseTableReference>();
+    (yyval.table_reference_list_)->push_back((yyvsp[0].table_reference_));
   }
-#line 4731 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4781 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 159:
-#line 1409 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1408 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.opt_order_by_clause_) = nullptr;
+    (yyval.table_reference_list_) = (yyvsp[-2].table_reference_list_);
+    (yyval.table_reference_list_)->push_back((yyvsp[0].table_reference_));
   }
-#line 4739 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4790 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 160:
-#line 1412 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1414 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.opt_order_by_clause_) = new quickstep::ParseOrderBy((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[0].order_commalist_));
+    (yyval.opt_group_by_clause_) = nullptr;
   }
-#line 4747 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4798 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 161:
 #line 1417 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.opt_limit_clause_) = nullptr;
+    (yyval.opt_group_by_clause_) = new quickstep::ParseGroupBy((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[0].expression_list_));
   }
-#line 4755 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4806 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 162:
-#line 1420 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1422 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.opt_having_clause_) = nullptr;
+  }
+#line 4814 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 163:
+#line 1425 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.opt_having_clause_) = new quickstep::ParseHaving((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[0].predicate_));
+  }
+#line 4822 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 164:
+#line 1430 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.opt_order_by_clause_) = nullptr;
+  }
+#line 4830 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 165:
+#line 1433 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.opt_order_by_clause_) = new quickstep::ParseOrderBy((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[0].order_commalist_));
+  }
+#line 4838 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 166:
+#line 1438 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.opt_limit_clause_) = nullptr;
+  }
+#line 4846 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 167:
+#line 1441 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     if ((yyvsp[0].numeric_literal_value_)->float_like()) {
       delete (yyvsp[0].numeric_literal_value_);
@@ -4773,258 +4864,258 @@
       }
     }
   }
-#line 4777 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4868 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 163:
-#line 1439 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 168:
+#line 1460 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.opt_window_clause_) = nullptr;
   }
-#line 4785 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4876 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 164:
-#line 1442 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 169:
+#line 1463 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.opt_window_clause_) = (yyvsp[0].opt_window_clause_);
   }
-#line 4793 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4884 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 165:
-#line 1447 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 170:
+#line 1468 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.opt_window_clause_) = new quickstep::PtrList<quickstep::ParseWindow>();
     (yyval.opt_window_clause_)->push_back((yyvsp[0].window_definition_));
   }
-#line 4802 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4893 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 166:
-#line 1451 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 171:
+#line 1472 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.opt_window_clause_) = (yyvsp[-1].opt_window_clause_);
     (yyval.opt_window_clause_)->push_back((yyvsp[0].window_definition_));
   }
-#line 4811 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4902 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 167:
-#line 1457 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 172:
+#line 1478 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.window_definition_) = (yyvsp[-1].window_definition_);
     (yyval.window_definition_)->setName((yyvsp[-4].string_value_));
   }
-#line 4820 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 168:
-#line 1463 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.window_definition_) = new quickstep::ParseWindow((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-2].window_partition_by_list_), (yyvsp[-1].window_order_by_list_), (yyvsp[0].window_frame_info_));
-  }
-#line 4828 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 169:
-#line 1468 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.window_partition_by_list_) = nullptr;
-  }
-#line 4836 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 170:
-#line 1471 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.window_partition_by_list_) = (yyvsp[0].expression_list_);
-  }
-#line 4844 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 171:
-#line 1476 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.window_order_by_list_) = nullptr;
-  }
-#line 4852 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 172:
-#line 1479 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.window_order_by_list_) = (yyvsp[0].order_commalist_);
-  }
-#line 4860 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4911 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 173:
 #line 1484 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.window_frame_info_) = nullptr;
+    (yyval.window_definition_) = new quickstep::ParseWindow((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-2].window_partition_by_list_), (yyvsp[-1].window_order_by_list_), (yyvsp[0].window_frame_info_));
   }
-#line 4868 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4919 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 174:
-#line 1487 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1489 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.window_frame_info_) = new quickstep::ParseFrameInfo((yylsp[-4]).first_line, (yylsp[-4]).first_column, (yyvsp[-4].boolean_value_), (yyvsp[-2].numeric_literal_value_)->long_value(), (yyvsp[0].numeric_literal_value_)->long_value());
+    (yyval.window_partition_by_list_) = nullptr;
   }
-#line 4876 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4927 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 175:
 #line 1492 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.boolean_value_) = true;
+    (yyval.window_partition_by_list_) = (yyvsp[0].expression_list_);
   }
-#line 4884 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4935 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 176:
-#line 1495 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1497 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.boolean_value_) = false;
+    (yyval.window_order_by_list_) = nullptr;
   }
-#line 4892 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4943 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 177:
+#line 1500 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.window_order_by_list_) = (yyvsp[0].order_commalist_);
+  }
+#line 4951 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 178:
-#line 1501 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1505 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.numeric_literal_value_) = new quickstep::NumericParseLiteralValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, "-1");
+    (yyval.window_frame_info_) = nullptr;
   }
-#line 4900 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4959 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 179:
-#line 1504 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1508 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.numeric_literal_value_) = new quickstep::NumericParseLiteralValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, "0");
+    (yyval.window_frame_info_) = new quickstep::ParseFrameInfo((yylsp[-4]).first_line, (yylsp[-4]).first_column, (yyvsp[-4].boolean_value_), (yyvsp[-2].numeric_literal_value_)->long_value(), (yyvsp[0].numeric_literal_value_)->long_value());
   }
-#line 4908 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4967 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 180:
+#line 1513 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.boolean_value_) = true;
+  }
+#line 4975 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 181:
-#line 1510 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1516 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.numeric_literal_value_) = new quickstep::NumericParseLiteralValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, "-1");
+    (yyval.boolean_value_) = false;
   }
-#line 4916 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 182:
-#line 1513 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.numeric_literal_value_) = new quickstep::NumericParseLiteralValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, "0");
-  }
-#line 4924 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 4983 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 183:
-#line 1518 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1522 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.numeric_literal_value_) = new quickstep::NumericParseLiteralValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, "-1");
+  }
+#line 4991 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 184:
+#line 1525 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.numeric_literal_value_) = new quickstep::NumericParseLiteralValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, "0");
+  }
+#line 4999 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 186:
+#line 1531 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.numeric_literal_value_) = new quickstep::NumericParseLiteralValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, "-1");
+  }
+#line 5007 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 187:
+#line 1534 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.numeric_literal_value_) = new quickstep::NumericParseLiteralValue((yylsp[-1]).first_line, (yylsp[-1]).first_column, "0");
+  }
+#line 5015 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 188:
+#line 1539 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.order_commalist_) = new quickstep::PtrList<quickstep::ParseOrderByItem>();
     (yyval.order_commalist_)->push_back((yyvsp[0].order_item_));
   }
-#line 4933 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5024 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 184:
-#line 1522 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 189:
+#line 1543 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.order_commalist_) = (yyvsp[-2].order_commalist_);
     (yyval.order_commalist_)->push_back((yyvsp[0].order_item_));
   }
-#line 4942 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 185:
-#line 1528 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.order_item_) = new quickstep::ParseOrderByItem((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-2].expression_), (yyvsp[-1].order_direction_), (yyvsp[0].order_direction_));
-    delete (yyvsp[-1].order_direction_);
-    delete (yyvsp[0].order_direction_);
-  }
-#line 4952 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 186:
-#line 1535 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.order_direction_) = nullptr;
-  }
-#line 4960 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 187:
-#line 1538 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.order_direction_) = new bool(true);
-  }
-#line 4968 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 188:
-#line 1541 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.order_direction_) = new bool(false);
-  }
-#line 4976 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 189:
-#line 1546 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.order_direction_) = nullptr;
-  }
-#line 4984 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5033 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 190:
 #line 1549 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.order_direction_) = new bool(true);
+    (yyval.order_item_) = new quickstep::ParseOrderByItem((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[-2].expression_), (yyvsp[-1].order_direction_), (yyvsp[0].order_direction_));
+    delete (yyvsp[-1].order_direction_);
+    delete (yyvsp[0].order_direction_);
   }
-#line 4992 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5043 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 191:
-#line 1552 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1556 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.order_direction_) = new bool(false);
+    (yyval.order_direction_) = nullptr;
   }
-#line 5000 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5051 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 192:
-#line 1558 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1559 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.predicate_) = nullptr;
+    (yyval.order_direction_) = new bool(true);
   }
-#line 5008 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5059 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 193:
-#line 1561 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1562 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.predicate_) = (yyvsp[0].predicate_);
+    (yyval.order_direction_) = new bool(false);
   }
-#line 5016 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5067 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 194:
-#line 1566 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1567 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.predicate_) = (yyvsp[0].predicate_);
+    (yyval.order_direction_) = nullptr;
   }
-#line 5024 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5075 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 195:
-#line 1571 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1570 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.order_direction_) = new bool(true);
+  }
+#line 5083 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 196:
+#line 1573 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.order_direction_) = new bool(false);
+  }
+#line 5091 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 197:
+#line 1579 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.predicate_) = nullptr;
+  }
+#line 5099 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 198:
+#line 1582 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.predicate_) = (yyvsp[0].predicate_);
+  }
+#line 5107 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 199:
+#line 1587 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.predicate_) = (yyvsp[0].predicate_);
+  }
+#line 5115 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 200:
+#line 1592 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     if ((yyvsp[-2].predicate_)->getParsePredicateType() == quickstep::ParsePredicate::kDisjunction) {
       (yyval.predicate_) = (yyvsp[-2].predicate_);
@@ -5034,19 +5125,19 @@
     }
     static_cast<quickstep::ParsePredicateDisjunction *>((yyval.predicate_))->addPredicate((yyvsp[0].predicate_));
   }
-#line 5038 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5129 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 196:
-#line 1580 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 201:
+#line 1601 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.predicate_) = (yyvsp[0].predicate_);
   }
-#line 5046 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5137 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 197:
-#line 1585 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 202:
+#line 1606 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     if ((yyvsp[-2].predicate_)->getParsePredicateType() == quickstep::ParsePredicate::kConjunction) {
       (yyval.predicate_) = (yyvsp[-2].predicate_);
@@ -5056,453 +5147,453 @@
     }
     static_cast<quickstep::ParsePredicateConjunction *>((yyval.predicate_))->addPredicate((yyvsp[0].predicate_));
   }
-#line 5060 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5151 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 198:
-#line 1594 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 203:
+#line 1615 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.predicate_) = (yyvsp[0].predicate_);
   }
-#line 5068 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5159 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 199:
-#line 1599 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 204:
+#line 1620 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.predicate_) = new quickstep::ParsePredicateNegation((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[0].predicate_));
   }
-#line 5076 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5167 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 200:
-#line 1602 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 205:
+#line 1623 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.predicate_) = (yyvsp[0].predicate_);
   }
-#line 5084 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5175 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 201:
-#line 1607 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 206:
+#line 1628 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.predicate_) = new quickstep::ParsePredicateBetween((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-4].expression_), (yyvsp[-2].expression_), (yyvsp[0].expression_));
   }
-#line 5092 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5183 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 202:
-#line 1610 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 207:
+#line 1631 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.predicate_) = new quickstep::ParsePredicateNegation(
         (yylsp[-4]).first_line, (yylsp[-4]).first_column,
         new quickstep::ParsePredicateBetween((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-5].expression_), (yyvsp[-2].expression_), (yyvsp[0].expression_)));
   }
-#line 5102 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5193 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 203:
-#line 1615 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 208:
+#line 1636 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     delete (yyvsp[-3].attribute_);
     (yyval.predicate_) = nullptr;
     NotSupported(&(yylsp[-2]), yyscanner, "NULL comparison predicates");
     YYERROR;
   }
-#line 5113 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5204 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 204:
-#line 1621 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 209:
+#line 1642 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     delete (yyvsp[-2].attribute_);
     (yyval.predicate_) = nullptr;
     NotSupported(&(yylsp[-1]), yyscanner, "NULL comparison predicates");
     YYERROR;
   }
-#line 5124 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 205:
-#line 1627 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.predicate_) = new quickstep::ParsePredicateComparison((yylsp[-1]).first_line, (yylsp[-1]).first_column, *(yyvsp[-1].comparison_), (yyvsp[-2].expression_), (yyvsp[0].expression_));
-  }
-#line 5132 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 206:
-#line 1630 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.predicate_) = (yyvsp[-1].predicate_);
-  }
-#line 5140 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 207:
-#line 1633 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.predicate_) = new quickstep::ParsePredicateExists((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[0].subquery_expression_));
-  }
-#line 5148 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 208:
-#line 1636 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.predicate_) = new quickstep::ParsePredicateInTableQuery((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-2].expression_), (yyvsp[0].subquery_expression_));
-  }
-#line 5156 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 209:
-#line 1639 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.predicate_) = new quickstep::ParsePredicateInValueList((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-4].expression_), (yyvsp[-1].expression_list_));
-  }
-#line 5164 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5215 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 210:
-#line 1642 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1648 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.predicate_) = new quickstep::ParsePredicateComparison((yylsp[-1]).first_line, (yylsp[-1]).first_column, *(yyvsp[-1].comparison_), (yyvsp[-2].expression_), (yyvsp[0].expression_));
+  }
+#line 5223 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 211:
+#line 1651 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.predicate_) = (yyvsp[-1].predicate_);
+  }
+#line 5231 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 212:
+#line 1654 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.predicate_) = new quickstep::ParsePredicateExists((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[0].subquery_expression_));
+  }
+#line 5239 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 213:
+#line 1657 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.predicate_) = new quickstep::ParsePredicateInTableQuery((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-2].expression_), (yyvsp[0].subquery_expression_));
+  }
+#line 5247 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 214:
+#line 1660 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.predicate_) = new quickstep::ParsePredicateInValueList((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-4].expression_), (yyvsp[-1].expression_list_));
+  }
+#line 5255 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 215:
+#line 1663 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.predicate_) = new quickstep::ParsePredicateNegation(
         (yylsp[-2]).first_line,
         (yylsp[-2]).first_column,
         new quickstep::ParsePredicateInTableQuery((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-3].expression_), (yyvsp[0].subquery_expression_)));
   }
-#line 5175 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5266 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 211:
-#line 1648 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 216:
+#line 1669 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.predicate_) = new quickstep::ParsePredicateNegation(
         (yylsp[-4]).first_line,
         (yylsp[-4]).first_column,
         new quickstep::ParsePredicateInValueList((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-5].expression_), (yyvsp[-1].expression_list_)));
   }
-#line 5186 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 212:
-#line 1657 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_) = new quickstep::ParseBinaryExpression((yylsp[-1]).first_line, (yylsp[-1]).first_column, *(yyvsp[-1].binary_operation_), (yyvsp[-2].expression_), (yyvsp[0].expression_));
-  }
-#line 5194 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 213:
-#line 1660 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_) = (yyvsp[0].expression_);
-  }
-#line 5202 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 214:
-#line 1665 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_) = new quickstep::ParseBinaryExpression((yylsp[-1]).first_line, (yylsp[-1]).first_column, *(yyvsp[-1].binary_operation_), (yyvsp[-2].expression_), (yyvsp[0].expression_));
-  }
-#line 5210 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 215:
-#line 1668 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_) = (yyvsp[0].expression_);
-  }
-#line 5218 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 216:
-#line 1673 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_) = new quickstep::ParseUnaryExpression((yylsp[-1]).first_line, (yylsp[-1]).first_column, *(yyvsp[-1].unary_operation_), (yyvsp[0].expression_));
-  }
-#line 5226 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5277 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 217:
-#line 1676 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1678 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.expression_) = (yyvsp[0].expression_);
+    (yyval.expression_) = new quickstep::ParseBinaryExpression((yylsp[-1]).first_line, (yylsp[-1]).first_column, *(yyvsp[-1].binary_operation_), (yyvsp[-2].expression_), (yyvsp[0].expression_));
   }
-#line 5234 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5285 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 218:
 #line 1681 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.expression_) = (yyvsp[0].attribute_);
+    (yyval.expression_) = (yyvsp[0].expression_);
   }
-#line 5242 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5293 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 219:
-#line 1684 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1686 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.expression_) = new quickstep::ParseScalarLiteral((yyvsp[0].literal_value_));
+    (yyval.expression_) = new quickstep::ParseBinaryExpression((yylsp[-1]).first_line, (yylsp[-1]).first_column, *(yyvsp[-1].binary_operation_), (yyvsp[-2].expression_), (yyvsp[0].expression_));
   }
-#line 5250 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5301 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 220:
-#line 1687 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1689 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.expression_) = (yyvsp[0].function_call_);
+    (yyval.expression_) = (yyvsp[0].expression_);
   }
-#line 5258 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5309 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 221:
-#line 1690 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1694 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyvsp[-2].function_call_)->setWindowName((yyvsp[0].string_value_));
-    (yyval.expression_) = (yyvsp[-2].function_call_);
+    (yyval.expression_) = new quickstep::ParseUnaryExpression((yylsp[-1]).first_line, (yylsp[-1]).first_column, *(yyvsp[-1].unary_operation_), (yyvsp[0].expression_));
   }
-#line 5267 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5317 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 222:
-#line 1694 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyvsp[-4].function_call_)->setWindow((yyvsp[-1].window_definition_));
-    (yyval.expression_) = (yyvsp[-4].function_call_);
-  }
-#line 5276 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 223:
-#line 1698 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1697 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.expression_) = (yyvsp[0].expression_);
   }
-#line 5284 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 224:
-#line 1701 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_) = (yyvsp[0].expression_);
-  }
-#line 5292 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 225:
-#line 1704 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_) = (yyvsp[0].expression_);
-  }
-#line 5300 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 226:
-#line 1707 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_) = (yyvsp[-1].expression_);
-  }
-#line 5308 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 227:
-#line 1710 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_) = (yyvsp[0].subquery_expression_);
-  }
-#line 5316 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 228:
-#line 1715 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.function_call_) = new quickstep::ParseFunctionCall(
-        (yylsp[-2]).first_line, (yylsp[-2]).first_column, false, (yyvsp[-2].string_value_), new quickstep::PtrList<quickstep::ParseExpression>());
-  }
 #line 5325 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 229:
+  case 223:
+#line 1702 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.expression_) = (yyvsp[0].attribute_);
+  }
+#line 5333 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 224:
+#line 1705 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.expression_) = new quickstep::ParseScalarLiteral((yyvsp[0].literal_value_));
+  }
+#line 5341 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 225:
+#line 1708 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.expression_) = (yyvsp[0].function_call_);
+  }
+#line 5349 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 226:
+#line 1711 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyvsp[-2].function_call_)->setWindowName((yyvsp[0].string_value_));
+    (yyval.expression_) = (yyvsp[-2].function_call_);
+  }
+#line 5358 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 227:
+#line 1715 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyvsp[-4].function_call_)->setWindow((yyvsp[-1].window_definition_));
+    (yyval.expression_) = (yyvsp[-4].function_call_);
+  }
+#line 5367 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 228:
 #line 1719 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.function_call_) = new quickstep::ParseFunctionCall(
-        (yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-3].string_value_), new quickstep::ParseStar((yylsp[-1]).first_line, (yylsp[-1]).first_column));
+    (yyval.expression_) = (yyvsp[0].expression_);
   }
-#line 5334 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5375 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 229:
+#line 1722 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.expression_) = (yyvsp[0].expression_);
+  }
+#line 5383 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 230:
-#line 1723 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1725 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.function_call_) = new quickstep::ParseFunctionCall((yylsp[-3]).first_line, (yylsp[-3]).first_column, false, (yyvsp[-3].string_value_), (yyvsp[-1].expression_list_));
+    (yyval.expression_) = (yyvsp[0].expression_);
   }
-#line 5342 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5391 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 231:
-#line 1726 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1728 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.function_call_) = new quickstep::ParseFunctionCall((yylsp[-4]).first_line, (yylsp[-4]).first_column, true, (yyvsp[-4].string_value_), (yyvsp[-1].expression_list_));
+    (yyval.expression_) = (yyvsp[-1].expression_);
   }
-#line 5350 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5399 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 232:
 #line 1731 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.expression_) = new quickstep::ParseExtractFunction((yylsp[-5]).first_line, (yylsp[-5]).first_column, (yyvsp[-3].string_value_), (yyvsp[-1].expression_));
+    (yyval.expression_) = (yyvsp[0].subquery_expression_);
   }
-#line 5358 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5407 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 233:
 #line 1736 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.expression_) = new quickstep::ParseSubstringFunction(
-        (yylsp[-5]).first_line, (yylsp[-5]).first_column, (yyvsp[-3].expression_), (yyvsp[-1].numeric_literal_value_)->long_value());
+    (yyval.function_call_) = new quickstep::ParseFunctionCall(
+        (yylsp[-2]).first_line, (yylsp[-2]).first_column, false, (yyvsp[-2].string_value_), new quickstep::PtrList<quickstep::ParseExpression>());
   }
-#line 5367 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5416 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 234:
 #line 1740 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.expression_) = new quickstep::ParseSubstringFunction(
-        (yylsp[-7]).first_line, (yylsp[-7]).first_column, (yyvsp[-5].expression_), (yyvsp[-3].numeric_literal_value_)->long_value(), (yyvsp[-1].numeric_literal_value_)->long_value());
+    (yyval.function_call_) = new quickstep::ParseFunctionCall(
+        (yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-3].string_value_), new quickstep::ParseStar((yylsp[-1]).first_line, (yylsp[-1]).first_column));
   }
-#line 5376 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5425 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 235:
-#line 1746 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1744 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.expression_) = new quickstep::ParseSimpleCaseExpression((yylsp[-4]).first_line, (yylsp[-4]).first_column, (yyvsp[-3].expression_), (yyvsp[-2].simple_when_clause_list_), (yyvsp[-1].expression_));
+    (yyval.function_call_) = new quickstep::ParseFunctionCall((yylsp[-3]).first_line, (yylsp[-3]).first_column, false, (yyvsp[-3].string_value_), (yyvsp[-1].expression_list_));
   }
-#line 5384 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5433 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 236:
-#line 1749 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1747 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.expression_) = new quickstep::ParseSearchedCaseExpression((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-2].searched_when_clause_list_), (yyvsp[-1].expression_));
+    (yyval.function_call_) = new quickstep::ParseFunctionCall((yylsp[-4]).first_line, (yylsp[-4]).first_column, true, (yyvsp[-4].string_value_), (yyvsp[-1].expression_list_));
   }
-#line 5392 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5441 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 237:
-#line 1754 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1752 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.expression_) = new quickstep::ParseExtractFunction((yylsp[-5]).first_line, (yylsp[-5]).first_column, (yyvsp[-3].string_value_), (yyvsp[-1].expression_));
+  }
+#line 5449 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 238:
+#line 1757 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.expression_) = new quickstep::ParseSubstringFunction(
+        (yylsp[-5]).first_line, (yylsp[-5]).first_column, (yyvsp[-3].expression_), (yyvsp[-1].numeric_literal_value_)->long_value());
+  }
+#line 5458 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 239:
+#line 1761 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.expression_) = new quickstep::ParseSubstringFunction(
+        (yylsp[-7]).first_line, (yylsp[-7]).first_column, (yyvsp[-5].expression_), (yyvsp[-3].numeric_literal_value_)->long_value(), (yyvsp[-1].numeric_literal_value_)->long_value());
+  }
+#line 5467 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 240:
+#line 1767 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.expression_) = new quickstep::ParseSimpleCaseExpression((yylsp[-4]).first_line, (yylsp[-4]).first_column, (yyvsp[-3].expression_), (yyvsp[-2].simple_when_clause_list_), (yyvsp[-1].expression_));
+  }
+#line 5475 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 241:
+#line 1770 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.expression_) = new quickstep::ParseSearchedCaseExpression((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-2].searched_when_clause_list_), (yyvsp[-1].expression_));
+  }
+#line 5483 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 242:
+#line 1775 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.simple_when_clause_list_) = new quickstep::PtrVector<quickstep::ParseSimpleWhenClause>;
     (yyval.simple_when_clause_list_)->push_back((yyvsp[0].simple_when_clause_));
   }
-#line 5401 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5492 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 238:
-#line 1758 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 243:
+#line 1779 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.simple_when_clause_list_) = (yyvsp[-1].simple_when_clause_list_);
     (yyval.simple_when_clause_list_)->push_back((yyvsp[0].simple_when_clause_));
   }
-#line 5410 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5501 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 239:
-#line 1764 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 244:
+#line 1785 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.simple_when_clause_) = new quickstep::ParseSimpleWhenClause((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-2].expression_), (yyvsp[0].expression_));
   }
-#line 5418 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5509 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 240:
-#line 1769 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 245:
+#line 1790 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.searched_when_clause_list_) = new quickstep::PtrVector<quickstep::ParseSearchedWhenClause>;
     (yyval.searched_when_clause_list_)->push_back((yyvsp[0].searched_when_clause_));
   }
-#line 5427 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5518 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 241:
-#line 1773 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 246:
+#line 1794 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.searched_when_clause_list_) = (yyvsp[-1].searched_when_clause_list_);
     (yyval.searched_when_clause_list_)->push_back((yyvsp[0].searched_when_clause_));
   }
-#line 5436 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 242:
-#line 1779 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.searched_when_clause_) = new quickstep::ParseSearchedWhenClause((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-2].predicate_), (yyvsp[0].expression_));
-  }
-#line 5444 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 243:
-#line 1784 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_) = NULL;
-  }
-#line 5452 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 244:
-#line 1787 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_) = (yyvsp[0].expression_);
-  }
-#line 5460 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 245:
-#line 1792 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_list_) = new quickstep::PtrList<quickstep::ParseExpression>();
-    (yyval.expression_list_)->push_back((yyvsp[0].expression_));
-  }
-#line 5469 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 246:
-#line 1796 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.expression_list_) = (yyvsp[-2].expression_list_);
-    (yyval.expression_list_)->push_back((yyvsp[0].expression_));
-  }
-#line 5478 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5527 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 247:
-#line 1802 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1800 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.literal_value_) = new quickstep::NullParseLiteralValue((yylsp[0]).first_line, (yylsp[0]).first_column);
+    (yyval.searched_when_clause_) = new quickstep::ParseSearchedWhenClause((yylsp[-3]).first_line, (yylsp[-3]).first_column, (yyvsp[-2].predicate_), (yyvsp[0].expression_));
   }
-#line 5486 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5535 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 248:
 #line 1805 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.literal_value_) = (yyvsp[0].numeric_literal_value_);
+    (yyval.expression_) = NULL;
   }
-#line 5494 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5543 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 249:
 #line 1808 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.literal_value_) = (yyvsp[0].numeric_literal_value_);
+    (yyval.expression_) = (yyvsp[0].expression_);
   }
-#line 5502 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5551 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 250:
-#line 1811 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1813 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.expression_list_) = new quickstep::PtrList<quickstep::ParseExpression>();
+    (yyval.expression_list_)->push_back((yyvsp[0].expression_));
+  }
+#line 5560 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 251:
+#line 1817 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.expression_list_) = (yyvsp[-2].expression_list_);
+    (yyval.expression_list_)->push_back((yyvsp[0].expression_));
+  }
+#line 5569 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 252:
+#line 1823 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.literal_value_) = new quickstep::NullParseLiteralValue((yylsp[0]).first_line, (yylsp[0]).first_column);
+  }
+#line 5577 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 253:
+#line 1826 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.literal_value_) = (yyvsp[0].numeric_literal_value_);
+  }
+#line 5585 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 254:
+#line 1829 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.literal_value_) = (yyvsp[0].numeric_literal_value_);
+  }
+#line 5593 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 255:
+#line 1832 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     /**
      * NOTE(chasseur): This case exhibits a shift/reduce conflict with the
@@ -5515,20 +5606,20 @@
     (yyvsp[0].numeric_literal_value_)->prependMinus();
     (yyval.literal_value_) = (yyvsp[0].numeric_literal_value_);
   }
-#line 5519 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5610 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 251:
-#line 1823 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 256:
+#line 1844 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     (yyval.literal_value_) = new quickstep::StringParseLiteralValue((yyvsp[0].string_value_),
                                                 nullptr);  // No explicit type.
   }
-#line 5528 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5619 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 252:
-#line 1827 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 257:
+#line 1848 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     /**
      * NOTE(chasseur): This case exhibits a shift/reduce conflict with the
@@ -5548,11 +5639,11 @@
       YYERROR;
     }
   }
-#line 5552 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5643 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 253:
-#line 1846 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 258:
+#line 1867 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     quickstep::StringParseLiteralValue *parse_value;
     const std::string &datetime_type_value = (yyvsp[0].string_value_)->value();
@@ -5566,11 +5657,11 @@
       YYERROR;
     }
   }
-#line 5570 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5661 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 254:
-#line 1859 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 259:
+#line 1880 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     quickstep::StringParseLiteralValue *parse_value
         = new quickstep::StringParseLiteralValue((yyvsp[0].string_value_), &((yyvsp[-1].data_type_)->getType()));
@@ -5584,191 +5675,191 @@
       (yyval.literal_value_) = parse_value;
     }
   }
-#line 5588 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 255:
-#line 1874 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, std::string("YEAR"));
-  }
-#line 5596 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 256:
-#line 1877 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, std::string("MONTH"));
-  }
-#line 5604 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 257:
-#line 1880 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, std::string("DAY"));
-  }
-#line 5612 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 258:
-#line 1883 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, std::string("HOUR"));
-  }
-#line 5620 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 259:
-#line 1886 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, std::string("MINUTE"));
-  }
-#line 5628 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5679 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 260:
-#line 1889 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1895 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, std::string("SECOND"));
+     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, std::string("YEAR"));
   }
-#line 5636 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5687 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 261:
-#line 1894 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1898 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.literal_value_list_) = new quickstep::PtrList<quickstep::ParseScalarLiteral>();
-    (yyval.literal_value_list_)->push_back(new quickstep::ParseScalarLiteral((yyvsp[0].literal_value_)));
+     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, std::string("MONTH"));
   }
-#line 5645 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5695 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 262:
-#line 1898 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1901 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.literal_value_list_) = (yyvsp[-2].literal_value_list_);
-    (yyval.literal_value_list_)->push_back(new quickstep::ParseScalarLiteral((yyvsp[0].literal_value_)));
+     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, std::string("DAY"));
   }
-#line 5654 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5703 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 263:
 #line 1904 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.attribute_) = new quickstep::ParseAttribute((yylsp[0]).first_line, (yylsp[0]).first_column, (yyvsp[0].string_value_));
+     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, std::string("HOUR"));
   }
-#line 5662 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5711 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 264:
 #line 1907 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.attribute_) = new quickstep::ParseAttribute((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[0].string_value_), (yyvsp[-2].string_value_));
+     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, std::string("MINUTE"));
   }
-#line 5670 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5719 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 265:
-#line 1912 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1910 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.attribute_list_) = new quickstep::PtrList<quickstep::ParseAttribute>();
-    (yyval.attribute_list_)->push_back((yyvsp[0].attribute_));
+     (yyval.string_value_) = new quickstep::ParseString((yylsp[0]).first_line, (yylsp[0]).first_column, std::string("SECOND"));
   }
-#line 5679 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5727 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 266:
-#line 1916 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1915 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.attribute_list_) = (yyvsp[-2].attribute_list_);
-    (yyval.attribute_list_)->push_back((yyvsp[0].attribute_));
-  }
-#line 5688 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 267:
-#line 1923 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.comparison_) = &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kEqual);
-  }
-#line 5696 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 268:
-#line 1926 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.comparison_) = &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kNotEqual);
-  }
-#line 5704 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 269:
-#line 1929 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.comparison_) = &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kLess);
-  }
-#line 5712 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 270:
-#line 1932 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.comparison_) = &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kLessOrEqual);
-  }
-#line 5720 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 271:
-#line 1935 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.comparison_) = &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kGreater);
-  }
-#line 5728 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 272:
-#line 1938 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.comparison_) = &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kGreaterOrEqual);
+    (yyval.literal_value_list_) = new quickstep::PtrList<quickstep::ParseScalarLiteral>();
+    (yyval.literal_value_list_)->push_back(new quickstep::ParseScalarLiteral((yyvsp[0].literal_value_)));
   }
 #line 5736 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 273:
-#line 1941 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 267:
+#line 1919 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.comparison_) =  &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kLike);
+    (yyval.literal_value_list_) = (yyvsp[-2].literal_value_list_);
+    (yyval.literal_value_list_)->push_back(new quickstep::ParseScalarLiteral((yyvsp[0].literal_value_)));
   }
-#line 5744 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5745 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 268:
+#line 1925 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.attribute_) = new quickstep::ParseAttribute((yylsp[0]).first_line, (yylsp[0]).first_column, (yyvsp[0].string_value_));
+  }
+#line 5753 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 269:
+#line 1928 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.attribute_) = new quickstep::ParseAttribute((yylsp[-2]).first_line, (yylsp[-2]).first_column, (yyvsp[0].string_value_), (yyvsp[-2].string_value_));
+  }
+#line 5761 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 270:
+#line 1933 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.attribute_list_) = new quickstep::PtrList<quickstep::ParseAttribute>();
+    (yyval.attribute_list_)->push_back((yyvsp[0].attribute_));
+  }
+#line 5770 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 271:
+#line 1937 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.attribute_list_) = (yyvsp[-2].attribute_list_);
+    (yyval.attribute_list_)->push_back((yyvsp[0].attribute_));
+  }
+#line 5779 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 272:
+#line 1944 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.comparison_) = &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kEqual);
+  }
+#line 5787 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 273:
+#line 1947 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.comparison_) = &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kNotEqual);
+  }
+#line 5795 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 274:
-#line 1944 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1950 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.comparison_) =  &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kNotLike);
+    (yyval.comparison_) = &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kLess);
   }
-#line 5752 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5803 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 275:
-#line 1947 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1953 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.comparison_) =  &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kRegexMatch);
+    (yyval.comparison_) = &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kLessOrEqual);
   }
-#line 5760 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5811 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 276:
-#line 1950 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1956 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.comparison_) =  &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kNotRegexMatch);
+    (yyval.comparison_) = &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kGreater);
   }
-#line 5768 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5819 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 277:
-#line 1955 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1959 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.comparison_) = &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kGreaterOrEqual);
+  }
+#line 5827 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 278:
+#line 1962 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.comparison_) =  &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kLike);
+  }
+#line 5835 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 279:
+#line 1965 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.comparison_) =  &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kNotLike);
+  }
+#line 5843 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 280:
+#line 1968 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.comparison_) =  &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kRegexMatch);
+  }
+#line 5851 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 281:
+#line 1971 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.comparison_) =  &quickstep::ComparisonFactory::GetComparison(quickstep::ComparisonID::kNotRegexMatch);
+  }
+#line 5859 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 282:
+#line 1976 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     /**
      * NOTE(chasseur): This case exhibits a shift/reduce conflict with the
@@ -5778,146 +5869,146 @@
      **/
     (yyval.unary_operation_) = &quickstep::UnaryOperationFactory::GetUnaryOperation(quickstep::UnaryOperationID::kNegate);
   }
-#line 5782 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 278:
-#line 1966 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.binary_operation_) = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kAdd);
-  }
-#line 5790 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 279:
-#line 1969 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.binary_operation_) = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kSubtract);
-  }
-#line 5798 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 280:
-#line 1974 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.binary_operation_) = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kModulo);
-  }
-#line 5806 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 281:
-#line 1977 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.binary_operation_) = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kMultiply);
-  }
-#line 5814 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 282:
-#line 1980 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.binary_operation_) = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kDivide);
-  }
-#line 5822 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5873 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 283:
-#line 1986 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1987 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.string_list_) = new quickstep::PtrList<quickstep::ParseString>();
-    (yyval.string_list_)->push_back((yyvsp[0].string_value_));
+    (yyval.binary_operation_) = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kAdd);
   }
-#line 5831 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5881 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 284:
 #line 1990 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.string_list_) = (yyvsp[-2].string_list_);
-    (yyval.string_list_)->push_back((yyvsp[0].string_value_));
+    (yyval.binary_operation_) = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kSubtract);
   }
-#line 5840 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5889 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 285:
-#line 1996 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1995 "../SqlParser.ypp" /* yacc.c:1661  */
     {
-    (yyval.string_value_) = (yyvsp[0].string_value_);
+    (yyval.binary_operation_) = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kModulo);
   }
-#line 5848 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5897 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 286:
-#line 1999 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 1998 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.binary_operation_) = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kMultiply);
+  }
+#line 5905 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 287:
+#line 2001 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.binary_operation_) = &quickstep::BinaryOperationFactory::GetBinaryOperation(quickstep::BinaryOperationID::kDivide);
+  }
+#line 5913 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 288:
+#line 2007 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.string_list_) = new quickstep::PtrList<quickstep::ParseString>();
+    (yyval.string_list_)->push_back((yyvsp[0].string_value_));
+  }
+#line 5922 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 289:
+#line 2011 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.string_list_) = (yyvsp[-2].string_list_);
+    (yyval.string_list_)->push_back((yyvsp[0].string_value_));
+  }
+#line 5931 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 290:
+#line 2017 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.string_value_) = (yyvsp[0].string_value_);
+  }
+#line 5939 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 291:
+#line 2020 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     if ((yyvsp[0].string_value_)->value().empty()) {
       quickstep_yyerror(&(yylsp[0]), yyscanner, nullptr, "Zero-length identifier");
     }
     (yyval.string_value_) = (yyvsp[0].string_value_);
   }
-#line 5859 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 287:
-#line 2007 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.boolean_value_) = true;
-  }
-#line 5867 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 288:
-#line 2010 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.boolean_value_) = true;
-  }
-#line 5875 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 289:
-#line 2013 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.boolean_value_) = false;
-  }
-#line 5883 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 290:
-#line 2016 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.boolean_value_) = false;
-  }
-#line 5891 "SqlParser_gen.cpp" /* yacc.c:1661  */
-    break;
-
-  case 291:
-#line 2022 "../SqlParser.ypp" /* yacc.c:1661  */
-    {
-    (yyval.command_) = new quickstep::ParseCommand((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].command_argument_list_));
-  }
-#line 5899 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 5950 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
   case 292:
-#line 2027 "../SqlParser.ypp" /* yacc.c:1661  */
+#line 2028 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.boolean_value_) = true;
+  }
+#line 5958 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 293:
+#line 2031 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.boolean_value_) = true;
+  }
+#line 5966 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 294:
+#line 2034 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.boolean_value_) = false;
+  }
+#line 5974 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 295:
+#line 2037 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.boolean_value_) = false;
+  }
+#line 5982 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 296:
+#line 2043 "../SqlParser.ypp" /* yacc.c:1661  */
+    {
+    (yyval.command_) = new quickstep::ParseCommand((yylsp[-1]).first_line, (yylsp[-1]).first_column, (yyvsp[-1].string_value_), (yyvsp[0].command_argument_list_));
+  }
+#line 5990 "SqlParser_gen.cpp" /* yacc.c:1661  */
+    break;
+
+  case 297:
+#line 2048 "../SqlParser.ypp" /* yacc.c:1661  */
     {
     quickstep::PtrVector<quickstep::ParseString> *argument_list = (yyvsp[-1].command_argument_list_);
     argument_list->push_back((yyvsp[0].string_value_));
     (yyval.command_argument_list_) = argument_list;
   }
-#line 5909 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 6000 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
-  case 293:
-#line 2032 "../SqlParser.ypp" /* yacc.c:1661  */
+  case 298:
+#line 2053 "../SqlParser.ypp" /* yacc.c:1661  */
     { /* Epsilon, an empy match. */
     (yyval.command_argument_list_) = new quickstep::PtrVector<quickstep::ParseString>();
   }
-#line 5917 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 6008 "SqlParser_gen.cpp" /* yacc.c:1661  */
     break;
 
 
-#line 5921 "SqlParser_gen.cpp" /* yacc.c:1661  */
+#line 6012 "SqlParser_gen.cpp" /* yacc.c:1661  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -6152,7 +6243,7 @@
 #endif
   return yyresult;
 }
-#line 2036 "../SqlParser.ypp" /* yacc.c:1906  */
+#line 2057 "../SqlParser.ypp" /* yacc.c:1906  */
 
 
 void NotSupported(const YYLTYPE *location, yyscan_t yyscanner, const std::string &feature) {
diff --git a/parser/preprocessed/SqlParser_gen.hpp b/parser/preprocessed/SqlParser_gen.hpp
index a6d12e2..f6b5247 100644
--- a/parser/preprocessed/SqlParser_gen.hpp
+++ b/parser/preprocessed/SqlParser_gen.hpp
@@ -94,90 +94,91 @@
     TOKEN_DECIMAL = 304,
     TOKEN_DEFAULT = 305,
     TOKEN_DELETE = 306,
-    TOKEN_DELIMITER = 307,
-    TOKEN_DESC = 308,
-    TOKEN_DISTINCT = 309,
-    TOKEN_DOUBLE = 310,
-    TOKEN_DROP = 311,
-    TOKEN_ELSE = 312,
-    TOKEN_END = 313,
-    TOKEN_ESCAPE_STRINGS = 314,
-    TOKEN_EXISTS = 315,
-    TOKEN_EXTRACT = 316,
-    TOKEN_FALSE = 317,
-    TOKEN_FIRST = 318,
-    TOKEN_FLOAT = 319,
-    TOKEN_FOLLOWING = 320,
-    TOKEN_FOR = 321,
-    TOKEN_FOREIGN = 322,
-    TOKEN_FROM = 323,
-    TOKEN_FULL = 324,
-    TOKEN_GROUP = 325,
-    TOKEN_HASH = 326,
-    TOKEN_HAVING = 327,
-    TOKEN_HOUR = 328,
-    TOKEN_IN = 329,
-    TOKEN_INDEX = 330,
-    TOKEN_INNER = 331,
-    TOKEN_INSERT = 332,
-    TOKEN_INTEGER = 333,
-    TOKEN_INTERVAL = 334,
-    TOKEN_INTO = 335,
-    TOKEN_JOIN = 336,
-    TOKEN_KEY = 337,
-    TOKEN_LAST = 338,
-    TOKEN_LEFT = 339,
-    TOKEN_LIMIT = 340,
-    TOKEN_LONG = 341,
-    TOKEN_MINUTE = 342,
-    TOKEN_MONTH = 343,
-    TOKEN_NULL = 344,
-    TOKEN_NULLS = 345,
-    TOKEN_OFF = 346,
-    TOKEN_ON = 347,
-    TOKEN_ORDER = 348,
-    TOKEN_OUTER = 349,
-    TOKEN_OVER = 350,
-    TOKEN_PARTITION = 351,
-    TOKEN_PARTITIONS = 352,
-    TOKEN_PERCENT = 353,
-    TOKEN_PRECEDING = 354,
-    TOKEN_PRIMARY = 355,
-    TOKEN_PRIORITY = 356,
-    TOKEN_QUIT = 357,
-    TOKEN_RANGE = 358,
-    TOKEN_REAL = 359,
-    TOKEN_REFERENCES = 360,
-    TOKEN_RIGHT = 361,
-    TOKEN_ROW = 362,
-    TOKEN_ROW_DELIMITER = 363,
-    TOKEN_ROWS = 364,
-    TOKEN_SECOND = 365,
-    TOKEN_SELECT = 366,
-    TOKEN_SET = 367,
-    TOKEN_SMA = 368,
-    TOKEN_SMALLINT = 369,
+    TOKEN_DESC = 307,
+    TOKEN_DISTINCT = 308,
+    TOKEN_DOUBLE = 309,
+    TOKEN_DROP = 310,
+    TOKEN_ELSE = 311,
+    TOKEN_END = 312,
+    TOKEN_EXISTS = 313,
+    TOKEN_EXTRACT = 314,
+    TOKEN_FALSE = 315,
+    TOKEN_FIRST = 316,
+    TOKEN_FLOAT = 317,
+    TOKEN_FOLLOWING = 318,
+    TOKEN_FOR = 319,
+    TOKEN_FOREIGN = 320,
+    TOKEN_FROM = 321,
+    TOKEN_FULL = 322,
+    TOKEN_GROUP = 323,
+    TOKEN_HASH = 324,
+    TOKEN_HAVING = 325,
+    TOKEN_HOUR = 326,
+    TOKEN_IN = 327,
+    TOKEN_INDEX = 328,
+    TOKEN_INNER = 329,
+    TOKEN_INSERT = 330,
+    TOKEN_INTEGER = 331,
+    TOKEN_INTERVAL = 332,
+    TOKEN_INTO = 333,
+    TOKEN_JOIN = 334,
+    TOKEN_KEY = 335,
+    TOKEN_LAST = 336,
+    TOKEN_LEFT = 337,
+    TOKEN_LIMIT = 338,
+    TOKEN_LONG = 339,
+    TOKEN_MINUTE = 340,
+    TOKEN_MONTH = 341,
+    TOKEN_NULL = 342,
+    TOKEN_NULLS = 343,
+    TOKEN_OFF = 344,
+    TOKEN_ON = 345,
+    TOKEN_ORDER = 346,
+    TOKEN_OUTER = 347,
+    TOKEN_OVER = 348,
+    TOKEN_PARTITION = 349,
+    TOKEN_PARTITIONS = 350,
+    TOKEN_PERCENT = 351,
+    TOKEN_PRECEDING = 352,
+    TOKEN_PRIMARY = 353,
+    TOKEN_PRIORITY = 354,
+    TOKEN_QUIT = 355,
+    TOKEN_RANGE = 356,
+    TOKEN_REAL = 357,
+    TOKEN_REFERENCES = 358,
+    TOKEN_RIGHT = 359,
+    TOKEN_ROW = 360,
+    TOKEN_ROW_DELIMITER = 361,
+    TOKEN_ROWS = 362,
+    TOKEN_SECOND = 363,
+    TOKEN_SELECT = 364,
+    TOKEN_SET = 365,
+    TOKEN_SMA = 366,
+    TOKEN_SMALLINT = 367,
+    TOKEN_STDERR = 368,
+    TOKEN_STDOUT = 369,
     TOKEN_SUBSTRING = 370,
     TOKEN_TABLE = 371,
     TOKEN_THEN = 372,
     TOKEN_TIME = 373,
     TOKEN_TIMESTAMP = 374,
-    TOKEN_TRUE = 375,
-    TOKEN_TUPLESAMPLE = 376,
-    TOKEN_UNBOUNDED = 377,
-    TOKEN_UNIQUE = 378,
-    TOKEN_UPDATE = 379,
-    TOKEN_USING = 380,
-    TOKEN_VALUES = 381,
-    TOKEN_VARCHAR = 382,
-    TOKEN_WHEN = 383,
-    TOKEN_WHERE = 384,
-    TOKEN_WINDOW = 385,
-    TOKEN_WITH = 386,
-    TOKEN_YEAR = 387,
-    TOKEN_YEARMONTH = 388,
-    TOKEN_EOF = 389,
-    TOKEN_LEX_ERROR = 390
+    TOKEN_TO = 375,
+    TOKEN_TRUE = 376,
+    TOKEN_TUPLESAMPLE = 377,
+    TOKEN_UNBOUNDED = 378,
+    TOKEN_UNIQUE = 379,
+    TOKEN_UPDATE = 380,
+    TOKEN_USING = 381,
+    TOKEN_VALUES = 382,
+    TOKEN_VARCHAR = 383,
+    TOKEN_WHEN = 384,
+    TOKEN_WHERE = 385,
+    TOKEN_WINDOW = 386,
+    TOKEN_WITH = 387,
+    TOKEN_YEAR = 388,
+    TOKEN_YEARMONTH = 389,
+    TOKEN_EOF = 390,
+    TOKEN_LEX_ERROR = 391
   };
 #endif
 
@@ -237,8 +238,7 @@
   quickstep::ParseKeyStringValue *key_string_value_;
   quickstep::ParseKeyStringList *key_string_list_;
   quickstep::ParseKeyIntegerValue *key_integer_value_;
-
-  quickstep::ParseCopyFromParams *copy_from_params_;
+  quickstep::ParseKeyBoolValue *key_bool_value_;
 
   quickstep::ParseAssignment *assignment_;
   quickstep::PtrList<quickstep::ParseAssignment> *assignment_list_;
@@ -251,7 +251,7 @@
   quickstep::ParseStatementUpdate *update_statement_;
   quickstep::ParseStatementInsert *insert_statement_;
   quickstep::ParseStatementDelete *delete_statement_;
-  quickstep::ParseStatementCopyFrom *copy_from_statement_;
+  quickstep::ParseStatementCopy *copy_statement_;
   quickstep::ParseStatementCreateTable *create_table_statement_;
   quickstep::ParsePartitionClause *partition_clause_;
   quickstep::ParseBlockProperties *block_properties_;
diff --git a/parser/tests/Copy.test b/parser/tests/Copy.test
index dccaa82..7d1677d 100644
--- a/parser/tests/Copy.test
+++ b/parser/tests/Copy.test
@@ -24,34 +24,131 @@
 
 COPY test FROM 'test.txt'
 --
-CopyFromStatement[relation_name=test,source_file=test.txt]
+CopyStatement[direction=FROM,file=test.txt,relation_name=test]
 ==
 
 COPY test FROM 'test.txt' WITH (DELIMITER 'd', ESCAPE_STRINGS FALSE)
 --
-CopyFromStatement[relation_name=test,source_file=test.txt]
-+-params=CopyFromParams[delimiter=d,escape_string=false]
+CopyStatement[direction=FROM,file=test.txt,relation_name=test]
++-params=
+  +-KeyStringValue[key=DELIMITER]
+  | +-value=String[value=d]
+  +-KeyBoolValue[key=ESCAPE_STRINGS,value=false]
 ==
 
 COPY test FROM 'test.txt' WITH (DELIMITER '123', ESCAPE_STRINGS FALSE)
 --
-CopyFromStatement[relation_name=test,source_file=test.txt]
-+-params=CopyFromParams[delimiter=123,escape_string=false]
+CopyStatement[direction=FROM,file=test.txt,relation_name=test]
++-params=
+  +-KeyStringValue[key=DELIMITER]
+  | +-value=String[value=123]
+  +-KeyBoolValue[key=ESCAPE_STRINGS,value=false]
 ==
 
 COPY test FROM 'test.txt' WITH (DELIMITER e'\t')
 --
-CopyFromStatement[relation_name=test,source_file=test.txt]
-+-params=CopyFromParams[delimiter=	,escape_string=true]
+CopyStatement[direction=FROM,file=test.txt,relation_name=test]
++-params=
+  +-KeyStringValue[key=DELIMITER]
+    +-value=String[value=	]
 ==
 
 COPY test FROM 'test.txt' WITH (ESCAPE_STRINGS FALSE, DELIMITER 'd')
 --
-CopyFromStatement[relation_name=test,source_file=test.txt]
-+-params=CopyFromParams[delimiter=d,escape_string=false]
+CopyStatement[direction=FROM,file=test.txt,relation_name=test]
++-params=
+  +-KeyBoolValue[key=ESCAPE_STRINGS,value=false]
+  +-KeyStringValue[key=DELIMITER]
+    +-value=String[value=d]
 ==
 
 COPY test FROM 'test.txt' WITH (DELIMITER '1', ESCAPE_STRINGS FALSE, DELIMITER '2', ESCAPE_STRINGS TRUE)
 --
-CopyFromStatement[relation_name=test,source_file=test.txt]
-+-params=CopyFromParams[delimiter=2,escape_string=true]
+CopyStatement[direction=FROM,file=test.txt,relation_name=test]
++-params=
+  +-KeyStringValue[key=DELIMITER]
+  | +-value=String[value=1]
+  +-KeyBoolValue[key=ESCAPE_STRINGS,value=false]
+  +-KeyStringValue[key=DELIMITER]
+  | +-value=String[value=2]
+  +-KeyBoolValue[key=ESCAPE_STRINGS,value=true]
+==
+
+COPY test TO 'test.txt';
+--
+CopyStatement[direction=TO,file=@test.txt,relation_name=test]
+==
+
+COPY test TO stdout;
+--
+CopyStatement[direction=TO,file=$stdout,relation_name=test]
+==
+
+COPY test TO stderr;
+--
+CopyStatement[direction=TO,file=$stderr,relation_name=test]
+==
+
+COPY test TO 'stdout';
+--
+CopyStatement[direction=TO,file=@stdout,relation_name=test]
+==
+
+COPY test TO 'test.txt' WITH (FORMAT 'TEXT');
+--
+CopyStatement[direction=TO,file=@test.txt,relation_name=test]
++-params=
+  +-KeyStringValue[key=FORMAT]
+    +-value=String[value=TEXT]
+==
+
+COPY test TO 'test.txt' WITH (FORMAT 'CSV');
+--
+CopyStatement[direction=TO,file=@test.txt,relation_name=test]
++-params=
+  +-KeyStringValue[key=FORMAT]
+    +-value=String[value=CSV]
+==
+
+COPY test TO stdout
+WITH (FORMAT 'CSV', DELIMITER e'\t', HEADER TRUE, QUOTE '$', NULL_STRING 'NULL');
+--
+CopyStatement[direction=TO,file=$stdout,relation_name=test]
++-params=
+  +-KeyStringValue[key=FORMAT]
+  | +-value=String[value=CSV]
+  +-KeyStringValue[key=DELIMITER]
+  | +-value=String[value=	]
+  +-KeyBoolValue[key=HEADER,value=true]
+  +-KeyStringValue[key=QUOTE]
+  | +-value=String[value=$]
+  +-KeyStringValue[key=NULL_STRING]
+    +-value=String[value=NULL]
+==
+
+COPY
+  SELECT SUM(int_col) AS sum_int,
+         AVG(double_col) AS avg_dbl
+  FROM test
+  GROUP BY char_col
+TO 'test.txt' WITH (DELIMITER ',');
+--
+CopyStatement[direction=TO,file=@test.txt]
++-set_operation_query=SetOperation[set_operation_type=Select]
+| +-children=
+|   +-Select
+|     +-select_clause=SelectList
+|     | +-SelectListItem[alias=sum_int]
+|     | | +-FunctionCall[name=SUM]
+|     | |   +-AttributeReference[attribute_name=int_col]
+|     | +-SelectListItem[alias=avg_dbl]
+|     |   +-FunctionCall[name=AVG]
+|     |     +-AttributeReference[attribute_name=double_col]
+|     +-group_by=GroupBy
+|     | +-AttributeReference[attribute_name=char_col]
+|     +-from_clause=
+|       +-TableReference[table=test]
++-params=
+  +-KeyStringValue[key=DELIMITER]
+    +-value=String[value=,]
+==
diff --git a/query_optimizer/CMakeLists.txt b/query_optimizer/CMakeLists.txt
index fdf8796..4ea21b2 100644
--- a/query_optimizer/CMakeLists.txt
+++ b/query_optimizer/CMakeLists.txt
@@ -94,6 +94,7 @@
                       quickstep_queryoptimizer_expressions_WindowAggregateFunction
                       quickstep_queryoptimizer_physical_Aggregate
                       quickstep_queryoptimizer_physical_CopyFrom
+                      quickstep_queryoptimizer_physical_CopyTo
                       quickstep_queryoptimizer_physical_CreateIndex
                       quickstep_queryoptimizer_physical_CreateTable
                       quickstep_queryoptimizer_physical_CrossReferenceCoalesceAggregate
@@ -140,6 +141,7 @@
                       quickstep_relationaloperators_SelectOperator
                       quickstep_relationaloperators_SortMergeRunOperator
                       quickstep_relationaloperators_SortRunGenerationOperator
+                      quickstep_relationaloperators_TableExportOperator
                       quickstep_relationaloperators_TableGeneratorOperator
                       quickstep_relationaloperators_TextScanOperator
                       quickstep_relationaloperators_UnionAllOperator
diff --git a/query_optimizer/ExecutionGenerator.cpp b/query_optimizer/ExecutionGenerator.cpp
index d82a0c7..372d576 100644
--- a/query_optimizer/ExecutionGenerator.cpp
+++ b/query_optimizer/ExecutionGenerator.cpp
@@ -78,6 +78,7 @@
 #include "query_optimizer/expressions/WindowAggregateFunction.hpp"
 #include "query_optimizer/physical/Aggregate.hpp"
 #include "query_optimizer/physical/CopyFrom.hpp"
+#include "query_optimizer/physical/CopyTo.hpp"
 #include "query_optimizer/physical/CreateIndex.hpp"
 #include "query_optimizer/physical/CreateTable.hpp"
 #include "query_optimizer/physical/CrossReferenceCoalesceAggregate.hpp"
@@ -124,6 +125,7 @@
 #include "relational_operators/SelectOperator.hpp"
 #include "relational_operators/SortMergeRunOperator.hpp"
 #include "relational_operators/SortRunGenerationOperator.hpp"
+#include "relational_operators/TableExportOperator.hpp"
 #include "relational_operators/TableGeneratorOperator.hpp"
 #include "relational_operators/TextScanOperator.hpp"
 #include "relational_operators/UnionAllOperator.hpp"
@@ -409,6 +411,9 @@
     case P::PhysicalType::kCopyFrom:
       return convertCopyFrom(
           std::static_pointer_cast<const P::CopyFrom>(physical_plan));
+    case P::PhysicalType::kCopyTo:
+      return convertCopyTo(
+          std::static_pointer_cast<const P::CopyTo>(physical_plan));
     case P::PhysicalType::kCreateIndex:
       return convertCreateIndex(
           std::static_pointer_cast<const P::CreateIndex>(physical_plan));
@@ -1223,8 +1228,7 @@
           new TextScanOperator(
               query_handle_->query_id(),
               physical_plan->file_name(),
-              physical_plan->column_delimiter(),
-              physical_plan->escape_strings(),
+              physical_plan->options(),
               *output_relation,
               insert_destination_index));
   insert_destination_proto->set_relational_op_index(scan_operator_index);
@@ -1239,6 +1243,40 @@
                                        false /* is_pipeline_breaker */);
 }
 
+void ExecutionGenerator::convertCopyTo(const P::CopyToPtr &physical_plan) {
+  // CopyTo is converted to a TableExport operator.
+
+  const CatalogRelation *input_relation;
+  bool input_relation_is_stored;
+
+  const P::PhysicalPtr &input = physical_plan->input();
+  P::TableReferencePtr table_reference;
+  const CatalogRelationInfo *input_relation_info = nullptr;
+  if (P::SomeTableReference::MatchesWithConditionalCast(input, &table_reference)) {
+    input_relation = table_reference->relation();
+    input_relation_is_stored = true;
+  } else {
+    input_relation_info = findRelationInfoOutputByPhysical(input);
+    input_relation = input_relation_info->relation;
+    input_relation_is_stored = false;
+  }
+
+  DCHECK(input_relation != nullptr);
+  const QueryPlan::DAGNodeIndex table_export_operator_index =
+      execution_plan_->addRelationalOperator(
+          new TableExportOperator(query_handle_->query_id(),
+                                  *input_relation,
+                                  input_relation_is_stored,
+                                  physical_plan->file_name(),
+                                  physical_plan->options()));
+  if (!input_relation_is_stored) {
+    DCHECK(input_relation_info != nullptr);
+    execution_plan_->addDirectDependency(table_export_operator_index,
+                                         input_relation_info->producer_operator_index,
+                                         false /* is_pipeline_breaker */);
+  }
+}
+
 void ExecutionGenerator::convertCreateIndex(
   const P::CreateIndexPtr &physical_plan) {
   // CreateIndex is converted to a CreateIndex operator.
diff --git a/query_optimizer/ExecutionGenerator.hpp b/query_optimizer/ExecutionGenerator.hpp
index 19e75c1..bc9f88b 100644
--- a/query_optimizer/ExecutionGenerator.hpp
+++ b/query_optimizer/ExecutionGenerator.hpp
@@ -44,6 +44,7 @@
 #include "query_optimizer/expressions/Predicate.hpp"
 #include "query_optimizer/physical/Aggregate.hpp"
 #include "query_optimizer/physical/CopyFrom.hpp"
+#include "query_optimizer/physical/CopyTo.hpp"
 #include "query_optimizer/physical/CreateIndex.hpp"
 #include "query_optimizer/physical/CreateTable.hpp"
 #include "query_optimizer/physical/CrossReferenceCoalesceAggregate.hpp"
@@ -282,6 +283,13 @@
   void convertCopyFrom(const physical::CopyFromPtr &physical_plan);
 
   /**
+   * @brief Converts a CopyTo to a TableExport operator.
+   *
+   * @param physical_plan The CopyTo to be converted.
+   */
+  void convertCopyTo(const physical::CopyToPtr &physical_plan);
+
+  /**
    * @brief Converts a CreateIndex to a CreateIndex operator.
    *
    * @param physical_plan The CreateIndex to be converted.
diff --git a/query_optimizer/logical/CMakeLists.txt b/query_optimizer/logical/CMakeLists.txt
index 4480e0b..37e9735 100644
--- a/query_optimizer/logical/CMakeLists.txt
+++ b/query_optimizer/logical/CMakeLists.txt
@@ -19,6 +19,7 @@
 add_library(quickstep_queryoptimizer_logical_Aggregate Aggregate.cpp Aggregate.hpp)
 add_library(quickstep_queryoptimizer_logical_BinaryJoin BinaryJoin.cpp BinaryJoin.hpp)
 add_library(quickstep_queryoptimizer_logical_CopyFrom CopyFrom.cpp CopyFrom.hpp)
+add_library(quickstep_queryoptimizer_logical_CopyTo CopyTo.cpp CopyTo.hpp)
 add_library(quickstep_queryoptimizer_logical_CreateIndex CreateIndex.cpp CreateIndex.hpp)
 add_library(quickstep_queryoptimizer_logical_CreateTable CreateTable.cpp CreateTable.hpp)
 add_library(quickstep_queryoptimizer_logical_DeleteTuples DeleteTuples.cpp DeleteTuples.hpp)
@@ -74,6 +75,16 @@
                       quickstep_queryoptimizer_expressions_AttributeReference
                       quickstep_queryoptimizer_logical_Logical
                       quickstep_queryoptimizer_logical_LogicalType
+                      quickstep_utility_BulkIoConfiguration
+                      quickstep_utility_Macros
+                      quickstep_utility_StringUtil)
+target_link_libraries(quickstep_queryoptimizer_logical_CopyTo
+                      glog
+                      quickstep_queryoptimizer_OptimizerTree
+                      quickstep_queryoptimizer_expressions_AttributeReference
+                      quickstep_queryoptimizer_logical_Logical
+                      quickstep_queryoptimizer_logical_LogicalType
+                      quickstep_utility_BulkIoConfiguration
                       quickstep_utility_Macros
                       quickstep_utility_StringUtil)
 target_link_libraries(quickstep_queryoptimizer_logical_CreateIndex
@@ -290,6 +301,7 @@
                       quickstep_queryoptimizer_logical_Aggregate
                       quickstep_queryoptimizer_logical_BinaryJoin
                       quickstep_queryoptimizer_logical_CopyFrom
+                      quickstep_queryoptimizer_logical_CopyTo
                       quickstep_queryoptimizer_logical_CreateIndex
                       quickstep_queryoptimizer_logical_CreateTable
                       quickstep_queryoptimizer_logical_DeleteTuples
diff --git a/query_optimizer/logical/CopyFrom.cpp b/query_optimizer/logical/CopyFrom.cpp
index b0a1423..a80c701 100644
--- a/query_optimizer/logical/CopyFrom.cpp
+++ b/query_optimizer/logical/CopyFrom.cpp
@@ -44,11 +44,11 @@
   inline_field_values->push_back(file_name_);
 
   inline_field_names->push_back("column_delimiter");
-  inline_field_values->push_back("\"" + EscapeSpecialChars(std::string(1, column_delimiter_)) +
-                                 "\"");
+  inline_field_values->push_back(
+      "\"" + EscapeSpecialChars(std::string(1, options_->getDelimiter())) + "\"");
 
   inline_field_names->push_back("escape_strings");
-  inline_field_values->push_back(escape_strings_ ? "true" : "false");
+  inline_field_values->push_back(options_->escapeStrings() ? "true" : "false");
 }
 
 }  // namespace logical
diff --git a/query_optimizer/logical/CopyFrom.hpp b/query_optimizer/logical/CopyFrom.hpp
index 7c5907f..6b130a6 100644
--- a/query_optimizer/logical/CopyFrom.hpp
+++ b/query_optimizer/logical/CopyFrom.hpp
@@ -17,8 +17,8 @@
  * under the License.
  **/
 
-#ifndef QUICKSTEP_QUERY_OPTIMIZER_LOGICAL_COPYFROM_HPP_
-#define QUICKSTEP_QUERY_OPTIMIZER_LOGICAL_COPYFROM_HPP_
+#ifndef QUICKSTEP_QUERY_OPTIMIZER_LOGICAL_COPY_FROM_HPP_
+#define QUICKSTEP_QUERY_OPTIMIZER_LOGICAL_COPY_FROM_HPP_
 
 #include <memory>
 #include <string>
@@ -28,6 +28,7 @@
 #include "query_optimizer/expressions/AttributeReference.hpp"
 #include "query_optimizer/logical/Logical.hpp"
 #include "query_optimizer/logical/LogicalType.hpp"
+#include "utility/BulkIoConfiguration.hpp"
 #include "utility/Macros.hpp"
 
 #include "glog/logging.h"
@@ -66,20 +67,14 @@
   const std::string& file_name() const { return file_name_; }
 
   /**
-   * @return The delimiter used in the text file to separate columns.
+   * @return The options for this COPY FROM statement.
    */
-  const char column_delimiter() const { return column_delimiter_; }
-
-  /**
-   * @return Whether to decode escape sequences in the text file.
-   */
-  bool escape_strings() const { return escape_strings_; }
+  const BulkIoConfigurationPtr& options() const { return options_; }
 
   LogicalPtr copyWithNewChildren(
       const std::vector<LogicalPtr> &new_children) const override {
     DCHECK(new_children.empty());
-    return Create(catalog_relation_, file_name_, column_delimiter_,
-                  escape_strings_);
+    return Create(catalog_relation_, file_name_, options_);
   }
 
   std::vector<expressions::AttributeReferencePtr> getOutputAttributes() const override {
@@ -95,19 +90,13 @@
    *
    * @param catalog_relation The catalog relation to insert the tuples to.
    * @param file_name The name of the file to read the data from.
-   * @param column_delimiter The delimiter used in the text file to separate
-   *                         columns.
-   * @param escape_strings Whether to decode escape sequences in the text file.
+   * @param options The options for this COPY FROM statement.
    * @return An immutable CopyFrom logical node.
    */
   static CopyFromPtr Create(const CatalogRelation *catalog_relation,
                             const std::string &file_name,
-                            const char column_delimiter,
-                            bool escape_strings) {
-    return CopyFromPtr(new CopyFrom(catalog_relation,
-                                    file_name,
-                                    column_delimiter,
-                                    escape_strings));
+                            const BulkIoConfigurationPtr &options) {
+    return CopyFromPtr(new CopyFrom(catalog_relation, file_name, options));
   }
 
  protected:
@@ -122,18 +111,14 @@
  private:
   CopyFrom(const CatalogRelation *catalog_relation,
            const std::string &file_name,
-           const char column_delimiter,
-           bool escape_strings)
+           const BulkIoConfigurationPtr &options)
       : catalog_relation_(catalog_relation),
         file_name_(file_name),
-        column_delimiter_(column_delimiter),
-        escape_strings_(escape_strings) {}
+        options_(options) {}
 
   const CatalogRelation *catalog_relation_;
-  std::string file_name_;
-
-  const char column_delimiter_;
-  const bool escape_strings_;
+  const std::string file_name_;
+  const BulkIoConfigurationPtr options_;
 
   DISALLOW_COPY_AND_ASSIGN(CopyFrom);
 };
@@ -144,4 +129,4 @@
 }  // namespace optimizer
 }  // namespace quickstep
 
-#endif /* QUICKSTEP_QUERY_OPTIMIZER_LOGICAL_COPYFROM_HPP_ */
+#endif  // QUICKSTEP_QUERY_OPTIMIZER_LOGICAL_COPY_FROM_HPP_
diff --git a/query_optimizer/logical/CopyTo.cpp b/query_optimizer/logical/CopyTo.cpp
new file mode 100644
index 0000000..369f732
--- /dev/null
+++ b/query_optimizer/logical/CopyTo.cpp
@@ -0,0 +1,75 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ **/
+
+#include "query_optimizer/logical/CopyTo.hpp"
+
+#include <string>
+#include <vector>
+
+#include "query_optimizer/OptimizerTree.hpp"
+#include "utility/StringUtil.hpp"
+
+namespace quickstep {
+namespace optimizer {
+namespace logical {
+
+void CopyTo::getFieldStringItems(
+    std::vector<std::string> *inline_field_names,
+    std::vector<std::string> *inline_field_values,
+    std::vector<std::string> *non_container_child_field_names,
+    std::vector<OptimizerTreeBaseNodePtr> *non_container_child_fields,
+    std::vector<std::string> *container_child_field_names,
+    std::vector<std::vector<OptimizerTreeBaseNodePtr>> *container_child_fields) const {
+  inline_field_names->push_back("file_name");
+  inline_field_values->push_back(file_name_);
+
+  non_container_child_field_names->push_back("input");
+  non_container_child_fields->push_back(input_);
+
+  inline_field_names->push_back("format");
+  inline_field_values->push_back(options_->getFormatName());
+
+  inline_field_names->push_back("column_delimiter");
+  inline_field_values->push_back(
+      "\"" + EscapeSpecialChars(std::string(1, options_->getDelimiter())) + "\"");
+
+  if (options_->escapeStrings()) {
+    inline_field_names->push_back("escape_strings");
+    inline_field_values->push_back("true");
+  }
+
+  if (options_->hasHeader()) {
+    inline_field_names->push_back("header");
+    inline_field_values->push_back("true");
+  }
+
+  if (options_->getQuoteCharacter() != 0) {
+    inline_field_names->push_back("quote");
+    inline_field_values->push_back(std::string(1, options_->getQuoteCharacter()));
+  }
+
+  if (options_->getNullString() != "") {
+    inline_field_names->push_back("null_string");
+    inline_field_values->push_back(options_->getNullString());
+  }
+}
+
+}  // namespace logical
+}  // namespace optimizer
+}  // namespace quickstep
diff --git a/query_optimizer/logical/CopyTo.hpp b/query_optimizer/logical/CopyTo.hpp
new file mode 100644
index 0000000..33060a6
--- /dev/null
+++ b/query_optimizer/logical/CopyTo.hpp
@@ -0,0 +1,141 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ **/
+
+#ifndef QUICKSTEP_QUERY_OPTIMIZER_LOGICAL_COPY_TO_HPP_
+#define QUICKSTEP_QUERY_OPTIMIZER_LOGICAL_COPY_TO_HPP_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "query_optimizer/OptimizerTree.hpp"
+#include "query_optimizer/expressions/AttributeReference.hpp"
+#include "query_optimizer/logical/Logical.hpp"
+#include "query_optimizer/logical/LogicalType.hpp"
+#include "utility/BulkIoConfiguration.hpp"
+#include "utility/Macros.hpp"
+
+#include "glog/logging.h"
+
+namespace quickstep {
+namespace optimizer {
+namespace logical {
+
+/** \addtogroup OptimizerLogical
+ *  @{
+ */
+
+class CopyTo;
+typedef std::shared_ptr<const CopyTo> CopyToPtr;
+
+/**
+ * @brief Represents an operation that copies data from a relation to a text file.
+ */
+class CopyTo : public Logical {
+ public:
+  LogicalType getLogicalType() const override {
+    return LogicalType::kCopyTo;
+  }
+
+  std::string getName() const override {
+    return "CopyTo";
+  }
+
+  /**
+   * @return The input relation whose data is to be exported.
+   */
+  const LogicalPtr& input() const {
+    return input_;
+  }
+
+  /**
+   * @return The name of the file to write the data to.
+   */
+  const std::string& file_name() const {
+    return file_name_;
+  }
+
+  /**
+   * @return The options for this COPY TO statement.
+   */
+  const BulkIoConfigurationPtr& options() const {
+    return options_;
+  }
+
+  LogicalPtr copyWithNewChildren(
+      const std::vector<LogicalPtr> &new_children) const override {
+    DCHECK_EQ(1u, new_children.size());
+    return Create(new_children.front(), file_name_, options_);
+  }
+
+  std::vector<expressions::AttributeReferencePtr> getOutputAttributes() const override {
+    return {};
+  }
+
+  std::vector<expressions::AttributeReferencePtr> getReferencedAttributes() const override {
+    return input_->getOutputAttributes();
+  }
+
+  /**
+   * @brief Creates a CopyTo logical node.
+   *
+   * @param input The input relation whose data is to be exported.
+   * @param file_name The name of the file to write the data to.
+   * @param options The options for this COPY TO statement.
+   * @return An immutable CopyTo logical node.
+   */
+  static CopyToPtr Create(const LogicalPtr &input,
+                          const std::string &file_name,
+                          const BulkIoConfigurationPtr &options) {
+    return CopyToPtr(new CopyTo(input, file_name, options));
+  }
+
+ protected:
+  void getFieldStringItems(
+      std::vector<std::string> *inline_field_names,
+      std::vector<std::string> *inline_field_values,
+      std::vector<std::string> *non_container_child_field_names,
+      std::vector<OptimizerTreeBaseNodePtr> *non_container_child_fields,
+      std::vector<std::string> *container_child_field_names,
+      std::vector<std::vector<OptimizerTreeBaseNodePtr>> *container_child_fields) const override;
+
+ private:
+  CopyTo(const LogicalPtr &input,
+         const std::string &file_name,
+         const BulkIoConfigurationPtr &options)
+      : input_(input),
+        file_name_(file_name),
+        options_(options) {
+    addChild(input);
+  }
+
+  const LogicalPtr input_;
+  const std::string file_name_;
+  const BulkIoConfigurationPtr options_;
+
+  DISALLOW_COPY_AND_ASSIGN(CopyTo);
+};
+
+/** @} */
+
+}  // namespace logical
+}  // namespace optimizer
+}  // namespace quickstep
+
+#endif  // QUICKSTEP_QUERY_OPTIMIZER_LOGICAL_COPY_TO_HPP_
diff --git a/query_optimizer/logical/LogicalType.hpp b/query_optimizer/logical/LogicalType.hpp
index 21ffdca..d8b85dd 100644
--- a/query_optimizer/logical/LogicalType.hpp
+++ b/query_optimizer/logical/LogicalType.hpp
@@ -32,8 +32,9 @@
  * @brief Optimizer logical node types.
  **/
 enum class LogicalType {
-  kAggregate,
+  kAggregate = 0,
   kCopyFrom,
+  kCopyTo,
   kCreateIndex,
   kCreateTable,
   kDeleteTuples,
diff --git a/query_optimizer/physical/CMakeLists.txt b/query_optimizer/physical/CMakeLists.txt
index e510f6b..a1a72f7 100644
--- a/query_optimizer/physical/CMakeLists.txt
+++ b/query_optimizer/physical/CMakeLists.txt
@@ -19,6 +19,7 @@
 add_library(quickstep_queryoptimizer_physical_Aggregate Aggregate.cpp Aggregate.hpp)
 add_library(quickstep_queryoptimizer_physical_BinaryJoin BinaryJoin.cpp BinaryJoin.hpp)
 add_library(quickstep_queryoptimizer_physical_CopyFrom CopyFrom.cpp CopyFrom.hpp)
+add_library(quickstep_queryoptimizer_physical_CopyTo CopyTo.cpp CopyTo.hpp)
 add_library(quickstep_queryoptimizer_physical_CreateIndex CreateIndex.cpp CreateIndex.hpp)
 add_library(quickstep_queryoptimizer_physical_CreateTable CreateTable.cpp CreateTable.hpp)
 add_library(quickstep_queryoptimizer_physical_CrossReferenceCoalesceAggregate
@@ -81,7 +82,18 @@
                       quickstep_queryoptimizer_expressions_NamedExpression
                       quickstep_queryoptimizer_physical_Physical
                       quickstep_queryoptimizer_physical_PhysicalType
-                      quickstep_utility_Macros)
+                      quickstep_utility_BulkIoConfiguration
+                      quickstep_utility_Macros
+                      quickstep_utility_StringUtil)
+target_link_libraries(quickstep_queryoptimizer_physical_CopyTo
+                      glog
+                      quickstep_queryoptimizer_OptimizerTree
+                      quickstep_queryoptimizer_expressions_AttributeReference
+                      quickstep_queryoptimizer_physical_Physical
+                      quickstep_queryoptimizer_physical_PhysicalType
+                      quickstep_utility_BulkIoConfiguration
+                      quickstep_utility_Macros
+                      quickstep_utility_StringUtil)
 target_link_libraries(quickstep_queryoptimizer_physical_CreateIndex
                       glog
                       quickstep_queryoptimizer_OptimizerTree
@@ -327,6 +339,7 @@
                       quickstep_queryoptimizer_physical_Aggregate
                       quickstep_queryoptimizer_physical_BinaryJoin
                       quickstep_queryoptimizer_physical_CopyFrom
+                      quickstep_queryoptimizer_physical_CopyTo
                       quickstep_queryoptimizer_physical_CreateIndex
                       quickstep_queryoptimizer_physical_CreateTable
                       quickstep_queryoptimizer_physical_CrossReferenceCoalesceAggregate
diff --git a/query_optimizer/physical/CopyFrom.cpp b/query_optimizer/physical/CopyFrom.cpp
index 8448d4e..65279fe 100644
--- a/query_optimizer/physical/CopyFrom.cpp
+++ b/query_optimizer/physical/CopyFrom.cpp
@@ -24,6 +24,7 @@
 
 #include "catalog/CatalogRelation.hpp"
 #include "query_optimizer/OptimizerTree.hpp"
+#include "utility/StringUtil.hpp"
 
 namespace quickstep {
 namespace optimizer {
@@ -43,10 +44,11 @@
   inline_field_values->push_back(file_name_);
 
   inline_field_names->push_back("column_delimiter");
-  inline_field_values->push_back(std::string(1, column_delimiter_));
+  inline_field_values->push_back(
+      "\"" + EscapeSpecialChars(std::string(1, options_->getDelimiter())) + "\"");
 
   inline_field_names->push_back("escape_strings");
-  inline_field_values->push_back(escape_strings_ ? "true" : "false");
+  inline_field_values->push_back(options_->escapeStrings() ? "true" : "false");
 }
 
 }  // namespace physical
diff --git a/query_optimizer/physical/CopyFrom.hpp b/query_optimizer/physical/CopyFrom.hpp
index ecbf318..c9bbcdf 100644
--- a/query_optimizer/physical/CopyFrom.hpp
+++ b/query_optimizer/physical/CopyFrom.hpp
@@ -17,8 +17,8 @@
  * under the License.
  **/
 
-#ifndef QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_COPYFROM_HPP_
-#define QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_COPYFROM_HPP_
+#ifndef QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_COPY_FROM_HPP_
+#define QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_COPY_FROM_HPP_
 
 #include <memory>
 #include <string>
@@ -30,6 +30,7 @@
 #include "query_optimizer/expressions/NamedExpression.hpp"
 #include "query_optimizer/physical/Physical.hpp"
 #include "query_optimizer/physical/PhysicalType.hpp"
+#include "utility/BulkIoConfiguration.hpp"
 #include "utility/Macros.hpp"
 
 #include "glog/logging.h"
@@ -68,22 +69,14 @@
   const std::string& file_name() const { return file_name_; }
 
   /**
-   * @return The delimiter used in the text file to separate columns.
+   * @return The options for this COPY FROM statement.
    */
-  const char column_delimiter() const { return column_delimiter_; }
-
-  /**
-   * @return Whether to decode escape sequences in the text file.
-   */
-  bool escape_strings() const { return escape_strings_; }
+  const BulkIoConfigurationPtr& options() const { return options_; }
 
   PhysicalPtr copyWithNewChildren(
       const std::vector<PhysicalPtr> &new_children) const override {
     DCHECK(new_children.empty());
-    return Create(catalog_relation_,
-                  file_name_,
-                  column_delimiter_,
-                  escape_strings_);
+    return Create(catalog_relation_, file_name_, options_);
   }
 
   std::vector<expressions::AttributeReferencePtr> getOutputAttributes() const override {
@@ -112,12 +105,8 @@
    */
   static CopyFromPtr Create(const CatalogRelation *catalog_relation,
                             const std::string &file_name,
-                            const char &column_delimiter,
-                            bool escape_strings) {
-    return CopyFromPtr(new CopyFrom(catalog_relation,
-                                    file_name,
-                                    column_delimiter,
-                                    escape_strings));
+                            const BulkIoConfigurationPtr &options) {
+    return CopyFromPtr(new CopyFrom(catalog_relation, file_name, options));
   }
 
  protected:
@@ -132,18 +121,14 @@
  private:
   CopyFrom(const CatalogRelation *catalog_relation,
            const std::string &file_name,
-           const char column_delimiter,
-           bool escape_strings)
+           const BulkIoConfigurationPtr &options)
       : catalog_relation_(catalog_relation),
         file_name_(file_name),
-        column_delimiter_(column_delimiter),
-        escape_strings_(escape_strings) {}
+        options_(options) {}
 
   const CatalogRelation *catalog_relation_;
-  std::string file_name_;
-
-  const char column_delimiter_;
-  const bool escape_strings_;
+  const std::string file_name_;
+  const BulkIoConfigurationPtr options_;
 
   DISALLOW_COPY_AND_ASSIGN(CopyFrom);
 };
@@ -154,4 +139,4 @@
 }  // namespace optimizer
 }  // namespace quickstep
 
-#endif /* QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_COPYFROM_HPP_ */
+#endif  // QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_COPY_FROM_HPP_
diff --git a/query_optimizer/physical/CopyTo.cpp b/query_optimizer/physical/CopyTo.cpp
new file mode 100644
index 0000000..9cd954e
--- /dev/null
+++ b/query_optimizer/physical/CopyTo.cpp
@@ -0,0 +1,75 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ **/
+
+#include "query_optimizer/physical/CopyTo.hpp"
+
+#include <string>
+#include <vector>
+
+#include "query_optimizer/OptimizerTree.hpp"
+#include "utility/StringUtil.hpp"
+
+namespace quickstep {
+namespace optimizer {
+namespace physical {
+
+void CopyTo::getFieldStringItems(
+    std::vector<std::string> *inline_field_names,
+    std::vector<std::string> *inline_field_values,
+    std::vector<std::string> *non_container_child_field_names,
+    std::vector<OptimizerTreeBaseNodePtr> *non_container_child_fields,
+    std::vector<std::string> *container_child_field_names,
+    std::vector<std::vector<OptimizerTreeBaseNodePtr>> *container_child_fields) const {
+  inline_field_names->push_back("file_name");
+  inline_field_values->push_back(file_name_);
+
+  non_container_child_field_names->push_back("input");
+  non_container_child_fields->push_back(input_);
+
+  inline_field_names->push_back("format");
+  inline_field_values->push_back(options_->getFormatName());
+
+  inline_field_names->push_back("column_delimiter");
+  inline_field_values->push_back(
+      "\"" + EscapeSpecialChars(std::string(1, options_->getDelimiter())) + "\"");
+
+  if (options_->escapeStrings()) {
+    inline_field_names->push_back("escape_strings");
+    inline_field_values->push_back("true");
+  }
+
+  if (options_->hasHeader()) {
+    inline_field_names->push_back("header");
+    inline_field_values->push_back("true");
+  }
+
+  if (options_->getQuoteCharacter() != 0) {
+    inline_field_names->push_back("quote");
+    inline_field_values->push_back(std::string(1, options_->getQuoteCharacter()));
+  }
+
+  if (options_->getNullString() != "") {
+    inline_field_names->push_back("null_string");
+    inline_field_values->push_back(options_->getNullString());
+  }
+}
+
+}  // namespace physical
+}  // namespace optimizer
+}  // namespace quickstep
diff --git a/query_optimizer/physical/CopyTo.hpp b/query_optimizer/physical/CopyTo.hpp
new file mode 100644
index 0000000..004d4f8
--- /dev/null
+++ b/query_optimizer/physical/CopyTo.hpp
@@ -0,0 +1,147 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ **/
+
+#ifndef QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_COPY_TO_HPP_
+#define QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_COPY_TO_HPP_
+
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "query_optimizer/OptimizerTree.hpp"
+#include "query_optimizer/expressions/AttributeReference.hpp"
+#include "query_optimizer/physical/Physical.hpp"
+#include "query_optimizer/physical/PhysicalType.hpp"
+#include "utility/BulkIoConfiguration.hpp"
+#include "utility/Macros.hpp"
+
+#include "glog/logging.h"
+
+namespace quickstep {
+namespace optimizer {
+namespace physical {
+
+/** \addtogroup OptimizerPhysical
+ *  @{
+ */
+
+class CopyTo;
+typedef std::shared_ptr<const CopyTo> CopyToPtr;
+
+/**
+ * @brief Represents an operation that copies data from a relation to a text file.
+ */
+class CopyTo : public Physical {
+ public:
+  PhysicalType getPhysicalType() const override {
+    return PhysicalType::kCopyTo;
+  }
+
+  std::string getName() const override {
+    return "CopyTo";
+  }
+
+  /**
+   * @return The input relation whose data is to be exported.
+   */
+  const PhysicalPtr& input() const {
+    return input_;
+  }
+
+  /**
+   * @return The name of the file to write the data to.
+   */
+  const std::string& file_name() const {
+    return file_name_;
+  }
+
+  /**
+   * @return The options for this COPY TO statement.
+   */
+  const BulkIoConfigurationPtr& options() const {
+    return options_;
+  }
+
+  PhysicalPtr copyWithNewChildren(
+      const std::vector<PhysicalPtr> &new_children) const override {
+    DCHECK_EQ(1u, new_children.size());
+    return Create(new_children.front(), file_name_, options_);
+  }
+
+  std::vector<expressions::AttributeReferencePtr> getOutputAttributes() const override {
+    return {};
+  }
+
+  std::vector<expressions::AttributeReferencePtr> getReferencedAttributes() const override {
+    return input_->getOutputAttributes();
+  }
+
+  bool maybeCopyWithPrunedExpressions(
+      const expressions::UnorderedNamedExpressionSet &referenced_expressions,
+      PhysicalPtr *output) const override {
+    return false;
+  }
+
+  /**
+   * @brief Creates a CopyTo physical node.
+   *
+   * @param input The input relation whose data is to be exported.
+   * @param file_name The name of the file to write the data to.
+   * @param options The options for this COPY TO statement.
+   * @return An immutable CopyTo physical node.
+   */
+  static CopyToPtr Create(const PhysicalPtr &input,
+                          const std::string &file_name,
+                          const BulkIoConfigurationPtr &options) {
+    return CopyToPtr(new CopyTo(input, file_name, options));
+  }
+
+ protected:
+  void getFieldStringItems(
+      std::vector<std::string> *inline_field_names,
+      std::vector<std::string> *inline_field_values,
+      std::vector<std::string> *non_container_child_field_names,
+      std::vector<OptimizerTreeBaseNodePtr> *non_container_child_fields,
+      std::vector<std::string> *container_child_field_names,
+      std::vector<std::vector<OptimizerTreeBaseNodePtr>> *container_child_fields) const override;
+
+ private:
+  CopyTo(const PhysicalPtr &input,
+         const std::string &file_name,
+         const BulkIoConfigurationPtr &options)
+      : input_(input),
+        file_name_(file_name),
+        options_(options) {
+    addChild(input);
+  }
+
+  const PhysicalPtr input_;
+  const std::string file_name_;
+  const BulkIoConfigurationPtr options_;
+
+  DISALLOW_COPY_AND_ASSIGN(CopyTo);
+};
+
+/** @} */
+
+}  // namespace physical
+}  // namespace optimizer
+}  // namespace quickstep
+
+#endif  // QUICKSTEP_QUERY_OPTIMIZER_PHYSICAL_COPY_TO_HPP_
diff --git a/query_optimizer/physical/PhysicalType.hpp b/query_optimizer/physical/PhysicalType.hpp
index 47db7ec..0a965af 100644
--- a/query_optimizer/physical/PhysicalType.hpp
+++ b/query_optimizer/physical/PhysicalType.hpp
@@ -32,8 +32,9 @@
  * @brief Optimizer physical node types.
  **/
 enum class PhysicalType {
-  kAggregate,
+  kAggregate = 0,
   kCopyFrom,
+  kCopyTo,
   kCreateIndex,
   kCreateTable,
   kCrossReferenceCoalesceAggregate,
diff --git a/query_optimizer/resolver/CMakeLists.txt b/query_optimizer/resolver/CMakeLists.txt
index 4e364a6..6feb1e8 100644
--- a/query_optimizer/resolver/CMakeLists.txt
+++ b/query_optimizer/resolver/CMakeLists.txt
@@ -97,6 +97,7 @@
                       quickstep_queryoptimizer_expressions_WindowAggregateFunction
                       quickstep_queryoptimizer_logical_Aggregate
                       quickstep_queryoptimizer_logical_CopyFrom
+                      quickstep_queryoptimizer_logical_CopyTo
                       quickstep_queryoptimizer_logical_CreateIndex
                       quickstep_queryoptimizer_logical_CreateTable
                       quickstep_queryoptimizer_logical_DeleteTuples
@@ -131,6 +132,7 @@
                       quickstep_types_operations_unaryoperations_DateExtractOperation
                       quickstep_types_operations_unaryoperations_SubstringOperation
                       quickstep_types_operations_unaryoperations_UnaryOperation
+                      quickstep_utility_BulkIoConfiguration
                       quickstep_utility_Macros
                       quickstep_utility_PtrList
                       quickstep_utility_PtrVector
diff --git a/query_optimizer/resolver/Resolver.cpp b/query_optimizer/resolver/Resolver.cpp
index 0f65255..935e235 100644
--- a/query_optimizer/resolver/Resolver.cpp
+++ b/query_optimizer/resolver/Resolver.cpp
@@ -93,6 +93,7 @@
 #include "query_optimizer/expressions/WindowAggregateFunction.hpp"
 #include "query_optimizer/logical/Aggregate.hpp"
 #include "query_optimizer/logical/CopyFrom.hpp"
+#include "query_optimizer/logical/CopyTo.hpp"
 #include "query_optimizer/logical/CreateIndex.hpp"
 #include "query_optimizer/logical/CreateTable.hpp"
 #include "query_optimizer/logical/DeleteTuples.hpp"
@@ -126,6 +127,7 @@
 #include "types/operations/unary_operations/DateExtractOperation.hpp"
 #include "types/operations/unary_operations/SubstringOperation.hpp"
 #include "types/operations/unary_operations/UnaryOperation.hpp"
+#include "utility/BulkIoConfiguration.hpp"
 #include "utility/PtrList.hpp"
 #include "utility/PtrVector.hpp"
 #include "utility/SqlError.hpp"
@@ -143,6 +145,45 @@
 namespace L = ::quickstep::optimizer::logical;
 namespace S = ::quickstep::serialization;
 
+namespace {
+
+attribute_id GetAttributeIdFromName(
+    const PtrList<ParseAttributeDefinition> &attribute_definition_list,
+    const std::string &attribute_name) {
+  const std::string lower_attribute_name = ToLower(attribute_name);
+
+  attribute_id attr_id = 0;
+  for (const ParseAttributeDefinition &attribute_definition : attribute_definition_list) {
+    if (lower_attribute_name == ToLower(attribute_definition.name()->value())) {
+      return attr_id;
+    }
+
+    ++attr_id;
+  }
+
+  return kInvalidAttributeID;
+}
+
+const ParseString* GetKeyValueString(const ParseKeyValue &key_value) {
+  if (key_value.getKeyValueType() != ParseKeyValue::kStringString) {
+      THROW_SQL_ERROR_AT(&key_value)
+          << "Invalid value type for " << key_value.key()->value()
+          << ", expected a string.";
+  }
+  return static_cast<const ParseKeyStringValue&>(key_value).value();
+}
+
+bool GetKeyValueBool(const ParseKeyValue &key_value) {
+  if (key_value.getKeyValueType() != ParseKeyValue::kStringBool) {
+      THROW_SQL_ERROR_AT(&key_value)
+          << "Invalid value for " << key_value.key()->value()
+          << ", expected true or false.";
+  }
+  return static_cast<const ParseKeyBoolValue&>(key_value).value();
+}
+
+}  // namespace
+
 struct Resolver::ExpressionResolutionInfo {
   /**
    * @brief Constructs an ExpressionResolutionInfo that disallows aggregate
@@ -316,11 +357,25 @@
 
 L::LogicalPtr Resolver::resolve(const ParseStatement &parse_query) {
   switch (parse_query.getStatementType()) {
-    case ParseStatement::kCopyFrom:
-      context_->set_is_catalog_changed();
-      logical_plan_ = resolveCopyFrom(
-          static_cast<const ParseStatementCopyFrom&>(parse_query));
+    case ParseStatement::kCopy: {
+      const ParseStatementCopy &copy_statemnt =
+          static_cast<const ParseStatementCopy&>(parse_query);
+      if (copy_statemnt.getCopyDirection() == ParseStatementCopy::kFrom) {
+        context_->set_is_catalog_changed();
+        logical_plan_ = resolveCopyFrom(copy_statemnt);
+      } else {
+        DCHECK(copy_statemnt.getCopyDirection() == ParseStatementCopy::kTo);
+        if (copy_statemnt.with_clause() != nullptr) {
+          resolveWithClause(*copy_statemnt.with_clause());
+        }
+        logical_plan_ = resolveCopyTo(copy_statemnt);
+
+        if (copy_statemnt.with_clause() != nullptr) {
+          reportIfWithClauseUnused(*copy_statemnt.with_clause());
+        }
+      }
       break;
+    }
     case ParseStatement::kCreateTable:
       context_->set_is_catalog_changed();
       logical_plan_ = resolveCreateTable(
@@ -359,16 +414,7 @@
         logical_plan_ = resolveInsertSelection(insert_selection_statement);
 
         if (insert_selection_statement.with_clause() != nullptr) {
-          // Report an error if there is a WITH query that is not actually used.
-          if (!with_queries_info_.unreferenced_query_indexes.empty()) {
-            int unreferenced_with_query_index = *with_queries_info_.unreferenced_query_indexes.begin();
-            const ParseSubqueryTableReference &unreferenced_with_query =
-                (*insert_selection_statement.with_clause())[unreferenced_with_query_index];
-            THROW_SQL_ERROR_AT(&unreferenced_with_query)
-                << "WITH query "
-                << unreferenced_with_query.table_reference_signature()->table_alias()->value()
-                << " is defined but not used";
-          }
+          reportIfWithClauseUnused(*insert_selection_statement.with_clause());
         }
       }
       break;
@@ -385,16 +431,7 @@
                               nullptr /* type_hints */,
                               nullptr /* parent_resolver */);
       if (set_operation_statement.with_clause() != nullptr) {
-        // Report an error if there is a WITH query that is not actually used.
-        if (!with_queries_info_.unreferenced_query_indexes.empty()) {
-          int unreferenced_with_query_index = *with_queries_info_.unreferenced_query_indexes.begin();
-          const ParseSubqueryTableReference &unreferenced_with_query =
-              (*set_operation_statement.with_clause())[unreferenced_with_query_index];
-          THROW_SQL_ERROR_AT(&unreferenced_with_query)
-              << "WITH query "
-              << unreferenced_with_query.table_reference_signature()->table_alias()->value()
-              << " is defined but not used";
-        }
+        reportIfWithClauseUnused(*set_operation_statement.with_clause());
       }
       break;
     }
@@ -418,27 +455,156 @@
 }
 
 L::LogicalPtr Resolver::resolveCopyFrom(
-    const ParseStatementCopyFrom &copy_from_statement) {
-  // Default parameters.
-  std::string column_delimiter_ = "\t";
-  bool escape_strings_ = true;
+    const ParseStatementCopy &copy_from_statement) {
+  DCHECK(copy_from_statement.getCopyDirection() == ParseStatementCopy::kFrom);
+  const PtrList<ParseKeyValue> *params = copy_from_statement.params();
 
-  const ParseCopyFromParams *params = copy_from_statement.params();
+  BulkIoFormat file_format = BulkIoFormat::kText;
   if (params != nullptr) {
-    if (params->delimiter != nullptr) {
-      column_delimiter_ = params->delimiter->value();
-      if (column_delimiter_.size() != 1) {
-        THROW_SQL_ERROR_AT(params->delimiter)
-            << "DELIMITER is not a single character";
+    for (const ParseKeyValue &param : *params) {
+      const std::string &key = ToLower(param.key()->value());
+      if (key == "format") {
+        const ParseString *parse_format = GetKeyValueString(param);
+        const std::string format = ToLower(parse_format->value());
+        // TODO(jianqiao): Support other bulk load formats such as CSV.
+        if (format != "text") {
+          THROW_SQL_ERROR_AT(parse_format) << "Unsupported file format: " << format;
+        }
+        // Update file_format when other formats get supported.
+        break;
       }
     }
-    escape_strings_ = params->escape_strings;
+  }
+
+  std::unique_ptr<BulkIoConfiguration> options =
+      std::make_unique<BulkIoConfiguration>(file_format);
+  if (params != nullptr) {
+    for (const ParseKeyValue &param : *params) {
+      const std::string key = ToLower(param.key()->value());
+      if (key == "delimiter") {
+        const ParseString *parse_delimiter = GetKeyValueString(param);
+        const std::string &delimiter = parse_delimiter->value();
+        if (delimiter.size() != 1u) {
+          THROW_SQL_ERROR_AT(parse_delimiter)
+              << "DELIMITER is not a single character";
+        }
+        options->setDelimiter(delimiter.front());
+      } else if (key == "escape_strings") {
+        options->setEscapeStrings(GetKeyValueBool(param));
+      } else if (key != "format") {
+        THROW_SQL_ERROR_AT(&param) << "Unsupported copy option: " << key;
+      }
+    }
   }
 
   return L::CopyFrom::Create(resolveRelationName(copy_from_statement.relation_name()),
-                             copy_from_statement.source_filename()->value(),
-                             column_delimiter_[0],
-                             escape_strings_);
+                             copy_from_statement.file_name()->value(),
+                             BulkIoConfigurationPtr(options.release()));
+}
+
+L::LogicalPtr Resolver::resolveCopyTo(
+    const ParseStatementCopy &copy_to_statement) {
+  DCHECK(copy_to_statement.getCopyDirection() == ParseStatementCopy::kTo);
+  const PtrList<ParseKeyValue> *params = copy_to_statement.params();
+
+  // Check if copy format is explicitly specified.
+  BulkIoFormat file_format = BulkIoFormat::kText;
+  bool format_specified = false;
+  if (params != nullptr) {
+    for (const ParseKeyValue &param : *params) {
+      const std::string &key = ToLower(param.key()->value());
+      if (key == "format") {
+        const ParseString *parse_format = GetKeyValueString(param);
+        const std::string format = ToLower(parse_format->value());
+        if (format == "csv") {
+          file_format = BulkIoFormat::kCsv;
+        } else if (format == "text") {
+          file_format = BulkIoFormat::kText;
+        } else {
+          THROW_SQL_ERROR_AT(parse_format) << "Unsupported file format: " << format;
+        }
+        format_specified = true;
+        break;
+      }
+    }
+  }
+
+  const std::string &file_name = copy_to_statement.file_name()->value();
+  if (file_name.length() <= 1u) {
+    THROW_SQL_ERROR_AT(copy_to_statement.file_name())
+        << "File name can not be empty";
+  }
+
+  // Infer copy format from file name extension.
+  if (!format_specified) {
+    if (file_name.length() > 4u) {
+      if (ToLower(file_name.substr(file_name.length() - 4)) == ".csv") {
+        file_format = BulkIoFormat::kCsv;
+      }
+    }
+  }
+
+  // Resolve the copy options.
+  std::unique_ptr<BulkIoConfiguration> options =
+      std::make_unique<BulkIoConfiguration>(file_format);
+  if (params != nullptr) {
+    for (const ParseKeyValue &param : *params) {
+      const std::string key = ToLower(param.key()->value());
+      if (key == "delimiter") {
+        const ParseString *parse_delimiter = GetKeyValueString(param);
+        const std::string &delimiter = parse_delimiter->value();
+        if (delimiter.size() != 1u) {
+          THROW_SQL_ERROR_AT(parse_delimiter)
+              << "DELIMITER is not a single character";
+        }
+        options->setDelimiter(delimiter.front());
+      } else if (file_format == BulkIoFormat::kText && key == "escape_strings") {
+        options->setEscapeStrings(GetKeyValueBool(param));
+      } else if (file_format == BulkIoFormat::kCsv && key == "header") {
+        options->setHeader(GetKeyValueBool(param));
+      } else if (file_format == BulkIoFormat::kCsv && key == "quote") {
+        const ParseString *parse_quote = GetKeyValueString(param);
+        const std::string &quote = parse_quote->value();
+        if (quote.size() != 1u) {
+          THROW_SQL_ERROR_AT(parse_quote)
+              << "QUOTE is not a single character";
+        }
+        options->setQuoteCharacter(quote.front());
+      } else if (key == "null_string") {
+        const ParseString *parse_null_string = GetKeyValueString(param);
+        options->setNullString(parse_null_string->value());
+      } else if (key != "format") {
+        THROW_SQL_ERROR_AT(&param)
+            << "Unsupported copy option \"" << key
+            << "\" for file format " << options->getFormatName();
+      }
+    }
+  }
+
+  // Resolve the source relation.
+  L::LogicalPtr input;
+  if (copy_to_statement.set_operation_query() != nullptr) {
+    input = resolveSetOperation(*copy_to_statement.set_operation_query(),
+                                "" /* set_operation_name */,
+                                nullptr /* type_hints */,
+                                nullptr /* parent_resolver */);
+  } else {
+    const ParseString *relation_name = copy_to_statement.relation_name();
+    DCHECK(relation_name != nullptr);
+    ParseSimpleTableReference table_reference(
+        relation_name->line_number(),
+        relation_name->column_number(),
+        new ParseString(relation_name->line_number(),
+                        relation_name->column_number(),
+                        relation_name->value()),
+        nullptr /* sample */);
+    NameResolver name_resolver;
+    input = resolveTableReference(table_reference, &name_resolver);
+  }
+
+  return L::CopyTo::Create(input,
+                           copy_to_statement.file_name()->value(),
+                           BulkIoConfigurationPtr(options.release()));
 }
 
 L::LogicalPtr Resolver::resolveCreateTable(
@@ -491,26 +657,6 @@
   return L::CreateTable::Create(relation_name, attributes, block_properties, partition_scheme_header_proto);
 }
 
-namespace {
-
-attribute_id GetAttributeIdFromName(const PtrList<ParseAttributeDefinition> &attribute_definition_list,
-                                    const std::string &attribute_name) {
-  const std::string lower_attribute_name = ToLower(attribute_name);
-
-  attribute_id attr_id = 0;
-  for (const ParseAttributeDefinition &attribute_definition : attribute_definition_list) {
-    if (lower_attribute_name == ToLower(attribute_definition.name()->value())) {
-      return attr_id;
-    }
-
-    ++attr_id;
-  }
-
-  return kInvalidAttributeID;
-}
-
-}  // namespace
-
 StorageBlockLayoutDescription* Resolver::resolveBlockProperties(
     const ParseStatementCreateTable &create_table_statement) {
   const ParseBlockProperties *block_properties
@@ -1595,6 +1741,20 @@
   }
 }
 
+void Resolver::reportIfWithClauseUnused(
+    const PtrVector<ParseSubqueryTableReference> &with_list) const {
+  if (!with_queries_info_.unreferenced_query_indexes.empty()) {
+    const int unreferenced_with_query_index =
+        *with_queries_info_.unreferenced_query_indexes.begin();
+    const ParseSubqueryTableReference &unreferenced_with_query =
+        with_list[unreferenced_with_query_index];
+    THROW_SQL_ERROR_AT(&unreferenced_with_query)
+        << "WITH query "
+        << unreferenced_with_query.table_reference_signature()->table_alias()->value()
+        << " is defined but not used";
+  }
+}
+
 void Resolver::validateSelectExpressionsForAggregation(
     const ParseSelectionClause &parse_selection,
     const std::vector<E::NamedExpressionPtr> &select_list_expressions,
diff --git a/query_optimizer/resolver/Resolver.hpp b/query_optimizer/resolver/Resolver.hpp
index 1ae565a..1784782 100644
--- a/query_optimizer/resolver/Resolver.hpp
+++ b/query_optimizer/resolver/Resolver.hpp
@@ -55,7 +55,7 @@
 class ParseSimpleTableReference;
 class ParseSubqueryTableReference;
 class ParseStatement;
-class ParseStatementCopyFrom;
+class ParseStatementCopy;
 class ParseStatementCreateTable;
 class ParseStatementCreateIndex;
 class ParseStatementDelete;
@@ -283,7 +283,16 @@
    * @return A logical plan for the COPY FROM query.
    */
   logical::LogicalPtr resolveCopyFrom(
-      const ParseStatementCopyFrom &copy_from_statement);
+      const ParseStatementCopy &copy_from_statement);
+
+  /**
+   * @brief Resolves a COPY TO query and returns a logical plan.
+   *
+   * @param copy_to_statement The COPY TO parse tree.
+   * @return A logical plan for the COPY TO query.
+   */
+  logical::LogicalPtr resolveCopyTo(
+      const ParseStatementCopy &copy_to_statement);
 
   /**
    * @brief Resolves a UPDATE query and returns a logical plan.
@@ -621,6 +630,14 @@
   static std::string GenerateOrderingAttributeAlias(int index);
 
   /**
+   * @brief Reports an error if there is a WITH query that is not actually used.
+   *
+   * @param with_list The list of subqueries in WITH clause.
+   */
+  void reportIfWithClauseUnused(
+      const PtrVector<ParseSubqueryTableReference> &with_list) const;
+
+  /**
    * @brief Validates each SELECT-list expression to ensure that it does not
    *        reference a named expression with an ID not in \p valid_expr_id_set.
    *
diff --git a/query_optimizer/strategy/CMakeLists.txt b/query_optimizer/strategy/CMakeLists.txt
index e011126..20a4eb4 100644
--- a/query_optimizer/strategy/CMakeLists.txt
+++ b/query_optimizer/strategy/CMakeLists.txt
@@ -76,6 +76,7 @@
                       quickstep_queryoptimizer_expressions_AttributeReference
                       quickstep_queryoptimizer_expressions_ExpressionUtil
                       quickstep_queryoptimizer_logical_CopyFrom
+                      quickstep_queryoptimizer_logical_CopyTo
                       quickstep_queryoptimizer_logical_CreateIndex
                       quickstep_queryoptimizer_logical_CreateTable
                       quickstep_queryoptimizer_logical_DeleteTuples
@@ -95,6 +96,7 @@
                       quickstep_queryoptimizer_logical_WindowAggregate
                       quickstep_queryoptimizer_physical_Aggregate
                       quickstep_queryoptimizer_physical_CopyFrom
+                      quickstep_queryoptimizer_physical_CopyTo
                       quickstep_queryoptimizer_physical_CreateIndex
                       quickstep_queryoptimizer_physical_CreateTable
                       quickstep_queryoptimizer_physical_DeleteTuples
diff --git a/query_optimizer/strategy/OneToOne.cpp b/query_optimizer/strategy/OneToOne.cpp
index af4e150..3cfe013 100644
--- a/query_optimizer/strategy/OneToOne.cpp
+++ b/query_optimizer/strategy/OneToOne.cpp
@@ -27,6 +27,7 @@
 #include "query_optimizer/expressions/AttributeReference.hpp"
 #include "query_optimizer/expressions/ExpressionUtil.hpp"
 #include "query_optimizer/logical/CopyFrom.hpp"
+#include "query_optimizer/logical/CopyTo.hpp"
 #include "query_optimizer/logical/CreateIndex.hpp"
 #include "query_optimizer/logical/CreateTable.hpp"
 #include "query_optimizer/logical/DeleteTuples.hpp"
@@ -45,6 +46,7 @@
 #include "query_optimizer/logical/WindowAggregate.hpp"
 #include "query_optimizer/physical/Aggregate.hpp"
 #include "query_optimizer/physical/CopyFrom.hpp"
+#include "query_optimizer/physical/CopyTo.hpp"
 #include "query_optimizer/physical/CreateIndex.hpp"
 #include "query_optimizer/physical/CreateTable.hpp"
 #include "query_optimizer/physical/DeleteTuples.hpp"
@@ -104,19 +106,28 @@
     case L::LogicalType::kCopyFrom: {
       const L::CopyFromPtr copy_from =
           std::static_pointer_cast<const L::CopyFrom>(logical_input);
-      *physical_output = P::CopyFrom::Create(
-          copy_from->catalog_relation(), copy_from->file_name(),
-          copy_from->column_delimiter(), copy_from->escape_strings());
+      *physical_output = P::CopyFrom::Create(copy_from->catalog_relation(),
+                                             copy_from->file_name(),
+                                             copy_from->options());
+      return true;
+    }
+    case L::LogicalType::kCopyTo: {
+      const L::CopyToPtr copy_to =
+          std::static_pointer_cast<const L::CopyTo>(logical_input);
+      *physical_output = P::CopyTo::Create(
+          physical_mapper_->createOrGetPhysicalFromLogical(copy_to->input()),
+          copy_to->file_name(),
+          copy_to->options());
       return true;
     }
     case L::LogicalType::kCreateIndex: {
       const L::CreateIndexPtr create_index =
           std::static_pointer_cast<const L::CreateIndex>(logical_input);
-      *physical_output = P::CreateIndex::Create(physical_mapper_->createOrGetPhysicalFromLogical(
-                                                                    create_index->input()),
-                                                create_index->index_name(),
-                                                create_index->index_attributes(),
-                                                create_index->index_description());
+      *physical_output = P::CreateIndex::Create(
+          physical_mapper_->createOrGetPhysicalFromLogical(create_index->input()),
+          create_index->index_name(),
+          create_index->index_attributes(),
+          create_index->index_description());
       return true;
     }
     case L::LogicalType::kCreateTable: {
diff --git a/query_optimizer/tests/ExecutionGeneratorTestRunner.cpp b/query_optimizer/tests/ExecutionGeneratorTestRunner.cpp
index ee9bee7..050ef0d 100644
--- a/query_optimizer/tests/ExecutionGeneratorTestRunner.cpp
+++ b/query_optimizer/tests/ExecutionGeneratorTestRunner.cpp
@@ -62,6 +62,9 @@
   MemStream output_stream;
   sql_parser_.feedNextBuffer(new std::string(input));
 
+  // Redirect stderr to output_stream.
+  stderr = output_stream.file();
+
   while (true) {
     ParseResult result = sql_parser_.getNextStatement();
     if (result.condition != ParseResult::kSuccess) {
@@ -71,8 +74,6 @@
       break;
     } else {
       const ParseStatement &parse_statement = *result.parsed_statement;
-      std::printf("%s\n", parse_statement.toString().c_str());
-
       const CatalogRelation *query_result_relation = nullptr;
       try {
         OptimizerContext optimizer_context;
diff --git a/query_optimizer/tests/execution_generator/CMakeLists.txt b/query_optimizer/tests/execution_generator/CMakeLists.txt
index 09a7647..ebcb0b6 100644
--- a/query_optimizer/tests/execution_generator/CMakeLists.txt
+++ b/query_optimizer/tests/execution_generator/CMakeLists.txt
@@ -20,6 +20,11 @@
          "${CMAKE_CURRENT_SOURCE_DIR}/CommonSubexpression.test"
          "${CMAKE_CURRENT_BINARY_DIR}/CommonSubexpression.test"
          "${CMAKE_CURRENT_BINARY_DIR}/CommonSubexpression/")
+add_test(quickstep_queryoptimizer_tests_executiongenerator_copy
+         "../quickstep_queryoptimizer_tests_ExecutionGeneratorTest"
+         "${CMAKE_CURRENT_SOURCE_DIR}/Copy.test"
+         "${CMAKE_CURRENT_BINARY_DIR}/Copy.test"
+         "${CMAKE_CURRENT_BINARY_DIR}/Copy/")
 add_test(quickstep_queryoptimizer_tests_executiongenerator_create
          "../quickstep_queryoptimizer_tests_ExecutionGeneratorTest"
          "${CMAKE_CURRENT_SOURCE_DIR}/Create.test"
@@ -158,6 +163,7 @@
 # Create the folders where the unit tests will store their data blocks for the
 # duration of their test.
 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/CommonSubexpression)
+file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Copy)
 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Create)
 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Delete)
 file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Distinct)
diff --git a/query_optimizer/tests/execution_generator/Copy.test b/query_optimizer/tests/execution_generator/Copy.test
new file mode 100644
index 0000000..fa892c1
--- /dev/null
+++ b/query_optimizer/tests/execution_generator/Copy.test
@@ -0,0 +1,127 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+CREATE TABLE source (
+  int_col INT NULL,
+  date_col DATE NULL,
+  char_col CHAR(16),
+  varchar_col VARCHAR(16)
+);
+
+INSERT INTO source VALUES(1, '2000-01-01', 'aa', 'aaa');
+INSERT INTO source VALUES(2, '2000-02-02', 'bb', 'bbb');
+INSERT INTO source VALUES(3, '2000-03-03', 'cc', 'ccc');
+INSERT INTO source VALUES(4, '2000-04-04', 'aa', 'ddd');
+INSERT INTO source VALUES(5, '2000-05-05', 'bb', 'eee');
+INSERT INTO source VALUES(6, '2000-06-06', 'cc', 'fff');
+
+COPY source TO stderr WITH (DELIMITER '|');
+--
+1|2000-01-01|aa|aaa
+2|2000-02-02|bb|bbb
+3|2000-03-03|cc|ccc
+4|2000-04-04|aa|ddd
+5|2000-05-05|bb|eee
+6|2000-06-06|cc|fff
+==
+
+COPY
+  SELECT char_col, SUM(int_col)
+  FROM source
+  GROUP BY char_col
+TO stderr;
+--
+aa	5
+bb	7
+cc	9
+==
+
+COPY
+  SELECT * FROM (
+    SELECT -int_col * 1000, 'Negative' FROM source
+    UNION ALL
+    SELECT int_col * 1000, 'Positive' FROM source
+  ) AS t(VALUE, SIGN)
+  ORDER BY value
+TO stderr WITH (FORMAT 'CSV', DELIMITER e'\t');
+--
+VALUE	SIGN
+-6000	Negative
+-5000	Negative
+-4000	Negative
+-3000	Negative
+-2000	Negative
+-1000	Negative
+1000	Positive
+2000	Positive
+3000	Positive
+4000	Positive
+5000	Positive
+6000	Positive
+==
+
+# WITH clause.
+WITH r(x, y) AS (
+  SELECT i, i + 1
+  FROM generate_series(0, 9) AS g(i)
+)
+COPY
+  SELECT x * y AS value FROM r ORDER BY value
+TO stderr;
+--
+0
+2
+6
+12
+20
+30
+42
+56
+72
+90
+==
+
+
+# Test handling of NULL values and special characters.
+DELETE FROM source;
+INSERT INTO source VALUES(1, '2000-01-01', 'abc', 'def');
+INSERT INTO source VALUES(2, '2000-02-02', e'a\ta', '|,|');
+INSERT INTO source VALUES(NULL, NULL, e'b\nb', '"""');
+
+COPY source TO stderr;
+--
+1	2000-01-01	abc	def
+2	2000-02-02	a\ta	|,|
+\N	\N	b\nb	"""
+==
+
+COPY source TO stderr WITH (FORMAT 'CSV', HEADER FALSE);
+--
+1,2000-01-01,abc,def
+2,2000-02-02,a	a,"|,|"
+,,"b
+b",""""""""
+==
+
+COPY source TO stderr WITH (FORMAT 'CSV', DELIMITER '|', NULL_STRING '.na', HEADER TRUE);
+--
+int_col|date_col|char_col|varchar_col
+1|2000-01-01|abc|def
+2|2000-02-02|a	a|"|,|"
+.na|.na|"b
+b"|""""""""
+==
diff --git a/query_optimizer/tests/physical_generator/Copy.test b/query_optimizer/tests/physical_generator/Copy.test
index 2f66415..3d76373 100644
--- a/query_optimizer/tests/physical_generator/Copy.test
+++ b/query_optimizer/tests/physical_generator/Copy.test
@@ -26,7 +26,7 @@
   +-[]
 [Physical Plan]
 TopLevelPlan
-+-plan=CopyFrom[relation=Test,file_name=test.txt,column_delimiter=	,
++-plan=CopyFrom[relation=Test,file_name=test.txt,column_delimiter="\t",
 | escape_strings=true]
 +-output_attributes=
   +-[]
@@ -42,7 +42,7 @@
   +-[]
 [Physical Plan]
 TopLevelPlan
-+-plan=CopyFrom[relation=Test,file_name=test.txt,column_delimiter=d,
++-plan=CopyFrom[relation=Test,file_name=test.txt,column_delimiter="d",
 | escape_strings=false]
 +-output_attributes=
   +-[]
diff --git a/query_optimizer/tests/resolver/Copy.test b/query_optimizer/tests/resolver/Copy.test
index c2ae91a..d68e18f 100644
--- a/query_optimizer/tests/resolver/Copy.test
+++ b/query_optimizer/tests/resolver/Copy.test
@@ -16,7 +16,7 @@
 # under the License.
 
 [default initial_logical_plan]
-copy test from 'test.txt'
+COPY test FROM 'test.txt'
 --
 TopLevelPlan
 +-plan=CopyFrom[relation=Test,file_name=test.txt,column_delimiter="\t",
@@ -25,14 +25,14 @@
   +-[]
 ==
 
-copy tESt from 'test.txt' with (delimiter '123')
+COPY tESt FROM 'test.txt' WITH (delimiter '123')
 --
 ERROR: DELIMITER is not a single character (1 : 43)
-copy tESt from 'test.txt' with (delimiter '123')
+COPY tESt FROM 'test.txt' WITH (delimiter '123')
                                           ^
 ==
 
-copy tESt from 'test.txt' with (delimiter 'd', escape_strings false)
+COPY tESt FROM 'test.txt' WITH (delimiter 'd', escape_strings false)
 --
 TopLevelPlan
 +-plan=CopyFrom[relation=Test,file_name=test.txt,column_delimiter="d",
@@ -41,8 +41,160 @@
   +-[]
 ==
 
-copy undefined_table from 'test.txt'
+COPY test TO 'test.txt';
+--
+TopLevelPlan
++-plan=CopyTo[file_name=@test.txt,format=TEXT,column_delimiter="\t",
+| escape_strings=true,null_string=\N]
+| +-input=TableReference[relation_name=Test,relation_alias=test]
+|   +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
+|   +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
+|   +-AttributeReference[id=2,name=float_col,relation=test,type=Float]
+|   +-AttributeReference[id=3,name=double_col,relation=test,type=Double NULL]
+|   +-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
+|   +-AttributeReference[id=5,name=vchar_col,relation=test,type=VarChar(20) NULL]
++-output_attributes=
+  +-[]
+==
+
+COPY test TO stdout WITH (FORMAT 'CSV');
+--
+TopLevelPlan
++-plan=CopyTo[file_name=$stdout,format=CSV,column_delimiter=",",header=true,
+| quote="]
+| +-input=TableReference[relation_name=Test,relation_alias=test]
+|   +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
+|   +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
+|   +-AttributeReference[id=2,name=float_col,relation=test,type=Float]
+|   +-AttributeReference[id=3,name=double_col,relation=test,type=Double NULL]
+|   +-AttributeReference[id=4,name=char_col,relation=test,type=Char(20)]
+|   +-AttributeReference[id=5,name=vchar_col,relation=test,type=VarChar(20) NULL]
++-output_attributes=
+  +-[]
+==
+
+COPY
+  SELECT SUM(int_col) AS sum_int,
+         AVG(double_col) AS avg_dbl
+  FROM test
+  GROUP BY char_col
+  UNION ALL
+  SELECT 1, 2.0
+  FROM generate_series(1, 1)
+TO 'test.txt' WITH (DELIMITER ',');
+--
+TopLevelPlan
++-plan=CopyTo[file_name=@test.txt,format=TEXT,column_delimiter=",",
+| escape_strings=true,null_string=\N]
+| +-input=UnionAll[set_operation_type=UnionAll]
+|   +-operands=
+|   | +-Project
+|   | | +-input=Project
+|   | | | +-input=Aggregate
+|   | | | | +-input=TableReference[relation_name=Test,relation_alias=test]
+|   | | | | | +-AttributeReference[id=0,name=int_col,relation=test,type=Int NULL]
+|   | | | | | +-AttributeReference[id=1,name=long_col,relation=test,type=Long]
+|   | | | | | +-AttributeReference[id=2,name=float_col,relation=test,type=Float]
+|   | | | | | +-AttributeReference[id=3,name=double_col,relation=test,
+|   | | | | | | type=Double NULL]
+|   | | | | | +-AttributeReference[id=4,name=char_col,relation=test,
+|   | | | | | | type=Char(20)]
+|   | | | | | +-AttributeReference[id=5,name=vchar_col,relation=test,
+|   | | | | |   type=VarChar(20) NULL]
+|   | | | | +-grouping_expressions=
+|   | | | | | +-AttributeReference[id=4,name=char_col,relation=test,
+|   | | | | |   type=Char(20)]
+|   | | | | +-aggregate_expressions=
+|   | | | |   +-Alias[id=6,name=,alias=$aggregate0,relation=$aggregate,
+|   | | | |   | type=Long NULL]
+|   | | | |   | +-AggregateFunction[function=SUM]
+|   | | | |   |   +-AttributeReference[id=0,name=int_col,relation=test,
+|   | | | |   |     type=Int NULL]
+|   | | | |   +-Alias[id=7,name=,alias=$aggregate1,relation=$aggregate,
+|   | | | |     type=Double NULL]
+|   | | | |     +-AggregateFunction[function=AVG]
+|   | | | |       +-AttributeReference[id=3,name=double_col,relation=test,
+|   | | | |         type=Double NULL]
+|   | | | +-project_list=
+|   | | |   +-Alias[id=6,name=sum_int,relation=,type=Long NULL]
+|   | | |   | +-AttributeReference[id=6,name=,alias=$aggregate0,
+|   | | |   |   relation=$aggregate,type=Long NULL]
+|   | | |   +-Alias[id=7,name=avg_dbl,relation=,type=Double NULL]
+|   | | |     +-AttributeReference[id=7,name=,alias=$aggregate1,
+|   | | |       relation=$aggregate,type=Double NULL]
+|   | | +-project_list=
+|   | |   +-AttributeReference[id=6,name=sum_int,relation=,type=Long NULL]
+|   | |   +-AttributeReference[id=7,name=avg_dbl,relation=,type=Double NULL]
+|   | +-Project
+|   |   +-input=Project
+|   |   | +-input=TableGenerator[function_name=generate_series]
+|   |   | | +-AttributeReference[id=8,name=generate_series,
+|   |   | |   relation=generate_series,type=Int]
+|   |   | +-project_list=
+|   |   |   +-Alias[id=9,name=,alias=1,relation=,type=Int]
+|   |   |   | +-Literal[value=1,type=Int]
+|   |   |   +-Alias[id=10,name=,alias=2.0,relation=,type=Double]
+|   |   |     +-Literal[value=2,type=Double]
+|   |   +-project_list=
+|   |     +-Alias[id=11,name=,alias=1,relation=,type=Long NULL]
+|   |     | +-Cast[target_type=Long NULL]
+|   |     |   +-operand=AttributeReference[id=9,name=,alias=1,relation=,type=Int]
+|   |     +-Alias[id=12,name=,alias=2.0,relation=,type=Double NULL]
+|   |       +-Cast[target_type=Double NULL]
+|   |         +-operand=AttributeReference[id=10,name=,alias=2.0,relation=,
+|   |           type=Double]
+|   +-project_attributes=
+|     +-AttributeReference[id=13,name=sum_int,relation=,type=Long NULL]
+|     +-AttributeReference[id=14,name=avg_dbl,relation=,type=Double NULL]
++-output_attributes=
+  +-[]
+==
+
+COPY undefined_table FROM 'test.txt'
 --
 ERROR: Unrecognized relation undefined_table (1 : 6)
-copy undefined_table from 'test.txt...
+COPY undefined_table FROM 'test.txt...
      ^
+==
+
+COPY test FROM 'test.txt' WITH (FORMAT 'CSV')
+--
+ERROR: Unsupported file format: csv (1 : 40)
+COPY test FROM 'test.txt' WITH (FORMAT 'CSV')
+                                       ^
+==
+
+COPY test FROM 'test.txt' WITH (XXX 'YY');
+--
+ERROR: Unsupported copy option: xxx (1 : 33)
+COPY test FROM 'test.txt' WITH (XXX 'YY');
+                                ^
+==
+
+COPY test TO 'test.txt' WITH (QUOTE '$');
+--
+ERROR: Unsupported copy option "quote" for file format TEXT (1 : 31)
+COPY test TO 'test.txt' WITH (QUOTE '$');
+                              ^
+==
+
+COPY test TO 'test.txt' WITH (FORMAT 'CSV', ESCAPE_STRINGS TRUE);
+--
+ERROR: Unsupported copy option "escape_strings" for file format CSV (1 : 45)
+... test TO 'test.txt' WITH (FORMAT 'CSV', ESCAPE_STRINGS TRUE);
+                                           ^
+==
+
+COPY test TO 'test.txt' WITH (FORMAT CSV, QUOTE '$$');
+--
+ERROR: QUOTE is not a single character (1 : 49)
+...test TO 'test.txt' WITH (FORMAT CSV, QUOTE '$$');
+                                              ^
+==
+
+COPY test TO 'test.txt' WITH (FORMAT 'TEXT', QUOTE '"');
+--
+ERROR: Unsupported copy option "quote" for file format TEXT (1 : 46)
+...test TO 'test.txt' WITH (FORMAT 'TEXT', QUOTE '"');
+                                           ^
+==
diff --git a/relational_operators/CMakeLists.txt b/relational_operators/CMakeLists.txt
index 57ba9f9..7b9ed96 100644
--- a/relational_operators/CMakeLists.txt
+++ b/relational_operators/CMakeLists.txt
@@ -71,6 +71,7 @@
             SortMergeRunOperatorHelpers.hpp)
 add_library(quickstep_relationaloperators_SortRunGenerationOperator SortRunGenerationOperator.cpp
             SortRunGenerationOperator.hpp)
+add_library(quickstep_relationaloperators_TableExportOperator TableExportOperator.cpp TableExportOperator.hpp)
 add_library(quickstep_relationaloperators_TableGeneratorOperator TableGeneratorOperator.cpp TableGeneratorOperator.hpp)
 add_library(quickstep_relationaloperators_TextScanOperator TextScanOperator.cpp TextScanOperator.hpp)
 add_library(quickstep_relationaloperators_UnionAllOperator UnionAllOperator.cpp UnionAllOperator.hpp)
@@ -473,6 +474,26 @@
                       quickstep_utility_Macros
                       quickstep_utility_SortConfiguration
                       tmb)
+target_link_libraries(quickstep_relationaloperators_TableExportOperator
+                      glog
+                      quickstep_catalog_CatalogAttribute
+                      quickstep_catalog_CatalogRelation
+                      quickstep_catalog_CatalogTypedefs
+                      quickstep_queryexecution_QueryContext
+                      quickstep_queryexecution_WorkOrderProtosContainer
+                      quickstep_queryexecution_WorkOrdersContainer
+                      quickstep_relationaloperators_RelationalOperator
+                      quickstep_relationaloperators_WorkOrder
+                      quickstep_relationaloperators_WorkOrder_proto
+                      quickstep_storage_StorageBlockInfo
+                      quickstep_storage_StorageConstants
+                      quickstep_storage_ValueAccessor
+                      quickstep_threading_SpinMutex
+                      quickstep_types_TypedValue
+                      quickstep_types_containers_Tuple
+                      quickstep_utility_BulkIoConfiguration
+                      quickstep_utility_Macros
+                      quickstep_utility_StringUtil)
 target_link_libraries(quickstep_relationaloperators_TableGeneratorOperator
                       glog
                       quickstep_catalog_CatalogRelation
@@ -508,6 +529,7 @@
                       quickstep_types_containers_ColumnVector
                       quickstep_types_containers_ColumnVectorsValueAccessor
                       quickstep_types_containers_Tuple
+                      quickstep_utility_BulkIoConfiguration
                       quickstep_utility_Glob
                       quickstep_utility_Macros
                       tmb)
@@ -637,6 +659,7 @@
                       quickstep_relationaloperators_SortMergeRunOperatorHelpers
                       quickstep_relationaloperators_SortMergeRunOperator_proto
                       quickstep_relationaloperators_SortRunGenerationOperator
+                      quickstep_relationaloperators_TableExportOperator
                       quickstep_relationaloperators_TableGeneratorOperator
                       quickstep_relationaloperators_TextScanOperator
                       quickstep_relationaloperators_UnionAllOperator
diff --git a/relational_operators/RelationalOperator.hpp b/relational_operators/RelationalOperator.hpp
index 8035685..8eb59f0 100644
--- a/relational_operators/RelationalOperator.hpp
+++ b/relational_operators/RelationalOperator.hpp
@@ -86,6 +86,7 @@
     kSelect,
     kSortMergeRun,
     kSortRunGeneration,
+    kTableExport,
     kTableGenerator,
     kTextScan,
     kUnionAll,
diff --git a/relational_operators/TableExportOperator.cpp b/relational_operators/TableExportOperator.cpp
new file mode 100644
index 0000000..f6a73bf
--- /dev/null
+++ b/relational_operators/TableExportOperator.cpp
@@ -0,0 +1,336 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ **/
+
+#include "relational_operators/TableExportOperator.hpp"
+
+#include <cstdio>
+#include <exception>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "catalog/CatalogAttribute.hpp"
+#include "query_execution/QueryContext.hpp"
+#include "query_execution/WorkOrderProtosContainer.hpp"
+#include "query_execution/WorkOrdersContainer.hpp"
+#include "relational_operators/WorkOrder.pb.h"
+#include "storage/StorageBlockInfo.hpp"
+#include "storage/ValueAccessor.hpp"
+#include "threading/SpinMutex.hpp"
+#include "types/TypedValue.hpp"
+#include "types/containers/Tuple.hpp"
+#include "utility/BulkIoConfiguration.hpp"
+#include "utility/StringUtil.hpp"
+
+#include "glog/logging.h"
+
+#include "tmb/id_typedefs.h"
+
+namespace quickstep {
+
+TableExportOperator::~TableExportOperator() {
+  if (file_ != nullptr && file_ != stdout && file_ != stderr) {
+    std::fclose(file_);
+  }
+  file_ = nullptr;
+}
+
+bool TableExportOperator::getAllWorkOrders(
+    WorkOrdersContainer *container,
+    QueryContext *query_context,
+    StorageManager *storage_manager,
+    const tmb::client_id scheduler_client_id,
+    tmb::MessageBus *bus) {
+  const auto add_work_order =
+      [&](const block_id input_block_id,  // NOLINT(build/c++11)
+          const bool is_first_work_order) -> void {
+    std::unique_ptr<std::string> output_buffer = std::make_unique<std::string>();
+    container->addNormalWorkOrder(
+        new TableExportToStringWorkOrder(query_id_,
+                                         input_relation_,
+                                         input_block_id,
+                                         options_->getFormat(),
+                                         is_first_work_order && options_->hasHeader(),
+                                         options_->getDelimiter(),
+                                         options_->escapeStrings(),
+                                         options_->getQuoteCharacter(),
+                                         options_->getNullString(),
+                                         output_buffer.get(),
+                                         op_index_,
+                                         scheduler_client_id,
+                                         storage_manager,
+                                         bus),
+        op_index_);
+
+    SpinMutexLock lock(output_buffers_mutex_);
+    output_buffers_.emplace(input_block_id, BlockBuffer(output_buffer.release()));
+  };
+
+  if (input_relation_is_stored_) {
+    if (!started_) {
+      for (std::size_t i = 0; i < input_relation_block_ids_.size(); ++i) {
+        add_work_order(input_relation_block_ids_[i], i == 0);
+      }
+      num_workorders_generated_ = input_relation_block_ids_.size();
+      started_ = true;
+    }
+    return true;
+  } else {
+    while (num_workorders_generated_ < input_relation_block_ids_.size()) {
+      add_work_order(input_relation_block_ids_[num_workorders_generated_],
+                     num_workorders_generated_ == 0);
+      ++num_workorders_generated_;
+    }
+    return done_feeding_input_relation_;
+  }
+}
+
+bool TableExportOperator::getAllWorkOrderProtos(
+    WorkOrderProtosContainer *container) {
+  // TODO(quickstep-team): Implement TextExportOperator for the distributed case.
+  LOG(FATAL) << "TableExportOperator::getAllWorkOrderProtos() is not supported";
+}
+
+void TableExportOperator::receiveFeedbackMessage(
+    const WorkOrder::FeedbackMessage &msg) {
+  DCHECK(TableExportOperator::kBlockOutputMessage == msg.type());
+  DCHECK(msg.payload_size() == sizeof(block_id));
+
+  if (file_ == nullptr) {
+    const std::string lo_file_name = ToLower(file_name_);
+    if (lo_file_name == "$stdout") {
+      file_ = stdout;
+    } else if (lo_file_name == "$stderr") {
+      file_ = stderr;
+    } else {
+      file_ = std::fopen(file_name_.substr(1).c_str(), "wb");
+      // TODO(quickstep-team): Decent handling of exceptions at query runtime.
+      if (file_ == nullptr) {
+        throw std::runtime_error("Can not open file " + file_name_ + " for writing");
+      }
+    }
+  }
+
+  // Mark block done.
+  const block_id done_block_id = *static_cast<const block_id*>(msg.payload());
+  {
+    SpinMutexLock lock(output_buffers_mutex_);
+    DCHECK(output_buffers_.find(done_block_id) != output_buffers_.end());
+    output_buffers_.at(done_block_id).done = true;
+  }
+
+  // FIXME(jianqiao): Use work orders to perform the "write to file" operation
+  // instead of doing it here inside this thread -- as it may stall the scheduler.
+  while (num_blocks_written_ < num_workorders_generated_) {
+    // Write block exported strings to file in the same order as the blocks are
+    // in \p input_relation_block_ids_.
+    block_id next_block_id;
+    {
+      SpinMutexLock lock(block_ids_mutex_);
+      next_block_id = input_relation_block_ids_[num_blocks_written_];
+    }
+    std::unique_ptr<std::string> output_buffer;
+    {
+      SpinMutexLock lock(output_buffers_mutex_);
+      auto it = output_buffers_.find(next_block_id);
+      if (it == output_buffers_.end() || !it->second.done) {
+        break;
+      }
+      output_buffer = std::move(it->second.buffer);
+      output_buffers_.erase(it);
+    }
+    std::fwrite(output_buffer->c_str(), 1, output_buffer->length(), file_);
+    ++num_blocks_written_;
+  }
+}
+
+void TableExportToStringWorkOrder::execute() {
+  BlockReference block(
+      storage_manager_->getBlock(input_block_id_, input_relation_));
+  std::unique_ptr<ValueAccessor> accessor(
+      block->getTupleStorageSubBlock().createValueAccessor());
+
+  switch (format_) {
+    case BulkIoFormat::kCsv:
+      writeToString<&TableExportToStringWorkOrder::quoteCSVField>(
+          accessor.get(), output_buffer_);
+      break;
+    case BulkIoFormat::kText:
+      writeToString<&TableExportToStringWorkOrder::escapeTextField>(
+          accessor.get(), output_buffer_);
+      break;
+    default:
+      LOG(FATAL) << "Unsupported export format in TableExportWorkOrder::execute()";
+  }
+
+  // Send completion message to operator.
+  FeedbackMessage msg(TableExportOperator::kBlockOutputMessage,
+                      getQueryID(),
+                      operator_index_,
+                      new block_id(input_block_id_),
+                      sizeof(input_block_id_));
+  SendFeedbackMessage(
+      bus_, ClientIDMap::Instance()->getValue(), scheduler_client_id_, msg);
+}
+
+inline std::string TableExportToStringWorkOrder::quoteCSVField(
+    std::string &&field) const {  // NOLINT(whitespace/operators)x
+  bool need_quote = false;
+  for (const char c : field) {
+    if (c == field_terminator_ || c == quote_character_ || c == '\n') {
+      need_quote = true;
+      break;
+    }
+  }
+  if (!need_quote) {
+    return std::move(field);
+  }
+
+  std::string quoted;
+  quoted.push_back(quote_character_);
+  for (const char c : field) {
+    if (c == quote_character_) {
+      quoted.push_back(c);
+    }
+    quoted.push_back(c);
+  }
+  quoted.push_back(quote_character_);
+  return quoted;
+}
+
+
+inline std::string TableExportToStringWorkOrder::escapeTextField(
+    std::string &&field) const {  // NOLINT(whitespace/operators)
+  if (escape_strings_ == false || field == "\\N") {
+    return std::move(field);
+  }
+  bool need_escape = false;
+  for (const unsigned char c : field) {
+    if (c < ' ' || c == '\\' || c == field_terminator_) {
+      need_escape = true;
+      break;
+    }
+  }
+  if (!need_escape) {
+    return std::move(field);
+  }
+
+  std::string escaped;
+  for (const unsigned char c : field) {
+    if (c < 32) {
+      switch (c) {
+        case '\b':
+          // Backspace.
+          escaped.append("\\b");
+          break;
+        case '\f':
+          // Form-feed.
+          escaped.append("\\f");
+          break;
+        case '\n':
+          // Newline.
+          escaped.append("\\n");
+          break;
+        case '\r':
+          // Carriage return.
+          escaped.append("\\r");
+          break;
+        case '\t':
+          // Tab.
+          escaped.append("\\t");
+          break;
+        case '\v':
+          // Vertical tab
+          escaped.append("\\v");
+          break;
+        default: {
+          // Use hexidecimal representation.
+          static const std::string digits = "0123456789ABCDEF";
+          escaped.append("\\x");
+          escaped.push_back(digits.at(c >> 4));
+          escaped.push_back(digits.at(c & 0xF));
+          break;
+        }
+      }
+    } else {
+      if (c == '\\' || c == field_terminator_) {
+        escaped.push_back('\\');
+      }
+      escaped.push_back(c);
+    }
+  }
+  return escaped;
+}
+
+template <std::string (TableExportToStringWorkOrder::*transform)(std::string&&) const,  // NOLINT
+          typename Container, typename Functor>
+inline void TableExportToStringWorkOrder::writeEachToString(const Container &container,
+                                                            std::string *output,
+                                                            const Functor &functor) const {
+  auto it = container.begin();
+  if (it != container.end()) {
+    std::size_t idx = 0;
+    output->append((this->*transform)(functor(*it, idx++)));
+    while ((++it) != container.end()) {
+      output->push_back(field_terminator_);
+      output->append((this->*transform)(functor(*it, idx++)));
+    }
+  }
+}
+
+template <std::string (TableExportToStringWorkOrder::*transform)(std::string&&) const>  // NOLINT
+void TableExportToStringWorkOrder::writeToString(ValueAccessor *accessor,
+                                                 std::string *output) const {
+  std::vector<const Type*> value_types;
+  value_types.reserve(input_relation_.size());
+  for (const CatalogAttribute &attribute : input_relation_) {
+    value_types.emplace_back(&attribute.getType());
+  }
+
+  // Write table header to the output buffer.
+  if (print_header_) {
+    writeEachToString<transform>(
+        input_relation_, output,
+        [&](const CatalogAttribute &attr,  // NOLINT(build/c++11)
+            const std::size_t idx) -> std::string {
+      return attr.getDisplayName();
+    });
+    output->push_back('\n');
+  }
+
+  // Write table rows to the output buffer.
+  accessor->beginIterationVirtual();
+  while (accessor->nextVirtual()) {
+    std::unique_ptr<Tuple> tuple(accessor->getTupleVirtual());
+    writeEachToString<transform>(
+        *tuple, output,
+        [&](const TypedValue &value,  // NOLINT(build/c++11)
+            const std::size_t idx) -> std::string {
+      if (value.isNull()) {
+        return null_string_;
+      } else {
+        return value_types[idx]->printValueToString(value);
+      }
+    });
+    output->push_back('\n');
+  }
+}
+
+}  // namespace quickstep
diff --git a/relational_operators/TableExportOperator.hpp b/relational_operators/TableExportOperator.hpp
new file mode 100644
index 0000000..29a07d1
--- /dev/null
+++ b/relational_operators/TableExportOperator.hpp
@@ -0,0 +1,267 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ **/
+
+#ifndef QUICKSTEP_RELATIONAL_OPERATORS_TABLE_EXPORT_OPERATOR_HPP_
+#define QUICKSTEP_RELATIONAL_OPERATORS_TABLE_EXPORT_OPERATOR_HPP_
+
+#include <cstddef>
+#include <cstdio>
+#include <memory>
+#include <string>
+#include <unordered_map>
+#include <vector>
+
+#include "catalog/CatalogRelation.hpp"
+#include "catalog/CatalogTypedefs.hpp"
+#include "query_execution/QueryContext.hpp"
+#include "relational_operators/RelationalOperator.hpp"
+#include "relational_operators/WorkOrder.hpp"
+#include "storage/StorageBlockInfo.hpp"
+#include "storage/StorageConstants.hpp"
+#include "threading/SpinMutex.hpp"
+#include "utility/BulkIoConfiguration.hpp"
+#include "utility/Macros.hpp"
+
+#include "glog/logging.h"
+
+#include "tmb/id_typedefs.h"
+
+namespace tmb { class MessageBus; }
+
+namespace quickstep {
+
+class CatalogRelationSchema;
+class StorageManager;
+class ValueAccessor;
+class WorkOrderProtosContainer;
+class WorkOrdersContainer;
+
+namespace serialization { class WorkOrder; }
+
+/** \addtogroup RelationalOperators
+ *  @{
+ */
+
+class TableExportOperator : public RelationalOperator {
+ public:
+  /**
+   * @brief Feedback message to Foreman when a TableExportToStringWorkOrder has
+   *        completed writing a block to the string buffer.
+   */
+  enum FeedbackMessageType : WorkOrder::FeedbackMessageType {
+      kBlockOutputMessage,
+  };
+
+  /**
+   * @brief Constructor.
+   *
+   * @param query_id The ID of the query to which this operator belongs.
+   * @param input_relation The relation to export.
+   * @param input_relation_is_stored If input_relation is a stored relation and
+   *        is fully available to the operator before it can start generating
+   *        workorders.
+   * @param file_name The name of the file to export the relation to.
+   * @param options The options that specify the detailed format of the output
+   *        file.
+   */
+  TableExportOperator(const std::size_t query_id,
+                      const CatalogRelation &input_relation,
+                      const bool input_relation_is_stored,
+                      const std::string &file_name,
+                      const BulkIoConfigurationPtr &options)
+      : RelationalOperator(query_id),
+        input_relation_(input_relation),
+        input_relation_is_stored_(input_relation_is_stored),
+        file_name_(file_name),
+        options_(options),
+        input_relation_block_ids_(input_relation_is_stored
+                                      ? input_relation.getBlocksSnapshot()
+                                      : std::vector<block_id>()),
+        num_workorders_generated_(0),
+        started_(false),
+        num_blocks_written_(0),
+        file_(nullptr) {}
+
+  ~TableExportOperator() override;
+
+  OperatorType getOperatorType() const override {
+    return kTableExport;
+  }
+
+  std::string getName() const override {
+    return "TableExportOperator";
+  }
+
+  /**
+   * @return The relation to export.
+   */
+  const CatalogRelation& input_relation() const {
+    return input_relation_;
+  }
+
+  bool getAllWorkOrders(WorkOrdersContainer *container,
+                        QueryContext *query_context,
+                        StorageManager *storage_manager,
+                        const tmb::client_id scheduler_client_id,
+                        tmb::MessageBus *bus) override;
+
+  bool getAllWorkOrderProtos(WorkOrderProtosContainer *container) override;
+
+  void feedInputBlock(const block_id input_block_id,
+                      const relation_id input_relation_id,
+                      const partition_id part_id) override {
+    if (input_relation_id == input_relation_.getID()) {
+      SpinMutexLock lock(block_ids_mutex_);
+      input_relation_block_ids_.emplace_back(input_block_id);
+    }
+  }
+
+  void receiveFeedbackMessage(const WorkOrder::FeedbackMessage &msg) override;
+
+ private:
+  // Buffer for storing a block's exported string.
+  struct BlockBuffer {
+    explicit BlockBuffer(std::string *buffer_in)
+        : done(false),
+          buffer(buffer_in) {}
+    bool done;
+    std::unique_ptr<std::string> buffer;
+  };
+
+  const CatalogRelation &input_relation_;
+  const bool input_relation_is_stored_;
+  const std::string file_name_;
+  const BulkIoConfigurationPtr options_;
+
+  std::vector<block_id> input_relation_block_ids_;
+  std::size_t num_workorders_generated_;
+  alignas(kCacheLineBytes) SpinMutex block_ids_mutex_;
+
+  bool started_;
+
+  std::size_t num_blocks_written_;
+  std::unordered_map<block_id, BlockBuffer> output_buffers_;
+  alignas(kCacheLineBytes) SpinMutex output_buffers_mutex_;
+
+  FILE *file_;
+
+  DISALLOW_COPY_AND_ASSIGN(TableExportOperator);
+};
+
+class TableExportToStringWorkOrder : public WorkOrder {
+ public:
+  /**
+   * @brief Constructor.
+   *
+   * @param query_id The ID of the query to which this work order belongs.
+   * @param input_relation The relation to export.
+   * @param input_block_id The block id.
+   * @param format The output file format.
+   * @param print_header Whether to write table headers.
+   * @param field_terminator The character that separates attribute values in
+   *        each output row.
+   * @param escape_strings Whether to encode special characters as escape
+   *        sequences. NOTE: This options is for TEXT format only and is ignored
+   *        otherwiae.
+   * @param quote_character The quote character. NOTE: This options is for CSV
+   *        format only and is ignored otherwiae.
+   * @param null_string The string that represents a null value.
+   * @param output_buffer The string buffer for writing the output to.
+   * @param operator_index TableExportOperator index to send feedback messages
+   *        to.
+   * @param scheduler_client_id The TMB client ID of the scheduler thread.
+   * @param storage_manager The StorageManager to use.
+   * @param bus TMB to send the feedback message on.
+   */
+  TableExportToStringWorkOrder(const std::size_t query_id,
+                               const CatalogRelationSchema &input_relation,
+                               const block_id input_block_id,
+                               const BulkIoFormat format,
+                               const bool print_header,
+                               const char field_terminator,
+                               const bool escape_strings,
+                               const char quote_character,
+                               const std::string null_string,
+                               std::string *output_buffer,
+                               const std::size_t operator_index,
+                               const tmb::client_id scheduler_client_id,
+                               StorageManager *storage_manager,
+                               MessageBus *bus)
+      : WorkOrder(query_id),
+        input_relation_(input_relation),
+        input_block_id_(input_block_id),
+        format_(format),
+        print_header_(print_header),
+        field_terminator_(field_terminator),
+        escape_strings_(escape_strings),
+        quote_character_(quote_character),
+        null_string_(null_string),
+        operator_index_(operator_index),
+        scheduler_client_id_(scheduler_client_id),
+        storage_manager_(storage_manager),
+        bus_(bus),
+        output_buffer_(output_buffer) {
+  }
+
+  ~TableExportToStringWorkOrder() override {}
+
+  void execute() override;
+
+ private:
+  inline std::string quoteCSVField(std::string &&field) const;  // NOLINT(whitespace/operators)
+  inline std::string escapeTextField(std::string &&field) const;  // NOLINT(whitespace/operators)
+
+  // Helper method for writing each entry from a table row to the output string
+  // buffer, with proper transformations (separated by delimiter character,
+  // escape special characters, add quotes, etc.).
+  template <std::string (TableExportToStringWorkOrder::*transform)(std::string&&) const,  // NOLINT
+            typename Container, typename Functor>
+  inline void writeEachToString(const Container &container,
+                                std::string *output,
+                                const Functor &functor) const;
+
+  // Write all the rows from a value accessor to the output string buffer.
+  template <std::string (TableExportToStringWorkOrder::*transform)(std::string&&) const>  // NOLINT
+  void writeToString(ValueAccessor *accessor, std::string *output) const;
+
+  const CatalogRelationSchema &input_relation_;
+  const block_id input_block_id_;
+
+  const BulkIoFormat format_;
+  const bool print_header_;
+  const char field_terminator_;
+  const bool escape_strings_;
+  const char quote_character_;
+  const std::string null_string_;
+
+  const std::size_t operator_index_;
+  const tmb::client_id scheduler_client_id_;
+  StorageManager *storage_manager_;
+  MessageBus *bus_;
+
+  std::string *output_buffer_;
+
+  DISALLOW_COPY_AND_ASSIGN(TableExportToStringWorkOrder);
+};
+
+/** @} */
+
+}  // namespace quickstep
+
+#endif  // QUICKSTEP_RELATIONAL_OPERATORS_TABLE_EXPORT_OPERATOR_HPP_
diff --git a/relational_operators/TextScanOperator.cpp b/relational_operators/TextScanOperator.cpp
index 3ca3af4..66137d8 100644
--- a/relational_operators/TextScanOperator.cpp
+++ b/relational_operators/TextScanOperator.cpp
@@ -31,6 +31,7 @@
 #include <cstdint>
 #include <cstdio>
 #include <cstdlib>
+#include <exception>
 #include <memory>
 #include <string>
 #include <utility>
@@ -54,6 +55,7 @@
 #include "types/containers/ColumnVector.hpp"
 #include "types/containers/ColumnVectorsValueAccessor.hpp"
 #include "types/containers/Tuple.hpp"
+#include "utility/BulkIoConfiguration.hpp"
 #include "utility/Glob.hpp"
 
 #include "gflags/gflags.h"
@@ -61,9 +63,6 @@
 
 #include "tmb/id_typedefs.h"
 
-using std::size_t;
-using std::string;
-
 namespace quickstep {
 
 // Text segment size set to 256KB.
@@ -82,14 +81,19 @@
   return true;
 }
 
-static const volatile bool text_scan_text_segment_size_dummy = gflags::RegisterFlagValidator(
-    &FLAGS_textscan_text_segment_size, &ValidateTextScanTextSegmentSize);
+static const volatile bool text_scan_text_segment_size_dummy =
+    gflags::RegisterFlagValidator(
+        &FLAGS_textscan_text_segment_size, &ValidateTextScanTextSegmentSize);
 
 namespace {
 
-size_t getFileSize(const string &file_name) {
+std::size_t GetFileSize(const std::string &file_name) {
   // Use standard C libary to retrieve the file size.
   FILE *fp = std::fopen(file_name.c_str(), "rb");
+  // TODO(quickstep-team): Decent handling of exceptions at query runtime.
+  if (fp == nullptr) {
+    throw std::runtime_error("Can not open file " + file_name + " for reading");
+  }
   std::fseek(fp, 0, SEEK_END);
   const std::size_t file_size = std::ftell(fp);
   std::fclose(fp);
@@ -127,7 +131,7 @@
         << "File " << file << " is not readable due to permission issues.";
 #endif  // QUICKSTEP_HAVE_UNISTD
 
-    const std::size_t file_size = getFileSize(file);
+    const std::size_t file_size = GetFileSize(file);
 
     std::size_t text_offset = 0;
     for (size_t num_full_segments = file_size / FLAGS_textscan_text_segment_size;
@@ -138,8 +142,8 @@
                                 file,
                                 text_offset,
                                 FLAGS_textscan_text_segment_size,
-                                field_terminator_,
-                                process_escape_sequences_,
+                                options_->getDelimiter(),
+                                options_->escapeStrings(),
                                 output_destination),
           op_index_);
     }
@@ -152,8 +156,8 @@
                                 file,
                                 text_offset,
                                 file_size - text_offset,
-                                field_terminator_,
-                                process_escape_sequences_,
+                                options_->getDelimiter(),
+                                options_->escapeStrings(),
                                 output_destination),
           op_index_);
     }
@@ -169,22 +173,25 @@
     return true;
   }
 
-  for (const string &file : files) {
-    const std::size_t file_size = getFileSize(file);
+  for (const std::string &file : files) {
+    const std::size_t file_size = GetFileSize(file);
 
     size_t text_offset = 0;
     for (size_t num_full_segments = file_size / FLAGS_textscan_text_segment_size;
          num_full_segments > 0;
          --num_full_segments, text_offset += FLAGS_textscan_text_segment_size) {
-      container->addWorkOrderProto(createWorkOrderProto(file, text_offset, FLAGS_textscan_text_segment_size),
-                                   op_index_);
+      container->addWorkOrderProto(
+          createWorkOrderProto(file, text_offset,
+                               FLAGS_textscan_text_segment_size),
+          op_index_);
     }
 
     // Deal with the residual partial segment whose size is less than
     // 'FLAGS_textscan_text_segment_size'.
     if (text_offset < file_size) {
-      container->addWorkOrderProto(createWorkOrderProto(file, text_offset, file_size - text_offset),
-                                   op_index_);
+      container->addWorkOrderProto(
+          createWorkOrderProto(file, text_offset, file_size - text_offset),
+          op_index_);
     }
   }
 
@@ -192,9 +199,10 @@
   return true;
 }
 
-serialization::WorkOrder* TextScanOperator::createWorkOrderProto(const string &filename,
-                                                                 const size_t text_offset,
-                                                                 const size_t text_segment_size) {
+serialization::WorkOrder* TextScanOperator::createWorkOrderProto(
+    const std::string &filename,
+    const std::size_t text_offset,
+    const std::size_t text_segment_size) {
   serialization::WorkOrder *proto = new serialization::WorkOrder;
   proto->set_work_order_type(serialization::TEXT_SCAN);
   proto->set_query_id(query_id_);
@@ -202,9 +210,10 @@
   proto->SetExtension(serialization::TextScanWorkOrder::filename, filename);
   proto->SetExtension(serialization::TextScanWorkOrder::text_offset, text_offset);
   proto->SetExtension(serialization::TextScanWorkOrder::text_segment_size, text_segment_size);
-  proto->SetExtension(serialization::TextScanWorkOrder::field_terminator, field_terminator_);
+  proto->SetExtension(serialization::TextScanWorkOrder::field_terminator,
+                      options_->getDelimiter());
   proto->SetExtension(serialization::TextScanWorkOrder::process_escape_sequences,
-                      process_escape_sequences_);
+                      options_->escapeStrings());
   proto->SetExtension(serialization::TextScanWorkOrder::insert_destination_index,
                       output_destination_index_);
 
@@ -235,12 +244,14 @@
     file_handle = hdfsOpenFile(hdfs, filename_.c_str(), O_RDONLY, buffer_size,
                                0 /* default replication */, 0 /* default block size */);
     if (file_handle == nullptr) {
-      LOG(ERROR) << "Failed to open file " << filename_ << " with error: " << strerror(errno);
+      LOG(ERROR) << "Failed to open file " << filename_
+                 << " with error: " << strerror(errno);
       return;
     }
 
     if (hdfsSeek(hdfs, file_handle, text_offset_)) {
-      LOG(ERROR) << "Failed to seek in file " << filename_ << " with error: " << strerror(errno);
+      LOG(ERROR) << "Failed to seek in file " << filename_
+                 << " with error: " << strerror(errno);
 
       hdfsCloseFile(hdfs, file_handle);
       return;
@@ -248,7 +259,9 @@
 
     bytes_read = hdfsRead(hdfs, file_handle, buffer, text_segment_size_);
     while (bytes_read != text_segment_size_) {
-      bytes_read += hdfsRead(hdfs, file_handle, buffer + bytes_read, text_segment_size_ - bytes_read);
+      bytes_read += hdfsRead(hdfs, file_handle,
+                             buffer + bytes_read,
+                             text_segment_size_ - bytes_read);
     }
   }
 #endif  // QUICKSTEP_HAVE_FILE_MANAGER_HDFS
@@ -325,7 +338,8 @@
   if (use_hdfs) {
 #ifdef QUICKSTEP_HAVE_FILE_MANAGER_HDFS
     if (hdfsSeek(hdfs, file_handle, dynamic_read_offset)) {
-      LOG(ERROR) << "Failed to seek in file " << filename_ << " with error: " << strerror(errno);
+      LOG(ERROR) << "Failed to seek in file " << filename_
+                 << " with error: " << strerror(errno);
 
       hdfsCloseFile(hdfs, file_handle);
       return;
@@ -343,7 +357,9 @@
 
       // Read again when acrossing the HDFS block boundary.
       if (bytes_read != dynamic_read_size) {
-        bytes_read += hdfsRead(hdfs, file_handle, buffer + bytes_read, dynamic_read_size - bytes_read);
+        bytes_read += hdfsRead(hdfs, file_handle,
+                               buffer + bytes_read,
+                               dynamic_read_size - bytes_read);
       }
 #endif  // QUICKSTEP_HAVE_FILE_MANAGER_HDFS
     } else {
diff --git a/relational_operators/TextScanOperator.hpp b/relational_operators/TextScanOperator.hpp
index 4dbeb92..01c559c 100644
--- a/relational_operators/TextScanOperator.hpp
+++ b/relational_operators/TextScanOperator.hpp
@@ -32,6 +32,7 @@
 #include "relational_operators/RelationalOperator.hpp"
 #include "relational_operators/WorkOrder.hpp"
 #include "types/containers/Tuple.hpp"
+#include "utility/BulkIoConfiguration.hpp"
 #include "utility/Macros.hpp"
 
 #include "glog/logging.h"
@@ -104,32 +105,28 @@
 class TextScanOperator : public RelationalOperator {
  public:
   /**
-   * @brief Constructor
+   * @brief Constructor.
    *
    * @param query_id The ID of the query to which this operator belongs.
    * @param file_pattern The glob-like file pattern of the sources to load. The
    *        pattern could include * (wildcard for multiple chars) and ?
    *        (wildcard for single char). It defaults to single file load, if a
    *        file is specified.
-   * @param field_terminator The string which separates attribute values in
-   *        the text file.
-   * @param process_escape_sequences Whether to decode escape sequences in the
-   *        text file.
+   * @param options The options that specify the detailed format of the input
+            file(s).
    * @param output_relation The output relation.
    * @param output_destination_index The index of the InsertDestination in the
    *        QueryContext to insert tuples.
    **/
   TextScanOperator(const std::size_t query_id,
                    const std::string &file_pattern,
-                   const char field_terminator,
-                   const bool process_escape_sequences,
+                   const BulkIoConfigurationPtr &options,
                    const CatalogRelation &output_relation,
                    const QueryContext::insert_destination_id output_destination_index)
       : RelationalOperator(query_id, 1u, output_relation.getNumPartitions() != 1u /* has_repartition */,
                            output_relation.getNumPartitions()),
         file_pattern_(file_pattern),
-        field_terminator_(field_terminator),
-        process_escape_sequences_(process_escape_sequences),
+        options_(options),
         output_relation_(output_relation),
         output_destination_index_(output_destination_index),
         work_generated_(false) {}
@@ -166,8 +163,7 @@
                                                  const std::size_t text_segment_size);
 
   const std::string file_pattern_;
-  const char field_terminator_;
-  const bool process_escape_sequences_;
+  const BulkIoConfigurationPtr options_;
 
   const CatalogRelation &output_relation_;
   const QueryContext::insert_destination_id output_destination_index_;
diff --git a/relational_operators/WorkOrder.proto b/relational_operators/WorkOrder.proto
index 6dafbe0..aaf7929 100644
--- a/relational_operators/WorkOrder.proto
+++ b/relational_operators/WorkOrder.proto
@@ -21,7 +21,7 @@
 
 import "relational_operators/SortMergeRunOperator.proto";
 
-// Next tag: 26.
+// Next tag: 27.
 enum WorkOrderType {
   AGGREGATION = 1;
   BUILD_AGGREGATION_EXISTENCE_MAP = 23;
@@ -43,6 +43,7 @@
   SELECT = 15;
   SORT_MERGE_RUN = 16;
   SORT_RUN_GENERATION = 17;
+  TABLE_EXPORT_TO_STRING = 26;
   TABLE_GENERATOR = 18;
   TEXT_SCAN = 19;
   UNION_ALL = 24;
diff --git a/relational_operators/tests/TextScanOperator_unittest.cpp b/relational_operators/tests/TextScanOperator_unittest.cpp
index c92a3dd..9664fda 100644
--- a/relational_operators/tests/TextScanOperator_unittest.cpp
+++ b/relational_operators/tests/TextScanOperator_unittest.cpp
@@ -40,6 +40,7 @@
 #include "threading/ThreadIDBasedMap.hpp"
 #include "types/TypeFactory.hpp"
 #include "types/TypeID.hpp"
+#include "utility/BulkIoConfiguration.hpp"
 #include "utility/MemStream.hpp"
 
 #include "gflags/gflags.h"
@@ -191,11 +192,15 @@
   output_destination_proto->set_relation_id(relation_->getID());
   output_destination_proto->set_relational_op_index(kOpIndex);
 
+  std::unique_ptr<BulkIoConfiguration> options =
+      std::make_unique<BulkIoConfiguration>(BulkIoFormat::kText);
+  options->setDelimiter('\t');
+  options->setEscapeStrings(true);
+
   std::unique_ptr<TextScanOperator> text_scan_op(
       new TextScanOperator(kQueryId,
                            input_filename,
-                           '\t',
-                           true,
+                           BulkIoConfigurationPtr(options.release()),
                            *relation_,
                            output_destination_index));
 
diff --git a/utility/BulkIoConfiguration.cpp b/utility/BulkIoConfiguration.cpp
new file mode 100644
index 0000000..ce5ade5
--- /dev/null
+++ b/utility/BulkIoConfiguration.cpp
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ **/
+
+#include "utility/BulkIoConfiguration.hpp"
+
+#include "glog/logging.h"
+
+namespace quickstep {
+
+void BulkIoConfiguration::initializeDefaultParameters(const BulkIoFormat format) {
+  switch (format) {
+    case BulkIoFormat::kCsv: {
+      delimiter_ = ',';
+      escape_strings_ = false;
+      header_ = true;
+      quote_ = '"';
+      null_string_ = "";
+      break;
+    }
+    case BulkIoFormat::kText: {
+      delimiter_ = '\t';
+      escape_strings_ = true;
+      header_ = false;
+      quote_ = 0;
+      null_string_ = "\\N";
+      break;
+    }
+    default:
+      LOG(FATAL) << "Unexpected format in "
+                 << "BulkIoConfiguration::initializeDefaultParameters()";
+  }
+}
+
+}  // namespace quickstep
diff --git a/utility/BulkIoConfiguration.hpp b/utility/BulkIoConfiguration.hpp
new file mode 100644
index 0000000..ae8ccd2
--- /dev/null
+++ b/utility/BulkIoConfiguration.hpp
@@ -0,0 +1,198 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ **/
+
+#ifndef QUICKSTEP_UTILITY_BULK_IO_CONFIGURATION_HPP_
+#define QUICKSTEP_UTILITY_BULK_IO_CONFIGURATION_HPP_
+
+#include <memory>
+#include <string>
+
+#include "utility/Macros.hpp"
+
+#include "glog/logging.h"
+
+namespace quickstep {
+
+/**
+ * @brief External file format for bulk I/O.
+ */
+enum class BulkIoFormat {
+  kCsv = 0,
+  kText
+};
+
+class BulkIoConfiguration;
+typedef std::shared_ptr<const BulkIoConfiguration> BulkIoConfigurationPtr;
+
+/**
+ * @brief Detailed file format configuration for bulk I/O (i.e. COPY operations)
+ *        that moves data between Quickstep tables and external files.
+ */
+class BulkIoConfiguration {
+ public:
+  /**
+   * @brief Constructor.
+   *
+   * @param format External file format.
+   */
+  explicit BulkIoConfiguration(const BulkIoFormat format)
+      : format_(format) {
+    initializeDefaultParameters(format);
+  }
+
+  /**
+   * @brief Get the external file format.
+   *
+   * @return The external file format.
+   */
+  inline BulkIoFormat getFormat() const {
+    return format_;
+  }
+
+  /**
+   * @brief Get the external file format's name.
+   *
+   * @return The external file format's name.
+   */
+  inline std::string getFormatName() const {
+    switch (format_) {
+      case BulkIoFormat::kCsv:
+        return "CSV";
+      case BulkIoFormat::kText:
+        return "TEXT";
+      default:
+        break;
+    }
+    LOG(FATAL) << "Unexpected format in BulkIoConfiguration::getFormatName()";
+  }
+
+  /**
+   * @brief Get the delimiter character (which is the character that separates
+   *        attribute values in external files).
+   *
+   * @return The delimiter character.
+   */
+  inline char getDelimiter() const {
+    return delimiter_;
+  }
+
+  /**
+   * @brief Set the delimiter character.
+   *
+   * @param delimiter The delimiter character to set.
+   */
+  inline void setDelimiter(const char delimiter) {
+    delimiter_ = delimiter;
+  }
+
+  /**
+   * @brief Check whether to encode/decode between special characters and escape
+   *        sequences.
+   *
+   * @return Whether to encode/decode between special characters and escape
+   *         sequences.
+   */
+  inline bool escapeStrings() const {
+    return escape_strings_;
+  }
+
+  /**
+   * @brief Set whether to encode/decode between special characters and escape
+   *        sequences.
+   *
+   * @param escape_strings A bool value to set that indicates whether to
+   *        encode/decode between special characters and escape sequences.
+   */
+  inline void setEscapeStrings(const bool escape_strings) {
+    escape_strings_ = escape_strings;
+  }
+
+  /**
+   * @brief Check whether the external files contain headers (for CSV format only).
+   *
+   * @return Whether the external files contain headers.
+   */
+  inline bool hasHeader() const {
+    return header_;
+  }
+
+  /**
+   * @brief Set whether the external files contain headers (for CSV format only).
+   *
+   * @param header A bool value to set that indicates whether the external files
+   *        contain headers.
+   */
+  inline void setHeader(const bool header) {
+    header_ = header;
+  }
+
+  /**
+   * @brief Get the quote character (for CSV format only).
+   *
+   * @return The quote character.
+   */
+  inline char getQuoteCharacter() const {
+    return quote_;
+  }
+
+  /**
+   * @brief Set the quote character (for CSV format only).
+   *
+   * @param quote The quote character to set.
+   */
+  inline void setQuoteCharacter(const char quote) {
+    quote_ = quote;
+  }
+
+  /**
+   * @brief Get the string that represents a null value.
+   *
+   * @return The string that represents a null value.
+   */
+  inline const std::string& getNullString() const {
+    return null_string_;
+  }
+
+  /**
+   * @brief Set the string that represents a null value.
+   *
+   * @param null_string The string to set that represents a null value.
+   */
+  inline void setNullString(const std::string &null_string) {
+    null_string_ = null_string;
+  }
+
+ private:
+  // Initialize default options for CSV and TEXT formats.
+  void initializeDefaultParameters(const BulkIoFormat format);
+
+  const BulkIoFormat format_;
+
+  char delimiter_;
+  bool escape_strings_;
+  bool header_;
+  char quote_;
+  std::string null_string_;
+
+  DISALLOW_COPY_AND_ASSIGN(BulkIoConfiguration);
+};
+
+}  // namespace quickstep
+
+#endif  // QUICKSTEP_UTILITY_BULK_IO_CONFIGURATION_HPP_
diff --git a/utility/CMakeLists.txt b/utility/CMakeLists.txt
index b7a08f4..a832404 100644
--- a/utility/CMakeLists.txt
+++ b/utility/CMakeLists.txt
@@ -168,6 +168,7 @@
 add_library(quickstep_utility_BloomFilter_proto
             ${quickstep_utility_BloomFilter_proto_srcs}
             ${quickstep_utility_BloomFilter_proto_hdrs})
+add_library(quickstep_utility_BulkIoConfiguration BulkIoConfiguration.cpp BulkIoConfiguration.hpp)
 add_library(quickstep_utility_CalculateInstalledMemory CalculateInstalledMemory.cpp CalculateInstalledMemory.hpp)
 add_library(quickstep_utility_Cast ../empty_src.cpp Cast.hpp)
 add_library(quickstep_utility_CheckSnprintf ../empty_src.cpp CheckSnprintf.hpp)
@@ -249,6 +250,8 @@
 target_link_libraries(quickstep_utility_BarrieredReadWriteConcurrentBitVector
                       quickstep_utility_BitManipulation
                       quickstep_utility_Macros)
+target_link_libraries(quickstep_utility_BulkIoConfiguration
+                      quickstep_utility_Macros)
 target_link_libraries(quickstep_utility_DAG
                       glog
                       quickstep_utility_Macros)
@@ -353,6 +356,7 @@
                       quickstep_utility_BitVector
                       quickstep_utility_BloomFilter
                       quickstep_utility_BloomFilter_proto
+                      quickstep_utility_BulkIoConfiguration
                       quickstep_utility_CalculateInstalledMemory
                       quickstep_utility_Cast
                       quickstep_utility_CheckSnprintf
diff --git a/utility/ExecutionDAGVisualizer.cpp b/utility/ExecutionDAGVisualizer.cpp
index 7c319f5..8059ef3 100644
--- a/utility/ExecutionDAGVisualizer.cpp
+++ b/utility/ExecutionDAGVisualizer.cpp
@@ -55,12 +55,15 @@
 namespace quickstep {
 
 DEFINE_bool(visualize_execution_dag_partition_info, false,
-            "If true, display the operator partition info in the visualized execution plan DAG."
-            "Valid iif 'visualize_execution_dag' turns on.");
+            "If true, display the operator partition info in the visualized "
+            "execution plan DAG. Valid iff 'visualize_execution_dag' turns on.");
 
 ExecutionDAGVisualizer::ExecutionDAGVisualizer(const QueryPlan &plan) {
+  using ROEnumType =
+      typename std::underlying_type<RelationalOperator::OperatorType>::type;
+
   // Do not display these relational operators in the graph.
-  const std::unordered_set<typename std::underlying_type<RelationalOperator::OperatorType>::type> no_display_op_types =
+  const std::unordered_set<ROEnumType> no_display_op_types =
       { RelationalOperator::kDestroyAggregationState,
         RelationalOperator::kDestroyHash,
         RelationalOperator::kDropTable };