mirror of
https://github.com/MariaDB/server.git
synced 2025-02-02 03:51:50 +01:00
Merge mysql.com:/home/mydev/mysql-5.0--main
into mysql.com:/home/mydev/mysql-5.0-bug11824
This commit is contained in:
commit
e29cc5d5b7
19 changed files with 224 additions and 45 deletions
|
@ -1158,13 +1158,14 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend)
|
||||||
#ifdef HAVE_RTREE_KEYS
|
#ifdef HAVE_RTREE_KEYS
|
||||||
(keyinfo->flag & HA_SPATIAL) ?
|
(keyinfo->flag & HA_SPATIAL) ?
|
||||||
rtree_find_first(info, key, info->lastkey, key_length,
|
rtree_find_first(info, key, info->lastkey, key_length,
|
||||||
SEARCH_SAME) :
|
MBR_EQUAL | MBR_DATA) :
|
||||||
#endif
|
#endif
|
||||||
_mi_search(info,keyinfo,info->lastkey,key_length,
|
_mi_search(info,keyinfo,info->lastkey,key_length,
|
||||||
SEARCH_SAME, info->s->state.key_root[key]);
|
SEARCH_SAME, info->s->state.key_root[key]);
|
||||||
if (search_result)
|
if (search_result)
|
||||||
{
|
{
|
||||||
mi_check_print_error(param,"Record at: %10s Can't find key for index: %2d",
|
mi_check_print_error(param,"Record at: %10s "
|
||||||
|
"Can't find key for index: %2d",
|
||||||
llstr(start_recpos,llbuff),key+1);
|
llstr(start_recpos,llbuff),key+1);
|
||||||
if (error++ > MAXERR || !(param->testflag & T_VERBOSE))
|
if (error++ > MAXERR || !(param->testflag & T_VERBOSE))
|
||||||
goto err2;
|
goto err2;
|
||||||
|
|
|
@ -59,6 +59,8 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||||
my_off_t key_root[MI_MAX_POSSIBLE_KEY],key_del[MI_MAX_KEY_BLOCK_SIZE];
|
my_off_t key_root[MI_MAX_POSSIBLE_KEY],key_del[MI_MAX_KEY_BLOCK_SIZE];
|
||||||
MI_CREATE_INFO tmp_create_info;
|
MI_CREATE_INFO tmp_create_info;
|
||||||
DBUG_ENTER("mi_create");
|
DBUG_ENTER("mi_create");
|
||||||
|
DBUG_PRINT("enter", ("keys: %u columns: %u uniques: %u flags: %u",
|
||||||
|
keys, columns, uniques, flags));
|
||||||
|
|
||||||
if (!ci)
|
if (!ci)
|
||||||
{
|
{
|
||||||
|
@ -471,6 +473,16 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||||
uniques * MI_UNIQUEDEF_SIZE +
|
uniques * MI_UNIQUEDEF_SIZE +
|
||||||
(key_segs + unique_key_parts)*HA_KEYSEG_SIZE+
|
(key_segs + unique_key_parts)*HA_KEYSEG_SIZE+
|
||||||
columns*MI_COLUMNDEF_SIZE);
|
columns*MI_COLUMNDEF_SIZE);
|
||||||
|
DBUG_PRINT("info", ("info_length: %u", info_length));
|
||||||
|
/* There are only 16 bits for the total header length. */
|
||||||
|
if (info_length > 65535)
|
||||||
|
{
|
||||||
|
my_printf_error(0, "MyISAM table '%s' has too many columns and/or "
|
||||||
|
"indexes and/or unique constraints.",
|
||||||
|
MYF(0), name + dirname_length(name));
|
||||||
|
my_errno= HA_WRONG_CREATE_OPTION;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
bmove(share.state.header.file_version,(byte*) myisam_file_magic,4);
|
bmove(share.state.header.file_version,(byte*) myisam_file_magic,4);
|
||||||
ci->old_options=options| (ci->old_options & HA_OPTION_TEMP_COMPRESS_RECORD ?
|
ci->old_options=options| (ci->old_options & HA_OPTION_TEMP_COMPRESS_RECORD ?
|
||||||
|
@ -620,6 +632,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||||
errpos=3;
|
errpos=3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DBUG_PRINT("info", ("write state info and base info"));
|
||||||
if (mi_state_info_write(file, &share.state, 2) ||
|
if (mi_state_info_write(file, &share.state, 2) ||
|
||||||
mi_base_info_write(file, &share.base))
|
mi_base_info_write(file, &share.base))
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -633,6 +646,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Write key and keyseg definitions */
|
/* Write key and keyseg definitions */
|
||||||
|
DBUG_PRINT("info", ("write key and keyseg definitions"));
|
||||||
for (i=0 ; i < share.base.keys - uniques; i++)
|
for (i=0 ; i < share.base.keys - uniques; i++)
|
||||||
{
|
{
|
||||||
uint sp_segs=(keydefs[i].flag & HA_SPATIAL) ? 2*SPDIMS : 0;
|
uint sp_segs=(keydefs[i].flag & HA_SPATIAL) ? 2*SPDIMS : 0;
|
||||||
|
@ -683,6 +697,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save unique definition */
|
/* Save unique definition */
|
||||||
|
DBUG_PRINT("info", ("write unique definitions"));
|
||||||
for (i=0 ; i < share.state.header.uniques ; i++)
|
for (i=0 ; i < share.state.header.uniques ; i++)
|
||||||
{
|
{
|
||||||
HA_KEYSEG *keyseg_end;
|
HA_KEYSEG *keyseg_end;
|
||||||
|
@ -713,6 +728,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
DBUG_PRINT("info", ("write field definitions"));
|
||||||
for (i=0 ; i < share.base.fields ; i++)
|
for (i=0 ; i < share.base.fields ; i++)
|
||||||
if (mi_recinfo_write(file, &recinfo[i]))
|
if (mi_recinfo_write(file, &recinfo[i]))
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -727,6 +743,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Enlarge files */
|
/* Enlarge files */
|
||||||
|
DBUG_PRINT("info", ("enlarge to keystart: %lu", (ulong) share.base.keystart));
|
||||||
if (my_chsize(file,(ulong) share.base.keystart,0,MYF(0)))
|
if (my_chsize(file,(ulong) share.base.keystart,0,MYF(0)))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
|
|
@ -34,13 +34,25 @@ int mi_delete_table(const char *name)
|
||||||
#ifdef USE_RAID
|
#ifdef USE_RAID
|
||||||
{
|
{
|
||||||
MI_INFO *info;
|
MI_INFO *info;
|
||||||
/* we use 'open_for_repair' to be able to delete a crashed table */
|
/*
|
||||||
if (!(info=mi_open(name, O_RDONLY, HA_OPEN_FOR_REPAIR)))
|
When built with RAID support, we need to determine if this table
|
||||||
DBUG_RETURN(my_errno);
|
makes use of the raid feature. If yes, we need to remove all raid
|
||||||
raid_type = info->s->base.raid_type;
|
chunks. This is done with my_raid_delete(). Unfortunately it is
|
||||||
raid_chunks = info->s->base.raid_chunks;
|
necessary to open the table just to check this. We use
|
||||||
|
'open_for_repair' to be able to open even a crashed table. If even
|
||||||
|
this open fails, we assume no raid configuration for this table
|
||||||
|
and try to remove the normal data file only. This may however
|
||||||
|
leave the raid chunks behind.
|
||||||
|
*/
|
||||||
|
if (!(info= mi_open(name, O_RDONLY, HA_OPEN_FOR_REPAIR)))
|
||||||
|
raid_type= 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
raid_type= info->s->base.raid_type;
|
||||||
|
raid_chunks= info->s->base.raid_chunks;
|
||||||
mi_close(info);
|
mi_close(info);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#ifdef EXTRA_DEBUG
|
#ifdef EXTRA_DEBUG
|
||||||
check_table_is_closed(name,"delete");
|
check_table_is_closed(name,"delete");
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1155,6 +1155,9 @@ int _mi_read_dynamic_record(MI_INFO *info, my_off_t filepos, byte *buf)
|
||||||
info->rec_cache.pos_in_file <= block_info.next_filepos &&
|
info->rec_cache.pos_in_file <= block_info.next_filepos &&
|
||||||
flush_io_cache(&info->rec_cache))
|
flush_io_cache(&info->rec_cache))
|
||||||
goto err;
|
goto err;
|
||||||
|
/* A corrupted table can have wrong pointers. (Bug# 19835) */
|
||||||
|
if (block_info.next_filepos == HA_OFFSET_ERROR)
|
||||||
|
goto panic;
|
||||||
info->rec_cache.seek_not_done=1;
|
info->rec_cache.seek_not_done=1;
|
||||||
if ((b_type=_mi_get_block_info(&block_info,file,
|
if ((b_type=_mi_get_block_info(&block_info,file,
|
||||||
block_info.next_filepos))
|
block_info.next_filepos))
|
||||||
|
|
|
@ -64,7 +64,7 @@ uint _mi_make_key(register MI_INFO *info, uint keynr, uchar *key,
|
||||||
TODO: nulls processing
|
TODO: nulls processing
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_SPATIAL
|
#ifdef HAVE_SPATIAL
|
||||||
return sp_make_key(info,keynr,key,record,filepos);
|
DBUG_RETURN(sp_make_key(info,keynr,key,record,filepos));
|
||||||
#else
|
#else
|
||||||
DBUG_ASSERT(0); /* mi_open should check that this never happens*/
|
DBUG_ASSERT(0); /* mi_open should check that this never happens*/
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -183,9 +183,11 @@ int rtree_find_first(MI_INFO *info, uint keynr, uchar *key, uint key_length,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save searched key */
|
/*
|
||||||
memcpy(info->first_mbr_key, key, keyinfo->keylength -
|
Save searched key, include data pointer.
|
||||||
info->s->base.rec_reflength);
|
The data pointer is required if the search_flag contains MBR_DATA.
|
||||||
|
*/
|
||||||
|
memcpy(info->first_mbr_key, key, keyinfo->keylength);
|
||||||
info->last_rkey_length = key_length;
|
info->last_rkey_length = key_length;
|
||||||
|
|
||||||
info->rtree_recursion_depth = -1;
|
info->rtree_recursion_depth = -1;
|
||||||
|
|
|
@ -52,10 +52,14 @@
|
||||||
if (EQUAL_CMP(amin, amax, bmin, bmax)) \
|
if (EQUAL_CMP(amin, amax, bmin, bmax)) \
|
||||||
return 1; \
|
return 1; \
|
||||||
} \
|
} \
|
||||||
else /* if (nextflag & MBR_DISJOINT) */ \
|
else if (nextflag & MBR_DISJOINT) \
|
||||||
{ \
|
{ \
|
||||||
if (DISJOINT_CMP(amin, amax, bmin, bmax)) \
|
if (DISJOINT_CMP(amin, amax, bmin, bmax)) \
|
||||||
return 1; \
|
return 1; \
|
||||||
|
}\
|
||||||
|
else /* if unknown comparison operator */ \
|
||||||
|
{ \
|
||||||
|
DBUG_ASSERT(0); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define RT_CMP_KORR(type, korr_func, len, nextflag) \
|
#define RT_CMP_KORR(type, korr_func, len, nextflag) \
|
||||||
|
|
|
@ -1689,6 +1689,22 @@ id c1 c2
|
||||||
9 abc ppc
|
9 abc ppc
|
||||||
drop table federated.t1, federated.t2;
|
drop table federated.t1, federated.t2;
|
||||||
drop table federated.t1, federated.t2;
|
drop table federated.t1, federated.t2;
|
||||||
|
create table t1 (id int not null auto_increment primary key, val int);
|
||||||
|
create table t1
|
||||||
|
(id int not null auto_increment primary key, val int) engine=federated
|
||||||
|
connection='mysql://root@127.0.0.1:SLAVE_PORT/test/t1';
|
||||||
|
insert into t1 values (1,0),(2,0);
|
||||||
|
update t1 set val = NULL where id = 1;
|
||||||
|
select * from t1;
|
||||||
|
id val
|
||||||
|
1 NULL
|
||||||
|
2 0
|
||||||
|
select * from t1;
|
||||||
|
id val
|
||||||
|
1 NULL
|
||||||
|
2 0
|
||||||
|
drop table t1;
|
||||||
|
drop table t1;
|
||||||
DROP TABLE IF EXISTS federated.t1;
|
DROP TABLE IF EXISTS federated.t1;
|
||||||
DROP DATABASE IF EXISTS federated;
|
DROP DATABASE IF EXISTS federated;
|
||||||
DROP TABLE IF EXISTS federated.t1;
|
DROP TABLE IF EXISTS federated.t1;
|
||||||
|
|
|
@ -81,6 +81,12 @@ makedate(1997,1)
|
||||||
select makedate(1997,0);
|
select makedate(1997,0);
|
||||||
makedate(1997,0)
|
makedate(1997,0)
|
||||||
NULL
|
NULL
|
||||||
|
select makedate(9999,365);
|
||||||
|
makedate(9999,365)
|
||||||
|
9999-12-31
|
||||||
|
select makedate(9999,366);
|
||||||
|
makedate(9999,366)
|
||||||
|
NULL
|
||||||
select addtime("1997-12-31 23:59:59.999999", "1 1:1:1.000002");
|
select addtime("1997-12-31 23:59:59.999999", "1 1:1:1.000002");
|
||||||
addtime("1997-12-31 23:59:59.999999", "1 1:1:1.000002")
|
addtime("1997-12-31 23:59:59.999999", "1 1:1:1.000002")
|
||||||
1998-01-02 01:01:01.000001
|
1998-01-02 01:01:01.000001
|
||||||
|
|
|
@ -361,6 +361,12 @@ extract(SECOND FROM "1999-01-02 10:11:12")
|
||||||
select extract(MONTH FROM "2001-02-00");
|
select extract(MONTH FROM "2001-02-00");
|
||||||
extract(MONTH FROM "2001-02-00")
|
extract(MONTH FROM "2001-02-00")
|
||||||
2
|
2
|
||||||
|
SELECT DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
|
||||||
|
DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE)
|
||||||
|
9999-12-31 00:00:00
|
||||||
|
SELECT DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
|
||||||
|
DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE)
|
||||||
|
9999-12-31 00:00:00
|
||||||
SELECT EXTRACT(QUARTER FROM '2004-01-15') AS quarter;
|
SELECT EXTRACT(QUARTER FROM '2004-01-15') AS quarter;
|
||||||
quarter
|
quarter
|
||||||
1
|
1
|
||||||
|
|
|
@ -816,3 +816,43 @@ check table t1 extended;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 check status OK
|
test.t1 check status OK
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
c1 geometry NOT NULL default '',
|
||||||
|
SPATIAL KEY i1 (c1(32))
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
INSERT INTO t1 (c1) VALUES (
|
||||||
|
PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
|
||||||
|
-18.6055555000 -66.8158332999,
|
||||||
|
-18.7186111000 -66.8102777000,
|
||||||
|
-18.7211111000 -66.9269443999,
|
||||||
|
-18.6086111000 -66.9327777000))'));
|
||||||
|
CHECK TABLE t1 EXTENDED;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
c1 geometry NOT NULL default '',
|
||||||
|
SPATIAL KEY i1 (c1(32))
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
INSERT INTO t1 (c1) VALUES (
|
||||||
|
PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
|
||||||
|
-18.6055555000 -66.8158332999,
|
||||||
|
-18.7186111000 -66.8102777000,
|
||||||
|
-18.7211111000 -66.9269443999,
|
||||||
|
-18.6086111000 -66.9327777000))'));
|
||||||
|
INSERT INTO t1 (c1) VALUES (
|
||||||
|
PolygonFromText('POLYGON((-65.7402776999 -96.6686111000,
|
||||||
|
-65.7372222000 -96.5516666000,
|
||||||
|
-65.8502777000 -96.5461111000,
|
||||||
|
-65.8527777000 -96.6627777000,
|
||||||
|
-65.7402776999 -96.6686111000))'));
|
||||||
|
INSERT INTO t1 (c1) VALUES (
|
||||||
|
PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
|
||||||
|
-18.6055555000 -66.8158332999,
|
||||||
|
-18.7186111000 -66.8102777000,
|
||||||
|
-18.7211111000 -66.9269443999,
|
||||||
|
-18.6086111000 -66.9327777000))'));
|
||||||
|
CHECK TABLE t1 EXTENDED;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
|
@ -74,18 +74,24 @@ t9 CREATE TABLE `t9` (
|
||||||
) ENGINE=MyISAM AUTO_INCREMENT=16725 DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/tmp/' INDEX DIRECTORY='MYSQLTEST_VARDIR/run/'
|
) ENGINE=MyISAM AUTO_INCREMENT=16725 DEFAULT CHARSET=latin1 DATA DIRECTORY='MYSQLTEST_VARDIR/tmp/' INDEX DIRECTORY='MYSQLTEST_VARDIR/run/'
|
||||||
drop database mysqltest;
|
drop database mysqltest;
|
||||||
create table t1 (a int not null) engine=myisam;
|
create table t1 (a int not null) engine=myisam;
|
||||||
|
Warnings:
|
||||||
|
Warning 0 DATA DIRECTORY option ignored
|
||||||
show create table t1;
|
show create table t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(11) NOT NULL
|
`a` int(11) NOT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
alter table t1 add b int;
|
alter table t1 add b int;
|
||||||
|
Warnings:
|
||||||
|
Warning 0 DATA DIRECTORY option ignored
|
||||||
show create table t1;
|
show create table t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(11) NOT NULL,
|
`a` int(11) NOT NULL,
|
||||||
`b` int(11) default NULL
|
`b` int(11) default NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
Warnings:
|
||||||
|
Warning 0 INDEX DIRECTORY option ignored
|
||||||
show create table t1;
|
show create table t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
|
|
|
@ -1365,4 +1365,23 @@ drop table federated.t1, federated.t2;
|
||||||
connection slave;
|
connection slave;
|
||||||
drop table federated.t1, federated.t2;
|
drop table federated.t1, federated.t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #16494: Updates that set a column to NULL fail sometimes
|
||||||
|
#
|
||||||
|
connection slave;
|
||||||
|
create table t1 (id int not null auto_increment primary key, val int);
|
||||||
|
connection master;
|
||||||
|
--replace_result $SLAVE_MYPORT SLAVE_PORT
|
||||||
|
eval create table t1
|
||||||
|
(id int not null auto_increment primary key, val int) engine=federated
|
||||||
|
connection='mysql://root@127.0.0.1:$SLAVE_MYPORT/test/t1';
|
||||||
|
insert into t1 values (1,0),(2,0);
|
||||||
|
update t1 set val = NULL where id = 1;
|
||||||
|
select * from t1;
|
||||||
|
connection slave;
|
||||||
|
select * from t1;
|
||||||
|
drop table t1;
|
||||||
|
connection master;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
source include/federated_cleanup.inc;
|
source include/federated_cleanup.inc;
|
||||||
|
|
|
@ -43,6 +43,8 @@ select weekofyear("1997-11-30 23:59:59.000001");
|
||||||
|
|
||||||
select makedate(1997,1);
|
select makedate(1997,1);
|
||||||
select makedate(1997,0);
|
select makedate(1997,0);
|
||||||
|
select makedate(9999,365);
|
||||||
|
select makedate(9999,366);
|
||||||
|
|
||||||
#Time functions
|
#Time functions
|
||||||
|
|
||||||
|
|
|
@ -143,6 +143,10 @@ select extract(SECOND FROM "1999-01-02 10:11:12");
|
||||||
select extract(MONTH FROM "2001-02-00");
|
select extract(MONTH FROM "2001-02-00");
|
||||||
|
|
||||||
#
|
#
|
||||||
|
# MySQL Bugs: #12356: DATE_SUB or DATE_ADD incorrectly returns null
|
||||||
|
#
|
||||||
|
SELECT DATE_SUB(str_to_date('9999-12-31 00:01:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
|
||||||
|
SELECT DATE_ADD(str_to_date('9999-12-30 23:59:00','%Y-%m-%d %H:%i:%s'), INTERVAL 1 MINUTE);
|
||||||
# test EXTRACT QUARTER (Bug #18100)
|
# test EXTRACT QUARTER (Bug #18100)
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
|
@ -187,4 +187,48 @@ check table t1 extended;
|
||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#17877 - Corrupted spatial index
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
c1 geometry NOT NULL default '',
|
||||||
|
SPATIAL KEY i1 (c1(32))
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
INSERT INTO t1 (c1) VALUES (
|
||||||
|
PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
|
||||||
|
-18.6055555000 -66.8158332999,
|
||||||
|
-18.7186111000 -66.8102777000,
|
||||||
|
-18.7211111000 -66.9269443999,
|
||||||
|
-18.6086111000 -66.9327777000))'));
|
||||||
|
# This showed a missing key.
|
||||||
|
CHECK TABLE t1 EXTENDED;
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
c1 geometry NOT NULL default '',
|
||||||
|
SPATIAL KEY i1 (c1(32))
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||||
|
INSERT INTO t1 (c1) VALUES (
|
||||||
|
PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
|
||||||
|
-18.6055555000 -66.8158332999,
|
||||||
|
-18.7186111000 -66.8102777000,
|
||||||
|
-18.7211111000 -66.9269443999,
|
||||||
|
-18.6086111000 -66.9327777000))'));
|
||||||
|
INSERT INTO t1 (c1) VALUES (
|
||||||
|
PolygonFromText('POLYGON((-65.7402776999 -96.6686111000,
|
||||||
|
-65.7372222000 -96.5516666000,
|
||||||
|
-65.8502777000 -96.5461111000,
|
||||||
|
-65.8527777000 -96.6627777000,
|
||||||
|
-65.7402776999 -96.6686111000))'));
|
||||||
|
# This is the same as the first insert to get a non-unique key.
|
||||||
|
INSERT INTO t1 (c1) VALUES (
|
||||||
|
PolygonFromText('POLYGON((-18.6086111000 -66.9327777000,
|
||||||
|
-18.6055555000 -66.8158332999,
|
||||||
|
-18.7186111000 -66.8102777000,
|
||||||
|
-18.7211111000 -66.9269443999,
|
||||||
|
-18.6086111000 -66.9327777000))'));
|
||||||
|
# This showed (and still shows) OK.
|
||||||
|
CHECK TABLE t1 EXTENDED;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
|
@ -1810,18 +1810,12 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
||||||
/*
|
/*
|
||||||
buffers for following strings
|
buffers for following strings
|
||||||
*/
|
*/
|
||||||
char old_field_value_buffer[STRING_BUFFER_USUAL_SIZE];
|
char field_value_buffer[STRING_BUFFER_USUAL_SIZE];
|
||||||
char new_field_value_buffer[STRING_BUFFER_USUAL_SIZE];
|
|
||||||
char update_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
char update_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
||||||
char where_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
char where_buffer[FEDERATED_QUERY_BUFFER_SIZE];
|
||||||
|
|
||||||
/* stores the value to be replaced of the field were are updating */
|
/* Work area for field values */
|
||||||
String old_field_value(old_field_value_buffer,
|
String field_value(field_value_buffer, sizeof(field_value_buffer),
|
||||||
sizeof(old_field_value_buffer),
|
|
||||||
&my_charset_bin);
|
|
||||||
/* stores the new value of the field */
|
|
||||||
String new_field_value(new_field_value_buffer,
|
|
||||||
sizeof(new_field_value_buffer),
|
|
||||||
&my_charset_bin);
|
&my_charset_bin);
|
||||||
/* stores the update query */
|
/* stores the update query */
|
||||||
String update_string(update_buffer,
|
String update_string(update_buffer,
|
||||||
|
@ -1835,8 +1829,7 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
||||||
/*
|
/*
|
||||||
set string lengths to 0 to avoid misc chars in string
|
set string lengths to 0 to avoid misc chars in string
|
||||||
*/
|
*/
|
||||||
old_field_value.length(0);
|
field_value.length(0);
|
||||||
new_field_value.length(0);
|
|
||||||
update_string.length(0);
|
update_string.length(0);
|
||||||
where_string.length(0);
|
where_string.length(0);
|
||||||
|
|
||||||
|
@ -1850,8 +1843,8 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
||||||
In this loop, we want to match column names to values being inserted
|
In this loop, we want to match column names to values being inserted
|
||||||
(while building INSERT statement).
|
(while building INSERT statement).
|
||||||
|
|
||||||
Iterate through table->field (new data) and share->old_filed (old_data)
|
Iterate through table->field (new data) and share->old_field (old_data)
|
||||||
using the same index to created an SQL UPDATE statement, new data is
|
using the same index to create an SQL UPDATE statement. New data is
|
||||||
used to create SET field=value and old data is used to create WHERE
|
used to create SET field=value and old data is used to create WHERE
|
||||||
field=oldvalue
|
field=oldvalue
|
||||||
*/
|
*/
|
||||||
|
@ -1863,30 +1856,28 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
||||||
update_string.append(FEDERATED_EQ);
|
update_string.append(FEDERATED_EQ);
|
||||||
|
|
||||||
if ((*field)->is_null())
|
if ((*field)->is_null())
|
||||||
new_field_value.append(FEDERATED_NULL);
|
update_string.append(FEDERATED_NULL);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* otherwise = */
|
/* otherwise = */
|
||||||
(*field)->val_str(&new_field_value);
|
(*field)->val_str(&field_value);
|
||||||
(*field)->quote_data(&new_field_value);
|
(*field)->quote_data(&field_value);
|
||||||
|
update_string.append(field_value);
|
||||||
if (!field_in_record_is_null(table, *field, (char*) old_data))
|
field_value.length(0);
|
||||||
where_string.append(FEDERATED_EQ);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (field_in_record_is_null(table, *field, (char*) old_data))
|
if (field_in_record_is_null(table, *field, (char*) old_data))
|
||||||
where_string.append(FEDERATED_ISNULL);
|
where_string.append(FEDERATED_ISNULL);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
(*field)->val_str(&old_field_value,
|
where_string.append(FEDERATED_EQ);
|
||||||
|
(*field)->val_str(&field_value,
|
||||||
(char*) (old_data + (*field)->offset()));
|
(char*) (old_data + (*field)->offset()));
|
||||||
(*field)->quote_data(&old_field_value);
|
(*field)->quote_data(&field_value);
|
||||||
where_string.append(old_field_value);
|
where_string.append(field_value);
|
||||||
|
field_value.length(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
update_string.append(new_field_value);
|
|
||||||
new_field_value.length(0);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Only append conjunctions if we have another field in which
|
Only append conjunctions if we have another field in which
|
||||||
to iterate
|
to iterate
|
||||||
|
@ -1896,7 +1887,6 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
|
||||||
update_string.append(FEDERATED_COMMA);
|
update_string.append(FEDERATED_COMMA);
|
||||||
where_string.append(FEDERATED_AND);
|
where_string.append(FEDERATED_AND);
|
||||||
}
|
}
|
||||||
old_field_value.length(0);
|
|
||||||
}
|
}
|
||||||
update_string.append(FEDERATED_WHERE);
|
update_string.append(FEDERATED_WHERE);
|
||||||
update_string.append(where_string);
|
update_string.append(where_string);
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
/* TODO: Move month and days to language files */
|
/* TODO: Move month and days to language files */
|
||||||
|
|
||||||
|
/* Day number for Dec 31st, 9999 */
|
||||||
#define MAX_DAY_NUMBER 3652424L
|
#define MAX_DAY_NUMBER 3652424L
|
||||||
|
|
||||||
static const char *month_names[]=
|
static const char *month_names[]=
|
||||||
|
@ -408,7 +409,7 @@ static bool extract_date_time(DATE_TIME_FORMAT *format,
|
||||||
if (yearday > 0)
|
if (yearday > 0)
|
||||||
{
|
{
|
||||||
uint days= calc_daynr(l_time->year,1,1) + yearday - 1;
|
uint days= calc_daynr(l_time->year,1,1) + yearday - 1;
|
||||||
if (days <= 0 || days >= MAX_DAY_NUMBER)
|
if (days <= 0 || days > MAX_DAY_NUMBER)
|
||||||
goto err;
|
goto err;
|
||||||
get_date_from_daynr(days,&l_time->year,&l_time->month,&l_time->day);
|
get_date_from_daynr(days,&l_time->year,&l_time->month,&l_time->day);
|
||||||
}
|
}
|
||||||
|
@ -454,7 +455,7 @@ static bool extract_date_time(DATE_TIME_FORMAT *format,
|
||||||
(weekday - 1);
|
(weekday - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (days <= 0 || days >= MAX_DAY_NUMBER)
|
if (days <= 0 || days > MAX_DAY_NUMBER)
|
||||||
goto err;
|
goto err;
|
||||||
get_date_from_daynr(days,&l_time->year,&l_time->month,&l_time->day);
|
get_date_from_daynr(days,&l_time->year,&l_time->month,&l_time->day);
|
||||||
}
|
}
|
||||||
|
@ -2035,7 +2036,7 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
|
||||||
ltime->hour= (uint) (sec/3600);
|
ltime->hour= (uint) (sec/3600);
|
||||||
daynr= calc_daynr(ltime->year,ltime->month,1) + days;
|
daynr= calc_daynr(ltime->year,ltime->month,1) + days;
|
||||||
/* Day number from year 0 to 9999-12-31 */
|
/* Day number from year 0 to 9999-12-31 */
|
||||||
if ((ulonglong) daynr >= MAX_DAY_NUMBER)
|
if ((ulonglong) daynr > MAX_DAY_NUMBER)
|
||||||
goto invalid_date;
|
goto invalid_date;
|
||||||
get_date_from_daynr((long) daynr, <ime->year, <ime->month,
|
get_date_from_daynr((long) daynr, <ime->year, <ime->month,
|
||||||
<ime->day);
|
<ime->day);
|
||||||
|
@ -2046,7 +2047,7 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
|
||||||
period= (calc_daynr(ltime->year,ltime->month,ltime->day) +
|
period= (calc_daynr(ltime->year,ltime->month,ltime->day) +
|
||||||
sign * (long) interval.day);
|
sign * (long) interval.day);
|
||||||
/* Daynumber from year 0 to 9999-12-31 */
|
/* Daynumber from year 0 to 9999-12-31 */
|
||||||
if ((ulong) period >= MAX_DAY_NUMBER)
|
if ((ulong) period > MAX_DAY_NUMBER)
|
||||||
goto invalid_date;
|
goto invalid_date;
|
||||||
get_date_from_daynr((long) period,<ime->year,<ime->month,<ime->day);
|
get_date_from_daynr((long) period,<ime->year,<ime->month,<ime->day);
|
||||||
break;
|
break;
|
||||||
|
@ -2570,7 +2571,7 @@ String *Item_func_makedate::val_str(String *str)
|
||||||
|
|
||||||
days= calc_daynr(yearnr,1,1) + daynr - 1;
|
days= calc_daynr(yearnr,1,1) + daynr - 1;
|
||||||
/* Day number from year 0 to 9999-12-31 */
|
/* Day number from year 0 to 9999-12-31 */
|
||||||
if (days >= 0 && days < MAX_DAY_NUMBER)
|
if (days >= 0 && days <= MAX_DAY_NUMBER)
|
||||||
{
|
{
|
||||||
null_value=0;
|
null_value=0;
|
||||||
get_date_from_daynr(days,&l_time.year,&l_time.month,&l_time.day);
|
get_date_from_daynr(days,&l_time.year,&l_time.month,&l_time.day);
|
||||||
|
|
|
@ -3057,6 +3057,12 @@ end_with_restore_list:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Don't yet allow changing of symlinks with ALTER TABLE */
|
/* Don't yet allow changing of symlinks with ALTER TABLE */
|
||||||
|
if (lex->create_info.data_file_name)
|
||||||
|
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0,
|
||||||
|
"DATA DIRECTORY option ignored");
|
||||||
|
if (lex->create_info.index_file_name)
|
||||||
|
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, 0,
|
||||||
|
"INDEX DIRECTORY option ignored");
|
||||||
lex->create_info.data_file_name=lex->create_info.index_file_name=0;
|
lex->create_info.data_file_name=lex->create_info.index_file_name=0;
|
||||||
/* ALTER TABLE ends previous transaction */
|
/* ALTER TABLE ends previous transaction */
|
||||||
if (end_active_trans(thd))
|
if (end_active_trans(thd))
|
||||||
|
|
Loading…
Add table
Reference in a new issue