OmniSciDB  8fa3bf436f
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
HashJoinRuntime.h
Go to the documentation of this file.
1 /*
2  * Copyright 2017 MapD Technologies, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*
18  * @file HashJoinRuntime.h
19  * @author Alex Suhan <alex@mapd.com>
20  *
21  * Copyright (c) 2015 MapD Technologies, Inc. All rights reserved.
22  */
23 
24 #ifndef QUERYENGINE_HASHJOINRUNTIME_H
25 #define QUERYENGINE_HASHJOINRUNTIME_H
26 
27 #include <cstddef>
28 #include <cstdint>
29 #include <vector>
30 #include "../../../Shared/SqlTypesLayout.h"
31 #include "../../../Shared/sqltypes.h"
32 
33 #ifdef __CUDACC__
34 #include "../../DecodersImpl.h"
35 #else
36 #include "../../RuntimeFunctions.h"
37 #endif
38 #include "../../../Shared/funcannotations.h"
39 
40 struct GenericKeyHandler;
41 struct OverlapsKeyHandler;
42 
43 struct HashEntryInfo {
44  alignas(sizeof(int64_t)) size_t hash_entry_count;
45  alignas(sizeof(int64_t)) int64_t bucket_normalization;
46 
47  inline size_t getNormalizedHashEntryCount() const {
49  auto modulo_res = hash_entry_count % static_cast<size_t>(bucket_normalization);
50  auto entry_count = hash_entry_count / static_cast<size_t>(bucket_normalization);
51  if (modulo_res) {
52  return entry_count + 1;
53  }
54  return entry_count;
55  }
56 
57  bool operator!() const { return !(this->getNormalizedHashEntryCount()); }
58 };
59 
61 
62 void init_hash_join_buff(int32_t* buff,
63  const int64_t entry_count,
64  const int32_t invalid_slot_val,
65  const int32_t cpu_thread_idx,
66  const int32_t cpu_thread_count);
67 
68 void init_hash_join_buff_on_device(int32_t* buff,
69  const int64_t entry_count,
70  const int32_t invalid_slot_val);
71 
72 void init_baseline_hash_join_buff_32(int8_t* hash_join_buff,
73  const int64_t entry_count,
74  const size_t key_component_count,
75  const bool with_val_slot,
76  const int32_t invalid_slot_val,
77  const int32_t cpu_thread_idx,
78  const int32_t cpu_thread_count);
79 
80 void init_baseline_hash_join_buff_64(int8_t* hash_join_buff,
81  const int64_t entry_count,
82  const size_t key_component_count,
83  const bool with_val_slot,
84  const int32_t invalid_slot_val,
85  const int32_t cpu_thread_idx,
86  const int32_t cpu_thread_count);
87 
88 void init_baseline_hash_join_buff_on_device_32(int8_t* hash_join_buff,
89  const int64_t entry_count,
90  const size_t key_component_count,
91  const bool with_val_slot,
92  const int32_t invalid_slot_val);
93 
94 void init_baseline_hash_join_buff_on_device_64(int8_t* hash_join_buff,
95  const int64_t entry_count,
96  const size_t key_component_count,
97  const bool with_val_slot,
98  const int32_t invalid_slot_val);
99 
100 enum ColumnType { SmallDate = 0, Signed = 1, Unsigned = 2, Double = 3 };
101 
102 struct JoinChunk {
103  const int8_t*
104  col_buff; // actually from AbstractBuffer::getMemoryPtr() via Chunk_NS::Chunk
105  size_t num_elems;
106 };
107 
108 struct JoinColumn {
109  const int8_t*
110  col_chunks_buff; // actually a JoinChunk* from ColumnFetcher::makeJoinColumn()
112  size_t num_chunks;
113  size_t num_elems;
114  size_t elem_sz;
115 };
116 
118  const size_t elem_sz;
119  const int64_t min_val;
120  const int64_t max_val;
121  const int64_t null_val;
122  const bool uses_bw_eq;
123  const int64_t translated_null_val;
125 };
126 
128  if (ti.is_date_in_days()) {
129  return SmallDate;
130  } else {
131  return is_unsigned_type(ti) ? Unsigned : Signed;
132  }
133 }
134 
137  bool is_double; // TODO(adb): assume float otherwise (?)
138 };
139 
140 int fill_hash_join_buff_bucketized(int32_t* buff,
141  const int32_t invalid_slot_val,
142  const JoinColumn join_column,
143  const JoinColumnTypeInfo type_info,
144  const void* sd_inner,
145  const void* sd_outer,
146  const int32_t cpu_thread_idx,
147  const int32_t cpu_thread_count,
148  const int64_t bucket_normalization);
149 
150 int fill_hash_join_buff(int32_t* buff,
151  const int32_t invalid_slot_val,
152  const JoinColumn join_column,
153  const JoinColumnTypeInfo type_info,
154  const void* sd_inner,
155  const void* sd_outer,
156  const int32_t cpu_thread_idx,
157  const int32_t cpu_thread_count);
158 
159 void fill_hash_join_buff_on_device(int32_t* buff,
160  const int32_t invalid_slot_val,
161  int* dev_err_buff,
162  const JoinColumn join_column,
163  const JoinColumnTypeInfo type_info);
165  const int32_t invalid_slot_val,
166  int* dev_err_buff,
167  const JoinColumn join_column,
168  const JoinColumnTypeInfo type_info,
169  const int64_t bucket_normalization);
170 
171 struct ShardInfo {
172  const size_t shard;
173  const size_t entry_count_per_shard;
174  const size_t num_shards;
175  const int device_count;
176 };
177 
178 void fill_hash_join_buff_on_device_sharded(int32_t* buff,
179  const int32_t invalid_slot_val,
180  int* dev_err_buff,
181  const JoinColumn join_column,
182  const JoinColumnTypeInfo type_info,
183  const ShardInfo shard_info);
184 
186  const int32_t invalid_slot_val,
187  int* dev_err_buff,
188  const JoinColumn join_column,
189  const JoinColumnTypeInfo type_info,
190  const ShardInfo shard_info,
191  const int64_t bucket_normalization);
192 
193 void fill_one_to_many_hash_table(int32_t* buff,
194  const HashEntryInfo hash_entry_info,
195  const int32_t invalid_slot_val,
196  const JoinColumn& join_column,
197  const JoinColumnTypeInfo& type_info,
198  const void* sd_inner_proxy,
199  const void* sd_outer_proxy,
200  const unsigned cpu_thread_count);
201 
202 void fill_one_to_many_hash_table_bucketized(int32_t* buff,
203  const HashEntryInfo hash_entry_info,
204  const int32_t invalid_slot_val,
205  const JoinColumn& join_column,
206  const JoinColumnTypeInfo& type_info,
207  const void* sd_inner_proxy,
208  const void* sd_outer_proxy,
209  const unsigned cpu_thread_count);
210 
212  const HashEntryInfo hash_entry_info,
213  const int32_t invalid_slot_val,
214  const JoinColumn& join_column,
215  const JoinColumnTypeInfo& type_info,
216  const ShardInfo& shard_info,
217  const void* sd_inner_proxy,
218  const void* sd_outer_proxy,
219  const unsigned cpu_thread_count);
220 
221 void fill_one_to_many_hash_table_on_device(int32_t* buff,
222  const HashEntryInfo hash_entry_info,
223  const int32_t invalid_slot_val,
224  const JoinColumn& join_column,
225  const JoinColumnTypeInfo& type_info);
226 
228  int32_t* buff,
229  const HashEntryInfo hash_entry_info,
230  const int32_t invalid_slot_val,
231  const JoinColumn& join_column,
232  const JoinColumnTypeInfo& type_info);
233 
235  const HashEntryInfo hash_entry_info,
236  const int32_t invalid_slot_val,
237  const JoinColumn& join_column,
238  const JoinColumnTypeInfo& type_info,
239  const ShardInfo& shard_info);
240 
241 int fill_baseline_hash_join_buff_32(int8_t* hash_buff,
242  const int64_t entry_count,
243  const int32_t invalid_slot_val,
244  const size_t key_component_count,
245  const bool with_val_slot,
246  const GenericKeyHandler* key_handler,
247  const int64_t num_elems,
248  const int32_t cpu_thread_idx,
249  const int32_t cpu_thread_count);
250 
251 int overlaps_fill_baseline_hash_join_buff_32(int8_t* hash_buff,
252  const int64_t entry_count,
253  const int32_t invalid_slot_val,
254  const size_t key_component_count,
255  const bool with_val_slot,
256  const OverlapsKeyHandler* key_handler,
257  const int64_t num_elems,
258  const int32_t cpu_thread_idx,
259  const int32_t cpu_thread_count);
260 
261 int fill_baseline_hash_join_buff_64(int8_t* hash_buff,
262  const int64_t entry_count,
263  const int32_t invalid_slot_val,
264  const size_t key_component_count,
265  const bool with_val_slot,
266  const GenericKeyHandler* key_handler,
267  const int64_t num_elems,
268  const int32_t cpu_thread_idx,
269  const int32_t cpu_thread_count);
270 
271 int overlaps_fill_baseline_hash_join_buff_64(int8_t* hash_buff,
272  const int64_t entry_count,
273  const int32_t invalid_slot_val,
274  const size_t key_component_count,
275  const bool with_val_slot,
276  const OverlapsKeyHandler* key_handler,
277  const int64_t num_elems,
278  const int32_t cpu_thread_idx,
279  const int32_t cpu_thread_count);
280 
281 void fill_baseline_hash_join_buff_on_device_32(int8_t* hash_buff,
282  const int64_t entry_count,
283  const int32_t invalid_slot_val,
284  const size_t key_component_count,
285  const bool with_val_slot,
286  int* dev_err_buff,
287  const GenericKeyHandler* key_handler,
288  const int64_t num_elems);
289 
290 void fill_baseline_hash_join_buff_on_device_64(int8_t* hash_buff,
291  const int64_t entry_count,
292  const int32_t invalid_slot_val,
293  const size_t key_component_count,
294  const bool with_val_slot,
295  int* dev_err_buff,
296  const GenericKeyHandler* key_handler,
297  const int64_t num_elems);
298 
300  int8_t* hash_buff,
301  const int64_t entry_count,
302  const int32_t invalid_slot_val,
303  const size_t key_component_count,
304  const bool with_val_slot,
305  int* dev_err_buff,
306  const OverlapsKeyHandler* key_handler,
307  const int64_t num_elems);
308 
310  int32_t* buff,
311  const int32_t* composite_key_dict,
312  const int64_t hash_entry_count,
313  const int32_t invalid_slot_val,
314  const size_t key_component_count,
315  const std::vector<JoinColumn>& join_column_per_key,
316  const std::vector<JoinColumnTypeInfo>& type_info_per_key,
317  const std::vector<JoinBucketInfo>& join_bucket_info,
318  const std::vector<const void*>& sd_inner_proxy_per_key,
319  const std::vector<const void*>& sd_outer_proxy_per_key,
320  const int32_t cpu_thread_count);
321 
323  int32_t* buff,
324  const int64_t* composite_key_dict,
325  const int64_t hash_entry_count,
326  const int32_t invalid_slot_val,
327  const size_t key_component_count,
328  const std::vector<JoinColumn>& join_column_per_key,
329  const std::vector<JoinColumnTypeInfo>& type_info_per_key,
330  const std::vector<JoinBucketInfo>& join_bucket_info,
331  const std::vector<const void*>& sd_inner_proxy_per_key,
332  const std::vector<const void*>& sd_outer_proxy_per_key,
333  const int32_t cpu_thread_count);
334 
336  int32_t* buff,
337  const int32_t* composite_key_dict,
338  const int64_t hash_entry_count,
339  const int32_t invalid_slot_val,
340  const size_t key_component_count,
341  const GenericKeyHandler* key_handler,
342  const int64_t num_elems);
343 
345  int32_t* buff,
346  const int64_t* composite_key_dict,
347  const int64_t hash_entry_count,
348  const int32_t invalid_slot_val,
349  const GenericKeyHandler* key_handler,
350  const int64_t num_elems);
351 
353  int32_t* buff,
354  const int64_t* composite_key_dict,
355  const int64_t hash_entry_count,
356  const int32_t invalid_slot_val,
357  const OverlapsKeyHandler* key_handler,
358  const int64_t num_elems);
359 
360 void approximate_distinct_tuples(uint8_t* hll_buffer_all_cpus,
361  const uint32_t b,
362  const size_t padded_size_bytes,
363  const std::vector<JoinColumn>& join_column_per_key,
364  const std::vector<JoinColumnTypeInfo>& type_info_per_key,
365  const int thread_count);
366 
368  uint8_t* hll_buffer_all_cpus,
369  std::vector<int32_t>& row_counts,
370  const uint32_t b,
371  const size_t padded_size_bytes,
372  const std::vector<JoinColumn>& join_column_per_key,
373  const std::vector<JoinColumnTypeInfo>& type_info_per_key,
374  const std::vector<JoinBucketInfo>& join_buckets_per_key,
375  const int thread_count);
376 
377 void approximate_distinct_tuples_on_device(uint8_t* hll_buffer,
378  const uint32_t b,
379  const GenericKeyHandler* key_handler,
380  const int64_t num_elems);
381 
382 void approximate_distinct_tuples_on_device_overlaps(uint8_t* hll_buffer,
383  const uint32_t b,
384  int32_t* row_counts_buffer,
385  const OverlapsKeyHandler* key_handler,
386  const int64_t num_elems);
387 
388 void compute_bucket_sizes_on_cpu(std::vector<double>& bucket_sizes_for_dimension,
389  const JoinColumn& join_column,
390  const JoinColumnTypeInfo& type_info,
391  const std::vector<double>& bucket_size_thresholds,
392  const int thread_count);
393 
394 void compute_bucket_sizes_on_device(double* bucket_sizes_buffer,
395  const JoinColumn* join_column,
396  const JoinColumnTypeInfo* type_info,
397  const double* bucket_size_thresholds);
398 
399 #endif // QUERYENGINE_HASHJOINRUNTIME_H
void fill_hash_join_buff_on_device_sharded(int32_t *buff, const int32_t invalid_slot_val, int *dev_err_buff, const JoinColumn join_column, const JoinColumnTypeInfo type_info, const ShardInfo shard_info)
const ColumnType column_type
const size_t num_shards
void init_baseline_hash_join_buff_32(int8_t *hash_join_buff, const int64_t entry_count, const size_t key_component_count, const bool with_val_slot, const int32_t invalid_slot_val, const int32_t cpu_thread_idx, const int32_t cpu_thread_count)
void fill_one_to_many_baseline_hash_table_64(int32_t *buff, const int64_t *composite_key_dict, const int64_t hash_entry_count, const int32_t invalid_slot_val, const size_t key_component_count, const std::vector< JoinColumn > &join_column_per_key, const std::vector< JoinColumnTypeInfo > &type_info_per_key, const std::vector< JoinBucketInfo > &join_bucket_info, const std::vector< const void * > &sd_inner_proxy_per_key, const std::vector< const void * > &sd_outer_proxy_per_key, const int32_t cpu_thread_count)
size_t num_elems
void fill_one_to_many_baseline_hash_table_on_device_32(int32_t *buff, const int32_t *composite_key_dict, const int64_t hash_entry_count, const int32_t invalid_slot_val, const size_t key_component_count, const GenericKeyHandler *key_handler, const int64_t num_elems)
void init_baseline_hash_join_buff_on_device_64(int8_t *hash_join_buff, const int64_t entry_count, const size_t key_component_count, const bool with_val_slot, const int32_t invalid_slot_val)
void overlaps_fill_one_to_many_baseline_hash_table_on_device_64(int32_t *buff, const int64_t *composite_key_dict, const int64_t hash_entry_count, const int32_t invalid_slot_val, const OverlapsKeyHandler *key_handler, const int64_t num_elems)
const size_t elem_sz
const int device_count
const int64_t null_val
void init_baseline_hash_join_buff_64(int8_t *hash_join_buff, const int64_t entry_count, const size_t key_component_count, const bool with_val_slot, const int32_t invalid_slot_val, const int32_t cpu_thread_idx, const int32_t cpu_thread_count)
void fill_one_to_many_hash_table_on_device_sharded(int32_t *buff, const HashEntryInfo hash_entry_info, const int32_t invalid_slot_val, const JoinColumn &join_column, const JoinColumnTypeInfo &type_info, const ShardInfo &shard_info)
std::vector< double > inverse_bucket_sizes_for_dimension
const int8_t * col_buff
#define CHECK_GT(x, y)
Definition: Logger.h:215
void overlaps_fill_baseline_hash_join_buff_on_device_64(int8_t *hash_buff, const int64_t entry_count, const int32_t invalid_slot_val, const size_t key_component_count, const bool with_val_slot, int *dev_err_buff, const OverlapsKeyHandler *key_handler, const int64_t num_elems)
void fill_hash_join_buff_on_device_bucketized(int32_t *buff, const int32_t invalid_slot_val, int *dev_err_buff, const JoinColumn join_column, const JoinColumnTypeInfo type_info, const int64_t bucket_normalization)
const size_t entry_count_per_shard
const int64_t translated_null_val
void compute_bucket_sizes_on_device(double *bucket_sizes_buffer, const JoinColumn *join_column, const JoinColumnTypeInfo *type_info, const double *bucket_size_thresholds)
void init_baseline_hash_join_buff_on_device_32(int8_t *hash_join_buff, const int64_t entry_count, const size_t key_component_count, const bool with_val_slot, const int32_t invalid_slot_val)
int fill_baseline_hash_join_buff_64(int8_t *hash_buff, const int64_t entry_count, const int32_t invalid_slot_val, const size_t key_component_count, const bool with_val_slot, const GenericKeyHandler *key_handler, const int64_t num_elems, const int32_t cpu_thread_idx, const int32_t cpu_thread_count)
void fill_one_to_many_hash_table_bucketized(int32_t *buff, const HashEntryInfo hash_entry_info, const int32_t invalid_slot_val, const JoinColumn &join_column, const JoinColumnTypeInfo &type_info, const void *sd_inner_proxy, const void *sd_outer_proxy, const unsigned cpu_thread_count)
void approximate_distinct_tuples(uint8_t *hll_buffer_all_cpus, const uint32_t b, const size_t padded_size_bytes, const std::vector< JoinColumn > &join_column_per_key, const std::vector< JoinColumnTypeInfo > &type_info_per_key, const int thread_count)
void fill_hash_join_buff_on_device(int32_t *buff, const int32_t invalid_slot_val, int *dev_err_buff, const JoinColumn join_column, const JoinColumnTypeInfo type_info)
size_t col_chunks_buff_sz
void fill_one_to_many_baseline_hash_table_on_device_64(int32_t *buff, const int64_t *composite_key_dict, const int64_t hash_entry_count, const int32_t invalid_slot_val, const GenericKeyHandler *key_handler, const int64_t num_elems)
void fill_one_to_many_hash_table_on_device(int32_t *buff, const HashEntryInfo hash_entry_info, const int32_t invalid_slot_val, const JoinColumn &join_column, const JoinColumnTypeInfo &type_info)
void compute_bucket_sizes_on_cpu(std::vector< double > &bucket_sizes_for_dimension, const JoinColumn &join_column, const JoinColumnTypeInfo &type_info, const std::vector< double > &bucket_size_thresholds, const int thread_count)
int64_t bucket_normalization
const size_t shard
size_t hash_entry_count
const int8_t * col_chunks_buff
void init_hash_join_buff_on_device(int32_t *buff, const int64_t entry_count, const int32_t invalid_slot_val)
const int64_t max_val
void fill_one_to_many_baseline_hash_table_32(int32_t *buff, const int32_t *composite_key_dict, const int64_t hash_entry_count, const int32_t invalid_slot_val, const size_t key_component_count, const std::vector< JoinColumn > &join_column_per_key, const std::vector< JoinColumnTypeInfo > &type_info_per_key, const std::vector< JoinBucketInfo > &join_bucket_info, const std::vector< const void * > &sd_inner_proxy_per_key, const std::vector< const void * > &sd_outer_proxy_per_key, const int32_t cpu_thread_count)
ColumnType
void approximate_distinct_tuples_overlaps(uint8_t *hll_buffer_all_cpus, std::vector< int32_t > &row_counts, const uint32_t b, const size_t padded_size_bytes, const std::vector< JoinColumn > &join_column_per_key, const std::vector< JoinColumnTypeInfo > &type_info_per_key, const std::vector< JoinBucketInfo > &join_buckets_per_key, const int thread_count)
void fill_one_to_many_hash_table(int32_t *buff, const HashEntryInfo hash_entry_info, const int32_t invalid_slot_val, const JoinColumn &join_column, const JoinColumnTypeInfo &type_info, const void *sd_inner_proxy, const void *sd_outer_proxy, const unsigned cpu_thread_count)
bool is_date_in_days() const
Definition: sqltypes.h:721
int overlaps_fill_baseline_hash_join_buff_64(int8_t *hash_buff, const int64_t entry_count, const int32_t invalid_slot_val, const size_t key_component_count, const bool with_val_slot, const OverlapsKeyHandler *key_handler, const int64_t num_elems, const int32_t cpu_thread_idx, const int32_t cpu_thread_count)
bool operator!() const
DEVICE void SUFFIX() init_hash_join_buff(int32_t *groups_buffer, const int64_t hash_entry_count, const int32_t invalid_slot_val, const int32_t cpu_thread_idx, const int32_t cpu_thread_count)
const int64_t min_val
DEVICE int SUFFIX() fill_hash_join_buff(int32_t *buff, const int32_t invalid_slot_val, const JoinColumn join_column, const JoinColumnTypeInfo type_info, const void *sd_inner_proxy, const void *sd_outer_proxy, const int32_t cpu_thread_idx, const int32_t cpu_thread_count)
int overlaps_fill_baseline_hash_join_buff_32(int8_t *hash_buff, const int64_t entry_count, const int32_t invalid_slot_val, const size_t key_component_count, const bool with_val_slot, const OverlapsKeyHandler *key_handler, const int64_t num_elems, const int32_t cpu_thread_idx, const int32_t cpu_thread_count)
size_t getNormalizedHashEntryCount() const
void approximate_distinct_tuples_on_device(uint8_t *hll_buffer, const uint32_t b, const GenericKeyHandler *key_handler, const int64_t num_elems)
ColumnType get_join_column_type_kind(const SQLTypeInfo &ti)
size_t num_chunks
void fill_baseline_hash_join_buff_on_device_32(int8_t *hash_buff, const int64_t entry_count, const int32_t invalid_slot_val, const size_t key_component_count, const bool with_val_slot, int *dev_err_buff, const GenericKeyHandler *key_handler, const int64_t num_elems)
void fill_baseline_hash_join_buff_on_device_64(int8_t *hash_buff, const int64_t entry_count, const int32_t invalid_slot_val, const size_t key_component_count, const bool with_val_slot, int *dev_err_buff, const GenericKeyHandler *key_handler, const int64_t num_elems)
void fill_one_to_many_hash_table_sharded_bucketized(int32_t *buff, const HashEntryInfo hash_entry_info, const int32_t invalid_slot_val, const JoinColumn &join_column, const JoinColumnTypeInfo &type_info, const ShardInfo &shard_info, const void *sd_inner_proxy, const void *sd_outer_proxy, const unsigned cpu_thread_count)
void fill_hash_join_buff_on_device_sharded_bucketized(int32_t *buff, const int32_t invalid_slot_val, int *dev_err_buff, const JoinColumn join_column, const JoinColumnTypeInfo type_info, const ShardInfo shard_info, const int64_t bucket_normalization)
void fill_one_to_many_hash_table_on_device_bucketized(int32_t *buff, const HashEntryInfo hash_entry_info, const int32_t invalid_slot_val, const JoinColumn &join_column, const JoinColumnTypeInfo &type_info)
DEVICE int SUFFIX() fill_hash_join_buff_bucketized(int32_t *buff, const int32_t invalid_slot_val, const JoinColumn join_column, const JoinColumnTypeInfo type_info, const void *sd_inner_proxy, const void *sd_outer_proxy, const int32_t cpu_thread_idx, const int32_t cpu_thread_count, const int64_t bucket_normalization)
size_t num_elems
const size_t g_maximum_conditions_to_coalesce
void approximate_distinct_tuples_on_device_overlaps(uint8_t *hll_buffer, const uint32_t b, int32_t *row_counts_buffer, const OverlapsKeyHandler *key_handler, const int64_t num_elems)
int fill_baseline_hash_join_buff_32(int8_t *hash_buff, const int64_t entry_count, const int32_t invalid_slot_val, const size_t key_component_count, const bool with_val_slot, const GenericKeyHandler *key_handler, const int64_t num_elems, const int32_t cpu_thread_idx, const int32_t cpu_thread_count)
bool is_unsigned_type(const SQLTypeInfo &ti)