mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
Merge xiphis.org:/home/antony/work2/mysql-5.0-engines
into xiphis.org:/home/antony/work2/p4-bug12096.2
This commit is contained in:
commit
751887b4c1
10 changed files with 51 additions and 33 deletions
|
@ -736,6 +736,9 @@ typedef SOCKET_SIZE_TYPE size_socket;
|
|||
#define DBL_MAX 1.79769313486231470e+308
|
||||
#define FLT_MAX ((float)3.40282346638528860e+38)
|
||||
#endif
|
||||
#ifndef SSIZE_MAX
|
||||
#define SSIZE_MAX ((~((size_t) 0)) / 2)
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_ISINF) && !defined(isinf)
|
||||
#define isinf(X) 0
|
||||
|
|
|
@ -453,25 +453,24 @@ int chk_key(MI_CHECK *param, register MI_INFO *info)
|
|||
if ((uint) share->base.auto_key -1 == key)
|
||||
{
|
||||
/* Check that auto_increment key is bigger than max key value */
|
||||
ulonglong save_auto_value=info->s->state.auto_increment;
|
||||
info->s->state.auto_increment=0;
|
||||
ulonglong auto_increment;
|
||||
info->lastinx=key;
|
||||
_mi_read_key_record(info, 0L, info->rec_buff);
|
||||
update_auto_increment(info, info->rec_buff);
|
||||
if (info->s->state.auto_increment > save_auto_value)
|
||||
auto_increment= retrieve_auto_increment(info, info->rec_buff);
|
||||
if (auto_increment > info->s->state.auto_increment)
|
||||
{
|
||||
mi_check_print_warning(param,
|
||||
"Auto-increment value: %s is smaller than max used value: %s",
|
||||
llstr(save_auto_value,buff2),
|
||||
llstr(info->s->state.auto_increment, buff));
|
||||
mi_check_print_warning(param, "Auto-increment value: %s is smaller "
|
||||
"than max used value: %s",
|
||||
llstr(info->s->state.auto_increment,buff2),
|
||||
llstr(auto_increment, buff));
|
||||
}
|
||||
if (param->testflag & T_AUTO_INC)
|
||||
{
|
||||
set_if_bigger(info->s->state.auto_increment,
|
||||
param->auto_increment_value);
|
||||
set_if_bigger(info->s->state.auto_increment,
|
||||
auto_increment);
|
||||
set_if_bigger(info->s->state.auto_increment,
|
||||
param->auto_increment_value);
|
||||
}
|
||||
else
|
||||
info->s->state.auto_increment=save_auto_value;
|
||||
|
||||
/* Check that there isn't a row with auto_increment = 0 in the table */
|
||||
mi_extra(info,HA_EXTRA_KEYREAD,0);
|
||||
|
@ -481,8 +480,8 @@ int chk_key(MI_CHECK *param, register MI_INFO *info)
|
|||
{
|
||||
/* Don't count this as a real warning, as myisamchk can't correct it */
|
||||
uint save=param->warning_printed;
|
||||
mi_check_print_warning(param,
|
||||
"Found row where the auto_increment column has the value 0");
|
||||
mi_check_print_warning(param, "Found row where the auto_increment "
|
||||
"column has the value 0");
|
||||
param->warning_printed=save;
|
||||
}
|
||||
mi_extra(info,HA_EXTRA_NO_KEYREAD,0);
|
||||
|
@ -4099,11 +4098,10 @@ void update_auto_increment_key(MI_CHECK *param, MI_INFO *info,
|
|||
}
|
||||
else
|
||||
{
|
||||
ulonglong auto_increment= (repair_only ? info->s->state.auto_increment :
|
||||
param->auto_increment_value);
|
||||
info->s->state.auto_increment=0;
|
||||
update_auto_increment(info, record);
|
||||
ulonglong auto_increment= retrieve_auto_increment(info, record);
|
||||
set_if_bigger(info->s->state.auto_increment,auto_increment);
|
||||
if (!repair_only)
|
||||
set_if_bigger(info->s->state.auto_increment, param->auto_increment_value);
|
||||
}
|
||||
mi_extra(info,HA_EXTRA_NO_KEYREAD,0);
|
||||
my_free((char*) record, MYF(0));
|
||||
|
|
|
@ -507,22 +507,21 @@ int _mi_read_key_record(MI_INFO *info, my_off_t filepos, byte *buf)
|
|||
return(-1); /* Wrong data to read */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Update auto_increment info
|
||||
Retrieve auto_increment info
|
||||
|
||||
SYNOPSIS
|
||||
update_auto_increment()
|
||||
retrieve_auto_increment()
|
||||
info MyISAM handler
|
||||
record Row to update
|
||||
|
||||
IMPLEMENTATION
|
||||
Only replace the auto_increment value if it is higher than the previous
|
||||
one. For signed columns we don't update the auto increment value if it's
|
||||
For signed columns we don't retrieve the auto increment value if it's
|
||||
less than zero.
|
||||
*/
|
||||
|
||||
void update_auto_increment(MI_INFO *info,const byte *record)
|
||||
ulonglong retrieve_auto_increment(MI_INFO *info,const byte *record)
|
||||
{
|
||||
ulonglong value= 0; /* Store unsigned values here */
|
||||
longlong s_value= 0; /* Store signed values here */
|
||||
|
@ -587,6 +586,5 @@ void update_auto_increment(MI_INFO *info,const byte *record)
|
|||
and if s_value == 0 then value will contain either s_value or the
|
||||
correct value.
|
||||
*/
|
||||
set_if_bigger(info->s->state.auto_increment,
|
||||
(s_value > 0) ? (ulonglong) s_value : value);
|
||||
return (s_value > 0) ? (ulonglong) s_value : value;
|
||||
}
|
||||
|
|
|
@ -164,7 +164,8 @@ int mi_update(register MI_INFO *info, const byte *oldrec, byte *newrec)
|
|||
key_changed|= HA_STATE_CHANGED; /* Must update index file */
|
||||
}
|
||||
if (auto_key_changed)
|
||||
update_auto_increment(info,newrec);
|
||||
set_if_bigger(info->s->state.auto_increment,
|
||||
retrieve_auto_increment(info, newrec));
|
||||
if (share->calc_checksum)
|
||||
info->state->checksum+=(info->checksum - old_checksum);
|
||||
|
||||
|
|
|
@ -149,7 +149,8 @@ int mi_write(MI_INFO *info, byte *record)
|
|||
info->state->checksum+=info->checksum;
|
||||
}
|
||||
if (share->base.auto_key)
|
||||
update_auto_increment(info,record);
|
||||
set_if_bigger(info->s->state.auto_increment,
|
||||
retrieve_auto_increment(info, record));
|
||||
info->update= (HA_STATE_CHANGED | HA_STATE_AKTIV | HA_STATE_WRITTEN |
|
||||
HA_STATE_ROW_CHANGED);
|
||||
info->state->records++;
|
||||
|
|
|
@ -582,7 +582,7 @@ extern uint _mi_pack_key(MI_INFO *info,uint keynr,uchar *key,uchar *old,
|
|||
extern int _mi_read_key_record(MI_INFO *info,my_off_t filepos,byte *buf);
|
||||
extern int _mi_read_cache(IO_CACHE *info,byte *buff,my_off_t pos,
|
||||
uint length,int re_read_if_possibly);
|
||||
extern void update_auto_increment(MI_INFO *info,const byte *record);
|
||||
extern ulonglong retrieve_auto_increment(MI_INFO *info,const byte *record);
|
||||
|
||||
extern byte *mi_alloc_rec_buff(MI_INFO *,ulong, byte**);
|
||||
#define mi_get_rec_buff_ptr(info,buf) \
|
||||
|
|
|
@ -776,3 +776,9 @@ insert into t1 values ("Monty"),("WAX"),("Walrus");
|
|||
alter table t1 engine=MERGE;
|
||||
ERROR HY000: Table storage engine for 't1' doesn't have this option
|
||||
drop table t1;
|
||||
create table t1 (b bit(1));
|
||||
create table t2 (b bit(1));
|
||||
create table tm (b bit(1)) engine = merge union = (t1,t2);
|
||||
select * from tm;
|
||||
b
|
||||
drop table tm, t1, t2;
|
||||
|
|
|
@ -390,4 +390,13 @@ insert into t1 values ("Monty"),("WAX"),("Walrus");
|
|||
alter table t1 engine=MERGE;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# BUG#19648 - Merge table does not work with bit types
|
||||
#
|
||||
create table t1 (b bit(1));
|
||||
create table t2 (b bit(1));
|
||||
create table tm (b bit(1)) engine = merge union = (t1,t2);
|
||||
select * from tm;
|
||||
drop table tm, t1, t2;
|
||||
|
||||
# End of 5.0 tests
|
||||
|
|
|
@ -37,7 +37,8 @@ class ha_myisammrg: public handler
|
|||
{
|
||||
return (HA_REC_NOT_IN_SEQ | HA_AUTO_PART_KEY | HA_READ_RND_SAME |
|
||||
HA_NULL_IN_KEY | HA_CAN_INDEX_BLOBS | HA_FILE_BASED |
|
||||
HA_CAN_INSERT_DELAYED | HA_ANY_INDEX_MAY_BE_UNIQUE);
|
||||
HA_CAN_INSERT_DELAYED | HA_ANY_INDEX_MAY_BE_UNIQUE |
|
||||
HA_CAN_BIT_FIELD);
|
||||
}
|
||||
ulong index_flags(uint inx, uint part, bool all_parts) const
|
||||
{
|
||||
|
|
|
@ -5851,7 +5851,8 @@ The minimum value for this variable is 4096.",
|
|||
"Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value.",
|
||||
(gptr*) &global_system_variables.read_buff_size,
|
||||
(gptr*) &max_system_variables.read_buff_size,0, GET_ULONG, REQUIRED_ARG,
|
||||
128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_SIZE, 0},
|
||||
128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, SSIZE_MAX, MALLOC_OVERHEAD, IO_SIZE,
|
||||
0},
|
||||
{"read_only", OPT_READONLY,
|
||||
"Make all non-temporary tables read-only, with the exception for replication (slave) threads and users with the SUPER privilege",
|
||||
(gptr*) &opt_readonly,
|
||||
|
@ -5862,12 +5863,12 @@ The minimum value for this variable is 4096.",
|
|||
(gptr*) &global_system_variables.read_rnd_buff_size,
|
||||
(gptr*) &max_system_variables.read_rnd_buff_size, 0,
|
||||
GET_ULONG, REQUIRED_ARG, 256*1024L, IO_SIZE*2+MALLOC_OVERHEAD,
|
||||
~0L, MALLOC_OVERHEAD, IO_SIZE, 0},
|
||||
SSIZE_MAX, MALLOC_OVERHEAD, IO_SIZE, 0},
|
||||
{"record_buffer", OPT_RECORD_BUFFER,
|
||||
"Alias for read_buffer_size",
|
||||
(gptr*) &global_system_variables.read_buff_size,
|
||||
(gptr*) &max_system_variables.read_buff_size,0, GET_ULONG, REQUIRED_ARG,
|
||||
128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_SIZE, 0},
|
||||
128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, SSIZE_MAX, MALLOC_OVERHEAD, IO_SIZE, 0},
|
||||
#ifdef HAVE_REPLICATION
|
||||
{"relay_log_purge", OPT_RELAY_LOG_PURGE,
|
||||
"0 = do not purge relay logs. 1 = purge them as soon as they are no more needed.",
|
||||
|
|
Loading…
Reference in a new issue