23 #ifndef QUERYENGINE_RESULTSET_H
24 #define QUERYENGINE_RESULTSET_H
98 using pointer = std::vector<TargetValue>*;
118 throw std::runtime_error(
"current row buffer iteration index is undefined");
133 bool translate_strings,
148 class TSerializedRows;
155 using Comparator = std::function<bool(const PermutationIdx, const PermutationIdx)>;
162 ResultSet(
const std::vector<TargetInfo>& targets,
165 const std::shared_ptr<RowSetMemoryOwner> row_set_mem_owner,
166 const unsigned block_size,
167 const unsigned grid_size);
169 ResultSet(
const std::vector<TargetInfo>& targets,
170 const std::vector<ColumnLazyFetchInfo>& lazy_fetch_info,
171 const std::vector<std::vector<const int8_t*>>& col_buffers,
172 const std::vector<std::vector<int64_t>>& frag_offsets,
173 const std::vector<int64_t>& consistent_frag_sizes,
177 const std::shared_ptr<RowSetMemoryOwner> row_set_mem_owner,
178 const unsigned block_size,
179 const unsigned grid_size);
181 ResultSet(
const std::shared_ptr<const Analyzer::Estimator>,
186 ResultSet(
const std::string& explanation);
189 int64_t render_time_ms,
190 const std::shared_ptr<RowSetMemoryOwner> row_set_mem_owner);
202 bool translate_strings,
209 for (
size_t index = 0; index < from_logical_index; index++) {
218 return rowIterator(0, translate_strings, decimal_to_double);
227 const std::vector<int64_t>&,
228 std::shared_ptr<VarlenOutputInfo> =
nullptr)
const;
238 storage_->updateEntryCount(new_entry_count);
241 std::vector<TargetValue>
getNextRow(
const bool translate_strings,
246 std::vector<TargetValue>
getRowAt(
const size_t index)
const;
249 const size_t col_idx,
250 const bool translate_strings,
260 const std::vector<bool>& targets_to_skip = {})
const;
264 void sort(
const std::list<Analyzer::OrderEntry>& order_entries,
266 const Executor* executor);
309 size_t rowCount(
const bool force_parallel =
false)
const;
411 bool const translate_strings,
412 int64_t
const val)
const;
419 bool const translate_strings,
424 bool const translate_strings);
428 if (
storage_->query_mem_desc_.didOutputColumnar()) {
429 storage_->fillOneEntryColWise(entry);
431 storage_->fillOneEntryRowWise(entry);
437 void holdChunks(
const std::list<std::shared_ptr<Chunk_NS::Chunk>>& chunks) {
454 void serialize(TSerializedRows& serialized_rows)
const;
456 static std::unique_ptr<ResultSet>
unserialize(
const TSerializedRows& serialized_rows,
513 target_meta_info.end(),
552 int8_t* output_buffer,
553 const size_t output_buffer_size)
const;
582 auto is_lazy = [](
auto const& info) {
return info.is_lazily_fetched; };
587 auto is_lazy = [](
auto const& info) {
return info.is_lazily_fetched; };
598 const std::pair<std::vector<int32_t>, std::vector<std::string>>
604 template <
typename ENTRY_TYPE, QueryDescriptionType QUERY_TYPE,
bool COLUMNAR_FORMAT>
606 const size_t target_idx,
607 const size_t slot_idx)
const;
614 size_t const start_idx);
632 std::vector<TargetValue>
getNextRowImpl(
const bool translate_strings,
638 std::vector<TargetValue>
getRowAt(
const size_t index,
639 const bool translate_strings,
641 const bool fixup_count_distinct_pointers,
642 const std::vector<bool>& targets_to_skip = {})
const;
645 template <
typename ENTRY_TYPE>
647 const size_t target_idx,
648 const size_t slot_idx)
const;
650 template <
typename ENTRY_TYPE>
652 const size_t target_idx,
653 const size_t slot_idx)
const;
655 template <
typename ENTRY_TYPE>
657 const size_t target_idx,
658 const size_t slot_idx)
const;
660 template <
typename ENTRY_TYPE>
662 const size_t target_idx,
663 const size_t slot_idx)
const;
671 void radixSortOnGpu(
const std::list<Analyzer::OrderEntry>& order_entries)
const;
673 void radixSortOnCpu(
const std::list<Analyzer::OrderEntry>& order_entries)
const;
677 const bool float_argument_input);
680 int8_t* rowwise_target_ptr,
682 const size_t entry_buff_idx,
684 const size_t target_logical_idx,
685 const size_t slot_idx,
686 const bool translate_strings,
687 const bool decimal_to_double,
688 const bool fixup_count_distinct_pointers)
const;
691 const int8_t* keys_ptr,
693 const size_t local_entry_idx,
694 const size_t global_entry_idx,
696 const size_t target_logical_idx,
697 const size_t slot_idx,
698 const bool translate_strings,
699 const bool decimal_to_double)
const;
702 const int8_t compact_sz,
704 const size_t target_logical_idx,
705 const bool translate_strings,
706 const bool decimal_to_double,
707 const size_t entry_buff_idx)
const;
710 bool const translate_strings,
711 int64_t
const ival)
const;
714 const int8_t compact_sz1,
716 const int8_t compact_sz2,
718 const size_t target_logical_idx,
719 const bool translate_strings,
720 const size_t entry_buff_idx)
const;
732 const size_t slot_idx,
734 const size_t target_logical_idx,
735 const size_t entry_buff_idx)
const;
744 const size_t str_len)
const;
747 const size_t target_logical_idx,
753 std::pair<size_t, size_t>
getStorageIndex(
const size_t entry_idx)
const;
755 const std::vector<const int8_t*>&
getColumnFrag(
const size_t storge_idx,
756 const size_t col_logical_idx,
757 int64_t& global_idx)
const;
782 const size_t entry_idx,
783 const size_t target_logical_idx,
789 const size_t entry_idx)
const {
812 const size_t entry_idx,
813 const size_t target_logical_idx,
824 template <
typename BUFFER_ITERATOR_TYPE>
831 const Executor* executor,
832 const bool single_threaded)
871 const Executor* executor,
872 const bool single_threaded) {
876 order_entries,
this, permutation, executor, single_threaded)](
878 return rsc(lhs, rhs);
882 order_entries,
this, permutation, executor, single_threaded)](
884 return rsc(lhs, rhs);
897 void parallelTop(
const std::list<Analyzer::OrderEntry>& order_entries,
899 const Executor* executor);
901 void baselineSort(
const std::list<Analyzer::OrderEntry>& order_entries,
903 const Executor* executor);
906 const std::list<Analyzer::OrderEntry>& order_entries,
908 const Executor* executor);
921 std::vector<std::string>& varlen_bufer)
const;
938 mutable std::unique_ptr<ResultSetStorage>
storage_;
951 std::list<std::shared_ptr<Chunk_NS::Chunk>>
chunks_;
1025 ResultSet*
reduce(std::vector<ResultSet*>&,
const size_t executor_id);
1032 std::shared_ptr<ResultSet>
rs_;
1040 namespace result_set {
1050 #endif // QUERYENGINE_RESULTSET_H
void setSeparateVarlenStorageValid(const bool val)
void setGeoReturnType(const GeoReturnType val)
void serializeVarlenAggColumn(int8_t *buf, std::vector< std::string > &varlen_bufer) const
std::mutex row_iteration_mutex_
void setUseSpeculativeTopNSort(bool value)
InternalTargetValue getColumnInternal(const int8_t *buff, const size_t entry_idx, const size_t target_logical_idx, const StorageLookupResult &storage_lookup_result) const
void syncEstimatorBuffer() const
void holdChunks(const std::list< std::shared_ptr< Chunk_NS::Chunk >> &chunks)
const QueryMemoryDescriptor & getQueryMemDesc() const
void setQueryPlanHash(const QueryPlanHash query_plan)
robin_hood::unordered_set< int64_t > CountDistinctSet
int64_t executor_queue_time
std::pair< size_t, size_t > getStorageIndex(const size_t entry_idx) const
std::shared_ptr< RowSetMemoryOwner > getRowSetMemOwner() const
bool isValidationOnlyRes() const
bool didOutputColumnar() const
void setValidationOnlyRes()
PermutationView initPermutationBuffer(PermutationView permutation, PermutationIdx const begin, PermutationIdx const end) const
bool for_validation_only_
std::ptrdiff_t difference_type
ENTRY_TYPE getRowWisePerfectHashEntryAt(const size_t row_idx, const size_t target_idx, const size_t slot_idx) const
void create_active_buffer_set(CountDistinctSet &count_distinct_active_buffer_set) const
void setEntryCount(const size_t val)
double decimal_to_double(const SQLTypeInfo &otype, int64_t oval)
static ScalarTargetValue nullScalarTargetValue(SQLTypeInfo const &, bool const translate_strings)
const ApproxQuantileBuffers approx_quantile_materialized_buffers_
AppendedStorage appended_storage_
ENTRY_TYPE getColumnarPerfectHashEntryAt(const size_t row_idx, const size_t target_idx, const size_t slot_idx) const
GeoReturnType geo_return_type_
const BufferIteratorType buffer_itr_
StringDictionaryProxy * getStringDictionaryProxy(const shared::StringDictKey &dict_key) const
Utility functions for easy access to the result set buffers.
std::shared_ptr< ResultSet > rs_
Calculate approximate median and general quantiles, based on "Computing Extremely Accurate Quantiles ...
const Executor * executor_
std::vector< std::string > SerializedVarlenBufferStorage
void initializeStorage() const
std::optional< bool > can_use_speculative_top_n_sort
QueryDescriptionType getQueryDescriptionType() const
ResultSetRowIterator(const ResultSet *rs, bool translate_strings, bool decimal_to_double)
size_t getNumColumnsLazyFetched() const
void unserializeCountDistinctColumns(const TSerializedRows &)
ApproxQuantileBuffers materializeApproxQuantileColumns() const
std::vector< TargetValue > getNextRow(const bool translate_strings, const bool decimal_to_double) const
static bool isNull(const SQLTypeInfo &ti, const InternalTargetValue &val, const bool float_argument_input)
QueryMemoryDescriptor query_mem_desc_
const std::vector< TargetInfo > & getTargetInfos() const
std::optional< size_t > first_dict_encoded_idx(std::vector< TargetInfo > const &)
std::unique_ptr< ResultSetStorage > storage_
void setKernelQueueTime(const int64_t kernel_queue_time)
bool operator==(const ResultSetRowIterator &other) const
std::string getExplanation() const
High-level representation of SQL values.
ENTRY_TYPE getEntryAt(const size_t row_idx, const size_t target_idx, const size_t slot_idx) const
size_t rowCount(const bool force_parallel=false) const
Returns the number of valid entries in the result set (i.e that will be returned from the SQL query o...
ResultSetRowIterator(const ResultSet *rs)
std::shared_ptr< ResultSet > ResultSetPtr
TargetValue makeGeoTargetValue(const int8_t *geo_target_ptr, const size_t slot_idx, const TargetInfo &target_info, const size_t target_logical_idx, const size_t entry_buff_idx) const
const bool single_threaded_
TargetValue getTargetValueFromBufferRowwise(int8_t *rowwise_target_ptr, int8_t *keys_ptr, const size_t entry_buff_idx, const TargetInfo &target_info, const size_t target_logical_idx, const size_t slot_idx, const bool translate_strings, const bool decimal_to_double, const bool fixup_count_distinct_pointers) const
void keepFirstN(const size_t n)
std::vector< std::shared_ptr< std::list< ChunkIter > > > chunk_iters_
const ResultSet * result_set_
void addCompilationQueueTime(const int64_t compilation_queue_time)
std::vector< std::vector< double >> ApproxQuantileBuffers
void parallelTop(const std::list< Analyzer::OrderEntry > &order_entries, const size_t top_n, const Executor *executor)
void serialize(TSerializedRows &serialized_rows) const
std::vector< SerializedVarlenBufferStorage > serialized_varlen_buffer_
int64_t lazyReadInt(const int64_t ival, const size_t target_logical_idx, const StorageLookupResult &storage_lookup_result) const
bool operator!=(const ResultSetRowIterator &other) const
OneIntegerColumnRow getOneColRow(const size_t index) const
static bool isNullIval(SQLTypeInfo const &, bool const translate_strings, int64_t const ival)
unsigned getBlockSize() const
TargetValue getTargetValueFromBufferColwise(const int8_t *col_ptr, const int8_t *keys_ptr, const QueryMemoryDescriptor &query_mem_desc, const size_t local_entry_idx, const size_t global_entry_idx, const TargetInfo &target_info, const size_t target_logical_idx, const size_t slot_idx, const bool translate_strings, const bool decimal_to_double) const
void setInputTableKeys(std::unordered_set< size_t > &&intput_table_keys)
void rewriteVarlenAggregates(ResultSet *)
std::vector< int64_t > materializeCountDistinctColumn(const Analyzer::OrderEntry &order_entry) const
ApproxQuantileBuffers::value_type materializeApproxQuantileColumn(const Analyzer::OrderEntry &order_entry) const
ResultSetRowIterator rowIterator(size_t from_logical_index, bool translate_strings, bool decimal_to_double) const
std::atomic< int64_t > cached_row_count_
const bool isPermutationBufferEmpty() const
ScalarTargetValue makeStringTargetValue(SQLTypeInfo const &chosen_type, bool const translate_strings, int64_t const ival) const
size_t parallelRowCount() const
const size_t key_bytes_with_padding_
bool areAnyColumnsLazyFetched() const
const ResultSet * result_set_
std::vector< TargetValue > getRowAtNoTranslations(const size_t index, const std::vector< bool > &targets_to_skip={}) const
const ResultSet * result_set_
void radixSortOnCpu(const std::list< Analyzer::OrderEntry > &order_entries) const
bool definitelyHasNoRows() const
ColumnWiseTargetAccessor(const ResultSet *result_set)
bool use_parallel_algorithms(const ResultSet &rows)
bool isZeroCopyColumnarConversionPossible(size_t column_idx) const
std::input_iterator_tag iterator_category
int8_t * getHostEstimatorBuffer() const
InternalTargetValue getVarlenOrderEntry(const int64_t str_ptr, const size_t str_len) const
const std::vector< TargetInfo > targets_
void invalidateCachedRowCount() const
std::shared_ptr< RowSetMemoryOwner > row_set_mem_owner_
const Executor * getExecutor() const
void setExecTime(const long exec_time)
const ResultSetStorage * allocateStorage() const
std::string toString() const
std::list< std::shared_ptr< Chunk_NS::Chunk > > chunks_
std::unordered_set< size_t > getInputTableKeys() const
QueryExecutionTimings timings_
const ResultSet * result_set_
void sort(const std::list< Analyzer::OrderEntry > &order_entries, size_t top_n, const Executor *executor)
DEVICE auto copy(ARGS &&...args)
void setQueueTime(const int64_t queue_time)
void dropFirstN(const size_t n)
std::vector< std::vector< int8_t > > literal_buffers_
std::vector< std::vector< TargetOffsets > > offsets_for_storage_
bool canUseFastBaselineSort(const std::list< Analyzer::OrderEntry > &order_entries, const size_t top_n)
void setTargetMetaInfo(const std::vector< TargetMetaInfo > &target_meta_info)
std::unordered_set< size_t > input_table_keys_
const std::list< Analyzer::OrderEntry > & order_entries_
int64_t kernel_queue_time
int64_t compilation_queue_time
std::vector< TargetValue > & reference
std::vector< PermutationIdx > Permutation
std::tuple< std::vector< bool >, size_t > getSingleSlotTargetBitmap() const
ResultSetRowIterator & operator++(void)
ScalarTargetValue convertToScalarTargetValue(SQLTypeInfo const &, bool const translate_strings, int64_t const val) const
std::shared_ptr< ResultSet > getOwnResultSet()
StorageLookupResult findStorage(const size_t entry_idx) const
const long getExecTime() const
Comparator createComparator(const std::list< Analyzer::OrderEntry > &order_entries, const PermutationView permutation, const Executor *executor, const bool single_threaded)
An AbstractBuffer is a unit of data management for a data manager.
const PermutationView permutation_
const int8_t getPaddedSlotWidthBytes(const size_t slot_idx) const
value_type operator*() const
RowWiseTargetAccessor(const ResultSet *result_set)
void copyColumnIntoBuffer(const size_t column_idx, int8_t *output_buffer, const size_t output_buffer_size) const
RowSortException(const std::string &cause)
std::function< bool(const PermutationIdx, const PermutationIdx)> Comparator
static double calculateQuantile(quantile::TDigest *const t_digest)
const bool isEstimator() const
const VarlenOutputInfo * getVarlenOutputInfo(const size_t entry_idx) const
void fixupCountDistinctPointers()
void radixSortOnGpu(const std::list< Analyzer::OrderEntry > &order_entries) const
const ResultSetStorage * getStorage() const
QueryDescriptionType getQueryDescriptionType() const
const std::pair< std::vector< int32_t >, std::vector< std::string > > getUniqueStringsForDictEncodedTargetCol(const size_t col_idx) const
Data_Namespace::DataMgr * data_mgr_
Basic constructors and methods of the row set interface.
int64_t getQueueTime() const
std::optional< bool > canUseSpeculativeTopNSort() const
ModeBuffers::value_type materializeModeColumn(const Analyzer::OrderEntry &order_entry) const
std::vector< TargetValue > getRowAt(const size_t index) const
Executor(const ExecutorId id, Data_Namespace::DataMgr *data_mgr, const size_t block_size_x, const size_t grid_size_x, const size_t max_gpu_slab_size, const std::string &debug_dir, const std::string &debug_file)
void fillOneEntry(const std::vector< int64_t > &entry)
void updateStorageEntryCount(const size_t new_entry_count)
void serializeProjection(TSerializedRows &serialized_rows) const
ResultSetRowIterator operator++(int)
void invalidateResultSetChunks()
const std::shared_ptr< const Analyzer::Estimator > estimator_
SQLTypeInfo getColType(const size_t col_idx) const
GeoReturnType getGeoReturnType() const
void holdChunkIterators(const std::shared_ptr< std::list< ChunkIter >> chunk_iters)
std::tuple< std::vector< bool >, size_t > getSupportedSingleSlotTargetBitmap() const
ExecutorDeviceType getDeviceType() const
const int8_t * getColumnarBuffer(size_t column_idx) const
ResultSetComparator(const std::list< Analyzer::OrderEntry > &order_entries, const ResultSet *result_set, const PermutationView permutation, const Executor *executor, const bool single_threaded)
size_t get_row_bytes(const QueryMemoryDescriptor &query_mem_desc)
void eachCellInColumn(RowIterationState &, CellCallback const &)
std::vector< TargetValue > value_type
bool isGeoColOnGpu(const size_t col_idx) const
std::vector< TargetMetaInfo > target_meta_info_
const QueryPlanHash getQueryPlanHash()
void initializeOffsetsForStorage()
const int8_t * get_rowwise_ptr(const int8_t *buff, const size_t entry_idx) const
size_t getNDVEstimator() const
std::vector< std::vector< std::vector< const int8_t * > > > col_buffers_
bool isRowAtEmpty(const size_t index) const
const int8_t getPaddedSlotWidthBytes(const size_t slot_idx) const
size_t entryCount() const
Returns the number of entries the result set is allocated to hold.
const std::vector< std::string > getStringDictionaryPayloadCopy(const shared::StringDictKey &dict_key) const
static QueryMemoryDescriptor fixupQueryMemoryDescriptor(const QueryMemoryDescriptor &)
std::string typeName(const T *v)
size_t rowCountImpl(const bool force_parallel) const
TargetValue makeTargetValue(const int8_t *ptr, const int8_t compact_sz, const TargetInfo &target_info, const size_t target_logical_idx, const bool translate_strings, const bool decimal_to_double, const size_t entry_buff_idx) const
void baselineSort(const std::list< Analyzer::OrderEntry > &order_entries, const size_t top_n, const Executor *executor)
size_t getCurrentRowBufferIndex() const
const Permutation & getPermutationBuffer() const
void append(ResultSet &that)
std::string summaryToString() const
std::vector< std::vector< int64_t > > consistent_frag_sizes_
int8_t * host_estimator_buffer_
bool didOutputColumnar() const
std::string getString(SQLTypeInfo const &, int64_t const ival) const
const ExecutorDeviceType device_type_
const bool hasValidBuffer() const
std::vector< TargetValue > getNextRowImpl(const bool translate_strings, const bool decimal_to_double) const
const bool isCached() const
static PermutationView topPermutation(PermutationView, const size_t n, const Comparator &)
size_t getCurrentRowBufferIndex() const
void holdLiterals(std::vector< int8_t > &literal_buff)
bool g_enable_watchdog false
#define DEBUG_TIMER(name)
size_t getBufferSizeBytes(const ExecutorDeviceType device_type) const
int8_t * getDeviceEstimatorBuffer() const
std::vector< ColumnLazyFetchInfo > lazy_fetch_info_
QueryPlanHash query_plan_
Estimators to be used when precise cardinality isn't useful.
int64_t getDistinctBufferRefFromBufferRowwise(int8_t *rowwise_target_ptr, const TargetInfo &target_info) const
std::vector< std::vector< std::vector< int64_t > > > frag_offsets_
bool operator()(const PermutationIdx lhs, const PermutationIdx rhs) const
void doBaselineSort(const ExecutorDeviceType device_type, const std::list< Analyzer::OrderEntry > &order_entries, const size_t top_n, const Executor *executor)
void materializeCountDistinctColumns()
bool separate_varlen_storage_valid_
boost::variant< ScalarTargetValue, ArrayTargetValue, GeoTargetValue, GeoTargetValuePtr > TargetValue
std::vector< TargetValue > getNextRowUnlocked(const bool translate_strings, const bool decimal_to_double) const
std::vector< TargetValue > * pointer
bool isEmpty() const
Returns a boolean signifying whether there are valid entries in the result set.
const std::vector< int64_t > & getTargetInitVals() const
std::vector< size_t > getSlotIndicesForTargetIndices() const
unsigned getGridSize() const
bool any_of(std::vector< Analyzer::Expr * > const &target_exprs)
size_t advanceCursorToNextEntry() const
ResultSetRowIterator rowIterator(bool translate_strings, bool decimal_to_double) const
BUFFER_ITERATOR_TYPE BufferIteratorType
ENTRY_TYPE getColumnarBaselineEntryAt(const size_t row_idx, const size_t target_idx, const size_t slot_idx) const
Data_Namespace::DataMgr * getDataManager() const
std::vector< std::vector< int64_t > > count_distinct_materialized_buffers_
Data_Namespace::AbstractBuffer * device_estimator_buffer_
InternalTargetValue getColumnInternal(const int8_t *buff, const size_t entry_idx, const size_t target_logical_idx, const StorageLookupResult &storage_lookup_result) const
bool isLessThan(SQLTypeInfo const &, int64_t const lhs, int64_t const rhs) const
std::vector< std::vector< TargetOffsets > > offsets_for_storage_
std::vector< TargetMetaInfo > getTargetMetaInfo()
void translateDictEncodedColumns(std::vector< TargetInfo > const &, size_t const start_idx)
void initializeOffsetsForStorage()
bool global_entry_idx_valid_
bool can_use_parallel_algorithms(const ResultSet &rows)
int64_t getRenderTime() const
ResultSet(const std::vector< TargetInfo > &targets, const ExecutorDeviceType device_type, const QueryMemoryDescriptor &query_mem_desc, const std::shared_ptr< RowSetMemoryOwner > row_set_mem_owner, const unsigned block_size, const unsigned grid_size)
void setCachedRowCount(const size_t row_count) const
bool isDirectColumnarConversionPossible() const
size_t get_key_bytes_rowwise(const QueryMemoryDescriptor &query_mem_desc)
FORCE_INLINE HOST DEVICE T align_to_int64(T addr)
ModeBuffers materializeModeColumns() const
TargetValue makeVarlenTargetValue(const int8_t *ptr1, const int8_t compact_sz1, const int8_t *ptr2, const int8_t compact_sz2, const TargetInfo &target_info, const size_t target_logical_idx, const bool translate_strings, const size_t entry_buff_idx) const
void serializeCountDistinctColumns(TSerializedRows &) const
const ResultSetStorage * storage_ptr
ResultSet * reduce(std::vector< ResultSet * > &, const size_t executor_id)
const ModeBuffers mode_buffers_
std::vector< std::unique_ptr< ResultSetStorage >> AppendedStorage
const std::vector< const int8_t * > & getColumnFrag(const size_t storge_idx, const size_t col_logical_idx, int64_t &global_idx) const
const Executor * getExecutor() const
size_t binSearchRowCount() const
ChunkStats getTableFunctionChunkStats(const size_t target_idx) const
const std::vector< ColumnLazyFetchInfo > & getLazyFetchInfo() const
ENTRY_TYPE getRowWiseBaselineEntryAt(const size_t row_idx, const size_t target_idx, const size_t slot_idx) const
std::vector< std::vector< int64_t >> ModeBuffers
boost::variant< int64_t, double, float, NullableString > ScalarTargetValue
static std::unique_ptr< ResultSet > unserialize(const TSerializedRows &serialized_rows, const Executor *)
const size_t fixedup_entry_idx