@@ -4364,10 +4364,37 @@ double get_column_range_cardinality(Field *field,
43644364 {
43654365 if (col_stats->min_max_values_are_provided ())
43664366 {
4367- Histogram_base *hist = col_stats->histogram_ ;
4368- double sel= hist->range_selectivity (field, min_endp, max_endp);
4367+ Histogram_base *hist= col_stats->histogram_ ;
4368+ double sel;
4369+ if (hist && hist->is_usable (thd))
4370+ {
4371+ sel= hist->range_selectivity (field, min_endp, max_endp);
4372+ set_if_bigger (res, col_stats->get_avg_frequency ());
4373+ } else
4374+ {
4375+ double min_mp_pos, max_mp_pos;
4376+ if (min_endp && !(field->null_ptr && min_endp->key [0 ]))
4377+ {
4378+ store_key_image_to_rec (field, (uchar *) min_endp->key ,
4379+ field->key_length ());
4380+ min_mp_pos=
4381+ field->pos_in_interval (col_stats->min_value , col_stats->max_value );
4382+ }
4383+ else
4384+ min_mp_pos= 0.0 ;
4385+ if (max_endp)
4386+ {
4387+ store_key_image_to_rec (field, (uchar *) max_endp->key ,
4388+ field->key_length ());
4389+ max_mp_pos=
4390+ field->pos_in_interval (col_stats->min_value , col_stats->max_value );
4391+ }
4392+ else
4393+ max_mp_pos= 1.0 ;
4394+
4395+ sel = (max_mp_pos - min_mp_pos);
4396+ }
43694397 res= col_non_nulls * sel;
4370- set_if_bigger (res, col_stats->get_avg_frequency ());
43714398 }
43724399 else
43734400 res= col_non_nulls;
@@ -4525,23 +4552,16 @@ double Histogram_binary::range_selectivity(Field *field,
45254552 else
45264553 max_mp_pos= 1.0 ;
45274554
4528- if (is_usable (field->table ->in_use ))
4529- {
4530- double bucket_sel= 1.0 / (get_width () + 1 );
4531- uint min= find_bucket (min_mp_pos, TRUE );
4532- uint max= find_bucket (max_mp_pos, FALSE );
4533- sel= bucket_sel * (max - min + 1 );
4555+ double bucket_sel= 1.0 / (get_width () + 1 );
4556+ uint min= find_bucket (min_mp_pos, TRUE );
4557+ uint max= find_bucket (max_mp_pos, FALSE );
4558+ sel= bucket_sel * (max - min + 1 );
45344559
4535- /* fprintf(stderr, "bucket_sel =%g\n", bucket_sel);
4536- fprintf(stderr, "min pos_in_interval =%g\n", min_mp_pos);
4537- fprintf(stderr, "max pos_in_interval =%g\n", max_mp_pos);
4538- fprintf(stderr, "min =%d\n", min);
4539- fprintf(stderr, "max =%d\n", max);*/
4540- }
4541- else
4542- {
4543- sel= (max_mp_pos - min_mp_pos);
4544- }
4560+ /* fprintf(stderr, "bucket_sel =%g\n", bucket_sel);
4561+ fprintf(stderr, "min pos_in_interval =%g\n", min_mp_pos);
4562+ fprintf(stderr, "max pos_in_interval =%g\n", max_mp_pos);
4563+ fprintf(stderr, "min =%d\n", min);
4564+ fprintf(stderr, "max =%d\n", max);*/
45454565 /* fprintf(stderr, "final sel =%g\n", sel);
45464566 fprintf(stderr, "Histogram_binary::range_selectivity ends\n");*/
45474567 return sel;
0 commit comments