1
0
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:
Sergey Petrunya
2014-10-10 17:08:12 +04:00
parent 33f1ac66ad
commit 41b45a8163
4 changed files with 32 additions and 3 deletions

View File

@ -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
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
#
set use_stat_tables= @tmp_ust;

View File

@ -65,6 +65,20 @@ SELECT * FROM t1, t2 WHERE ( 't', 'o' ) IN (
);
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 # End of 10.0 tests
--echo #

View File

@ -3738,6 +3738,11 @@ bool calculate_cond_selectivity_for_table(THD *thd, TABLE *table, Item *cond)
ptr Field value in key format
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
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

View File

@ -3531,7 +3531,7 @@ double get_column_range_cardinality(Field *field,
if (hist->is_available())
{
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,
col_stats->max_value);
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]))
{
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,
col_stats->max_value);
}
@ -3564,7 +3564,7 @@ double get_column_range_cardinality(Field *field,
if (max_endp)
{
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,
col_stats->max_value);
}