Commit 0cc52bc7 authored by unknown's avatar unknown

Merge mysql.com:/home/kostja/mysql/mysql-4.0-root

into mysql.com:/home/kostja/mysql/mysql-4.0-1790

parents a2bdd621 e101f8b6
...@@ -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
......
...@@ -19,5 +19,5 @@ ERROR_UNINSTSETUP=unInstaller setup failed to initialize. You may not be able t ...@@ -19,5 +19,5 @@ ERROR_UNINSTSETUP=unInstaller setup failed to initialize. You may not be able t
[General] [General]
Language=0009 Language=0009
Type=STRINGTABLESPECIFIC Type=STRINGTABLESPECIFIC
Version=@VERSION@ Version=1.00.000
...@@ -19,5 +19,5 @@ ERROR_UNINSTSETUP=unInstaller setup failed to initialize. You may not be able t ...@@ -19,5 +19,5 @@ ERROR_UNINSTSETUP=unInstaller setup failed to initialize. You may not be able t
[General] [General]
Language=0009 Language=0009
Type=STRINGTABLESPECIFIC Type=STRINGTABLESPECIFIC
Version=@VERSION@ Version=1.00.000
...@@ -19,5 +19,5 @@ ERROR_UNINSTSETUP=unInstaller setup failed to initialize. You may not be able t ...@@ -19,5 +19,5 @@ ERROR_UNINSTSETUP=unInstaller setup failed to initialize. You may not be able t
[General] [General]
Language=0009 Language=0009
Type=STRINGTABLESPECIFIC Type=STRINGTABLESPECIFIC
Version=@VERSION@ Version=1.00.000
...@@ -1154,3 +1154,14 @@ x ...@@ -1154,3 +1154,14 @@ x
7 7
6 6
drop table t1; drop table t1;
create table t1 ( c char(8) not null ) type=bdb;
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 (c char(8) not null, b char(8) not null, a char(8) not null, primary key(a,b,c)) type=bdb;
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;
...@@ -119,12 +119,12 @@ montymontymontymontymonty * * ...@@ -119,12 +119,12 @@ montymontymontymontymonty * *
select reverse('abc'),reverse('abcd'); select reverse('abc'),reverse('abcd');
reverse('abc') reverse('abcd') reverse('abc') reverse('abcd')
cba dcba cba dcba
select rpad('a',4,'1'),rpad('a',4,'12'),rpad('abcd',3,'12'); select rpad('a',4,'1'),rpad('a',4,'12'),rpad('abcd',3,'12'), rpad(11, 10 , 22), rpad("ab", 10, 22);
rpad('a',4,'1') rpad('a',4,'12') rpad('abcd',3,'12') rpad('a',4,'1') rpad('a',4,'12') rpad('abcd',3,'12') rpad(11, 10 , 22) rpad("ab", 10, 22)
a111 a121 abc a111 a121 abc 1122222222 ab22222222
select lpad('a',4,'1'),lpad('a',4,'12'),lpad('abcd',3,'12'); select lpad('a',4,'1'),lpad('a',4,'12'),lpad('abcd',3,'12'), lpad(11, 10 , 22);
lpad('a',4,'1') lpad('a',4,'12') lpad('abcd',3,'12') lpad('a',4,'1') lpad('a',4,'12') lpad('abcd',3,'12') lpad(11, 10 , 22)
111a 121a abc 111a 121a abc 2222222211
select rpad(741653838,17,'0'),lpad(741653838,17,'0'); select rpad(741653838,17,'0'),lpad(741653838,17,'0');
rpad(741653838,17,'0') lpad(741653838,17,'0') rpad(741653838,17,'0') lpad(741653838,17,'0')
74165383800000000 00000000741653838 74165383800000000 00000000741653838
...@@ -134,6 +134,12 @@ abcdaba abaabcd ...@@ -134,6 +134,12 @@ abcdaba abaabcd
select rpad('abcd',1,'ab'),lpad('abcd',1,'ab'); select rpad('abcd',1,'ab'),lpad('abcd',1,'ab');
rpad('abcd',1,'ab') lpad('abcd',1,'ab') rpad('abcd',1,'ab') lpad('abcd',1,'ab')
a a a a
select rpad('STRING', 20, CONCAT('p','a','d') );
rpad('STRING', 20, CONCAT('p','a','d') )
STRINGpadpadpadpadpa
select lpad('STRING', 20, CONCAT('p','a','d') );
lpad('STRING', 20, CONCAT('p','a','d') )
padpadpadpadpaSTRING
select LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'),GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'); select LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'),GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD');
LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD') GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD') LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD') GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD')
HAROLD HARRY HAROLD HARRY
......
...@@ -1222,3 +1222,14 @@ a b ...@@ -1222,3 +1222,14 @@ a b
111 100 111 100
111 100 111 100
drop table t1; drop table t1;
create table t1 ( c char(8) not null ) type=innodb;
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 (c char(8) not null, b char(8) not null, a char(8) not null, primary key(a,b,c)) type=innodb;
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;
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);
......
...@@ -796,3 +796,22 @@ select * from t1 where x <= 10 and x >= 7 order by x desc; ...@@ -796,3 +796,22 @@ select * from t1 where x <= 10 and x >= 7 order by x desc;
select * from t1 where x <= 8 and x >= 5 order by x desc; select * from t1 where x <= 8 and x >= 5 order by x desc;
select * from t1 where x < 8 and x > 5 order by x desc; select * from t1 where x < 8 and x > 5 order by x desc;
drop table t1; drop table t1;
#
# Test of multi-table-updates (bug #1980).
#
create table t1 ( c char(8) not null ) type=bdb;
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 (c char(8) not null, b char(8) not null, a char(8) not null, primary key(a,b,c)) type=bdb;
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;
...@@ -49,11 +49,13 @@ select aes_decrypt("a","a"); ...@@ -49,11 +49,13 @@ select aes_decrypt("a","a");
select aes_decrypt(aes_encrypt("","a"),"a"); select aes_decrypt(aes_encrypt("","a"),"a");
select repeat('monty',5),concat('*',space(5),'*'); select repeat('monty',5),concat('*',space(5),'*');
select reverse('abc'),reverse('abcd'); select reverse('abc'),reverse('abcd');
select rpad('a',4,'1'),rpad('a',4,'12'),rpad('abcd',3,'12'); select rpad('a',4,'1'),rpad('a',4,'12'),rpad('abcd',3,'12'), rpad(11, 10 , 22), rpad("ab", 10, 22);
select lpad('a',4,'1'),lpad('a',4,'12'),lpad('abcd',3,'12'); select lpad('a',4,'1'),lpad('a',4,'12'),lpad('abcd',3,'12'), lpad(11, 10 , 22);
select rpad(741653838,17,'0'),lpad(741653838,17,'0'); select rpad(741653838,17,'0'),lpad(741653838,17,'0');
select rpad('abcd',7,'ab'),lpad('abcd',7,'ab'); select rpad('abcd',7,'ab'),lpad('abcd',7,'ab');
select rpad('abcd',1,'ab'),lpad('abcd',1,'ab'); select rpad('abcd',1,'ab'),lpad('abcd',1,'ab');
select rpad('STRING', 20, CONCAT('p','a','d') );
select lpad('STRING', 20, CONCAT('p','a','d') );
select LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'),GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'); select LEAST(NULL,'HARRY','HARRIOT',NULL,'HAROLD'),GREATEST(NULL,'HARRY','HARRIOT',NULL,'HAROLD');
select least(1,2,3) | greatest(16,32,8), least(5,4)*1,greatest(-1.0,1.0)*1,least(3,2,1)*1.0,greatest(1,1.1,1.0),least("10",9),greatest("A","B","0"); select least(1,2,3) | greatest(16,32,8), least(5,4)*1,greatest(-1.0,1.0)*1,least(3,2,1)*1.0,greatest(1,1.1,1.0),least("10",9),greatest("A","B","0");
......
...@@ -838,3 +838,22 @@ update t1 set b=100 where a=1 order by b desc limit 2; ...@@ -838,3 +838,22 @@ update t1 set b=100 where a=1 order by b desc limit 2;
update t1 set a=a+10+b where a=1 order by b; update t1 set a=a+10+b where a=1 order by b;
select * from t1 order by a,b; select * from t1 order by a,b;
drop table t1; drop table t1;
#
# Test of multi-table-updates (bug #1980).
#
create table t1 ( c char(8) not null ) type=innodb;
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 (c char(8) not null, b char(8) not null, a char(8) not null, primary key(a,b,c)) type=innodb;
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;
...@@ -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,59 @@ void Field_timestamp::store(double nr) ...@@ -2520,30 +2520,59 @@ 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->year <= 9999 && 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 +2584,17 @@ void Field_timestamp::store(longlong nr) ...@@ -2555,19 +2584,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 +3433,10 @@ void Field_datetime::store(double nr) ...@@ -3406,13 +3433,10 @@ 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 not_used;
{
nr=0; nr= fix_datetime(nr, &not_used);
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)
{ {
......
...@@ -1806,7 +1806,7 @@ String *Item_func_rpad::val_str(String *str) ...@@ -1806,7 +1806,7 @@ String *Item_func_rpad::val_str(String *str)
const char *ptr_pad; const char *ptr_pad;
int32 count= (int32) args[1]->val_int(); int32 count= (int32) args[1]->val_int();
String *res =args[0]->val_str(str); String *res =args[0]->val_str(str);
String *rpad = args[2]->val_str(str); String *rpad = args[2]->val_str(&rpad_str);
if (!res || args[1]->null_value || !rpad || count < 0) if (!res || args[1]->null_value || !rpad || count < 0)
goto err; goto err;
...@@ -1866,7 +1866,7 @@ String *Item_func_lpad::val_str(String *str) ...@@ -1866,7 +1866,7 @@ String *Item_func_lpad::val_str(String *str)
const char *ptr_pad; const char *ptr_pad;
ulong count= (long) args[1]->val_int(); ulong count= (long) args[1]->val_int();
String *res= args[0]->val_str(str); String *res= args[0]->val_str(str);
String *lpad= args[2]->val_str(str); String *lpad= args[2]->val_str(&lpad_str);
if (!res || args[1]->null_value || !lpad) if (!res || args[1]->null_value || !lpad)
goto err; goto err;
......
...@@ -436,7 +436,7 @@ public: ...@@ -436,7 +436,7 @@ public:
class Item_func_rpad :public Item_str_func class Item_func_rpad :public Item_str_func
{ {
String tmp_value; String tmp_value, rpad_str;
public: public:
Item_func_rpad(Item *arg1,Item *arg2,Item *arg3) Item_func_rpad(Item *arg1,Item *arg2,Item *arg3)
:Item_str_func(arg1,arg2,arg3) {} :Item_str_func(arg1,arg2,arg3) {}
...@@ -449,7 +449,7 @@ public: ...@@ -449,7 +449,7 @@ public:
class Item_func_lpad :public Item_str_func class Item_func_lpad :public Item_str_func
{ {
String tmp_value; String tmp_value, lpad_str;
public: public:
Item_func_lpad(Item *arg1,Item *arg2,Item *arg3) Item_func_lpad(Item *arg1,Item *arg2,Item *arg3)
:Item_str_func(arg1,arg2,arg3) {} :Item_str_func(arg1,arg2,arg3) {}
......
...@@ -529,7 +529,7 @@ public: ...@@ -529,7 +529,7 @@ public:
#ifndef MYSQL_CLIENT #ifndef MYSQL_CLIENT
Intvar_log_event(THD* thd_arg,uchar type_arg, ulonglong val_arg) Intvar_log_event(THD* thd_arg,uchar type_arg, ulonglong val_arg)
:Log_event(),val(val_arg),type(type_arg) :Log_event(thd_arg,0,0),val(val_arg),type(type_arg)
{} {}
void pack_info(String* packet); void pack_info(String* packet);
int exec_event(struct st_relay_log_info* rli); int exec_event(struct st_relay_log_info* rli);
......
...@@ -2573,7 +2573,7 @@ default_service_handling(char **argv, ...@@ -2573,7 +2573,7 @@ default_service_handling(char **argv,
} }
/* We must have servicename last */ /* We must have servicename last */
*pos++= ' '; *pos++= ' ';
strmake(pos, servicename, (uint) (end+2 - pos)); (void) add_quoted_string(pos, servicename, end);
if (Service.got_service_option(argv, "install")) if (Service.got_service_option(argv, "install"))
{ {
......
...@@ -3498,7 +3498,19 @@ rli->relay_log_pos=%s rli->pending=%lu", ...@@ -3498,7 +3498,19 @@ rli->relay_log_pos=%s rli->pending=%lu",
flush_relay_log_info(rli); flush_relay_log_info(rli);
} }
// next log is hot /*
Now we want to open this next log. To know if it's a hot log (the one
being written by the I/O thread now) or a cold log, we can use
is_active(); if it is hot, we use the I/O cache; if it's cold we open
the file normally. But if is_active() reports that the log is hot, this
may change between the test and the consequence of the test. So we may
open the I/O cache whereas the log is now cold, which is nonsense.
To guard against this, we need to have LOCK_log.
*/
DBUG_PRINT("info",("hot_log: %d",hot_log));
if (!hot_log) /* if hot_log, we already have this mutex */
pthread_mutex_lock(log_lock);
if (rli->relay_log.is_active(rli->linfo.log_file_name)) if (rli->relay_log.is_active(rli->linfo.log_file_name))
{ {
#ifdef EXTRA_DEBUG #ifdef EXTRA_DEBUG
...@@ -3511,15 +3523,24 @@ rli->relay_log_pos=%s rli->pending=%lu", ...@@ -3511,15 +3523,24 @@ rli->relay_log_pos=%s rli->pending=%lu",
/* /*
Read pointer has to be at the start since we are the only Read pointer has to be at the start since we are the only
reader reader.
We must keep the LOCK_log to read the 4 first bytes, as this is a hot
log (same as when we call read_log_event() above: for a hot log we
take the mutex).
*/ */
if (check_binlog_magic(cur_log,&errmsg)) if (check_binlog_magic(cur_log,&errmsg))
{
if (!hot_log) pthread_mutex_unlock(log_lock);
goto err; goto err;
}
if (!hot_log) pthread_mutex_unlock(log_lock);
continue; continue;
} }
if (!hot_log) pthread_mutex_unlock(log_lock);
/* /*
if we get here, the log was not hot, so we will have to if we get here, the log was not hot, so we will have to open it
open it ourselves ourselves. We are sure that the log is still not hot now (a log can get
from hot to cold, but not from cold to hot). No need for LOCK_log.
*/ */
#ifdef EXTRA_DEBUG #ifdef EXTRA_DEBUG
sql_print_error("next log '%s' is not active", sql_print_error("next log '%s' is not active",
......
...@@ -588,6 +588,11 @@ ulong acl_getroot(THD *thd, const char *host, const char *ip, const char *user, ...@@ -588,6 +588,11 @@ ulong acl_getroot(THD *thd, const char *host, const char *ip, const char *user,
/* Prepare certificate (if exists) */ /* Prepare certificate (if exists) */
DBUG_PRINT("info",("checkpoint 1")); DBUG_PRINT("info",("checkpoint 1"));
X509* cert=SSL_get_peer_certificate(ssl); X509* cert=SSL_get_peer_certificate(ssl);
if (!cert)
{
user_access=NO_ACCESS;
break;
}
DBUG_PRINT("info",("checkpoint 2")); DBUG_PRINT("info",("checkpoint 2"));
/* If X509 issuer is speified, we check it... */ /* If X509 issuer is speified, we check it... */
if (acl_user->x509_issuer) if (acl_user->x509_issuer)
......
...@@ -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;
......
...@@ -11,6 +11,13 @@ ...@@ -11,6 +11,13 @@
# Written by Lenz Grimmer <lenz@mysql.com> # Written by Lenz Grimmer <lenz@mysql.com>
# #
# Suppress the annoying "$1: unbound variable" error when no option
# was given
if [ -z $1 ] ; then
echo "Usage: $0 [start|stop|restart] "
exit 1
fi
# Source the common setup functions for startup scripts # Source the common setup functions for startup scripts
test -r /etc/rc.common || exit 1 test -r /etc/rc.common || exit 1
. /etc/rc.common . /etc/rc.common
......
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