26 return makeExpr<Analyzer::ColumnVar>(
40 const std::unordered_set<InputColDescriptor>& aggregate,
41 const std::unordered_set<InputColDescriptor>& next_result)
const override {
43 result.insert(next_result.begin(), next_result.end());
58 const std::vector<std::shared_ptr<Analyzer::Expr>>& filter_expressions,
61 CollectInputColumnsVisitor input_columns_visitor;
62 std::list<std::shared_ptr<Analyzer::Expr>> quals;
63 std::unordered_set<InputColDescriptor> input_column_descriptors;
64 BindFilterToOutermostVisitor bind_filter_to_outermost;
65 for (
const auto& filter_expr : filter_expressions) {
66 input_column_descriptors = input_columns_visitor.aggregateResult(
67 input_column_descriptors, input_columns_visitor.visit(filter_expr.get()));
68 quals.push_back(bind_filter_to_outermost.visit(filter_expr.get()));
70 std::vector<InputDescriptor> input_descs;
71 std::list<std::shared_ptr<const InputColDescriptor>> input_col_descs;
72 for (
const auto& input_col_desc : input_column_descriptors) {
73 if (input_descs.empty()) {
74 input_descs.push_back(input_col_desc.getScanDesc());
76 CHECK(input_col_desc.getScanDesc() == input_descs.front());
78 input_col_descs.push_back(std::make_shared<const InputColDescriptor>(input_col_desc));
80 const auto count_expr =
99 CHECK_EQ(
size_t(1), table_infos.size());
100 const size_t total_rows_upper_bound = table_infos.front().info.getNumTuplesUpperBound();
103 filtered_result =
executor_->executeWorkUnit(
104 one,
true, table_infos, ra_exe_unit, co, eo,
cat_,
nullptr,
false, column_cache);
106 return {
false, 1.0, 0};
108 const auto count_row = filtered_result->getNextRow(
false,
false);
109 CHECK_EQ(
size_t(1), count_row.size());
110 const auto& count_tv = count_row.front();
111 const auto count_scalar_tv = boost::get<ScalarTargetValue>(&count_tv);
112 CHECK(count_scalar_tv);
113 const auto count_ptr = boost::get<int64_t>(count_scalar_tv);
115 const auto rows_passing = *count_ptr;
116 const auto rows_total = std::max(total_rows_upper_bound,
size_t(1));
117 return {
true,
static_cast<float>(rows_passing) / rows_total, total_rows_upper_bound};
128 const auto all_push_down_candidates =
132 std::vector<PushedDownFilterInfo> selective_push_down_candidates;
135 for (
const auto& candidate : all_push_down_candidates) {
137 if (selectivity.is_valid && selectivity.isFilterSelectiveEnough()) {
138 selective_push_down_candidates.push_back(candidate);
142 return selective_push_down_candidates;
150 const int64_t queue_time_ms) {
155 if (seq.
size() > 1 || !subqueries.empty()) {
177 for (
auto subquery : subqueries) {
180 const auto subquery_ra = subquery->getRelAlg();
184 subquery->setExecutionResult(std::make_shared<ExecutionResult>(
result));
191 for (
auto subquery : subqueries) {
194 const auto subquery_ra = subquery->getRelAlg();
198 subquery->setExecutionResult(std::make_shared<ExecutionResult>(
result));
208 const std::vector<InputTableInfo>& table_infos) {
209 if (table_infos.size() < 2) {
214 std::unordered_set<int> table_ids;
215 for (
auto ti : table_infos) {
216 if (table_ids.find(ti.table_id) == table_ids.end()) {
217 table_ids.insert(ti.table_id);
236 const std::vector<size_t>& input_permutation,
237 const std::vector<size_t>& left_deep_join_input_sizes) {
238 std::vector<PushedDownFilterInfo>
result;
239 if (left_deep_join_input_sizes.empty()) {
242 std::vector<size_t> input_size_prefix_sums(left_deep_join_input_sizes.size());
244 left_deep_join_input_sizes.end(),
245 input_size_prefix_sums.begin());
246 std::vector<int> to_original_rte_idx(ra_exe_unit.
input_descs.size(),
248 if (!input_permutation.empty()) {
249 CHECK_EQ(to_original_rte_idx.size(), input_permutation.size());
250 for (
size_t i = 0;
i < input_permutation.size(); ++
i) {
251 CHECK_LT(input_permutation[
i], to_original_rte_idx.size());
252 CHECK_EQ(static_cast<size_t>(to_original_rte_idx[input_permutation[i]]),
253 to_original_rte_idx.size());
254 to_original_rte_idx[input_permutation[
i]] =
i;
257 std::iota(to_original_rte_idx.begin(), to_original_rte_idx.end(), 0);
259 std::unordered_map<int, std::vector<std::shared_ptr<Analyzer::Expr>>>
260 filters_per_nesting_level;
261 for (
const auto& level_conditions : ra_exe_unit.
join_quals) {
263 for (
const auto& cond : level_conditions.quals) {
264 const auto rte_indices = visitor.
visit(cond.get());
265 if (rte_indices.size() > 1) {
268 const int rte_idx = (!rte_indices.empty()) ? *rte_indices.cbegin() : 0;
273 CHECK_LT(static_cast<size_t>(rte_idx), to_original_rte_idx.size());
274 filters_per_nesting_level[to_original_rte_idx[rte_idx]].push_back(cond);
277 for (
const auto& kv : filters_per_nesting_level) {
279 CHECK_LT(static_cast<size_t>(kv.first), input_size_prefix_sums.size());
280 size_t input_prev = (kv.first > 1) ? input_size_prefix_sums[kv.first - 2] : 0;
281 size_t input_start = kv.first ? input_size_prefix_sums[kv.first - 1] : 0;
282 size_t input_next = input_size_prefix_sums[kv.first];
bool find_push_down_candidates
const std::vector< size_t > left_deep_join_input_sizes
ExecutionResult executeRelAlgSeq(const RaExecutionSequence &seq, const CompilationOptions &co, const ExecutionOptions &eo, RenderInfo *render_info, const int64_t queue_time_ms, const bool with_existing_temp_tables=false)
bool with_dynamic_watchdog
RelAlgExecutionUnit exe_unit
ExecutionResult executeRelAlgQueryWithFilterPushDown(const RaExecutionSequence &seq, const CompilationOptions &co, const ExecutionOptions &eo, RenderInfo *render_info, const int64_t queue_time_ms)
FilterSelectivity getFilterSelectivity(const std::vector< std::shared_ptr< Analyzer::Expr >> &filter_expressions, const CompilationOptions &co, const ExecutionOptions &eo)
std::vector< InputDescriptor > input_descs
std::vector< PushedDownFilterInfo > selectFiltersToBePushedDown(const RelAlgExecutor::WorkUnit &work_unit, const CompilationOptions &co, const ExecutionOptions &eo)
std::shared_ptr< ResultSet > ResultSetPtr
T visit(const Analyzer::Expr *expr) const
const std::vector< std::shared_ptr< RexSubQuery > > & getSubqueries() const noexcept
double running_query_interrupt_freq
bool just_calcite_explain
bool output_columnar_hint
bool to_gather_info_for_filter_selectivity(const std::vector< InputTableInfo > &table_infos)
const JoinQualsPerNestingLevel join_quals
A container for relational algebra descriptors defining the execution order for a relational algebra ...
const Catalog_Namespace::Catalog & cat_
DEVICE void partial_sum(ARGS &&...args)
std::vector< PushedDownFilterInfo > find_push_down_filters(const RelAlgExecutionUnit &ra_exe_unit, const std::vector< size_t > &input_permutation, const std::vector< size_t > &left_deep_join_input_sizes)
const std::vector< size_t > input_permutation
unsigned pending_query_interrupt_freq
const SQLTypeInfo & get_type_info() const
std::unordered_map< int, std::unordered_map< int, std::shared_ptr< const ColumnarResults >>> ColumnCacheMap
std::shared_ptr< Analyzer::Expr > visitColumnVar(const Analyzer::ColumnVar *col_var) const override
DEVICE void iota(ARGS &&...args)
double gpu_input_mem_limit_percent
unsigned dynamic_watchdog_time_limit
int get_column_id() const
bool allow_runtime_query_interrupt