mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-6738: use_stat_table + histograms crashing optimizer
- When EITS code calls store_key_image_to_rec(), it should follow its calling convention (which is counter-intuitive)
This commit is contained in:
@ -1409,6 +1409,16 @@ SELECT t1_2.b, t1_1.a FROM t1 AS t1_1 STRAIGHT_JOIN t1 AS t1_2 ON ( t1_2.a = t1_
|
|||||||
a b i
|
a b i
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
#
|
#
|
||||||
|
# MDEV-6738: use_stat_table + histograms crashing optimizer
|
||||||
|
#
|
||||||
|
set use_stat_tables='preferably';
|
||||||
|
set optimizer_use_condition_selectivity=4;
|
||||||
|
# Need innodb because there is a special kind of field_bit for non-myisam tables
|
||||||
|
create table t1(col1 int, col2 bit(1) DEFAULT NULL) engine=innodb;
|
||||||
|
select * from t1 where col2 != true;
|
||||||
|
col1 col2
|
||||||
|
drop table t1;
|
||||||
|
#
|
||||||
# End of 10.0 tests
|
# End of 10.0 tests
|
||||||
#
|
#
|
||||||
set use_stat_tables= @tmp_ust;
|
set use_stat_tables= @tmp_ust;
|
||||||
|
@ -65,6 +65,20 @@ SELECT * FROM t1, t2 WHERE ( 't', 'o' ) IN (
|
|||||||
);
|
);
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-6738: use_stat_table + histograms crashing optimizer
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
set use_stat_tables='preferably';
|
||||||
|
set optimizer_use_condition_selectivity=4;
|
||||||
|
|
||||||
|
--echo # Need innodb because there is a special kind of field_bit for non-myisam tables
|
||||||
|
create table t1(col1 int, col2 bit(1) DEFAULT NULL) engine=innodb;
|
||||||
|
|
||||||
|
select * from t1 where col2 != true;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.0 tests
|
--echo # End of 10.0 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -3738,6 +3738,11 @@ bool calculate_cond_selectivity_for_table(THD *thd, TABLE *table, Item *cond)
|
|||||||
ptr Field value in key format
|
ptr Field value in key format
|
||||||
len Length of the value, in bytes
|
len Length of the value, in bytes
|
||||||
|
|
||||||
|
ATTENTION
|
||||||
|
len is the length of the value not counting the NULL-byte (at the same
|
||||||
|
time, ptr points to the key image, which starts with NULL-byte for
|
||||||
|
nullable columns)
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
Copy the field value from its key image to the table record. The source
|
Copy the field value from its key image to the table record. The source
|
||||||
is the value in key image format, occupying len bytes in buffer pointed
|
is the value in key image format, occupying len bytes in buffer pointed
|
||||||
|
@ -3531,7 +3531,7 @@ double get_column_range_cardinality(Field *field,
|
|||||||
if (hist->is_available())
|
if (hist->is_available())
|
||||||
{
|
{
|
||||||
store_key_image_to_rec(field, (uchar *) min_endp->key,
|
store_key_image_to_rec(field, (uchar *) min_endp->key,
|
||||||
min_endp->length);
|
field->key_length());
|
||||||
double pos= field->pos_in_interval(col_stats->min_value,
|
double pos= field->pos_in_interval(col_stats->min_value,
|
||||||
col_stats->max_value);
|
col_stats->max_value);
|
||||||
res= col_non_nulls *
|
res= col_non_nulls *
|
||||||
@ -3555,7 +3555,7 @@ double get_column_range_cardinality(Field *field,
|
|||||||
if (min_endp && !(field->null_ptr && min_endp->key[0]))
|
if (min_endp && !(field->null_ptr && min_endp->key[0]))
|
||||||
{
|
{
|
||||||
store_key_image_to_rec(field, (uchar *) min_endp->key,
|
store_key_image_to_rec(field, (uchar *) min_endp->key,
|
||||||
min_endp->length);
|
field->key_length());
|
||||||
min_mp_pos= field->pos_in_interval(col_stats->min_value,
|
min_mp_pos= field->pos_in_interval(col_stats->min_value,
|
||||||
col_stats->max_value);
|
col_stats->max_value);
|
||||||
}
|
}
|
||||||
@ -3564,7 +3564,7 @@ double get_column_range_cardinality(Field *field,
|
|||||||
if (max_endp)
|
if (max_endp)
|
||||||
{
|
{
|
||||||
store_key_image_to_rec(field, (uchar *) max_endp->key,
|
store_key_image_to_rec(field, (uchar *) max_endp->key,
|
||||||
max_endp->length);
|
field->key_length());
|
||||||
max_mp_pos= field->pos_in_interval(col_stats->min_value,
|
max_mp_pos= field->pos_in_interval(col_stats->min_value,
|
||||||
col_stats->max_value);
|
col_stats->max_value);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user