Hack in SelectOperator.
diff --git a/query_optimizer/ExecutionGenerator.cpp b/query_optimizer/ExecutionGenerator.cpp
index 3dcc825..037735f 100644
--- a/query_optimizer/ExecutionGenerator.cpp
+++ b/query_optimizer/ExecutionGenerator.cpp
@@ -492,21 +492,17 @@
   // Use the "simple" form of the selection operator (a pure projection that
   // doesn't require any expression evaluation or intermediate copies) if
   // possible.
-  std::unique_ptr<std::vector<attribute_id>> attributes(new std::vector<attribute_id>());
-  SelectOperator *op
-      = convertSimpleProjection(project_expressions_group_index, attributes.get())
-        ? new SelectOperator(*input_relation_info->relation,
-                             *output_relation,
-                             insert_destination_index,
-                             execution_predicate_index,
-                             attributes.release(),
-                             input_relation_info->isStoredRelation())
-        : new SelectOperator(*input_relation_info->relation,
-                             *output_relation,
-                             insert_destination_index,
-                             execution_predicate_index,
-                             project_expressions_group_index,
-                             input_relation_info->isStoredRelation());
+  std::vector<attribute_id> attributes;
+  convertSimpleProjection(project_expressions_group_index, &attributes);
+
+  SelectOperator *op =
+      new SelectOperator(*input_relation_info->relation,
+                         *output_relation,
+                         insert_destination_index,
+                         execution_predicate_index,
+                         move(attributes),
+                         project_expressions_group_index,
+                         input_relation_info->isStoredRelation());
 
   const QueryPlan::DAGNodeIndex select_index =
       execution_plan_->addRelationalOperator(op);
@@ -1080,12 +1076,12 @@
       findRelationInfoOutputByPhysical(physical_plan->selection());
 
   // Prepare the attributes, which are output columns of the selection relation.
-  std::unique_ptr<std::vector<attribute_id>> attributes(new std::vector<attribute_id>());
+  std::vector<attribute_id> attributes;
   for (E::AttributeReferencePtr attr_ref : physical_plan->selection()->getOutputAttributes()) {
     unique_ptr<const Scalar> attribute(attr_ref->concretize(attribute_substitution_map_));
 
     DCHECK_EQ(Scalar::kAttribute, attribute->getDataSource());
-    attributes->emplace_back(
+    attributes.emplace_back(
         static_cast<const ScalarAttribute*>(attribute.get())->getAttribute().getID());
   }
 
@@ -1101,7 +1097,8 @@
                          destination_relation,
                          insert_destination_index,
                          QueryContext::kInvalidPredicateId,
-                         attributes.release(),
+                         move(attributes),
+                         QueryContext::kInvalidScalarGroupId,
                          selection_relation_info->isStoredRelation());
 
   const QueryPlan::DAGNodeIndex insert_selection_index =
diff --git a/relational_operators/SelectOperator.cpp b/relational_operators/SelectOperator.cpp
index 3c2462d..e15f0c5 100644
--- a/relational_operators/SelectOperator.cpp
+++ b/relational_operators/SelectOperator.cpp
@@ -63,7 +63,7 @@
                                 input_block_id,
                                 predicate,
                                 simple_projection_,
-                                *simple_selection_,
+                                simple_selection_,
                                 selection,
                                 output_destination,
                                 storage_manager),
@@ -80,7 +80,7 @@
               input_relation_block_ids_[num_workorders_generated_],
               predicate,
               simple_projection_,
-              *simple_selection_,
+              simple_selection_,
               selection,
               output_destination,
               storage_manager),
@@ -121,7 +121,7 @@
   proto->SetExtension(serialization::SelectWorkOrder::block_id, block);
   proto->SetExtension(serialization::SelectWorkOrder::simple_projection, simple_projection_);
   if (simple_projection_) {
-    for (const attribute_id attr_id : *simple_selection_) {
+    for (const attribute_id attr_id : simple_selection_) {
       proto->AddExtension(serialization::SelectWorkOrder::simple_selection, attr_id);
     }
   }
diff --git a/relational_operators/SelectOperator.hpp b/relational_operators/SelectOperator.hpp
index c060c7f..b810c14 100644
--- a/relational_operators/SelectOperator.hpp
+++ b/relational_operators/SelectOperator.hpp
@@ -68,6 +68,8 @@
    * @param predicate_index The index of selection predicate in QueryContext.
    *        All tuples matching pred will be selected (or kInvalidPredicateId to
    *        select all tuples).
+   * @param selection A projection list of attribute IDs. The operator takes
+   *        ownership of selection.
    * @param selection_index The group index of Scalars in QueryContext, which
    *        will be evaluated to project input tuples.
    * @param input_relation_is_stored If input_relation is a stored relation and
@@ -78,55 +80,19 @@
                  const CatalogRelation &output_relation,
                  const QueryContext::insert_destination_id output_destination_index,
                  const QueryContext::predicate_id predicate_index,
+                 std::vector<attribute_id> &&selection,
                  const QueryContext::scalar_group_id selection_index,
-                 bool input_relation_is_stored)
+                 const bool input_relation_is_stored)
       : input_relation_(input_relation),
         output_relation_(output_relation),
         output_destination_index_(output_destination_index),
         predicate_index_(predicate_index),
         selection_index_(selection_index),
