   else if(std::is_same<col_type,double>::value) gdf_col_type = GDF_FLOAT64;
 
   // Fill gdf_column structure
-  gdf_column the_column;
-  the_column.data = device_vector.data().get();
-  the_column.valid = nullptr;
-  the_column.size = device_vector.size();
-  the_column.dtype = gdf_col_type;
+  std::unique_ptr<gdf_column> the_column{new gdf_column};
+  the_column->data = device_vector.data().get();
+  the_column->valid = nullptr;
+  the_column->size = device_vector.size();
+  the_column->dtype = gdf_col_type;
   gdf_dtype_extra_info extra_info;
   extra_info.time_unit = TIME_UNIT_NONE;
-  the_column.dtype_info = extra_info;
+  the_column->dtype_info = extra_info;
 
   return the_column;
 }

  //gdf_error gdf_multi_left_join_generic(int num_cols, gdf_column **leftcol, gdf_column **rightcol, gdf_join_result_type **out_result)
};

template<join_kind join_type, typename tuple_type>
struct TestParameters
{
  const static join_kind join_method{join_type};
  using multi_column_t = tuple_type;
};


template <class test_parameters>
struct InnerJoinTest : public testing::Test
{
  const join_kind join_method = test_parameters::join_method;

  // multi_column_t is a tuple of vectors. The number of vectors in the tuple
  // determines the number of columns to be joined, and the value_type of each
  // vector determiens the data type of the column
  using multi_column_t = typename test_parameters::multi_column_t;
  multi_column_t left_columns;
  multi_column_t right_columns;

  // Containers for the gdf_columns that will be used in the gdf_join functions
  std::vector<std::unique_ptr<gdf_column>> gdf_left_columns;
  std::vector<std::unique_ptr<gdf_column>> gdf_right_columns;

  InnerJoinTest()
  {
    // Use constant seed so the psuedo-random order is the same each time
    // Each time the class is constructed a new constant seed is used
    static size_t number_of_instantiations{0};
    std::srand(number_of_instantiations++);
  }

  ~InnerJoinTest()
  {
  }

  void create_input( size_t left_column_length, size_t left_column_range,
                     size_t right_column_length, size_t right_column_range,
                     bool print = false)
  {
    initialize_tuple(left_columns, left_column_length, left_column_range); 
    initialize_tuple(right_columns, right_column_length, right_column_range); 

    if(print)
