@@ -446,39 +446,6 @@ ExpressionRange getExpressionRange(const hdk::ir::Constant* constant_expr) {
446
446
return ExpressionRange::makeInvalidRange ();
447
447
}
448
448
449
- #define FIND_STAT_FRAG (stat_name ) \
450
- const auto stat_name##_frag_index = std::stat_name##_element( \
451
- nonempty_fragment_indices.begin(), \
452
- nonempty_fragment_indices.end(), \
453
- [&fragments, &has_nulls, col_id, col_type](const size_t lhs_idx, \
454
- const size_t rhs_idx) { \
455
- const auto & lhs = fragments[lhs_idx]; \
456
- const auto & rhs = fragments[rhs_idx]; \
457
- auto lhs_meta_it = lhs.getChunkMetadataMap ().find (col_id); \
458
- if (lhs_meta_it == lhs.getChunkMetadataMap ().end ()) { \
459
- return false ; \
460
- } \
461
- auto rhs_meta_it = rhs.getChunkMetadataMap ().find (col_id); \
462
- CHECK (rhs_meta_it != rhs.getChunkMetadataMap ().end ()); \
463
- if (lhs_meta_it->second ->chunkStats ().has_nulls || \
464
- rhs_meta_it->second ->chunkStats ().has_nulls ) { \
465
- has_nulls = true ; \
466
- } \
467
- if (col_type->isFloatingPoint ()) { \
468
- return extract_##stat_name##_stat_fp_type (lhs_meta_it->second ->chunkStats (), \
469
- col_type) < \
470
- extract_##stat_name##_stat_fp_type (rhs_meta_it->second ->chunkStats (), \
471
- col_type); \
472
- } \
473
- return extract_##stat_name##_stat_int_type (lhs_meta_it->second ->chunkStats (), \
474
- col_type) < \
475
- extract_##stat_name##_stat_int_type (rhs_meta_it->second ->chunkStats (), \
476
- col_type); \
477
- }); \
478
- if (stat_name##_frag_index == nonempty_fragment_indices.end()) { \
479
- return ExpressionRange::makeInvalidRange (); \
480
- }
481
-
482
449
namespace {
483
450
484
451
int64_t get_conservative_datetrunc_bucket (const hdk::ir::DateTruncField datetrunc_field) {
@@ -546,7 +513,6 @@ ExpressionRange getLeafColumnRange(const hdk::ir::ColumnVar* col_expr,
546
513
}
547
514
CHECK (ti_idx);
548
515
const auto & query_info = query_infos[*ti_idx].info ;
549
- const auto & fragments = query_info.fragments ;
550
516
if (query_info.getNumTuples () == 0 ) {
551
517
// The column doesn't contain any values, synthesize an empty range.
552
518
if (col_type->isFloatingPoint ()) {
@@ -561,67 +527,25 @@ ExpressionRange getLeafColumnRange(const hdk::ir::ColumnVar* col_expr,
561
527
return ExpressionRange::makeIntRange (
562
528
0 , std::max (num_tuples - 1 , int64_t (0 )), 0 , has_nulls);
563
529
}
564
- std::vector<size_t > nonempty_fragment_indices;
565
- for (size_t i = 0 ; i < fragments.size (); ++i) {
566
- const auto & fragment = fragments[i];
567
- if (!fragment.isEmptyPhysicalFragment ()) {
568
- nonempty_fragment_indices.push_back (i);
569
- }
570
- }
571
- FIND_STAT_FRAG (min);
572
- FIND_STAT_FRAG (max);
573
- const auto & min_frag = fragments[*min_frag_index];
574
- const auto min_it = min_frag.getChunkMetadataMap ().find (col_id);
575
- if (min_it == min_frag.getChunkMetadataMap ().end ()) {
576
- return ExpressionRange::makeInvalidRange ();
577
- }
578
- const auto & max_frag = fragments[*max_frag_index];
579
- const auto max_it = max_frag.getChunkMetadataMap ().find (col_id);
580
- CHECK (max_it != max_frag.getChunkMetadataMap ().end ());
581
- for (const auto & fragment : fragments) {
582
- const auto it = fragment.getChunkMetadataMap ().find (col_id);
583
- if (it != fragment.getChunkMetadataMap ().end ()) {
584
- if (it->second ->chunkStats ().has_nulls ) {
585
- has_nulls = true ;
586
- break ;
587
- }
588
- }
589
- }
590
530
591
531
auto & table_stats = query_info.getTableStats ();
592
532
auto col_stats_it = table_stats.find (col_id);
593
533
CHECK (col_stats_it != table_stats.end ())
594
534
<< query_infos[*ti_idx].db_id << " :" << query_infos[*ti_idx].table_id << " :"
595
535
<< col_id << " " << table_stats.size ();
596
- if (col_stats_it == table_stats.end ()) {
597
- return ExpressionRange::makeInvalidRange ();
598
- }
599
536
600
537
auto & col_stats = col_stats_it->second ;
601
- CHECK_EQ (col_stats.has_nulls || is_outer_join_proj, has_nulls);
602
538
has_nulls = has_nulls || col_stats.has_nulls ;
603
539
604
540
if (col_type->isFloatingPoint ()) {
605
- const auto min_val =
606
- extract_min_stat_fp_type (min_it->second ->chunkStats (), col_type);
607
- const auto max_val =
608
- extract_max_stat_fp_type (max_it->second ->chunkStats (), col_type);
609
- const auto new_min_val = extract_min_stat_fp_type (col_stats, col_type);
610
- const auto new_max_val = extract_max_stat_fp_type (col_stats, col_type);
611
- CHECK_EQ (new_min_val, min_val);
612
- CHECK_EQ (new_max_val, max_val);
541
+ const auto min_val = extract_min_stat_fp_type (col_stats, col_type);
542
+ const auto max_val = extract_max_stat_fp_type (col_stats, col_type);
613
543
return col_type->size () == 4
614
544
? ExpressionRange::makeFloatRange (min_val, max_val, has_nulls)
615
545
: ExpressionRange::makeDoubleRange (min_val, max_val, has_nulls);
616
546
}
617
- const auto min_val =
618
- extract_min_stat_int_type (min_it->second ->chunkStats (), col_type);
619
- const auto max_val =
620
- extract_max_stat_int_type (max_it->second ->chunkStats (), col_type);
621
- const auto new_min_val = extract_min_stat_int_type (col_stats, col_type);
622
- const auto new_max_val = extract_max_stat_int_type (col_stats, col_type);
623
- CHECK_EQ (new_min_val, min_val);
624
- CHECK_EQ (new_max_val, max_val);
547
+ const auto min_val = extract_min_stat_int_type (col_stats, col_type);
548
+ const auto max_val = extract_max_stat_int_type (col_stats, col_type);
625
549
if (max_val < min_val) {
626
550
// The column doesn't contain any non-null values, synthesize an empty range.
627
551
CHECK_GT (min_val, 0 );
@@ -639,8 +563,6 @@ ExpressionRange getLeafColumnRange(const hdk::ir::ColumnVar* col_expr,
639
563
return ExpressionRange::makeInvalidRange ();
640
564
}
641
565
642
- #undef FIND_STAT_FRAG
643
-
644
566
ExpressionRange getExpressionRange (
645
567
const hdk::ir::ColumnVar* col_expr,
646
568
const std::vector<InputTableInfo>& query_infos,
0 commit comments