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,
176 const int thread_idx,
178 const std::shared_ptr<RowSetMemoryOwner> row_set_mem_owner,
179 const unsigned block_size,
180 const unsigned grid_size);
182 ResultSet(
const std::shared_ptr<const Analyzer::Estimator>,
187 ResultSet(
const std::string& explanation);
190 int64_t render_time_ms,
191 const std::shared_ptr<RowSetMemoryOwner> row_set_mem_owner);
203 bool translate_strings,
210 for (
size_t index = 0; index < from_logical_index; index++) {
219 return rowIterator(0, translate_strings, decimal_to_double);
228 const std::vector<int64_t>&,
229 std::shared_ptr<VarlenOutputInfo> =
nullptr)
const;
239 storage_->updateEntryCount(new_entry_count);
242 std::vector<TargetValue>
getNextRow(
const bool translate_strings,
247 std::vector<TargetValue>
getRowAt(
const size_t index)
const;
250 const size_t col_idx,
251 const bool translate_strings,
261 const std::vector<bool>& targets_to_skip = {})
const;
265 void sort(
const std::list<Analyzer::OrderEntry>& order_entries,
268 const Executor* executor);
311 size_t rowCount(
const bool force_parallel =
false)
const;
414 bool const translate_strings,
415 int64_t
const val)
const;
422 bool const translate_strings,
427 bool const translate_strings);
431 if (
storage_->query_mem_desc_.didOutputColumnar()) {
432 storage_->fillOneEntryColWise(entry);
434 storage_->fillOneEntryRowWise(entry);
440 void holdChunks(
const std::list<std::shared_ptr<Chunk_NS::Chunk>>& chunks) {
457 void serialize(TSerializedRows& serialized_rows)
const;
459 static std::unique_ptr<ResultSet>
unserialize(
const TSerializedRows& serialized_rows,
516 target_meta_info.end(),
555 int8_t* output_buffer,
556 const size_t output_buffer_size)
const;
586 auto is_lazy = [](
auto const& info) {
return info.is_lazily_fetched; };
591 auto is_lazy = [](
auto const& info) {
return info.is_lazily_fetched; };
602 const std::pair<std::vector<int32_t>, std::vector<std::string>>
608 template <
typename ENTRY_TYPE, QueryDescriptionType QUERY_TYPE,
bool COLUMNAR_FORMAT>
610 const size_t target_idx,
611 const size_t slot_idx)
const;
618 size_t const start_idx);
640 std::vector<TargetValue>
getNextRowImpl(
const bool translate_strings,
646 std::vector<TargetValue>
getRowAt(
const size_t index,
647 const bool translate_strings,
649 const bool fixup_count_distinct_pointers,
650 const std::vector<bool>& targets_to_skip = {})
const;
653 template <
typename ENTRY_TYPE>
655 const size_t target_idx,
656 const size_t slot_idx)
const;
658 template <
typename ENTRY_TYPE>
660 const size_t target_idx,
661 const size_t slot_idx)
const;
663 template <
typename ENTRY_TYPE>
665 const size_t target_idx,
666 const size_t slot_idx)
const;
668 template <
typename ENTRY_TYPE>
670 const size_t target_idx,
671 const size_t slot_idx)
const;
679 void radixSortOnGpu(
const std::list<Analyzer::OrderEntry>& order_entries)
const;
681 void radixSortOnCpu(
const std::list<Analyzer::OrderEntry>& order_entries)
const;
685 const bool float_argument_input);
688 int8_t* rowwise_target_ptr,
690 const size_t entry_buff_idx,
692 const size_t target_logical_idx,
693 const size_t slot_idx,
694 const bool translate_strings,
695 const bool decimal_to_double,
696 const bool fixup_count_distinct_pointers)
const;
699 const int8_t* keys_ptr,
701 const size_t local_entry_idx,
702 const size_t global_entry_idx,
704 const size_t target_logical_idx,
705 const size_t slot_idx,
706 const bool translate_strings,
707 const bool decimal_to_double)
const;
710 const int8_t compact_sz,
712 const size_t target_logical_idx,
713 const bool translate_strings,
714 const bool decimal_to_double,
715 const size_t entry_buff_idx)
const;
718 bool const translate_strings,
719 int64_t
const ival)
const;
722 const int8_t compact_sz1,
724 const int8_t compact_sz2,
726 const size_t target_logical_idx,
727 const bool translate_strings,
728 const size_t entry_buff_idx)
const;
740 const size_t slot_idx,
742 const size_t target_logical_idx,
743 const size_t entry_buff_idx)
const;
752 const size_t str_len)
const;
755 const size_t target_logical_idx,
761 std::pair<size_t, size_t>
getStorageIndex(
const size_t entry_idx)
const;
763 const std::vector<const int8_t*>&
getColumnFrag(
const size_t storge_idx,
764 const size_t col_logical_idx,
765 int64_t& global_idx)
const;
790 const size_t entry_idx,
791 const size_t target_logical_idx,
797 const size_t entry_idx)
const {
820 const size_t entry_idx,
821 const size_t target_logical_idx,
832 template <
typename BUFFER_ITERATOR_TYPE>
839 const Executor* executor,
840 const bool single_threaded)
879 const Executor* executor,
880 const bool single_threaded) {
884 order_entries,
this, permutation, executor, single_threaded)](
886 return rsc(lhs, rhs);
890 order_entries,
this, permutation, executor, single_threaded)](
892 return rsc(lhs, rhs);
905 void parallelTop(
const std::list<Analyzer::OrderEntry>& order_entries,
907 const Executor* executor);
909 void baselineSort(
const std::list<Analyzer::OrderEntry>& order_entries,
912 const Executor* executor);
915 const std::list<Analyzer::OrderEntry>& order_entries,
917 const Executor* executor);
930 std::vector<std::string>& varlen_bufer)
const;
948 mutable std::unique_ptr<ResultSetStorage>
storage_;
961 std::list<std::shared_ptr<Chunk_NS::Chunk>>
chunks_;
1035 ResultSet*
reduce(std::vector<ResultSet*>&,
const size_t executor_id);
1042 std::shared_ptr<ResultSet>
rs_;
1050 namespace result_set {
1060 #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)
bool checkSlotUsesFlatBufferFormat(const size_t slot_idx) const
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.
void sort(const std::list< Analyzer::OrderEntry > &order_entries, size_t top_n, const ExecutorDeviceType device_type, const Executor *executor)
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_
void baselineSort(const std::list< Analyzer::OrderEntry > &order_entries, const size_t top_n, const ExecutorDeviceType device_type, const Executor *executor)
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_
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_
const size_t getColumnarBufferSize(size_t column_idx) const
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
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_
bool checkSlotUsesFlatBufferFormat(const size_t slot_idx) const
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