-        simple_selection_(nullptr),
+        simple_selection_(std::move(selection)),
         input_relation_block_ids_(input_relation_is_stored ? input_relation.getBlocksSnapshot()
                                                            : std::vector<block_id>()),
         num_workorders_generated_(0),
-        simple_projection_(false),
-        input_relation_is_stored_(input_relation_is_stored),
-        started_(false) {}
-
-  /**
-   * @brief Constructor for selection with simple projection of attributes.
-   *
-   * @note selection_index_ is invalid, and will not be used for projection.
-   *
-   * @param input_relation The relation to perform selection over.
-   * @param output_relation The output relation.
-   * @param output_destination_index The index of the InsertDestination in the
-   *        QueryContext to insert the selection results.
-   * @param selection A projection list of attribute IDs. The operator takes
-   *        ownership of selection.
-   * @param predicate_index The index of selection predicate in QueryContext.
-   *        All tuples matching pred will be selected (or kInvalidPredicateId to
-   *        select all tuples).
-   * @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.
-   **/
-  SelectOperator(const CatalogRelation &input_relation,
-                 const CatalogRelation &output_relation,
-                 const QueryContext::insert_destination_id output_destination_index,
-                 const QueryContext::predicate_id predicate_index,
-                 std::vector<attribute_id> *selection,
-                 bool input_relation_is_stored)
-      : input_relation_(input_relation),
-        output_relation_(output_relation),
-        output_destination_index_(output_destination_index),
-        predicate_index_(predicate_index),
-        selection_index_(QueryContext::kInvalidScalarGroupId),
-        simple_selection_(selection),
-        input_relation_block_ids_(input_relation_is_stored ? input_relation.getBlocksSnapshot()
-                                                           : std::vector<block_id>()),
-        num_workorders_generated_(0),
-        simple_projection_(true),
+        simple_projection_(!simple_selection_.empty()),
         input_relation_is_stored_(input_relation_is_stored),
         started_(false) {}
 
@@ -173,7 +139,7 @@
   const QueryContext::predicate_id predicate_index_;
 
   const QueryContext::scalar_group_id selection_index_;
-  std::unique_ptr<std::vector<attribute_id> > simple_selection_;
+  const std::vector<attribute_id> simple_selection_;
 
   std::vector<block_id> input_relation_block_ids_;
 
@@ -195,8 +161,8 @@
   /**
    * @brief Constructor.
    *
-   * @note Reference parameters simple_selection and selection are NOT owned by
-   *       this class and must remain valid until after execute() is called.
+   * @note Reference parameter selection is NOT owned by this class and must
+   *       remain valid until after execute() is called.
    *
    * @param input_relation The relation to perform selection over.
    * @param input_block_id The block id.
@@ -231,8 +197,8 @@
   /**
    * @brief Constructor for the distributed version.
    *
-   * @note Reference parameters simple_selection and selection are NOT owned by
-   *       this class and must remain valid until after execute() is called.
+   * @note Reference parameter selection is NOT owned by this class and must
+   *       remain valid until after execute() is called.
    *
    * @param input_relation The relation to perform selection over.
    * @param input_block_id The block id.
@@ -263,6 +229,7 @@
         selection_(selection),
         output_destination_(DCHECK_NOTNULL(output_destination)),
         storage_manager_(DCHECK_NOTNULL(storage_manager)) {}
+
   ~SelectWorkOrder() override {}
 
   /**
diff --git a/relational_operators/WorkOrderFactory.cpp b/relational_operators/WorkOrderFactory.cpp
index 73dc232..3dc96b8 100644
--- a/relational_operators/WorkOrderFactory.cpp
+++ b/relational_operators/WorkOrderFactory.cpp
@@ -503,11 +503,13 @@
         }
       }
 
+      /*
       if (proto.GetExtension(serialization::SelectWorkOrder::simple_projection) ==
               query_context.isValidScalarGroupId(
                   proto.GetExtension(serialization::SelectWorkOrder::selection_index))) {
         return false;
       }
+      */
 
       return proto.HasExtension(serialization::SelectWorkOrder::insert_destination_index)
           && query_context.isValidInsertDestinationId(