Commit e29cc5d5 authored by ingo@mysql.com's avatar ingo@mysql.com

Merge mysql.com:/home/mydev/mysql-5.0--main

into  mysql.com:/home/mydev/mysql-5.0-bug11824
parents 1054e8f6 02c8e6b0
...@@ -1158,13 +1158,14 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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,12 +34,24 @@ int mi_delete_table(const char *name) ...@@ -34,12 +34,24 @@ 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
mi_close(info); '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);
}
} }
#ifdef EXTRA_DEBUG #ifdef EXTRA_DEBUG
check_table_is_closed(name,"delete"); check_table_is_closed(name,"delete");
......
...@@ -1155,6 +1155,9 @@ int _mi_read_dynamic_record(MI_INFO *info, my_off_t filepos, byte *buf) ...@@ -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, ...@@ -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, ...@@ -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 @@ ...@@ -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 ...@@ -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) ...@@ -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") ...@@ -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; ...@@ -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` ( ...@@ -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; ...@@ -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"); ...@@ -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"); ...@@ -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; ...@@ -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,19 +1810,13 @@ int ha_federated::update_row(const byte *old_data, byte *new_data) ...@@ -1810,19 +1810,13 @@ 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);
&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);
/* stores the update query */ /* stores the update query */
String update_string(update_buffer, String update_string(update_buffer,
sizeof(update_buffer), sizeof(update_buffer),
...@@ -1835,8 +1829,7 @@ int ha_federated::update_row(const byte *old_data, byte *new_data) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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, &ltime->year, &ltime->month, get_date_from_daynr((long) daynr, &ltime->year, &ltime->month,
&ltime->day); &ltime->day);
...@@ -2046,7 +2047,7 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date) ...@@ -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,&ltime->year,&ltime->month,&ltime->day); get_date_from_daynr((long) period,&ltime->year,&ltime->month,&ltime->day);
break; break;
...@@ -2570,7 +2571,7 @@ String *Item_func_makedate::val_str(String *str) ...@@ -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 @@ mysql_execute_command(THD *thd) ...@@ -3057,6 +3057,12 @@ mysql_execute_command(THD *thd)
} }
} }
/* 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))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment