Commit e8fc6d46 authored by unknown's avatar unknown

Merge gbichot@bk-internal.mysql.com:/home/bk/mysql-4.0

into mysql.com:/home/mysql_src/mysql-4.0

parents b9418600 25be07f0
...@@ -103,6 +103,7 @@ serg@serg.mylan ...@@ -103,6 +103,7 @@ serg@serg.mylan
serg@serg.mysql.com serg@serg.mysql.com
serg@sergbook.mylan serg@sergbook.mylan
serg@sergbook.mysql.com serg@sergbook.mysql.com
sergefp@mysql.com
sinisa@rhols221.adsl.netsonic.fi sinisa@rhols221.adsl.netsonic.fi
tfr@beta.frontier86.ee tfr@beta.frontier86.ee
tfr@indrek.tfr.cafe.ee tfr@indrek.tfr.cafe.ee
......
...@@ -327,3 +327,29 @@ select t1.a, t1.b,t2.a, t2.b from t1 left join t2 on t1.a=t2.a where t1.b=1 and ...@@ -327,3 +327,29 @@ select t1.a, t1.b,t2.a, t2.b from t1 left join t2 on t1.a=t2.a where t1.b=1 and
a b a b a b a b
2 2 NULL NULL 2 2 NULL NULL
drop table t1,t2; drop table t1,t2;
set @ttype_save=@@table_type;
set @@table_type=innodb;
create table t1 ( c char(8) not null );
insert into t1 values ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9');
insert into t1 values ('A'),('B'),('C'),('D'),('E'),('F');
alter table t1 add b char(8) not null;
alter table t1 add a char(8) not null;
alter table t1 add primary key (a,b,c);
update t1 set a=c, b=c;
create table t2 like t1;
insert into t2 select * from t1;
delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b;
drop table t1,t2;
set @@table_type=bdb;
create table t1 ( c char(8) not null );
insert into t1 values ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9');
insert into t1 values ('A'),('B'),('C'),('D'),('E'),('F');
alter table t1 add b char(8) not null;
alter table t1 add a char(8) not null;
alter table t1 add primary key (a,b,c);
update t1 set a=c, b=c;
create table t2 like t1;
insert into t2 select * from t1;
delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b;
set @@table_type=@ttype_save;
drop table t1,t2;
drop table if exists t1; drop table if exists t1;
create table t1 (t datetime); create table t1 (t datetime);
insert into t1 values(101),(691231),(700101),(991231),(10000101),(99991231),(101000000),(691231000000),(700101000000),(991231235959),(10000101000000),(99991231235959); insert into t1 values(101),(691231),(700101),(991231),(10000101),(99991231),(101000000),(691231000000),(700101000000),(991231235959),(10000101000000),(99991231235959),(20030102030460),(20030102036301),(20030102240401),(20030132030401),(20031302030460);
select * from t1; select * from t1;
t t
2000-01-01 00:00:00 2000-01-01 00:00:00
...@@ -15,6 +15,11 @@ t ...@@ -15,6 +15,11 @@ t
1999-12-31 23:59:59 1999-12-31 23:59:59
1000-01-01 00:00:00 1000-01-01 00:00:00
9999-12-31 23:59:59 9999-12-31 23:59:59
0000-00-00 00:00:00
0000-00-00 00:00:00
0000-00-00 00:00:00
0000-00-00 00:00:00
0000-00-00 00:00:00
delete from t1 where t > 0; delete from t1 where t > 0;
optimize table t1; optimize table t1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
...@@ -22,7 +27,8 @@ test.t1 optimize status OK ...@@ -22,7 +27,8 @@ test.t1 optimize status OK
check table t1; check table t1;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 check status OK test.t1 check status OK
insert into t1 values("000101"),("691231"),("700101"),("991231"),("00000101"),("00010101"),("99991231"),("00101000000"),("691231000000"),("700101000000"),("991231235959"),("10000101000000"),("99991231235959"); delete from t1;
insert into t1 values("000101"),("691231"),("700101"),("991231"),("00000101"),("00010101"),("99991231"),("00101000000"),("691231000000"),("700101000000"),("991231235959"),("10000101000000"),("99991231235959"),("20030102030460"),("20030102036301"),("20030102240401"),("20030132030401"),("20031302030460");
select * from t1; select * from t1;
t t
2000-01-01 00:00:00 2000-01-01 00:00:00
...@@ -38,6 +44,11 @@ t ...@@ -38,6 +44,11 @@ t
1999-12-31 23:59:59 1999-12-31 23:59:59
1000-01-01 00:00:00 1000-01-01 00:00:00
9999-12-31 23:59:59 9999-12-31 23:59:59
0000-00-00 00:00:00
0000-00-00 00:00:00
0000-00-00 00:00:00
0000-00-00 00:00:00
0000-00-00 00:00:00
drop table t1; drop table t1;
CREATE TABLE t1 (a timestamp, b date, c time, d datetime); CREATE TABLE t1 (a timestamp, b date, c time, d datetime);
insert into t1 (b,c,d) values(now(),curtime(),now()); insert into t1 (b,c,d) values(now(),curtime(),now());
......
...@@ -43,7 +43,7 @@ date_format(a,"%Y %y") year(a) year(now()) ...@@ -43,7 +43,7 @@ date_format(a,"%Y %y") year(a) year(now())
1970 70 1970 1970 1970 70 1970 1970
drop table t1; drop table t1;
create table t1 (ix timestamp); create table t1 (ix timestamp);
insert into t1 values (19991101000000),(19990102030405),(19990630232922),(19990601000000),(19990930232922),(19990531232922),(19990501000000),(19991101000000),(19990501000000); insert into t1 values (19991101000000),(19990102030405),(19990630232922),(19990601000000),(19990930232922),(19990531232922),(19990501000000),(19991101000000),(19990501000000),(20030101010160),(20030101016001),(20030101240101),(20030132010101),(20031301010101);
select * from t1; select * from t1;
ix ix
19991101000000 19991101000000
...@@ -55,6 +55,24 @@ ix ...@@ -55,6 +55,24 @@ ix
19990501000000 19990501000000
19991101000000 19991101000000
19990501000000 19990501000000
00000000000000
00000000000000
00000000000000
00000000000000
00000000000000
delete from t1;
insert into t1 values ("19991101000000"),("19990102030405"),("19990630232922"),("19990601000000"),("20030101010160"),("20030101016001"),("20030101240101"),("20030132010101"),("20031301010101");
select * from t1;
ix
19991101000000
19990102030405
19990630232922
19990601000000
00000000000000
00000000000000
00000000000000
00000000000000
00000000000000
drop table t1; drop table t1;
CREATE TABLE t1 (date date, date_time datetime, time_stamp timestamp); CREATE TABLE t1 (date date, date_time datetime, time_stamp timestamp);
INSERT INTO t1 VALUES ("1998-12-31","1998-12-31 23:59:59",19981231235959); INSERT INTO t1 VALUES ("1998-12-31","1998-12-31 23:59:59",19981231235959);
......
...@@ -267,3 +267,49 @@ insert into t2 values (1,1), (3,1); ...@@ -267,3 +267,49 @@ insert into t2 values (1,1), (3,1);
update t1 left join t2 on t1.a=t2.a set t1.b=2, t2.b=2 where t1.b=1 and t2.b=1 or t2.a is NULL; update t1 left join t2 on t1.a=t2.a set t1.b=2, t2.b=2 where t1.b=1 and t2.b=1 or t2.a is NULL;
select t1.a, t1.b,t2.a, t2.b from t1 left join t2 on t1.a=t2.a where t1.b=1 and t2.b=1 or t2.a is NULL; select t1.a, t1.b,t2.a, t2.b from t1 left join t2 on t1.a=t2.a where t1.b=1 and t2.b=1 or t2.a is NULL;
drop table t1,t2; drop table t1,t2;
#
# Test for bug #1980.
#
set @ttype_save=@@table_type;
--disable_warnings
set @@table_type=innodb;
create table t1 ( c char(8) not null );
--enable_warnings
insert into t1 values ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9');
insert into t1 values ('A'),('B'),('C'),('D'),('E'),('F');
alter table t1 add b char(8) not null;
alter table t1 add a char(8) not null;
alter table t1 add primary key (a,b,c);
update t1 set a=c, b=c;
create table t2 like t1;
insert into t2 select * from t1;
delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b;
drop table t1,t2;
--disable_warnings
set @@table_type=bdb;
create table t1 ( c char(8) not null );
--enable_warnings
insert into t1 values ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9');
insert into t1 values ('A'),('B'),('C'),('D'),('E'),('F');
alter table t1 add b char(8) not null;
alter table t1 add a char(8) not null;
alter table t1 add primary key (a,b,c);
update t1 set a=c, b=c;
create table t2 like t1;
insert into t2 select * from t1;
delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b;
set @@table_type=@ttype_save;
drop table t1,t2;
...@@ -4,12 +4,13 @@ ...@@ -4,12 +4,13 @@
drop table if exists t1; drop table if exists t1;
create table t1 (t datetime); create table t1 (t datetime);
insert into t1 values(101),(691231),(700101),(991231),(10000101),(99991231),(101000000),(691231000000),(700101000000),(991231235959),(10000101000000),(99991231235959); insert into t1 values(101),(691231),(700101),(991231),(10000101),(99991231),(101000000),(691231000000),(700101000000),(991231235959),(10000101000000),(99991231235959),(20030102030460),(20030102036301),(20030102240401),(20030132030401),(20031302030460);
select * from t1; select * from t1;
delete from t1 where t > 0; delete from t1 where t > 0;
optimize table t1; optimize table t1;
check table t1; check table t1;
insert into t1 values("000101"),("691231"),("700101"),("991231"),("00000101"),("00010101"),("99991231"),("00101000000"),("691231000000"),("700101000000"),("991231235959"),("10000101000000"),("99991231235959"); delete from t1;
insert into t1 values("000101"),("691231"),("700101"),("991231"),("00000101"),("00010101"),("99991231"),("00101000000"),("691231000000"),("700101000000"),("991231235959"),("10000101000000"),("99991231235959"),("20030102030460"),("20030102036301"),("20030102240401"),("20030132030401"),("20031302030460");
select * from t1; select * from t1;
drop table t1; drop table t1;
......
...@@ -34,7 +34,10 @@ select date_format(a,"%Y %y"),year(a),year(now()) from t1; ...@@ -34,7 +34,10 @@ select date_format(a,"%Y %y"),year(a),year(now()) from t1;
drop table t1; drop table t1;
create table t1 (ix timestamp); create table t1 (ix timestamp);
insert into t1 values (19991101000000),(19990102030405),(19990630232922),(19990601000000),(19990930232922),(19990531232922),(19990501000000),(19991101000000),(19990501000000); insert into t1 values (19991101000000),(19990102030405),(19990630232922),(19990601000000),(19990930232922),(19990531232922),(19990501000000),(19991101000000),(19990501000000),(20030101010160),(20030101016001),(20030101240101),(20030132010101),(20031301010101);
select * from t1;
delete from t1;
insert into t1 values ("19991101000000"),("19990102030405"),("19990630232922"),("19990601000000"),("20030101010160"),("20030101016001"),("20030101240101"),("20030132010101"),("20031301010101");
select * from t1; select * from t1;
drop table t1; drop table t1;
......
...@@ -2520,30 +2520,58 @@ void Field_timestamp::store(double nr) ...@@ -2520,30 +2520,58 @@ void Field_timestamp::store(double nr)
** function. ** function.
*/ */
static longlong fix_datetime(longlong nr) static longlong fix_datetime(longlong nr, TIME *time_res)
{ {
long part1,part2;
if (nr == LL(0) || nr >= LL(10000101000000)) if (nr == LL(0) || nr >= LL(10000101000000))
return nr; // Normal datetime >= Year 1000 goto ok;
if (nr < 101) if (nr < 101)
goto err; goto err;
if (nr <= (YY_PART_YEAR-1)*10000L+1231L) if (nr <= (YY_PART_YEAR-1)*10000L+1231L)
return (nr+20000000L)*1000000L; // YYMMDD, year: 2000-2069 {
nr= (nr+20000000L)*1000000L; // YYMMDD, year: 2000-2069
goto ok;
}
if (nr < (YY_PART_YEAR)*10000L+101L) if (nr < (YY_PART_YEAR)*10000L+101L)
goto err; goto err;
if (nr <= 991231L) if (nr <= 991231L)
return (nr+19000000L)*1000000L; // YYMMDD, year: 1970-1999 {
nr= (nr+19000000L)*1000000L; // YYMMDD, year: 1970-1999
goto ok;
}
if (nr < 10000101L) if (nr < 10000101L)
goto err; goto err;
if (nr <= 99991231L) if (nr <= 99991231L)
return nr*1000000L; {
nr= nr*1000000L;
goto ok;
}
if (nr < 101000000L) if (nr < 101000000L)
goto err; goto err;
if (nr <= (YY_PART_YEAR-1)*LL(10000000000)+LL(1231235959)) if (nr <= (YY_PART_YEAR-1)*LL(10000000000)+LL(1231235959))
return nr+LL(20000000000000); // YYMMDDHHMMSS, 2000-2069 {
nr= nr+LL(20000000000000); // YYMMDDHHMMSS, 2000-2069
goto ok;
}
if (nr < YY_PART_YEAR*LL(10000000000)+ LL(101000000)) if (nr < YY_PART_YEAR*LL(10000000000)+ LL(101000000))
goto err; goto err;
if (nr <= LL(991231235959)) if (nr <= LL(991231235959))
return nr+LL(19000000000000); // YYMMDDHHMMSS, 1970-1999 nr= nr+LL(19000000000000); // YYMMDDHHMMSS, 1970-1999
ok:
part1=(long) (nr/LL(1000000));
part2=(long) (nr - (longlong) part1*LL(1000000));
time_res->year= (int) (part1/10000L); part1%=10000L;
time_res->month= (int) part1 / 100;
time_res->day= (int) part1 % 100;
time_res->hour= (int) (part2/10000L); part2%=10000L;
time_res->minute=(int) part2 / 100;
time_res->second=(int) part2 % 100;
if (time_res->month <= 12 && time_res->day <= 31 && time_res->hour <= 23 &&
time_res->minute <= 59 && time_res->second <= 59)
return nr;
err: err:
current_thd->cuted_fields++; current_thd->cuted_fields++;
...@@ -2555,19 +2583,17 @@ void Field_timestamp::store(longlong nr) ...@@ -2555,19 +2583,17 @@ void Field_timestamp::store(longlong nr)
{ {
TIME l_time; TIME l_time;
time_t timestamp; time_t timestamp;
long part1,part2;
if ((nr=fix_datetime(nr))) if ((nr=fix_datetime(nr, &l_time)))
{ {
long not_used; long not_used;
part1=(long) (nr/LL(1000000));
part2=(long) (nr - (longlong) part1*LL(1000000)); if (l_time.year >= TIMESTAMP_MAX_YEAR || l_time.year < 1900+YY_PART_YEAR)
l_time.year= (int) (part1/10000L); part1%=10000L; {
l_time.month= (int) part1 / 100; current_thd->cuted_fields++;
l_time.day= (int) part1 % 100; timestamp=0;
l_time.hour= (int) (part2/10000L); part2%=10000L; }
l_time.minute=(int) part2 / 100; else
l_time.second=(int) part2 % 100;
timestamp=my_gmt_sec(&l_time, &not_used); timestamp=my_gmt_sec(&l_time, &not_used);
} }
else else
...@@ -3406,13 +3432,15 @@ void Field_datetime::store(double nr) ...@@ -3406,13 +3432,15 @@ void Field_datetime::store(double nr)
void Field_datetime::store(longlong nr) void Field_datetime::store(longlong nr)
{ {
if (nr < 0 || nr > LL(99991231235959)) TIME l_time;
nr=fix_datetime(nr, &l_time);
if (l_time.year > 9999)
{ {
nr=0; nr=0;
current_thd->cuted_fields++; current_thd->cuted_fields++;
} }
else
nr=fix_datetime(nr);
#ifdef WORDS_BIGENDIAN #ifdef WORDS_BIGENDIAN
if (table->db_low_byte_first) if (table->db_low_byte_first)
{ {
......
...@@ -37,14 +37,20 @@ ...@@ -37,14 +37,20 @@
int unique_write_to_file(gptr key, element_count count, Unique *unique) int unique_write_to_file(gptr key, element_count count, Unique *unique)
{ {
/*
Use unique->size (size of element stored in the tree) and not
unique->tree.size_of_element. The latter is different from unique->size
when tree implementation chooses to store pointer to key in TREE_ELEMENT
(instead of storing the element itself there)
*/
return my_b_write(&unique->file, (byte*) key, return my_b_write(&unique->file, (byte*) key,
unique->tree.size_of_element) ? 1 : 0; unique->size) ? 1 : 0;
} }
int unique_write_to_ptrs(gptr key, element_count count, Unique *unique) int unique_write_to_ptrs(gptr key, element_count count, Unique *unique)
{ {
memcpy(unique->record_pointers, key, unique->tree.size_of_element); memcpy(unique->record_pointers, key, unique->size);
unique->record_pointers+=unique->tree.size_of_element; unique->record_pointers+=unique->size;
return 0; return 0;
} }
...@@ -132,7 +138,7 @@ bool Unique::get(TABLE *table) ...@@ -132,7 +138,7 @@ bool Unique::get(TABLE *table)
bzero((char*) &sort_param,sizeof(sort_param)); bzero((char*) &sort_param,sizeof(sort_param));
sort_param.max_rows= elements; sort_param.max_rows= elements;
sort_param.sort_form=table; sort_param.sort_form=table;
sort_param.sort_length=sort_param.ref_length=tree.size_of_element; sort_param.sort_length=sort_param.ref_length=size;
sort_param.keys= max_in_memory_size / sort_param.sort_length; sort_param.keys= max_in_memory_size / sort_param.sort_length;
sort_param.not_killable=1; sort_param.not_killable=1;
......
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