mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Fixed bug in OPTIMIZE TABLE that reset index cardinality if it
was up to date.
This commit is contained in:
@ -46844,6 +46844,14 @@ not yet 100% confident in this code.
|
|||||||
@appendixsubsec Changes in release 3.23.45
|
@appendixsubsec Changes in release 3.23.45
|
||||||
@itemize @bullet
|
@itemize @bullet
|
||||||
@item
|
@item
|
||||||
|
Fix a bug which could cause InnoDB to complain if it cannot find free blocks
|
||||||
|
from the buffer cache during recovery.
|
||||||
|
@item
|
||||||
|
Fixed a bug in InnoDB insert buffer B-tree handling that could cause crashes.
|
||||||
|
@item
|
||||||
|
Fixed bug in @code{OPTIMIZE TABLE} that reset index cardinality if it
|
||||||
|
was up to date.
|
||||||
|
@item
|
||||||
Fixed problem with @code{t1 LEFT_JOIN t2 ... WHERE t2.date_column IS NULL} when
|
Fixed problem with @code{t1 LEFT_JOIN t2 ... WHERE t2.date_column IS NULL} when
|
||||||
date_column was declared as @code{NOT NULL}.
|
date_column was declared as @code{NOT NULL}.
|
||||||
@item
|
@item
|
||||||
|
@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
|
|||||||
AC_INIT(sql/mysqld.cc)
|
AC_INIT(sql/mysqld.cc)
|
||||||
AC_CANONICAL_SYSTEM
|
AC_CANONICAL_SYSTEM
|
||||||
# The Docs Makefile.am parses this line!
|
# The Docs Makefile.am parses this line!
|
||||||
AM_INIT_AUTOMAKE(mysql, 3.23.44)
|
AM_INIT_AUTOMAKE(mysql, 3.23.45)
|
||||||
AM_CONFIG_HEADER(config.h)
|
AM_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
PROTOCOL_VERSION=10
|
PROTOCOL_VERSION=10
|
||||||
|
@ -10,3 +10,13 @@ Table Op Msg_type Msg_text
|
|||||||
test.t1 repair status OK
|
test.t1 repair status OK
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 check status OK
|
test.t1 check status OK
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 optimize status OK
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Comment
|
||||||
|
t1 0 PRIMARY 1 a A 5 NULL NULL
|
||||||
|
t1 1 b 1 b A 1 NULL NULL
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 optimize status Table is already up to date
|
||||||
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Comment
|
||||||
|
t1 0 PRIMARY 1 a A 5 NULL NULL
|
||||||
|
t1 1 b 1 b A 1 NULL NULL
|
||||||
|
@ -36,3 +36,15 @@ check table t1;
|
|||||||
repair table t1;
|
repair table t1;
|
||||||
check table t1;
|
check table t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test bug: Two optimize in a row reset index cardinality
|
||||||
|
#
|
||||||
|
|
||||||
|
create table t1 (a int not null auto_increment, b int not null, primary key (a), index(b));
|
||||||
|
insert into t1 (b) values (1),(2),(2),(2),(2);
|
||||||
|
optimize table t1;
|
||||||
|
show index from t1;
|
||||||
|
optimize table t1;
|
||||||
|
show index from t1;
|
||||||
|
drop table t1;
|
||||||
|
@ -535,7 +535,7 @@ int ha_myisam::optimize(THD* thd, HA_CHECK_OPT *check_opt)
|
|||||||
int ha_myisam::repair(THD *thd, MI_CHECK ¶m, bool optimize)
|
int ha_myisam::repair(THD *thd, MI_CHECK ¶m, bool optimize)
|
||||||
{
|
{
|
||||||
int error=0;
|
int error=0;
|
||||||
uint extra_testflag=0;
|
uint local_testflag=param.testflag;
|
||||||
bool optimize_done= !optimize, statistics_done=0;
|
bool optimize_done= !optimize, statistics_done=0;
|
||||||
char fixed_name[FN_REFLEN];
|
char fixed_name[FN_REFLEN];
|
||||||
const char *old_proc_info=thd->proc_info;
|
const char *old_proc_info=thd->proc_info;
|
||||||
@ -565,19 +565,18 @@ int ha_myisam::repair(THD *thd, MI_CHECK ¶m, bool optimize)
|
|||||||
(!param.opt_rep_quick ||
|
(!param.opt_rep_quick ||
|
||||||
!(share->state.changed & STATE_NOT_OPTIMIZED_KEYS))))
|
!(share->state.changed & STATE_NOT_OPTIMIZED_KEYS))))
|
||||||
{
|
{
|
||||||
ulonglong key_map= ((param.testflag & T_CREATE_MISSING_KEYS) ?
|
ulonglong key_map= ((local_testflag & T_CREATE_MISSING_KEYS) ?
|
||||||
((ulonglong) 1L << share->base.keys)-1 :
|
((ulonglong) 1L << share->base.keys)-1 :
|
||||||
share->state.key_map);
|
share->state.key_map);
|
||||||
|
uint testflag=param.testflag;
|
||||||
if (mi_test_if_sort_rep(file,file->state->records,key_map,0) &&
|
if (mi_test_if_sort_rep(file,file->state->records,key_map,0) &&
|
||||||
(param.testflag & T_REP_BY_SORT))
|
(local_testflag & T_REP_BY_SORT))
|
||||||
{
|
{
|
||||||
uint testflag=param.testflag;
|
local_testflag|= T_STATISTICS;
|
||||||
extra_testflag= T_STATISTICS;
|
|
||||||
param.testflag|= T_STATISTICS; // We get this for free
|
param.testflag|= T_STATISTICS; // We get this for free
|
||||||
thd->proc_info="Repair by sorting";
|
thd->proc_info="Repair by sorting";
|
||||||
statistics_done=1;
|
statistics_done=1;
|
||||||
error = mi_repair_by_sort(¶m, file, fixed_name, param.opt_rep_quick);
|
error = mi_repair_by_sort(¶m, file, fixed_name, param.opt_rep_quick);
|
||||||
param.testflag=testflag;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -585,22 +584,28 @@ int ha_myisam::repair(THD *thd, MI_CHECK ¶m, bool optimize)
|
|||||||
param.testflag &= ~T_REP_BY_SORT;
|
param.testflag &= ~T_REP_BY_SORT;
|
||||||
error= mi_repair(¶m, file, fixed_name, param.opt_rep_quick);
|
error= mi_repair(¶m, file, fixed_name, param.opt_rep_quick);
|
||||||
}
|
}
|
||||||
|
param.testflag=testflag;
|
||||||
|
optimize_done=1;
|
||||||
}
|
}
|
||||||
if (!error)
|
if (!error)
|
||||||
{
|
{
|
||||||
if ((param.testflag & T_SORT_INDEX) &&
|
if ((local_testflag & T_SORT_INDEX) &&
|
||||||
(share->state.changed & STATE_NOT_SORTED_PAGES))
|
(share->state.changed & STATE_NOT_SORTED_PAGES))
|
||||||
{
|
{
|
||||||
optimize_done=1;
|
optimize_done=1;
|
||||||
thd->proc_info="Sorting index";
|
thd->proc_info="Sorting index";
|
||||||
error=mi_sort_index(¶m,file,fixed_name);
|
error=mi_sort_index(¶m,file,fixed_name);
|
||||||
}
|
}
|
||||||
if (!statistics_done && (param.testflag & T_STATISTICS) &&
|
if (!statistics_done && (local_testflag & T_STATISTICS))
|
||||||
(share->state.changed & STATE_NOT_ANALYZED))
|
|
||||||
{
|
{
|
||||||
optimize_done=1;
|
if (share->state.changed & STATE_NOT_ANALYZED)
|
||||||
thd->proc_info="Analyzing";
|
{
|
||||||
error = chk_key(¶m, file);
|
optimize_done=1;
|
||||||
|
thd->proc_info="Analyzing";
|
||||||
|
error = chk_key(¶m, file);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
local_testflag&= ~T_STATISTICS; // Don't update statistics
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
thd->proc_info="Saving state";
|
thd->proc_info="Saving state";
|
||||||
@ -615,10 +620,11 @@ int ha_myisam::repair(THD *thd, MI_CHECK ¶m, bool optimize)
|
|||||||
file->save_state=file->s->state.state;
|
file->save_state=file->s->state.state;
|
||||||
if (file->s->base.auto_key)
|
if (file->s->base.auto_key)
|
||||||
update_auto_increment_key(¶m, file, 1);
|
update_auto_increment_key(¶m, file, 1);
|
||||||
error = update_state_info(¶m, file,
|
if (optimize_done)
|
||||||
UPDATE_TIME | UPDATE_OPEN_COUNT |
|
error = update_state_info(¶m, file,
|
||||||
((param.testflag | extra_testflag) &
|
UPDATE_TIME | UPDATE_OPEN_COUNT |
|
||||||
T_STATISTICS ? UPDATE_STAT : 0));
|
(local_testflag &
|
||||||
|
T_STATISTICS ? UPDATE_STAT : 0));
|
||||||
info(HA_STATUS_NO_LOCK | HA_STATUS_TIME | HA_STATUS_VARIABLE |
|
info(HA_STATUS_NO_LOCK | HA_STATUS_TIME | HA_STATUS_VARIABLE |
|
||||||
HA_STATUS_CONST);
|
HA_STATUS_CONST);
|
||||||
if (rows != file->state->records && ! (param.testflag & T_VERY_SILENT))
|
if (rows != file->state->records && ! (param.testflag & T_VERY_SILENT))
|
||||||
|
Reference in New Issue
Block a user